summaryrefslogtreecommitdiff
path: root/libs/hwui/StatefulBaseRenderer.cpp
diff options
context:
space:
mode:
author Chris Craik <ccraik@google.com> 2014-01-01 14:45:21 -0800
committer Chris Craik <ccraik@google.com> 2014-01-02 12:57:41 -0800
commitd6b65f67717025b1162f86f04e2caa5723566cac (patch)
tree4905e0300916badc0fadf76018bf4d53fbe56669 /libs/hwui/StatefulBaseRenderer.cpp
parent14e513058ed4168c94e015638d16f5f87fd8063a (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.cpp51
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;