diff --git a/glamor/glamor_fill.c b/glamor/glamor_fill.c new file mode 100644 index 000000000..36e7badfb --- /dev/null +++ b/glamor/glamor_fill.c @@ -0,0 +1,84 @@ +/* + * Copyright © 2008 Intel Corporation + * Copyright © 1998 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef HAVE_DIX_CONFIG_H +#include +#endif + +#include "glamor_priv.h" + +/** @file glamor_fillspans.c + * + * GC fill implementation, based loosely on fb_fill.c + */ + +void +glamor_fill(DrawablePtr drawable, + GCPtr gc, + int x, + int y, + int width, + int height) +{ + PixmapPtr dst_pixmap = glamor_get_drawable_pixmap(drawable); + + switch (gc->fillStyle) { + case FillSolid: + glamor_solid(dst_pixmap, + x - dst_pixmap->screen_x, + y - dst_pixmap->screen_y, + width, + height, + gc->alu, + gc->planemask, + gc->fgPixel); + break; + case FillStippled: + case FillOpaqueStippled: + glamor_stipple(dst_pixmap, + gc->stipple, + x - dst_pixmap->screen_x, + y - dst_pixmap->screen_y, + width, + height, + gc->alu, + gc->planemask, + gc->fgPixel, + gc->bgPixel, + gc->patOrg.x - dst_pixmap->screen_x, + gc->patOrg.y - dst_pixmap->screen_y); + break; + case FillTiled: + glamor_tile(dst_pixmap, + gc->tile.pixmap, + x - dst_pixmap->screen_x, + y - dst_pixmap->screen_y, + width, + height, + gc->alu, + gc->planemask, + gc->patOrg.x - dst_pixmap->screen_y, + gc->patOrg.y - dst_pixmap->screen_y); + break; + } +} diff --git a/glamor/glamor_fillspans.c b/glamor/glamor_fillspans.c new file mode 100644 index 000000000..b0b704fd9 --- /dev/null +++ b/glamor/glamor_fillspans.c @@ -0,0 +1,108 @@ +/* + * Copyright © 1998 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef HAVE_DIX_CONFIG_H +#include +#endif + +/** @file glamor_fillspans.c + * + * FillSpans implementation, taken from fb_fillsp.c + */ +#include "glamor_priv.h" + +void +glamor_fill_spans(DrawablePtr drawable, + GCPtr gc, + int n, + DDXPointPtr points, + int *widths, + int sorted) +{ + RegionPtr clip = gc->pCompositeClip; + BoxPtr extents, boxes; + int nbox; + int extentX1, extentX2, extentY1, extentY2; + int fullX1, fullX2, fullY1; + int partX1, partX2; + ScreenPtr screen = drawable->pScreen; + PixmapPtr screen_pixmap = screen->GetScreenPixmap(screen); + PixmapPtr dest_pixmap = glamor_get_drawable_pixmap(drawable); + + if (dest_pixmap != screen_pixmap) { + fbFillSpans(drawable, gc, n, points, widths, sorted); + return; + } + + extents = REGION_EXTENTS(gc->pScreen, clip); + extentX1 = extents->x1; + extentY1 = extents->y1; + extentX2 = extents->x2; + extentY2 = extents->y2; + while (n--) { + fullX1 = points->x; + fullY1 = points->y; + fullX2 = fullX1 + *widths; + points++; + widths++; + + if (fullY1 < extentY1 || extentY2 <= fullY1) + continue; + + if (fullX1 < extentX1) + fullX1 = extentX1; + + if (fullX2 > extentX2) + fullX2 = extentX2; + + if (fullX1 >= fullX2) + continue; + + nbox = REGION_NUM_RECTS (clip); + if (nbox == 1) { + glamor_fill(drawable, + gc, + fullX1, fullY1, fullX2-fullX1, 1); + } else { + boxes = REGION_RECTS(clip); + while(nbox--) + { + if (boxes->y1 <= fullY1 && fullY1 < boxes->y2) + { + partX1 = boxes->x1; + if (partX1 < fullX1) + partX1 = fullX1; + partX2 = boxes->x2; + if (partX2 > fullX2) + partX2 = fullX2; + if (partX2 > partX1) + { + glamor_fill(drawable, gc, + partX1, fullY1, + partX2 - partX1, 1); + } + } + boxes++; + } + } + } +}