Snapshot.cpp revision af4d04cab6d48ae0d6a5e79bd30f679af87abaad
1ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy/* 2ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy * Copyright (C) 2012 The Android Open Source Project 3ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy * 4ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy * you may not use this file except in compliance with the License. 6ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy * You may obtain a copy of the License at 7ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy * 8ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy * http://www.apache.org/licenses/LICENSE-2.0 9ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy * 10ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy * Unless required by applicable law or agreed to in writing, software 11ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy * distributed under the License is distributed on an "AS IS" BASIS, 12ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy * See the License for the specific language governing permissions and 14ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy * limitations under the License. 15ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy */ 16ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 175f803623559aab395a29d575c37c4e39c23a4b4eChris Craik#define LOG_TAG "OpenGLRenderer" 185f803623559aab395a29d575c37c4e39c23a4b4eChris Craik 19ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy#include "Snapshot.h" 20ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 21ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy#include <SkCanvas.h> 22ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 23ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guynamespace android { 24ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guynamespace uirenderer { 25ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 26ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy/////////////////////////////////////////////////////////////////////////////// 27ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy// Constructors 28ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy/////////////////////////////////////////////////////////////////////////////// 29ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 30e4aa95e3627226bcb0d8cc3e42dca6e4df8f421cChris CraikSnapshot::Snapshot() 31e4aa95e3627226bcb0d8cc3e42dca6e4df8f421cChris Craik : flags(0) 32e4aa95e3627226bcb0d8cc3e42dca6e4df8f421cChris Craik , previous(NULL) 33e4aa95e3627226bcb0d8cc3e42dca6e4df8f421cChris Craik , layer(NULL) 34e4aa95e3627226bcb0d8cc3e42dca6e4df8f421cChris Craik , fbo(0) 35e4aa95e3627226bcb0d8cc3e42dca6e4df8f421cChris Craik , invisible(false) 36e4aa95e3627226bcb0d8cc3e42dca6e4df8f421cChris Craik , empty(false) 37deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik , alpha(1.0f) 38deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik , roundRectClipState(NULL) { 39ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy transform = &mTransformRoot; 40ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy clipRect = &mClipRectRoot; 41ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy region = NULL; 428ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy clipRegion = &mClipRegionRoot; 43ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy} 44ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 45ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy/** 46ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy * Copies the specified snapshot/ The specified snapshot is stored as 47ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy * the previous snapshot. 48ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy */ 49e4aa95e3627226bcb0d8cc3e42dca6e4df8f421cChris CraikSnapshot::Snapshot(const sp<Snapshot>& s, int saveFlags) 50e4aa95e3627226bcb0d8cc3e42dca6e4df8f421cChris Craik : flags(0) 51e4aa95e3627226bcb0d8cc3e42dca6e4df8f421cChris Craik , previous(s) 52e4aa95e3627226bcb0d8cc3e42dca6e4df8f421cChris Craik , layer(s->layer) 53e4aa95e3627226bcb0d8cc3e42dca6e4df8f421cChris Craik , fbo(s->fbo) 54e4aa95e3627226bcb0d8cc3e42dca6e4df8f421cChris Craik , invisible(s->invisible) 55e4aa95e3627226bcb0d8cc3e42dca6e4df8f421cChris Craik , empty(false) 56a64a2bef1048db5a742843f1e3bea9e80d0defc5Chris Craik , alpha(s->alpha) 57deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik , roundRectClipState(s->roundRectClipState) 58a64a2bef1048db5a742843f1e3bea9e80d0defc5Chris Craik , mViewportData(s->mViewportData) { 59ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy if (saveFlags & SkCanvas::kMatrix_SaveFlag) { 60ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy mTransformRoot.load(*s->transform); 61ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy transform = &mTransformRoot; 62ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy } else { 63ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy transform = s->transform; 64ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy } 65ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 66ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy if (saveFlags & SkCanvas::kClip_SaveFlag) { 67ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy mClipRectRoot.set(*s->clipRect); 68ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy clipRect = &mClipRectRoot; 698ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy if (!s->clipRegion->isEmpty()) { 700baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy mClipRegionRoot.op(*s->clipRegion, SkRegion::kUnion_Op); 71967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy } 728ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy clipRegion = &mClipRegionRoot; 73ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy } else { 74ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy clipRect = s->clipRect; 75967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy clipRegion = s->clipRegion; 76ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy } 77ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 78ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy if (s->flags & Snapshot::kFlagFboTarget) { 79ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy flags |= Snapshot::kFlagFboTarget; 80ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy region = s->region; 81ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy } else { 82ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy region = NULL; 83ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy } 84ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy} 85ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 86ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy/////////////////////////////////////////////////////////////////////////////// 87ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy// Clipping 88ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy/////////////////////////////////////////////////////////////////////////////// 89ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 90967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guyvoid Snapshot::ensureClipRegion() { 918ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy if (clipRegion->isEmpty()) { 920baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy clipRegion->setRect(clipRect->left, clipRect->top, clipRect->right, clipRect->bottom); 93967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy } 94967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy} 95967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy 96967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guyvoid Snapshot::copyClipRectFromRegion() { 97967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy if (!clipRegion->isEmpty()) { 980baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy const SkIRect& bounds = clipRegion->getBounds(); 990baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy clipRect->set(bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom); 100967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy 101967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy if (clipRegion->isRect()) { 1020baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy clipRegion->setEmpty(); 103967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy } 104967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy } else { 105967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy clipRect->setEmpty(); 106967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy } 107967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy} 108967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy 1090baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guybool Snapshot::clipRegionOp(float left, float top, float right, float bottom, SkRegion::Op op) { 1100baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy SkIRect tmp; 1110baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy tmp.set(left, top, right, bottom); 1120baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy clipRegion->op(tmp, op); 113967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy copyClipRectFromRegion(); 114967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy return true; 1158ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy} 1168ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 1178ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guybool Snapshot::clipRegionTransformed(const SkRegion& region, SkRegion::Op op) { 1188ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy ensureClipRegion(); 1198ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy clipRegion->op(region, op); 1208ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy copyClipRectFromRegion(); 1218ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy flags |= Snapshot::kFlagClipSet; 1228ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy return true; 123967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy} 124967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy 125ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guybool Snapshot::clip(float left, float top, float right, float bottom, SkRegion::Op op) { 126ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy Rect r(left, top, right, bottom); 127ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy transform->mapRect(r); 128ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy return clipTransformed(r, op); 129ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy} 130ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 131ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guybool Snapshot::clipTransformed(const Rect& r, SkRegion::Op op) { 132ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy bool clipped = false; 133ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 134ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy switch (op) { 135967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy case SkRegion::kIntersect_Op: { 1368ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy if (CC_UNLIKELY(!clipRegion->isEmpty())) { 137735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy ensureClipRegion(); 1380baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy clipped = clipRegionOp(r.left, r.top, r.right, r.bottom, SkRegion::kIntersect_Op); 139967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy } else { 140967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy clipped = clipRect->intersect(r); 141967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy if (!clipped) { 142967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy clipRect->setEmpty(); 143967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy clipped = true; 144967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy } 145ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy } 146ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy break; 147967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy } 148967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy case SkRegion::kReplace_Op: { 149967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy setClip(r.left, r.top, r.right, r.bottom); 150ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy clipped = true; 151ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy break; 152967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy } 1530baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy default: { 1540baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy ensureClipRegion(); 1550baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy clipped = clipRegionOp(r.left, r.top, r.right, r.bottom, op); 1560baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy break; 1570baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy } 158ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy } 159ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 160ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy if (clipped) { 161ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy flags |= Snapshot::kFlagClipSet; 162ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy } 163ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 164ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy return clipped; 165ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy} 166ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 167ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guyvoid Snapshot::setClip(float left, float top, float right, float bottom) { 168ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy clipRect->set(left, top, right, bottom); 1698ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy if (!clipRegion->isEmpty()) { 1700baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy clipRegion->setEmpty(); 171967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy } 172ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy flags |= Snapshot::kFlagClipSet; 173ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy} 174ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 175a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guybool Snapshot::hasPerspectiveTransform() const { 176a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy return transform->isPerspective(); 177a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy} 178a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy 179ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guyconst Rect& Snapshot::getLocalClip() { 180ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy mat4 inverse; 181ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy inverse.loadInverse(*transform); 182ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 183ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy mLocalClip.set(*clipRect); 184ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy inverse.mapRect(mLocalClip); 185ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 186ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy return mLocalClip; 187ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy} 188ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 189ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guyvoid Snapshot::resetClip(float left, float top, float right, float bottom) { 1903bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy // TODO: This is incorrect, when we start rendering into a new layer, 1913bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy // we may have to modify the previous snapshot's clip rect and clip 1923bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy // region if the previous restore() call did not restore the clip 193ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy clipRect = &mClipRectRoot; 1943c099c42fd7ead1429076055990ae39b72c904f4Romain Guy clipRegion = &mClipRegionRoot; 195967e2bf3ac8943a8e8a374bf86021915445cda67Romain Guy setClip(left, top, right, bottom); 196ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy} 197ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 198ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy/////////////////////////////////////////////////////////////////////////////// 199ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy// Transforms 200ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy/////////////////////////////////////////////////////////////////////////////// 201ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 202ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guyvoid Snapshot::resetTransform(float x, float y, float z) { 203ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy transform = &mTransformRoot; 204ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy transform->loadTranslate(x, y, z); 205ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy} 206ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 207ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy/////////////////////////////////////////////////////////////////////////////// 208af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik// Clipping round rect 209deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik/////////////////////////////////////////////////////////////////////////////// 210deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik 211af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craikvoid Snapshot::setClippingRoundRect(LinearAllocator& allocator, const Rect& bounds, float radius) { 212af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik if (bounds.isEmpty()) { 213af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik clipRect->setEmpty(); 214af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik return; 215af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik } 216deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik 217deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik RoundRectClipState* state = new (allocator) RoundRectClipState; 218deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik 219deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik // store the inverse drawing matrix 220af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik Matrix4 roundRectDrawingMatrix; 221af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik roundRectDrawingMatrix.load(getOrthoMatrix()); 222af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik roundRectDrawingMatrix.multiply(*transform); 223af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik state->matrix.loadInverse(roundRectDrawingMatrix); 224deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik 225deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik // compute area under rounded corners - only draws overlapping these rects need to be clipped 226deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik for (int i = 0 ; i < 4; i++) { 227deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik state->dangerRects[i] = bounds; 228deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik } 229deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik state->dangerRects[0].bottom = state->dangerRects[1].bottom = bounds.top + radius; 230deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik state->dangerRects[0].right = state->dangerRects[2].right = bounds.left + radius; 231deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik state->dangerRects[1].left = state->dangerRects[3].left = bounds.right - radius; 232deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik state->dangerRects[2].top = state->dangerRects[3].top = bounds.bottom - radius; 233deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik for (int i = 0; i < 4; i++) { 234deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik transform->mapRect(state->dangerRects[i]); 235deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik 236deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik // round danger rects out as though they are AA geometry (since they essentially are) 237deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik state->dangerRects[i].snapGeometryToPixelBoundaries(true); 238deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik } 239deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik 240deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik // store RR area 241af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik state->innerRect = bounds; 242af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik state->innerRect.inset(radius); 243af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik state->radius = radius; 244deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik 245deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik // store as immutable so, for this frame, pointer uniquely identifies this bundle of shader info 246deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik roundRectClipState = state; 247deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik} 248deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik 249deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik/////////////////////////////////////////////////////////////////////////////// 250ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy// Queries 251ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy/////////////////////////////////////////////////////////////////////////////// 252ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 253ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guybool Snapshot::isIgnored() const { 254ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy return invisible || empty; 255ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy} 256ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy 2575f803623559aab395a29d575c37c4e39c23a4b4eChris Craikvoid Snapshot::dump() const { 2585f803623559aab395a29d575c37c4e39c23a4b4eChris Craik ALOGD("Snapshot %p, flags %x, prev %p, height %d, ignored %d, hasComplexClip %d", 259a64a2bef1048db5a742843f1e3bea9e80d0defc5Chris Craik this, flags, previous.get(), getViewportHeight(), isIgnored(), clipRegion && !clipRegion->isEmpty()); 2605f803623559aab395a29d575c37c4e39c23a4b4eChris Craik ALOGD(" ClipRect (at %p) %.1f %.1f %.1f %.1f", 2615f803623559aab395a29d575c37c4e39c23a4b4eChris Craik clipRect, clipRect->left, clipRect->top, clipRect->right, clipRect->bottom); 2625f803623559aab395a29d575c37c4e39c23a4b4eChris Craik ALOGD(" Transform (at %p):", transform); 2635f803623559aab395a29d575c37c4e39c23a4b4eChris Craik transform->dump(); 2645f803623559aab395a29d575c37c4e39c23a4b4eChris Craik} 2655f803623559aab395a29d575c37c4e39c23a4b4eChris Craik 266ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy}; // namespace uirenderer 267ada4d53d50dc869b8278573ad640dc44118d3bcfRomain Guy}; // namespace android 268