298 lines
8.6 KiB
Diff
298 lines
8.6 KiB
Diff
From bd9fce8b74f5358e4d7e5ce9b5cdd8fd195bb3fd Mon Sep 17 00:00:00 2001
|
|
From: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
|
|
Date: Sat, 2 Nov 2013 11:00:23 -0700
|
|
Subject: [PATCH 5004/5004] Use old miTrapezoids and miTriangles routines
|
|
|
|
Reverts commits:
|
|
788ccb9a8bcf6a4fb4054c507111eec3338fb969
|
|
566f1931ee2916269e164e114bffaf2da1d039d1
|
|
|
|
http://xquartz.macosforge.org/trac/ticket/525
|
|
|
|
Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
|
|
---
|
|
fb/fbpict.c | 2 -
|
|
render/mipict.c | 4 +-
|
|
render/mipict.h | 27 ++++++++++++++
|
|
render/mitrap.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
render/mitri.c | 61 +++++++++++++++++++++++++++++++
|
|
5 files changed, 201 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/fb/fbpict.c b/fb/fbpict.c
|
|
index dc0ca3c..276ff06 100644
|
|
--- a/fb/fbpict.c
|
|
+++ b/fb/fbpict.c
|
|
@@ -326,10 +326,8 @@ fbPictureInit(ScreenPtr pScreen, PictFormatPtr formats, int nformats)
|
|
ps->Glyphs = miGlyphs;
|
|
ps->CompositeRects = miCompositeRects;
|
|
ps->RasterizeTrapezoid = fbRasterizeTrapezoid;
|
|
- ps->Trapezoids = fbTrapezoids;
|
|
ps->AddTraps = fbAddTraps;
|
|
ps->AddTriangles = fbAddTriangles;
|
|
- ps->Triangles = fbTriangles;
|
|
|
|
return TRUE;
|
|
}
|
|
diff --git a/render/mipict.c b/render/mipict.c
|
|
index 2e64b20..d21b58a 100644
|
|
--- a/render/mipict.c
|
|
+++ b/render/mipict.c
|
|
@@ -595,8 +595,8 @@ miPictureInit(ScreenPtr pScreen, PictFormatPtr formats, int nformats)
|
|
ps->Composite = 0; /* requires DDX support */
|
|
ps->Glyphs = miGlyphs;
|
|
ps->CompositeRects = miCompositeRects;
|
|
- ps->Trapezoids = 0;
|
|
- ps->Triangles = 0;
|
|
+ ps->Trapezoids = miTrapezoids;
|
|
+ ps->Triangles = miTriangles;
|
|
|
|
ps->RasterizeTrapezoid = 0; /* requires DDX support */
|
|
ps->AddTraps = 0; /* requires DDX support */
|
|
diff --git a/render/mipict.h b/render/mipict.h
|
|
index 9436228..7ee2991 100644
|
|
--- a/render/mipict.h
|
|
+++ b/render/mipict.h
|
|
@@ -122,6 +122,16 @@ miCompositeRects(CARD8 op,
|
|
xRenderColor * color, int nRect, xRectangle *rects);
|
|
|
|
extern _X_EXPORT void
|
|
+miTriangles (CARD8 op,
|
|
+ PicturePtr pSrc,
|
|
+ PicturePtr pDst,
|
|
+ PictFormatPtr maskFormat,
|
|
+ INT16 xSrc,
|
|
+ INT16 ySrc,
|
|
+ int ntri,
|
|
+ xTriangle *tris);
|
|
+
|
|
+extern _X_EXPORT void
|
|
|
|
miTriStrip(CARD8 op,
|
|
PicturePtr pSrc,
|
|
@@ -137,10 +147,27 @@ miTriFan(CARD8 op,
|
|
PictFormatPtr maskFormat,
|
|
INT16 xSrc, INT16 ySrc, int npoints, xPointFixed * points);
|
|
|
|
+extern _X_EXPORT PicturePtr
|
|
+miCreateAlphaPicture (ScreenPtr pScreen,
|
|
+ PicturePtr pDst,
|
|
+ PictFormatPtr pPictFormat,
|
|
+ CARD16 width,
|
|
+ CARD16 height);
|
|
+
|
|
extern _X_EXPORT void
|
|
miTrapezoidBounds(int ntrap, xTrapezoid * traps, BoxPtr box);
|
|
|
|
extern _X_EXPORT void
|
|
+miTrapezoids (CARD8 op,
|
|
+ PicturePtr pSrc,
|
|
+ PicturePtr pDst,
|
|
+ PictFormatPtr maskFormat,
|
|
+ INT16 xSrc,
|
|
+ INT16 ySrc,
|
|
+ int ntrap,
|
|
+ xTrapezoid *traps);
|
|
+
|
|
+extern _X_EXPORT void
|
|
miPointFixedBounds(int npoint, xPointFixed * points, BoxPtr bounds);
|
|
|
|
extern _X_EXPORT void
|
|
diff --git a/render/mitrap.c b/render/mitrap.c
|
|
index 17b6dcd..71c1857 100644
|
|
--- a/render/mitrap.c
|
|
+++ b/render/mitrap.c
|
|
@@ -34,6 +34,55 @@
|
|
#include "picturestr.h"
|
|
#include "mipict.h"
|
|
|
|
+PicturePtr
|
|
+miCreateAlphaPicture (ScreenPtr pScreen,
|
|
+ PicturePtr pDst,
|
|
+ PictFormatPtr pPictFormat,
|
|
+ CARD16 width,
|
|
+ CARD16 height)
|
|
+{
|
|
+ PixmapPtr pPixmap;
|
|
+ PicturePtr pPicture;
|
|
+ GCPtr pGC;
|
|
+ int error;
|
|
+ xRectangle rect;
|
|
+
|
|
+ if (width > 32767 || height > 32767)
|
|
+ return 0;
|
|
+
|
|
+ if (!pPictFormat)
|
|
+ {
|
|
+ if (pDst->polyEdge == PolyEdgeSharp)
|
|
+ pPictFormat = PictureMatchFormat (pScreen, 1, PICT_a1);
|
|
+ else
|
|
+ pPictFormat = PictureMatchFormat (pScreen, 8, PICT_a8);
|
|
+ if (!pPictFormat)
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+ pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height,
|
|
+ pPictFormat->depth, 0);
|
|
+ if (!pPixmap)
|
|
+ return 0;
|
|
+ pGC = GetScratchGC (pPixmap->drawable.depth, pScreen);
|
|
+ if (!pGC)
|
|
+ {
|
|
+ (*pScreen->DestroyPixmap) (pPixmap);
|
|
+ return 0;
|
|
+ }
|
|
+ ValidateGC (&pPixmap->drawable, pGC);
|
|
+ rect.x = 0;
|
|
+ rect.y = 0;
|
|
+ rect.width = width;
|
|
+ rect.height = height;
|
|
+ (*pGC->ops->PolyFillRect)(&pPixmap->drawable, pGC, 1, &rect);
|
|
+ FreeScratchGC (pGC);
|
|
+ pPicture = CreatePicture (0, &pPixmap->drawable, pPictFormat,
|
|
+ 0, 0, serverClient, &error);
|
|
+ (*pScreen->DestroyPixmap) (pPixmap);
|
|
+ return pPicture;
|
|
+}
|
|
+
|
|
static xFixed
|
|
miLineFixedX(xLineFixed * l, xFixed y, Bool ceil)
|
|
{
|
|
@@ -79,3 +128,65 @@ miTrapezoidBounds(int ntrap, xTrapezoid * traps, BoxPtr box)
|
|
box->x2 = x2;
|
|
}
|
|
}
|
|
+
|
|
+
|
|
+void
|
|
+miTrapezoids (CARD8 op,
|
|
+ PicturePtr pSrc,
|
|
+ PicturePtr pDst,
|
|
+ PictFormatPtr maskFormat,
|
|
+ INT16 xSrc,
|
|
+ INT16 ySrc,
|
|
+ int ntrap,
|
|
+ xTrapezoid *traps)
|
|
+{
|
|
+ ScreenPtr pScreen = pDst->pDrawable->pScreen;
|
|
+ PictureScreenPtr ps = GetPictureScreen(pScreen);
|
|
+
|
|
+ /*
|
|
+ * Check for solid alpha add
|
|
+ */
|
|
+ if (op == PictOpAdd && miIsSolidAlpha (pSrc))
|
|
+ {
|
|
+ for (; ntrap; ntrap--, traps++)
|
|
+ (*ps->RasterizeTrapezoid) (pDst, traps, 0, 0);
|
|
+ }
|
|
+ else if (maskFormat)
|
|
+ {
|
|
+ PicturePtr pPicture;
|
|
+ BoxRec bounds;
|
|
+ INT16 xDst, yDst;
|
|
+ INT16 xRel, yRel;
|
|
+
|
|
+ xDst = traps[0].left.p1.x >> 16;
|
|
+ yDst = traps[0].left.p1.y >> 16;
|
|
+
|
|
+ miTrapezoidBounds (ntrap, traps, &bounds);
|
|
+ if (bounds.y1 >= bounds.y2 || bounds.x1 >= bounds.x2)
|
|
+ return;
|
|
+ pPicture = miCreateAlphaPicture (pScreen, pDst, maskFormat,
|
|
+ bounds.x2 - bounds.x1,
|
|
+ bounds.y2 - bounds.y1);
|
|
+ if (!pPicture)
|
|
+ return;
|
|
+ for (; ntrap; ntrap--, traps++)
|
|
+ (*ps->RasterizeTrapezoid) (pPicture, traps,
|
|
+ -bounds.x1, -bounds.y1);
|
|
+ xRel = bounds.x1 + xSrc - xDst;
|
|
+ yRel = bounds.y1 + ySrc - yDst;
|
|
+ CompositePicture (op, pSrc, pPicture, pDst,
|
|
+ xRel, yRel, 0, 0, bounds.x1, bounds.y1,
|
|
+ bounds.x2 - bounds.x1,
|
|
+ bounds.y2 - bounds.y1);
|
|
+ FreePicture (pPicture, 0);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ if (pDst->polyEdge == PolyEdgeSharp)
|
|
+ maskFormat = PictureMatchFormat (pScreen, 1, PICT_a1);
|
|
+ else
|
|
+ maskFormat = PictureMatchFormat (pScreen, 8, PICT_a8);
|
|
+ for (; ntrap; ntrap--, traps++)
|
|
+ miTrapezoids (op, pSrc, pDst, maskFormat, xSrc, ySrc, 1, traps);
|
|
+ }
|
|
+}
|
|
diff --git a/render/mitri.c b/render/mitri.c
|
|
index 922f22a..bdca9ca 100644
|
|
--- a/render/mitri.c
|
|
+++ b/render/mitri.c
|
|
@@ -65,3 +65,64 @@ miTriangleBounds(int ntri, xTriangle * tris, BoxPtr bounds)
|
|
{
|
|
miPointFixedBounds(ntri * 3, (xPointFixed *) tris, bounds);
|
|
}
|
|
+
|
|
+
|
|
+void
|
|
+miTriangles (CARD8 op,
|
|
+ PicturePtr pSrc,
|
|
+ PicturePtr pDst,
|
|
+ PictFormatPtr maskFormat,
|
|
+ INT16 xSrc,
|
|
+ INT16 ySrc,
|
|
+ int ntri,
|
|
+ xTriangle *tris)
|
|
+{
|
|
+ ScreenPtr pScreen = pDst->pDrawable->pScreen;
|
|
+ PictureScreenPtr ps = GetPictureScreen(pScreen);
|
|
+
|
|
+ /*
|
|
+ * Check for solid alpha add
|
|
+ */
|
|
+ if (op == PictOpAdd && miIsSolidAlpha (pSrc))
|
|
+ {
|
|
+ (*ps->AddTriangles) (pDst, 0, 0, ntri, tris);
|
|
+ }
|
|
+ else if (maskFormat)
|
|
+ {
|
|
+ BoxRec bounds;
|
|
+ PicturePtr pPicture;
|
|
+ INT16 xDst, yDst;
|
|
+ INT16 xRel, yRel;
|
|
+
|
|
+ xDst = tris[0].p1.x >> 16;
|
|
+ yDst = tris[0].p1.y >> 16;
|
|
+
|
|
+ miTriangleBounds (ntri, tris, &bounds);
|
|
+ if (bounds.x2 <= bounds.x1 || bounds.y2 <= bounds.y1)
|
|
+ return;
|
|
+ pPicture = miCreateAlphaPicture (pScreen, pDst, maskFormat,
|
|
+ bounds.x2 - bounds.x1,
|
|
+ bounds.y2 - bounds.y1);
|
|
+ if (!pPicture)
|
|
+ return;
|
|
+ (*ps->AddTriangles) (pPicture, -bounds.x1, -bounds.y1, ntri, tris);
|
|
+
|
|
+ xRel = bounds.x1 + xSrc - xDst;
|
|
+ yRel = bounds.y1 + ySrc - yDst;
|
|
+ CompositePicture (op, pSrc, pPicture, pDst,
|
|
+ xRel, yRel, 0, 0, bounds.x1, bounds.y1,
|
|
+ bounds.x2 - bounds.x1, bounds.y2 - bounds.y1);
|
|
+ FreePicture (pPicture, 0);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ if (pDst->polyEdge == PolyEdgeSharp)
|
|
+ maskFormat = PictureMatchFormat (pScreen, 1, PICT_a1);
|
|
+ else
|
|
+ maskFormat = PictureMatchFormat (pScreen, 8, PICT_a8);
|
|
+
|
|
+ for (; ntri; ntri--, tris++)
|
|
+ miTriangles (op, pSrc, pDst, maskFormat, xSrc, ySrc, 1, tris);
|
|
+ }
|
|
+}
|
|
+
|
|
--
|
|
1.8.4.1
|
|
|