1706f2543Smrg 2706f2543Smrg#ifdef HAVE_XORG_CONFIG_H 3706f2543Smrg#include <xorg-config.h> 4706f2543Smrg#endif 5706f2543Smrg 6706f2543Smrg#include "misc.h" 7706f2543Smrg#include "xf86.h" 8706f2543Smrg#include "xf86_OSproc.h" 9706f2543Smrg 10706f2543Smrg#include <X11/X.h> 11706f2543Smrg#include "scrnintstr.h" 12706f2543Smrg#include "pixmapstr.h" 13706f2543Smrg#include "xf86str.h" 14706f2543Smrg#include "xaa.h" 15706f2543Smrg#include "xaalocal.h" 16706f2543Smrg 17706f2543Smrg/* 18706f2543Smrg Much of this file based on code by 19706f2543Smrg Harm Hanemaayer (H.Hanemaayer@inter.nl.net). 20706f2543Smrg*/ 21706f2543Smrg 22706f2543Smrg 23706f2543Smrgvoid 24706f2543SmrgXAAPolyRectangleThinSolid( 25706f2543Smrg DrawablePtr pDrawable, 26706f2543Smrg GCPtr pGC, 27706f2543Smrg int nRectsInit, 28706f2543Smrg xRectangle *pRectsInit ) 29706f2543Smrg{ 30706f2543Smrg XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC); 31706f2543Smrg int nClipRects; /* number of clip rectangles */ 32706f2543Smrg BoxPtr pClipRects; /* points to the list of clip rects */ 33706f2543Smrg int xOrigin; /* Drawables x origin */ 34706f2543Smrg int yOrigin; /* Drawables x origin */ 35706f2543Smrg xRectangle *pRect; /* list of rects */ 36706f2543Smrg int nRects; /* running count of number of rects */ 37706f2543Smrg int origX1, origY1; /* original rectangle's U/L corner */ 38706f2543Smrg int origX2, origY2; /* original rectangle's L/R corner */ 39706f2543Smrg int clippedX1; /* clipped rectangle's left x */ 40706f2543Smrg int clippedY1; /* clipped rectangle's top y */ 41706f2543Smrg int clippedX2; /* clipped rectangle's right x */ 42706f2543Smrg int clippedY2; /* clipped rectangle's bottom y */ 43706f2543Smrg int clipXMin; /* upper left corner of clip rect */ 44706f2543Smrg int clipYMin; /* upper left corner of clip rect */ 45706f2543Smrg int clipXMax; /* lower right corner of clip rect */ 46706f2543Smrg int clipYMax; /* lower right corner of clip rect */ 47706f2543Smrg int width, height; /* width and height of rect */ 48706f2543Smrg 49706f2543Smrg nClipRects = RegionNumRects(pGC->pCompositeClip); 50706f2543Smrg pClipRects = RegionRects(pGC->pCompositeClip); 51706f2543Smrg 52706f2543Smrg if(!nClipRects) return; 53706f2543Smrg 54706f2543Smrg xOrigin = pDrawable->x; 55706f2543Smrg yOrigin = pDrawable->y; 56706f2543Smrg 57706f2543Smrg 58706f2543Smrg (*infoRec->SetupForSolidLine)(infoRec->pScrn, 59706f2543Smrg pGC->fgPixel, pGC->alu, pGC->planemask); 60706f2543Smrg 61706f2543Smrg 62706f2543Smrg for ( ; nClipRects > 0; 63706f2543Smrg nClipRects--, pClipRects++ ) 64706f2543Smrg { 65706f2543Smrg clipYMin = pClipRects->y1; 66706f2543Smrg clipYMax = pClipRects->y2 - 1; 67706f2543Smrg clipXMin = pClipRects->x1; 68706f2543Smrg clipXMax = pClipRects->x2 - 1; 69706f2543Smrg 70706f2543Smrg for (pRect = pRectsInit, nRects = nRectsInit; 71706f2543Smrg nRects > 0; 72706f2543Smrg nRects--, pRect++ ) 73706f2543Smrg { 74706f2543Smrg /* translate rectangle data over to the drawable */ 75706f2543Smrg origX1 = pRect->x + xOrigin; 76706f2543Smrg origY1 = pRect->y + yOrigin; 77706f2543Smrg origX2 = origX1 + pRect->width; 78706f2543Smrg origY2 = origY1 + pRect->height; 79706f2543Smrg 80706f2543Smrg /* reject entire rectangle if completely outside clip rect */ 81706f2543Smrg if ((origX1 > clipXMax) || (origX2 < clipXMin) || 82706f2543Smrg (origY1 > clipYMax) || (origY2 < clipYMin)) 83706f2543Smrg continue; 84706f2543Smrg 85706f2543Smrg /* clip the rectangle */ 86706f2543Smrg clippedX1 = max (origX1, clipXMin); 87706f2543Smrg clippedX2 = min (origX2, clipXMax); 88706f2543Smrg clippedY1 = max (origY1, clipYMin); 89706f2543Smrg clippedY2 = min (origY2, clipYMax); 90706f2543Smrg 91706f2543Smrg width = clippedX2 - clippedX1 + 1; 92706f2543Smrg 93706f2543Smrg if (origY1 >= clipYMin) { 94706f2543Smrg (*infoRec->SubsequentSolidHorVertLine)(infoRec->pScrn, 95706f2543Smrg clippedX1, clippedY1, width, DEGREES_0); 96706f2543Smrg 97706f2543Smrg /* don't overwrite corner */ 98706f2543Smrg clippedY1++; 99706f2543Smrg } 100706f2543Smrg 101706f2543Smrg if ((origY2 <= clipYMax) && (origY1 != origY2)) { 102706f2543Smrg (*infoRec->SubsequentSolidHorVertLine)(infoRec->pScrn, 103706f2543Smrg clippedX1, clippedY2, width, DEGREES_0); 104706f2543Smrg 105706f2543Smrg /* don't overwrite corner */ 106706f2543Smrg clippedY2--; 107706f2543Smrg } 108706f2543Smrg 109706f2543Smrg if (clippedY2 < clippedY1) continue; 110706f2543Smrg 111706f2543Smrg height = clippedY2 - clippedY1 + 1; 112706f2543Smrg 113706f2543Smrg /* draw vertical edges using lines if not clipped out */ 114706f2543Smrg if (origX1 >= clipXMin) 115706f2543Smrg (*infoRec->SubsequentSolidHorVertLine)(infoRec->pScrn, 116706f2543Smrg clippedX1, clippedY1, height, DEGREES_270); 117706f2543Smrg 118706f2543Smrg if ((origX2 <= clipXMax) && (origX2 != origX1)) 119706f2543Smrg (*infoRec->SubsequentSolidHorVertLine)(infoRec->pScrn, 120706f2543Smrg clippedX2, clippedY1, height, DEGREES_270); 121706f2543Smrg } 122706f2543Smrg } 123706f2543Smrg 124706f2543Smrg SET_SYNC_FLAG(infoRec); 125706f2543Smrg} 126706f2543Smrg 127706f2543Smrg 128706f2543Smrg 129706f2543Smrg 130706f2543Smrg 131706f2543Smrg 132706f2543Smrg 133706f2543Smrg 134706f2543Smrg 135706f2543Smrg 136706f2543Smrg 137