From 5ae0b9f912b7f5fd1700cbf18763a05493f55b62 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Mon, 27 Feb 2006 23:11:32 -0800 Subject: [PATCH] Implement cairo_surface_get_type --- src/cairo-directfb-surface.c | 1 + src/cairo-glitz-surface.c | 1 + src/cairo-image-surface.c | 1 + src/cairo-meta-surface.c | 1 + src/cairo-paginated-surface.c | 5 +++++ src/cairo-pdf-surface.c | 1 + src/cairo-ps-surface.c | 1 + src/cairo-surface.c | 15 +++++++++++++++ src/cairo-svg-surface.c | 1 + src/cairo-win32-surface.c | 1 + src/cairo-xcb-surface.c | 1 + src/cairo-xlib-surface.c | 1 + src/cairoint.h | 12 ++++++++++++ 13 files changed, 42 insertions(+) diff --git a/src/cairo-directfb-surface.c b/src/cairo-directfb-surface.c index be1791584..a02e56bf4 100644 --- a/src/cairo-directfb-surface.c +++ b/src/cairo-directfb-surface.c @@ -662,6 +662,7 @@ _cairo_directfb_surface_scaled_glyph_fini (cairo_scaled_glyph_t *scaled_glyph, static const cairo_surface_backend_t cairo_directfb_surface_backend = { + CAIRO_SURFACE_TYPE_DIRECTFB, _cairo_directfb_surface_create_similar, _cairo_directfb_surface_finish, _cairo_directfb_surface_acquire_source_image, diff --git a/src/cairo-glitz-surface.c b/src/cairo-glitz-surface.c index b62547236..667e231d5 100644 --- a/src/cairo-glitz-surface.c +++ b/src/cairo-glitz-surface.c @@ -2121,6 +2121,7 @@ _cairo_glitz_surface_flush (void *abstract_surface) } static const cairo_surface_backend_t cairo_glitz_surface_backend = { + CAIRO_SURFACE_TYPE_GLITZ, _cairo_glitz_surface_create_similar, _cairo_glitz_surface_finish, _cairo_glitz_surface_acquire_source_image, diff --git a/src/cairo-image-surface.c b/src/cairo-image-surface.c index 108e89b5e..06219464c 100644 --- a/src/cairo-image-surface.c +++ b/src/cairo-image-surface.c @@ -903,6 +903,7 @@ _cairo_surface_is_image (const cairo_surface_t *surface) } const cairo_surface_backend_t cairo_image_surface_backend = { + CAIRO_SURFACE_TYPE_IMAGE, _cairo_image_surface_create_similar, _cairo_image_surface_finish, _cairo_image_surface_acquire_source_image, diff --git a/src/cairo-meta-surface.c b/src/cairo-meta-surface.c index 6f824634c..f7aeb719c 100644 --- a/src/cairo-meta-surface.c +++ b/src/cairo-meta-surface.c @@ -557,6 +557,7 @@ _cairo_surface_is_meta (const cairo_surface_t *surface) } static const cairo_surface_backend_t cairo_meta_surface_backend = { + CAIRO_INTERNAL_SURFACE_TYPE_META, _cairo_meta_surface_create_similar, _cairo_meta_surface_finish, _cairo_meta_surface_acquire_source_image, diff --git a/src/cairo-paginated-surface.c b/src/cairo-paginated-surface.c index 6317d7083..4bb857265 100644 --- a/src/cairo-paginated-surface.c +++ b/src/cairo-paginated-surface.c @@ -111,6 +111,10 @@ _cairo_paginated_surface_create (cairo_surface_t *target, _cairo_surface_init (&surface->base, &cairo_paginated_surface_backend); + /* Override surface->base.type with target's type so we don't leak + * evidence of the paginated wrapper out to the user. */ + surface->base.type = cairo_surface_get_type (target); + surface->content = content; surface->width = width; surface->height = height; @@ -381,6 +385,7 @@ _cairo_paginated_surface_snapshot (void *abstract_other) } const cairo_surface_backend_t cairo_paginated_surface_backend = { + CAIRO_INTERNAL_SURFACE_TYPE_PAGINATED, NULL, /* create_similar */ _cairo_paginated_surface_finish, _cairo_paginated_surface_acquire_source_image, diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c index 289eeb961..cb8287bcf 100644 --- a/src/cairo-pdf-surface.c +++ b/src/cairo-pdf-surface.c @@ -1657,6 +1657,7 @@ _cairo_pdf_surface_get_font_options (void *abstract_surface, } static const cairo_surface_backend_t cairo_pdf_surface_backend = { + CAIRO_SURFACE_TYPE_PDF, _cairo_pdf_surface_create_similar, _cairo_pdf_surface_finish, NULL, /* acquire_source_image */ diff --git a/src/cairo-ps-surface.c b/src/cairo-ps-surface.c index 371290cc2..6028b6d50 100644 --- a/src/cairo-ps-surface.c +++ b/src/cairo-ps-surface.c @@ -1322,6 +1322,7 @@ _cairo_ps_surface_fill (void *abstract_surface, } static const cairo_surface_backend_t cairo_ps_surface_backend = { + CAIRO_SURFACE_TYPE_PS, NULL, /* create_similar */ _cairo_ps_surface_finish, NULL, /* acquire_source_image */ diff --git a/src/cairo-surface.c b/src/cairo-surface.c index 52aeafe46..a317e5b64 100644 --- a/src/cairo-surface.c +++ b/src/cairo-surface.c @@ -43,6 +43,7 @@ const cairo_surface_t _cairo_surface_nil = { &cairo_image_surface_backend, /* backend */ + CAIRO_SURFACE_TYPE_IMAGE, -1, /* ref_count */ CAIRO_STATUS_NO_MEMORY, /* status */ FALSE, /* finished */ @@ -59,6 +60,7 @@ const cairo_surface_t _cairo_surface_nil = { const cairo_surface_t _cairo_surface_nil_file_not_found = { &cairo_image_surface_backend, /* backend */ + CAIRO_SURFACE_TYPE_IMAGE, -1, /* ref_count */ CAIRO_STATUS_FILE_NOT_FOUND, /* status */ FALSE, /* finished */ @@ -75,6 +77,7 @@ const cairo_surface_t _cairo_surface_nil_file_not_found = { const cairo_surface_t _cairo_surface_nil_read_error = { &cairo_image_surface_backend, /* backend */ + CAIRO_SURFACE_TYPE_IMAGE, -1, /* ref_count */ CAIRO_STATUS_READ_ERROR, /* status */ FALSE, /* finished */ @@ -118,6 +121,16 @@ _cairo_surface_set_error (cairo_surface_t *surface, _cairo_error (status); } +cairo_surface_type_t +cairo_surface_get_type (cairo_surface_t *surface) +{ + /* We don't use surface->backend->type here so that some of the + * special "wrapper" surfaces such as cairo_paginated_surface_t + * can override surface->type with the type of the "child" + * surface. */ + return surface->type; +} + /** * cairo_surface_status: * @surface: a #cairo_surface_t @@ -141,6 +154,8 @@ _cairo_surface_init (cairo_surface_t *surface, const cairo_surface_backend_t *backend) { surface->backend = backend; + + surface->type = backend->type; surface->ref_count = 1; surface->status = CAIRO_STATUS_SUCCESS; diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c index 5a2c92fff..a5b02c9b8 100644 --- a/src/cairo-svg-surface.c +++ b/src/cairo-svg-surface.c @@ -1221,6 +1221,7 @@ _cairo_svg_surface_get_font_options (void *abstract_surface, static const cairo_surface_backend_t cairo_svg_surface_backend = { + CAIRO_SURFACE_TYPE_SVG, _cairo_svg_surface_create_similar, _cairo_svg_surface_finish, NULL, /* acquire_source_image */ diff --git a/src/cairo-win32-surface.c b/src/cairo-win32-surface.c index b1811a134..9dacd1d37 100644 --- a/src/cairo-win32-surface.c +++ b/src/cairo-win32-surface.c @@ -1030,6 +1030,7 @@ _cairo_surface_is_win32 (cairo_surface_t *surface) } static const cairo_surface_backend_t cairo_win32_surface_backend = { + CAIRO_SURFACE_TYPE_WIN32, _cairo_win32_surface_create_similar, _cairo_win32_surface_finish, _cairo_win32_surface_acquire_source_image, diff --git a/src/cairo-xcb-surface.c b/src/cairo-xcb-surface.c index faa207c0d..78eafc0fa 100644 --- a/src/cairo-xcb-surface.c +++ b/src/cairo-xcb-surface.c @@ -1025,6 +1025,7 @@ _cairo_xcb_surface_get_extents (void *abstract_surface, } static const cairo_surface_backend_t cairo_xcb_surface_backend = { + CAIRO_SURFACE_TYPE_XCB, _cairo_xcb_surface_create_similar, _cairo_xcb_surface_finish, _cairo_xcb_surface_acquire_source_image, diff --git a/src/cairo-xlib-surface.c b/src/cairo-xlib-surface.c index 1ce7e890b..dc7d394e1 100644 --- a/src/cairo-xlib-surface.c +++ b/src/cairo-xlib-surface.c @@ -1675,6 +1675,7 @@ _cairo_xlib_surface_scaled_glyph_fini (cairo_scaled_glyph_t *scaled_glyph, cairo_scaled_font_t *scaled_font); static const cairo_surface_backend_t cairo_xlib_surface_backend = { + CAIRO_SURFACE_TYPE_XLIB, _cairo_xlib_surface_create_similar, _cairo_xlib_surface_finish, _cairo_xlib_surface_acquire_source_image, diff --git a/src/cairoint.h b/src/cairoint.h index a1978a90d..124612346 100644 --- a/src/cairoint.h +++ b/src/cairoint.h @@ -256,6 +256,11 @@ typedef enum cairo_int_status { CAIRO_INT_STATUS_CACHE_EMPTY } cairo_int_status_t; +typedef enum cairo_internal_surface_type { + CAIRO_INTERNAL_SURFACE_TYPE_META = 0x1000, + CAIRO_INTERNAL_SURFACE_TYPE_PAGINATED +} cairo_internal_surface_type_t; + typedef enum cairo_direction { CAIRO_DIRECTION_FORWARD, CAIRO_DIRECTION_REVERSE @@ -604,6 +609,8 @@ typedef struct _cairo_stroke_style { } cairo_stroke_style_t; struct _cairo_surface_backend { + cairo_surface_type_t type; + cairo_surface_t * (*create_similar) (void *surface, cairo_content_t content, @@ -834,6 +841,11 @@ typedef struct _cairo_format_masks { struct _cairo_surface { const cairo_surface_backend_t *backend; + /* We allow surfaces to override the backend->type by shoving something + * else into surface->type. This is for "wrapper" surfaces that want to + * hide their internal type from the user-level API. */ + cairo_surface_type_t type; + unsigned int ref_count; cairo_status_t status; cairo_bool_t finished;