EXPORT_C CHuiCanvasGc::TClipRectVisibility CHuiCanvasGc::IsClipped(const TRect& aRect) const { TClipRectVisibility isClipped = EFullyOutside; if (!iGc) { return isClipped; } // First check the active clipping region from GC... // aRect is untransformed, activeClippingRegion is transformed // so we must transform aRect first when we comapre it to activeClippingRegion... THuiRealRect transformed = aRect; iGc->TransformDirtyRect(transformed ); const TRegion& activeClippingRegion = iGc->ClipRegion(); isClipped = IsClipped(transformed.Round(), activeClippingRegion); //...fully outside of GC so it would not be drawn regardless of // the iClipRegion (if it is trying to do clipping), we can return immediately. if (isClipped == EFullyOutside && activeClippingRegion.Count()) { return isClipped; } //...not clipped by active clip region, check our own iClipRegion if (iClippingRegion.Count()) { isClipped = IsClipped(aRect, iClippingRegion); } return isClipped; }
EXPORT_C CHuiCanvasGc::TClipRectVisibility CHuiCanvasGc::EnableDelayedClippingIfNeeded(const RArray<THuiRealLine>& aUpdatedLines) { iDelayedClipCount = 0; TClipRectVisibility vis1 = EPartialOverlap; TClipRectVisibility vis2 = EPartialOverlap; if (iClipMode == EHuiCanvasClipModeDelayed) { for (TInt i=0; i<aUpdatedLines.Count();i++) { TPoint start = aUpdatedLines[i].iStart.Round(); TPoint end = aUpdatedLines[i].iEnd.Round(); vis1 = IsClipped(start); vis2 = IsClipped(end); if ((vis1 != EFullyOutside) || (vis2 != EFullyOutside)) { // Could copy only needed rects to avoid excessive clipping iDelayedClipRegion.Copy(iClippingRegion); break; } // both points lie outside - but the line may still intersect the region, // so represent the line as a rect and try an intersection test... TRect lineBoundingRect(start, end); lineBoundingRect.Normalize(); lineBoundingRect.iBr += TPoint(1, 1); if (IsClipped(lineBoundingRect, iClippingRegion) != EFullyOutside) { iDelayedClipRegion.Copy(iClippingRegion); vis1 = EPartialOverlap; break; } } } if (vis1 == EFullyOutside && vis2 == EFullyOutside) { iDelayedClipVisibility = EFullyOutside; } else { iDelayedClipVisibility = EPartialOverlap; } return iDelayedClipVisibility; }
EXPORT_C CHuiCanvasGc::TClipRectVisibility CHuiCanvasGc::EnableDelayedClippingIfNeeded(const THuiRealRect& aUpdatedRect) { iDelayedClipCount = 0; iDelayedClipVisibility = EPartialOverlap; if (iClipMode == EHuiCanvasClipModeDelayed) { iDelayedClipVisibility = IsClipped(aUpdatedRect.Round()); if ( iDelayedClipVisibility == EPartialOverlap ) { // Could copy only needed rects to avoid excessive clipping iDelayedClipRegion.Copy(iClippingRegion); } } return iDelayedClipVisibility; }
EXPORT_C CHuiCanvasGc::TClipRectVisibility CHuiCanvasGc::EnableDelayedClippingIfNeeded(const RArray<THuiRealRect>& aUpdatedRects) { iDelayedClipCount = 0; iDelayedClipVisibility = EPartialOverlap; if (iClipMode == EHuiCanvasClipModeDelayed) { for (TInt i=0; i<aUpdatedRects.Count(); i++) { iDelayedClipVisibility = IsClipped(aUpdatedRects[i].Round()); if (iDelayedClipVisibility == EPartialOverlap) { // Could copy only needed rects to avoid excessive clipping iDelayedClipRegion.Copy(iClippingRegion); break; } } } return iDelayedClipVisibility; }
CHuiCanvasGc::TClipRectVisibility CHuiCanvasGc::IsClipped(const TRegion& aTestedRegion, const TRegion& aClippingRegion) const { TClipRectVisibility isWholeRegionClipped = EUnknown; TInt count = aTestedRegion.Count(); if (count == 0) { isWholeRegionClipped = EFullyOutside; } for (TInt i=0; i<count; i++) { TClipRectVisibility isRectClipped = IsClipped(aTestedRegion[i], aClippingRegion); if (isWholeRegionClipped == EFullyInside) { if (isRectClipped == EFullyOutside || isRectClipped == EPartialOverlap ) { isWholeRegionClipped = EPartialOverlap; } } else if (isWholeRegionClipped == EFullyOutside) { if (isRectClipped == EFullyInside || isRectClipped == EPartialOverlap ) { isWholeRegionClipped = EPartialOverlap; } } else if (isWholeRegionClipped == EPartialOverlap) { // No changes to isWholeRegionClipped in this case and no need to look further break; } else { isWholeRegionClipped = isRectClipped; } } return isWholeRegionClipped; }
ClipHelper::~ClipHelper() { if (IsClipped()) UnClip(); }
EXPORT_C CHuiCanvasGc::TClipRectVisibility CHuiCanvasGc::IsClipped(const TPoint& aPoint) const { return IsClipped(aPoint, iClippingRegion); }