diff options
Diffstat (limited to 'xorg-server/mi/miwideline.c')
-rw-r--r-- | xorg-server/mi/miwideline.c | 80 |
1 files changed, 71 insertions, 9 deletions
diff --git a/xorg-server/mi/miwideline.c b/xorg-server/mi/miwideline.c index 838b06c68..e726d4260 100644 --- a/xorg-server/mi/miwideline.c +++ b/xorg-server/mi/miwideline.c @@ -56,6 +56,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, @@ -142,8 +169,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) @@ -161,11 +211,23 @@ miFillPolyHelper (DrawablePtr pDrawable, GCPtr pGC, unsigned long pixel, ppt++; *pwidth++ = right_x - left_x + 1; } - y++; - - MIPOLYSTEPLEFT + y++; + + left_x += left_stepx; + left_e += left_dx; + if (left_e > 0) + { + left_x += left_signdx; + left_e -= left_dy; + } - MIPOLYSTEPRIGHT + right_x += right_stepx; + right_e += right_dx; + if (right_e > 0) + { + right_x += right_signdx; + right_e -= right_dy; + } } } if (!spanData) @@ -182,7 +244,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); } } @@ -251,7 +313,7 @@ miFillRectPolyHelper ( y++; } spanRec.count = ppt - spanRec.points; - AppendSpanGroup (pGC, pixel, &spanRec, spanData) + AppendSpanGroup (pGC, pixel, &spanRec, spanData); } } @@ -1101,7 +1163,7 @@ miLineArc ( else { spanRec.count = n; - AppendSpanGroup (pGC, pixel, &spanRec, spanData) + AppendSpanGroup (pGC, pixel, &spanRec, spanData); } } |