[PATCH 13/13] mi: Draw all points/spans for miZeroPolyArc at once if possible
walter harms
wharms at bfs.de
Tue May 6 04:23:08 PDT 2014
Am 06.05.2014 00:02, schrieb Keith Packard:
> Drawing all of the spans in one driver call is a considerable
> performance improvement, which we can do unless the arcs are
> double-dashed, in which case overlapping dashes should draw the latter
> arc contents.
>
> Signed-off-by: Keith Packard <keithp at keithp.com>
> ---
> mi/mizerarc.c | 40 ++++++++++++++++++++++++++++++++++------
> 1 file changed, 34 insertions(+), 6 deletions(-)
>
> diff --git a/mi/mizerarc.c b/mi/mizerarc.c
> index 9dac180..e39cd82 100644
> --- a/mi/mizerarc.c
> +++ b/mi/mizerarc.c
> @@ -653,6 +653,10 @@ miZeroPolyArc(DrawablePtr pDraw, GCPtr pGC, int narcs, xArc * parcs)
> int *widths = NULL;
> XID fgPixel = pGC->fgPixel;
> DashInfo dinfo;
> + Bool gather_points;
> + int mul_points;
> + DDXPointPtr points_base;
> + int *widths_base = NULL;
>
> for (arc = parcs, i = narcs; --i >= 0; arc++) {
> if (!miCanZeroArc(arc))
> @@ -669,9 +673,17 @@ miZeroPolyArc(DrawablePtr pDraw, GCPtr pGC, int narcs, xArc * parcs)
> if (!maxPts)
> return;
> numPts = maxPts << 2;
> +
> + gather_points = FALSE;
> + mul_points = 1;
> + if (pGC->lineStyle != LineDoubleDash) {
> + gather_points = TRUE;
> + mul_points = narcs;
> + }
> +
> dospans = (pGC->fillStyle != FillSolid);
> if (dospans) {
> - widths = malloc(sizeof(int) * numPts);
> + widths_base = widths = malloc(sizeof(int) * numPts * mul_points);
calloc() ?
> if (!widths)
> return;
> maxw = 0;
> @@ -687,7 +699,7 @@ miZeroPolyArc(DrawablePtr pDraw, GCPtr pGC, int narcs, xArc * parcs)
> (unsigned char *) pGC->dash, (int) pGC->numInDashList,
> &dinfo.dashOffsetInit);
> }
> - points = malloc(sizeof(DDXPointRec) * numPts);
> + points_base = points = malloc(sizeof(DDXPointRec) * numPts * mul_points);
calloc() ?
re,
wh
> if (!points) {
> if (dospans) {
> free(widths);
> @@ -707,9 +719,12 @@ miZeroPolyArc(DrawablePtr pDraw, GCPtr pGC, int narcs, xArc * parcs)
> dinfo.skipStart = TRUE;
> }
> n = pts - points;
> - if (!dospans)
> - (*pGC->ops->PolyPoint) (pDraw, pGC, CoordModeOrigin, n, points);
> - else {
> + if (!dospans) {
> + if (gather_points)
> + points += n;
> + else
> + (*pGC->ops->PolyPoint) (pDraw, pGC, CoordModeOrigin, n, points);
> + } else {
> if (n > maxw) {
> while (maxw < n)
> widths[maxw++] = 1;
> @@ -720,7 +735,11 @@ miZeroPolyArc(DrawablePtr pDraw, GCPtr pGC, int narcs, xArc * parcs)
> pt->y += pDraw->y;
> }
> }
> - (*pGC->ops->FillSpans) (pDraw, pGC, n, points, widths, FALSE);
> + if (gather_points) {
> + points += n;
> + widths += n;
> + } else
> + (*pGC->ops->FillSpans) (pDraw, pGC, n, points, widths, FALSE);
> }
> if (pGC->lineStyle != LineDoubleDash)
> continue;
> @@ -760,6 +779,15 @@ miZeroPolyArc(DrawablePtr pDraw, GCPtr pGC, int narcs, xArc * parcs)
> }
> }
> }
> + if (gather_points) {
> + if (!dospans)
> + (*pGC->ops->PolyPoint) (pDraw, pGC, CoordModeOrigin, points - points_base, points_base);
> + else {
> + (*pGC->ops->FillSpans) (pDraw, pGC, points - points_base, points_base, widths_base, FALSE);
> + widths = widths_base;
> + }
> + points = points_base;
> + }
> free(points);
> if (dospans) {
> free(widths);
More information about the xorg-devel
mailing list