diff options
| author | 2014-01-01 14:45:21 -0800 | |
|---|---|---|
| committer | 2014-01-02 12:57:41 -0800 | |
| commit | d6b65f67717025b1162f86f04e2caa5723566cac (patch) | |
| tree | 4905e0300916badc0fadf76018bf4d53fbe56669 /libs/hwui/StatefulBaseRenderer.cpp | |
| parent | 14e513058ed4168c94e015638d16f5f87fd8063a (diff) | |
Use const access to snapshot from OpenGLRenderer
Additionally, move clipping methods to StatefulBaseRenderer
Change-Id: Iff232bf16fc1ad3b7d89493da6d8915db7bc5e4f
Diffstat (limited to 'libs/hwui/StatefulBaseRenderer.cpp')
| -rw-r--r-- | libs/hwui/StatefulBaseRenderer.cpp | 51 |
1 files changed, 47 insertions, 4 deletions
diff --git a/libs/hwui/StatefulBaseRenderer.cpp b/libs/hwui/StatefulBaseRenderer.cpp index cc8b14fafb92..2932037e2b01 100644 --- a/libs/hwui/StatefulBaseRenderer.cpp +++ b/libs/hwui/StatefulBaseRenderer.cpp @@ -22,6 +22,7 @@ namespace android { namespace uirenderer { StatefulBaseRenderer::StatefulBaseRenderer() : + mDirtyClip(false), mWidth(-1), mHeight(-1), mSaveCount(1), mFirstSnapshot(new Snapshot), mSnapshot(mFirstSnapshot) { } @@ -138,6 +139,48 @@ void StatefulBaseRenderer::concatMatrix(const Matrix4& matrix) { // Clip /////////////////////////////////////////////////////////////////////////////// +bool StatefulBaseRenderer::clipRect(float left, float top, float right, float bottom, SkRegion::Op op) { + if (CC_LIKELY(currentTransform()->rectToRect())) { + mDirtyClip |= mSnapshot->clip(left, top, right, bottom, op); + return !mSnapshot->clipRect->isEmpty(); + } + + SkPath path; + path.addRect(left, top, right, bottom); + + return StatefulBaseRenderer::clipPath(&path, op); +} + +bool StatefulBaseRenderer::clipPath(SkPath* path, SkRegion::Op op) { + SkMatrix transform; + currentTransform()->copyTo(transform); + + SkPath transformed; + path->transform(transform, &transformed); + + SkRegion clip; + if (!mSnapshot->previous->clipRegion->isEmpty()) { + clip.setRegion(*mSnapshot->previous->clipRegion); + } else { + if (mSnapshot->previous == firstSnapshot()) { + clip.setRect(0, 0, getWidth(), getHeight()); + } else { + Rect* bounds = mSnapshot->previous->clipRect; + clip.setRect(bounds->left, bounds->top, bounds->right, bounds->bottom); + } + } + + SkRegion region; + region.setPath(transformed, clip); + + mDirtyClip |= mSnapshot->clipRegionTransformed(region, op); + return !mSnapshot->clipRect->isEmpty(); +} + +bool StatefulBaseRenderer::clipRegion(SkRegion* region, SkRegion::Op op) { + mDirtyClip |= mSnapshot->clipRegionTransformed(*region, op); + return !mSnapshot->clipRect->isEmpty(); +} /////////////////////////////////////////////////////////////////////////////// // Quick Rejection @@ -160,10 +203,10 @@ bool StatefulBaseRenderer::calculateQuickRejectForScissor(float left, float top, } Rect r(left, top, right, bottom); - currentTransform().mapRect(r); + currentTransform()->mapRect(r); r.snapGeometryToPixelBoundaries(snapOut); - Rect clipRect(currentClipRect()); + Rect clipRect(*currentClipRect()); clipRect.snapToPixelBoundaries(); if (!clipRect.intersects(r)) return true; @@ -191,10 +234,10 @@ bool StatefulBaseRenderer::quickRejectConservative(float left, float top, } Rect r(left, top, right, bottom); - currentTransform().mapRect(r); + currentTransform()->mapRect(r); r.roundOut(); // rounded out to be conservative - Rect clipRect(currentClipRect()); + Rect clipRect(*currentClipRect()); clipRect.snapToPixelBoundaries(); if (!clipRect.intersects(r)) return true; |