diff options
Diffstat (limited to 'src/cairo.h')
-rw-r--r-- | src/cairo.h | 452 |
1 files changed, 295 insertions, 157 deletions
diff --git a/src/cairo.h b/src/cairo.h index 6df5f8cf4..ab3c80e82 100644 --- a/src/cairo.h +++ b/src/cairo.h @@ -30,52 +30,48 @@ #include <cairo-features.h> -#include <ic.h> +#include <pixman.h> #include <stdio.h> -#ifdef _CAIROINT_H_ -#include <slim_export.h> -#else -#include <slim_import.h> -#endif - typedef struct cairo cairo_t; typedef struct cairo_surface cairo_surface_t; typedef struct cairo_matrix cairo_matrix_t; +typedef struct cairo_pattern cairo_pattern_t; #ifdef __cplusplus extern "C" { #endif /* Functions for manipulating state objects */ -extern cairo_t * __external_linkage +cairo_t * cairo_create (void); -extern void __external_linkage +void cairo_reference (cairo_t *cr); -extern void __external_linkage +void cairo_destroy (cairo_t *cr); -extern void __external_linkage +void cairo_save (cairo_t *cr); -extern void __external_linkage +void cairo_restore (cairo_t *cr); -extern void __external_linkage +/* XXX: Replace with cairo_current_gstate/cairo_set_gstate */ +void cairo_copy (cairo_t *dest, cairo_t *src); /* XXX: I want to rethink this API -extern void __external_linkage +void cairo_push_group (cairo_t *cr); -extern void __external_linkage +void cairo_pop_group (cairo_t *cr); */ /* Modify state */ -extern void __external_linkage +void cairo_set_target_surface (cairo_t *cr, cairo_surface_t *surface); typedef enum cairo_format { @@ -85,7 +81,7 @@ typedef enum cairo_format { CAIRO_FORMAT_A1 } cairo_format_t; -extern void __external_linkage +void cairo_set_target_image (cairo_t *cr, char *data, cairo_format_t format, @@ -93,7 +89,11 @@ cairo_set_target_image (cairo_t *cr, int height, int stride); -extern void __external_linkage +#ifdef CAIRO_HAS_PS_SURFACE + +#include <stdio.h> + +void cairo_set_target_ps (cairo_t *cr, FILE *file, double width_inches, @@ -101,18 +101,46 @@ cairo_set_target_ps (cairo_t *cr, double x_pixels_per_inch, double y_pixels_per_inch); +#endif /* CAIRO_HAS_PS_SURFACE */ + +#ifdef CAIRO_HAS_PNG_SURFACE + +#include <stdio.h> + +void +cairo_set_target_png (cairo_t *cr, + FILE *file, + cairo_format_t format, + int width, + int height); + +#endif /* CAIRO_HAS_PNG_SURFACE */ + #ifdef CAIRO_HAS_XLIB_SURFACE #include <X11/extensions/Xrender.h> /* XXX: This shold be renamed to cairo_set_target_xlib to match the * other backends */ -extern void __external_linkage +void cairo_set_target_drawable (cairo_t *cr, Display *dpy, Drawable drawable); #endif /* CAIRO_HAS_XLIB_SURFACE */ +#ifdef CAIRO_HAS_XCB_SURFACE + +#include <X11/XCB/xcb.h> +#include <X11/XCB/render.h> + +void +cairo_set_target_xcb (cairo_t *cr, + XCBConnection *dpy, + XCBDRAWABLE drawable, + XCBVISUALTYPE *visual, + cairo_format_t format); +#endif /* CAIRO_HAS_XCB_SURFACE */ + typedef enum cairo_operator { CAIRO_OPERATOR_CLEAR, CAIRO_OPERATOR_SRC, @@ -127,10 +155,10 @@ typedef enum cairo_operator { CAIRO_OPERATOR_ATOP_REVERSE, CAIRO_OPERATOR_XOR, CAIRO_OPERATOR_ADD, - CAIRO_OPERATOR_SATURATE, + CAIRO_OPERATOR_SATURATE } cairo_operator_t; -extern void __external_linkage +void cairo_set_operator (cairo_t *cr, cairo_operator_t op); /* XXX: Probably want to bite the bullet and expose a cairo_color_t object */ @@ -150,16 +178,20 @@ cairo_set_operator (cairo_t *cr, cairo_operator_t op); the behavior of cairo_show_surface. */ -extern void __external_linkage +void cairo_set_rgb_color (cairo_t *cr, double red, double green, double blue); -extern void __external_linkage -cairo_set_alpha (cairo_t *cr, double alpha); +void +cairo_set_pattern (cairo_t *cr, cairo_pattern_t *pattern); -extern void __external_linkage -cairo_set_pattern (cairo_t *cr, cairo_surface_t *pattern); +void +cairo_set_alpha (cairo_t *cr, double alpha); -extern void __external_linkage +/* XXX: Currently, the tolerance value is specified by the user in + terms of device-space units. If I'm not mistaken, this is the only + value in this API that is not expressed in user-space units. I + should think whether this value should be user-space instead. */ +void cairo_set_tolerance (cairo_t *cr, double tolerance); typedef enum cairo_fill_rule { @@ -167,10 +199,10 @@ typedef enum cairo_fill_rule { CAIRO_FILL_RULE_EVEN_ODD } cairo_fill_rule_t; -extern void __external_linkage +void cairo_set_fill_rule (cairo_t *cr, cairo_fill_rule_t fill_rule); -extern void __external_linkage +void cairo_set_line_width (cairo_t *cr, double width); typedef enum cairo_line_cap { @@ -179,7 +211,7 @@ typedef enum cairo_line_cap { CAIRO_LINE_CAP_SQUARE } cairo_line_cap_t; -extern void __external_linkage +void cairo_set_line_cap (cairo_t *cr, cairo_line_cap_t line_cap); typedef enum cairo_line_join { @@ -188,101 +220,101 @@ typedef enum cairo_line_join { CAIRO_LINE_JOIN_BEVEL } cairo_line_join_t; -extern void __external_linkage +void cairo_set_line_join (cairo_t *cr, cairo_line_join_t line_join); -extern void __external_linkage +void cairo_set_dash (cairo_t *cr, double *dashes, int ndash, double offset); -extern void __external_linkage +void cairo_set_miter_limit (cairo_t *cr, double limit); -extern void __external_linkage +void cairo_translate (cairo_t *cr, double tx, double ty); -extern void __external_linkage +void cairo_scale (cairo_t *cr, double sx, double sy); -extern void __external_linkage +void cairo_rotate (cairo_t *cr, double angle); -extern void __external_linkage +void cairo_concat_matrix (cairo_t *cr, - cairo_matrix_t *matrix); + cairo_matrix_t *matrix); -extern void __external_linkage +void cairo_set_matrix (cairo_t *cr, - cairo_matrix_t *matrix); + cairo_matrix_t *matrix); -extern void __external_linkage +void cairo_default_matrix (cairo_t *cr); /* XXX: There's been a proposal to add cairo_default_matrix_exact */ -extern void __external_linkage +void cairo_identity_matrix (cairo_t *cr); -extern void __external_linkage +void cairo_transform_point (cairo_t *cr, double *x, double *y); -extern void __external_linkage +void cairo_transform_distance (cairo_t *cr, double *dx, double *dy); -extern void __external_linkage +void cairo_inverse_transform_point (cairo_t *cr, double *x, double *y); -extern void __external_linkage +void cairo_inverse_transform_distance (cairo_t *cr, double *dx, double *dy); /* Path creation functions */ -extern void __external_linkage +void cairo_new_path (cairo_t *cr); -extern void __external_linkage +void cairo_move_to (cairo_t *cr, double x, double y); -extern void __external_linkage +void cairo_line_to (cairo_t *cr, double x, double y); -extern void __external_linkage +void cairo_curve_to (cairo_t *cr, - double x1, double y1, - double x2, double y2, - double x3, double y3); + double x1, double y1, + double x2, double y2, + double x3, double y3); -extern void __external_linkage +void cairo_arc (cairo_t *cr, double xc, double yc, double radius, double angle1, double angle2); -extern void __external_linkage +void cairo_arc_negative (cairo_t *cr, double xc, double yc, double radius, double angle1, double angle2); /* XXX: NYI -extern void __external_linkage +void cairo_arc_to (cairo_t *cr, double x1, double y1, double x2, double y2, double radius); */ -extern void __external_linkage +void cairo_rel_move_to (cairo_t *cr, double dx, double dy); -extern void __external_linkage +void cairo_rel_line_to (cairo_t *cr, double dx, double dy); -extern void __external_linkage +void cairo_rel_curve_to (cairo_t *cr, double dx1, double dy1, double dx2, double dy2, double dx3, double dy3); -extern void __external_linkage +void cairo_rectangle (cairo_t *cr, double x, double y, double width, double height); @@ -295,35 +327,49 @@ cairo_rectangle (cairo_t *cr, Maybe we could use something like "cairo_outline_path (cairo_t *)"? */ /* XXX: NYI -extern void __external_linkage +void cairo_stroke_path (cairo_t *cr); */ -extern void __external_linkage +void cairo_close_path (cairo_t *cr); /* Painting functions */ -extern void __external_linkage +void cairo_stroke (cairo_t *cr); -extern void __external_linkage +void cairo_fill (cairo_t *cr); -extern void __external_linkage +void cairo_copy_page (cairo_t *cr); -extern void __external_linkage +void cairo_show_page (cairo_t *cr); /* Insideness testing */ -extern int __external_linkage +int cairo_in_stroke (cairo_t *cr, double x, double y); -extern int __external_linkage +int cairo_in_fill (cairo_t *cr, double x, double y); +/* Rectangular extents */ +void +cairo_stroke_extents (cairo_t *cr, + double *x1, double *y1, + double *x2, double *y2); + +void +cairo_fill_extents (cairo_t *cr, + double *x1, double *y1, + double *x2, double *y2); + /* Clipping */ -extern void __external_linkage +void +cairo_init_clip (cairo_t *cr); + +void cairo_clip (cairo_t *cr); /* Font/Text functions */ @@ -337,10 +383,10 @@ typedef struct { } cairo_glyph_t; typedef struct { - double left_side_bearing; - double right_side_bearing; - double ascent; - double descent; + double x_bearing; + double y_bearing; + double width; + double height; double x_advance; double y_advance; } cairo_text_extents_t; @@ -353,115 +399,106 @@ typedef struct { double max_y_advance; } cairo_font_extents_t; -typedef enum cairo_font_weight { - CAIRO_FONT_WEIGHT_NORMAL, - CAIRO_FONT_WEIGHT_BOLD -} cairo_font_weight_t; - typedef enum cairo_font_slant { CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_SLANT_ITALIC, CAIRO_FONT_SLANT_OBLIQUE } cairo_font_slant_t; - +typedef enum cairo_font_weight { + CAIRO_FONT_WEIGHT_NORMAL, + CAIRO_FONT_WEIGHT_BOLD +} cairo_font_weight_t; + /* This interface is for dealing with text as text, not caring about the font object inside the the cairo_t. */ -extern void __external_linkage +void cairo_select_font (cairo_t *ct, - char *family, + const char *family, cairo_font_slant_t slant, cairo_font_weight_t weight); -extern void __external_linkage +void cairo_scale_font (cairo_t *cr, double scale); -extern void __external_linkage +void cairo_transform_font (cairo_t *cr, cairo_matrix_t *matrix); -extern void __external_linkage +void cairo_show_text (cairo_t *ct, const unsigned char *utf8); -extern void __external_linkage +void cairo_show_glyphs (cairo_t *ct, cairo_glyph_t *glyphs, int num_glyphs); -extern cairo_font_t * __external_linkage +cairo_font_t * cairo_current_font (cairo_t *ct); -extern void __external_linkage +void cairo_current_font_extents (cairo_t *ct, cairo_font_extents_t *extents); -extern void __external_linkage +void cairo_set_font (cairo_t *ct, cairo_font_t *font); - -/* XXX: NYI - -extern void __external_linkage +void cairo_text_extents (cairo_t *ct, const unsigned char *utf8, cairo_text_extents_t *extents); -extern void __external_linkage +void cairo_glyph_extents (cairo_t *ct, cairo_glyph_t *glyphs, int num_glyphs, cairo_text_extents_t *extents); -extern void __external_linkage +void cairo_text_path (cairo_t *ct, const unsigned char *utf8); -extern void __external_linkage +void cairo_glyph_path (cairo_t *ct, cairo_glyph_t *glyphs, int num_glyphs); -*/ - - /* Portable interface to general font features. */ -extern void __external_linkage +void cairo_font_reference (cairo_font_t *font); -extern void __external_linkage +void cairo_font_destroy (cairo_font_t *font); -extern void __external_linkage +void cairo_font_set_transform (cairo_font_t *font, cairo_matrix_t *matrix); -extern void __external_linkage +void cairo_font_current_transform (cairo_font_t *font, cairo_matrix_t *matrix); - /* Fontconfig/Freetype platform-specific font interface */ #include <fontconfig/fontconfig.h> #include <ft2build.h> #include FT_FREETYPE_H -extern cairo_font_t * __external_linkage +cairo_font_t * cairo_ft_font_create (FT_Library ft_library, FcPattern *pattern); -extern cairo_font_t * __external_linkage +cairo_font_t * cairo_ft_font_create_for_ft_face (FT_Face face); -extern void __external_linkage +void cairo_ft_font_destroy (cairo_font_t *ft_font); -extern FT_Face __external_linkage +FT_Face cairo_ft_font_face (cairo_font_t *ft_font); -extern FcPattern * __external_linkage +FcPattern * cairo_ft_font_pattern (cairo_font_t *ft_font); - - /* Image functions */ -extern void __external_linkage +/* XXX: Eliminate width/height here */ +void cairo_show_surface (cairo_t *cr, cairo_surface_t *surface, int width, @@ -475,48 +512,78 @@ cairo_show_surface (cairo_t *cr, into one file and be done with it. For now, I've got a little more typing than that. */ -extern cairo_operator_t __external_linkage +cairo_operator_t cairo_current_operator (cairo_t *cr); -extern void __external_linkage +void cairo_current_rgb_color (cairo_t *cr, double *red, double *green, double *blue); +cairo_pattern_t * +cairo_current_pattern (cairo_t *cr); -extern double __external_linkage +double cairo_current_alpha (cairo_t *cr); /* XXX: Do we want cairo_current_pattern as well? */ -extern double __external_linkage +double cairo_current_tolerance (cairo_t *cr); -extern void __external_linkage +void cairo_current_point (cairo_t *cr, double *x, double *y); -extern cairo_fill_rule_t __external_linkage +cairo_fill_rule_t cairo_current_fill_rule (cairo_t *cr); -extern double __external_linkage +double cairo_current_line_width (cairo_t *cr); -extern cairo_line_cap_t __external_linkage +cairo_line_cap_t cairo_current_line_cap (cairo_t *cr); -extern cairo_line_join_t __external_linkage +cairo_line_join_t cairo_current_line_join (cairo_t *cr); -extern double __external_linkage +double cairo_current_miter_limit (cairo_t *cr); /* XXX: How to do cairo_current_dash??? Do we want to switch to a cairo_dash object? */ -extern void __external_linkage +void cairo_current_matrix (cairo_t *cr, cairo_matrix_t *matrix); /* XXX: Need to decide the memory mangement semantics of this function. Should it reference the surface again? */ -extern cairo_surface_t * __external_linkage +cairo_surface_t * cairo_current_target_surface (cairo_t *cr); +typedef void (cairo_move_to_func_t) (void *closure, + double x, double y); + +typedef void (cairo_line_to_func_t) (void *closure, + double x, double y); + +typedef void (cairo_curve_to_func_t) (void *closure, + double x1, double y1, + double x2, double y2, + double x3, double y3); + +typedef void (cairo_close_path_func_t) (void *closure); + +extern void +cairo_current_path (cairo_t *cr, + cairo_move_to_func_t *move_to, + cairo_line_to_func_t *line_to, + cairo_curve_to_func_t *curve_to, + cairo_close_path_func_t *close_path, + void *closure); + +extern void +cairo_current_path_flat (cairo_t *cr, + cairo_move_to_func_t *move_to, + cairo_line_to_func_t *line_to, + cairo_close_path_func_t *close_path, + void *closure); + /* Error status queries */ typedef enum cairo_status { @@ -530,16 +597,16 @@ typedef enum cairo_status { CAIRO_STATUS_NULL_POINTER } cairo_status_t; -extern cairo_status_t __external_linkage +cairo_status_t cairo_status (cairo_t *cr); -extern const char * __external_linkage +const char * cairo_status_string (cairo_t *cr); /* Surface manipulation */ /* XXX: We may want to rename this function in light of the new virtualized surface backends... */ -extern cairo_surface_t * __external_linkage +cairo_surface_t * cairo_surface_create_for_image (char *data, cairo_format_t format, int width, @@ -548,26 +615,26 @@ cairo_surface_create_for_image (char *data, /* XXX: I want to remove this function, (replace with cairo_set_target_scratch or similar). */ -extern cairo_surface_t * __external_linkage +cairo_surface_t * cairo_surface_create_similar (cairo_surface_t *other, cairo_format_t format, int width, int height); -extern void __external_linkage +void cairo_surface_reference (cairo_surface_t *surface); -extern void __external_linkage +void cairo_surface_destroy (cairo_surface_t *surface); /* XXX: NYI -extern cairo_status_t __external_linkage +cairo_status_t cairo_surface_clip_restore (cairo_surface_t *surface); -extern cairo_status_t __external_linkage +cairo_status_t cairo_surface_clip_begin (cairo_surface_t *surface); -extern cairo_status_t __external_linkage +cairo_status_t cairo_surface_clip_rectangle (cairo_surface_t *surface, int x, int y, int width, int height); @@ -576,52 +643,120 @@ cairo_surface_clip_rectangle (cairo_surface_t *surface, /* XXX: Note: The current Render/Ic implementations don't do the right thing with repeat when the surface has a non-identity matrix. */ /* XXX: Rework this as a cairo function with an enum: cairo_set_pattern_extend */ -extern cairo_status_t __external_linkage +cairo_status_t cairo_surface_set_repeat (cairo_surface_t *surface, int repeat); /* XXX: Rework this as a cairo function: cairo_set_pattern_transform */ -extern cairo_status_t __external_linkage +cairo_status_t cairo_surface_set_matrix (cairo_surface_t *surface, cairo_matrix_t *matrix); /* XXX: Rework this as a cairo function: cairo_current_pattern_transform */ -extern cairo_status_t __external_linkage +cairo_status_t cairo_surface_get_matrix (cairo_surface_t *surface, cairo_matrix_t *matrix); -typedef enum cairo_filter { +typedef enum { CAIRO_FILTER_FAST, CAIRO_FILTER_GOOD, CAIRO_FILTER_BEST, CAIRO_FILTER_NEAREST, CAIRO_FILTER_BILINEAR, + CAIRO_FILTER_GAUSSIAN } cairo_filter_t; - + /* XXX: Rework this as a cairo function: cairo_set_pattern_filter */ -extern cairo_status_t __external_linkage +cairo_status_t cairo_surface_set_filter (cairo_surface_t *surface, cairo_filter_t filter); +cairo_filter_t +cairo_surface_get_filter (cairo_surface_t *surface); + /* Image-surface functions */ -extern cairo_surface_t * __external_linkage +cairo_surface_t * cairo_image_surface_create (cairo_format_t format, int width, int height); -extern cairo_surface_t * __external_linkage +cairo_surface_t * cairo_image_surface_create_for_data (char *data, cairo_format_t format, int width, int height, int stride); +/* Pattern creation functions */ +cairo_pattern_t * +cairo_pattern_create_for_surface (cairo_surface_t *surface); + +cairo_pattern_t * +cairo_pattern_create_linear (double x0, double y0, + double x1, double y1); + +cairo_pattern_t * +cairo_pattern_create_radial (double cx0, double cy0, double radius0, + double cx1, double cy1, double radius1); + +void +cairo_pattern_reference (cairo_pattern_t *pattern); + +void +cairo_pattern_destroy (cairo_pattern_t *pattern); + +cairo_status_t +cairo_pattern_add_color_stop (cairo_pattern_t *pattern, + double offset, + double red, double green, double blue, + double alpha); + +cairo_status_t +cairo_pattern_set_matrix (cairo_pattern_t *pattern, cairo_matrix_t *matrix); + +cairo_status_t +cairo_pattern_get_matrix (cairo_pattern_t *pattern, cairo_matrix_t *matrix); + +typedef enum { + CAIRO_EXTEND_NONE, + CAIRO_EXTEND_REPEAT, + CAIRO_EXTEND_REFLECT +} cairo_extend_t; + +cairo_status_t +cairo_pattern_set_extend (cairo_pattern_t *pattern, cairo_extend_t extend); + +cairo_extend_t +cairo_pattern_get_extend (cairo_pattern_t *pattern); + +cairo_status_t +cairo_pattern_set_filter (cairo_pattern_t *pattern, cairo_filter_t filter); + +cairo_filter_t +cairo_pattern_get_filter (cairo_pattern_t *pattern); + +#ifdef CAIRO_HAS_PS_SURFACE + /* PS-surface functions */ -extern cairo_surface_t * __external_linkage +cairo_surface_t * cairo_ps_surface_create (FILE *file, double width_inches, double height_inches, double x_pixels_per_inch, double y_pixels_per_inch); +#endif /* CAIRO_HAS_PS_SURFACE */ + +#ifdef CAIRO_HAS_PNG_SURFACE + +/* PNG-surface functions */ + +cairo_surface_t * +cairo_png_surface_create (FILE *file, + cairo_format_t format, + int width, + int height); + +#endif /* CAIRO_HAS_PNG_SURFACE */ + #ifdef CAIRO_HAS_XLIB_SURFACE /* XXX: This is a mess from the user's POV. Should the Visual or the @@ -629,12 +764,17 @@ cairo_ps_surface_create (FILE *file, cairo_surface_create_for_window with a visual, and cairo_surface_create_for_pixmap with a cairo_format_t. Would that work? */ -extern cairo_surface_t * __external_linkage +cairo_surface_t * cairo_xlib_surface_create (Display *dpy, Drawable drawable, Visual *visual, cairo_format_t format, Colormap colormap); + +/* XXX: This has been proposed +cairo_status_t +cairo_xlib_surface_set_size (cairo_surface_t *surface, int width, int height); +*/ #endif /* CAIRO_HAS_XLIB_SURFACE */ @@ -642,49 +782,49 @@ cairo_xlib_surface_create (Display *dpy, /* XXX: Rename all of these to cairo_transform_t */ -extern cairo_matrix_t * __external_linkage +cairo_matrix_t * cairo_matrix_create (void); -extern void __external_linkage +void cairo_matrix_destroy (cairo_matrix_t *matrix); -extern cairo_status_t __external_linkage +cairo_status_t cairo_matrix_copy (cairo_matrix_t *matrix, const cairo_matrix_t *other); -extern cairo_status_t __external_linkage +cairo_status_t cairo_matrix_set_identity (cairo_matrix_t *matrix); -extern cairo_status_t __external_linkage +cairo_status_t cairo_matrix_set_affine (cairo_matrix_t *cr, double a, double b, double c, double d, double tx, double ty); -extern cairo_status_t __external_linkage +cairo_status_t cairo_matrix_get_affine (cairo_matrix_t *matrix, double *a, double *b, double *c, double *d, double *tx, double *ty); -extern cairo_status_t __external_linkage +cairo_status_t cairo_matrix_translate (cairo_matrix_t *matrix, double tx, double ty); -extern cairo_status_t __external_linkage +cairo_status_t cairo_matrix_scale (cairo_matrix_t *matrix, double sx, double sy); -extern cairo_status_t __external_linkage +cairo_status_t cairo_matrix_rotate (cairo_matrix_t *matrix, double radians); -extern cairo_status_t __external_linkage +cairo_status_t cairo_matrix_invert (cairo_matrix_t *matrix); -extern cairo_status_t __external_linkage +cairo_status_t cairo_matrix_multiply (cairo_matrix_t *result, const cairo_matrix_t *a, const cairo_matrix_t *b); -extern cairo_status_t __external_linkage +cairo_status_t cairo_matrix_transform_distance (cairo_matrix_t *matrix, double *dx, double *dy); -extern cairo_status_t __external_linkage +cairo_status_t cairo_matrix_transform_point (cairo_matrix_t *matrix, double *x, double *y); /* Deprecated functions. We've made some effort to allow the @@ -712,6 +852,4 @@ cairo_matrix_transform_point (cairo_matrix_t *matrix, double *x, double *y); } #endif -#undef __external_linkage - #endif |