Modified cairo_pattern in order to let cairo handle ownership of the image
buffer. This solves the issue mentioned in [2254] properly as it wasn't solved properly before. The bug is uncovered in cairo 1.10.0 and caused that images added to pdf surfaces did not appear at all. My guess is that newest cairo reads the pattern surface lazily when "trasnfering" it to the target surface and by the time it does it the cairo_pattern which owns the buffer has already been destroyed.
This commit is contained in:
parent
215c223f68
commit
9c79d52ca0
1 changed files with 5 additions and 6 deletions
|
@ -59,7 +59,9 @@ public:
|
||||||
const unsigned int *in_end = in_ptr + pixels;
|
const unsigned int *in_end = in_ptr + pixels;
|
||||||
unsigned int *out_ptr;
|
unsigned int *out_ptr;
|
||||||
|
|
||||||
out_ptr = data_ = new unsigned int[pixels];
|
surface_ = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, data.width(), data.height());
|
||||||
|
|
||||||
|
out_ptr = reinterpret_cast<unsigned int *>(surface_->get_data());
|
||||||
|
|
||||||
while (in_ptr < in_end)
|
while (in_ptr < in_end)
|
||||||
{
|
{
|
||||||
|
@ -75,14 +77,13 @@ public:
|
||||||
|
|
||||||
*out_ptr++ = (a << 24) | (r << 16) | (g << 8) | b;
|
*out_ptr++ = (a << 24) | (r << 16) | (g << 8) | b;
|
||||||
}
|
}
|
||||||
|
// mark the surface as dirty as we've modified it behind cairo's back
|
||||||
surface_ = Cairo::ImageSurface::create(reinterpret_cast<unsigned char *>(data_), Cairo::FORMAT_ARGB32, data.width(), data.height(), data.width() * 4);
|
surface_->mark_dirty();
|
||||||
pattern_ = Cairo::SurfacePattern::create(surface_);
|
pattern_ = Cairo::SurfacePattern::create(surface_);
|
||||||
}
|
}
|
||||||
|
|
||||||
~cairo_pattern(void)
|
~cairo_pattern(void)
|
||||||
{
|
{
|
||||||
delete [] data_;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_matrix(Cairo::Matrix const& matrix)
|
void set_matrix(Cairo::Matrix const& matrix)
|
||||||
|
@ -118,7 +119,6 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
unsigned int *data_;
|
|
||||||
Cairo::RefPtr<Cairo::ImageSurface> surface_;
|
Cairo::RefPtr<Cairo::ImageSurface> surface_;
|
||||||
Cairo::RefPtr<Cairo::SurfacePattern> pattern_;
|
Cairo::RefPtr<Cairo::SurfacePattern> pattern_;
|
||||||
};
|
};
|
||||||
|
@ -344,7 +344,6 @@ public:
|
||||||
context_->save();
|
context_->save();
|
||||||
context_->set_source(pattern.pattern());
|
context_->set_source(pattern.pattern());
|
||||||
context_->paint_with_alpha(opacity);
|
context_->paint_with_alpha(opacity);
|
||||||
context_->get_target()->mark_dirty();
|
|
||||||
context_->restore();
|
context_->restore();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue