⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qregion_qws.cpp

📁 qt-embedded-2.3.8.tar.gz源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    if ((pReg->numRects != 0) &&  \	(pNextRect[-1].top() == y1) &&  \	(pNextRect[-1].bottom() == y2) &&  \	(pNextRect[-1].right() >= r->left()-1))  \    {  \	if (pNextRect[-1].right() < r->right())  \	{  \	    pNextRect[-1].setRight( r->right() );  \	    ASSERT(pNextRect[-1].left() <= pNextRect[-1].right()); \	}  \    }  \    else  \    {  \	MEMCHECK(pReg, pNextRect, pReg->rects)  \	pNextRect->setCoords( r->left(), y1, r->right(), y2 ); \	pReg->numRects++;  \        pNextRect++;  \    }  \    r++;    ASSERT (y1<=y2);    while ((r1 != r1End) && (r2 != r2End))    {	if (r1->left() < r2->left())	{	    MERGERECT(r1)	}	else	{	    MERGERECT(r2)	}    }    if (r1 != r1End)    {	do	{	    MERGERECT(r1)	} while (r1 != r1End);    }    else while (r2 != r2End)    {	MERGERECT(r2)    }    return 0;	/* lint */}staticintXUnionRegion(Region reg1, Region reg2, Region newReg){    /*  checks all the simple cases */    /*     * Region 1 and 2 are the same or region 1 is empty     */    if ( (reg1 == reg2) || (!(reg1->numRects)) )    {        if (newReg != reg2)            miRegionCopy(newReg, reg2);        return 1;    }    /*     * if nothing to union (region 2 empty)     */    if (!(reg2->numRects))    {        if (newReg != reg1)            miRegionCopy(newReg, reg1);        return 1;    }    /*     * Region 1 completely subsumes region 2     */    if ((reg1->numRects == 1) &&	(reg1->extents.left() <= reg2->extents.left()) &&	(reg1->extents.top() <= reg2->extents.top()) &&	(reg1->extents.right() >= reg2->extents.right()) &&	(reg1->extents.bottom() >= reg2->extents.bottom()))    {        if (newReg != reg1)            miRegionCopy(newReg, reg1);        return 1;    }    /*     * Region 2 completely subsumes region 1     */    if ((reg2->numRects == 1) &&	(reg2->extents.left() <= reg1->extents.left()) &&	(reg2->extents.top() <= reg1->extents.top()) &&	(reg2->extents.right() >= reg1->extents.right()) &&	(reg2->extents.bottom() >= reg1->extents.bottom()))    {        if (newReg != reg2)            miRegionCopy(newReg, reg2);        return 1;    }    miRegionOp (newReg, reg1, reg2, (voidProcp) miUnionO,    		(voidProcp) miUnionNonO, (voidProcp) miUnionNonO);    newReg->extents.setLeft( QMIN(reg1->extents.left(), reg2->extents.left()) );    newReg->extents.setTop( QMIN(reg1->extents.top(), reg2->extents.top()) );    newReg->extents.setRight( QMAX(reg1->extents.right(), reg2->extents.right()) );    newReg->extents.setBottom( QMAX(reg1->extents.bottom(), reg2->extents.bottom()) );    return 1;}/*====================================================================== * 	    	  Region Subtraction *====================================================================*//*- *----------------------------------------------------------------------- * miSubtractNonO -- *	Deal with non-overlapping band for subtraction. Any parts from *	region 2 we discard. Anything from region 1 we add to the region. * * Results: *	None. * * Side Effects: *	pReg may be affected. * *----------------------------------------------------------------------- *//* static void*/staticintmiSubtractNonO1 (register Region pReg, register QRect *r,		 QRect *rEnd, register int y1, register int y2){    register QRect *pNextRect;	    pNextRect = pReg->rects.data() + pReg->numRects;	    ASSERT(y1<=y2);    while (r != rEnd)    {	ASSERT(r->left()<=r->right());	MEMCHECK(pReg, pNextRect, pReg->rects)	pNextRect->setCoords( r->left(), y1, r->right(), y2 );	pReg->numRects++;	pNextRect++;	r++;    }    return 0;	/* lint */}/*- *----------------------------------------------------------------------- * miSubtractO -- *	Overlapping band subtraction. x1 is the left-most point not yet *	checked. * * Results: *	None. * * Side Effects: *	pReg may have rectangles added to it. * *----------------------------------------------------------------------- *//* static void*/staticintmiSubtractO (register Region pReg, register QRect *r1, QRect *r1End,	     register QRect *r2, QRect *r2End, register int y1, register int y2){    register QRect *pNextRect;    register int  	x1;    x1 = r1->left();    ASSERT(y1<=y2);    pNextRect = pReg->rects.data() + pReg->numRects;    while ((r1 != r1End) && (r2 != r2End))    {	if (r2->right() < x1)	{	    /*	     * Subtrahend missed the boat: go to next subtrahend.	     */	    r2++;	}	else if (r2->left() <= x1)	{	    /*	     * Subtrahend precedes minuend: nuke left edge of minuend.	     */	    x1 = r2->right()+1;	    if (x1 > r1->right())	    {		/*		 * Minuend completely covered: advance to next minuend and		 * reset left fence to edge of new minuend.		 */		r1++;		if (r1 != r1End)		    x1 = r1->left();	    }	    else	    {		/*		 * Subtrahend now used up since it doesn't extend beyond		 * minuend		 */		r2++;	    }	}	else if (r2->left() <= r1->right())	{	    /*	     * Left part of subtrahend covers part of minuend: add uncovered	     * part of minuend to region and skip to next subtrahend.	     */	    ASSERT(x1<r2->left());	    MEMCHECK(pReg, pNextRect, pReg->rects)	    pNextRect->setCoords( x1, y1, r2->left() - 1, y2 );	    pReg->numRects++;	    pNextRect++;	    x1 = r2->right() + 1;	    if (x1 > r1->right())	    {		/*		 * Minuend used up: advance to new...		 */		r1++;		if (r1 != r1End)		    x1 = r1->left();	    }	    else	    {		/*		 * Subtrahend used up		 */		r2++;	    }	}	else	{	    /*	     * Minuend used up: add any remaining piece before advancing.	     */	    if (r1->right() >= x1)	    {		MEMCHECK(pReg, pNextRect, pReg->rects)		pNextRect->setCoords( x1, y1, r1->right(), y2 );		pReg->numRects++;		pNextRect++;	    }	    r1++;	    if ( r1 != r1End )		x1 = r1->left();	}    }    /*     * Add remaining minuend rectangles to region.     */    while (r1 != r1End)    {	ASSERT(x1<=r1->right());	MEMCHECK(pReg, pNextRect, pReg->rects)	pNextRect->setCoords( x1, y1, r1->right(), y2 );	pReg->numRects++;	pNextRect++;	r1++;	if (r1 != r1End)	{	    x1 = r1->left();	}    }    return 0;	/* lint */}	/*- *----------------------------------------------------------------------- * miSubtract -- *	Subtract regS from regM and leave the result in regD. *	S stands for subtrahend, M for minuend and D for difference. * * Results: *	TRUE. * * Side Effects: *	regD is overwritten. * *----------------------------------------------------------------------- */staticintXSubtractRegion(Region regM, Region regS, register Region regD){   /* check for trivial reject */    if ( (!(regM->numRects)) || (!(regS->numRects))  ||	(!EXTENTCHECK(&regM->extents, &regS->extents)) )    {	miRegionCopy(regD, regM);        return 1;    }    miRegionOp (regD, regM, regS, (voidProcp) miSubtractO,    		(voidProcp) miSubtractNonO1, (voidProcp) NULL);    /*     * Can't alter newReg's extents before we call miRegionOp because     * it might be one of the source regions and miRegionOp depends     * on the extents of those regions being the unaltered. Besides, this     * way there's no checking against rectangles that will be nuked     * due to coalescing, so we have to examine fewer rectangles.     */    miSetExtents (regD);    return 1;}staticintXXorRegion( Region sra, Region srb, Region dr ){    Region tra, trb;    if (! (tra = XCreateRegion()))	return 0;    if (! (trb = XCreateRegion()))	return 0;    (void) XSubtractRegion(sra,srb,tra);    (void) XSubtractRegion(srb,sra,trb);    (void) XUnionRegion(tra,trb,dr);    XDestroyRegion(tra);    XDestroyRegion(trb);    return 0;}/* * Check to see if the region is empty.  Assumes a region is passed * as a parameter */staticintXEmptyRegion( Region r ){    if( r->numRects == 0 ) return TRUE;    else  return FALSE;}/* *	Check to see if two regions are equal	 */staticintXEqualRegion( Region r1, Region r2 ){    int i;    if( r1->numRects != r2->numRects ) return FALSE;    else if( r1->numRects == 0 ) return TRUE;    else if ( r1->extents.left() != r2->extents.left() ) return FALSE;    else if ( r1->extents.right() != r2->extents.right() ) return FALSE;    else if ( r1->extents.top() != r2->extents.top() ) return FALSE;    else if ( r1->extents.bottom() != r2->extents.bottom() ) return FALSE;    else {	QRect *rr1 = r1->rects.data();	QRect *rr2 = r2->rects.data();	for( i=0; i < r1->numRects; i++, rr1++, rr2++ ) {	    if ( rr1->left() != rr2->left() ) return FALSE;	    else if ( rr1->right() != rr2->right() ) return FALSE;	    else if ( rr1->top() != rr2->top() ) return FALSE;	    else if ( rr1->bottom() != rr2->bottom() ) return FALSE;	}    }    return TRUE;}staticintXPointInRegion( Region pRegion, int x, int y ){    int i;    if (pRegion->numRects == 0)        return FALSE;    if (!pRegion->extents.contains(x, y))        return FALSE;    for (i=0; i<pRegion->numRects; i++)    {        if (pRegion->rects[i].contains(x, y))	    return TRUE;    }    return FALSE;}staticintXRectInRegion(register Region region,	    int rx, int ry, unsigned int rwidth, unsigned int rheight){    register QRect *pbox;    register QRect *pboxEnd;    QRect rect(rx, ry, rwidth, rheight);    register QRect *prect = &rect;    int      partIn, partOut;    /* this is (just) a useful optimization */    if ((region->numRects == 0) || !EXTENTCHECK(&region->extents, prect))        return(RectangleOut);    partOut = FALSE;    partIn = FALSE;    /* can stop when both partOut and partIn are TRUE, or we reach prect->y2 */    for (pbox = region->rects.data(), pboxEnd = pbox + region->numRects;	 pbox < pboxEnd;	 pbox++)    {	if (pbox->bottom() < ry)	   continue;	/* getting up to speed or skipping remainder of band */	if (pbox->top() > ry)	{	   partOut = TRUE;	/* missed part of rectangle above */	   if (partIn || (pbox->top() > prect->bottom()))	      break;	   ry = pbox->top();	/* x guaranteed to be == prect->x1 */	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -