solid_pixel_buffer.hpp
Go to the documentation of this file.
/*
* Copyright (C) 2007,2008 Alex Shulgin
*
* This file is part of png++ the C++ wrapper for libpng. PNG++ is free
* software; the exact copying conditions are as follows:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef PNGPP_SOLID_PIXEL_BUFFER_HPP_INCLUDED
#define PNGPP_SOLID_PIXEL_BUFFER_HPP_INCLUDED
#include <cassert>
#include <cstddef>
#include <climits>
#include <stdexcept>
#include <vector>
#include "config.hpp"
#include "packed_pixel.hpp"
#include "gray_pixel.hpp"
#include "index_pixel.hpp"
namespace png
{
template< typename pixel >
class solid_pixel_buffer
{
public:
typedef pixel_traits< pixel > pixel_traits_t;
struct row_traits
{
typedef pixel* row_access;
typedef const pixel* row_const_access;
static byte* get_data(row_access row)
{
return reinterpret_cast<byte*>(row);
}
};
typedef typename row_traits::row_access row_access;
typedef typename row_traits::row_const_access row_const_access;
typedef row_access row_type;
solid_pixel_buffer()
: m_width(0),
m_height(0),
m_stride(0)
{
}
solid_pixel_buffer(uint_32 width, uint_32 height)
: m_width(0),
m_height(0),
m_stride(0)
{
resize(width, height);
}
uint_32 get_width() const
{
return m_width;
}
uint_32 get_height() const
{
return m_height;
}
void resize(uint_32 width, uint_32 height)
{
m_width = width;
m_height = height;
m_stride = m_width * bytes_per_pixel;
m_bytes.resize(height * m_stride);
}
row_access get_row(size_t index)
{
return reinterpret_cast<row_access>(&m_bytes.at(index * m_stride));
}
row_const_access get_row(size_t index) const
{
return (row_const_access)(&m_bytes.at(index * m_stride));
}
row_access operator[](size_t index)
{
return (row_access)(&m_bytes[index * m_stride]);
}
row_const_access operator[](size_t index) const
{
return (row_const_access)(&m_bytes[index * m_stride]);
}
void put_row(size_t index, row_const_access r)
{
row_access row = get_row(index);
for (uint_32 i = 0; i < m_width; ++i)
*row++ = *r++;
}
pixel get_pixel(size_t x, size_t y) const
{
size_t index = (y * m_width + x) * bytes_per_pixel;
return *reinterpret_cast< const pixel* >(&m_bytes.at(index));
}
void set_pixel(size_t x, size_t y, pixel p)
{
size_t index = (y * m_width + x) * bytes_per_pixel;
*reinterpret_cast< pixel* >(&m_bytes.at(index)) = p;
}
const std::vector< byte >& get_bytes() const
{
return m_bytes;
}
#ifdef PNGPP_HAS_STD_MOVE
std::vector< byte > fetch_bytes()
{
m_width = 0;
m_height = 0;
m_stride = 0;
// the buffer is moved outside without copying and leave m_bytes empty.
return std::move(m_bytes);
}
#endif
protected:
static const size_t bytes_per_pixel = pixel_traits_t::channels *
pixel_traits_t::bit_depth / CHAR_BIT;
protected:
uint_32 m_width;
uint_32 m_height;
size_t m_stride;
std::vector< byte > m_bytes;
#ifdef PNGPP_HAS_STATIC_ASSERT
static_assert(pixel_traits_t::bit_depth % CHAR_BIT == 0,
"Bit_depth should consist of integer number of bytes");
static_assert(sizeof(pixel) * CHAR_BIT ==
pixel_traits_t::channels * pixel_traits_t::bit_depth,
"pixel type should contain channels data only");
#endif
};
template< int bits >
class solid_pixel_buffer< packed_pixel< bits > >;
} // namespace png
#endif // PNGPP_solid_pixel_buffer_HPP_INCLUDED
png::packed_pixel
The packed pixel class template.
Definition packed_pixel.hpp:56
png::reader
The PNG reader class template. This is the low-level reading interface–use image class or consumer cl...
Definition reader.hpp:67
png::solid_pixel_buffer
Pixel buffer, that stores pixels as continuous memory chunk. solid_pixel_buffer is useful when user w...
Definition solid_pixel_buffer.hpp:55
png::solid_pixel_buffer::bytes_per_pixel
static const size_t bytes_per_pixel
Definition solid_pixel_buffer.hpp:214
png::solid_pixel_buffer::get_row
row_const_access get_row(size_t index) const
Returns a const reference to the row of image data at specified index.
Definition solid_pixel_buffer.hpp:141
png::solid_pixel_buffer::row_const_access
row_traits::row_const_access row_const_access
Definition solid_pixel_buffer.hpp:74
png::solid_pixel_buffer::set_pixel
void set_pixel(size_t x, size_t y, pixel p)
Replaces a pixel at (x,y) position.
Definition solid_pixel_buffer.hpp:184
png::solid_pixel_buffer::row_access
row_traits::row_access row_access
A row of pixel data.
Definition solid_pixel_buffer.hpp:73
png::solid_pixel_buffer::get_width
uint_32 get_width() const
Definition solid_pixel_buffer.hpp:98
png::solid_pixel_buffer::m_height
uint_32 m_height
Definition solid_pixel_buffer.hpp:219
png::solid_pixel_buffer::m_stride
size_t m_stride
Definition solid_pixel_buffer.hpp:220
png::solid_pixel_buffer::operator[]
row_access operator[](size_t index)
The non-checking version of get_row() method.
Definition solid_pixel_buffer.hpp:149
png::solid_pixel_buffer::solid_pixel_buffer
solid_pixel_buffer(uint_32 width, uint_32 height)
Constructs an empty pixel buffer object.
Definition solid_pixel_buffer.hpp:90
png::solid_pixel_buffer::fetch_bytes
std::vector< byte > fetch_bytes()
Moves the buffer to client code (c++11 only) .
Definition solid_pixel_buffer.hpp:202
png::solid_pixel_buffer::row_type
row_access row_type
Definition solid_pixel_buffer.hpp:75
png::solid_pixel_buffer::pixel_traits_t
pixel_traits< pixel > pixel_traits_t
Definition solid_pixel_buffer.hpp:57
png::solid_pixel_buffer::m_width
uint_32 m_width
Definition solid_pixel_buffer.hpp:218
png::solid_pixel_buffer::get_height
uint_32 get_height() const
Definition solid_pixel_buffer.hpp:103
png::solid_pixel_buffer::get_bytes
const std::vector< byte > & get_bytes() const
Provides easy constant read access to underlying byte-buffer.
Definition solid_pixel_buffer.hpp:193
png::solid_pixel_buffer::get_pixel
pixel get_pixel(size_t x, size_t y) const
Returns a pixel at (x,y) position.
Definition solid_pixel_buffer.hpp:175
png::solid_pixel_buffer::solid_pixel_buffer
solid_pixel_buffer()
Constructs an empty 0x0 pixel buffer object.
Definition solid_pixel_buffer.hpp:80
png::solid_pixel_buffer::put_row
void put_row(size_t index, row_const_access r)
Replaces the row at specified index.
Definition solid_pixel_buffer.hpp:165
png::solid_pixel_buffer::get_row
row_access get_row(size_t index)
Returns a reference to the row of image data at specified index.
Definition solid_pixel_buffer.hpp:130
png::solid_pixel_buffer::operator[]
row_const_access operator[](size_t index) const
The non-checking version of get_row() method.
Definition solid_pixel_buffer.hpp:157
png::solid_pixel_buffer::m_bytes
std::vector< byte > m_bytes
Definition solid_pixel_buffer.hpp:221
png::solid_pixel_buffer::resize
void resize(uint_32 width, uint_32 height)
Resizes the pixel buffer.
Definition solid_pixel_buffer.hpp:114
config.hpp
gray_pixel.hpp
index_pixel.hpp
png
Definition color.hpp:37
packed_pixel.hpp
png::solid_pixel_buffer::row_traits
Definition solid_pixel_buffer.hpp:59
png::solid_pixel_buffer::row_traits::get_data
static byte * get_data(row_access row)
Definition solid_pixel_buffer.hpp:63
png::solid_pixel_buffer::row_traits::row_const_access
const pixel * row_const_access
Definition solid_pixel_buffer.hpp:61
png::solid_pixel_buffer::row_traits::row_access
pixel * row_access
Definition solid_pixel_buffer.hpp:60