diff options
Diffstat (limited to 'render')
-rw-r--r-- | render/mipict.c | 61 | ||||
-rw-r--r-- | render/mipict.h | 20 | ||||
-rw-r--r-- | render/picture.c | 44 | ||||
-rw-r--r-- | render/picturestr.h | 21 |
4 files changed, 114 insertions, 32 deletions
diff --git a/render/mipict.c b/render/mipict.c index 9a44c2729..0b86bee34 100644 --- a/render/mipict.c +++ b/render/mipict.c @@ -569,6 +569,64 @@ miRenderPixelToColor (PictFormatPtr format, } } +void +miTriStrip (CARD8 op, + PicturePtr pSrc, + PicturePtr pDst, + PictFormatPtr maskFormat, + INT16 xSrc, + INT16 ySrc, + int npoints, + xPointFixed *points) +{ + xTriangle *tris, *tri; + int ntri; + + ntri = npoints - 2; + tris = malloc(ntri * sizeof (xTriangle)); + if (!tris) + return; + + for (tri = tris; npoints >= 3; npoints--, points++, tri++) + { + tri->p1 = points[0]; + tri->p2 = points[1]; + tri->p3 = points[2]; + } + CompositeTriangles (op, pSrc, pDst, maskFormat, xSrc, ySrc, ntri, tris); + free(tris); +} + +void +miTriFan (CARD8 op, + PicturePtr pSrc, + PicturePtr pDst, + PictFormatPtr maskFormat, + INT16 xSrc, + INT16 ySrc, + int npoints, + xPointFixed *points) +{ + xTriangle *tris, *tri; + xPointFixed *first; + int ntri; + + ntri = npoints - 2; + tris = malloc(ntri * sizeof (xTriangle)); + if (!tris) + return; + + first = points++; + for (tri = tris; npoints >= 3; npoints--, points++, tri++) + { + tri->p1 = *first; + tri->p2 = points[0]; + tri->p3 = points[1]; + } + CompositeTriangles (op, pSrc, pDst, maskFormat, xSrc, ySrc, ntri, tris); + free(tris); +} + Bool miPictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats) { @@ -602,5 +660,8 @@ miPictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats) ps->AddTraps = 0; /* requires DDX support */ ps->AddTriangles = 0; /* requires DDX support */ + ps->TriStrip = miTriStrip; /* converts call to CompositeTriangles */ + ps->TriFan = miTriFan; + return TRUE; } diff --git a/render/mipict.h b/render/mipict.h index f6d9deefd..4399a6fad 100644 --- a/render/mipict.h +++ b/render/mipict.h @@ -140,6 +140,26 @@ miCompositeRects (CARD8 op, xRectangle *rects); extern _X_EXPORT void +miTriStrip (CARD8 op, + PicturePtr pSrc, + PicturePtr pDst, + PictFormatPtr maskFormat, + INT16 xSrc, + INT16 ySrc, + int npoints, + xPointFixed *points); + +extern _X_EXPORT void +miTriFan (CARD8 op, + PicturePtr pSrc, + PicturePtr pDst, + PictFormatPtr maskFormat, + INT16 xSrc, + INT16 ySrc, + int npoints, + xPointFixed *points); + +extern _X_EXPORT void miTrapezoidBounds (int ntrap, xTrapezoid *traps, BoxPtr box); extern _X_EXPORT void diff --git a/render/picture.c b/render/picture.c index 5640c4d96..f13459665 100644 --- a/render/picture.c +++ b/render/picture.c @@ -1715,23 +1715,14 @@ CompositeTriStrip (CARD8 op, int npoints, xPointFixed *points) { - xTriangle *tris, *tri; - int ntri; - + PictureScreenPtr ps = GetPictureScreen(pDst->pDrawable->pScreen); + if (npoints < 3) return; - ntri = npoints - 2; - tris = malloc(ntri * sizeof (xTriangle)); - if (!tris) - return; - for (tri = tris; npoints >= 3; npoints--, points++, tri++) - { - tri->p1 = points[0]; - tri->p2 = points[1]; - tri->p3 = points[2]; - } - CompositeTriangles (op, pSrc, pDst, maskFormat, xSrc, ySrc, ntri, tris); - free(tris); + + ValidatePicture (pSrc); + ValidatePicture (pDst); + (*ps->TriStrip) (op, pSrc, pDst, maskFormat, xSrc, ySrc, npoints, points); } void @@ -1744,25 +1735,14 @@ CompositeTriFan (CARD8 op, int npoints, xPointFixed *points) { - xTriangle *tris, *tri; - xPointFixed *first; - int ntri; - + PictureScreenPtr ps = GetPictureScreen(pDst->pDrawable->pScreen); + if (npoints < 3) return; - ntri = npoints - 2; - tris = malloc(ntri * sizeof (xTriangle)); - if (!tris) - return; - first = points++; - for (tri = tris; npoints >= 3; npoints--, points++, tri++) - { - tri->p1 = *first; - tri->p2 = points[0]; - tri->p3 = points[1]; - } - CompositeTriangles (op, pSrc, pDst, maskFormat, xSrc, ySrc, ntri, tris); - free(tris); + + ValidatePicture (pSrc); + ValidatePicture (pDst); + (*ps->TriFan) (op, pSrc, pDst, maskFormat, xSrc, ySrc, npoints, points); } void diff --git a/render/picturestr.h b/render/picturestr.h index 7b7f9112d..1f3f5a433 100644 --- a/render/picturestr.h +++ b/render/picturestr.h @@ -260,6 +260,24 @@ typedef void (*TrianglesProcPtr) (CARD8 op, int ntri, xTriangle *tris); +typedef void (*TriStripProcPtr) (CARD8 op, + PicturePtr pSrc, + PicturePtr pDst, + PictFormatPtr maskFormat, + INT16 xSrc, + INT16 ySrc, + int npoint, + xPointFixed *points); + +typedef void (*TriFanProcPtr) (CARD8 op, + PicturePtr pSrc, + PicturePtr pDst, + PictFormatPtr maskFormat, + INT16 xSrc, + INT16 ySrc, + int npoint, + xPointFixed *points); + typedef Bool (*InitIndexedProcPtr) (ScreenPtr pScreen, PictFormatPtr pFormat); @@ -348,6 +366,9 @@ typedef struct _PictureScreen { RealizeGlyphProcPtr RealizeGlyph; UnrealizeGlyphProcPtr UnrealizeGlyph; +#define PICTURE_SCREEN_VERSION 2 + TriStripProcPtr TriStrip; + TriFanProcPtr TriFan; } PictureScreenRec, *PictureScreenPtr; extern _X_EXPORT DevPrivateKeyRec PictureScreenPrivateKeyRec; |