pixman: Branch 'master' - 2 commits
Søren Sandmann Pedersen
sandmann at kemper.freedesktop.org
Mon Jun 11 06:57:00 PDT 2007
configure.ac | 2
pixman/Makefile.am | 4
pixman/pixman-compute-region.c | 206 +++++++++++++++++++++++++++++++++++++++++
pixman/pixman-image.c | 10 +
pixman/pixman-pict.c | 177 ++---------------------------------
pixman/pixman-private.h | 1
pixman/pixman-region.c | 17 +--
pixman/pixman.h | 19 +++
8 files changed, 258 insertions(+), 178 deletions(-)
New commits:
diff-tree 6a64eb109449806186164332383be1235ab9c21c (from 30499e2e88985df2cd1ece82227802a316e31a32)
Author: Søren Sandmann Pedersen <sandmann at redhat.com>
Date: Mon Jun 11 09:15:05 2007 -0400
Bump version number
diff --git a/configure.ac b/configure.ac
index a4d69a0..ee5b8ad 100644
--- a/configure.ac
+++ b/configure.ac
@@ -22,7 +22,7 @@ dnl Process this file with autoconf to c
AC_PREREQ([2.57])
-AC_INIT(pixman, 0.9.0, "sandmann at daimi.au.dk", pixman)
+AC_INIT(pixman, 0.9.1, "sandmann at daimi.au.dk", pixman)
AM_INIT_AUTOMAKE([dist-bzip2])
AM_CONFIG_HEADER(config.h)
diff-tree 30499e2e88985df2cd1ece82227802a316e31a32 (from 5ca61dc99b198243f08e6f1f3f96e3c87ff818b9)
Author: Søren Sandmann Pedersen <sandmann at redhat.com>
Date: Mon Jun 11 00:22:19 2007 -0400
Add a version of miComputeCompositeRegion; call it from
pixman_image_composite(). Remove const from return value of
pixman_region_rectangles().
diff --git a/pixman/Makefile.am b/pixman/Makefile.am
index 71b70a9..f08ec23 100644
--- a/pixman/Makefile.am
+++ b/pixman/Makefile.am
@@ -12,8 +12,8 @@ libpixman_la_SOURCES = \
pixman-utils.c \
pixman-edge.c \
pixman-edge-imp.h \
- pixman-trap.c
-
+ pixman-trap.c \
+ pixman-compute-region.c
if USE_MMX
noinst_LTLIBRARIES = libpixman-mmx.la
diff --git a/pixman/pixman-compute-region.c b/pixman/pixman-compute-region.c
new file mode 100644
index 0000000..d4e0ed6
--- /dev/null
+++ b/pixman/pixman-compute-region.c
@@ -0,0 +1,206 @@
+/*
+ *
+ * Copyright © 1999 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "pixman-private.h"
+
+#define BOUND(v) (int16_t) ((v) < INT16_MIN ? INT16_MIN : (v) > INT16_MAX ? INT16_MAX : (v))
+
+static inline pixman_bool_t
+miClipPictureReg (pixman_region16_t * pRegion,
+ pixman_region16_t * pClip,
+ int dx,
+ int dy)
+{
+ if (pixman_region_n_rects(pRegion) == 1 &&
+ pixman_region_n_rects(pClip) == 1)
+ {
+ pixman_box16_t * pRbox = pixman_region_rectangles(pRegion, NULL);
+ pixman_box16_t * pCbox = pixman_region_rectangles(pClip, NULL);
+ int v;
+
+ if (pRbox->x1 < (v = pCbox->x1 + dx))
+ pRbox->x1 = BOUND(v);
+ if (pRbox->x2 > (v = pCbox->x2 + dx))
+ pRbox->x2 = BOUND(v);
+ if (pRbox->y1 < (v = pCbox->y1 + dy))
+ pRbox->y1 = BOUND(v);
+ if (pRbox->y2 > (v = pCbox->y2 + dy))
+ pRbox->y2 = BOUND(v);
+ if (pRbox->x1 >= pRbox->x2 ||
+ pRbox->y1 >= pRbox->y2)
+ {
+ pixman_region_init (pRegion);
+ }
+ }
+ else if (!pixman_region_not_empty (pClip))
+ return FALSE;
+ else
+ {
+ if (dx || dy)
+ pixman_region_translate (pRegion, -dx, -dy);
+ if (!pixman_region_intersect (pRegion, pRegion, pClip))
+ return FALSE;
+ if (dx || dy)
+ pixman_region_translate(pRegion, dx, dy);
+ }
+ return pixman_region_not_empty(pRegion);
+}
+
+
+static inline pixman_bool_t
+miClipPictureSrc (pixman_region16_t * pRegion,
+ pixman_image_t * pPicture,
+ int dx,
+ int dy)
+{
+ /* XXX what to do with clipping from transformed pictures? */
+ if (pPicture->common.transform || pPicture->type != BITS)
+ return TRUE;
+
+ if (pPicture->common.repeat)
+ {
+ /* If the clip region was set by a client, then it should be intersected
+ * with the composite region since it's interpreted as happening
+ * after the repeat algorithm.
+ *
+ * If the clip region was not set by a client, then it was imposed by
+ * boundaries of the pixmap, or by sibling or child windows, which means
+ * it should in theory be repeated along. FIXME: we ignore that case.
+ * It is only relevant for windows that are (a) clipped by siblings/children
+ * and (b) used as source. However this case is not useful anyway due
+ * to lack of GraphicsExpose events.
+ */
+ if (pPicture->common.has_client_clip)
+ {
+ pixman_region_translate ( pRegion, dx, dy);
+
+ if (!pixman_region_intersect (pRegion, pRegion,
+ (pixman_region16_t *) &pPicture->common.clip_region))
+ return FALSE;
+
+ pixman_region_translate ( pRegion, -dx, -dy);
+ }
+
+ return TRUE;
+ }
+ else
+ {
+ return miClipPictureReg (pRegion,
+ &pPicture->common.clip_region,
+ dx,
+ dy);
+ }
+}
+
+/*
+ * returns FALSE if the final region is empty. Indistinguishable from
+ * an allocation failure, but rendering ignores those anyways.
+ */
+
+pixman_bool_t
+pixman_compute_composite_region (pixman_region16_t * pRegion,
+ pixman_image_t * pSrc,
+ pixman_image_t * pMask,
+ pixman_image_t * pDst,
+ int16_t xSrc,
+ int16_t ySrc,
+ int16_t xMask,
+ int16_t yMask,
+ int16_t xDst,
+ int16_t yDst,
+ uint16_t width,
+ uint16_t height)
+{
+ int v;
+
+ pRegion->extents.x1 = xDst;
+ v = xDst + width;
+ pRegion->extents.x2 = BOUND(v);
+ pRegion->extents.y1 = yDst;
+ v = yDst + height;
+ pRegion->extents.y2 = BOUND(v);
+ pRegion->data = 0;
+ /* Check for empty operation */
+ if (pRegion->extents.x1 >= pRegion->extents.x2 ||
+ pRegion->extents.y1 >= pRegion->extents.y2)
+ {
+ pixman_region_init (pRegion);
+ return FALSE;
+ }
+ /* clip against dst */
+ if (!miClipPictureReg (pRegion, &pDst->common.clip_region, 0, 0))
+ {
+ pixman_region_fini (pRegion);
+ return FALSE;
+ }
+ if (pDst->common.alpha_map)
+ {
+ if (!miClipPictureReg (pRegion, &pDst->common.alpha_map->common.clip_region,
+ -pDst->common.alpha_origin.x,
+ -pDst->common.alpha_origin.y))
+ {
+ pixman_region_fini (pRegion);
+ return FALSE;
+ }
+ }
+ /* clip against src */
+ if (!miClipPictureSrc (pRegion, pSrc, xDst - xSrc, yDst - ySrc))
+ {
+ pixman_region_fini (pRegion);
+ return FALSE;
+ }
+ if (pSrc->common.alpha_map)
+ {
+ if (!miClipPictureSrc (pRegion, (pixman_image_t *)pSrc->common.alpha_map,
+ xDst - (xSrc + pSrc->common.alpha_origin.x),
+ yDst - (ySrc + pSrc->common.alpha_origin.y)))
+ {
+ pixman_region_fini (pRegion);
+ return FALSE;
+ }
+ }
+ /* clip against mask */
+ if (pMask)
+ {
+ if (!miClipPictureSrc (pRegion, pMask, xDst - xMask, yDst - yMask))
+ {
+ pixman_region_fini (pRegion);
+ return FALSE;
+ }
+ if (pMask->common.alpha_map)
+ {
+ if (!miClipPictureSrc (pRegion, (pixman_image_t *)pMask->common.alpha_map,
+ xDst - (xMask + pMask->common.alpha_origin.x),
+ yDst - (yMask + pMask->common.alpha_origin.y)))
+ {
+ pixman_region_fini (pRegion);
+ return FALSE;
+ }
+ }
+ }
+
+ return TRUE;
+}
diff --git a/pixman/pixman-image.c b/pixman/pixman-image.c
index e7e5d24..1cc28b2 100644
--- a/pixman/pixman-image.c
+++ b/pixman/pixman-image.c
@@ -85,6 +85,7 @@ allocate_image (void)
image_common_t *common = &image->common;
pixman_region_init (&common->clip_region);
+ common->has_client_clip = FALSE;
common->transform = NULL;
common->repeat = PIXMAN_REPEAT_NONE;
common->filter = PIXMAN_FILTER_NEAREST;
@@ -310,6 +311,15 @@ pixman_image_set_clip_region (pixman_ima
}
}
+/* Sets whether the clip region includes a clip region set by the client
+ */
+void
+pixman_image_set_has_client_clip (pixman_image_t *image,
+ pixman_bool_t client_clip)
+{
+ image->common.has_client_clip = client_clip;
+}
+
void
pixman_image_set_transform (pixman_image_t *image,
const pixman_transform_t *transform)
diff --git a/pixman/pixman-pict.c b/pixman/pixman-pict.c
index cff88e7..76793b1 100644
--- a/pixman/pixman-pict.c
+++ b/pixman/pixman-pict.c
@@ -942,150 +942,6 @@ fbCompositeSrcSrc_nxn (pixman_op_t o
#endif
}
-#define BOUND(v) (int16_t) ((v) < INT16_MIN ? INT16_MIN : (v) > INT16_MAX ? INT16_MAX : (v))
-
-static __inline pixman_bool_t
-miClipPictureReg (pixman_region16_t * pRegion,
- pixman_region16_t * pClip,
- int dx,
- int dy)
-{
- if (pixman_region_n_rects(pRegion) == 1 &&
- pixman_region_n_rects(pClip) == 1)
- {
- pixman_box16_t * pRbox = pixman_region_rectangles(pRegion, NULL);
- pixman_box16_t * pCbox = pixman_region_rectangles(pClip, NULL);
- int v;
-
- if (pRbox->x1 < (v = pCbox->x1 + dx))
- pRbox->x1 = BOUND(v);
- if (pRbox->x2 > (v = pCbox->x2 + dx))
- pRbox->x2 = BOUND(v);
- if (pRbox->y1 < (v = pCbox->y1 + dy))
- pRbox->y1 = BOUND(v);
- if (pRbox->y2 > (v = pCbox->y2 + dy))
- pRbox->y2 = BOUND(v);
- if (pRbox->x1 >= pRbox->x2 ||
- pRbox->y1 >= pRbox->y2)
- {
- pixman_region_init (pRegion);
- }
- }
- else if (!pixman_region_not_empty (pClip))
- return FALSE;
- else
- {
- if (dx || dy)
- pixman_region_translate (pRegion, -dx, -dy);
- if (!pixman_region_intersect (pRegion, pRegion, pClip))
- return FALSE;
- if (dx || dy)
- pixman_region_translate(pRegion, dx, dy);
- }
- return pixman_region_not_empty (pRegion);
-}
-
-static __inline pixman_bool_t
-miClipPictureSrc (pixman_region16_t * pRegion,
- pixman_image_t * pPicture,
- int dx,
- int dy)
-{
- /* XXX what to do with clipping from transformed pictures? */
- if (pPicture->common.transform || pPicture->type != BITS)
- return TRUE;
-
- return miClipPictureReg (pRegion,
- &pPicture->common.clip_region,
- dx,
- dy);
-}
-
-static pixman_bool_t
-compute_composite_region (pixman_region16_t * pRegion,
- pixman_image_t * pSrc,
- pixman_image_t * pMask,
- pixman_image_t * pDst,
- int16_t xSrc,
- int16_t ySrc,
- int16_t xMask,
- int16_t yMask,
- int16_t xDst,
- int16_t yDst,
- uint16_t width,
- uint16_t height)
-{
- int v;
-
- pRegion->extents.x1 = xDst;
- v = xDst + width;
- pRegion->extents.x2 = BOUND(v);
- pRegion->extents.y1 = yDst;
- v = yDst + height;
- pRegion->extents.y2 = BOUND(v);
- pRegion->data = 0;
- /* Check for empty operation */
- if (pRegion->extents.x1 >= pRegion->extents.x2 ||
- pRegion->extents.y1 >= pRegion->extents.y2)
- {
- pixman_region_init (pRegion);
- return FALSE;
- }
- /* clip against dst */
- if (!miClipPictureReg (pRegion, &pDst->common.clip_region, 0, 0))
- {
- pixman_region_fini (pRegion);
- return FALSE;
- }
- if (pDst->common.alpha_map)
- {
- if (!miClipPictureReg (pRegion, &pDst->common.alpha_map->common.clip_region,
- -pDst->common.alpha_origin.x,
- -pDst->common.alpha_origin.y))
- {
- pixman_region_fini (pRegion);
- return FALSE;
- }
- }
- /* clip against src */
- if (!miClipPictureSrc (pRegion, pSrc, xDst - xSrc, yDst - ySrc))
- {
- pixman_region_fini (pRegion);
- return FALSE;
- }
- if (pSrc->common.alpha_map)
- {
- if (!miClipPictureSrc (pRegion, (pixman_image_t *)pSrc->common.alpha_map,
- xDst - (xSrc + pSrc->common.alpha_origin.x),
- yDst - (ySrc + pSrc->common.alpha_origin.y)))
- {
- pixman_region_fini (pRegion);
- return FALSE;
- }
- }
- /* clip against mask */
- if (pMask)
- {
- if (!miClipPictureSrc (pRegion, pMask, xDst - xMask, yDst - yMask))
- {
- pixman_region_fini (pRegion);
- return FALSE;
- }
- if (pMask->common.alpha_map)
- {
- if (!miClipPictureSrc (pRegion, (pixman_image_t *)pMask->common.alpha_map,
- xDst - (xMask + pMask->common.alpha_origin.x),
- yDst - (yMask + pMask->common.alpha_origin.y)))
- {
- pixman_region_fini (pRegion);
- return FALSE;
- }
- }
- }
-
- return TRUE;
-}
-
static void
pixman_walk_composite_region (pixman_op_t op,
pixman_image_t * pSrc,
@@ -1101,25 +957,23 @@ pixman_walk_composite_region (pixman_op_
uint16_t height,
pixman_bool_t srcRepeat,
pixman_bool_t maskRepeat,
- CompositeFunc compositeRect,
- pixman_region16_t *region)
+ CompositeFunc compositeRect)
{
-#if 0
- pixman_region16_t region;
-#endif
int n;
const pixman_box16_t *pbox;
int w, h, w_this, h_this;
int x_msk, y_msk, x_src, y_src, x_dst, y_dst;
-
-#if 0
- if (!compute_composite_region (®ion, pSrc, pMask, pDst, xSrc, ySrc,
- xMask, yMask, xDst, yDst, width, height))
+ pixman_region16_t reg;
+ pixman_region16_t *region;
+
+ pixman_region_init (®);
+ if (!pixman_compute_composite_region (®, pSrc, pMask, pDst,
+ xSrc, ySrc, xMask, yMask, xDst, yDst, width, height))
{
- fprinf ("blah\n");
- return;
+ return;
}
-#endif
+
+ region = ®
pbox = pixman_region_rectangles (region, &n);
while (n--)
@@ -1177,9 +1031,7 @@ pixman_walk_composite_region (pixman_op_
}
pbox++;
}
-#if 0
- pixman_region_fini (®ion);
-#endif
+ pixman_region_fini (®);
}
static pixman_bool_t
@@ -1223,8 +1075,7 @@ pixman_image_composite (pixman_op_t
int16_t xDst,
int16_t yDst,
uint16_t width,
- uint16_t height,
- pixman_region16_t *region)
+ uint16_t height)
{
pixman_bool_t srcRepeat = pSrc->type == BITS && pSrc->common.repeat == PIXMAN_REPEAT_NORMAL;
pixman_bool_t maskRepeat = FALSE;
@@ -1234,7 +1085,7 @@ pixman_image_composite (pixman_op_t
pixman_bool_t maskAlphaMap = FALSE;
pixman_bool_t dstAlphaMap = pDst->common.alpha_map != NULL;
CompositeFunc func = NULL;
-
+
#ifdef USE_MMX
static pixman_bool_t mmx_setup = FALSE;
if (!mmx_setup)
@@ -1821,7 +1672,7 @@ pixman_image_composite (pixman_op_t
pixman_walk_composite_region (op, pSrc, pMask, pDst, xSrc, ySrc,
xMask, yMask, xDst, yDst, width, height,
- srcRepeat, maskRepeat, func, region);
+ srcRepeat, maskRepeat, func);
}
diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h
index 06d641c..09969fb 100644
--- a/pixman/pixman-private.h
+++ b/pixman/pixman-private.h
@@ -148,6 +148,7 @@ struct image_common
image_type_t type;
int32_t ref_count;
pixman_region16_t clip_region;
+ pixman_bool_t has_client_clip;
pixman_transform_t *transform;
pixman_repeat_t repeat;
pixman_filter_t filter;
diff --git a/pixman/pixman-region.c b/pixman/pixman-region.c
index f5d2f45..7a0f9da 100644
--- a/pixman/pixman-region.c
+++ b/pixman/pixman-region.c
@@ -49,6 +49,7 @@ SOFTWARE.
#include <stdlib.h>
#include <limits.h>
#include <string.h>
+#include <stdio.h>
#include "pixman-private.h"
#include "pixman.h"
@@ -256,8 +257,7 @@ pixman_region_equal(reg1, reg2)
return TRUE;
}
-#ifdef DEBUG_PIXREGION
-static int
+int
pixman_region16_print(rgn)
pixman_region16_t * rgn;
{
@@ -268,17 +268,16 @@ pixman_region16_print(rgn)
num = PIXREGION_NUM_RECTS(rgn);
size = PIXREGION_SIZE(rgn);
rects = PIXREGION_RECTS(rgn);
- ErrorF("num: %d size: %d\n", num, size);
- ErrorF("extents: %d %d %d %d\n",
+ fprintf(stderr, "num: %d size: %d\n", num, size);
+ fprintf(stderr, "extents: %d %d %d %d\n",
rgn->extents.x1, rgn->extents.y1, rgn->extents.x2, rgn->extents.y2);
for (i = 0; i < num; i++)
- ErrorF("%d %d %d %d \n",
- rects[i].x1, rects[i].y1, rects[i].x2, rects[i].y2);
- ErrorF("\n");
+ fprintf(stderr, "%d %d %d %d \n",
+ rects[i].x1, rects[i].y1, rects[i].x2, rects[i].y2);
+ fprintf(stderr, "\n");
return(num);
}
-#endif /* DEBUG_PIXREGION */
void
pixman_region_init (pixman_region16_t *region)
@@ -324,7 +323,7 @@ pixman_region_rects (pixman_region16_t *
return PIXREGION_RECTS (region);
}
-const pixman_box16_t *
+pixman_box16_t *
pixman_region_rectangles (pixman_region16_t *region,
int *n_rects)
{
diff --git a/pixman/pixman.h b/pixman/pixman.h
index b6d3a95..7f33273 100644
--- a/pixman/pixman.h
+++ b/pixman/pixman.h
@@ -282,7 +282,7 @@ pixman_region_overlap_t pixman_region_co
pixman_bool_t pixman_region_not_empty (pixman_region16_t *region);
pixman_box16_t * pixman_region_extents (pixman_region16_t *region);
int pixman_region_n_rects (pixman_region16_t *region);
-const pixman_box16_t * pixman_region_rectangles (pixman_region16_t *region,
+pixman_box16_t * pixman_region_rectangles (pixman_region16_t *region,
int *n_rects);
pixman_bool_t pixman_region_equal (pixman_region16_t *region1,
pixman_region16_t *region2);
@@ -436,6 +436,8 @@ void pixman_image_unref
/* Set properties */
void pixman_image_set_clip_region (pixman_image_t *image,
pixman_region16_t *region);
+void pixman_image_set_has_client_clip (pixman_image_t *image,
+ pixman_bool_t clien_clip);
void pixman_image_set_transform (pixman_image_t *image,
const pixman_transform_t *transform);
void pixman_image_set_repeat (pixman_image_t *image,
@@ -460,6 +462,18 @@ void pixman_image_set_indexed (pix
const pixman_indexed_t *indexed);
/* Composite */
+pixman_bool_t pixman_compute_composite_region (pixman_region16_t * pRegion,
+ pixman_image_t * pSrc,
+ pixman_image_t * pMask,
+ pixman_image_t * pDst,
+ int16_t xSrc,
+ int16_t ySrc,
+ int16_t xMask,
+ int16_t yMask,
+ int16_t xDst,
+ int16_t yDst,
+ uint16_t width,
+ uint16_t height);
void pixman_image_composite (pixman_op_t op,
pixman_image_t *src,
pixman_image_t *mask,
@@ -471,8 +485,7 @@ void pixman_image_composite
int16_t dest_x,
int16_t dest_y,
uint16_t width,
- uint16_t height,
- pixman_region16_t *composite_region);
+ uint16_t height);
void pixman_image_composite_rect (pixman_op_t op,
pixman_image_t *src,
pixman_image_t *mask,
More information about the xorg-commit
mailing list