summaryrefslogtreecommitdiff
path: root/src/cairo-clip-private.h
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-07-14 21:19:54 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2011-07-19 21:14:34 +0100
commitb132fae5e843c329d1414d1a65b2e8d66b99852f (patch)
tree7df5e21300eefe3abcc30616b22d7f5d3248b4d4 /src/cairo-clip-private.h
parentf58ade7bace8c82d0ea6740f56d227696181d616 (diff)
downloadcairo-b132fae5e843c329d1414d1a65b2e8d66b99852f.tar.gz
clip: Rudimentary support for clip-polygon extraction
Step 1, fix the failings sighted recently by tracking clip-boxes as an explicit property of the clipping and of composition. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/cairo-clip-private.h')
-rw-r--r--src/cairo-clip-private.h149
1 files changed, 92 insertions, 57 deletions
diff --git a/src/cairo-clip-private.h b/src/cairo-clip-private.h
index bfbb539aa..861be63cc 100644
--- a/src/cairo-clip-private.h
+++ b/src/cairo-clip-private.h
@@ -31,24 +31,21 @@
*
* Contributor(s):
* Kristian Høgsberg <krh@redhat.com>
+ * Chris Wilson <chris@chris-wilson.co.uk>
*/
#ifndef CAIRO_CLIP_PRIVATE_H
#define CAIRO_CLIP_PRIVATE_H
#include "cairo-types-private.h"
+
+#include "cairo-boxes-private.h"
#include "cairo-compiler-private.h"
#include "cairo-path-fixed-private.h"
#include "cairo-reference-count-private.h"
extern const cairo_private cairo_rectangle_list_t _cairo_rectangles_nil;
-enum {
- CAIRO_CLIP_PATH_HAS_REGION = 0x1,
- CAIRO_CLIP_PATH_REGION_IS_UNSUPPORTED = 0x2,
- CAIRO_CLIP_PATH_IS_BOX = 0x4
-};
-
struct _cairo_clip_path {
cairo_reference_count_t ref_count;
cairo_path_fixed_t path;
@@ -58,92 +55,124 @@ struct _cairo_clip_path {
cairo_clip_path_t *prev;
cairo_rectangle_int_t extents;
-
- /* partial caches */
- unsigned int flags;
- cairo_region_t *region;
- cairo_surface_t *surface;
};
struct _cairo_clip {
- /* can be used as a cairo_hash_entry_t for live clips */
+ cairo_rectangle_int_t extents;
cairo_clip_path_t *path;
- cairo_bool_t all_clipped;
+ cairo_box_t *boxes;
+ int num_boxes;
+ cairo_region_t *region;
+ cairo_bool_t is_region;
};
+cairo_private cairo_clip_t *
+_cairo_clip_create (void);
+
cairo_private void
-_cairo_clip_init (cairo_clip_t *clip);
+_cairo_clip_path_destroy (cairo_clip_path_t *clip_path);
-cairo_private_no_warn cairo_clip_t *
-_cairo_clip_init_copy (cairo_clip_t *clip, cairo_clip_t *other);
+cairo_private void
+_cairo_clip_destroy (cairo_clip_t *clip);
-cairo_private cairo_status_t
-_cairo_clip_init_copy_transformed (cairo_clip_t *clip,
- cairo_clip_t *other,
- const cairo_matrix_t *matrix);
+extern const cairo_clip_t __cairo_clip_all;
-cairo_private void
-_cairo_clip_reset (cairo_clip_t *clip);
+static inline cairo_bool_t _cairo_clip_is_all_clipped(const cairo_clip_t *clip)
+{
+ return clip == &__cairo_clip_all;
+}
-cairo_private cairo_bool_t
-_cairo_clip_equal (const cairo_clip_t *clip_a,
- const cairo_clip_t *clip_b);
+static inline cairo_clip_t *
+_cairo_clip_set_all_clipped (cairo_clip_t *clip)
+{
+ _cairo_clip_destroy (clip);
+ return (cairo_clip_t *) &__cairo_clip_all;
+}
-#define _cairo_clip_fini(clip) _cairo_clip_reset (clip)
+cairo_private cairo_clip_t *
+_cairo_clip_copy (const cairo_clip_t *clip);
-cairo_private cairo_status_t
-_cairo_clip_rectangle (cairo_clip_t *clip,
- const cairo_rectangle_int_t *rectangle);
+cairo_private cairo_clip_t *
+_cairo_clip_copy_with_translation (const cairo_clip_t *clip, int tx, int ty);
-cairo_private cairo_status_t
-_cairo_clip_clip (cairo_clip_t *clip,
- const cairo_path_fixed_t *path,
- cairo_fill_rule_t fill_rule,
- double tolerance,
- cairo_antialias_t antialias);
+cairo_private cairo_bool_t
+_cairo_clip_equal (const cairo_clip_t *clip_a,
+ const cairo_clip_t *clip_b);
-cairo_private cairo_status_t
-_cairo_clip_apply_clip (cairo_clip_t *clip,
- const cairo_clip_t *other);
+cairo_private cairo_clip_t *
+_cairo_clip_intersect_rectangle (cairo_clip_t *clip,
+ const cairo_rectangle_int_t *rectangle);
+
+static inline cairo_clip_t *
+_cairo_clip_copy_intersect_rectangle (const cairo_clip_t *clip,
+ const cairo_rectangle_int_t *r)
+{
+ return _cairo_clip_intersect_rectangle (_cairo_clip_copy (clip), r);
+}
+
+cairo_private cairo_clip_t *
+_cairo_clip_intersect_box (cairo_clip_t *clip,
+ const cairo_box_t *box);
+
+cairo_private cairo_clip_t *
+_cairo_clip_intersect_boxes (cairo_clip_t *clip,
+ const cairo_boxes_t *boxes);
+
+cairo_private cairo_clip_t *
+_cairo_clip_intersect_rectilinear_path (cairo_clip_t *clip,
+ const cairo_path_fixed_t *path,
+ cairo_fill_rule_t fill_rule,
+ cairo_antialias_t antialias);
+
+cairo_private cairo_clip_t *
+_cairo_clip_intersect_path (cairo_clip_t *clip,
+ const cairo_path_fixed_t *path,
+ cairo_fill_rule_t fill_rule,
+ double tolerance,
+ cairo_antialias_t antialias);
cairo_private const cairo_rectangle_int_t *
_cairo_clip_get_extents (const cairo_clip_t *clip);
cairo_private cairo_surface_t *
-_cairo_clip_get_surface (cairo_clip_t *clip, cairo_surface_t *dst, int *tx, int *ty);
+_cairo_clip_get_surface (const cairo_clip_t *clip, cairo_surface_t *dst, int *tx, int *ty);
cairo_private cairo_status_t
-_cairo_clip_combine_with_surface (cairo_clip_t *clip,
+_cairo_clip_combine_with_surface (const cairo_clip_t *clip,
cairo_surface_t *dst,
int dst_x, int dst_y);
-cairo_private cairo_int_status_t
-_cairo_clip_get_region (cairo_clip_t *clip,
- cairo_region_t **region);
+cairo_private cairo_status_t
+_cairo_clip_to_boxes (cairo_clip_t *clip,
+ cairo_boxes_t *boxes);
-cairo_private cairo_int_status_t
-_cairo_clip_get_boxes (cairo_clip_t *clip,
- cairo_box_t **boxes,
- int *count);
+cairo_private cairo_region_t *
+_cairo_clip_get_region (const cairo_clip_t *clip);
-cairo_private cairo_status_t
-_cairo_clip_to_boxes (cairo_clip_t **clip,
- cairo_composite_rectangles_t *extents,
- cairo_box_t **boxes,
- int *num_boxes);
+cairo_private cairo_bool_t
+_cairo_clip_is_region (const cairo_clip_t *clip);
+
+cairo_private cairo_clip_t *
+_cairo_clip_reduce_to_rectangle (const cairo_clip_t *clip,
+ const cairo_rectangle_int_t *r);
+
+cairo_private cairo_clip_t *
+_cairo_clip_reduce_for_composite (const cairo_clip_t *clip,
+ cairo_composite_rectangles_t *extents);
cairo_private cairo_bool_t
-_cairo_clip_contains_rectangle (cairo_clip_t *clip,
+_cairo_clip_contains_rectangle (const cairo_clip_t *clip,
const cairo_rectangle_int_t *rect);
cairo_private cairo_bool_t
-_cairo_clip_contains_extents (cairo_clip_t *clip,
- const cairo_composite_rectangles_t *extents);
+_cairo_clip_contains_box (const cairo_clip_t *clip,
+ const cairo_box_t *box);
-cairo_private void
-_cairo_clip_drop_cache (cairo_clip_t *clip);
+cairo_private cairo_bool_t
+_cairo_clip_contains_extents (const cairo_clip_t *clip,
+ const cairo_composite_rectangles_t *extents);
cairo_private cairo_rectangle_list_t*
_cairo_clip_copy_rectangle_list (cairo_clip_t *clip, cairo_gstate_t *gstate);
@@ -151,4 +180,10 @@ _cairo_clip_copy_rectangle_list (cairo_clip_t *clip, cairo_gstate_t *gstate);
cairo_private cairo_rectangle_list_t *
_cairo_rectangle_list_create_in_error (cairo_status_t status);
+cairo_private cairo_int_status_t
+_cairo_clip_get_polygon (const cairo_clip_t *clip,
+ cairo_polygon_t *polygon,
+ cairo_fill_rule_t *fill_rule,
+ cairo_antialias_t *antialias);
+
#endif /* CAIRO_CLIP_PRIVATE_H */