summaryrefslogtreecommitdiffstats
path: root/gfx/cairo/pixman-image-transform.patch
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/cairo/pixman-image-transform.patch')
-rw-r--r--gfx/cairo/pixman-image-transform.patch52
1 files changed, 52 insertions, 0 deletions
diff --git a/gfx/cairo/pixman-image-transform.patch b/gfx/cairo/pixman-image-transform.patch
new file mode 100644
index 000000000..2f93d315a
--- /dev/null
+++ b/gfx/cairo/pixman-image-transform.patch
@@ -0,0 +1,52 @@
+# HG changeset patch
+# User Jeff Muizelaar <jmuizelaar@mozilla.com>
+# Date 1299543337 18000
+# Node ID 57f411f16517fa3abc31b6b081dd31420c4d9b45
+# Parent e56ecd8b3a68c158025207c5fd081d043e28f5ce
+Bug 637828. Reset the transform on the dest image. r=joe
+
+We can get into a situation where the destination image has a transform
+because we use it as source. The transform set when the image is a source
+sticks around and when we use it as a destination pixman gets confused.
+
+It seems like the code at fault here is really pixman. I think that pixman
+should probably not be using a transformed fetch on the destination image under
+any circumstances.
+
+For example, in this case we're fetching destination pixels from a different
+part of the image than we're storing them to. I can't see any reason for
+wanting this behaviour.
+
+However, reseting the transform seemed like the easiest solution.
+
+diff --git a/gfx/cairo/cairo/src/cairo-image-surface.c b/gfx/cairo/cairo/src/cairo-image-surface.c
+--- a/gfx/cairo/cairo/src/cairo-image-surface.c
++++ b/gfx/cairo/cairo/src/cairo-image-surface.c
+@@ -1138,16 +1138,27 @@ _cairo_image_surface_composite (cairo_op
+ return status;
+
+ status = _cairo_image_surface_set_attributes (src, &src_attr,
+ dst_x + width / 2.,
+ dst_y + height / 2.);
+ if (unlikely (status))
+ goto CLEANUP_SURFACES;
+
++ /* we sometimes get destinations with transforms.
++ * we're not equiped to deal with this */
++ {
++ static const pixman_transform_t id = {
++ {{ pixman_fixed_1, 0, 0 },
++ { 0, pixman_fixed_1, 0 },
++ { 0, 0, pixman_fixed_1 }}
++ };
++ pixman_image_set_transform (dst->pixman_image, &id);
++ }
++
+ if (mask) {
+ status = _cairo_image_surface_set_attributes (mask, &mask_attr,
+ dst_x + width / 2.,
+ dst_y + height / 2.);
+ if (unlikely (status))
+ goto CLEANUP_SURFACES;
+
+ pixman_image_composite (_pixman_operator (op),