mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-08 12:38:02 +02:00
[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:
parent
06f0cc81d2
commit
681424cbaf
3 changed files with 50 additions and 34 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue