[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.
This commit is contained in:
Chris Wilson 2008-09-25 10:40:32 +01:00
parent 06f0cc81d2
commit 681424cbaf
3 changed files with 50 additions and 34 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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 <time.h>
@ -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)