diff --git a/gfx/cairo/cairo/src/cairo-analysis-surface.c b/gfx/cairo/cairo/src/cairo-analysis-surface.c index dcf10a0602e7..96b43285d046 100644 --- a/gfx/cairo/cairo/src/cairo-analysis-surface.c +++ b/gfx/cairo/cairo/src/cairo-analysis-surface.c @@ -272,13 +272,14 @@ static void _rectangle_intersect_clip (cairo_rectangle_int_t *extents, cairo_clip_t *clip) { const cairo_rectangle_int_t *clip_extents; + cairo_bool_t is_empty; clip_extents = NULL; if (clip != NULL) clip_extents = _cairo_clip_get_extents (clip); if (clip_extents != NULL) - _cairo_rectangle_intersect (extents, clip_extents); + is_empty = _cairo_rectangle_intersect (extents, clip_extents); } static void @@ -288,14 +289,15 @@ _cairo_analysis_surface_operation_extents (cairo_analysis_surface_t *surface, cairo_clip_t *clip, cairo_rectangle_int_t *extents) { + cairo_bool_t is_empty; - _cairo_surface_get_extents (&surface->base, extents); + is_empty = _cairo_surface_get_extents (&surface->base, extents); if (_cairo_operator_bounded_by_source (op)) { cairo_rectangle_int_t source_extents; _cairo_pattern_get_extents (source, &source_extents); - _cairo_rectangle_intersect (extents, &source_extents); + is_empty = _cairo_rectangle_intersect (extents, &source_extents); } _rectangle_intersect_clip (extents, clip); @@ -341,6 +343,7 @@ _cairo_analysis_surface_mask (void *abstract_surface, cairo_analysis_surface_t *surface = abstract_surface; cairo_int_status_t backend_status; cairo_rectangle_int_t extents; + cairo_bool_t is_empty; if (surface->target->backend->mask == NULL) { backend_status = CAIRO_INT_STATUS_UNSUPPORTED; @@ -389,7 +392,7 @@ _cairo_analysis_surface_mask (void *abstract_surface, cairo_rectangle_int_t mask_extents; _cairo_pattern_get_extents (mask, &mask_extents); - _cairo_rectangle_intersect (&extents, &mask_extents); + is_empty = _cairo_rectangle_intersect (&extents, &mask_extents); } @@ -411,6 +414,7 @@ _cairo_analysis_surface_stroke (void *abstract_surface, cairo_analysis_surface_t *surface = abstract_surface; cairo_status_t backend_status; cairo_rectangle_int_t extents; + cairo_bool_t is_empty; if (surface->target->backend->stroke == NULL) { backend_status = CAIRO_INT_STATUS_UNSUPPORTED; @@ -456,7 +460,7 @@ _cairo_analysis_surface_stroke (void *abstract_surface, return status; } - _cairo_rectangle_intersect (&extents, &mask_extents); + is_empty = _cairo_rectangle_intersect (&extents, &mask_extents); } return _add_operation (surface, &extents, backend_status); @@ -475,6 +479,7 @@ _cairo_analysis_surface_fill (void *abstract_surface, cairo_analysis_surface_t *surface = abstract_surface; cairo_status_t backend_status; cairo_rectangle_int_t extents; + cairo_bool_t is_empty; if (surface->target->backend->fill == NULL) { backend_status = CAIRO_INT_STATUS_UNSUPPORTED; @@ -508,7 +513,7 @@ _cairo_analysis_surface_fill (void *abstract_surface, _cairo_path_fixed_fill_extents (path, fill_rule, tolerance, &mask_extents); } - _cairo_rectangle_intersect (&extents, &mask_extents); + is_empty = _cairo_rectangle_intersect (&extents, &mask_extents); } return _add_operation (surface, &extents, backend_status); @@ -527,6 +532,7 @@ _cairo_analysis_surface_show_glyphs (void *abstract_surface, cairo_analysis_surface_t *surface = abstract_surface; cairo_status_t status, backend_status; cairo_rectangle_int_t extents, glyph_extents; + cairo_bool_t is_empty; /* Adapted from _cairo_surface_show_glyphs */ if (surface->target->backend->show_glyphs != NULL) { @@ -575,7 +581,7 @@ _cairo_analysis_surface_show_glyphs (void *abstract_surface, if (unlikely (status)) return status; - _cairo_rectangle_intersect (&extents, &glyph_extents); + is_empty = _cairo_rectangle_intersect (&extents, &glyph_extents); } return _add_operation (surface, &extents, backend_status); @@ -606,6 +612,7 @@ _cairo_analysis_surface_show_text_glyphs (void *abstract_surface, cairo_analysis_surface_t *surface = abstract_surface; cairo_status_t status, backend_status; cairo_rectangle_int_t extents, glyph_extents; + cairo_bool_t is_empty; /* Adapted from _cairo_surface_show_glyphs */ backend_status = CAIRO_INT_STATUS_UNSUPPORTED; @@ -658,7 +665,7 @@ _cairo_analysis_surface_show_text_glyphs (void *abstract_surface, if (unlikely (status)) return status; - _cairo_rectangle_intersect (&extents, &glyph_extents); + is_empty = _cairo_rectangle_intersect (&extents, &glyph_extents); } return _add_operation (surface, &extents, backend_status); diff --git a/gfx/cairo/cairo/src/cairo-clip.c b/gfx/cairo/cairo/src/cairo-clip.c index e4155b2647ca..0ebe9b207d78 100644 --- a/gfx/cairo/cairo/src/cairo-clip.c +++ b/gfx/cairo/cairo/src/cairo-clip.c @@ -368,6 +368,7 @@ _cairo_clip_path_reapply_clip_path_transform (cairo_clip_t *clip, { cairo_status_t status; cairo_clip_path_t *clip_path; + cairo_bool_t is_empty; if (other_path->prev != NULL) { status = _cairo_clip_path_reapply_clip_path_transform (clip, @@ -393,7 +394,7 @@ _cairo_clip_path_reapply_clip_path_transform (cairo_clip_t *clip, _cairo_path_fixed_approximate_clip_extents (&clip_path->path, &clip_path->extents); if (clip_path->prev != NULL) { - _cairo_rectangle_intersect (&clip_path->extents, + is_empty = _cairo_rectangle_intersect (&clip_path->extents, &clip_path->prev->extents); } @@ -515,9 +516,10 @@ static cairo_status_t _cairo_clip_apply_clip_path (cairo_clip_t *clip, const cairo_clip_path_t *path) { + cairo_status_t status; if (path->prev != NULL) - _cairo_clip_apply_clip_path (clip, path->prev); + status = _cairo_clip_apply_clip_path (clip, path->prev); return _cairo_clip_intersect_path (clip, &path->path, @@ -1406,6 +1408,7 @@ intersect_with_boxes (cairo_composite_rectangles_t *extents, { cairo_rectangle_int_t rect; cairo_box_t box; + cairo_bool_t is_empty; box.p1.x = box.p1.y = INT_MIN; box.p2.x = box.p2.y = INT_MAX; @@ -1422,8 +1425,8 @@ intersect_with_boxes (cairo_composite_rectangles_t *extents, } _cairo_box_round_to_rectangle (&box, &rect); - _cairo_rectangle_intersect (&extents->bounded, &rect); - _cairo_rectangle_intersect (&extents->unbounded, &rect); + is_empty = _cairo_rectangle_intersect (&extents->bounded, &rect); + is_empty = _cairo_rectangle_intersect (&extents->unbounded, &rect); } cairo_status_t diff --git a/gfx/cairo/cairo/src/cairo-ft-font.c b/gfx/cairo/cairo/src/cairo-ft-font.c index 5bb5e6ceefe7..e51923a5dbd0 100644 --- a/gfx/cairo/cairo/src/cairo-ft-font.c +++ b/gfx/cairo/cairo/src/cairo-ft-font.c @@ -736,6 +736,7 @@ _compute_transform (cairo_ft_font_transform_t *sf, double min_distance = DBL_MAX; cairo_bool_t magnify = TRUE; int i; + int best_i = 0; double best_x_size = 0; double best_y_size = 0; @@ -754,6 +755,7 @@ _compute_transform (cairo_ft_font_transform_t *sf, if ((magnify && distance >= 0) || fabs (distance) <= min_distance) { magnify = distance < 0; min_distance = fabs (distance); + best_i = i; best_x_size = x_size; best_y_size = y_size; } diff --git a/gfx/cairo/cairo/src/cairo-gstate.c b/gfx/cairo/cairo/src/cairo-gstate.c index a6fb9cb901e3..cb07b511f2b9 100644 --- a/gfx/cairo/cairo/src/cairo-gstate.c +++ b/gfx/cairo/cairo/src/cairo-gstate.c @@ -1509,8 +1509,10 @@ _cairo_gstate_int_clip_extents (cairo_gstate_t *gstate, clip_extents = _cairo_clip_get_extents (&gstate->clip); if (clip_extents != NULL) { - _cairo_rectangle_intersect (extents, clip_extents); - is_bounded = TRUE; + cairo_bool_t is_empty; + + is_empty = _cairo_rectangle_intersect (extents, clip_extents); + is_bounded = TRUE; } return is_bounded; diff --git a/gfx/cairo/cairo/src/cairo-pattern.c b/gfx/cairo/cairo/src/cairo-pattern.c index e29f9cc9782d..0c51804f8cde 100644 --- a/gfx/cairo/cairo/src/cairo-pattern.c +++ b/gfx/cairo/cairo/src/cairo-pattern.c @@ -1335,6 +1335,7 @@ _cairo_pattern_acquire_surface_for_gradient (const cairo_gradient_pattern_t *pat pixman_transform_t pixman_transform; cairo_status_t status; cairo_bool_t repeat = FALSE; + cairo_bool_t opaque = TRUE; pixman_gradient_stop_t pixman_stops_static[2]; pixman_gradient_stop_t *pixman_stops = pixman_stops_static; @@ -1358,6 +1359,8 @@ _cairo_pattern_acquire_surface_for_gradient (const cairo_gradient_pattern_t *pat pixman_stops[i].color.green = pattern->stops[i].color.green_short; pixman_stops[i].color.blue = pattern->stops[i].color.blue_short; pixman_stops[i].color.alpha = pattern->stops[i].color.alpha_short; + if (! CAIRO_ALPHA_SHORT_IS_OPAQUE (pixman_stops[i].color.alpha)) + opaque = FALSE; } if (pattern->base.type == CAIRO_PATTERN_TYPE_LINEAR) @@ -2114,6 +2117,7 @@ _cairo_pattern_acquire_surface_for_surface (const cairo_surface_pattern_t *pat int tx, ty; double pad; cairo_bool_t is_identity; + cairo_bool_t is_empty; cairo_bool_t is_bounded; cairo_int_status_t status; @@ -2284,7 +2288,7 @@ _cairo_pattern_acquire_surface_for_surface (const cairo_surface_pattern_t *pat if ( _cairo_surface_get_extents (surface, &extents)) { if (attr->extend == CAIRO_EXTEND_NONE) { /* Never acquire a larger area than the source itself */ - _cairo_rectangle_intersect (&extents, &sampled_area); + is_empty = _cairo_rectangle_intersect (&extents, &sampled_area); } else { int trim = 0; @@ -2311,6 +2315,7 @@ _cairo_pattern_acquire_surface_for_surface (const cairo_surface_pattern_t *pat attr->extend = CAIRO_EXTEND_NONE; } + is_empty = extents.width == 0 || extents.height == 0; } } diff --git a/gfx/cairo/cairo/src/cairo-pdf-surface.c b/gfx/cairo/cairo/src/cairo-pdf-surface.c index 9c4a4d9ca1d0..09bd42ea0d71 100644 --- a/gfx/cairo/cairo/src/cairo-pdf-surface.c +++ b/gfx/cairo/cairo/src/cairo-pdf-surface.c @@ -314,7 +314,7 @@ _cairo_pdf_surface_create_for_stream_internal (cairo_output_stream_t *output, double height) { cairo_pdf_surface_t *surface; - cairo_status_t status; + cairo_status_t status, status_ignored; surface = malloc (sizeof (cairo_pdf_surface_t)); if (unlikely (surface == NULL)) { @@ -413,7 +413,7 @@ BAIL0: free (surface); /* destroy stream on behalf of caller */ - _cairo_output_stream_destroy (output); + status_ignored = _cairo_output_stream_destroy (output); return _cairo_surface_create_in_error (status); } @@ -511,36 +511,37 @@ _extract_pdf_surface (cairo_surface_t *surface, cairo_pdf_surface_t **pdf_surface) { cairo_surface_t *target; + cairo_status_t status_ignored; if (surface->status) return FALSE; if (surface->finished) { - _cairo_surface_set_error (surface, - _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + status_ignored = _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); return FALSE; } if (! _cairo_surface_is_paginated (surface)) { - _cairo_surface_set_error (surface, - _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + status_ignored = _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); return FALSE; } target = _cairo_paginated_surface_get_target (surface); if (target->status) { - _cairo_surface_set_error (surface, - target->status); + status_ignored = _cairo_surface_set_error (surface, + target->status); return FALSE; } if (target->finished) { - _cairo_surface_set_error (surface, - _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + status_ignored = _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); return FALSE; } if (! _cairo_surface_is_pdf (target)) { - _cairo_surface_set_error (surface, - _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + status_ignored = _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); return FALSE; } @@ -5359,6 +5360,15 @@ _cairo_pdf_surface_analyze_operation (cairo_pdf_surface_t *surface, return CAIRO_INT_STATUS_UNSUPPORTED; } +static cairo_bool_t +_cairo_pdf_surface_operation_supported (cairo_pdf_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *extents) +{ + return _cairo_pdf_surface_analyze_operation (surface, op, pattern, extents) != CAIRO_INT_STATUS_UNSUPPORTED; +} + static cairo_int_status_t _cairo_pdf_surface_start_fallback (cairo_pdf_surface_t *surface) { diff --git a/gfx/cairo/cairo/src/cairo-polygon.c b/gfx/cairo/cairo/src/cairo-polygon.c index 6f618802cca7..1b5fab02bae1 100644 --- a/gfx/cairo/cairo/src/cairo-polygon.c +++ b/gfx/cairo/cairo/src/cairo-polygon.c @@ -474,9 +474,10 @@ _cairo_polygon_line_to (cairo_polygon_t *polygon, cairo_status_t _cairo_polygon_close (cairo_polygon_t *polygon) { + cairo_status_t status; if (polygon->has_current_point) { - _cairo_polygon_line_to (polygon, &polygon->first_point); + status = _cairo_polygon_line_to (polygon, &polygon->first_point); polygon->has_current_point = FALSE; } diff --git a/gfx/cairo/cairo/src/cairo-ps-surface.c b/gfx/cairo/cairo/src/cairo-ps-surface.c index df330f000445..4e7fb132ba10 100644 --- a/gfx/cairo/cairo/src/cairo-ps-surface.c +++ b/gfx/cairo/cairo/src/cairo-ps-surface.c @@ -916,7 +916,7 @@ _cairo_ps_surface_create_for_stream_internal (cairo_output_stream_t *stream, double width, double height) { - cairo_status_t status; + cairo_status_t status, status_ignored; cairo_ps_surface_t *surface; surface = malloc (sizeof (cairo_ps_surface_t)); @@ -1003,13 +1003,13 @@ _cairo_ps_surface_create_for_stream_internal (cairo_output_stream_t *stream, _cairo_scaled_font_subsets_destroy (surface->font_subsets); CLEANUP_OUTPUT_STREAM: - _cairo_output_stream_destroy (surface->stream); + status_ignored = _cairo_output_stream_destroy (surface->stream); fclose (surface->tmpfile); CLEANUP_SURFACE: free (surface); CLEANUP: /* destroy stream on behalf of caller */ - _cairo_output_stream_destroy (stream); + status_ignored = _cairo_output_stream_destroy (stream); return _cairo_surface_create_in_error (status); } @@ -1118,40 +1118,41 @@ _extract_ps_surface (cairo_surface_t *surface, cairo_ps_surface_t **ps_surface) { cairo_surface_t *target; + cairo_status_t status_ignored; if (surface->status) return FALSE; if (surface->finished) { if (set_error_on_failure) - _cairo_surface_set_error (surface, - _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + status_ignored = _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); return FALSE; } if (! _cairo_surface_is_paginated (surface)) { if (set_error_on_failure) - _cairo_surface_set_error (surface, - _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + status_ignored = _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); return FALSE; } target = _cairo_paginated_surface_get_target (surface); if (target->status) { if (set_error_on_failure) - _cairo_surface_set_error (surface, target->status); + status_ignored = _cairo_surface_set_error (surface, target->status); return FALSE; } if (target->finished) { if (set_error_on_failure) - _cairo_surface_set_error (surface, - _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + status_ignored = _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); return FALSE; } if (! _cairo_surface_is_ps (target)) { if (set_error_on_failure) - _cairo_surface_set_error (surface, - _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + status_ignored = _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); return FALSE; } @@ -1815,6 +1816,15 @@ _cairo_ps_surface_analyze_operation (cairo_ps_surface_t *surface, return CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY; } +static cairo_bool_t +_cairo_ps_surface_operation_supported (cairo_ps_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *extents) +{ + return _cairo_ps_surface_analyze_operation (surface, op, pattern, extents) != CAIRO_INT_STATUS_UNSUPPORTED; +} + /* The "standard" implementation limit for PostScript string sizes is * 65535 characters (see PostScript Language Reference, Appendix * B). We go one short of that because we sometimes need two @@ -3766,11 +3776,12 @@ _cairo_ps_surface_set_paginated_mode (void *abstract_surface, cairo_paginated_mode_t paginated_mode) { cairo_ps_surface_t *surface = abstract_surface; + cairo_status_t status; surface->paginated_mode = paginated_mode; if (surface->clipper.clip.path != NULL) { - _cairo_pdf_operators_flush (&surface->pdf_operators); + status = _cairo_pdf_operators_flush (&surface->pdf_operators); _cairo_output_stream_printf (surface->stream, "Q q\n"); _cairo_surface_clipper_reset (&surface->clipper); diff --git a/gfx/cairo/cairo/src/cairo-surface.c b/gfx/cairo/cairo/src/cairo-surface.c index 5fe3a40dea39..b57b944b8dcd 100644 --- a/gfx/cairo/cairo/src/cairo-surface.c +++ b/gfx/cairo/cairo/src/cairo-surface.c @@ -371,6 +371,15 @@ _cairo_surface_has_snapshot (cairo_surface_t *surface, return NULL; } +static cairo_bool_t +_cairo_surface_is_writable (cairo_surface_t *surface) +{ + return ! surface->finished && + surface->snapshot_of == NULL && + ! _cairo_surface_has_snapshots (surface) && + ! _cairo_surface_has_mime_data (surface); +} + static void _cairo_surface_begin_modification (cairo_surface_t *surface) { @@ -1020,6 +1029,7 @@ void _cairo_surface_set_font_options (cairo_surface_t *surface, cairo_font_options_t *options) { + cairo_status_t status; if (surface->status) return; @@ -1027,8 +1037,8 @@ _cairo_surface_set_font_options (cairo_surface_t *surface, assert (surface->snapshot_of == NULL); if (surface->finished) { - _cairo_surface_set_error (surface, - _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + status = _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); return; } @@ -1216,7 +1226,7 @@ _cairo_surface_set_device_scale (cairo_surface_t *surface, assert (surface->snapshot_of == NULL); if (surface->finished) { - _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + status = _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); return; } @@ -1266,7 +1276,7 @@ cairo_surface_set_device_offset (cairo_surface_t *surface, assert (surface->snapshot_of == NULL); if (surface->finished) { - _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + status = _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); return; } @@ -1353,7 +1363,7 @@ cairo_surface_set_fallback_resolution (cairo_surface_t *surface, assert (surface->snapshot_of == NULL); if (surface->finished) { - _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + status = _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); return; } @@ -2473,6 +2483,7 @@ _cairo_surface_check_span_renderer (cairo_operator_t op, void cairo_surface_copy_page (cairo_surface_t *surface) { + cairo_status_t status_ignored; if (surface->status) return; @@ -2480,8 +2491,8 @@ cairo_surface_copy_page (cairo_surface_t *surface) assert (surface->snapshot_of == NULL); if (surface->finished) { - _cairo_surface_set_error (surface, - CAIRO_STATUS_SURFACE_FINISHED); + status_ignored = _cairo_surface_set_error (surface, + CAIRO_STATUS_SURFACE_FINISHED); return; } @@ -2489,8 +2500,8 @@ cairo_surface_copy_page (cairo_surface_t *surface) if (surface->backend->copy_page == NULL) return; - _cairo_surface_set_error (surface, - surface->backend->copy_page (surface)); + status_ignored = _cairo_surface_set_error (surface, + surface->backend->copy_page (surface)); } slim_hidden_def (cairo_surface_copy_page); @@ -2509,13 +2520,14 @@ slim_hidden_def (cairo_surface_copy_page); void cairo_surface_show_page (cairo_surface_t *surface) { + cairo_status_t status_ignored; if (surface->status) return; if (surface->finished) { - _cairo_surface_set_error (surface, - CAIRO_STATUS_SURFACE_FINISHED); + status_ignored = _cairo_surface_set_error (surface, + CAIRO_STATUS_SURFACE_FINISHED); return; } @@ -2525,8 +2537,8 @@ cairo_surface_show_page (cairo_surface_t *surface) if (surface->backend->show_page == NULL) return; - _cairo_surface_set_error (surface, - surface->backend->show_page (surface)); + status_ignored = _cairo_surface_set_error (surface, + surface->backend->show_page (surface)); } slim_hidden_def (cairo_surface_show_page); @@ -2594,13 +2606,14 @@ _cairo_surface_get_extents (cairo_surface_t *surface, cairo_bool_t cairo_surface_has_show_text_glyphs (cairo_surface_t *surface) { + cairo_status_t status_ignored; if (surface->status) return FALSE; if (surface->finished) { - _cairo_surface_set_error (surface, - CAIRO_STATUS_SURFACE_FINISHED); + status_ignored = _cairo_surface_set_error (surface, + CAIRO_STATUS_SURFACE_FINISHED); return FALSE; } @@ -3107,14 +3120,15 @@ _cairo_surface_operation_extents (cairo_surface_t *surface, cairo_clip_t *clip, cairo_rectangle_int_t *extents) { + cairo_bool_t is_empty; - _cairo_surface_get_extents (surface, extents); + is_empty = _cairo_surface_get_extents (surface, extents); if (_cairo_operator_bounded_by_source (op)) { cairo_rectangle_int_t source_extents; _cairo_pattern_get_extents (source, &source_extents); - _cairo_rectangle_intersect (extents, &source_extents); + is_empty = _cairo_rectangle_intersect (extents, &source_extents); } _rectangle_intersect_clip (extents, clip); @@ -3139,6 +3153,7 @@ _cairo_surface_mask_extents (cairo_surface_t *surface, cairo_clip_t *clip, cairo_rectangle_int_t *extents) { + cairo_bool_t is_empty; _cairo_surface_operation_extents (surface, op, source, clip, extents); @@ -3146,7 +3161,7 @@ _cairo_surface_mask_extents (cairo_surface_t *surface, cairo_rectangle_int_t mask_extents; _cairo_pattern_get_extents (mask, &mask_extents); - _cairo_rectangle_intersect (extents, &mask_extents); + is_empty = _cairo_rectangle_intersect (extents, &mask_extents); } return CAIRO_STATUS_SUCCESS; @@ -3166,6 +3181,7 @@ _cairo_surface_stroke_extents (cairo_surface_t *surface, cairo_rectangle_int_t *extents) { cairo_status_t status; + cairo_bool_t is_empty; _cairo_surface_operation_extents (surface, op, source, clip, extents); @@ -3179,7 +3195,7 @@ _cairo_surface_stroke_extents (cairo_surface_t *surface, if (unlikely (status)) return status; - _cairo_rectangle_intersect (extents, &mask_extents); + is_empty = _cairo_rectangle_intersect (extents, &mask_extents); } return CAIRO_STATUS_SUCCESS; @@ -3196,6 +3212,7 @@ _cairo_surface_fill_extents (cairo_surface_t *surface, cairo_clip_t *clip, cairo_rectangle_int_t *extents) { + cairo_bool_t is_empty; _cairo_surface_operation_extents (surface, op, source, clip, extents); @@ -3204,7 +3221,7 @@ _cairo_surface_fill_extents (cairo_surface_t *surface, _cairo_path_fixed_fill_extents (path, fill_rule, tolerance, &mask_extents); - _cairo_rectangle_intersect (extents, &mask_extents); + is_empty = _cairo_rectangle_intersect (extents, &mask_extents); } return CAIRO_STATUS_SUCCESS; @@ -3221,6 +3238,7 @@ _cairo_surface_glyphs_extents (cairo_surface_t *surface, cairo_rectangle_int_t *extents) { cairo_status_t status; + cairo_bool_t is_empty; _cairo_surface_operation_extents (surface, op, source, clip, extents); @@ -3235,7 +3253,7 @@ _cairo_surface_glyphs_extents (cairo_surface_t *surface, if (unlikely (status)) return status; - _cairo_rectangle_intersect (extents, &glyph_extents); + is_empty = _cairo_rectangle_intersect (extents, &glyph_extents); } return CAIRO_STATUS_SUCCESS; diff --git a/gfx/cairo/cairo/src/cairo-tee-surface.c b/gfx/cairo/cairo/src/cairo-tee-surface.c index 870aba0f3eaf..bca07716f5b8 100644 --- a/gfx/cairo/cairo/src/cairo-tee-surface.c +++ b/gfx/cairo/cairo/src/cairo-tee-surface.c @@ -605,25 +605,26 @@ cairo_tee_surface_remove (cairo_surface_t *abstract_surface, cairo_tee_surface_t *surface; cairo_surface_wrapper_t *slaves; int n, num_slaves; + cairo_status_t status; if (unlikely (abstract_surface->status)) return; if (unlikely (abstract_surface->finished)) { - _cairo_surface_set_error (abstract_surface, - _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + status = _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); return; } if (abstract_surface->backend != &cairo_tee_surface_backend) { - _cairo_surface_set_error (abstract_surface, - _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + status = _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); return; } surface = (cairo_tee_surface_t *) abstract_surface; if (target == surface->master.target) { - _cairo_surface_set_error (abstract_surface, - _cairo_error (CAIRO_STATUS_INVALID_INDEX)); + status = _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_INVALID_INDEX)); return; } @@ -635,8 +636,8 @@ cairo_tee_surface_remove (cairo_surface_t *abstract_surface, } if (n == num_slaves) { - _cairo_surface_set_error (abstract_surface, - _cairo_error (CAIRO_STATUS_INVALID_INDEX)); + status = _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_INVALID_INDEX)); return; } diff --git a/gfx/cairo/cairo/src/cairo-truetype-subset.c b/gfx/cairo/cairo/src/cairo-truetype-subset.c index add30e8602c7..9bf2f8ffc677 100644 --- a/gfx/cairo/cairo/src/cairo-truetype-subset.c +++ b/gfx/cairo/cairo/src/cairo-truetype-subset.c @@ -1177,6 +1177,7 @@ _cairo_truetype_reverse_cmap (cairo_scaled_font_t *scaled_font, uint16_t *end_code; uint16_t *delta; uint16_t *range_offset; + uint16_t *glyph_array; uint16_t c; backend = scaled_font->backend; @@ -1216,6 +1217,7 @@ _cairo_truetype_reverse_cmap (cairo_scaled_font_t *scaled_font, start_code = &(end_code[num_segments + 1]); delta = &(start_code[num_segments]); range_offset = &(delta[num_segments]); + glyph_array = &(range_offset[num_segments]); /* search for glyph in segments with rangeOffset=0 */ for (i = 0; i < num_segments; i++) { diff --git a/gfx/cairo/cairo/src/cairo-type1-subset.c b/gfx/cairo/cairo/src/cairo-type1-subset.c index 1d7b8f272ded..ffa9bfb8fad4 100644 --- a/gfx/cairo/cairo/src/cairo-type1-subset.c +++ b/gfx/cairo/cairo/src/cairo-type1-subset.c @@ -1010,7 +1010,7 @@ cairo_type1_font_subset_write_private_dict (cairo_type1_font_subset_t *font, const char *p, *charstrings, *dict_start; const char *closefile_token; char buffer[32], *glyph_count_end; - int length; + int num_charstrings, length; /* The private dict holds hint information, common subroutines and * the actual glyph definitions (charstrings). @@ -1034,7 +1034,7 @@ cairo_type1_font_subset_write_private_dict (cairo_type1_font_subset_t *font, /* Scan past /CharStrings and the integer following it. */ p = charstrings + strlen ("/CharStrings"); - strtol (p, &glyph_count_end, 10); + num_charstrings = strtol (p, &glyph_count_end, 10); if (p == glyph_count_end) return CAIRO_INT_STATUS_UNSUPPORTED; @@ -1311,7 +1311,7 @@ _cairo_type1_subset_init (cairo_type1_subset_t *type1_subset, cairo_bool_t hex_encode) { cairo_type1_font_subset_t font; - cairo_status_t status; + cairo_status_t status, status_ignored; unsigned long parent_glyph, length; unsigned int i; cairo_unscaled_font_t *unscaled_font; @@ -1387,7 +1387,7 @@ _cairo_type1_subset_init (cairo_type1_subset_t *type1_subset, fail2: free (type1_subset->base_font); fail1: - _cairo_type1_font_subset_fini (&font); + status_ignored = _cairo_type1_font_subset_fini (&font); return status; } diff --git a/gfx/cairo/cairo/src/cairo-xlib-surface.c b/gfx/cairo/cairo/src/cairo-xlib-surface.c index d5b3acbf9f05..e24c9627a66c 100644 --- a/gfx/cairo/cairo/src/cairo-xlib-surface.c +++ b/gfx/cairo/cairo/src/cairo-xlib-surface.c @@ -3529,24 +3529,25 @@ cairo_xlib_surface_set_size (cairo_surface_t *abstract_surface, int height) { cairo_xlib_surface_t *surface = (cairo_xlib_surface_t *) abstract_surface; + cairo_status_t status; if (unlikely (abstract_surface->status)) return; if (unlikely (abstract_surface->finished)) { - _cairo_surface_set_error (abstract_surface, - _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + status = _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); return; } if (! _cairo_surface_is_xlib (abstract_surface)) { - _cairo_surface_set_error (abstract_surface, - _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + status = _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); return; } if (width > XLIB_COORD_MAX || height > XLIB_COORD_MAX) { - _cairo_surface_set_error (abstract_surface, - _cairo_error (CAIRO_STATUS_INVALID_SIZE)); + status = _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_INVALID_SIZE)); return; } diff --git a/gfx/cairo/cairo/src/cairo.c b/gfx/cairo/cairo/src/cairo.c index e79b4c77745e..eeee0206e4b7 100644 --- a/gfx/cairo/cairo/src/cairo.c +++ b/gfx/cairo/cairo/src/cairo.c @@ -701,14 +701,15 @@ cairo_push_group_with_content (cairo_t *cr, cairo_content_t content) const cairo_rectangle_int_t *clip_extents; cairo_rectangle_int_t extents; cairo_matrix_t matrix; + cairo_bool_t is_empty; parent_surface = _cairo_gstate_get_target (cr->gstate); /* Get the extents that we'll use in creating our new group surface */ - _cairo_surface_get_extents (parent_surface, &extents); + is_empty = _cairo_surface_get_extents (parent_surface, &extents); clip_extents = _cairo_clip_get_extents (_cairo_gstate_get_clip (cr->gstate)); if (clip_extents != NULL) - _cairo_rectangle_intersect (&extents, clip_extents); + is_empty = _cairo_rectangle_intersect (&extents, clip_extents); group_surface = _cairo_surface_create_similar_solid (parent_surface, content, @@ -3199,6 +3200,7 @@ cairo_set_scaled_font (cairo_t *cr, const cairo_scaled_font_t *scaled_font) { cairo_status_t status; + cairo_bool_t was_previous; if (unlikely (cr->status)) return; @@ -3215,6 +3217,7 @@ cairo_set_scaled_font (cairo_t *cr, if (scaled_font == cr->gstate->scaled_font) return; + was_previous = scaled_font == cr->gstate->previous_scaled_font; status = _cairo_gstate_set_font_face (cr->gstate, scaled_font->font_face); if (unlikely (status)) @@ -3226,6 +3229,13 @@ cairo_set_scaled_font (cairo_t *cr, _cairo_gstate_set_font_options (cr->gstate, &scaled_font->options); + /* XXX: Mozilla code assumes that the ctm of a scaled font doesn't need to + * match the context ctm. This assumption breaks the previous_scaled_font + * cache. So we avoid using the cache for now. + if (was_previous) + cr->gstate->scaled_font = cairo_scaled_font_reference ((cairo_scaled_font_t *) scaled_font); + */ + return; BAIL: