|
1 diff --git a/gfx/cairo/README b/gfx/cairo/README |
|
2 --- a/gfx/cairo/README |
|
3 +++ b/gfx/cairo/README |
|
4 @@ -71,16 +71,18 @@ quartz-cache-CGImageRef.patch: cache CGI |
|
5 quartz-remove-snapshot.patch: remove broken implementation of backend snapshot |
|
6 |
|
7 quartz-cglayers.patch: add support for cairo surfaces backed by CGLayers |
|
8 |
|
9 quartz-cglayers-fix-fallback.patch: Bug 572912; fix bug in fallback code in previous patch |
|
10 |
|
11 quartz-get-image.patch: Bug 575521; add a way to get the image surface associated with a surface |
|
12 |
|
13 +quartz-create-for-data.patch: Bug 575521; add a way to create quartz surfaces backed with application-provided data |
|
14 + |
|
15 premultiply-alpha-solid-gradients.patch: bug 539165; multiply the solid color by the alpha component before using it for a solid surface |
|
16 |
|
17 xlib-initialize-members.path: bug 548793; initialize XRender version if the server doesn't have the extension |
|
18 |
|
19 remove-comma: remove a comma from enum |
|
20 |
|
21 d2d.patch: add d2d support |
|
22 |
|
23 diff --git a/gfx/cairo/cairo/src/cairo-quartz-private.h b/gfx/cairo/cairo/src/cairo-quartz-private.h |
|
24 --- a/gfx/cairo/cairo/src/cairo-quartz-private.h |
|
25 +++ b/gfx/cairo/cairo/src/cairo-quartz-private.h |
|
26 @@ -63,16 +63,18 @@ typedef struct cairo_quartz_surface { |
|
27 CGImageRef bitmapContextImage; |
|
28 |
|
29 /** |
|
30 * If non-null, this is the CGLayer for the surface. |
|
31 */ |
|
32 CGLayerRef cgLayer; |
|
33 |
|
34 cairo_rectangle_int_t extents; |
|
35 + |
|
36 + cairo_bool_t ownsData; |
|
37 } cairo_quartz_surface_t; |
|
38 |
|
39 typedef struct cairo_quartz_image_surface { |
|
40 cairo_surface_t base; |
|
41 |
|
42 cairo_rectangle_int_t extents; |
|
43 |
|
44 CGImageRef image; |
|
45 diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c |
|
46 --- a/gfx/cairo/cairo/src/cairo-quartz-surface.c |
|
47 +++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c |
|
48 @@ -1880,20 +1880,21 @@ _cairo_quartz_surface_finish (void *abst |
|
49 surface->cgContext = NULL; |
|
50 |
|
51 if (surface->bitmapContextImage) { |
|
52 CGImageRelease (surface->bitmapContextImage); |
|
53 surface->bitmapContextImage = NULL; |
|
54 } |
|
55 |
|
56 if (surface->imageSurfaceEquiv) { |
|
57 - _cairo_image_surface_assume_ownership_of_data (surface->imageSurfaceEquiv); |
|
58 + if (surface->ownsData) |
|
59 + _cairo_image_surface_assume_ownership_of_data (surface->imageSurfaceEquiv); |
|
60 cairo_surface_destroy (surface->imageSurfaceEquiv); |
|
61 surface->imageSurfaceEquiv = NULL; |
|
62 - } else if (surface->imageData) { |
|
63 + } else if (surface->imageData && surface->ownsData) { |
|
64 free (surface->imageData); |
|
65 } |
|
66 |
|
67 surface->imageData = NULL; |
|
68 |
|
69 if (surface->cgLayer) { |
|
70 CGLayerRelease (surface->cgLayer); |
|
71 } |
|
72 @@ -2888,16 +2889,17 @@ _cairo_quartz_surface_create_internal (C |
|
73 |
|
74 surface->cgContext = cgContext; |
|
75 surface->cgContextBaseCTM = CGContextGetCTM (cgContext); |
|
76 |
|
77 surface->imageData = NULL; |
|
78 surface->imageSurfaceEquiv = NULL; |
|
79 surface->bitmapContextImage = NULL; |
|
80 surface->cgLayer = NULL; |
|
81 + surface->ownsData = TRUE; |
|
82 |
|
83 return surface; |
|
84 } |
|
85 |
|
86 /** |
|
87 * cairo_quartz_surface_create_for_cg_context |
|
88 * @cgContext: the existing CGContext for which to create the surface |
|
89 * @width: width of the surface, in pixels |
|
90 @@ -3031,23 +3033,103 @@ cairo_quartz_surface_create_cg_layer (ca |
|
91 * |
|
92 * Since: 1.4 |
|
93 **/ |
|
94 cairo_surface_t * |
|
95 cairo_quartz_surface_create (cairo_format_t format, |
|
96 unsigned int width, |
|
97 unsigned int height) |
|
98 { |
|
99 + int stride; |
|
100 + unsigned char *data; |
|
101 + |
|
102 + if (!_cairo_quartz_verify_surface_size(width, height)) |
|
103 + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); |
|
104 + |
|
105 + if (width == 0 || height == 0) { |
|
106 + return (cairo_surface_t*) _cairo_quartz_surface_create_internal (NULL, _cairo_content_from_format (format), |
|
107 + width, height); |
|
108 + } |
|
109 + |
|
110 + if (format == CAIRO_FORMAT_ARGB32 || |
|
111 + format == CAIRO_FORMAT_RGB24) |
|
112 + { |
|
113 + stride = width * 4; |
|
114 + } else if (format == CAIRO_FORMAT_A8) { |
|
115 + stride = width; |
|
116 + } else if (format == CAIRO_FORMAT_A1) { |
|
117 + /* I don't think we can usefully support this, as defined by |
|
118 + * cairo_format_t -- these are 1-bit pixels stored in 32-bit |
|
119 + * quantities. |
|
120 + */ |
|
121 + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); |
|
122 + } else { |
|
123 + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); |
|
124 + } |
|
125 + |
|
126 + /* The Apple docs say that for best performance, the stride and the data |
|
127 + * pointer should be 16-byte aligned. malloc already aligns to 16-bytes, |
|
128 + * so we don't have to anything special on allocation. |
|
129 + */ |
|
130 + stride = (stride + 15) & ~15; |
|
131 + |
|
132 + data = _cairo_malloc_ab (height, stride); |
|
133 + if (!data) { |
|
134 + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); |
|
135 + } |
|
136 + |
|
137 + /* zero the memory to match the image surface behaviour */ |
|
138 + memset (data, 0, height * stride); |
|
139 + |
|
140 + cairo_quartz_surface_t *surf; |
|
141 + surf = (cairo_quartz_surface_t *) cairo_quartz_surface_create_for_data |
|
142 + (data, format, width, height, stride); |
|
143 + if (surf->base.status) { |
|
144 + free (data); |
|
145 + return (cairo_surface_t *) surf; |
|
146 + } |
|
147 + |
|
148 + // We created this data, so we can delete it. |
|
149 + surf->ownsData = TRUE; |
|
150 + |
|
151 + return (cairo_surface_t *) surf; |
|
152 +} |
|
153 + |
|
154 +/** |
|
155 + * cairo_quartz_surface_create_for_data |
|
156 + * @data: a pointer to a buffer supplied by the application in which |
|
157 + * to write contents. This pointer must be suitably aligned for any |
|
158 + * kind of variable, (for example, a pointer returned by malloc). |
|
159 + * @format: format of pixels in the surface to create |
|
160 + * @width: width of the surface, in pixels |
|
161 + * @height: height of the surface, in pixels |
|
162 + * |
|
163 + * Creates a Quartz surface backed by a CGBitmap. The surface is |
|
164 + * created using the Device RGB (or Device Gray, for A8) color space. |
|
165 + * All Cairo operations, including those that require software |
|
166 + * rendering, will succeed on this surface. |
|
167 + * |
|
168 + * Return value: the newly created surface. |
|
169 + * |
|
170 + * Since: 1.12 |
|
171 + **/ |
|
172 +cairo_surface_t * |
|
173 +cairo_quartz_surface_create_for_data (unsigned char *data, |
|
174 + cairo_format_t format, |
|
175 + unsigned int width, |
|
176 + unsigned int height, |
|
177 + unsigned int stride) |
|
178 +{ |
|
179 cairo_quartz_surface_t *surf; |
|
180 CGContextRef cgc; |
|
181 CGColorSpaceRef cgColorspace; |
|
182 CGBitmapInfo bitinfo; |
|
183 - void *imageData; |
|
184 - int stride; |
|
185 + void *imageData = data; |
|
186 int bitsPerComponent; |
|
187 + unsigned int i; |
|
188 |
|
189 // verify width and height of surface |
|
190 if (!_cairo_quartz_verify_surface_size(width, height)) |
|
191 return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); |
|
192 |
|
193 if (width == 0 || height == 0) { |
|
194 return (cairo_surface_t*) _cairo_quartz_surface_create_internal (NULL, _cairo_content_from_format (format), |
|
195 width, height); |
|
196 @@ -3058,47 +3140,30 @@ cairo_quartz_surface_create (cairo_forma |
|
197 { |
|
198 cgColorspace = CGColorSpaceCreateDeviceRGB(); |
|
199 bitinfo = kCGBitmapByteOrder32Host; |
|
200 if (format == CAIRO_FORMAT_ARGB32) |
|
201 bitinfo |= kCGImageAlphaPremultipliedFirst; |
|
202 else |
|
203 bitinfo |= kCGImageAlphaNoneSkipFirst; |
|
204 bitsPerComponent = 8; |
|
205 - stride = width * 4; |
|
206 } else if (format == CAIRO_FORMAT_A8) { |
|
207 cgColorspace = NULL; |
|
208 - stride = width; |
|
209 bitinfo = kCGImageAlphaOnly; |
|
210 bitsPerComponent = 8; |
|
211 } else if (format == CAIRO_FORMAT_A1) { |
|
212 /* I don't think we can usefully support this, as defined by |
|
213 * cairo_format_t -- these are 1-bit pixels stored in 32-bit |
|
214 * quantities. |
|
215 */ |
|
216 return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); |
|
217 } else { |
|
218 return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); |
|
219 } |
|
220 |
|
221 - /* The Apple docs say that for best performance, the stride and the data |
|
222 - * pointer should be 16-byte aligned. malloc already aligns to 16-bytes, |
|
223 - * so we don't have to anything special on allocation. |
|
224 - */ |
|
225 - stride = (stride + 15) & ~15; |
|
226 - |
|
227 - imageData = _cairo_malloc_ab (height, stride); |
|
228 - if (!imageData) { |
|
229 - CGColorSpaceRelease (cgColorspace); |
|
230 - return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); |
|
231 - } |
|
232 - |
|
233 - /* zero the memory to match the image surface behaviour */ |
|
234 - memset (imageData, 0, height * stride); |
|
235 - |
|
236 cgc = CGBitmapContextCreate (imageData, |
|
237 width, |
|
238 height, |
|
239 bitsPerComponent, |
|
240 stride, |
|
241 cgColorspace, |
|
242 bitinfo); |
|
243 CGColorSpaceRelease (cgColorspace); |
|
244 @@ -3118,16 +3183,17 @@ cairo_quartz_surface_create (cairo_forma |
|
245 CGContextRelease (cgc); |
|
246 free (imageData); |
|
247 // create_internal will have set an error |
|
248 return (cairo_surface_t*) surf; |
|
249 } |
|
250 |
|
251 surf->imageData = imageData; |
|
252 surf->imageSurfaceEquiv = cairo_image_surface_create_for_data (imageData, format, width, height, stride); |
|
253 + surf->ownsData = FALSE; |
|
254 |
|
255 return (cairo_surface_t *) surf; |
|
256 } |
|
257 |
|
258 /** |
|
259 * cairo_quartz_surface_get_cg_context |
|
260 * @surface: the Cairo Quartz surface |
|
261 * |
|
262 diff --git a/gfx/cairo/cairo/src/cairo-quartz.h b/gfx/cairo/cairo/src/cairo-quartz.h |
|
263 --- a/gfx/cairo/cairo/src/cairo-quartz.h |
|
264 +++ b/gfx/cairo/cairo/src/cairo-quartz.h |
|
265 @@ -45,16 +45,23 @@ |
|
266 CAIRO_BEGIN_DECLS |
|
267 |
|
268 cairo_public cairo_surface_t * |
|
269 cairo_quartz_surface_create (cairo_format_t format, |
|
270 unsigned int width, |
|
271 unsigned int height); |
|
272 |
|
273 cairo_public cairo_surface_t * |
|
274 +cairo_quartz_surface_create_for_data (unsigned char *data, |
|
275 + cairo_format_t format, |
|
276 + unsigned int width, |
|
277 + unsigned int height, |
|
278 + unsigned int stride); |
|
279 + |
|
280 +cairo_public cairo_surface_t * |
|
281 cairo_quartz_surface_create_cg_layer (cairo_surface_t *surface, |
|
282 unsigned int width, |
|
283 unsigned int height); |
|
284 |
|
285 cairo_public cairo_surface_t * |
|
286 cairo_quartz_surface_create_for_cg_context (CGContextRef cgContext, |
|
287 unsigned int width, |
|
288 unsigned int height); |
|
289 diff --git a/gfx/cairo/cairo/src/cairo-rename.h b/gfx/cairo/cairo/src/cairo-rename.h |
|
290 --- a/gfx/cairo/cairo/src/cairo-rename.h |
|
291 +++ b/gfx/cairo/cairo/src/cairo-rename.h |
|
292 @@ -176,16 +176,17 @@ |
|
293 #define cairo_qpainter_surface_get_image _moz_cairo_qpainter_surface_get_image |
|
294 #define cairo_qpainter_surface_get_qimage _moz_cairo_qpainter_surface_get_qimage |
|
295 #define cairo_qpainter_surface_get_qpainter _moz_cairo_qpainter_surface_get_qpainter |
|
296 #define cairo_quartz_font_face_create_for_atsu_font_id _moz_cairo_quartz_font_face_create_for_atsu_font_id |
|
297 #define cairo_quartz_font_face_create_for_cgfont _moz_cairo_quartz_font_face_create_for_cgfont |
|
298 #define cairo_quartz_image_surface_create _moz_cairo_quartz_image_surface_create |
|
299 #define cairo_quartz_image_surface_get_image _moz_cairo_quartz_image_surface_get_image |
|
300 #define cairo_quartz_surface_create _moz_cairo_quartz_surface_create |
|
301 +#define cairo_quartz_surface_create_for_data _moz_cairo_quartz_surface_create_for_data |
|
302 #define cairo_quartz_surface_create_for_cg_context _moz_cairo_quartz_surface_create_for_cg_context |
|
303 #define cairo_quartz_surface_get_cg_context _moz_cairo_quartz_surface_get_cg_context |
|
304 #define cairo_quartz_surface_get_image _moz_cairo_quartz_surface_get_image |
|
305 #define cairo_rectangle _moz_cairo_rectangle |
|
306 #define cairo_rectangle_list_destroy _moz_cairo_rectangle_list_destroy |
|
307 #define cairo_reference _moz_cairo_reference |
|
308 #define cairo_rel_curve_to _moz_cairo_rel_curve_to |
|
309 #define cairo_rel_line_to _moz_cairo_rel_line_to |