From 85ed37da33522efa101eb508a4091bcfa24ae944 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Sat, 6 Sep 2008 09:10:25 +0100 Subject: [PATCH] [ps] A flattened gradient is not linear. We cannot express an alpha-gradient as a simple linear interpolation between 2 flattened colors. So fallback. --- src/cairo-ps-surface.c | 46 +++++++++++-------------- test/Makefile.am | 2 -- test/clip-operator-ps-argb32-ref.png | Bin 9102 -> 0 bytes test/clip-operator-ps-rgb24-ref.png | Bin 4620 -> 0 bytes test/gradient-alpha-ps-argb32-ref.png | Bin 189 -> 0 bytes test/gradient-alpha-ps-rgb24-ref.png | Bin 179 -> 0 bytes test/operator-clear-ps-argb32-ref.png | Bin 1435 -> 0 bytes test/operator-source-ps-argb32-ref.png | Bin 3890 -> 0 bytes test/operator-source-ps-rgb24-ref.png | Bin 3181 -> 0 bytes 9 files changed, 20 insertions(+), 28 deletions(-) delete mode 100644 test/clip-operator-ps-argb32-ref.png delete mode 100644 test/clip-operator-ps-rgb24-ref.png delete mode 100644 test/gradient-alpha-ps-argb32-ref.png delete mode 100644 test/gradient-alpha-ps-rgb24-ref.png delete mode 100644 test/operator-clear-ps-argb32-ref.png delete mode 100644 test/operator-source-ps-argb32-ref.png delete mode 100644 test/operator-source-ps-rgb24-ref.png diff --git a/src/cairo-ps-surface.c b/src/cairo-ps-surface.c index c31ed2b0a..bb80651d5 100644 --- a/src/cairo-ps-surface.c +++ b/src/cairo-ps-surface.c @@ -1427,6 +1427,10 @@ _gradient_pattern_supported (cairo_ps_surface_t *surface, if (surface->ps_level == CAIRO_PS_LEVEL_2) return FALSE; + /* alpha-blended gradients cannot be expressed as a linear function */ + if (! _cairo_pattern_is_opaque (pattern)) + return FALSE; + surface->ps_level_used = CAIRO_PS_LEVEL_3; extend = cairo_pattern_get_extend (pattern); @@ -2413,7 +2417,7 @@ _cairo_ps_surface_emit_surface_pattern (cairo_ps_surface_t *surface, typedef struct _cairo_ps_color_stop { double offset; - double color[4]; + double color[3]; } cairo_ps_color_stop_t; static void @@ -2438,7 +2442,7 @@ _cairo_ps_surface_emit_linear_colorgradient (cairo_ps_surface_t *surface, static void _cairo_ps_surface_emit_stitched_colorgradient (cairo_ps_surface_t *surface, - unsigned int n_stops, + unsigned int n_stops, cairo_ps_color_stop_t stops[]) { unsigned int i; @@ -2468,11 +2472,14 @@ calc_gradient_color (cairo_ps_color_stop_t *new_stop, cairo_ps_color_stop_t *stop1, cairo_ps_color_stop_t *stop2) { - int i; double offset = stop1->offset / (stop1->offset + 1.0 - stop2->offset); + double one_minus_offset = 1. - offset; + int i; - for (i = 0; i < 4; i++) - new_stop->color[i] = stop1->color[i] + offset*(stop2->color[i] - stop1->color[i]); + for (i = 0; i < 3; i++) { + new_stop->color[i] = stop1->color[i] * one_minus_offset + + stop2->color[i] * offset; + } } #define COLOR_STOP_EPSILON 1e-6 @@ -2484,7 +2491,8 @@ _cairo_ps_surface_emit_pattern_stops (cairo_ps_surface_t *surface, cairo_ps_color_stop_t *allstops, *stops; unsigned int i, n_stops; - allstops = _cairo_malloc_ab ((pattern->n_stops + 2), sizeof (cairo_ps_color_stop_t)); + allstops = _cairo_malloc_ab (pattern->n_stops + 2, + sizeof (cairo_ps_color_stop_t)); if (allstops == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); @@ -2497,7 +2505,6 @@ _cairo_ps_surface_emit_pattern_stops (cairo_ps_surface_t *surface, stops[i].color[0] = stop->color.red; stops[i].color[1] = stop->color.green; stops[i].color[2] = stop->color.blue; - stops[i].color[3] = stop->color.alpha; stops[i].offset = pattern->stops[i].offset; } @@ -2507,7 +2514,8 @@ _cairo_ps_surface_emit_pattern_stops (cairo_ps_surface_t *surface, if (pattern->base.extend == CAIRO_EXTEND_REFLECT) memcpy (allstops, stops, sizeof (cairo_ps_color_stop_t)); else - calc_gradient_color (&allstops[0], &stops[0], &stops[n_stops-1]); + calc_gradient_color (&allstops[0], &stops[0], + &stops[n_stops-1]); stops = allstops; n_stops++; } @@ -2519,34 +2527,20 @@ _cairo_ps_surface_emit_pattern_stops (cairo_ps_surface_t *surface, &stops[n_stops - 1], sizeof (cairo_ps_color_stop_t)); } else { - calc_gradient_color (&stops[n_stops], &stops[0], &stops[n_stops-1]); + calc_gradient_color (&stops[n_stops], &stops[0], + &stops[n_stops-1]); } n_stops++; } stops[n_stops-1].offset = 1.0; } - for (i = 0; i < n_stops; i++) { - double red, green, blue; - cairo_color_t color; - - _cairo_color_init_rgba (&color, - stops[i].color[0], - stops[i].color[1], - stops[i].color[2], - stops[i].color[3]); - _cairo_ps_surface_flatten_transparency (surface, &color, - &red, &green, &blue); - stops[i].color[0] = red; - stops[i].color[1] = green; - stops[i].color[2] = blue; - } - _cairo_output_stream_printf (surface->stream, "/CairoFunction\n"); if (n_stops == 2) { /* no need for stitched function */ - _cairo_ps_surface_emit_linear_colorgradient (surface, &stops[0], &stops[1]); + _cairo_ps_surface_emit_linear_colorgradient (surface, + &stops[0], &stops[1]); } else { /* multiple stops: stitch. XXX possible optimization: regulary spaced * stops do not require stitching. XXX */ diff --git a/test/Makefile.am b/test/Makefile.am index 562f4d49b..9424d2ea8 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -448,8 +448,6 @@ REFERENCE_IMAGES = \ glyph-cache-pressure-quartz-ref.png \ gradient-alpha-pdf-argb32-ref.png \ gradient-alpha-pdf-rgb24-ref.png \ - gradient-alpha-ps-argb32-ref.png \ - gradient-alpha-ps-rgb24-ref.png \ gradient-alpha-ref.png \ gradient-alpha-rgb24-ref.png \ gradient-zero-stops-ref.png \ diff --git a/test/clip-operator-ps-argb32-ref.png b/test/clip-operator-ps-argb32-ref.png deleted file mode 100644 index 35014bd8357433aa0dea9d11067c44d4f9152ac4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9102 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 diff --git a/test/clip-operator-ps-rgb24-ref.png b/test/clip-operator-ps-rgb24-ref.png deleted file mode 100644 index 1736e4bb8f22bf4bdc81b6911d6df2676285e237..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4620 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 diff --git a/test/gradient-alpha-ps-rgb24-ref.png b/test/gradient-alpha-ps-rgb24-ref.png deleted file mode 100644 index 430052cb6109daae7c50e76efc6f6e73eb30688d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4u_bxCyDx`7I;J! zGca%qfiUBxyLEqng0dy95hcO-X(i=}MX3y~!2t^H8TrK}#mPmP1tkg=dWNQ)r|!)G zD%A3HaSV}|nyiyv@bkO_OTy0+2ON8>*rvVb(K({2a_flvky$_HMF_Vyq%+*T$hES0 S>Bd_?T@0SCelF{r5}E)E$vKSx diff --git a/test/operator-clear-ps-argb32-ref.png b/test/operator-clear-ps-argb32-ref.png deleted file mode 100644 index d9a776941a32b31e14c9ec1c2fc3b7fa0aceaa08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1435 zcmV;M1!Ve(P)4M`&+z zbaP{JX>fEPI4(9Z8YEeD000FNNklCP^E}i z6odW&?%j%_?%djyAh;=X<3{u^P*)bJh&#WvxDXXZL_yJ3jisbhThp|2-^F2OGMSmo zWO85LzR&|9llge^yZ3y|xsw>SZL=IL^Ir>yGSk_(bjeUNGhkWrnwf!I4%V%MxjA_I z7CwH2zkkC)wyg}E99LLA?;YH+1CAeu-MhgsWS>&-{5f2>01qEVk5m^2+qSW7o9ow= z8W~Y)bX2LOB^7Das#0gpC?#Lvy>xS2VK;6F%(kOpwa_C+!hyOtuCP0Ilq!|tVU9h0 zs#JS>5U7jeX65?zuwg?3pV!&oAZ*_b?d|^kx;U<|W?&$}ymzkzdo5HK$IZ&stD6G? zbawi)P$$O~*4EY>OerXppiuDd*Tr##tyu%rDrB?CfbZYS`Sl~!#c_q@a&kfvTUvtA z(cma`a?IKf*(@wBf@ua%bj-G4Yz%(?4vtbMCvd50dLyoPN2vr)p1|kN;iJ^a2^~{5 z3zZ5?P09P*oNPOvqh?AcCvviLIeE8j$Yi9(Bo(BC(;x~28t1a4;+o|cD;;c;=DKot z*ih5cP%cCLJ9yi1o#)Vyp`dk+FUGpN!%r@k{l}u94r6*6y1H89xWc-+f)}QNI)Yji z=L+lYhMhYlgBBK~&QvP!^()-FCpYKWStu4^|9(mNpFgE<9~<+4x;VZW+p|Z2-@i-M zcEE)KbacR#E3j!3+`bKO-iV0Hm*LbY|BUJ2xaDGe+)&%Li3=V)@GrkC3r?JnRnNI| zFgfY%pPhxnhvEKx30hqo-;9~2Om$d~RV>2QtI~1SSMJA;{WGS6y5Hlg!AXUg_mxQTlxF?VAU$= zqsnFY^$Wgz^Ix!evjFpX={(P#h2dd;pRbD(aAjLt(DzR84h+D=gtyPKB;x{Z(7^Et z%VffV0Iy$5%*@QdvuCo;FktJ};JG?DZn-cF!}V~b;-ztIsuv2--!BV}KYt`<%4I2x zCr?V6YvY6oYXr3{iJ!$qX^|%iF^hdweGVlc?Pj|EgU$|c*a`cr0QTnV&>+}_!vvd z0l&DF4z^iaw)aZcm0?{$u^8+;=jVeE!)V-Hq~SD-u{1w8=;AaKrsKzlw4DFvj4cac zj~)eAG9x3w3&H}q)^u@PVM*g4Z1lCy>UD8K|J&2Z!oE0DQw?=-nidvzUhO{zba9ry zD|0!y^Y`?42a^W!;Gnmyi=(B$#&s8II9lphTzj2{qeWQUjHTgdab?_$rQyW>i=e(O pe(@sslX9B&I*e0mD;;dJ_78uMG1gL5VwnH{002ovPDHLkV1iZ<#2Nqq diff --git a/test/operator-source-ps-argb32-ref.png b/test/operator-source-ps-argb32-ref.png deleted file mode 100644 index d5cb053a280cb6cdee303447a2ef754a29931459..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3890 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