#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include "Ps.h"
#include "gcstruct.h"
#include "windowstr.h"
void
PsPolyRectangle(
DrawablePtr pDrawable,
GCPtr pGC,
int nRects,
xRectangle *pRects)
{
if( pDrawable->type==DRAWABLE_PIXMAP )
{
DisplayElmPtr elm;
PixmapPtr pix = (PixmapPtr)pDrawable;
PsPixmapPrivPtr priv = (PsPixmapPrivPtr)pix->devPrivate.ptr;
DisplayListPtr disp;
GCPtr gc;
if ((gc = PsCreateAndCopyGC(pDrawable, pGC)) == NULL) return;
disp = PsGetFreeDisplayBlock(priv);
elm = &disp->elms[disp->nelms];
elm->type = PolyRectangleCmd;
elm->gc = gc;
elm->c.rects.nRects = nRects;
elm->c.rects.pRects = (xRectangle *)xalloc(nRects*sizeof(xRectangle));
memcpy(elm->c.rects.pRects, pRects, nRects*sizeof(xRectangle));
disp->nelms += 1;
}
else
{
int i;
PsOutPtr psOut;
ColormapPtr cMap;
if( PsUpdateDrawableGC(pGC, pDrawable, &psOut, &cMap)==FALSE ) return;
PsOut_Offset(psOut, pDrawable->x, pDrawable->y);
PsOut_Color(psOut, PsGetPixelColor(cMap, pGC->fgPixel));
PsLineAttrs(psOut, pGC, cMap);
for( i=0 ; i<nRects ; i++ )
{
PsOut_DrawRect(psOut, (int)pRects[i].x, (int)pRects[i].y,
(int)pRects[i].width, (int)pRects[i].height);
}
}
}
void
PsFillPolygon(
DrawablePtr pDrawable,
GCPtr pGC,
int shape,
int mode,
int nPoints,
DDXPointPtr pPoints)
{
if( pDrawable->type==DRAWABLE_PIXMAP )
{
DisplayElmPtr elm;
PixmapPtr pix = (PixmapPtr)pDrawable;
PsPixmapPrivPtr priv = (PsPixmapPrivPtr)pix->devPrivate.ptr;
DisplayListPtr disp;
GCPtr gc;
if ((gc = PsCreateAndCopyGC(pDrawable, pGC)) == NULL) return;
disp = PsGetFreeDisplayBlock(priv);
elm = &disp->elms[disp->nelms];
elm->type = FillPolygonCmd;
elm->gc = gc;
elm->c.polyPts.mode = mode;
elm->c.polyPts.nPoints = nPoints;
elm->c.polyPts.pPoints = (xPoint *)xalloc(nPoints*sizeof(xPoint));
memcpy(elm->c.polyPts.pPoints, pPoints, nPoints*sizeof(xPoint));
disp->nelms += 1;
}
else
{
int i;
PsOutPtr psOut;
PsPointPtr pts;
PsRuleEnum rule;
ColormapPtr cMap;
if( PsUpdateDrawableGC(pGC, pDrawable, &psOut, &cMap)==FALSE ) return;
PsOut_Offset(psOut, pDrawable->x, pDrawable->y);
PsSetFillColor(pDrawable, pGC, psOut, cMap);
if( pGC->fillRule==EvenOddRule ) rule = PsEvenOdd;
else rule = PsNZWinding;
PsOut_FillRule(psOut, rule);
pts = (PsPointPtr)xalloc(sizeof(PsPointRec)*nPoints);
if( mode==CoordModeOrigin )
{
for( i=0 ; i<nPoints ; i++ )
{ pts[i].x = pPoints[i].x; pts[i].y = pPoints[i].y; }
}
else
{
i = 0;
pts[0].x = pPoints[i].x; pts[0].y = pPoints[i].y;
for( i=1 ; i<nPoints ; i++ )
{
pts[i].x = pts[i-1].x+pPoints[i].x;
pts[i].y = pts[i-1].y+pPoints[i].y;
}
}
PsOut_Polygon(psOut, nPoints, pts);
xfree(pts);
}
}
void
PsPolyFillRect(
DrawablePtr pDrawable,
GCPtr pGC,
int nRects,
xRectangle *pRects)
{
if( pDrawable->type==DRAWABLE_PIXMAP )
{
DisplayElmPtr elm;
PixmapPtr pix = (PixmapPtr)pDrawable;
PsPixmapPrivPtr priv = (PsPixmapPrivPtr)pix->devPrivate.ptr;
DisplayListPtr disp;
GCPtr gc;
#ifdef DBE
if (nRects == 1)
{
if ( (pRects[0].x==0) && (pRects[0].y==0) &&
(pRects[0].width==pDrawable->width) && (pRects[0].height==pDrawable->height) &&
(pGC->fillStyle == FillSolid) &&
(noDbeExtension == False))
{
#ifdef DEBUG_gismobile
ErrorF("PsPolyFillRect: scrubbing pixmap...\n");
#endif
PsScrubPixmap((PixmapPtr)pDrawable);
}
}
#endif
if ((gc = PsCreateAndCopyGC(pDrawable, pGC)) == NULL) return;
disp = PsGetFreeDisplayBlock(priv);
elm = &disp->elms[disp->nelms];
elm->type = PolyFillRectCmd;
elm->gc = gc;
elm->c.rects.nRects = nRects;
elm->c.rects.pRects = (xRectangle *)xalloc(nRects*sizeof(xRectangle));
memcpy(elm->c.rects.pRects, pRects, nRects*sizeof(xRectangle));
disp->nelms += 1;
}
else
{
int i;
PsOutPtr psOut;
ColormapPtr cMap;
if( PsUpdateDrawableGC(pGC, pDrawable, &psOut, &cMap)==FALSE ) return;
PsOut_Offset(psOut, pDrawable->x, pDrawable->y);
PsSetFillColor(pDrawable, pGC, psOut, cMap);
for( i=0 ; i<nRects ; i++ )
{
PsOut_FillRect(psOut, (int)pRects[i].x, (int)pRects[i].y,
(int)pRects[i].width, (int)pRects[i].height);
}
}
}