Skip to content

Commit

Permalink
[analysis] Merge two analysis status codes.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Chris Wilson committed Sep 26, 2008
1 parent 06f0cc8 commit 681424c
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 34 deletions.
3 changes: 3 additions & 0 deletions src/cairo-analysis-surface-private.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
50 changes: 38 additions & 12 deletions src/cairo-analysis-surface.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
}
}
Expand All @@ -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);
Expand Down
31 changes: 9 additions & 22 deletions src/cairo-pdf-surface.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 681424c

Please sign in to comment.