CanvasState.cpp revision 4d3e704b04c6abd7995df640d12662b0271f6c7b
114e513058ed4168c94e015638d16f5f87fd8063aChris Craik/* 214e513058ed4168c94e015638d16f5f87fd8063aChris Craik * Copyright (C) 2014 The Android Open Source Project 314e513058ed4168c94e015638d16f5f87fd8063aChris Craik * 414e513058ed4168c94e015638d16f5f87fd8063aChris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 514e513058ed4168c94e015638d16f5f87fd8063aChris Craik * you may not use this file except in compliance with the License. 614e513058ed4168c94e015638d16f5f87fd8063aChris Craik * You may obtain a copy of the License at 714e513058ed4168c94e015638d16f5f87fd8063aChris Craik * 814e513058ed4168c94e015638d16f5f87fd8063aChris Craik * http://www.apache.org/licenses/LICENSE-2.0 914e513058ed4168c94e015638d16f5f87fd8063aChris Craik * 1014e513058ed4168c94e015638d16f5f87fd8063aChris Craik * Unless required by applicable law or agreed to in writing, software 1114e513058ed4168c94e015638d16f5f87fd8063aChris Craik * distributed under the License is distributed on an "AS IS" BASIS, 1214e513058ed4168c94e015638d16f5f87fd8063aChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1314e513058ed4168c94e015638d16f5f87fd8063aChris Craik * See the License for the specific language governing permissions and 1414e513058ed4168c94e015638d16f5f87fd8063aChris Craik * limitations under the License. 1514e513058ed4168c94e015638d16f5f87fd8063aChris Craik */ 1614e513058ed4168c94e015638d16f5f87fd8063aChris Craik 1714e513058ed4168c94e015638d16f5f87fd8063aChris Craik#include <SkCanvas.h> 1814e513058ed4168c94e015638d16f5f87fd8063aChris Craik 19984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson#include "CanvasState.h" 20af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik#include "utils/MathUtils.h" 21af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik 2214e513058ed4168c94e015638d16f5f87fd8063aChris Craiknamespace android { 2314e513058ed4168c94e015638d16f5f87fd8063aChris Craiknamespace uirenderer { 2414e513058ed4168c94e015638d16f5f87fd8063aChris Craik 25984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 26984162fb7e4010b6e2908352dbff17ed47eecf06Tom HudsonCanvasState::CanvasState(CanvasStateClient& renderer) 27058fc640017c90120c599d378a4cbc55668b05b7Chris Craik : mDirtyClip(false) 28058fc640017c90120c599d378a4cbc55668b05b7Chris Craik , mWidth(-1) 29058fc640017c90120c599d378a4cbc55668b05b7Chris Craik , mHeight(-1) 30058fc640017c90120c599d378a4cbc55668b05b7Chris Craik , mSaveCount(1) 31058fc640017c90120c599d378a4cbc55668b05b7Chris Craik , mFirstSnapshot(new Snapshot) 32984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson , mCanvas(renderer) 33058fc640017c90120c599d378a4cbc55668b05b7Chris Craik , mSnapshot(mFirstSnapshot) { 34984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 3514e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 3614e513058ed4168c94e015638d16f5f87fd8063aChris Craik 37984162fb7e4010b6e2908352dbff17ed47eecf06Tom HudsonCanvasState::~CanvasState() { 38984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 39984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson} 40984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 41984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonvoid CanvasState::initializeSaveStack(float clipLeft, float clipTop, 4269e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik float clipRight, float clipBottom, const Vector3& lightCenter) { 4314e513058ed4168c94e015638d16f5f87fd8063aChris Craik mSnapshot = new Snapshot(mFirstSnapshot, 4414e513058ed4168c94e015638d16f5f87fd8063aChris Craik SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); 4514e513058ed4168c94e015638d16f5f87fd8063aChris Craik mSnapshot->setClip(clipLeft, clipTop, clipRight, clipBottom); 466b109c74982033d4a220cd10a0eab8b024b351c9Chris Craik mSnapshot->fbo = mCanvas.getTargetFbo(); 4769e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik mSnapshot->setRelativeLightCenter(lightCenter); 4814e513058ed4168c94e015638d16f5f87fd8063aChris Craik mSaveCount = 1; 4914e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 5014e513058ed4168c94e015638d16f5f87fd8063aChris Craik 51984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonvoid CanvasState::setViewport(int width, int height) { 5214e513058ed4168c94e015638d16f5f87fd8063aChris Craik mWidth = width; 5314e513058ed4168c94e015638d16f5f87fd8063aChris Craik mHeight = height; 54a64a2bef1048db5a742843f1e3bea9e80d0defc5Chris Craik mFirstSnapshot->initializeViewport(width, height); 55984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson mCanvas.onViewportInitialized(); 56284b24358410cb0200e525a5ba36994090c83f20Chris Craik 57284b24358410cb0200e525a5ba36994090c83f20Chris Craik // create a temporary 1st snapshot, so old snapshots are released, 58284b24358410cb0200e525a5ba36994090c83f20Chris Craik // and viewport can be queried safely. 59284b24358410cb0200e525a5ba36994090c83f20Chris Craik // TODO: remove, combine viewport + save stack initialization 60284b24358410cb0200e525a5ba36994090c83f20Chris Craik mSnapshot = new Snapshot(mFirstSnapshot, 61284b24358410cb0200e525a5ba36994090c83f20Chris Craik SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); 62284b24358410cb0200e525a5ba36994090c83f20Chris Craik mSaveCount = 1; 63797b95b26bbb7557678af78b9a2a61830158920fChris Craik} 64797b95b26bbb7557678af78b9a2a61830158920fChris Craik 6514e513058ed4168c94e015638d16f5f87fd8063aChris Craik/////////////////////////////////////////////////////////////////////////////// 6614e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Save (layer) 6714e513058ed4168c94e015638d16f5f87fd8063aChris Craik/////////////////////////////////////////////////////////////////////////////// 6814e513058ed4168c94e015638d16f5f87fd8063aChris Craik 6914e513058ed4168c94e015638d16f5f87fd8063aChris Craik/** 70984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson * Guaranteed to save without side-effects 7114e513058ed4168c94e015638d16f5f87fd8063aChris Craik * 72984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson * This approach, here and in restoreSnapshot(), allows subclasses to directly manipulate the save 7314e513058ed4168c94e015638d16f5f87fd8063aChris Craik * stack, and ensures restoreToCount() doesn't call back into subclass overrides. 7414e513058ed4168c94e015638d16f5f87fd8063aChris Craik */ 75984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonint CanvasState::saveSnapshot(int flags) { 7614e513058ed4168c94e015638d16f5f87fd8063aChris Craik mSnapshot = new Snapshot(mSnapshot, flags); 7714e513058ed4168c94e015638d16f5f87fd8063aChris Craik return mSaveCount++; 7814e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 7914e513058ed4168c94e015638d16f5f87fd8063aChris Craik 80984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonint CanvasState::save(int flags) { 8114e513058ed4168c94e015638d16f5f87fd8063aChris Craik return saveSnapshot(flags); 8214e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 8314e513058ed4168c94e015638d16f5f87fd8063aChris Craik 8414e513058ed4168c94e015638d16f5f87fd8063aChris Craik/** 85984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson * Guaranteed to restore without side-effects. 8614e513058ed4168c94e015638d16f5f87fd8063aChris Craik */ 87984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonvoid CanvasState::restoreSnapshot() { 8814e513058ed4168c94e015638d16f5f87fd8063aChris Craik sp<Snapshot> toRemove = mSnapshot; 8914e513058ed4168c94e015638d16f5f87fd8063aChris Craik sp<Snapshot> toRestore = mSnapshot->previous; 9014e513058ed4168c94e015638d16f5f87fd8063aChris Craik 9114e513058ed4168c94e015638d16f5f87fd8063aChris Craik mSaveCount--; 9214e513058ed4168c94e015638d16f5f87fd8063aChris Craik mSnapshot = toRestore; 9314e513058ed4168c94e015638d16f5f87fd8063aChris Craik 9414e513058ed4168c94e015638d16f5f87fd8063aChris Craik // subclass handles restore implementation 95984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson mCanvas.onSnapshotRestored(*toRemove, *toRestore); 9614e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 9714e513058ed4168c94e015638d16f5f87fd8063aChris Craik 98984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonvoid CanvasState::restore() { 9914e513058ed4168c94e015638d16f5f87fd8063aChris Craik if (mSaveCount > 1) { 10014e513058ed4168c94e015638d16f5f87fd8063aChris Craik restoreSnapshot(); 10114e513058ed4168c94e015638d16f5f87fd8063aChris Craik } 10214e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 10314e513058ed4168c94e015638d16f5f87fd8063aChris Craik 104984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonvoid CanvasState::restoreToCount(int saveCount) { 10514e513058ed4168c94e015638d16f5f87fd8063aChris Craik if (saveCount < 1) saveCount = 1; 10614e513058ed4168c94e015638d16f5f87fd8063aChris Craik 10714e513058ed4168c94e015638d16f5f87fd8063aChris Craik while (mSaveCount > saveCount) { 10814e513058ed4168c94e015638d16f5f87fd8063aChris Craik restoreSnapshot(); 10914e513058ed4168c94e015638d16f5f87fd8063aChris Craik } 11014e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 11114e513058ed4168c94e015638d16f5f87fd8063aChris Craik 11214e513058ed4168c94e015638d16f5f87fd8063aChris Craik/////////////////////////////////////////////////////////////////////////////// 11314e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Matrix 11414e513058ed4168c94e015638d16f5f87fd8063aChris Craik/////////////////////////////////////////////////////////////////////////////// 11514e513058ed4168c94e015638d16f5f87fd8063aChris Craik 116984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonvoid CanvasState::getMatrix(SkMatrix* matrix) const { 11714e513058ed4168c94e015638d16f5f87fd8063aChris Craik mSnapshot->transform->copyTo(*matrix); 11814e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 11914e513058ed4168c94e015638d16f5f87fd8063aChris Craik 120984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonvoid CanvasState::translate(float dx, float dy, float dz) { 12114e513058ed4168c94e015638d16f5f87fd8063aChris Craik mSnapshot->transform->translate(dx, dy, dz); 12214e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 12314e513058ed4168c94e015638d16f5f87fd8063aChris Craik 124984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonvoid CanvasState::rotate(float degrees) { 12514e513058ed4168c94e015638d16f5f87fd8063aChris Craik mSnapshot->transform->rotate(degrees, 0.0f, 0.0f, 1.0f); 12614e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 12714e513058ed4168c94e015638d16f5f87fd8063aChris Craik 128984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonvoid CanvasState::scale(float sx, float sy) { 12914e513058ed4168c94e015638d16f5f87fd8063aChris Craik mSnapshot->transform->scale(sx, sy, 1.0f); 13014e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 13114e513058ed4168c94e015638d16f5f87fd8063aChris Craik 132984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonvoid CanvasState::skew(float sx, float sy) { 13314e513058ed4168c94e015638d16f5f87fd8063aChris Craik mSnapshot->transform->skew(sx, sy); 13414e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 13514e513058ed4168c94e015638d16f5f87fd8063aChris Craik 136984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonvoid CanvasState::setMatrix(const SkMatrix& matrix) { 137139088228faa7f3c446af7387e017933998a5570Derek Sollenberger mSnapshot->transform->load(matrix); 13814e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 13914e513058ed4168c94e015638d16f5f87fd8063aChris Craik 140984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonvoid CanvasState::setMatrix(const Matrix4& matrix) { 1417c85c54499994c687a833644f7f213e747fadb98Chris Craik *(mSnapshot->transform) = matrix; 14214e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 14314e513058ed4168c94e015638d16f5f87fd8063aChris Craik 144984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonvoid CanvasState::concatMatrix(const SkMatrix& matrix) { 145139088228faa7f3c446af7387e017933998a5570Derek Sollenberger mat4 transform(matrix); 14614e513058ed4168c94e015638d16f5f87fd8063aChris Craik mSnapshot->transform->multiply(transform); 14714e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 14814e513058ed4168c94e015638d16f5f87fd8063aChris Craik 149984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonvoid CanvasState::concatMatrix(const Matrix4& matrix) { 15014e513058ed4168c94e015638d16f5f87fd8063aChris Craik mSnapshot->transform->multiply(matrix); 15114e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 15214e513058ed4168c94e015638d16f5f87fd8063aChris Craik 15314e513058ed4168c94e015638d16f5f87fd8063aChris Craik/////////////////////////////////////////////////////////////////////////////// 15414e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Clip 15514e513058ed4168c94e015638d16f5f87fd8063aChris Craik/////////////////////////////////////////////////////////////////////////////// 15614e513058ed4168c94e015638d16f5f87fd8063aChris Craik 157984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonbool CanvasState::clipRect(float left, float top, float right, float bottom, SkRegion::Op op) { 1584d3e704b04c6abd7995df640d12662b0271f6c7bChris Craik mSnapshot->clip(left, top, right, bottom, op); 1594d3e704b04c6abd7995df640d12662b0271f6c7bChris Craik mDirtyClip = true; 160487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk return !mSnapshot->clipIsEmpty(); 161d6b65f67717025b1162f86f04e2caa5723566cacChris Craik} 162d6b65f67717025b1162f86f04e2caa5723566cacChris Craik 163984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonbool CanvasState::clipPath(const SkPath* path, SkRegion::Op op) { 1644d3e704b04c6abd7995df640d12662b0271f6c7bChris Craik mSnapshot->clipPath(*path, op); 1654d3e704b04c6abd7995df640d12662b0271f6c7bChris Craik mDirtyClip = true; 166487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk return !mSnapshot->clipIsEmpty(); 167d6b65f67717025b1162f86f04e2caa5723566cacChris Craik} 168d6b65f67717025b1162f86f04e2caa5723566cacChris Craik 169984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonbool CanvasState::clipRegion(const SkRegion* region, SkRegion::Op op) { 1704d3e704b04c6abd7995df640d12662b0271f6c7bChris Craik mSnapshot->clipRegionTransformed(*region, op); 1714d3e704b04c6abd7995df640d12662b0271f6c7bChris Craik mDirtyClip = true; 172487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk return !mSnapshot->clipIsEmpty(); 173d6b65f67717025b1162f86f04e2caa5723566cacChris Craik} 17414e513058ed4168c94e015638d16f5f87fd8063aChris Craik 175984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonvoid CanvasState::setClippingOutline(LinearAllocator& allocator, const Outline* outline) { 176af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik Rect bounds; 177af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik float radius; 178af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik if (!outline->getAsRoundRect(&bounds, &radius)) return; // only RR supported 179af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik 18079d26c72aa6f898125df2386054f6a293da4122aChris Craik bool outlineIsRounded = MathUtils::isPositive(radius); 18179d26c72aa6f898125df2386054f6a293da4122aChris Craik if (!outlineIsRounded || currentTransform()->isSimple()) { 182af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik // TODO: consider storing this rect separately, so that this can't be replaced with clip ops 183af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik clipRect(bounds.left, bounds.top, bounds.right, bounds.bottom, SkRegion::kIntersect_Op); 184af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik } 18579d26c72aa6f898125df2386054f6a293da4122aChris Craik if (outlineIsRounded) { 186e83cbd451868a734bfac07ccd680d5617080b579Chris Craik setClippingRoundRect(allocator, bounds, radius, false); 18779d26c72aa6f898125df2386054f6a293da4122aChris Craik } 188deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik} 189deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik 190984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonvoid CanvasState::setClippingRoundRect(LinearAllocator& allocator, 191e83cbd451868a734bfac07ccd680d5617080b579Chris Craik const Rect& rect, float radius, bool highPriority) { 192e83cbd451868a734bfac07ccd680d5617080b579Chris Craik mSnapshot->setClippingRoundRect(allocator, rect, radius, highPriority); 193af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik} 194af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik 195fca52b7583d1e5f5ff8ed06554875d2a30ef56faChris Craikvoid CanvasState::setProjectionPathMask(LinearAllocator& allocator, const SkPath* path) { 196fca52b7583d1e5f5ff8ed06554875d2a30ef56faChris Craik mSnapshot->setProjectionPathMask(allocator, path); 197fca52b7583d1e5f5ff8ed06554875d2a30ef56faChris Craik} 198af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik 19914e513058ed4168c94e015638d16f5f87fd8063aChris Craik/////////////////////////////////////////////////////////////////////////////// 20014e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Quick Rejection 20114e513058ed4168c94e015638d16f5f87fd8063aChris Craik/////////////////////////////////////////////////////////////////////////////// 20214e513058ed4168c94e015638d16f5f87fd8063aChris Craik 20314e513058ed4168c94e015638d16f5f87fd8063aChris Craik/** 20414e513058ed4168c94e015638d16f5f87fd8063aChris Craik * Calculates whether content drawn within the passed bounds would be outside of, or intersect with 20514e513058ed4168c94e015638d16f5f87fd8063aChris Craik * the clipRect. Does not modify the scissor. 20614e513058ed4168c94e015638d16f5f87fd8063aChris Craik * 20714e513058ed4168c94e015638d16f5f87fd8063aChris Craik * @param clipRequired if not null, will be set to true if element intersects clip 20814e513058ed4168c94e015638d16f5f87fd8063aChris Craik * (and wasn't rejected) 20914e513058ed4168c94e015638d16f5f87fd8063aChris Craik * 21014e513058ed4168c94e015638d16f5f87fd8063aChris Craik * @param snapOut if set, the geometry will be treated as having an AA ramp. 21114e513058ed4168c94e015638d16f5f87fd8063aChris Craik * See Rect::snapGeometryToPixelBoundaries() 21214e513058ed4168c94e015638d16f5f87fd8063aChris Craik */ 213984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonbool CanvasState::calculateQuickRejectForScissor(float left, float top, 214deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik float right, float bottom, 215deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik bool* clipRequired, bool* roundRectClipRequired, 216deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik bool snapOut) const { 21714e513058ed4168c94e015638d16f5f87fd8063aChris Craik if (mSnapshot->isIgnored() || bottom <= top || right <= left) { 21814e513058ed4168c94e015638d16f5f87fd8063aChris Craik return true; 21914e513058ed4168c94e015638d16f5f87fd8063aChris Craik } 22014e513058ed4168c94e015638d16f5f87fd8063aChris Craik 22114e513058ed4168c94e015638d16f5f87fd8063aChris Craik Rect r(left, top, right, bottom); 222d6b65f67717025b1162f86f04e2caa5723566cacChris Craik currentTransform()->mapRect(r); 22314e513058ed4168c94e015638d16f5f87fd8063aChris Craik r.snapGeometryToPixelBoundaries(snapOut); 22414e513058ed4168c94e015638d16f5f87fd8063aChris Craik 225487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk Rect clipRect(currentClipRect()); 22614e513058ed4168c94e015638d16f5f87fd8063aChris Craik clipRect.snapToPixelBoundaries(); 22714e513058ed4168c94e015638d16f5f87fd8063aChris Craik 22814e513058ed4168c94e015638d16f5f87fd8063aChris Craik if (!clipRect.intersects(r)) return true; 22914e513058ed4168c94e015638d16f5f87fd8063aChris Craik 23014e513058ed4168c94e015638d16f5f87fd8063aChris Craik // clip is required if geometry intersects clip rect 231deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik if (clipRequired) { 232deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik *clipRequired = !clipRect.contains(r); 233deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik } 234deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik 235deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik // round rect clip is required if RR clip exists, and geometry intersects its corners 236deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik if (roundRectClipRequired) { 237d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik *roundRectClipRequired = mSnapshot->roundRectClipState != nullptr 238deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik && mSnapshot->roundRectClipState->areaRequiresRoundRectClip(r); 239deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik } 24014e513058ed4168c94e015638d16f5f87fd8063aChris Craik return false; 24114e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 24214e513058ed4168c94e015638d16f5f87fd8063aChris Craik 243984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudsonbool CanvasState::quickRejectConservative(float left, float top, 24414e513058ed4168c94e015638d16f5f87fd8063aChris Craik float right, float bottom) const { 24514e513058ed4168c94e015638d16f5f87fd8063aChris Craik if (mSnapshot->isIgnored() || bottom <= top || right <= left) { 24614e513058ed4168c94e015638d16f5f87fd8063aChris Craik return true; 24714e513058ed4168c94e015638d16f5f87fd8063aChris Craik } 24814e513058ed4168c94e015638d16f5f87fd8063aChris Craik 24914e513058ed4168c94e015638d16f5f87fd8063aChris Craik Rect r(left, top, right, bottom); 250d6b65f67717025b1162f86f04e2caa5723566cacChris Craik currentTransform()->mapRect(r); 25114e513058ed4168c94e015638d16f5f87fd8063aChris Craik r.roundOut(); // rounded out to be conservative 25214e513058ed4168c94e015638d16f5f87fd8063aChris Craik 253487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk Rect clipRect(currentClipRect()); 25414e513058ed4168c94e015638d16f5f87fd8063aChris Craik clipRect.snapToPixelBoundaries(); 25514e513058ed4168c94e015638d16f5f87fd8063aChris Craik 25614e513058ed4168c94e015638d16f5f87fd8063aChris Craik if (!clipRect.intersects(r)) return true; 25714e513058ed4168c94e015638d16f5f87fd8063aChris Craik 25814e513058ed4168c94e015638d16f5f87fd8063aChris Craik return false; 25914e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 26014e513058ed4168c94e015638d16f5f87fd8063aChris Craik 261984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson} // namespace uirenderer 262984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson} // namespace android 263