Bug 327878. Add cairo_clip_extract_rectangles, to support native theme rendering patch. r=vlad

This commit is contained in:
roc+%cs.cmu.edu 2006-02-23 00:54:18 +00:00
Родитель c985c3448f
Коммит ad5f1c79ec
7 изменённых файлов: 455 добавлений и 0 удалений

Просмотреть файл

@ -0,0 +1,312 @@
Index: gfx/cairo/cairo/src/cairo.h
===================================================================
RCS file: /home/rocallahan/mozilla-cvs-mirror/mozilla/gfx/cairo/cairo/src/cairo.h,v
retrieving revision 1.9
diff -u -t -p -1 -2 -r1.9 cairo.h
--- gfx/cairo/cairo/src/cairo.h 10 Feb 2006 02:20:34 -0000 1.9
+++ gfx/cairo/cairo/src/cairo.h 21 Feb 2006 23:17:08 -0000
@@ -1129,24 +1129,42 @@ cairo_public cairo_path_t *
cairo_copy_path (cairo_t *cr);
cairo_public cairo_path_t *
cairo_copy_path_flat (cairo_t *cr);
cairo_public void
cairo_append_path (cairo_t *cr,
cairo_path_t *path);
cairo_public void
cairo_path_destroy (cairo_path_t *path);
+/**
+ * cairo_clip_rect_t:
+ *
+ * A data structure for holding clip rectangles.
+ */
+typedef struct _cairo_clip_rect {
+ double x, y, width, height;
+} cairo_clip_rect_t;
+
+cairo_public cairo_bool_t
+cairo_has_clip (cairo_t *cr);
+
+cairo_public cairo_bool_t
+cairo_extract_clip_rectangles (cairo_t *cr,
+ int max_rectangles,
+ cairo_clip_rect_t *rectangles_out,
+ int *num_rectangles_out);
+
/* Error status queries */
cairo_public cairo_status_t
cairo_status (cairo_t *cr);
cairo_public const char *
cairo_status_to_string (cairo_status_t status);
/* Surface manipulation */
cairo_public cairo_surface_t *
cairo_surface_create_similar (cairo_surface_t *other,
Index: gfx/cairo/cairo/src/cairoint.h
===================================================================
RCS file: /home/rocallahan/mozilla-cvs-mirror/mozilla/gfx/cairo/cairo/src/cairoint.h,v
retrieving revision 1.19
diff -u -t -p -1 -2 -r1.19 cairoint.h
--- gfx/cairo/cairo/src/cairoint.h 10 Feb 2006 02:51:12 -0000 1.19
+++ gfx/cairo/cairo/src/cairoint.h 21 Feb 2006 23:18:00 -0000
@@ -1229,24 +1229,33 @@ cairo_private cairo_status_t
_cairo_gstate_in_fill (cairo_gstate_t *gstate,
cairo_path_fixed_t *path,
double x,
double y,
cairo_bool_t *inside_ret);
cairo_private cairo_status_t
_cairo_gstate_clip (cairo_gstate_t *gstate, cairo_path_fixed_t *path);
cairo_private cairo_status_t
_cairo_gstate_reset_clip (cairo_gstate_t *gstate);
+cairo_private cairo_bool_t
+_cairo_gstate_has_clip (cairo_gstate_t *gstate);
+
+cairo_private cairo_bool_t
+_cairo_gstate_extract_clip_rectangles (cairo_gstate_t *gstate,
+ int max_rectangles,
+ cairo_clip_rect_t *rectangles_out,
+ int *num_rectangles_out);
+
cairo_private cairo_status_t
_cairo_gstate_show_surface (cairo_gstate_t *gstate,
cairo_surface_t *surface,
double x,
double y,
double width,
double height);
cairo_private cairo_status_t
_cairo_gstate_select_font_face (cairo_gstate_t *gstate,
const char *family,
cairo_font_slant_t slant,
Index: gfx/cairo/cairo/src/cairo-clip-private.h
===================================================================
RCS file: /home/rocallahan/mozilla-cvs-mirror/mozilla/gfx/cairo/cairo/src/cairo-clip-private.h,v
retrieving revision 1.2
diff -u -t -p -1 -2 -r1.2 cairo-clip-private.h
--- gfx/cairo/cairo/src/cairo-clip-private.h 10 Jan 2006 22:56:38 -0000 1.2
+++ gfx/cairo/cairo/src/cairo-clip-private.h 7 Feb 2006 22:44:42 -0000
@@ -105,13 +105,22 @@ _cairo_clip_intersect_to_rectangle (cair
cairo_private cairo_status_t
_cairo_clip_intersect_to_region (cairo_clip_t *clip,
pixman_region16_t *region);
cairo_private cairo_status_t
_cairo_clip_combine_to_surface (cairo_clip_t *clip,
cairo_operator_t op,
cairo_surface_t *dst,
int dst_x,
int dst_y,
const cairo_rectangle_t *extents);
+cairo_private cairo_bool_t
+_cairo_clip_has_clip (cairo_clip_t *clip);
+
+cairo_private cairo_bool_t
+_cairo_clip_extract_rectangles (cairo_clip_t *clip,
+ int max_rectangles,
+ cairo_clip_rect_t *rectangles_out,
+ int *num_rectangles_out);
+
#endif /* CAIRO_CLIP_PRIVATE_H */
Index: gfx/cairo/cairo/src/cairo-clip.c
===================================================================
RCS file: /home/rocallahan/mozilla-cvs-mirror/mozilla/gfx/cairo/cairo/src/cairo-clip.c,v
retrieving revision 1.3
diff -u -t -p -1 -2 -r1.3 cairo-clip.c
--- gfx/cairo/cairo/src/cairo-clip.c 10 Jan 2006 22:56:38 -0000 1.3
+++ gfx/cairo/cairo/src/cairo-clip.c 21 Feb 2006 23:19:34 -0000
@@ -450,12 +450,62 @@ _cairo_clip_clip (cairo_clip_t *cl
status = _cairo_clip_intersect_region (clip, &traps, target);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
goto bail;
status = _cairo_clip_intersect_mask (clip, &traps, antialias, target);
bail:
_cairo_traps_fini (&traps);
return status;
}
+
+cairo_bool_t
+_cairo_clip_has_clip (cairo_clip_t *clip)
+{
+ return clip->region != NULL || clip->surface != NULL || clip->path != NULL;
+}
+
+static cairo_bool_t
+_cairo_region_to_clip_rectangles (pixman_region16_t *region,
+ int max_rectangles,
+ cairo_clip_rect_t *rectangles_out,
+ int *num_rectangles_out)
+{
+ int n_boxes, i;
+ pixman_box16_t *boxes;
+
+ /* no region -> we can't represent it as rectangles */
+ if (region == NULL)
+ return FALSE;
+
+ n_boxes = pixman_region_num_rects (region);
+ *num_rectangles_out = n_boxes;
+ if (n_boxes > max_rectangles)
+ return FALSE;
+
+ boxes = pixman_region_rects (region);
+
+ for (i = 0; i < n_boxes; i++) {
+ rectangles_out[i].x = boxes[i].x1;
+ rectangles_out[i].y = boxes[i].y1;
+ rectangles_out[i].width = boxes[i].x2 - boxes[i].x1;
+ rectangles_out[i].height = boxes[i].y2 - boxes[i].y1;
+ }
+
+ return TRUE;
+}
+
+cairo_bool_t
+_cairo_clip_extract_rectangles (cairo_clip_t *clip,
+ int max_rectangles,
+ cairo_clip_rect_t *rectangles_out,
+ int *num_rectangles_out)
+{
+ /* can't handle paths or surfaces for now */
+ if (clip->path != NULL || clip->surface != NULL)
+ return FALSE;
+
+ return _cairo_region_to_clip_rectangles (clip->region,
+ max_rectangles, rectangles_out, num_rectangles_out);
+}
Index: gfx/cairo/cairo/src/cairo-gstate.c
===================================================================
RCS file: /home/rocallahan/mozilla-cvs-mirror/mozilla/gfx/cairo/cairo/src/cairo-gstate.c,v
retrieving revision 1.4
diff -u -t -p -1 -2 -r1.4 cairo-gstate.c
--- gfx/cairo/cairo/src/cairo-gstate.c 10 Jan 2006 22:56:38 -0000 1.4
+++ gfx/cairo/cairo/src/cairo-gstate.c 21 Feb 2006 23:18:13 -0000
@@ -1174,24 +1174,42 @@ _cairo_gstate_reset_clip (cairo_gstate_t
{
return _cairo_clip_reset (&gstate->clip);
}
cairo_status_t
_cairo_gstate_clip (cairo_gstate_t *gstate, cairo_path_fixed_t *path)
{
return _cairo_clip_clip (&gstate->clip,
path, gstate->fill_rule, gstate->tolerance,
gstate->antialias, gstate->target);
}
+cairo_bool_t
+_cairo_gstate_has_clip (cairo_gstate_t *gstate)
+{
+ return _cairo_clip_has_clip (&gstate->clip);
+}
+
+cairo_bool_t
+_cairo_gstate_extract_clip_rectangles (cairo_gstate_t *gstate,
+ int max_rectangles,
+ cairo_clip_rect_t *rectangles_out,
+ int *num_rectangles_out)
+{
+ return _cairo_clip_extract_rectangles (&gstate->clip,
+ max_rectangles,
+ rectangles_out,
+ num_rectangles_out);
+}
+
static void
_cairo_gstate_unset_scaled_font (cairo_gstate_t *gstate)
{
if (gstate->scaled_font) {
cairo_scaled_font_destroy (gstate->scaled_font);
gstate->scaled_font = NULL;
}
}
cairo_status_t
_cairo_gstate_select_font_face (cairo_gstate_t *gstate,
const char *family,
Index: gfx/cairo/cairo/src/cairo.c
===================================================================
RCS file: /home/rocallahan/mozilla-cvs-mirror/mozilla/gfx/cairo/cairo/src/cairo.c,v
retrieving revision 1.11
diff -u -t -p -1 -2 -r1.11 cairo.c
--- gfx/cairo/cairo/src/cairo.c 10 Feb 2006 02:56:14 -0000 1.11
+++ gfx/cairo/cairo/src/cairo.c 21 Feb 2006 23:17:34 -0000
@@ -2575,24 +2575,63 @@ cairo_get_group_target (cairo_t *cr)
* with it.
**/
cairo_path_t *
cairo_copy_path (cairo_t *cr)
{
if (cr->status)
return (cairo_path_t*) &_cairo_path_nil;
return _cairo_path_data_create (&cr->path, cr->gstate);
}
/**
+ * cairo_has_clip
+ * @cr: a cairo context
+ *
+ * Returns TRUE if the cairo context has any clipping active, otherwise
+ * FALSE.
+ */
+cairo_bool_t
+cairo_has_clip (cairo_t *cr)
+{
+ if (cr->status)
+ return FALSE;
+ return _cairo_gstate_has_clip (cr->gstate);
+}
+
+/**
+ * cairo_extract_clip_rectangles
+ * @cr: a cairo context
+ * @max_rectangles: the maximum number of rectangles to be returned
+ * @rectangles_out: the output buffer for the rectangles
+ * @num_rectangles_out: the number of rectangles returned
+ *
+ * If the current clip can be expressed as the union of at most
+ * 'max_rectangles' device-coordinate rectangles, then we fill in the array
+ * with the rectangles, and return True. Otherwise we return False. When there
+ * is no clipping active, we return False.
+ */
+cairo_bool_t
+cairo_extract_clip_rectangles (cairo_t *cr,
+ int max_rectangles,
+ cairo_clip_rect_t *rectangles_out,
+ int *num_rectangles_out)
+{
+ if (cr->status)
+ return FALSE;
+ return _cairo_gstate_extract_clip_rectangles (cr->gstate, max_rectangles,
+ rectangles_out, num_rectangles_out);
+}
+
+/**
* cairo_copy_path_flat:
* @cr: a cairo context
*
* Gets a flattened copy of the current path and returns it to the
* user as a #cairo_path_t. See #cairo_path_data_t for hints on
* how to iterate over the returned data structure.
*
* This function is like cairo_copy_path() except that any curves
* in the path will be approximated with piecewise-linear
* approximations, (accurate to within the current tolerance
* value). That is, the result is guaranteed to not have any elements
* of type %CAIRO_PATH_CURVE_TO which will instead be replaced by a

Просмотреть файл

@ -114,4 +114,13 @@ _cairo_clip_combine_to_surface (cairo_clip_t *clip,
int dst_y,
const cairo_rectangle_t *extents);
cairo_private cairo_bool_t
_cairo_clip_has_clip (cairo_clip_t *clip);
cairo_private cairo_bool_t
_cairo_clip_extract_rectangles (cairo_clip_t *clip,
int max_rectangles,
cairo_clip_rect_t *rectangles_out,
int *num_rectangles_out);
#endif /* CAIRO_CLIP_PRIVATE_H */

Просмотреть файл

@ -459,3 +459,53 @@ _cairo_clip_clip (cairo_clip_t *clip,
return status;
}
cairo_bool_t
_cairo_clip_has_clip (cairo_clip_t *clip)
{
return clip->region != NULL || clip->surface != NULL || clip->path != NULL;
}
static cairo_bool_t
_cairo_region_to_clip_rectangles (pixman_region16_t *region,
int max_rectangles,
cairo_clip_rect_t *rectangles_out,
int *num_rectangles_out)
{
int n_boxes, i;
pixman_box16_t *boxes;
/* no region -> we can't represent it as rectangles */
if (region == NULL)
return FALSE;
n_boxes = pixman_region_num_rects (region);
*num_rectangles_out = n_boxes;
if (n_boxes > max_rectangles)
return FALSE;
boxes = pixman_region_rects (region);
for (i = 0; i < n_boxes; i++) {
rectangles_out[i].x = boxes[i].x1;
rectangles_out[i].y = boxes[i].y1;
rectangles_out[i].width = boxes[i].x2 - boxes[i].x1;
rectangles_out[i].height = boxes[i].y2 - boxes[i].y1;
}
return TRUE;
}
cairo_bool_t
_cairo_clip_extract_rectangles (cairo_clip_t *clip,
int max_rectangles,
cairo_clip_rect_t *rectangles_out,
int *num_rectangles_out)
{
/* can't handle paths or surfaces for now */
if (clip->path != NULL || clip->surface != NULL)
return FALSE;
return _cairo_region_to_clip_rectangles (clip->region,
max_rectangles, rectangles_out, num_rectangles_out);
}

Просмотреть файл

@ -1183,6 +1183,24 @@ _cairo_gstate_clip (cairo_gstate_t *gstate, cairo_path_fixed_t *path)
gstate->antialias, gstate->target);
}
cairo_bool_t
_cairo_gstate_has_clip (cairo_gstate_t *gstate)
{
return _cairo_clip_has_clip (&gstate->clip);
}
cairo_bool_t
_cairo_gstate_extract_clip_rectangles (cairo_gstate_t *gstate,
int max_rectangles,
cairo_clip_rect_t *rectangles_out,
int *num_rectangles_out)
{
return _cairo_clip_extract_rectangles (&gstate->clip,
max_rectangles,
rectangles_out,
num_rectangles_out);
}
static void
_cairo_gstate_unset_scaled_font (cairo_gstate_t *gstate)
{

Просмотреть файл

@ -2583,6 +2583,45 @@ cairo_copy_path (cairo_t *cr)
return _cairo_path_data_create (&cr->path, cr->gstate);
}
/**
* cairo_has_clip
* @cr: a cairo context
*
* Returns TRUE if the cairo context has any clipping active, otherwise
* FALSE.
*/
cairo_bool_t
cairo_has_clip (cairo_t *cr)
{
if (cr->status)
return FALSE;
return _cairo_gstate_has_clip (cr->gstate);
}
/**
* cairo_extract_clip_rectangles
* @cr: a cairo context
* @max_rectangles: the maximum number of rectangles to be returned
* @rectangles_out: the output buffer for the rectangles
* @num_rectangles_out: the number of rectangles returned
*
* If the current clip can be expressed as the union of at most
* 'max_rectangles' device-coordinate rectangles, then we fill in the array
* with the rectangles, and return True. Otherwise we return False. When there
* is no clipping active, we return False.
*/
cairo_bool_t
cairo_extract_clip_rectangles (cairo_t *cr,
int max_rectangles,
cairo_clip_rect_t *rectangles_out,
int *num_rectangles_out)
{
if (cr->status)
return FALSE;
return _cairo_gstate_extract_clip_rectangles (cr->gstate, max_rectangles,
rectangles_out, num_rectangles_out);
}
/**
* cairo_copy_path_flat:
* @cr: a cairo context

Просмотреть файл

@ -1138,6 +1138,24 @@ cairo_append_path (cairo_t *cr,
cairo_public void
cairo_path_destroy (cairo_path_t *path);
/**
* cairo_clip_rect_t:
*
* A data structure for holding clip rectangles.
*/
typedef struct _cairo_clip_rect {
double x, y, width, height;
} cairo_clip_rect_t;
cairo_public cairo_bool_t
cairo_has_clip (cairo_t *cr);
cairo_public cairo_bool_t
cairo_extract_clip_rectangles (cairo_t *cr,
int max_rectangles,
cairo_clip_rect_t *rectangles_out,
int *num_rectangles_out);
/* Error status queries */
cairo_public cairo_status_t

Просмотреть файл

@ -1238,6 +1238,15 @@ _cairo_gstate_clip (cairo_gstate_t *gstate, cairo_path_fixed_t *path);
cairo_private cairo_status_t
_cairo_gstate_reset_clip (cairo_gstate_t *gstate);
cairo_private cairo_bool_t
_cairo_gstate_has_clip (cairo_gstate_t *gstate);
cairo_private cairo_bool_t
_cairo_gstate_extract_clip_rectangles (cairo_gstate_t *gstate,
int max_rectangles,
cairo_clip_rect_t *rectangles_out,
int *num_rectangles_out);
cairo_private cairo_status_t
_cairo_gstate_show_surface (cairo_gstate_t *gstate,
cairo_surface_t *surface,