Merge remote branch 'jamey/for-keith'

This commit is contained in:
Keith Packard 2010-05-10 13:49:33 -07:00
commit 95074538cc
4 changed files with 120 additions and 146 deletions

117
dix/gc.c
View File

@ -263,78 +263,68 @@ dixChangeGC(ClientPtr client, GC *pGC, BITS32 mask, CARD32 *pC32, ChangeGCValPtr
break;
}
case GCTile:
{
XID newpix = 0;
if (pUnion)
{
NEXT_PTR(PixmapPtr, pPixmap);
rc = Success;
}
else
{
XID newpix;
NEXTVAL(XID, newpix);
rc = dixLookupResourceByType((pointer *)&pPixmap, newpix,
RT_PIXMAP, client, DixReadAccess);
if (rc != Success)
{
clientErrorValue = newpix;
error = (rc == BadValue) ? BadPixmap : rc;
break;
}
}
if (rc == Success)
if ((pPixmap->drawable.depth != pGC->depth) ||
(pPixmap->drawable.pScreen != pGC->pScreen))
{
if ((pPixmap->drawable.depth != pGC->depth) ||
(pPixmap->drawable.pScreen != pGC->pScreen))
{
error = BadMatch;
}
else
{
pPixmap->refcnt++;
if (!pGC->tileIsPixel)
(* pGC->pScreen->DestroyPixmap)(pGC->tile.pixmap);
pGC->tileIsPixel = FALSE;
pGC->tile.pixmap = pPixmap;
}
error = BadMatch;
}
else
{
clientErrorValue = newpix;
error = (rc == BadValue) ? BadPixmap : rc;
pPixmap->refcnt++;
if (!pGC->tileIsPixel)
(* pGC->pScreen->DestroyPixmap)(pGC->tile.pixmap);
pGC->tileIsPixel = FALSE;
pGC->tile.pixmap = pPixmap;
}
break;
}
case GCStipple:
{
XID newstipple = 0;
if (pUnion)
{
NEXT_PTR(PixmapPtr, pPixmap);
rc = Success;
}
else
{
XID newstipple;
NEXTVAL(XID, newstipple)
rc = dixLookupResourceByType((pointer *)&pPixmap, newstipple,
RT_PIXMAP, client, DixReadAccess);
if (rc != Success)
{
clientErrorValue = newstipple;
error = (rc == BadValue) ? BadPixmap : rc;
break;
}
}
if (rc == Success)
if ((pPixmap->drawable.depth != 1) ||
(pPixmap->drawable.pScreen != pGC->pScreen))
{
if ((pPixmap->drawable.depth != 1) ||
(pPixmap->drawable.pScreen != pGC->pScreen))
{
error = BadMatch;
}
else
{
pPixmap->refcnt++;
if (pGC->stipple)
(* pGC->pScreen->DestroyPixmap)(pGC->stipple);
pGC->stipple = pPixmap;
}
error = BadMatch;
}
else
{
clientErrorValue = newstipple;
error = (rc == BadValue) ? BadPixmap : rc;
pPixmap->refcnt++;
if (pGC->stipple)
(* pGC->pScreen->DestroyPixmap)(pGC->stipple);
pGC->stipple = pPixmap;
}
break;
}
case GCTileStipXOrigin:
NEXTVAL(INT16, pGC->patOrg.x);
break;
@ -344,30 +334,27 @@ dixChangeGC(ClientPtr client, GC *pGC, BITS32 mask, CARD32 *pC32, ChangeGCValPtr
case GCFont:
{
FontPtr pFont;
XID newfont = 0;
if (pUnion)
{
NEXT_PTR(FontPtr, pFont);
rc = Success;
}
else
{
XID newfont;
NEXTVAL(XID, newfont)
rc = dixLookupResourceByType((pointer *)&pFont, newfont,
RT_FONT, client, DixUseAccess);
if (rc != Success)
{
clientErrorValue = newfont;
error = (rc == BadValue) ? BadFont : rc;
break;
}
}
if (rc == Success)
{
pFont->refcnt++;
if (pGC->font)
CloseFont(pGC->font, (Font)0);
pGC->font = pFont;
}
else
{
clientErrorValue = newfont;
error = (rc == BadValue) ? BadFont : rc;
}
pFont->refcnt++;
if (pGC->font)
CloseFont(pGC->font, (Font)0);
pGC->font = pFont;
break;
}
case GCSubwindowMode:
@ -403,22 +390,16 @@ dixChangeGC(ClientPtr client, GC *pGC, BITS32 mask, CARD32 *pC32, ChangeGCValPtr
NEXTVAL(INT16, pGC->clipOrg.y);
break;
case GCClipMask:
{
Pixmap pid = 0;
int clipType = 0;
if (pUnion)
{
NEXT_PTR(PixmapPtr, pPixmap);
}
else
{
Pixmap pid;
NEXTVAL(Pixmap, pid)
if (pid == None)
{
clipType = CT_NONE;
pPixmap = NullPixmap;
}
else {
rc = dixLookupResourceByType((pointer *)&pPixmap, pid,
RT_PIXMAP, client,
@ -426,6 +407,7 @@ dixChangeGC(ClientPtr client, GC *pGC, BITS32 mask, CARD32 *pC32, ChangeGCValPtr
if (rc != Success) {
clientErrorValue = pid;
error = (rc == BadValue) ? BadPixmap : rc;
break;
}
}
}
@ -436,20 +418,13 @@ dixChangeGC(ClientPtr client, GC *pGC, BITS32 mask, CARD32 *pC32, ChangeGCValPtr
(pPixmap->drawable.pScreen != pGC->pScreen))
{
error = BadMatch;
break;
}
else
{
clipType = CT_PIXMAP;
pPixmap->refcnt++;
}
}
if(error == Success)
{
(*pGC->funcs->ChangeClip)(pGC, clipType,
(pointer)pPixmap, 0);
pPixmap->refcnt++;
}
(*pGC->funcs->ChangeClip)(pGC, pPixmap ? CT_PIXMAP : CT_NONE,
(pointer)pPixmap, 0);
break;
}
case GCDashOffset:
NEXTVAL(INT16, pGC->dashOffset);
break;

View File

@ -73,6 +73,9 @@ miPolyPoint(
int i;
xPoint *ppt;
if(!(pwidthInit = xalloc(npt * sizeof(int))))
return;
/* make pointlist origin relative */
if (mode == CoordModePrevious)
{
@ -107,8 +110,6 @@ miPolyPoint(
DoChangeGC(pGC, GCFillStyle, &fsNew, 0);
ValidateGC(pDrawable, pGC);
}
if(!(pwidthInit = xalloc(npt * sizeof(int))))
return;
pwidth = pwidthInit;
for(i = 0; i < npt; i++)
*pwidth++ = 1;

View File

@ -52,6 +52,33 @@ from The Open Group.
#include "miwideline.h"
#include "mi.h"
/*
* interface data to span-merging polygon filler
*/
typedef struct _SpanData {
SpanGroup fgGroup, bgGroup;
} SpanDataRec, *SpanDataPtr;
static void
AppendSpanGroup(GCPtr pGC, unsigned long pixel, Spans *spanPtr, SpanDataPtr spanData)
{
SpanGroup *group, *othergroup = NULL;
if (pixel == pGC->fgPixel)
{
group = &spanData->fgGroup;
if (pGC->lineStyle == LineDoubleDash)
othergroup = &spanData->bgGroup;
}
else
{
group = &spanData->bgGroup;
othergroup = &spanData->fgGroup;
}
miAppendSpans (group, othergroup, spanPtr);
}
static void miLineArc(DrawablePtr pDraw, GCPtr pGC,
unsigned long pixel, SpanDataPtr spanData,
LineFacePtr leftFace,
@ -138,8 +165,31 @@ miFillPolyHelper (DrawablePtr pDrawable, GCPtr pGC, unsigned long pixel,
while ((left_count || left_height) &&
(right_count || right_height))
{
MIPOLYRELOADLEFT
MIPOLYRELOADRIGHT
if (!left_height && left_count)
{
left_height = left->height;
left_x = left->x;
left_stepx = left->stepx;
left_signdx = left->signdx;
left_e = left->e;
left_dy = left->dy;
left_dx = left->dx;
--left_count;
++left;
}
if (!right_height && right_count)
{
right_height = right->height;
right_x = right->x;
right_stepx = right->stepx;
right_signdx = right->signdx;
right_e = right->e;
right_dy = right->dy;
right_dx = right->dx;
--right_count;
++right;
}
height = left_height;
if (height > right_height)
@ -157,11 +207,23 @@ miFillPolyHelper (DrawablePtr pDrawable, GCPtr pGC, unsigned long pixel,
ppt++;
*pwidth++ = right_x - left_x + 1;
}
y++;
MIPOLYSTEPLEFT
y++;
MIPOLYSTEPRIGHT
left_x += left_stepx;
left_e += left_dx;
if (left_e > 0)
{
left_x += left_signdx;
left_e -= left_dy;
}
right_x += right_stepx;
right_e += right_dx;
if (right_e > 0)
{
right_x += right_signdx;
right_e -= right_dy;
}
}
}
if (!spanData)
@ -178,7 +240,7 @@ miFillPolyHelper (DrawablePtr pDrawable, GCPtr pGC, unsigned long pixel,
else
{
spanRec.count = ppt - spanRec.points;
AppendSpanGroup (pGC, pixel, &spanRec, spanData)
AppendSpanGroup (pGC, pixel, &spanRec, spanData);
}
}
@ -247,7 +309,7 @@ miFillRectPolyHelper (
y++;
}
spanRec.count = ppt - spanRec.points;
AppendSpanGroup (pGC, pixel, &spanRec, spanData)
AppendSpanGroup (pGC, pixel, &spanRec, spanData);
}
}
@ -1097,7 +1159,7 @@ miLineArc (
else
{
spanRec.count = n;
AppendSpanGroup (pGC, pixel, &spanRec, spanData)
AppendSpanGroup (pGC, pixel, &spanRec, spanData);
}
}

View File

@ -31,30 +31,6 @@ from The Open Group.
#include "mispans.h"
#include "mifpoly.h" /* for ICEIL */
/*
* interface data to span-merging polygon filler
*/
typedef struct _SpanData {
SpanGroup fgGroup, bgGroup;
} SpanDataRec, *SpanDataPtr;
#define AppendSpanGroup(pGC, pixel, spanPtr, spanData) { \
SpanGroup *group, *othergroup = NULL; \
if (pixel == pGC->fgPixel) \
{ \
group = &spanData->fgGroup; \
if (pGC->lineStyle == LineDoubleDash) \
othergroup = &spanData->bgGroup; \
} \
else \
{ \
group = &spanData->bgGroup; \
othergroup = &spanData->fgGroup; \
} \
miAppendSpans (group, othergroup, spanPtr); \
}
/*
* Polygon edge description for integer wide-line routines
*/
@ -99,46 +75,6 @@ typedef struct _LineFace {
* macros for polygon fillers
*/
#define MIPOLYRELOADLEFT if (!left_height && left_count) { \
left_height = left->height; \
left_x = left->x; \
left_stepx = left->stepx; \
left_signdx = left->signdx; \
left_e = left->e; \
left_dy = left->dy; \
left_dx = left->dx; \
--left_count; \
++left; \
}
#define MIPOLYRELOADRIGHT if (!right_height && right_count) { \
right_height = right->height; \
right_x = right->x; \
right_stepx = right->stepx; \
right_signdx = right->signdx; \
right_e = right->e; \
right_dy = right->dy; \
right_dx = right->dx; \
--right_count; \
++right; \
}
#define MIPOLYSTEPLEFT left_x += left_stepx; \
left_e += left_dx; \
if (left_e > 0) \
{ \
left_x += left_signdx; \
left_e -= left_dy; \
}
#define MIPOLYSTEPRIGHT right_x += right_stepx; \
right_e += right_dx; \
if (right_e > 0) \
{ \
right_x += right_signdx; \
right_e -= right_dy; \
}
#define MILINESETPIXEL(pDrawable, pGC, pixel, oldPixel) { \
oldPixel = pGC->fgPixel; \
if (pixel != oldPixel) { \