summaryrefslogtreecommitdiffstats
path: root/gfx/cairo/pixman-lowres-interp.patch
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/cairo/pixman-lowres-interp.patch')
-rw-r--r--gfx/cairo/pixman-lowres-interp.patch222
1 files changed, 0 insertions, 222 deletions
diff --git a/gfx/cairo/pixman-lowres-interp.patch b/gfx/cairo/pixman-lowres-interp.patch
deleted file mode 100644
index e2572f000..000000000
--- a/gfx/cairo/pixman-lowres-interp.patch
+++ /dev/null
@@ -1,222 +0,0 @@
-summary: Bug 689707. Use lower precision bilinear interpolation. r=joe
-
-diff --git a/gfx/cairo/libpixman/src/pixman-bits-image.c b/gfx/cairo/libpixman/src/pixman-bits-image.c
---- a/gfx/cairo/libpixman/src/pixman-bits-image.c
-+++ b/gfx/cairo/libpixman/src/pixman-bits-image.c
-@@ -124,18 +124,18 @@ bits_image_fetch_pixel_bilinear (bits_im
- int height = image->height;
- int x1, y1, x2, y2;
- uint32_t tl, tr, bl, br;
- int32_t distx, disty;
-
- x1 = x - pixman_fixed_1 / 2;
- y1 = y - pixman_fixed_1 / 2;
-
-- distx = (x1 >> 8) & 0xff;
-- disty = (y1 >> 8) & 0xff;
-+ distx = interpolation_coord(x1);
-+ disty = interpolation_coord(y1);
-
- x1 = pixman_fixed_to_int (x1);
- y1 = pixman_fixed_to_int (y1);
- x2 = x1 + 1;
- y2 = y1 + 1;
-
- if (repeat_mode != PIXMAN_REPEAT_NONE)
- {
-@@ -190,17 +190,17 @@ bits_image_fetch_bilinear_no_repeat_8888
-
- if (!pixman_transform_point_3d (bits->common.transform, &v))
- return;
-
- ux = ux_top = ux_bottom = bits->common.transform->matrix[0][0];
- x = x_top = x_bottom = v.vector[0] - pixman_fixed_1/2;
-
- y = v.vector[1] - pixman_fixed_1/2;
-- disty = (y >> 8) & 0xff;
-+ disty = interpolation_coord(y);
-
- /* Load the pointers to the first and second lines from the source
- * image that bilinear code must read.
- *
- * The main trick in this code is about the check if any line are
- * outside of the image;
- *
- * When I realize that a line (any one) is outside, I change
-@@ -299,17 +299,17 @@ bits_image_fetch_bilinear_no_repeat_8888
- while (buffer < end && x < 0)
- {
- uint32_t tr, br;
- int32_t distx;
-
- tr = top_row[pixman_fixed_to_int (x_top) + 1] | top_mask;
- br = bottom_row[pixman_fixed_to_int (x_bottom) + 1] | bottom_mask;
-
-- distx = (x >> 8) & 0xff;
-+ distx = interpolation_coord(x);
-
- *buffer++ = bilinear_interpolation (0, tr, 0, br, distx, disty);
-
- x += ux;
- x_top += ux_top;
- x_bottom += ux_bottom;
- mask += mask_inc;
- }
-@@ -324,17 +324,17 @@ bits_image_fetch_bilinear_no_repeat_8888
- uint32_t tl, tr, bl, br;
- int32_t distx;
-
- tl = top_row [pixman_fixed_to_int (x_top)] | top_mask;
- tr = top_row [pixman_fixed_to_int (x_top) + 1] | top_mask;
- bl = bottom_row [pixman_fixed_to_int (x_bottom)] | bottom_mask;
- br = bottom_row [pixman_fixed_to_int (x_bottom) + 1] | bottom_mask;
-
-- distx = (x >> 8) & 0xff;
-+ distx = interpolation_coord(x);
-
- *buffer = bilinear_interpolation (tl, tr, bl, br, distx, disty);
- }
-
- buffer++;
- x += ux;
- x_top += ux_top;
- x_bottom += ux_bottom;
-@@ -348,17 +348,17 @@ bits_image_fetch_bilinear_no_repeat_8888
- if (*mask)
- {
- uint32_t tl, bl;
- int32_t distx;
-
- tl = top_row [pixman_fixed_to_int (x_top)] | top_mask;
- bl = bottom_row [pixman_fixed_to_int (x_bottom)] | bottom_mask;
-
-- distx = (x >> 8) & 0xff;
-+ distx = interpolation_coord(x);
-
- *buffer = bilinear_interpolation (tl, 0, bl, 0, distx, disty);
- }
-
- buffer++;
- x += ux;
- x_top += ux_top;
- x_bottom += ux_bottom;
-@@ -675,18 +675,18 @@ bits_image_fetch_bilinear_affine (pixman
- const uint8_t *row2;
-
- if (mask && !mask[i])
- goto next;
-
- x1 = x - pixman_fixed_1 / 2;
- y1 = y - pixman_fixed_1 / 2;
-
-- distx = (x1 >> 8) & 0xff;
-- disty = (y1 >> 8) & 0xff;
-+ distx = interpolation_coord(x1);
-+ disty = interpolation_coord(y1);
-
- y1 = pixman_fixed_to_int (y1);
- y2 = y1 + 1;
- x1 = pixman_fixed_to_int (x1);
- x2 = x1 + 1;
-
- if (repeat_mode != PIXMAN_REPEAT_NONE)
- {
-diff --git a/gfx/cairo/libpixman/src/pixman-inlines.h b/gfx/cairo/libpixman/src/pixman-inlines.h
---- a/gfx/cairo/libpixman/src/pixman-inlines.h
-+++ b/gfx/cairo/libpixman/src/pixman-inlines.h
-@@ -76,16 +76,31 @@ repeat (pixman_repeat_t repeat, int *c,
- {
- *c = MOD (*c, size * 2);
- if (*c >= size)
- *c = size * 2 - *c - 1;
- }
- return TRUE;
- }
-
-+#ifdef MOZ_GFX_OPTIMIZE_MOBILE
-+#define LOW_QUALITY_INTERPOLATION
-+#endif
-+
-+static force_inline int32_t
-+interpolation_coord(pixman_fixed_t t)
-+{
-+#ifdef LOW_QUALITY_INTERPOLATION
-+ return (t >> 12) & 0xf;
-+#else
-+ return (t >> 8) & 0xff;
-+#endif
-+}
-+
-+
- #if SIZEOF_LONG > 4
-
- static force_inline uint32_t
- bilinear_interpolation (uint32_t tl, uint32_t tr,
- uint32_t bl, uint32_t br,
- int distx, int disty)
- {
- uint64_t distxy, distxiy, distixy, distixiy;
-@@ -122,16 +137,44 @@ bilinear_interpolation (uint32_t tl, uin
- f = tl64 * distixiy + tr64 * distxiy + bl64 * distixy + br64 * distxy;
- r |= ((f >> 16) & 0x000000ff00000000ull) | (f & 0xff000000ull);
-
- return (uint32_t)(r >> 16);
- }
-
- #else
-
-+#ifdef LOW_QUALITY_INTERPOLATION
-+/* Based on Filter_32_opaque_portable from Skia */
-+static force_inline uint32_t
-+bilinear_interpolation(uint32_t a00, uint32_t a01,
-+ uint32_t a10, uint32_t a11,
-+ int x, int y)
-+{
-+ int xy = x * y;
-+ static const uint32_t mask = 0xff00ff;
-+
-+ int scale = 256 - 16*y - 16*x + xy;
-+ uint32_t lo = (a00 & mask) * scale;
-+ uint32_t hi = ((a00 >> 8) & mask) * scale;
-+
-+ scale = 16*x - xy;
-+ lo += (a01 & mask) * scale;
-+ hi += ((a01 >> 8) & mask) * scale;
-+
-+ scale = 16*y - xy;
-+ lo += (a10 & mask) * scale;
-+ hi += ((a10 >> 8) & mask) * scale;
-+
-+ lo += (a11 & mask) * xy;
-+ hi += ((a11 >> 8) & mask) * xy;
-+
-+ return ((lo >> 8) & mask) | (hi & ~mask);
-+}
-+#else
- static force_inline uint32_t
- bilinear_interpolation (uint32_t tl, uint32_t tr,
- uint32_t bl, uint32_t br,
- int distx, int disty)
- {
- int distxy, distxiy, distixy, distixiy;
- uint32_t f, r;
-
-@@ -164,17 +207,17 @@ bilinear_interpolation (uint32_t tl, uin
-
- /* Alpha */
- f = (tl & 0x0000ff00) * distixiy + (tr & 0x0000ff00) * distxiy
- + (bl & 0x0000ff00) * distixy + (br & 0x0000ff00) * distxy;
- r |= f & 0xff000000;
-
- return r;
- }
--
-+#endif
- #endif
-
- /*
- * For each scanline fetched from source image with PAD repeat:
- * - calculate how many pixels need to be padded on the left side
- * - calculate how many pixels need to be padded on the right side
- * - update width to only count pixels which are fetched from the image
- * All this information is returned via 'width', 'left_pad', 'right_pad'