317 lines
12 KiB
Diff
317 lines
12 KiB
Diff
From 07f9e0beaf66ec9de1455a305c87ab642968f3f1 Mon Sep 17 00:00:00 2001
|
|
From: Jeremy Huddleston <jeremyhu@apple.com>
|
|
Date: Fri, 12 Feb 2010 19:48:52 -0800
|
|
Subject: [PATCH 5002/5004] fb: Revert fb changes that broke XQuartz
|
|
|
|
http://bugs.freedesktop.org/show_bug.cgi?id=26124
|
|
|
|
Revert "Fix source pictures getting random transforms after 2d6a8f668342a5190cdf43b5."
|
|
Revert "fb: Adjust transform or composite coordinates for pixman operations"
|
|
|
|
http://bugs.freedesktop.org/26124
|
|
|
|
This reverts commit a72c65e9176c51de95db2fdbf4c5d946a4911695.
|
|
This reverts commit a6bd5d2e482a5aa84acb3d4932e2a166d8670ef1.
|
|
|
|
Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
|
|
---
|
|
fb/fb.h | 3 +--
|
|
fb/fbpict.c | 82 ++++++++++++++++++-------------------------------------------
|
|
fb/fbtrap.c | 43 ++++++++++++++------------------
|
|
3 files changed, 43 insertions(+), 85 deletions(-)
|
|
|
|
diff --git a/fb/fb.h b/fb/fb.h
|
|
index b869d12..895b148 100644
|
|
--- a/fb/fb.h
|
|
+++ b/fb/fb.h
|
|
@@ -1686,8 +1686,7 @@ fbFillRegionSolid(DrawablePtr pDrawable,
|
|
RegionPtr pRegion, FbBits and, FbBits xor);
|
|
|
|
extern _X_EXPORT pixman_image_t *image_from_pict(PicturePtr pict,
|
|
- Bool has_clip,
|
|
- int *xoff, int *yoff);
|
|
+ Bool has_clip);
|
|
|
|
extern _X_EXPORT void free_pixman_pict(PicturePtr, pixman_image_t *);
|
|
|
|
diff --git a/fb/fbpict.c b/fb/fbpict.c
|
|
index 2804ff4..80c2a91 100644
|
|
--- a/fb/fbpict.c
|
|
+++ b/fb/fbpict.c
|
|
@@ -46,23 +46,18 @@ fbComposite(CARD8 op,
|
|
INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height)
|
|
{
|
|
pixman_image_t *src, *mask, *dest;
|
|
- int src_xoff, src_yoff;
|
|
- int msk_xoff, msk_yoff;
|
|
- int dst_xoff, dst_yoff;
|
|
-
|
|
miCompositeSourceValidate(pSrc);
|
|
if (pMask)
|
|
miCompositeSourceValidate(pMask);
|
|
|
|
- src = image_from_pict(pSrc, FALSE, &src_xoff, &src_yoff);
|
|
- mask = image_from_pict(pMask, FALSE, &msk_xoff, &msk_yoff);
|
|
- dest = image_from_pict(pDst, TRUE, &dst_xoff, &dst_yoff);
|
|
+ src = image_from_pict(pSrc, TRUE);
|
|
+ mask = image_from_pict(pMask, TRUE);
|
|
+ dest = image_from_pict(pDst, TRUE);
|
|
|
|
if (src && dest && !(pMask && !mask)) {
|
|
pixman_image_composite(op, src, mask, dest,
|
|
- xSrc + src_xoff, ySrc + src_yoff,
|
|
- xMask + msk_xoff, yMask + msk_yoff,
|
|
- xDst + dst_xoff, yDst + dst_yoff, width, height);
|
|
+ xSrc, ySrc, xMask, yMask, xDst, yDst,
|
|
+ width, height);
|
|
}
|
|
|
|
free_pixman_pict(pSrc, src);
|
|
@@ -293,20 +288,22 @@ create_conical_gradient_image(PictGradient * gradient)
|
|
}
|
|
|
|
static pixman_image_t *
|
|
-create_bits_picture(PicturePtr pict, Bool has_clip, int *xoff, int *yoff)
|
|
+create_bits_picture(PicturePtr pict, Bool has_clip)
|
|
{
|
|
- PixmapPtr pixmap;
|
|
FbBits *bits;
|
|
FbStride stride;
|
|
- int bpp;
|
|
+ int bpp, xoff, yoff;
|
|
pixman_image_t *image;
|
|
|
|
- fbGetDrawablePixmap(pict->pDrawable, pixmap, *xoff, *yoff);
|
|
- fbGetPixmapBitsData(pixmap, bits, stride, bpp);
|
|
+ fbGetDrawable (pict->pDrawable, bits, stride, bpp, xoff, yoff);
|
|
+
|
|
+ bits = (FbBits*)((CARD8*)bits +
|
|
+ (pict->pDrawable->y + yoff) * stride * sizeof(FbBits) +
|
|
+ (pict->pDrawable->x + xoff) * (bpp / 8));
|
|
|
|
image = pixman_image_create_bits((pixman_format_code_t) pict->format,
|
|
- pixmap->drawable.width,
|
|
- pixmap->drawable.height, (uint32_t *) bits,
|
|
+ pict->pDrawable->width,
|
|
+ pict->pDrawable->height, (uint32_t *) bits,
|
|
stride * sizeof(FbStride));
|
|
|
|
if (!image)
|
|
@@ -333,57 +330,31 @@ create_bits_picture(PicturePtr pict, Bool has_clip, int *xoff, int *yoff)
|
|
if (pict->clientClipType != CT_NONE)
|
|
pixman_image_set_has_client_clip(image, TRUE);
|
|
|
|
- if (*xoff || *yoff)
|
|
- pixman_region_translate(pict->pCompositeClip, *xoff, *yoff);
|
|
+ pixman_region_translate (pict->pCompositeClip, - pict->pDrawable->x, - pict->pDrawable->y);
|
|
|
|
pixman_image_set_clip_region(image, pict->pCompositeClip);
|
|
|
|
- if (*xoff || *yoff)
|
|
- pixman_region_translate(pict->pCompositeClip, -*xoff, -*yoff);
|
|
+ pixman_region_translate (pict->pCompositeClip, pict->pDrawable->x, pict->pDrawable->y);
|
|
}
|
|
|
|
/* Indexed table */
|
|
if (pict->pFormat->index.devPrivate)
|
|
pixman_image_set_indexed(image, pict->pFormat->index.devPrivate);
|
|
|
|
- /* Add in drawable origin to position within the image */
|
|
- *xoff += pict->pDrawable->x;
|
|
- *yoff += pict->pDrawable->y;
|
|
-
|
|
return image;
|
|
}
|
|
|
|
static pixman_image_t *image_from_pict_internal(PicturePtr pict, Bool has_clip,
|
|
- int *xoff, int *yoff,
|
|
Bool is_alpha_map);
|
|
|
|
static void
|
|
-set_image_properties(pixman_image_t * image, PicturePtr pict, Bool has_clip,
|
|
- int *xoff, int *yoff, Bool is_alpha_map)
|
|
+set_image_properties(pixman_image_t * image, PicturePtr pict, Bool is_alpha_map)
|
|
{
|
|
pixman_repeat_t repeat;
|
|
pixman_filter_t filter;
|
|
|
|
if (pict->transform) {
|
|
- /* For source images, adjust the transform to account
|
|
- * for the drawable offset within the pixman image,
|
|
- * then set the offset to 0 as it will be used
|
|
- * to compute positions within the transformed image.
|
|
- */
|
|
- if (!has_clip) {
|
|
- struct pixman_transform adjusted;
|
|
-
|
|
- adjusted = *pict->transform;
|
|
- pixman_transform_translate(&adjusted,
|
|
- NULL,
|
|
- pixman_int_to_fixed(*xoff),
|
|
- pixman_int_to_fixed(*yoff));
|
|
- pixman_image_set_transform(image, &adjusted);
|
|
- *xoff = 0;
|
|
- *yoff = 0;
|
|
- }
|
|
- else
|
|
- pixman_image_set_transform(image, pict->transform);
|
|
+ pixman_image_set_transform(image, pict->transform);
|
|
}
|
|
|
|
switch (pict->repeatType) {
|
|
@@ -411,10 +382,8 @@ set_image_properties(pixman_image_t * image, PicturePtr pict, Bool has_clip,
|
|
* as the alpha map for this operation
|
|
*/
|
|
if (pict->alphaMap && !is_alpha_map) {
|
|
- int alpha_xoff, alpha_yoff;
|
|
pixman_image_t *alpha_map =
|
|
- image_from_pict_internal(pict->alphaMap, FALSE, &alpha_xoff,
|
|
- &alpha_yoff, TRUE);
|
|
+ image_from_pict_internal(pict->alphaMap, TRUE, TRUE);
|
|
|
|
pixman_image_set_alpha_map(image, alpha_map, pict->alphaOrigin.x,
|
|
pict->alphaOrigin.y);
|
|
@@ -448,8 +417,7 @@ set_image_properties(pixman_image_t * image, PicturePtr pict, Bool has_clip,
|
|
}
|
|
|
|
static pixman_image_t *
|
|
-image_from_pict_internal(PicturePtr pict, Bool has_clip, int *xoff, int *yoff,
|
|
- Bool is_alpha_map)
|
|
+image_from_pict_internal(PicturePtr pict, Bool has_clip, Bool is_alpha_map)
|
|
{
|
|
pixman_image_t *image = NULL;
|
|
|
|
@@ -457,7 +425,7 @@ image_from_pict_internal(PicturePtr pict, Bool has_clip, int *xoff, int *yoff,
|
|
return NULL;
|
|
|
|
if (pict->pDrawable) {
|
|
- image = create_bits_picture(pict, has_clip, xoff, yoff);
|
|
+ image = create_bits_picture(pict, has_clip);
|
|
}
|
|
else if (pict->pSourcePict) {
|
|
SourcePict *sp = pict->pSourcePict;
|
|
@@ -475,19 +443,17 @@ image_from_pict_internal(PicturePtr pict, Bool has_clip, int *xoff, int *yoff,
|
|
else if (sp->type == SourcePictTypeConical)
|
|
image = create_conical_gradient_image(gradient);
|
|
}
|
|
- *xoff = *yoff = 0;
|
|
}
|
|
|
|
if (image)
|
|
- set_image_properties(image, pict, has_clip, xoff, yoff, is_alpha_map);
|
|
-
|
|
+ set_image_properties (image, pict, is_alpha_map);
|
|
return image;
|
|
}
|
|
|
|
pixman_image_t *
|
|
-image_from_pict(PicturePtr pict, Bool has_clip, int *xoff, int *yoff)
|
|
+image_from_pict (PicturePtr pict, Bool has_clip)
|
|
{
|
|
- return image_from_pict_internal(pict, has_clip, xoff, yoff, FALSE);
|
|
+ return image_from_pict_internal (pict, has_clip, FALSE);
|
|
}
|
|
|
|
void
|
|
diff --git a/fb/fbtrap.c b/fb/fbtrap.c
|
|
index bf82f8f..0145ce9 100644
|
|
--- a/fb/fbtrap.c
|
|
+++ b/fb/fbtrap.c
|
|
@@ -36,13 +36,12 @@ fbAddTraps(PicturePtr pPicture,
|
|
INT16 x_off, INT16 y_off, int ntrap, xTrap * traps)
|
|
{
|
|
pixman_image_t *image;
|
|
- int dst_xoff, dst_yoff;
|
|
|
|
- if (!(image = image_from_pict(pPicture, FALSE, &dst_xoff, &dst_yoff)))
|
|
- return;
|
|
-
|
|
- pixman_add_traps(image, x_off + dst_xoff, y_off + dst_yoff,
|
|
- ntrap, (pixman_trap_t *) traps);
|
|
+ if (!(image = image_from_pict (pPicture, FALSE)))
|
|
+ return;
|
|
+
|
|
+ pixman_add_traps(image, x_off, y_off,
|
|
+ ntrap, (pixman_trap_t *)traps);
|
|
|
|
free_pixman_pict(pPicture, image);
|
|
}
|
|
@@ -52,13 +51,12 @@ fbRasterizeTrapezoid(PicturePtr pPicture,
|
|
xTrapezoid * trap, int x_off, int y_off)
|
|
{
|
|
pixman_image_t *image;
|
|
- int dst_xoff, dst_yoff;
|
|
|
|
- if (!(image = image_from_pict(pPicture, FALSE, &dst_xoff, &dst_yoff)))
|
|
+ if (!(image = image_from_pict (pPicture, FALSE)))
|
|
return;
|
|
|
|
- pixman_rasterize_trapezoid(image, (pixman_trapezoid_t *) trap,
|
|
- x_off + dst_xoff, y_off + dst_yoff);
|
|
+ pixman_rasterize_trapezoid(image, (pixman_trapezoid_t *)trap,
|
|
+ x_off, y_off);
|
|
|
|
free_pixman_pict(pPicture, image);
|
|
}
|
|
@@ -68,14 +66,12 @@ fbAddTriangles(PicturePtr pPicture,
|
|
INT16 x_off, INT16 y_off, int ntri, xTriangle * tris)
|
|
{
|
|
pixman_image_t *image;
|
|
- int dst_xoff, dst_yoff;
|
|
|
|
- if (!(image = image_from_pict(pPicture, FALSE, &dst_xoff, &dst_yoff)))
|
|
+ if (!(image = image_from_pict (pPicture, FALSE)))
|
|
return;
|
|
-
|
|
- pixman_add_triangles(image,
|
|
- dst_xoff + x_off, dst_yoff + y_off,
|
|
- ntri, (pixman_triangle_t *) tris);
|
|
+
|
|
+ pixman_add_triangles(image, x_off, y_off, ntri,
|
|
+ (pixman_triangle_t *)tris);
|
|
|
|
free_pixman_pict(pPicture, image);
|
|
}
|
|
@@ -98,13 +94,11 @@ fbShapes(CompositeShapesFunc composite,
|
|
int16_t ySrc, int nshapes, int shape_size, const uint8_t * shapes)
|
|
{
|
|
pixman_image_t *src, *dst;
|
|
- int src_xoff, src_yoff;
|
|
- int dst_xoff, dst_yoff;
|
|
|
|
miCompositeSourceValidate(pSrc);
|
|
|
|
- src = image_from_pict(pSrc, FALSE, &src_xoff, &src_yoff);
|
|
- dst = image_from_pict(pDst, TRUE, &dst_xoff, &dst_yoff);
|
|
+ src = image_from_pict(pSrc, FALSE);
|
|
+ dst = image_from_pict(pDst, TRUE);
|
|
|
|
if (src && dst) {
|
|
pixman_format_code_t format;
|
|
@@ -121,9 +115,8 @@ fbShapes(CompositeShapesFunc composite,
|
|
|
|
for (i = 0; i < nshapes; ++i) {
|
|
composite(op, src, dst, format,
|
|
- xSrc + src_xoff,
|
|
- ySrc + src_yoff,
|
|
- dst_xoff, dst_yoff, 1, shapes + i * shape_size);
|
|
+ xSrc, ySrc, 0, 0,
|
|
+ 1, shapes + i * shape_size);
|
|
}
|
|
}
|
|
else {
|
|
@@ -143,8 +136,8 @@ fbShapes(CompositeShapesFunc composite,
|
|
}
|
|
|
|
composite(op, src, dst, format,
|
|
- xSrc + src_xoff,
|
|
- ySrc + src_yoff, dst_xoff, dst_yoff, nshapes, shapes);
|
|
+ xSrc, ySrc, 0, 0,
|
|
+ nshapes, shapes);
|
|
}
|
|
|
|
DamageRegionProcessPending(pDst->pDrawable);
|
|
--
|
|
1.8.4.1
|
|
|