re-enable zero allocation image interface - refs #3069
This commit is contained in:
parent
0532df7b6e
commit
b2d08ea4ea
4 changed files with 37 additions and 4 deletions
|
@ -34,6 +34,7 @@ namespace detail {
|
|||
struct MAPNIK_DECL buffer
|
||||
{
|
||||
explicit buffer(std::size_t size);
|
||||
explicit buffer(unsigned char* data, std::size_t size);
|
||||
buffer(buffer && rhs) noexcept;
|
||||
buffer(buffer const& rhs);
|
||||
~buffer();
|
||||
|
@ -51,6 +52,7 @@ struct MAPNIK_DECL buffer
|
|||
private:
|
||||
std::size_t size_;
|
||||
unsigned char* data_;
|
||||
bool owns_;
|
||||
|
||||
};
|
||||
|
||||
|
@ -93,6 +95,11 @@ public:
|
|||
bool initialize = true,
|
||||
bool premultiplied = false,
|
||||
bool painted = false);
|
||||
image(int width,
|
||||
int height,
|
||||
detail::buffer && buf,
|
||||
bool premultiplied = false,
|
||||
bool painted = false);
|
||||
image(image<T> const& rhs);
|
||||
image(image<T> && rhs) noexcept;
|
||||
image<T>& operator=(image<T> rhs);
|
||||
|
|
|
@ -77,6 +77,16 @@ image<T>::image()
|
|||
painted_(false)
|
||||
{}
|
||||
|
||||
template <typename T>
|
||||
image<T>::image(int width, int height, detail::buffer && buf, bool premultiplied, bool painted)
|
||||
: dimensions_(width, height),
|
||||
buffer_(std::move(buf)),
|
||||
pData_(reinterpret_cast<pixel_type*>(buffer_.data())),
|
||||
offset_(0.0),
|
||||
scaling_(1.0),
|
||||
premultiplied_alpha_(premultiplied),
|
||||
painted_(painted) {}
|
||||
|
||||
template <typename T>
|
||||
image<T>::image(int width, int height, bool initialize, bool premultiplied, bool painted)
|
||||
: dimensions_(width, height),
|
||||
|
|
|
@ -36,27 +36,37 @@ namespace detail
|
|||
// BUFFER
|
||||
buffer::buffer(std::size_t size)
|
||||
: size_(size),
|
||||
data_(static_cast<unsigned char*>(size_ != 0 ? ::operator new(size_) : nullptr))
|
||||
data_(static_cast<unsigned char*>(size_ != 0 ? ::operator new(size_) : nullptr)),
|
||||
owns_(true)
|
||||
{}
|
||||
|
||||
buffer::buffer(unsigned char* data, std::size_t size)
|
||||
: size_(size),
|
||||
data_(data),
|
||||
owns_(false)
|
||||
{}
|
||||
|
||||
buffer::buffer(buffer && rhs) noexcept
|
||||
: size_(std::move(rhs.size_)),
|
||||
data_(std::move(rhs.data_))
|
||||
data_(std::move(rhs.data_)),
|
||||
owns_(std::move(rhs.owns_))
|
||||
{
|
||||
rhs.size_ = 0;
|
||||
rhs.data_ = nullptr;
|
||||
rhs.owns_ = true;
|
||||
}
|
||||
|
||||
buffer::buffer(buffer const& rhs)
|
||||
: size_(rhs.size_),
|
||||
data_(static_cast<unsigned char*>(size_ != 0 ? ::operator new(size_) : nullptr))
|
||||
data_(static_cast<unsigned char*>(size_ != 0 ? ::operator new(size_) : nullptr)),
|
||||
owns_(rhs.owns_)
|
||||
{
|
||||
if (data_) std::copy(rhs.data_, rhs.data_ + rhs.size_, data_);
|
||||
}
|
||||
|
||||
buffer::~buffer()
|
||||
{
|
||||
::operator delete(data_);
|
||||
if (owns_) ::operator delete(data_);
|
||||
}
|
||||
|
||||
buffer& buffer::operator=(buffer rhs)
|
||||
|
@ -69,6 +79,7 @@ void buffer::swap(buffer & rhs)
|
|||
{
|
||||
std::swap(size_, rhs.size_);
|
||||
std::swap(data_, rhs.data_);
|
||||
std::swap(owns_, rhs.owns_);
|
||||
}
|
||||
|
||||
unsigned char* buffer::data()
|
||||
|
|
|
@ -21,6 +21,11 @@ SECTION("readers") {
|
|||
boost::optional<std::string> type;
|
||||
try
|
||||
{
|
||||
mapnik::image_rgba8 im_og;
|
||||
auto im_size = mapnik::image_rgba8::pixel_size * im_og.width() * im_og.height();
|
||||
mapnik::detail::buffer buf(im_og.bytes(),im_size);
|
||||
mapnik::image_rgba8 im2(im_og.width(),im_og.height(),std::move(buf));
|
||||
CHECK( im2.bytes() == im_og.bytes() );
|
||||
#if defined(HAVE_JPEG)
|
||||
should_throw = "./test/data/images/blank.jpg";
|
||||
REQUIRE( mapnik::util::exists( should_throw ) );
|
||||
|
|
Loading…
Reference in a new issue