138 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
/* $XFree86: xc/programs/Xserver/hw/xfree86/xaa/xaaRect.c,v 1.2 1998/07/25 16:58:51 dawes Exp $ */
 | 
						|
 | 
						|
#ifdef HAVE_XORG_CONFIG_H
 | 
						|
#include <xorg-config.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#include "misc.h"
 | 
						|
#include "xf86.h"
 | 
						|
#include "xf86_OSproc.h"
 | 
						|
 | 
						|
#include <X11/X.h>
 | 
						|
#include "scrnintstr.h"
 | 
						|
#include "pixmapstr.h"
 | 
						|
#include "xf86str.h"
 | 
						|
#include "xaa.h"
 | 
						|
#include "xaalocal.h"
 | 
						|
 | 
						|
/*
 | 
						|
   Much of this file based on code by 
 | 
						|
	Harm Hanemaayer (H.Hanemaayer@inter.nl.net).
 | 
						|
*/
 | 
						|
 | 
						|
 | 
						|
void
 | 
						|
XAAPolyRectangleThinSolid(
 | 
						|
    DrawablePtr  pDrawable,
 | 
						|
    GCPtr        pGC,    
 | 
						|
    int	         nRectsInit,
 | 
						|
    xRectangle  *pRectsInit )
 | 
						|
{
 | 
						|
    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
 | 
						|
    int         nClipRects;     /* number of clip rectangles */
 | 
						|
    BoxPtr      pClipRects;     /* points to the list of clip rects */
 | 
						|
    int         xOrigin;        /* Drawables x origin */
 | 
						|
    int         yOrigin;        /* Drawables x origin */
 | 
						|
    xRectangle *pRect;          /* list of rects */
 | 
						|
    int         nRects;         /* running count of number of rects */
 | 
						|
    int         origX1, origY1; /* original rectangle's U/L corner */
 | 
						|
    int         origX2, origY2; /* original rectangle's L/R corner */
 | 
						|
    int         clippedX1;      /* clipped rectangle's left x */
 | 
						|
    int         clippedY1;      /* clipped rectangle's top y */
 | 
						|
    int         clippedX2;      /* clipped rectangle's right x */
 | 
						|
    int         clippedY2;      /* clipped rectangle's bottom y */
 | 
						|
    int         clipXMin;       /* upper left corner of clip rect */
 | 
						|
    int         clipYMin;       /* upper left corner of clip rect */
 | 
						|
    int         clipXMax;       /* lower right corner of clip rect */
 | 
						|
    int         clipYMax;       /* lower right corner of clip rect */
 | 
						|
    int         width, height;  /* width and height of rect */
 | 
						|
 | 
						|
    nClipRects = REGION_NUM_RECTS(pGC->pCompositeClip);
 | 
						|
    pClipRects = REGION_RECTS(pGC->pCompositeClip);
 | 
						|
 | 
						|
    if(!nClipRects) return;
 | 
						|
 | 
						|
    xOrigin = pDrawable->x;
 | 
						|
    yOrigin = pDrawable->y;
 | 
						|
 | 
						|
 | 
						|
    (*infoRec->SetupForSolidLine)(infoRec->pScrn, 
 | 
						|
			pGC->fgPixel, pGC->alu, pGC->planemask);
 | 
						|
 | 
						|
 | 
						|
    for ( ; nClipRects > 0; 
 | 
						|
	  nClipRects--, pClipRects++ )
 | 
						|
    {
 | 
						|
        clipYMin = pClipRects->y1;
 | 
						|
        clipYMax = pClipRects->y2 - 1;
 | 
						|
        clipXMin = pClipRects->x1;
 | 
						|
        clipXMax = pClipRects->x2 - 1;
 | 
						|
 | 
						|
	for (pRect = pRectsInit, nRects = nRectsInit; 
 | 
						|
	     nRects > 0; 
 | 
						|
	     nRects--, pRect++ )
 | 
						|
        {
 | 
						|
	    /* translate rectangle data over to the drawable */
 | 
						|
            origX1 = pRect->x + xOrigin; 
 | 
						|
	    origY1 = pRect->y + yOrigin;
 | 
						|
            origX2 = origX1 + pRect->width; 
 | 
						|
	    origY2 = origY1 + pRect->height; 
 | 
						|
 | 
						|
	    /* reject entire rectangle if completely outside clip rect */
 | 
						|
	    if ((origX1 > clipXMax) || (origX2 < clipXMin) ||
 | 
						|
		(origY1 > clipYMax) || (origY2 < clipYMin))
 | 
						|
	        continue;
 | 
						|
 | 
						|
	    /* clip the rectangle */
 | 
						|
	    clippedX1 = max (origX1, clipXMin);
 | 
						|
	    clippedX2 = min (origX2, clipXMax);
 | 
						|
	    clippedY1 = max (origY1, clipYMin);
 | 
						|
	    clippedY2 = min (origY2, clipYMax);
 | 
						|
 | 
						|
	    width = clippedX2 - clippedX1 + 1;
 | 
						|
 | 
						|
	    if (origY1 >= clipYMin) {
 | 
						|
		(*infoRec->SubsequentSolidHorVertLine)(infoRec->pScrn,
 | 
						|
			clippedX1, clippedY1, width, DEGREES_0);
 | 
						|
 | 
						|
		/* don't overwrite corner */
 | 
						|
		clippedY1++;
 | 
						|
	    }
 | 
						|
 | 
						|
	    if ((origY2 <= clipYMax) && (origY1 != origY2)) {
 | 
						|
		(*infoRec->SubsequentSolidHorVertLine)(infoRec->pScrn,
 | 
						|
			clippedX1, clippedY2, width, DEGREES_0);
 | 
						|
 | 
						|
		/* don't overwrite corner */
 | 
						|
		clippedY2--; 
 | 
						|
	    }
 | 
						|
 | 
						|
	    if (clippedY2 < clippedY1) continue;
 | 
						|
 | 
						|
	    height = clippedY2 - clippedY1 + 1;
 | 
						|
 | 
						|
	    /* draw vertical edges using lines if not clipped out */
 | 
						|
            if (origX1 >= clipXMin) 
 | 
						|
		(*infoRec->SubsequentSolidHorVertLine)(infoRec->pScrn,
 | 
						|
			clippedX1, clippedY1, height, DEGREES_270);
 | 
						|
 | 
						|
            if ((origX2 <= clipXMax) && (origX2 != origX1))
 | 
						|
		(*infoRec->SubsequentSolidHorVertLine)(infoRec->pScrn,
 | 
						|
			clippedX2, clippedY1, height, DEGREES_270);
 | 
						|
	}
 | 
						|
    }
 | 
						|
 | 
						|
    SET_SYNC_FLAG(infoRec);
 | 
						|
} 
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 |