From 681424cbaf94556bf1804547b42ad642c0a066ab Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 25 Sep 2008 10:40:32 +0100 Subject: [PATCH] [analysis] Merge two analysis status codes. Since there is an implicit precedence in the ranking of the analysis return codes, provide a function to centralize the logic within the analysis surface and isolate the backends from the complexity. --- src/cairo-analysis-surface-private.h | 3 ++ src/cairo-analysis-surface.c | 50 +++++++++++++++++++++------- src/cairo-pdf-surface.c | 31 +++++------------ 3 files changed, 50 insertions(+), 34 deletions(-) diff --git a/src/cairo-analysis-surface-private.h b/src/cairo-analysis-surface-private.h index b756a4b5a..28bfd3bf4 100644 --- a/src/cairo-analysis-surface-private.h +++ b/src/cairo-analysis-surface-private.h @@ -66,6 +66,9 @@ cairo_private void _cairo_analysis_surface_get_bounding_box (cairo_surface_t *surface, cairo_box_t *bbox); +cairo_private cairo_int_status_t +_cairo_analysis_surface_merge_status (cairo_int_status_t status_a, + cairo_int_status_t status_b); cairo_private cairo_surface_t * _cairo_null_surface_create (cairo_content_t content); diff --git a/src/cairo-analysis-surface.c b/src/cairo-analysis-surface.c index ed3c9ef41..c33260d23 100644 --- a/src/cairo-analysis-surface.c +++ b/src/cairo-analysis-surface.c @@ -62,6 +62,38 @@ typedef struct { } cairo_analysis_surface_t; +cairo_int_status_t +_cairo_analysis_surface_merge_status (cairo_int_status_t status_a, + cairo_int_status_t status_b) +{ + /* fatal errors should be checked and propagated at source */ + assert (! _cairo_status_is_error (status_a)); + assert (! _cairo_status_is_error (status_b)); + + /* return the most important status */ + if (status_a == CAIRO_INT_STATUS_UNSUPPORTED || + status_b == CAIRO_INT_STATUS_UNSUPPORTED) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (status_a == CAIRO_INT_STATUS_IMAGE_FALLBACK || + status_b == CAIRO_INT_STATUS_IMAGE_FALLBACK) + return CAIRO_INT_STATUS_IMAGE_FALLBACK; + + if (status_a == CAIRO_INT_STATUS_ANALYZE_META_SURFACE_PATTERN || + status_b == CAIRO_INT_STATUS_ANALYZE_META_SURFACE_PATTERN) + return CAIRO_INT_STATUS_ANALYZE_META_SURFACE_PATTERN; + + if (status_a == CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY || + status_b == CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY) + return CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY; + + /* at this point we have checked all the valid internal codes, so... */ + assert (status_a == CAIRO_STATUS_SUCCESS && + status_b == CAIRO_STATUS_SUCCESS); + + return CAIRO_STATUS_SUCCESS; +} + static cairo_int_status_t _analyze_meta_surface_pattern (cairo_analysis_surface_t *surface, cairo_pattern_t *pattern) @@ -349,8 +381,7 @@ _cairo_analysis_surface_mask (void *abstract_surface, if (_cairo_surface_is_meta (surface_pattern->surface)) { backend_source_status = _analyze_meta_surface_pattern (surface, source); - if (backend_source_status != CAIRO_STATUS_SUCCESS && - backend_source_status != CAIRO_INT_STATUS_IMAGE_FALLBACK) + if (_cairo_status_is_error (backend_source_status)) return backend_source_status; } } @@ -360,19 +391,14 @@ _cairo_analysis_surface_mask (void *abstract_surface, if (_cairo_surface_is_meta (surface_pattern->surface)) { backend_mask_status = _analyze_meta_surface_pattern (surface, mask); - if (backend_mask_status != CAIRO_STATUS_SUCCESS && - backend_mask_status != CAIRO_INT_STATUS_IMAGE_FALLBACK) - return backend_status; + if (_cairo_status_is_error (backend_mask_status)) + return backend_mask_status; } } - backend_status = CAIRO_STATUS_SUCCESS; - - if (backend_source_status == CAIRO_INT_STATUS_IMAGE_FALLBACK || - backend_mask_status == CAIRO_INT_STATUS_IMAGE_FALLBACK) - { - backend_status = CAIRO_INT_STATUS_IMAGE_FALLBACK; - } + backend_status = + _cairo_analysis_surface_merge_status (backend_source_status, + backend_mask_status); } status = _cairo_surface_get_extents (&surface->base, &extents); diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c index 0c6b219f0..16abab336 100644 --- a/src/cairo-pdf-surface.c +++ b/src/cairo-pdf-surface.c @@ -44,10 +44,11 @@ #include "cairo-pdf.h" #include "cairo-pdf-surface-private.h" #include "cairo-pdf-operators-private.h" -#include "cairo-scaled-font-subsets-private.h" -#include "cairo-paginated-private.h" -#include "cairo-output-stream-private.h" +#include "cairo-analysis-surface-private.h" #include "cairo-meta-surface-private.h" +#include "cairo-output-stream-private.h" +#include "cairo-paginated-private.h" +#include "cairo-scaled-font-subsets-private.h" #include "cairo-type3-glyph-surface-private.h" #include @@ -4475,30 +4476,16 @@ _cairo_pdf_surface_mask (void *abstract_surface, if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) { cairo_status_t source_status, mask_status; - source_status = _cairo_pdf_surface_analyze_operation (surface, op, source); - if (source_status != CAIRO_STATUS_SUCCESS && - source_status < CAIRO_INT_STATUS_UNSUPPORTED) + source_status = _cairo_pdf_surface_analyze_operation (surface, op, source); + if (_cairo_status_is_error (source_status)) return source_status; mask_status = _cairo_pdf_surface_analyze_operation (surface, op, mask); - if (mask_status != CAIRO_STATUS_SUCCESS && - mask_status < CAIRO_INT_STATUS_UNSUPPORTED) + if (_cairo_status_is_error (mask_status)) return mask_status; - /* return the most important status from either the source or mask */ - if (source_status == CAIRO_INT_STATUS_UNSUPPORTED || - mask_status == CAIRO_INT_STATUS_UNSUPPORTED) - return CAIRO_INT_STATUS_UNSUPPORTED; - - if (source_status == CAIRO_INT_STATUS_IMAGE_FALLBACK || - mask_status == CAIRO_INT_STATUS_IMAGE_FALLBACK) - return CAIRO_INT_STATUS_IMAGE_FALLBACK; - - if (source_status == CAIRO_INT_STATUS_ANALYZE_META_SURFACE_PATTERN || - mask_status == CAIRO_INT_STATUS_ANALYZE_META_SURFACE_PATTERN) - return CAIRO_INT_STATUS_ANALYZE_META_SURFACE_PATTERN; - - return CAIRO_STATUS_SUCCESS; + return _cairo_analysis_surface_merge_status (source_status, + mask_status); } else if (surface->paginated_mode == CAIRO_PAGINATED_MODE_FALLBACK) { status = _cairo_pdf_surface_start_fallback (surface); if (status)