diff --git a/src/cairo-win32-font.c b/src/cairo-win32-font.c index fb01665d0..73fc052d7 100644 --- a/src/cairo-win32-font.c +++ b/src/cairo-win32-font.c @@ -45,6 +45,8 @@ #include "cairoint.h" #include "cairo-win32-private.h" + +#include "cairo-array-private.h" #include "cairo-error-private.h" #include "cairo-image-surface-private.h" #include "cairo-pattern-private.h" @@ -1388,6 +1390,7 @@ _cairo_win32_scaled_font_glyph_init (void *abstract_font, return CAIRO_STATUS_SUCCESS; } +#if 0 static cairo_int_status_t _cairo_win32_scaled_font_show_glyphs (void *abstract_font, cairo_operator_t op, @@ -1496,13 +1499,7 @@ _cairo_win32_scaled_font_show_glyphs (void *abstract_font, if (scaled_font->quality == CLEARTYPE_QUALITY) mask.base.has_component_alpha = TRUE; - status = _cairo_surface_composite (op, pattern, - &mask.base, - &surface->base, - source_x, source_y, - 0, 0, - dest_x, dest_y, - width, height, + status = _cairo_surface_mask (&surface->base, op, pattern, &mask.base, clip_region); _cairo_pattern_fini (&mask.base); @@ -1510,6 +1507,7 @@ _cairo_win32_scaled_font_show_glyphs (void *abstract_font, return status; } } +#endif static cairo_int_status_t _cairo_win32_scaled_font_load_truetype_table (void *abstract_font, @@ -1963,7 +1961,6 @@ const cairo_scaled_font_backend_t _cairo_win32_scaled_font_backend = { _cairo_win32_scaled_font_glyph_init, NULL, /* _cairo_win32_scaled_font_text_to_glyphs, FIXME */ _cairo_win32_scaled_font_ucs4_to_index, - _cairo_win32_scaled_font_show_glyphs, _cairo_win32_scaled_font_load_truetype_table, _cairo_win32_scaled_font_index_to_ucs4, _cairo_win32_scaled_font_is_synthetic, @@ -2218,14 +2215,11 @@ cairo_win32_font_face_create_for_logfontw_hfont (LOGFONTW *logfont, HFONT font) if (unlikely (status)) goto FAIL; -DONE: _cairo_win32_font_face_hash_table_unlock (); - return &font_face->base; FAIL: _cairo_win32_font_face_hash_table_unlock (); - return (cairo_font_face_t *)&_cairo_font_face_nil; } diff --git a/src/cairo-win32-printing-surface.c b/src/cairo-win32-printing-surface.c index f6ce2028c..296e6265a 100644 --- a/src/cairo-win32-printing-surface.c +++ b/src/cairo-win32-printing-surface.c @@ -1441,8 +1441,7 @@ _cairo_win32_printing_surface_emit_win32_glyphs (cairo_win32_surface_t *surface cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font, - const cairo_clip_t *clip, - int *remaining_glyphs) + const cairo_clip_t *clip) { cairo_matrix_t ctm; cairo_glyph_t *unicode_glyphs; @@ -1504,7 +1503,6 @@ _cairo_win32_printing_surface_emit_win32_glyphs (cairo_win32_surface_t *surface i - first + 1, scaled_font, clip, - remaining_glyphs, ! sequence_is_unicode); first = i + 1; if (i < num_glyphs - 1) @@ -1529,8 +1527,7 @@ _cairo_win32_printing_surface_show_glyphs (void *abstract_surfac cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font, - const cairo_clip_t *clip, - int *remaining_glyphs) + const cairo_clip_t *clip) { cairo_win32_surface_t *surface = abstract_surface; cairo_status_t status = CAIRO_STATUS_SUCCESS; @@ -1612,8 +1609,7 @@ _cairo_win32_printing_surface_show_glyphs (void *abstract_surfac glyphs, num_glyphs, scaled_font, - clip, - remaining_glyphs); + clip); } #endif @@ -1885,9 +1881,6 @@ static const cairo_surface_backend_t cairo_win32_printing_surface_backend = { NULL, /* flush */ NULL, /* mark_dirty_rectangle */ - NULL, /* scaled_font_fini */ - NULL, /* scaled_glyph_fini */ - _cairo_win32_printing_surface_paint, NULL, /* mask */ _cairo_win32_printing_surface_stroke, diff --git a/src/cairo-win32-private.h b/src/cairo-win32-private.h index e00b38b18..07830dc25 100644 --- a/src/cairo-win32-private.h +++ b/src/cairo-win32-private.h @@ -172,7 +172,6 @@ _cairo_win32_surface_show_glyphs_internal (void *surface, int num_glyphs, cairo_scaled_font_t *scaled_font, const cairo_clip_t *clip, - int *remaining_glyphs, cairo_bool_t glyph_indices); cairo_int_status_t @@ -182,8 +181,7 @@ _cairo_win32_surface_show_glyphs (void *surface, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font, - const cairo_clip_t *clip, - int *remaining_glyphs); + const cairo_clip_t *clip); cairo_surface_t * _cairo_win32_surface_create_similar (void *abstract_src, @@ -191,18 +189,6 @@ _cairo_win32_surface_create_similar (void *abstract_src, int width, int height); -cairo_status_t -_cairo_win32_surface_clone_similar (void *abstract_surface, - cairo_surface_t *src, - cairo_content_t content, - int src_x, - int src_y, - int width, - int height, - int *clone_offset_x, - int *clone_offset_y, - cairo_surface_t **clone_out); - static inline void _cairo_matrix_to_win32_xform (const cairo_matrix_t *m, XFORM *xform) diff --git a/src/cairo-win32-surface.c b/src/cairo-win32-surface.c index 274df3ff4..c7d3216c8 100644 --- a/src/cairo-win32-surface.c +++ b/src/cairo-win32-surface.c @@ -57,6 +57,7 @@ #include "cairo-win32-private.h" #include "cairo-scaled-font-subsets-private.h" #include "cairo-surface-fallback-private.h" +#include "cairo-surface-backend-private.h" #include #include @@ -646,65 +647,6 @@ _cairo_win32_surface_release_source_image (void *abstract_surf cairo_surface_destroy ((cairo_surface_t *)local); } -static cairo_status_t -_cairo_win32_surface_acquire_dest_image (void *abstract_surface, - cairo_rectangle_int_t *interest_rect, - cairo_image_surface_t **image_out, - cairo_rectangle_int_t *image_rect, - void **image_extra) -{ - cairo_win32_surface_t *surface = abstract_surface; - cairo_win32_surface_t *local = NULL; - cairo_status_t status; - - if (surface->image) { - GdiFlush(); - - *image_out = (cairo_image_surface_t *) surface->image; - *image_extra = NULL; - *image_rect = surface->extents; - return CAIRO_STATUS_SUCCESS; - } - - status = _cairo_win32_surface_get_subimage (abstract_surface, - interest_rect->x, - interest_rect->y, - interest_rect->width, - interest_rect->height, - &local); - if (status) - return status; - - *image_out = (cairo_image_surface_t *) local->image; - *image_extra = local; - *image_rect = *interest_rect; - return CAIRO_STATUS_SUCCESS; -} - -static void -_cairo_win32_surface_release_dest_image (void *abstract_surface, - cairo_rectangle_int_t *interest_rect, - cairo_image_surface_t *image, - cairo_rectangle_int_t *image_rect, - void *image_extra) -{ - cairo_win32_surface_t *surface = abstract_surface; - cairo_win32_surface_t *local = image_extra; - - if (!local) - return; - - if (!BitBlt (surface->dc, - image_rect->x, image_rect->y, - image_rect->width, image_rect->height, - local->dc, - 0, 0, - SRCCOPY)) - _cairo_win32_print_gdi_error ("_cairo_win32_surface_release_dest_image"); - - cairo_surface_destroy ((cairo_surface_t *)local); -} - cairo_status_t _cairo_win32_surface_set_clip_region (void *abstract_surface, cairo_region_t *region) @@ -1380,6 +1322,7 @@ UNSUPPORTED: if (dst->image) { GdiFlush(); +#if 0 return dst->image->backend->composite (op, pattern, mask_pattern, dst->image, src_x, src_y, @@ -1387,6 +1330,7 @@ UNSUPPORTED: dst_x, dst_y, width, height, clip_region); +#endif } return CAIRO_INT_STATUS_UNSUPPORTED; @@ -1583,7 +1527,6 @@ _cairo_win32_surface_show_glyphs_internal (void *surface, int num_glyphs, cairo_scaled_font_t *scaled_font, const cairo_clip_t *clip, - int *remaining_glyphs, cairo_bool_t glyph_indexing) { #if CAIRO_HAS_WIN32_FONT @@ -1733,8 +1676,7 @@ _cairo_win32_surface_show_glyphs (void *surface, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font, - const cairo_clip_t *clip, - int *remaining_glyphs) + const cairo_clip_t *clip) { return _cairo_win32_surface_show_glyphs_internal (surface, op, @@ -1743,7 +1685,6 @@ _cairo_win32_surface_show_glyphs (void *surface, num_glyphs, scaled_font, clip, - remaining_glyphs, TRUE); } @@ -1985,166 +1926,6 @@ cairo_win32_surface_get_image (cairo_surface_t *surface) return ((cairo_win32_surface_t*)surface)->image; } -static cairo_bool_t -_cairo_win32_surface_is_similar (void *surface_a, - void *surface_b) -{ - cairo_win32_surface_t *a = surface_a; - cairo_win32_surface_t *b = surface_b; - - return a->dc == b->dc; -} - -typedef struct _cairo_win32_surface_span_renderer { - cairo_span_renderer_t base; - - cairo_operator_t op; - const cairo_pattern_t *pattern; - cairo_antialias_t antialias; - - uint8_t *mask_data; - uint32_t mask_stride; - - cairo_image_surface_t *mask; - cairo_win32_surface_t *dst; - cairo_region_t *clip_region; - - cairo_composite_rectangles_t composite_rectangles; -} cairo_win32_surface_span_renderer_t; - -static cairo_status_t -_cairo_win32_surface_span_renderer_render_rows ( - void *abstract_renderer, - int y, - int height, - const cairo_half_open_span_t *spans, - unsigned num_spans) -{ - cairo_win32_surface_span_renderer_t *renderer = abstract_renderer; - while (height--) - _cairo_image_surface_span_render_row (y++, spans, num_spans, renderer->mask_data, renderer->mask_stride); - return CAIRO_STATUS_SUCCESS; -} - -static void -_cairo_win32_surface_span_renderer_destroy (void *abstract_renderer) -{ - cairo_win32_surface_span_renderer_t *renderer = abstract_renderer; - if (!renderer) return; - - if (renderer->mask != NULL) - cairo_surface_destroy (&renderer->mask->base); - - free (renderer); -} - -static cairo_status_t -_cairo_win32_surface_span_renderer_finish (void *abstract_renderer) -{ - cairo_win32_surface_span_renderer_t *renderer = abstract_renderer; - cairo_status_t status = CAIRO_STATUS_SUCCESS; - - if (renderer->pattern == NULL || renderer->mask == NULL) - return CAIRO_STATUS_SUCCESS; - - status = cairo_surface_status (&renderer->mask->base); - if (status == CAIRO_STATUS_SUCCESS) { - cairo_composite_rectangles_t *rects = &renderer->composite_rectangles; - cairo_win32_surface_t *dst = renderer->dst; - cairo_pattern_t *mask_pattern = cairo_pattern_create_for_surface (&renderer->mask->base); - /* composite onto the image surface directly if we can */ - if (dst->image) { - GdiFlush(); /* XXX: I'm not sure if this needed or not */ - - status = dst->image->backend->composite (renderer->op, - renderer->pattern, mask_pattern, dst->image, - rects->bounded.x, rects->bounded.y, - 0, 0, /* mask.x, mask.y */ - rects->bounded.x, rects->bounded.y, - rects->bounded.width, rects->bounded.height, - renderer->clip_region); - } else { - /* otherwise go through the fallback_composite path which - * will do the appropriate surface acquisition */ - status = _cairo_surface_fallback_composite ( - renderer->op, - renderer->pattern, mask_pattern, &dst->base, - rects->bounded.x, rects->bounded.y, - 0, 0, /* mask.x, mask.y */ - rects->bounded.x, rects->bounded.y, - rects->bounded.width, rects->bounded.height, - renderer->clip_region); - } - cairo_pattern_destroy (mask_pattern); - - } - if (status != CAIRO_STATUS_SUCCESS) - return _cairo_span_renderer_set_error (abstract_renderer, - status); - return CAIRO_STATUS_SUCCESS; -} - -static cairo_bool_t -_cairo_win32_surface_check_span_renderer (cairo_operator_t op, - const cairo_pattern_t *pattern, - void *abstract_dst, - cairo_antialias_t antialias) -{ - (void) op; - (void) pattern; - (void) abstract_dst; - (void) antialias; - return TRUE; -} - -static cairo_span_renderer_t * -_cairo_win32_surface_create_span_renderer (cairo_operator_t op, - const cairo_pattern_t *pattern, - void *abstract_dst, - cairo_antialias_t antialias, - const cairo_composite_rectangles_t *rects, - cairo_region_t *clip_region) -{ - cairo_win32_surface_t *dst = abstract_dst; - cairo_win32_surface_span_renderer_t *renderer; - cairo_status_t status; - int width = rects->bounded.width; - int height = rects->bounded.height; - - renderer = calloc(1, sizeof(*renderer)); - if (renderer == NULL) - return _cairo_span_renderer_create_in_error (CAIRO_STATUS_NO_MEMORY); - - renderer->base.destroy = _cairo_win32_surface_span_renderer_destroy; - renderer->base.finish = _cairo_win32_surface_span_renderer_finish; - renderer->base.render_rows = _cairo_win32_surface_span_renderer_render_rows; - renderer->op = op; - renderer->pattern = pattern; - renderer->antialias = antialias; - renderer->dst = dst; - renderer->clip_region = clip_region; - - renderer->composite_rectangles = *rects; - - /* TODO: support rendering to A1 surfaces (or: go add span - * compositing to pixman.) */ - renderer->mask = (cairo_image_surface_t *) - cairo_image_surface_create (CAIRO_FORMAT_A8, - width, height); - - status = cairo_surface_status (&renderer->mask->base); - - if (status != CAIRO_STATUS_SUCCESS) { - _cairo_win32_surface_span_renderer_destroy (renderer); - return _cairo_span_renderer_create_in_error (status); - } - - renderer->mask_data = renderer->mask->data - rects->bounded.x - rects->bounded.y * renderer->mask->stride; - renderer->mask_stride = renderer->mask->stride; - return &renderer->base; -} - - static const cairo_surface_backend_t cairo_win32_surface_backend = { CAIRO_SURFACE_TYPE_WIN32, _cairo_win32_surface_finish, @@ -2158,32 +1939,23 @@ static const cairo_surface_backend_t cairo_win32_surface_backend = { _cairo_win32_surface_acquire_source_image, _cairo_win32_surface_release_source_image, - _cairo_win32_surface_acquire_dest_image, - _cairo_win32_surface_release_dest_image, - NULL, /* clone similar */ - _cairo_win32_surface_composite, - _cairo_win32_surface_fill_rectangles, - NULL, /* composite_trapezoids */ - _cairo_win32_surface_create_span_renderer, - _cairo_win32_surface_check_span_renderer, + NULL, /* snapshot */ + NULL, /* copy_page */ NULL, /* show_page */ + _cairo_win32_surface_get_extents, - NULL, /* old_show_glyphs */ NULL, /* get_font_options */ + _cairo_win32_surface_flush, NULL, /* mark_dirty_rectangle */ - NULL, /* scaled_font_fini */ - NULL, /* scaled_glyph_fini */ NULL, /* paint */ NULL, /* mask */ NULL, /* stroke */ NULL, /* fill */ + NULL, /* fill/stroke */ _cairo_win32_surface_show_glyphs, - - NULL, /* snapshot */ - _cairo_win32_surface_is_similar, }; /* Notes: