diff options
Diffstat (limited to 'pkgs/servers/x11/xorg/darwin/5004-Use-old-miTrapezoids-and-miTriangles-routines.patch')
-rw-r--r-- | pkgs/servers/x11/xorg/darwin/5004-Use-old-miTrapezoids-and-miTriangles-routines.patch | 297 |
1 files changed, 297 insertions, 0 deletions
diff --git a/pkgs/servers/x11/xorg/darwin/5004-Use-old-miTrapezoids-and-miTriangles-routines.patch b/pkgs/servers/x11/xorg/darwin/5004-Use-old-miTrapezoids-and-miTriangles-routines.patch new file mode 100644 index 00000000000..f70ddf9e6af --- /dev/null +++ b/pkgs/servers/x11/xorg/darwin/5004-Use-old-miTrapezoids-and-miTriangles-routines.patch @@ -0,0 +1,297 @@ +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 + |