miwideline: Factor out span buffer allocation.
Signed-off-by: Jamey Sharp <jamey@minilop.net> Reviewed-by: Keith Packard <keithp@keithp.com> Reviewed-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
parent
c9e7ca4404
commit
83f7ec9727
106
mi/miwideline.c
106
mi/miwideline.c
|
@ -52,6 +52,21 @@ from The Open Group.
|
|||
#include "miwideline.h"
|
||||
#include "mi.h"
|
||||
|
||||
static Bool
|
||||
InitSpans(Spans *spans, size_t nspans)
|
||||
{
|
||||
spans->points = malloc(nspans * sizeof (*spans->points));
|
||||
if (!spans->points)
|
||||
return FALSE;
|
||||
spans->widths = malloc(nspans * sizeof (*spans->widths));
|
||||
if (!spans->widths)
|
||||
{
|
||||
free(spans->points);
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* interface data to span-merging polygon filler
|
||||
*/
|
||||
|
@ -110,9 +125,7 @@ miFillPolyHelper (DrawablePtr pDrawable, GCPtr pGC, unsigned long pixel,
|
|||
int left_height = 0, right_height = 0;
|
||||
|
||||
DDXPointPtr ppt;
|
||||
DDXPointPtr pptInit = NULL;
|
||||
int *pwidth;
|
||||
int *pwidthInit = NULL;
|
||||
XID oldPixel;
|
||||
int xorg;
|
||||
Spans spanRec;
|
||||
|
@ -120,19 +133,12 @@ miFillPolyHelper (DrawablePtr pDrawable, GCPtr pGC, unsigned long pixel,
|
|||
left_height = 0;
|
||||
right_height = 0;
|
||||
|
||||
if (!InitSpans(&spanRec, overall_height))
|
||||
return;
|
||||
ppt = spanRec.points;
|
||||
pwidth = spanRec.widths;
|
||||
if (!spanData)
|
||||
{
|
||||
pptInit = malloc(overall_height * sizeof(*ppt));
|
||||
if (!pptInit)
|
||||
return;
|
||||
pwidthInit = malloc(overall_height * sizeof(*pwidth));
|
||||
if (!pwidthInit)
|
||||
{
|
||||
free(pptInit);
|
||||
return;
|
||||
}
|
||||
ppt = pptInit;
|
||||
pwidth = pwidthInit;
|
||||
oldPixel = pGC->fgPixel;
|
||||
if (pixel != oldPixel)
|
||||
{
|
||||
|
@ -141,20 +147,6 @@ miFillPolyHelper (DrawablePtr pDrawable, GCPtr pGC, unsigned long pixel,
|
|||
ValidateGC (pDrawable, pGC);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
spanRec.points = malloc(overall_height * sizeof (*ppt));
|
||||
if (!spanRec.points)
|
||||
return;
|
||||
spanRec.widths = malloc(overall_height * sizeof (int));
|
||||
if (!spanRec.widths)
|
||||
{
|
||||
free(spanRec.points);
|
||||
return;
|
||||
}
|
||||
ppt = spanRec.points;
|
||||
pwidth = spanRec.widths;
|
||||
}
|
||||
|
||||
xorg = 0;
|
||||
if (pGC->miTranslate)
|
||||
|
@ -226,11 +218,12 @@ miFillPolyHelper (DrawablePtr pDrawable, GCPtr pGC, unsigned long pixel,
|
|||
}
|
||||
}
|
||||
}
|
||||
spanRec.count = ppt - spanRec.points;
|
||||
if (!spanData)
|
||||
{
|
||||
(*pGC->ops->FillSpans) (pDrawable, pGC, ppt - pptInit, pptInit, pwidthInit, TRUE);
|
||||
free(pwidthInit);
|
||||
free(pptInit);
|
||||
(*pGC->ops->FillSpans) (pDrawable, pGC, spanRec.count, spanRec.points, spanRec.widths, TRUE);
|
||||
free(spanRec.widths);
|
||||
free(spanRec.points);
|
||||
if (pixel != oldPixel)
|
||||
{
|
||||
dixChangeGC (NullClient, pGC, GCForeground, &oldPixel, NULL);
|
||||
|
@ -238,10 +231,7 @@ miFillPolyHelper (DrawablePtr pDrawable, GCPtr pGC, unsigned long pixel,
|
|||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
spanRec.count = ppt - spanRec.points;
|
||||
AppendSpanGroup (pGC, pixel, &spanRec, spanData);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -283,15 +273,8 @@ miFillRectPolyHelper (
|
|||
}
|
||||
else
|
||||
{
|
||||
spanRec.points = malloc(h * sizeof (*ppt));
|
||||
if (!spanRec.points)
|
||||
if (!InitSpans(&spanRec, h))
|
||||
return;
|
||||
spanRec.widths = malloc(h * sizeof (int));
|
||||
if (!spanRec.widths)
|
||||
{
|
||||
free(spanRec.points);
|
||||
return;
|
||||
}
|
||||
ppt = spanRec.points;
|
||||
pwidth = spanRec.widths;
|
||||
|
||||
|
@ -1058,8 +1041,6 @@ miLineArc (
|
|||
double yorg,
|
||||
Bool isInt)
|
||||
{
|
||||
DDXPointPtr points;
|
||||
int *widths;
|
||||
int xorgi = 0, yorgi = 0;
|
||||
XID oldPixel;
|
||||
Spans spanRec;
|
||||
|
@ -1105,17 +1086,10 @@ miLineArc (
|
|||
}
|
||||
isInt = FALSE;
|
||||
}
|
||||
if (!InitSpans(&spanRec, pGC->lineWidth))
|
||||
return;
|
||||
if (!spanData)
|
||||
{
|
||||
points = malloc(sizeof(DDXPointRec) * pGC->lineWidth);
|
||||
if (!points)
|
||||
return;
|
||||
widths = malloc(sizeof(int) * pGC->lineWidth);
|
||||
if (!widths)
|
||||
{
|
||||
free(points);
|
||||
return;
|
||||
}
|
||||
oldPixel = pGC->fgPixel;
|
||||
if (pixel != oldPixel)
|
||||
{
|
||||
|
@ -1124,32 +1098,19 @@ miLineArc (
|
|||
ValidateGC (pDraw, pGC);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
points = malloc(pGC->lineWidth * sizeof (DDXPointRec));
|
||||
if (!points)
|
||||
return;
|
||||
widths = malloc(pGC->lineWidth * sizeof (int));
|
||||
if (!widths)
|
||||
{
|
||||
free(points);
|
||||
return;
|
||||
}
|
||||
spanRec.points = points;
|
||||
spanRec.widths = widths;
|
||||
}
|
||||
if (isInt)
|
||||
n = miLineArcI(pDraw, pGC, xorgi, yorgi, points, widths);
|
||||
n = miLineArcI(pDraw, pGC, xorgi, yorgi, spanRec.points, spanRec.widths);
|
||||
else
|
||||
n = miLineArcD(pDraw, pGC, xorg, yorg, points, widths,
|
||||
n = miLineArcD(pDraw, pGC, xorg, yorg, spanRec.points, spanRec.widths,
|
||||
&edge1, edgey1, edgeleft1,
|
||||
&edge2, edgey2, edgeleft2);
|
||||
spanRec.count = n;
|
||||
|
||||
if (!spanData)
|
||||
{
|
||||
(*pGC->ops->FillSpans)(pDraw, pGC, n, points, widths, TRUE);
|
||||
free(widths);
|
||||
free(points);
|
||||
(*pGC->ops->FillSpans)(pDraw, pGC, spanRec.count, spanRec.points, spanRec.widths, TRUE);
|
||||
free(spanRec.widths);
|
||||
free(spanRec.points);
|
||||
if (pixel != oldPixel)
|
||||
{
|
||||
dixChangeGC(NullClient, pGC, GCForeground, &oldPixel, NULL);
|
||||
|
@ -1157,10 +1118,7 @@ miLineArc (
|
|||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
spanRec.count = n;
|
||||
AppendSpanGroup (pGC, pixel, &spanRec, spanData);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
Loading…
Reference in New Issue