📄 qregion_qws.cpp
字号:
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(®M->extents, ®S->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 = ▭ int partIn, partOut; /* this is (just) a useful optimization */ if ((region->numRects == 0) || !EXTENTCHECK(®ion->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 + -