1 /* cairo - a vector graphics library with display and print output
3 * Copyright © 2002 University of Southern California
4 * Copyright © 2005 Red Hat, Inc.
6 * This library is free software; you can redistribute it and/or
7 * modify it either under the terms of the GNU Lesser General Public
8 * License version 2.1 as published by the Free Software Foundation
9 * (the "LGPL") or, at your option, under the terms of the Mozilla
10 * Public License Version 1.1 (the "MPL"). If you do not alter this
11 * notice, a recipient may use your version of this file under either
12 * the MPL or the LGPL.
14 * You should have received a copy of the LGPL along with this library
15 * in the file COPYING-LGPL-2.1; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA
17 * You should have received a copy of the MPL along with this library
18 * in the file COPYING-MPL-1.1
20 * The contents of this file are subject to the Mozilla Public License
21 * Version 1.1 (the "License"); you may not use this file except in
22 * compliance with the License. You may obtain a copy of the License at
23 * http://www.mozilla.org/MPL/
25 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
26 * OF ANY KIND, either express or implied. See the LGPL or the MPL for
27 * the specific language governing rights and limitations.
29 * The Original Code is the cairo graphics library.
31 * The Initial Developer of the Original Code is University of Southern
35 * Carl D. Worth <cworth@cworth.org>
39 * These definitions are solely for use by the implementation of cairo
40 * and constitute no kind of standard. If you need any of these
41 * functions, please drop me a note. Either the library needs new
42 * functionality, or there's a way to do what you need using the
43 * existing published interfaces. cworth@cworth.org
54 #define cairo_public __declspec(dllexport)
64 #define _USE_MATH_DEFINES
73 #include "cairo-compiler-private.h"
74 #include "cairo-error-private.h"
76 #if CAIRO_HAS_PDF_SURFACE || \
77 CAIRO_HAS_PS_SURFACE || \
78 CAIRO_HAS_SCRIPT_SURFACE || \
80 #define CAIRO_HAS_DEFLATE_STREAM 1
83 #if CAIRO_HAS_PS_SURFACE || \
84 CAIRO_HAS_PDF_SURFACE || \
85 CAIRO_HAS_SVG_SURFACE || \
86 CAIRO_HAS_WIN32_SURFACE
87 #define CAIRO_HAS_FONT_SUBSET 1
90 #if CAIRO_HAS_PS_SURFACE || \
91 CAIRO_HAS_PDF_SURFACE || \
93 #define CAIRO_HAS_PDF_OPERATORS 1
98 #if _WIN32 && !_WIN32_WCE /* Permissions on WinCE? No worries! */
100 _cairo_win32_tmpfile (void);
101 #define tmpfile() _cairo_win32_tmpfile()
105 #define MIN(a, b) ((a) < (b) ? (a) : (b))
108 #define MAX(a, b) ((a) > (b) ? (a) : (b))
119 #define M_PI 3.14159265358979323846
123 #define M_SQRT2 1.41421356237309504880
127 #define M_SQRT1_2 0.707106781186547524400844362104849039
131 #define ARRAY_LENGTH(__array) ((int) (sizeof (__array) / sizeof (__array[0])))
135 #define STRINGIFY(macro_or_string) STRINGIFY_ARG (macro_or_string)
136 #define STRINGIFY_ARG(contents) #contents
138 #if defined (__GNUC__)
139 #define cairo_container_of(ptr, type, member) ({ \
140 const __typeof__ (((type *) 0)->member) *mptr__ = (ptr); \
141 (type *) ((char *) mptr__ - offsetof (type, member)); \
144 #define cairo_container_of(ptr, type, member) \
145 ((type *)((char *) (ptr) - (char *) &((type *)0)->member))
149 #define ASSERT_NOT_REACHED \
151 assert (!"reached"); \
153 #define COMPILE_TIME_ASSERT1(condition, line) \
154 typedef int compile_time_assertion_at_line_##line##_failed [(condition)?1:-1]
155 #define COMPILE_TIME_ASSERT0(condition, line) COMPILE_TIME_ASSERT1(condition, line)
156 #define COMPILE_TIME_ASSERT(condition) COMPILE_TIME_ASSERT0(condition, __LINE__)
158 #define CAIRO_ALPHA_IS_CLEAR(alpha) ((alpha) <= ((double)0x00ff / (double)0xffff))
159 #define CAIRO_ALPHA_SHORT_IS_CLEAR(alpha) ((alpha) <= 0x00ff)
161 #define CAIRO_ALPHA_IS_OPAQUE(alpha) ((alpha) >= ((double)0xff00 / (double)0xffff))
162 #define CAIRO_ALPHA_SHORT_IS_OPAQUE(alpha) ((alpha) >= 0xff00)
163 #define CAIRO_ALPHA_IS_ZERO(alpha) ((alpha) <= 0.0)
165 #define CAIRO_COLOR_IS_CLEAR(color) CAIRO_ALPHA_SHORT_IS_CLEAR ((color)->alpha_short)
166 #define CAIRO_COLOR_IS_OPAQUE(color) CAIRO_ALPHA_SHORT_IS_OPAQUE ((color)->alpha_short)
168 /* Reverse the bits in a byte with 7 operations (no 64-bit):
169 * Devised by Sean Anderson, July 13, 2001.
170 * Source: http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith32Bits
172 #define CAIRO_BITSWAP8(c) ((((c) * 0x0802LU & 0x22110LU) | ((c) * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16)
174 /* Return the number of 1 bits in mask.
176 * GCC 3.4 supports a "population count" builtin, which on many targets is
177 * implemented with a single instruction. There is a fallback definition
178 * in libgcc in case a target does not have one, which should be just as
179 * good as the open-coded solution below, (which is "HACKMEM 169").
181 static inline int cairo_const
182 _cairo_popcount (uint32_t mask)
184 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
185 return __builtin_popcount (mask);
189 y = (mask >> 1) &033333333333;
190 y = mask - y - ((y >>1) & 033333333333);
191 return (((y + (y >> 3)) & 030707070707) % 077);
195 static cairo_always_inline cairo_bool_t
196 _cairo_is_little_endian (void)
198 static const int i = 1;
199 return *((char *) &i) == 0x01;
202 #ifdef WORDS_BIGENDIAN
203 #define CAIRO_BITSWAP8_IF_LITTLE_ENDIAN(c) (c)
205 #define CAIRO_BITSWAP8_IF_LITTLE_ENDIAN(c) CAIRO_BITSWAP8(c)
208 #ifdef WORDS_BIGENDIAN
210 #define cpu_to_be16(v) (v)
211 #define be16_to_cpu(v) (v)
212 #define cpu_to_be32(v) (v)
213 #define be32_to_cpu(v) (v)
217 static inline uint16_t cairo_const
218 cpu_to_be16(uint16_t v)
220 return (v << 8) | (v >> 8);
223 static inline uint16_t cairo_const
224 be16_to_cpu(uint16_t v)
226 return cpu_to_be16 (v);
229 static inline uint32_t cairo_const
230 cpu_to_be32(uint32_t v)
232 return (cpu_to_be16 (v) << 16) | cpu_to_be16 (v >> 16);
235 static inline uint32_t cairo_const
236 be32_to_cpu(uint32_t v)
238 return cpu_to_be32 (v);
244 /* The glibc versions of ispace() and isdigit() are slow in UTF-8 locales.
247 static inline int cairo_const
248 _cairo_isspace (int c)
250 return (c == 0x20 || (c >= 0x09 && c <= 0x0d));
253 static inline int cairo_const
254 _cairo_isdigit (int c)
256 return (c >= '0' && c <= '9');
259 #include "cairo-types-private.h"
260 #include "cairo-cache-private.h"
261 #include "cairo-reference-count-private.h"
262 #include "cairo-spans-private.h"
263 #include "cairo-surface-private.h"
266 _cairo_box_from_doubles (cairo_box_t *box,
267 double *x1, double *y1,
268 double *x2, double *y2);
271 _cairo_box_to_doubles (const cairo_box_t *box,
272 double *x1, double *y1,
273 double *x2, double *y2);
276 _cairo_box_from_rectangle (cairo_box_t *box,
277 const cairo_rectangle_int_t *rectangle);
280 _cairo_box_round_to_rectangle (const cairo_box_t *box,
281 cairo_rectangle_int_t *rectangle);
284 _cairo_box_add_curve_to (cairo_box_t *extents,
285 const cairo_point_t *a,
286 const cairo_point_t *b,
287 const cairo_point_t *c,
288 const cairo_point_t *d);
291 _cairo_boxes_get_extents (const cairo_box_t *boxes,
293 cairo_box_t *extents);
295 cairo_private extern const cairo_rectangle_int_t _cairo_empty_rectangle;
296 cairo_private extern const cairo_rectangle_int_t _cairo_unbounded_rectangle;
299 _cairo_unbounded_rectangle_init (cairo_rectangle_int_t *rect)
301 *rect = _cairo_unbounded_rectangle;
304 cairo_private_no_warn cairo_bool_t
305 _cairo_rectangle_intersect (cairo_rectangle_int_t *dst,
306 const cairo_rectangle_int_t *src);
308 static inline cairo_bool_t
309 _cairo_rectangle_intersects (const cairo_rectangle_int_t *dst,
310 const cairo_rectangle_int_t *src)
312 return !(src->x >= dst->x + (int) dst->width ||
313 src->x + (int) src->width <= dst->x ||
314 src->y >= dst->y + (int) dst->height ||
315 src->y + (int) src->height <= dst->y);
318 static inline cairo_bool_t
319 _cairo_rectangle_contains_rectangle (const cairo_rectangle_int_t *a,
320 const cairo_rectangle_int_t *b)
322 return (a->x <= b->x &&
323 a->x + (int) a->width >= b->x + (int) b->width &&
325 a->y + (int) a->height >= b->y + (int) b->height);
329 _cairo_rectangle_int_from_double (cairo_rectangle_int_t *recti,
330 const cairo_rectangle_t *rectf);
332 /* Extends the dst rectangle to also contain src.
333 * If one of the rectangles is empty, the result is undefined
336 _cairo_rectangle_union (cairo_rectangle_int_t *dst,
337 const cairo_rectangle_int_t *src);
339 cairo_private cairo_bool_t
340 _cairo_box_intersects_line_segment (cairo_box_t *box,
341 cairo_line_t *line) cairo_pure;
343 cairo_private cairo_bool_t
344 _cairo_spline_intersects (const cairo_point_t *a,
345 const cairo_point_t *b,
346 const cairo_point_t *c,
347 const cairo_point_t *d,
348 const cairo_box_t *box) cairo_pure;
351 const cairo_user_data_key_t *key;
353 cairo_destroy_func_t destroy;
354 } cairo_user_data_slot_t;
357 _cairo_user_data_array_init (cairo_user_data_array_t *array);
360 _cairo_user_data_array_fini (cairo_user_data_array_t *array);
363 _cairo_user_data_array_get_data (cairo_user_data_array_t *array,
364 const cairo_user_data_key_t *key);
366 cairo_private cairo_status_t
367 _cairo_user_data_array_set_data (cairo_user_data_array_t *array,
368 const cairo_user_data_key_t *key,
370 cairo_destroy_func_t destroy);
372 cairo_private cairo_status_t
373 _cairo_user_data_array_copy (cairo_user_data_array_t *dst,
374 const cairo_user_data_array_t *src);
377 _cairo_user_data_array_foreach (cairo_user_data_array_t *array,
378 void (*func) (const void *key,
383 #define _CAIRO_HASH_INIT_VALUE 5381
385 cairo_private unsigned long
386 _cairo_hash_string (const char *c);
388 cairo_private unsigned long
389 _cairo_hash_bytes (unsigned long hash,
391 unsigned int length);
393 #define _cairo_scaled_glyph_index(g) ((g)->hash_entry.hash)
394 #define _cairo_scaled_glyph_set_index(g, i) ((g)->hash_entry.hash = (i))
396 #include "cairo-scaled-font-private.h"
398 struct _cairo_font_face {
399 /* hash_entry must be first */
400 cairo_hash_entry_t hash_entry;
401 cairo_status_t status;
402 cairo_reference_count_t ref_count;
403 cairo_user_data_array_t user_data;
404 const cairo_font_face_backend_t *backend;
408 _cairo_default_context_reset_static_data (void);
411 _cairo_toy_font_face_reset_static_data (void);
414 _cairo_ft_font_reset_static_data (void);
417 _cairo_win32_font_reset_static_data (void);
419 #if CAIRO_HAS_COGL_SURFACE
421 _cairo_cogl_context_reset_static_data (void);
424 /* the font backend interface */
426 struct _cairo_unscaled_font_backend {
427 void (*destroy) (void *unscaled_font);
430 /* #cairo_toy_font_face_t - simple family/slant/weight font faces used for
431 * the built-in font API
434 typedef struct _cairo_toy_font_face {
435 cairo_font_face_t base;
437 cairo_bool_t owns_family;
438 cairo_font_slant_t slant;
439 cairo_font_weight_t weight;
441 cairo_font_face_t *impl_face; /* The non-toy font face this actually uses */
442 } cairo_toy_font_face_t;
444 typedef enum _cairo_scaled_glyph_info {
445 CAIRO_SCALED_GLYPH_INFO_METRICS = (1 << 0),
446 CAIRO_SCALED_GLYPH_INFO_SURFACE = (1 << 1),
447 CAIRO_SCALED_GLYPH_INFO_PATH = (1 << 2),
448 CAIRO_SCALED_GLYPH_INFO_RECORDING_SURFACE = (1 << 3)
449 } cairo_scaled_glyph_info_t;
451 typedef struct _cairo_scaled_font_subset {
452 cairo_scaled_font_t *scaled_font;
453 unsigned int font_id;
454 unsigned int subset_id;
456 /* Index of glyphs array is subset_glyph_index.
457 * Value of glyphs array is scaled_font_glyph_index.
459 unsigned long *glyphs;
463 unsigned long *latin_to_subset_glyph_index;
464 unsigned int num_glyphs;
465 cairo_bool_t is_composite;
466 cairo_bool_t is_scaled;
467 cairo_bool_t is_latin;
468 } cairo_scaled_font_subset_t;
470 struct _cairo_scaled_font_backend {
471 cairo_font_type_t type;
474 (*fini) (void *scaled_font);
476 cairo_warn cairo_int_status_t
477 (*scaled_glyph_init) (void *scaled_font,
478 cairo_scaled_glyph_t *scaled_glyph,
479 cairo_scaled_glyph_info_t info);
481 /* A backend only needs to implement this or ucs4_to_index(), not
482 * both. This allows the backend to do something more sophisticated
483 * then just converting characters one by one.
485 cairo_warn cairo_int_status_t
486 (*text_to_glyphs) (void *scaled_font,
491 cairo_glyph_t **glyphs,
493 cairo_text_cluster_t **clusters,
495 cairo_text_cluster_flags_t *cluster_flags);
498 (*ucs4_to_index) (void *scaled_font,
501 /* Read data from a sfnt font table.
503 * @tag: 4 byte table name specifying the table to read.
504 * @offset: offset into the table
505 * @buffer: buffer to write data into. Caller must ensure there is sufficient space.
506 * If NULL, return the size of the table in @length.
507 * @length: If @buffer is NULL, the size of the table will be returned in @length.
508 * If @buffer is not null, @length specifies the number of bytes to read.
510 * If less than @length bytes are available to read this function
511 * returns CAIRO_INT_STATUS_UNSUPPORTED. Note that requesting more
512 * bytes than are available in the table may continue reading data
513 * from the following table and return success. If this is
514 * undesirable the caller should first query the table size. If an
515 * error occurs the output value of @length is undefined.
517 * Returns CAIRO_INT_STATUS_UNSUPPORTED if not a sfnt style font or table not found.
519 cairo_warn cairo_int_status_t
520 (*load_truetype_table)(void *scaled_font,
523 unsigned char *buffer,
524 unsigned long *length);
526 /* ucs4 is set to -1 if the unicode character could not be found
528 cairo_warn cairo_int_status_t
529 (*index_to_ucs4)(void *scaled_font,
533 cairo_warn cairo_bool_t
534 (*is_synthetic)(void *scaled_font);
536 /* For type 1 fonts, return the glyph name for a given glyph index.
537 * A glyph index and list of glyph names in the Type 1 fonts is provided.
538 * The function returns the index of the glyph in the list of glyph names.
540 * @glyph_names: the names of each glyph in the Type 1 font in the
541 * order they appear in the CharStrings array
542 * @num_glyph_names: the number of names in the glyph_names array
543 * @glyph_index: the given glyph index
544 * @glyph_array_index: (index into glyph_names) the glyph name corresponding
548 cairo_warn cairo_int_status_t
549 (*index_to_glyph_name)(void *scaled_font,
552 unsigned long glyph_index,
553 unsigned long *glyph_array_index);
555 /* Read data from a PostScript font.
557 * @offset: offset into the table
558 * @buffer: buffer to write data into. Caller must ensure there is sufficient space.
559 * If NULL, return the size of the table in @length.
560 * @length: If @buffer is NULL, the size of the table will be returned in @length.
561 * If @buffer is not null, @length specifies the number of bytes to read.
563 * If less than @length bytes are available to read this function
564 * returns CAIRO_INT_STATUS_UNSUPPORTED. If an error occurs the
565 * output value of @length is undefined.
567 * Returns CAIRO_INT_STATUS_UNSUPPORTED if not a Type 1 font.
569 cairo_warn cairo_int_status_t
570 (*load_type1_data) (void *scaled_font,
572 unsigned char *buffer,
573 unsigned long *length);
576 struct _cairo_font_face_backend {
577 cairo_font_type_t type;
579 cairo_warn cairo_status_t
580 (*create_for_toy) (cairo_toy_font_face_t *toy_face,
581 cairo_font_face_t **font_face);
583 /* The destroy() function is allowed to resurrect the font face
584 * by re-referencing. This is needed for the FreeType backend.
587 (*destroy) (void *font_face);
589 cairo_warn cairo_status_t
590 (*scaled_font_create) (void *font_face,
591 const cairo_matrix_t *font_matrix,
592 const cairo_matrix_t *ctm,
593 const cairo_font_options_t *options,
594 cairo_scaled_font_t **scaled_font);
597 (*get_implementation) (void *font_face,
598 const cairo_matrix_t *font_matrix,
599 const cairo_matrix_t *ctm,
600 const cairo_font_options_t *options);
603 extern const cairo_private struct _cairo_font_face_backend _cairo_user_font_face_backend;
605 /* concrete font backends */
606 #if CAIRO_HAS_FT_FONT
608 extern const cairo_private struct _cairo_font_face_backend _cairo_ft_font_face_backend;
612 #if CAIRO_HAS_WIN32_FONT
614 extern const cairo_private struct _cairo_font_face_backend _cairo_win32_font_face_backend;
618 #if CAIRO_HAS_QUARTZ_FONT
620 extern const cairo_private struct _cairo_font_face_backend _cairo_quartz_font_face_backend;
624 #define CAIRO_EXTEND_SURFACE_DEFAULT CAIRO_EXTEND_NONE
625 #define CAIRO_EXTEND_GRADIENT_DEFAULT CAIRO_EXTEND_PAD
626 #define CAIRO_FILTER_DEFAULT CAIRO_FILTER_GOOD
628 extern const cairo_private cairo_solid_pattern_t _cairo_pattern_clear;
629 extern const cairo_private cairo_solid_pattern_t _cairo_pattern_black;
630 extern const cairo_private cairo_solid_pattern_t _cairo_pattern_white;
632 struct _cairo_surface_attributes {
633 cairo_matrix_t matrix;
634 cairo_extend_t extend;
635 cairo_filter_t filter;
636 cairo_bool_t has_component_alpha;
642 #define CAIRO_FONT_SLANT_DEFAULT CAIRO_FONT_SLANT_NORMAL
643 #define CAIRO_FONT_WEIGHT_DEFAULT CAIRO_FONT_WEIGHT_NORMAL
645 #define CAIRO_WIN32_FONT_FAMILY_DEFAULT "Arial"
646 #define CAIRO_QUARTZ_FONT_FAMILY_DEFAULT "Helvetica"
647 #define CAIRO_FT_FONT_FAMILY_DEFAULT ""
648 #define CAIRO_USER_FONT_FAMILY_DEFAULT "@cairo:"
650 #if CAIRO_HAS_WIN32_FONT
652 #define CAIRO_FONT_FAMILY_DEFAULT CAIRO_WIN32_FONT_FAMILY_DEFAULT
653 #define CAIRO_FONT_FACE_BACKEND_DEFAULT &_cairo_win32_font_face_backend
655 #elif CAIRO_HAS_QUARTZ_FONT
657 #define CAIRO_FONT_FAMILY_DEFAULT CAIRO_QUARTZ_FONT_FAMILY_DEFAULT
658 #define CAIRO_FONT_FACE_BACKEND_DEFAULT &_cairo_quartz_font_face_backend
660 #elif CAIRO_HAS_FT_FONT
662 #define CAIRO_FONT_FAMILY_DEFAULT CAIRO_FT_FONT_FAMILY_DEFAULT
663 #define CAIRO_FONT_FACE_BACKEND_DEFAULT &_cairo_ft_font_face_backend
667 #define CAIRO_FONT_FAMILY_DEFAULT CAIRO_FT_FONT_FAMILY_DEFAULT
668 #define CAIRO_FONT_FACE_BACKEND_DEFAULT &_cairo_user_font_face_backend
672 #define CAIRO_GSTATE_OPERATOR_DEFAULT CAIRO_OPERATOR_OVER
673 #define CAIRO_GSTATE_TOLERANCE_DEFAULT 0.1
674 #define CAIRO_GSTATE_FILL_RULE_DEFAULT CAIRO_FILL_RULE_WINDING
675 #define CAIRO_GSTATE_LINE_WIDTH_DEFAULT 2.0
676 #define CAIRO_GSTATE_LINE_CAP_DEFAULT CAIRO_LINE_CAP_BUTT
677 #define CAIRO_GSTATE_LINE_JOIN_DEFAULT CAIRO_LINE_JOIN_MITER
678 #define CAIRO_GSTATE_MITER_LIMIT_DEFAULT 10.0
679 #define CAIRO_GSTATE_DEFAULT_FONT_SIZE 10.0
681 #define CAIRO_SURFACE_RESOLUTION_DEFAULT 72.0
682 #define CAIRO_SURFACE_FALLBACK_RESOLUTION_DEFAULT 300.0
684 typedef struct _cairo_stroke_face {
688 cairo_slope_t dev_vector;
689 cairo_point_double_t dev_slope;
690 cairo_point_double_t usr_vector;
692 } cairo_stroke_face_t;
696 static inline double cairo_const
697 _cairo_restrict_value (double value, double min, double max)
701 else if (value > max)
707 /* C99 round() rounds to the nearest integral value with halfway cases rounded
708 * away from 0. _cairo_round rounds halfway cases toward positive infinity.
709 * This matches the rounding behaviour of _cairo_lround. */
710 static inline double cairo_const
711 _cairo_round (double r)
713 return floor (r + .5);
716 #if DISABLE_SOME_FLOATING_POINT
718 _cairo_lround (double d) cairo_const;
720 static inline int cairo_const
721 _cairo_lround (double r)
723 return _cairo_round (r);
727 cairo_private uint16_t
728 _cairo_half_from_float (float f) cairo_const;
730 cairo_private cairo_bool_t
731 _cairo_operator_bounded_by_mask (cairo_operator_t op) cairo_const;
733 cairo_private cairo_bool_t
734 _cairo_operator_bounded_by_source (cairo_operator_t op) cairo_const;
737 CAIRO_OPERATOR_BOUND_BY_MASK = 1 << 1,
738 CAIRO_OPERATOR_BOUND_BY_SOURCE = 1 << 2,
741 cairo_private uint32_t
742 _cairo_operator_bounded_by_either (cairo_operator_t op) cairo_const;
744 cairo_private const cairo_color_t *
745 _cairo_stock_color (cairo_stock_t stock) cairo_pure;
747 #define CAIRO_COLOR_WHITE _cairo_stock_color (CAIRO_STOCK_WHITE)
748 #define CAIRO_COLOR_BLACK _cairo_stock_color (CAIRO_STOCK_BLACK)
749 #define CAIRO_COLOR_TRANSPARENT _cairo_stock_color (CAIRO_STOCK_TRANSPARENT)
751 cairo_private uint16_t
752 _cairo_color_double_to_short (double d) cairo_const;
755 _cairo_color_init_rgba (cairo_color_t *color,
756 double red, double green, double blue,
760 _cairo_color_multiply_alpha (cairo_color_t *color,
764 _cairo_color_get_rgba (cairo_color_t *color,
771 _cairo_color_get_rgba_premultiplied (cairo_color_t *color,
777 cairo_private cairo_bool_t
778 _cairo_color_equal (const cairo_color_t *color_a,
779 const cairo_color_t *color_b) cairo_pure;
781 cairo_private cairo_bool_t
782 _cairo_color_stop_equal (const cairo_color_stop_t *color_a,
783 const cairo_color_stop_t *color_b) cairo_pure;
785 cairo_private cairo_content_t
786 _cairo_color_get_content (const cairo_color_t *color) cairo_pure;
788 /* cairo-font-face.c */
790 extern const cairo_private cairo_font_face_t _cairo_font_face_nil;
793 _cairo_font_face_init (cairo_font_face_t *font_face,
794 const cairo_font_face_backend_t *backend);
796 cairo_private cairo_status_t
797 _cairo_font_face_set_error (cairo_font_face_t *font_face,
798 cairo_status_t status);
801 _cairo_unscaled_font_init (cairo_unscaled_font_t *font,
802 const cairo_unscaled_font_backend_t *backend);
804 cairo_private_no_warn cairo_unscaled_font_t *
805 _cairo_unscaled_font_reference (cairo_unscaled_font_t *font);
808 _cairo_unscaled_font_destroy (cairo_unscaled_font_t *font);
810 /* cairo-font-face-twin.c */
812 cairo_private cairo_font_face_t *
813 _cairo_font_face_twin_create_fallback (void);
815 cairo_private cairo_status_t
816 _cairo_font_face_twin_create_for_toy (cairo_toy_font_face_t *toy_face,
817 cairo_font_face_t **font_face);
819 /* cairo-font-face-twin-data.c */
821 extern const cairo_private int8_t _cairo_twin_outlines[];
822 extern const cairo_private uint16_t _cairo_twin_charmap[128];
824 /* cairo-font-options.c */
827 _cairo_font_options_init_default (cairo_font_options_t *options);
830 _cairo_font_options_init_copy (cairo_font_options_t *options,
831 const cairo_font_options_t *other);
834 _cairo_font_options_set_lcd_filter (cairo_font_options_t *options,
835 cairo_lcd_filter_t lcd_filter);
837 cairo_private cairo_lcd_filter_t
838 _cairo_font_options_get_lcd_filter (const cairo_font_options_t *options);
841 _cairo_font_options_set_round_glyph_positions (cairo_font_options_t *options,
842 cairo_round_glyph_positions_t round);
844 cairo_private cairo_round_glyph_positions_t
845 _cairo_font_options_get_round_glyph_positions (const cairo_font_options_t *options);
848 cairo_private cairo_status_t
849 _cairo_hull_compute (cairo_pen_vertex_t *vertices, int *num_vertices);
852 cairo_private unsigned char *
853 _cairo_lzw_compress (unsigned char *data, unsigned long *size_in_out);
856 cairo_private cairo_status_t
857 _cairo_validate_text_clusters (const char *utf8,
859 const cairo_glyph_t *glyphs,
861 const cairo_text_cluster_t *clusters,
863 cairo_text_cluster_flags_t cluster_flags);
865 cairo_private cairo_status_t
866 _cairo_intern_string (const char **str_inout, int len);
869 _cairo_intern_string_reset_static_data (void);
871 /* cairo-path-fixed.c */
872 cairo_private cairo_path_fixed_t *
873 _cairo_path_fixed_create (void);
876 _cairo_path_fixed_init (cairo_path_fixed_t *path);
878 cairo_private cairo_status_t
879 _cairo_path_fixed_init_copy (cairo_path_fixed_t *path,
880 const cairo_path_fixed_t *other);
883 _cairo_path_fixed_fini (cairo_path_fixed_t *path);
886 _cairo_path_fixed_destroy (cairo_path_fixed_t *path);
888 cairo_private cairo_status_t
889 _cairo_path_fixed_move_to (cairo_path_fixed_t *path,
894 _cairo_path_fixed_new_sub_path (cairo_path_fixed_t *path);
896 cairo_private cairo_status_t
897 _cairo_path_fixed_rel_move_to (cairo_path_fixed_t *path,
901 cairo_private cairo_status_t
902 _cairo_path_fixed_line_to (cairo_path_fixed_t *path,
906 cairo_private cairo_status_t
907 _cairo_path_fixed_rel_line_to (cairo_path_fixed_t *path,
911 cairo_private cairo_status_t
912 _cairo_path_fixed_curve_to (cairo_path_fixed_t *path,
913 cairo_fixed_t x0, cairo_fixed_t y0,
914 cairo_fixed_t x1, cairo_fixed_t y1,
915 cairo_fixed_t x2, cairo_fixed_t y2);
917 cairo_private cairo_status_t
918 _cairo_path_fixed_rel_curve_to (cairo_path_fixed_t *path,
919 cairo_fixed_t dx0, cairo_fixed_t dy0,
920 cairo_fixed_t dx1, cairo_fixed_t dy1,
921 cairo_fixed_t dx2, cairo_fixed_t dy2);
923 cairo_private cairo_status_t
924 _cairo_path_fixed_close_path (cairo_path_fixed_t *path);
926 cairo_private cairo_bool_t
927 _cairo_path_fixed_get_current_point (cairo_path_fixed_t *path,
931 typedef cairo_status_t
932 (cairo_path_fixed_move_to_func_t) (void *closure,
933 const cairo_point_t *point);
935 typedef cairo_status_t
936 (cairo_path_fixed_line_to_func_t) (void *closure,
937 const cairo_point_t *point);
939 typedef cairo_status_t
940 (cairo_path_fixed_curve_to_func_t) (void *closure,
941 const cairo_point_t *p0,
942 const cairo_point_t *p1,
943 const cairo_point_t *p2);
945 typedef cairo_status_t
946 (cairo_path_fixed_close_path_func_t) (void *closure);
948 cairo_private cairo_status_t
949 _cairo_path_fixed_interpret (const cairo_path_fixed_t *path,
950 cairo_path_fixed_move_to_func_t *move_to,
951 cairo_path_fixed_line_to_func_t *line_to,
952 cairo_path_fixed_curve_to_func_t *curve_to,
953 cairo_path_fixed_close_path_func_t *close_path,
956 cairo_private cairo_status_t
957 _cairo_path_fixed_interpret_flat (const cairo_path_fixed_t *path,
958 cairo_path_fixed_move_to_func_t *move_to,
959 cairo_path_fixed_line_to_func_t *line_to,
960 cairo_path_fixed_close_path_func_t *close_path,
965 cairo_private cairo_bool_t
966 _cairo_path_bounder_extents (const cairo_path_fixed_t *path,
969 cairo_private cairo_bool_t
970 _cairo_path_fixed_extents (const cairo_path_fixed_t *path,
974 _cairo_path_fixed_approximate_clip_extents (const cairo_path_fixed_t *path,
975 cairo_rectangle_int_t *extents);
978 _cairo_path_fixed_approximate_fill_extents (const cairo_path_fixed_t *path,
979 cairo_rectangle_int_t *extents);
982 _cairo_path_fixed_fill_extents (const cairo_path_fixed_t *path,
983 cairo_fill_rule_t fill_rule,
985 cairo_rectangle_int_t *extents);
988 _cairo_path_fixed_approximate_stroke_extents (const cairo_path_fixed_t *path,
989 const cairo_stroke_style_t *style,
990 const cairo_matrix_t *ctm,
991 cairo_rectangle_int_t *extents);
993 cairo_private cairo_status_t
994 _cairo_path_fixed_stroke_extents (const cairo_path_fixed_t *path,
995 const cairo_stroke_style_t *style,
996 const cairo_matrix_t *ctm,
997 const cairo_matrix_t *ctm_inverse,
999 cairo_rectangle_int_t *extents);
1002 _cairo_path_fixed_transform (cairo_path_fixed_t *path,
1003 const cairo_matrix_t *matrix);
1005 cairo_private cairo_bool_t
1006 _cairo_path_fixed_is_single_arc (const cairo_path_fixed_t *path);
1008 cairo_private cairo_bool_t
1009 _cairo_path_fixed_is_single_line (const cairo_path_fixed_t *path);
1011 cairo_private cairo_bool_t
1012 _cairo_path_fixed_is_box (const cairo_path_fixed_t *path,
1015 cairo_private cairo_bool_t
1016 _cairo_path_fixed_is_rectangle (const cairo_path_fixed_t *path,
1019 /* cairo-path-in-fill.c */
1020 cairo_private cairo_bool_t
1021 _cairo_path_fixed_in_fill (const cairo_path_fixed_t *path,
1022 cairo_fill_rule_t fill_rule,
1027 /* cairo-path-fill.c */
1028 cairo_private cairo_status_t
1029 _cairo_path_fixed_fill_to_polygon (const cairo_path_fixed_t *path,
1031 cairo_polygon_t *polygon);
1033 cairo_private cairo_status_t
1034 _cairo_path_fixed_fill_rectilinear_to_polygon (const cairo_path_fixed_t *path,
1035 cairo_antialias_t antialias,
1036 cairo_polygon_t *polygon);
1038 cairo_private cairo_status_t
1039 _cairo_path_fixed_fill_rectilinear_to_boxes (const cairo_path_fixed_t *path,
1040 cairo_fill_rule_t fill_rule,
1041 cairo_antialias_t antialias,
1042 cairo_boxes_t *boxes);
1044 cairo_private cairo_region_t *
1045 _cairo_path_fixed_fill_rectilinear_to_region (const cairo_path_fixed_t *path,
1046 cairo_fill_rule_t fill_rule,
1047 const cairo_rectangle_int_t *extents);
1049 cairo_private cairo_status_t
1050 _cairo_path_fixed_fill_to_traps (const cairo_path_fixed_t *path,
1051 cairo_fill_rule_t fill_rule,
1053 cairo_traps_t *traps);
1055 cairo_private cairo_status_t
1056 _cairo_path_fixed_fill_rectilinear_to_traps (const cairo_path_fixed_t *path,
1057 cairo_fill_rule_t fill_rule,
1058 cairo_antialias_t antialias,
1059 cairo_traps_t *traps);
1061 /* cairo-path-stroke.c */
1062 cairo_private cairo_status_t
1063 _cairo_path_fixed_stroke_to_polygon (const cairo_path_fixed_t *path,
1064 const cairo_stroke_style_t *stroke_style,
1065 const cairo_matrix_t *ctm,
1066 const cairo_matrix_t *ctm_inverse,
1068 cairo_polygon_t *polygon);
1070 cairo_private cairo_int_status_t
1071 _cairo_path_fixed_stroke_to_tristrip (const cairo_path_fixed_t *path,
1072 const cairo_stroke_style_t*style,
1073 const cairo_matrix_t *ctm,
1074 const cairo_matrix_t *ctm_inverse,
1076 cairo_tristrip_t *strip);
1078 cairo_private cairo_status_t
1079 _cairo_path_fixed_stroke_dashed_to_polygon (const cairo_path_fixed_t *path,
1080 const cairo_stroke_style_t *stroke_style,
1081 const cairo_matrix_t *ctm,
1082 const cairo_matrix_t *ctm_inverse,
1084 cairo_polygon_t *polygon);
1086 cairo_private cairo_int_status_t
1087 _cairo_path_fixed_stroke_rectilinear_to_boxes (const cairo_path_fixed_t *path,
1088 const cairo_stroke_style_t *stroke_style,
1089 const cairo_matrix_t *ctm,
1090 cairo_antialias_t antialias,
1091 cairo_boxes_t *boxes);
1093 cairo_private cairo_int_status_t
1094 _cairo_path_fixed_stroke_to_traps (const cairo_path_fixed_t *path,
1095 const cairo_stroke_style_t *stroke_style,
1096 const cairo_matrix_t *ctm,
1097 const cairo_matrix_t *ctm_inverse,
1099 cairo_traps_t *traps);
1101 cairo_private cairo_status_t
1102 _cairo_path_fixed_stroke_to_shaper (cairo_path_fixed_t *path,
1103 const cairo_stroke_style_t *stroke_style,
1104 const cairo_matrix_t *ctm,
1105 const cairo_matrix_t *ctm_inverse,
1107 cairo_status_t (*add_triangle) (void *closure,
1108 const cairo_point_t triangle[3]),
1109 cairo_status_t (*add_triangle_fan) (void *closure,
1110 const cairo_point_t *midpt,
1111 const cairo_point_t *points,
1113 cairo_status_t (*add_quad) (void *closure,
1114 const cairo_point_t quad[4]),
1117 /* cairo-scaled-font.c */
1120 _cairo_scaled_font_freeze_cache (cairo_scaled_font_t *scaled_font);
1123 _cairo_scaled_font_thaw_cache (cairo_scaled_font_t *scaled_font);
1126 _cairo_scaled_font_reset_cache (cairo_scaled_font_t *scaled_font);
1128 cairo_private cairo_status_t
1129 _cairo_scaled_font_set_error (cairo_scaled_font_t *scaled_font,
1130 cairo_status_t status);
1132 cairo_private cairo_scaled_font_t *
1133 _cairo_scaled_font_create_in_error (cairo_status_t status);
1136 _cairo_scaled_font_reset_static_data (void);
1138 cairo_private cairo_status_t
1139 _cairo_scaled_font_register_placeholder_and_unlock_font_map (cairo_scaled_font_t *scaled_font);
1142 _cairo_scaled_font_unregister_placeholder_and_lock_font_map (cairo_scaled_font_t *scaled_font);
1144 cairo_private cairo_status_t
1145 _cairo_scaled_font_init (cairo_scaled_font_t *scaled_font,
1146 cairo_font_face_t *font_face,
1147 const cairo_matrix_t *font_matrix,
1148 const cairo_matrix_t *ctm,
1149 const cairo_font_options_t *options,
1150 const cairo_scaled_font_backend_t *backend);
1152 cairo_private cairo_status_t
1153 _cairo_scaled_font_set_metrics (cairo_scaled_font_t *scaled_font,
1154 cairo_font_extents_t *fs_metrics);
1156 /* This should only be called on an error path by a scaled_font constructor */
1158 _cairo_scaled_font_fini (cairo_scaled_font_t *scaled_font);
1160 cairo_private cairo_status_t
1161 _cairo_scaled_font_font_extents (cairo_scaled_font_t *scaled_font,
1162 cairo_font_extents_t *extents);
1164 cairo_private cairo_status_t
1165 _cairo_scaled_font_glyph_device_extents (cairo_scaled_font_t *scaled_font,
1166 const cairo_glyph_t *glyphs,
1168 cairo_rectangle_int_t *extents,
1169 cairo_bool_t *overlap);
1171 cairo_private cairo_bool_t
1172 _cairo_scaled_font_glyph_approximate_extents (cairo_scaled_font_t *scaled_font,
1173 const cairo_glyph_t *glyphs,
1175 cairo_rectangle_int_t *extents);
1177 cairo_private cairo_status_t
1178 _cairo_scaled_font_show_glyphs (cairo_scaled_font_t *scaled_font,
1179 cairo_operator_t op,
1180 const cairo_pattern_t *source,
1181 cairo_surface_t *surface,
1187 unsigned int height,
1188 cairo_glyph_t *glyphs,
1190 cairo_region_t *clip_region);
1192 cairo_private cairo_status_t
1193 _cairo_scaled_font_glyph_path (cairo_scaled_font_t *scaled_font,
1194 const cairo_glyph_t *glyphs,
1196 cairo_path_fixed_t *path);
1199 _cairo_scaled_glyph_set_metrics (cairo_scaled_glyph_t *scaled_glyph,
1200 cairo_scaled_font_t *scaled_font,
1201 cairo_text_extents_t *fs_metrics);
1204 _cairo_scaled_glyph_set_surface (cairo_scaled_glyph_t *scaled_glyph,
1205 cairo_scaled_font_t *scaled_font,
1206 cairo_image_surface_t *surface);
1209 _cairo_scaled_glyph_set_path (cairo_scaled_glyph_t *scaled_glyph,
1210 cairo_scaled_font_t *scaled_font,
1211 cairo_path_fixed_t *path);
1214 _cairo_scaled_glyph_set_recording_surface (cairo_scaled_glyph_t *scaled_glyph,
1215 cairo_scaled_font_t *scaled_font,
1216 cairo_surface_t *recording_surface);
1218 cairo_private cairo_int_status_t
1219 _cairo_scaled_glyph_lookup (cairo_scaled_font_t *scaled_font,
1220 unsigned long index,
1221 cairo_scaled_glyph_info_t info,
1222 cairo_scaled_glyph_t **scaled_glyph_ret);
1224 cairo_private double
1225 _cairo_scaled_font_get_max_scale (cairo_scaled_font_t *scaled_font);
1228 _cairo_scaled_font_map_destroy (void);
1230 /* cairo-stroke-style.c */
1233 _cairo_stroke_style_init (cairo_stroke_style_t *style);
1235 cairo_private cairo_status_t
1236 _cairo_stroke_style_init_copy (cairo_stroke_style_t *style,
1237 const cairo_stroke_style_t *other);
1240 _cairo_stroke_style_fini (cairo_stroke_style_t *style);
1243 _cairo_stroke_style_max_distance_from_path (const cairo_stroke_style_t *style,
1244 const cairo_path_fixed_t *path,
1245 const cairo_matrix_t *ctm,
1246 double *dx, double *dy);
1248 cairo_private double
1249 _cairo_stroke_style_dash_period (const cairo_stroke_style_t *style);
1251 cairo_private double
1252 _cairo_stroke_style_dash_stroked (const cairo_stroke_style_t *style);
1254 cairo_private cairo_bool_t
1255 _cairo_stroke_style_dash_can_approximate (const cairo_stroke_style_t *style,
1256 const cairo_matrix_t *ctm,
1260 _cairo_stroke_style_dash_approximate (const cairo_stroke_style_t *style,
1261 const cairo_matrix_t *ctm,
1263 double *dash_offset,
1265 unsigned int *num_dashes);
1268 /* cairo-surface.c */
1270 cairo_private cairo_status_t
1271 _cairo_surface_copy_mime_data (cairo_surface_t *dst,
1272 cairo_surface_t *src);
1274 cairo_private_no_warn cairo_int_status_t
1275 _cairo_surface_set_error (cairo_surface_t *surface,
1276 cairo_int_status_t status);
1279 _cairo_surface_set_resolution (cairo_surface_t *surface,
1283 cairo_private cairo_surface_t *
1284 _cairo_surface_create_similar_scratch (cairo_surface_t *other,
1285 cairo_content_t content,
1289 cairo_private cairo_surface_t *
1290 _cairo_surface_create_for_rectangle_int (cairo_surface_t *target,
1291 const cairo_rectangle_int_t *extents);
1293 cairo_private cairo_surface_t *
1294 _cairo_surface_create_similar_solid (cairo_surface_t *other,
1295 cairo_content_t content,
1298 const cairo_color_t *color);
1301 _cairo_surface_init (cairo_surface_t *surface,
1302 const cairo_surface_backend_t *backend,
1303 cairo_device_t *device,
1304 cairo_content_t content);
1307 _cairo_surface_set_font_options (cairo_surface_t *surface,
1308 cairo_font_options_t *options);
1310 cairo_private cairo_status_t
1311 _cairo_surface_paint (cairo_surface_t *surface,
1312 cairo_operator_t op,
1313 const cairo_pattern_t *source,
1314 const cairo_clip_t *clip);
1316 cairo_private cairo_image_surface_t *
1317 _cairo_surface_map_to_image (cairo_surface_t *surface,
1318 const cairo_rectangle_int_t *extents);
1320 cairo_private cairo_int_status_t
1321 _cairo_surface_unmap_image (cairo_surface_t *surface,
1322 cairo_image_surface_t *image);
1324 cairo_private cairo_status_t
1325 _cairo_surface_mask (cairo_surface_t *surface,
1326 cairo_operator_t op,
1327 const cairo_pattern_t *source,
1328 const cairo_pattern_t *mask,
1329 const cairo_clip_t *clip);
1331 cairo_private cairo_status_t
1332 _cairo_surface_fill_stroke (cairo_surface_t *surface,
1333 cairo_operator_t fill_op,
1334 const cairo_pattern_t *fill_source,
1335 cairo_fill_rule_t fill_rule,
1336 double fill_tolerance,
1337 cairo_antialias_t fill_antialias,
1338 cairo_path_fixed_t *path,
1339 cairo_operator_t stroke_op,
1340 const cairo_pattern_t *stroke_source,
1341 const cairo_stroke_style_t *stroke_style,
1342 const cairo_matrix_t *stroke_ctm,
1343 const cairo_matrix_t *stroke_ctm_inverse,
1344 double stroke_tolerance,
1345 cairo_antialias_t stroke_antialias,
1346 const cairo_clip_t *clip);
1348 cairo_private cairo_status_t
1349 _cairo_surface_stroke (cairo_surface_t *surface,
1350 cairo_operator_t op,
1351 const cairo_pattern_t *source,
1352 const cairo_path_fixed_t *path,
1353 const cairo_stroke_style_t *style,
1354 const cairo_matrix_t *ctm,
1355 const cairo_matrix_t *ctm_inverse,
1357 cairo_antialias_t antialias,
1358 const cairo_clip_t *clip);
1360 cairo_private cairo_status_t
1361 _cairo_surface_fill (cairo_surface_t *surface,
1362 cairo_operator_t op,
1363 const cairo_pattern_t *source,
1364 const cairo_path_fixed_t *path,
1365 cairo_fill_rule_t fill_rule,
1367 cairo_antialias_t antialias,
1368 const cairo_clip_t *clip);
1370 cairo_private cairo_status_t
1371 _cairo_surface_show_text_glyphs (cairo_surface_t *surface,
1372 cairo_operator_t op,
1373 const cairo_pattern_t *source,
1376 cairo_glyph_t *glyphs,
1378 const cairo_text_cluster_t *clusters,
1380 cairo_text_cluster_flags_t cluster_flags,
1381 cairo_scaled_font_t *scaled_font,
1382 const cairo_clip_t *clip);
1384 cairo_private cairo_status_t
1385 _cairo_surface_acquire_source_image (cairo_surface_t *surface,
1386 cairo_image_surface_t **image_out,
1387 void **image_extra);
1390 _cairo_surface_release_source_image (cairo_surface_t *surface,
1391 cairo_image_surface_t *image,
1394 cairo_private cairo_surface_t *
1395 _cairo_surface_snapshot (cairo_surface_t *surface);
1398 _cairo_surface_attach_snapshot (cairo_surface_t *surface,
1399 cairo_surface_t *snapshot,
1400 cairo_surface_func_t detach_func);
1403 _cairo_surface_attach_subsurface_snapshot (cairo_surface_t *surface,
1404 cairo_surface_subsurface_t *subsurface,
1405 cairo_surface_t *snapshot,
1406 cairo_surface_func_t detach_func);
1408 cairo_private cairo_surface_t *
1409 _cairo_surface_has_snapshot (cairo_surface_t *surface,
1410 const cairo_surface_backend_t *backend);
1413 _cairo_surface_detach_snapshot (cairo_surface_t *snapshot);
1415 cairo_private cairo_status_t
1416 _cairo_surface_begin_modification (cairo_surface_t *surface);
1418 cairo_private_no_warn cairo_bool_t
1419 _cairo_surface_get_extents (cairo_surface_t *surface,
1420 cairo_rectangle_int_t *extents);
1423 _cairo_surface_set_device_scale (cairo_surface_t *surface,
1427 cairo_private cairo_bool_t
1428 _cairo_surface_has_device_transform (cairo_surface_t *surface) cairo_pure;
1431 _cairo_surface_release_device_reference (cairo_surface_t *surface);
1433 /* cairo-image-surface.c */
1435 /* XXX: In cairo 1.2.0 we added a new %CAIRO_FORMAT_RGB16_565 but
1436 * neglected to adjust this macro. The net effect is that it's
1437 * impossible to externally create an image surface with this
1438 * format. This is perhaps a good thing since we also neglected to fix
1439 * up things like cairo_surface_write_to_png() for the new format
1440 * (-Wswitch-enum will tell you where). Is it obvious that format was
1443 * The reason for the new format was to allow the xlib backend to be
1444 * used on X servers with a 565 visual. So the new format did its job
1445 * for that, even without being considered "valid" for the sake of
1446 * things like cairo_image_surface_create().
1448 * Since 1.2.0 we ran into the same situtation with X servers with BGR
1449 * visuals. This time we invented #cairo_internal_format_t instead,
1450 * (see it for more discussion).
1452 * The punchline is that %CAIRO_FORMAT_VALID must not conside any
1453 * internal format to be valid. Also we need to decide if the
1454 * RGB16_565 should be moved to instead be an internal format. If so,
1455 * this macro need not change for it. (We probably will need to leave
1456 * an RGB16_565 value in the header files for the sake of code that
1457 * might have that value in it.)
1459 * If we do decide to start fully supporting RGB16_565 as an external
1460 * format, then %CAIRO_FORMAT_VALID needs to be adjusted to include
1461 * it. But that should not happen before all necessary code is fixed
1462 * to support it (at least cairo_surface_write_to_png() and a few spots
1463 * in cairo-xlib-surface.c--again see -Wswitch-enum).
1465 #define CAIRO_FORMAT_VALID(format) ((format) >= CAIRO_FORMAT_ARGB32 && \
1466 (format) <= CAIRO_FORMAT_RGB30)
1468 /* pixman-required stride alignment in bytes. */
1469 #define CAIRO_STRIDE_ALIGNMENT (sizeof (uint32_t))
1470 #define CAIRO_STRIDE_FOR_WIDTH_BPP(w,bpp) \
1471 ((((bpp)*(w)+7)/8 + CAIRO_STRIDE_ALIGNMENT-1) & -CAIRO_STRIDE_ALIGNMENT)
1473 #define CAIRO_CONTENT_VALID(content) ((content) && \
1474 (((content) & ~(CAIRO_CONTENT_COLOR | \
1475 CAIRO_CONTENT_ALPHA | \
1476 CAIRO_CONTENT_COLOR_ALPHA))\
1480 _cairo_format_bits_per_pixel (cairo_format_t format) cairo_const;
1482 cairo_private cairo_format_t
1483 _cairo_format_from_content (cairo_content_t content) cairo_const;
1485 cairo_private cairo_format_t
1486 _cairo_format_from_pixman_format (pixman_format_code_t pixman_format);
1488 cairo_private cairo_content_t
1489 _cairo_content_from_format (cairo_format_t format) cairo_const;
1491 cairo_private cairo_content_t
1492 _cairo_content_from_pixman_format (pixman_format_code_t pixman_format);
1494 cairo_private cairo_surface_t *
1495 _cairo_image_surface_create_for_pixman_image (pixman_image_t *pixman_image,
1496 pixman_format_code_t pixman_format);
1498 cairo_private pixman_format_code_t
1499 _cairo_format_to_pixman_format_code (cairo_format_t format);
1501 cairo_private cairo_bool_t
1502 _pixman_format_from_masks (cairo_format_masks_t *masks,
1503 pixman_format_code_t *format_ret);
1505 cairo_private cairo_bool_t
1506 _pixman_format_to_masks (pixman_format_code_t pixman_format,
1507 cairo_format_masks_t *masks);
1510 _cairo_image_scaled_glyph_fini (cairo_scaled_font_t *scaled_font,
1511 cairo_scaled_glyph_t *scaled_glyph);
1514 _cairo_image_reset_static_data (void);
1516 cairo_private cairo_surface_t *
1517 _cairo_image_surface_create_with_pixman_format (unsigned char *data,
1518 pixman_format_code_t pixman_format,
1523 cairo_private cairo_surface_t *
1524 _cairo_image_surface_create_with_content (cairo_content_t content,
1529 _cairo_image_surface_assume_ownership_of_data (cairo_image_surface_t *surface);
1531 cairo_private cairo_image_surface_t *
1532 _cairo_image_surface_coerce (cairo_image_surface_t *surface);
1534 cairo_private cairo_image_surface_t *
1535 _cairo_image_surface_coerce_to_format (cairo_image_surface_t *surface,
1536 cairo_format_t format);
1538 cairo_private cairo_image_transparency_t
1539 _cairo_image_analyze_transparency (cairo_image_surface_t *image);
1541 cairo_private cairo_image_color_t
1542 _cairo_image_analyze_color (cairo_image_surface_t *image);
1546 _cairo_pen_vertices_needed (double tolerance,
1548 const cairo_matrix_t *matrix);
1550 cairo_private cairo_status_t
1551 _cairo_pen_init (cairo_pen_t *pen,
1554 const cairo_matrix_t *ctm);
1557 _cairo_pen_init_empty (cairo_pen_t *pen);
1559 cairo_private cairo_status_t
1560 _cairo_pen_init_copy (cairo_pen_t *pen, const cairo_pen_t *other);
1563 _cairo_pen_fini (cairo_pen_t *pen);
1565 cairo_private cairo_status_t
1566 _cairo_pen_add_points (cairo_pen_t *pen, cairo_point_t *point, int num_points);
1569 _cairo_pen_find_active_cw_vertex_index (const cairo_pen_t *pen,
1570 const cairo_slope_t *slope);
1573 _cairo_pen_find_active_ccw_vertex_index (const cairo_pen_t *pen,
1574 const cairo_slope_t *slope);
1577 _cairo_pen_find_active_cw_vertices (const cairo_pen_t *pen,
1578 const cairo_slope_t *in,
1579 const cairo_slope_t *out,
1580 int *start, int *stop);
1583 _cairo_pen_find_active_ccw_vertices (const cairo_pen_t *pen,
1584 const cairo_slope_t *in,
1585 const cairo_slope_t *out,
1586 int *start, int *stop);
1588 /* cairo-polygon.c */
1590 _cairo_polygon_init (cairo_polygon_t *polygon,
1591 const cairo_box_t *boxes,
1595 _cairo_polygon_init_with_clip (cairo_polygon_t *polygon,
1596 const cairo_clip_t *clip);
1598 cairo_private cairo_status_t
1599 _cairo_polygon_init_boxes (cairo_polygon_t *polygon,
1600 const cairo_boxes_t *boxes);
1602 cairo_private cairo_status_t
1603 _cairo_polygon_init_box_array (cairo_polygon_t *polygon,
1608 _cairo_polygon_limit (cairo_polygon_t *polygon,
1609 const cairo_box_t *limits,
1613 _cairo_polygon_limit_to_clip (cairo_polygon_t *polygon,
1614 const cairo_clip_t *clip);
1617 _cairo_polygon_fini (cairo_polygon_t *polygon);
1619 cairo_private cairo_status_t
1620 _cairo_polygon_add_line (cairo_polygon_t *polygon,
1621 const cairo_line_t *line,
1622 int top, int bottom,
1625 cairo_private cairo_status_t
1626 _cairo_polygon_add_external_edge (void *polygon,
1627 const cairo_point_t *p1,
1628 const cairo_point_t *p2);
1630 cairo_private cairo_status_t
1631 _cairo_polygon_add_contour (cairo_polygon_t *polygon,
1632 const cairo_contour_t *contour);
1635 _cairo_polygon_translate (cairo_polygon_t *polygon, int dx, int dy);
1637 cairo_private cairo_status_t
1638 _cairo_polygon_reduce (cairo_polygon_t *polygon,
1639 cairo_fill_rule_t fill_rule);
1641 cairo_private cairo_status_t
1642 _cairo_polygon_intersect (cairo_polygon_t *a, int winding_a,
1643 cairo_polygon_t *b, int winding_b);
1645 cairo_private cairo_status_t
1646 _cairo_polygon_intersect_with_boxes (cairo_polygon_t *polygon,
1647 cairo_fill_rule_t *winding,
1651 static inline cairo_bool_t
1652 _cairo_polygon_is_empty (const cairo_polygon_t *polygon)
1655 polygon->num_edges == 0 ||
1656 polygon->extents.p2.x <= polygon->extents.p1.x;
1659 #define _cairo_polygon_status(P) ((cairo_polygon_t *) (P))->status
1661 /* cairo-spline.c */
1662 cairo_private cairo_bool_t
1663 _cairo_spline_init (cairo_spline_t *spline,
1664 cairo_spline_add_point_func_t add_point_func,
1666 const cairo_point_t *a, const cairo_point_t *b,
1667 const cairo_point_t *c, const cairo_point_t *d);
1669 cairo_private cairo_status_t
1670 _cairo_spline_decompose (cairo_spline_t *spline, double tolerance);
1672 cairo_private cairo_status_t
1673 _cairo_spline_bound (cairo_spline_add_point_func_t add_point_func,
1675 const cairo_point_t *p0, const cairo_point_t *p1,
1676 const cairo_point_t *p2, const cairo_point_t *p3);
1678 /* cairo-matrix.c */
1680 _cairo_matrix_get_affine (const cairo_matrix_t *matrix,
1681 double *xx, double *yx,
1682 double *xy, double *yy,
1683 double *x0, double *y0);
1686 _cairo_matrix_transform_bounding_box (const cairo_matrix_t *matrix,
1687 double *x1, double *y1,
1688 double *x2, double *y2,
1689 cairo_bool_t *is_tight);
1692 _cairo_matrix_transform_bounding_box_fixed (const cairo_matrix_t *matrix,
1694 cairo_bool_t *is_tight);
1696 cairo_private cairo_bool_t
1697 _cairo_matrix_is_invertible (const cairo_matrix_t *matrix) cairo_pure;
1699 cairo_private cairo_bool_t
1700 _cairo_matrix_is_scale_0 (const cairo_matrix_t *matrix) cairo_pure;
1702 cairo_private double
1703 _cairo_matrix_compute_determinant (const cairo_matrix_t *matrix) cairo_pure;
1705 cairo_private cairo_status_t
1706 _cairo_matrix_compute_basis_scale_factors (const cairo_matrix_t *matrix,
1707 double *sx, double *sy, int x_major);
1709 static inline cairo_bool_t
1710 _cairo_matrix_is_identity (const cairo_matrix_t *matrix)
1712 return (matrix->xx == 1.0 && matrix->yx == 0.0 &&
1713 matrix->xy == 0.0 && matrix->yy == 1.0 &&
1714 matrix->x0 == 0.0 && matrix->y0 == 0.0);
1717 static inline cairo_bool_t
1718 _cairo_matrix_is_translation (const cairo_matrix_t *matrix)
1720 return (matrix->xx == 1.0 && matrix->yx == 0.0 &&
1721 matrix->xy == 0.0 && matrix->yy == 1.0);
1724 static inline cairo_bool_t
1725 _cairo_matrix_is_scale (const cairo_matrix_t *matrix)
1727 return matrix->yx == 0.0 && matrix->xy == 0.0;
1730 cairo_private cairo_bool_t
1731 _cairo_matrix_is_integer_translation(const cairo_matrix_t *matrix,
1732 int *itx, int *ity);
1734 cairo_private cairo_bool_t
1735 _cairo_matrix_has_unity_scale (const cairo_matrix_t *matrix);
1737 cairo_private cairo_bool_t
1738 _cairo_matrix_is_pixel_exact (const cairo_matrix_t *matrix) cairo_pure;
1740 cairo_private double
1741 _cairo_matrix_transformed_circle_major_axis (const cairo_matrix_t *matrix,
1742 double radius) cairo_pure;
1744 cairo_private cairo_bool_t
1745 _cairo_matrix_is_pixman_translation (const cairo_matrix_t *matrix,
1746 cairo_filter_t filter,
1750 cairo_private cairo_status_t
1751 _cairo_matrix_to_pixman_matrix_offset (const cairo_matrix_t *matrix,
1752 cairo_filter_t filter,
1755 pixman_transform_t *out_transform,
1759 cairo_private cairo_status_t
1760 _cairo_bentley_ottmann_tessellate_rectilinear_polygon (cairo_traps_t *traps,
1761 const cairo_polygon_t *polygon,
1762 cairo_fill_rule_t fill_rule);
1764 cairo_private cairo_status_t
1765 _cairo_bentley_ottmann_tessellate_polygon (cairo_traps_t *traps,
1766 const cairo_polygon_t *polygon,
1767 cairo_fill_rule_t fill_rule);
1769 cairo_private cairo_status_t
1770 _cairo_bentley_ottmann_tessellate_traps (cairo_traps_t *traps,
1771 cairo_fill_rule_t fill_rule);
1773 cairo_private cairo_status_t
1774 _cairo_bentley_ottmann_tessellate_rectangular_traps (cairo_traps_t *traps,
1775 cairo_fill_rule_t fill_rule);
1777 cairo_private cairo_status_t
1778 _cairo_bentley_ottmann_tessellate_boxes (const cairo_boxes_t *in,
1779 cairo_fill_rule_t fill_rule,
1780 cairo_boxes_t *out);
1782 cairo_private cairo_status_t
1783 _cairo_bentley_ottmann_tessellate_rectilinear_traps (cairo_traps_t *traps,
1784 cairo_fill_rule_t fill_rule);
1786 cairo_private cairo_status_t
1787 _cairo_bentley_ottmann_tessellate_rectilinear_polygon_to_boxes (const cairo_polygon_t *polygon,
1788 cairo_fill_rule_t fill_rule,
1789 cairo_boxes_t *boxes);
1792 _cairo_trapezoid_array_translate_and_scale (cairo_trapezoid_t *offset_traps,
1793 cairo_trapezoid_t *src_traps,
1795 double tx, double ty,
1796 double sx, double sy);
1798 #if CAIRO_HAS_DRM_SURFACE
1801 _cairo_drm_device_reset_static_data (void);
1806 _cairo_clip_reset_static_data (void);
1809 _cairo_pattern_reset_static_data (void);
1811 /* cairo-unicode.c */
1814 _cairo_utf8_get_char_validated (const char *p,
1817 cairo_private cairo_status_t
1818 _cairo_utf8_to_ucs4 (const char *str,
1821 int *items_written);
1824 _cairo_ucs4_to_utf8 (uint32_t unicode,
1827 #if CAIRO_HAS_WIN32_FONT || CAIRO_HAS_QUARTZ_FONT || CAIRO_HAS_PDF_OPERATORS
1828 # define CAIRO_HAS_UTF8_TO_UTF16 1
1830 #if CAIRO_HAS_UTF8_TO_UTF16
1831 cairo_private cairo_status_t
1832 _cairo_utf8_to_utf16 (const char *str,
1835 int *items_written);
1839 _cairo_matrix_multiply (cairo_matrix_t *r,
1840 const cairo_matrix_t *a,
1841 const cairo_matrix_t *b);
1843 /* cairo-observer.c */
1846 _cairo_observers_notify (cairo_list_t *observers, void *arg);
1848 /* Avoid unnecessary PLT entries. */
1849 slim_hidden_proto (cairo_clip_preserve);
1850 slim_hidden_proto (cairo_close_path);
1851 slim_hidden_proto (cairo_create);
1852 slim_hidden_proto (cairo_curve_to);
1853 slim_hidden_proto (cairo_destroy);
1854 slim_hidden_proto (cairo_fill_preserve);
1855 slim_hidden_proto (cairo_font_face_destroy);
1856 slim_hidden_proto (cairo_font_face_get_user_data);
1857 slim_hidden_proto_no_warn (cairo_font_face_reference);
1858 slim_hidden_proto (cairo_font_face_set_user_data);
1859 slim_hidden_proto (cairo_font_options_equal);
1860 slim_hidden_proto (cairo_font_options_hash);
1861 slim_hidden_proto (cairo_font_options_merge);
1862 slim_hidden_proto (cairo_font_options_set_antialias);
1863 slim_hidden_proto (cairo_font_options_set_hint_metrics);
1864 slim_hidden_proto (cairo_font_options_set_hint_style);
1865 slim_hidden_proto (cairo_font_options_set_subpixel_order);
1866 slim_hidden_proto (cairo_font_options_status);
1867 slim_hidden_proto (cairo_format_stride_for_width);
1868 slim_hidden_proto (cairo_get_current_point);
1869 slim_hidden_proto (cairo_get_line_width);
1870 slim_hidden_proto (cairo_get_matrix);
1871 slim_hidden_proto (cairo_get_scaled_font);
1872 slim_hidden_proto (cairo_get_target);
1873 slim_hidden_proto (cairo_get_tolerance);
1874 slim_hidden_proto (cairo_glyph_allocate);
1875 slim_hidden_proto (cairo_glyph_free);
1876 slim_hidden_proto (cairo_image_surface_create);
1877 slim_hidden_proto (cairo_image_surface_create_for_data);
1878 slim_hidden_proto (cairo_image_surface_get_data);
1879 slim_hidden_proto (cairo_image_surface_get_format);
1880 slim_hidden_proto (cairo_image_surface_get_height);
1881 slim_hidden_proto (cairo_image_surface_get_stride);
1882 slim_hidden_proto (cairo_image_surface_get_width);
1883 slim_hidden_proto (cairo_line_to);
1884 slim_hidden_proto (cairo_mask);
1885 slim_hidden_proto (cairo_matrix_init);
1886 slim_hidden_proto (cairo_matrix_init_identity);
1887 slim_hidden_proto (cairo_matrix_init_rotate);
1888 slim_hidden_proto (cairo_matrix_init_scale);
1889 slim_hidden_proto (cairo_matrix_init_translate);
1890 slim_hidden_proto (cairo_matrix_invert);
1891 slim_hidden_proto (cairo_matrix_multiply);
1892 slim_hidden_proto (cairo_matrix_scale);
1893 slim_hidden_proto (cairo_matrix_transform_distance);
1894 slim_hidden_proto (cairo_matrix_transform_point);
1895 slim_hidden_proto (cairo_matrix_translate);
1896 slim_hidden_proto (cairo_move_to);
1897 slim_hidden_proto (cairo_new_path);
1898 slim_hidden_proto (cairo_paint);
1899 slim_hidden_proto (cairo_pattern_add_color_stop_rgba);
1900 slim_hidden_proto (cairo_pattern_create_for_surface);
1901 slim_hidden_proto (cairo_pattern_create_rgb);
1902 slim_hidden_proto (cairo_pattern_create_rgba);
1903 slim_hidden_proto (cairo_pattern_destroy);
1904 slim_hidden_proto (cairo_pattern_get_extend);
1905 slim_hidden_proto (cairo_mesh_pattern_curve_to);
1906 slim_hidden_proto (cairo_mesh_pattern_get_control_point);
1907 slim_hidden_proto (cairo_mesh_pattern_get_corner_color_rgba);
1908 slim_hidden_proto (cairo_mesh_pattern_get_patch_count);
1909 slim_hidden_proto (cairo_mesh_pattern_get_path);
1910 slim_hidden_proto (cairo_mesh_pattern_line_to);
1911 slim_hidden_proto (cairo_mesh_pattern_move_to);
1912 slim_hidden_proto (cairo_mesh_pattern_set_corner_color_rgba);
1913 slim_hidden_proto_no_warn (cairo_pattern_reference);
1914 slim_hidden_proto (cairo_pattern_set_matrix);
1915 slim_hidden_proto (cairo_pop_group);
1916 slim_hidden_proto (cairo_push_group_with_content);
1917 slim_hidden_proto_no_warn (cairo_path_destroy);
1918 slim_hidden_proto (cairo_rel_line_to);
1919 slim_hidden_proto (cairo_restore);
1920 slim_hidden_proto (cairo_save);
1921 slim_hidden_proto (cairo_scale);
1922 slim_hidden_proto (cairo_scaled_font_create);
1923 slim_hidden_proto (cairo_scaled_font_destroy);
1924 slim_hidden_proto (cairo_scaled_font_extents);
1925 slim_hidden_proto (cairo_scaled_font_get_ctm);
1926 slim_hidden_proto (cairo_scaled_font_get_font_face);
1927 slim_hidden_proto (cairo_scaled_font_get_font_matrix);
1928 slim_hidden_proto (cairo_scaled_font_get_font_options);
1929 slim_hidden_proto (cairo_scaled_font_glyph_extents);
1930 slim_hidden_proto_no_warn (cairo_scaled_font_reference);
1931 slim_hidden_proto (cairo_scaled_font_status);
1932 slim_hidden_proto (cairo_scaled_font_get_user_data);
1933 slim_hidden_proto (cairo_scaled_font_set_user_data);
1934 slim_hidden_proto (cairo_scaled_font_text_to_glyphs);
1935 slim_hidden_proto (cairo_set_font_matrix);
1936 slim_hidden_proto (cairo_set_font_options);
1937 slim_hidden_proto (cairo_set_font_size);
1938 slim_hidden_proto (cairo_set_line_cap);
1939 slim_hidden_proto (cairo_set_line_join);
1940 slim_hidden_proto (cairo_set_line_width);
1941 slim_hidden_proto (cairo_set_matrix);
1942 slim_hidden_proto (cairo_set_operator);
1943 slim_hidden_proto (cairo_set_source);
1944 slim_hidden_proto (cairo_set_source_rgb);
1945 slim_hidden_proto (cairo_set_source_surface);
1946 slim_hidden_proto (cairo_set_tolerance);
1947 slim_hidden_proto (cairo_status);
1948 slim_hidden_proto (cairo_stroke);
1949 slim_hidden_proto (cairo_stroke_preserve);
1950 slim_hidden_proto (cairo_surface_copy_page);
1951 slim_hidden_proto (cairo_surface_create_similar_image);
1952 slim_hidden_proto (cairo_surface_destroy);
1953 slim_hidden_proto (cairo_surface_finish);
1954 slim_hidden_proto (cairo_surface_flush);
1955 slim_hidden_proto (cairo_surface_get_device_offset);
1956 slim_hidden_proto (cairo_surface_get_font_options);
1957 slim_hidden_proto (cairo_surface_get_mime_data);
1958 slim_hidden_proto (cairo_surface_has_show_text_glyphs);
1959 slim_hidden_proto (cairo_surface_mark_dirty);
1960 slim_hidden_proto (cairo_surface_mark_dirty_rectangle);
1961 slim_hidden_proto_no_warn (cairo_surface_reference);
1962 slim_hidden_proto (cairo_surface_set_device_offset);
1963 slim_hidden_proto (cairo_surface_set_fallback_resolution);
1964 slim_hidden_proto (cairo_surface_set_mime_data);
1965 slim_hidden_proto (cairo_surface_show_page);
1966 slim_hidden_proto (cairo_surface_status);
1967 slim_hidden_proto (cairo_surface_supports_mime_type);
1968 slim_hidden_proto (cairo_text_cluster_allocate);
1969 slim_hidden_proto (cairo_text_cluster_free);
1970 slim_hidden_proto (cairo_toy_font_face_create);
1971 slim_hidden_proto (cairo_toy_font_face_get_slant);
1972 slim_hidden_proto (cairo_toy_font_face_get_weight);
1973 slim_hidden_proto (cairo_translate);
1974 slim_hidden_proto (cairo_transform);
1975 slim_hidden_proto (cairo_user_font_face_create);
1976 slim_hidden_proto (cairo_user_font_face_set_init_func);
1977 slim_hidden_proto (cairo_user_font_face_set_render_glyph_func);
1978 slim_hidden_proto (cairo_user_font_face_set_unicode_to_glyph_func);
1979 slim_hidden_proto (cairo_device_to_user);
1980 slim_hidden_proto (cairo_user_to_device);
1981 slim_hidden_proto (cairo_user_to_device_distance);
1982 slim_hidden_proto (cairo_version_string);
1983 slim_hidden_proto (cairo_region_create);
1984 slim_hidden_proto (cairo_region_create_rectangle);
1985 slim_hidden_proto (cairo_region_create_rectangles);
1986 slim_hidden_proto (cairo_region_copy);
1987 slim_hidden_proto (cairo_region_reference);
1988 slim_hidden_proto (cairo_region_destroy);
1989 slim_hidden_proto (cairo_region_equal);
1990 slim_hidden_proto (cairo_region_status);
1991 slim_hidden_proto (cairo_region_get_extents);
1992 slim_hidden_proto (cairo_region_num_rectangles);
1993 slim_hidden_proto (cairo_region_get_rectangle);
1994 slim_hidden_proto (cairo_region_is_empty);
1995 slim_hidden_proto (cairo_region_contains_rectangle);
1996 slim_hidden_proto (cairo_region_contains_point);
1997 slim_hidden_proto (cairo_region_translate);
1998 slim_hidden_proto (cairo_region_subtract);
1999 slim_hidden_proto (cairo_region_subtract_rectangle);
2000 slim_hidden_proto (cairo_region_intersect);
2001 slim_hidden_proto (cairo_region_intersect_rectangle);
2002 slim_hidden_proto (cairo_region_union);
2003 slim_hidden_proto (cairo_region_union_rectangle);
2004 slim_hidden_proto (cairo_region_xor);
2005 slim_hidden_proto (cairo_region_xor_rectangle);
2007 #if CAIRO_HAS_PNG_FUNCTIONS
2009 slim_hidden_proto (cairo_surface_write_to_png_stream);
2013 cairo_private_no_warn cairo_filter_t
2014 _cairo_pattern_analyze_filter (const cairo_pattern_t *pattern,
2019 #include "cairo-mutex-private.h"
2020 #include "cairo-fixed-private.h"
2021 #include "cairo-wideint-private.h"
2022 #include "cairo-malloc-private.h"
2023 #include "cairo-hash-private.h"
2026 #include <memcheck.h>
2031 _cairo_debug_check_image_surface_is_defined (const cairo_surface_t *surface);
2036 #define _cairo_debug_check_image_surface_is_defined(X)
2041 _cairo_debug_print_path (FILE *stream, cairo_path_fixed_t *path);
2044 _cairo_debug_print_polygon (FILE *stream, cairo_polygon_t *polygon);
2047 _cairo_debug_print_traps (FILE *file, const cairo_traps_t *traps);
2050 _cairo_debug_print_clip (FILE *stream, const cairo_clip_t *clip);
2053 #define TRACE(x) fprintf x