RenderProperties.h revision 856f0cc3e382206e67c1a62fe878627d7dd9ada5
1acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck/* 2acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * Copyright (C) 2014 The Android Open Source Project 3acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * 4acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * Licensed under the Apache License, Version 2.0 (the "License"); 5acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * you may not use this file except in compliance with the License. 6acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * You may obtain a copy of the License at 7acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * 8acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * http://www.apache.org/licenses/LICENSE-2.0 9acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * 10acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * Unless required by applicable law or agreed to in writing, software 11acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * distributed under the License is distributed on an "AS IS" BASIS, 12acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * See the License for the specific language governing permissions and 14acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * limitations under the License. 15acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck */ 16b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#ifndef RENDERNODEPROPERTIES_H 17b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#define RENDERNODEPROPERTIES_H 18acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 19e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <algorithm> 20acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#include <stddef.h> 21e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <vector> 22acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#include <cutils/compiler.h> 23acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#include <androidfw/ResourceTypes.h> 24fe02b4b344c37200486d8afc972560fb550cb17eChris Craik#include <utils/Log.h> 25acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 26acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#include <SkCamera.h> 27acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#include <SkMatrix.h> 288c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik#include <SkRegion.h> 292dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudson#include <SkXfermode.h> 30b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik 31b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#include "Rect.h" 328c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik#include "RevealClip.h" 33b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#include "Outline.h" 34293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck#include "utils/MathUtils.h" 35acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 36acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass SkBitmap; 3725fbb3fa1138675379102a44405852555cefccbdJohn Reckclass SkColorFilter; 38acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass SkPaint; 39acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 40acb6f07623b7df3d4179f70ae03ade574616ffa6John Recknamespace android { 41acb6f07623b7df3d4179f70ae03ade574616ffa6John Recknamespace uirenderer { 42acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 43acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass Matrix4; 44acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass RenderNode; 4525fbb3fa1138675379102a44405852555cefccbdJohn Reckclass RenderProperties; 46acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 4779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck// The __VA_ARGS__ will be executed if a & b are not equal 4879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck#define RP_SET(a, b, ...) (a != b ? (a = b, ##__VA_ARGS__, true) : false) 4979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck#define RP_SET_AND_DIRTY(a, b) RP_SET(a, b, mPrimitiveFields.mMatrixOrPivotDirty = true) 5079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck 5125fbb3fa1138675379102a44405852555cefccbdJohn Reck// Keep in sync with View.java:LAYER_TYPE_* 52182952f5eeefc2a21d76d4664ada0e2d78c1105cChris Craikenum class LayerType { 53182952f5eeefc2a21d76d4664ada0e2d78c1105cChris Craik None = 0, 5425fbb3fa1138675379102a44405852555cefccbdJohn Reck // Although we cannot build the software layer directly (must be done at 5525fbb3fa1138675379102a44405852555cefccbdJohn Reck // record time), this information is used when applying alpha. 56182952f5eeefc2a21d76d4664ada0e2d78c1105cChris Craik Software = 1, 57182952f5eeefc2a21d76d4664ada0e2d78c1105cChris Craik RenderLayer = 2, 5825fbb3fa1138675379102a44405852555cefccbdJohn Reck // TODO: LayerTypeSurfaceTexture? Maybe? 5925fbb3fa1138675379102a44405852555cefccbdJohn Reck}; 6025fbb3fa1138675379102a44405852555cefccbdJohn Reck 61a753f4c6cb8558795e673df1896532cd148781e2Chris Craikenum ClippingFlags { 62a753f4c6cb8558795e673df1896532cd148781e2Chris Craik CLIP_TO_BOUNDS = 0x1 << 0, 63a753f4c6cb8558795e673df1896532cd148781e2Chris Craik CLIP_TO_CLIP_BOUNDS = 0x1 << 1, 64a753f4c6cb8558795e673df1896532cd148781e2Chris Craik}; 65a753f4c6cb8558795e673df1896532cd148781e2Chris Craik 6625fbb3fa1138675379102a44405852555cefccbdJohn Reckclass ANDROID_API LayerProperties { 6725fbb3fa1138675379102a44405852555cefccbdJohn Reckpublic: 6825fbb3fa1138675379102a44405852555cefccbdJohn Reck bool setType(LayerType type) { 6925fbb3fa1138675379102a44405852555cefccbdJohn Reck if (RP_SET(mType, type)) { 7025fbb3fa1138675379102a44405852555cefccbdJohn Reck reset(); 7125fbb3fa1138675379102a44405852555cefccbdJohn Reck return true; 7225fbb3fa1138675379102a44405852555cefccbdJohn Reck } 7325fbb3fa1138675379102a44405852555cefccbdJohn Reck return false; 7425fbb3fa1138675379102a44405852555cefccbdJohn Reck } 7525fbb3fa1138675379102a44405852555cefccbdJohn Reck 7625fbb3fa1138675379102a44405852555cefccbdJohn Reck bool setOpaque(bool opaque) { 7725fbb3fa1138675379102a44405852555cefccbdJohn Reck return RP_SET(mOpaque, opaque); 7825fbb3fa1138675379102a44405852555cefccbdJohn Reck } 7925fbb3fa1138675379102a44405852555cefccbdJohn Reck 8025fbb3fa1138675379102a44405852555cefccbdJohn Reck bool opaque() const { 8125fbb3fa1138675379102a44405852555cefccbdJohn Reck return mOpaque; 8225fbb3fa1138675379102a44405852555cefccbdJohn Reck } 8325fbb3fa1138675379102a44405852555cefccbdJohn Reck 8425fbb3fa1138675379102a44405852555cefccbdJohn Reck bool setAlpha(uint8_t alpha) { 8525fbb3fa1138675379102a44405852555cefccbdJohn Reck return RP_SET(mAlpha, alpha); 8625fbb3fa1138675379102a44405852555cefccbdJohn Reck } 8725fbb3fa1138675379102a44405852555cefccbdJohn Reck 8825fbb3fa1138675379102a44405852555cefccbdJohn Reck uint8_t alpha() const { 8925fbb3fa1138675379102a44405852555cefccbdJohn Reck return mAlpha; 9025fbb3fa1138675379102a44405852555cefccbdJohn Reck } 9125fbb3fa1138675379102a44405852555cefccbdJohn Reck 9225fbb3fa1138675379102a44405852555cefccbdJohn Reck bool setXferMode(SkXfermode::Mode mode) { 9325fbb3fa1138675379102a44405852555cefccbdJohn Reck return RP_SET(mMode, mode); 9425fbb3fa1138675379102a44405852555cefccbdJohn Reck } 9525fbb3fa1138675379102a44405852555cefccbdJohn Reck 9625fbb3fa1138675379102a44405852555cefccbdJohn Reck SkXfermode::Mode xferMode() const { 9725fbb3fa1138675379102a44405852555cefccbdJohn Reck return mMode; 9825fbb3fa1138675379102a44405852555cefccbdJohn Reck } 9925fbb3fa1138675379102a44405852555cefccbdJohn Reck 10025fbb3fa1138675379102a44405852555cefccbdJohn Reck bool setColorFilter(SkColorFilter* filter); 10125fbb3fa1138675379102a44405852555cefccbdJohn Reck 10225fbb3fa1138675379102a44405852555cefccbdJohn Reck SkColorFilter* colorFilter() const { 10325fbb3fa1138675379102a44405852555cefccbdJohn Reck return mColorFilter; 10425fbb3fa1138675379102a44405852555cefccbdJohn Reck } 10525fbb3fa1138675379102a44405852555cefccbdJohn Reck 10625fbb3fa1138675379102a44405852555cefccbdJohn Reck // Sets alpha, xfermode, and colorfilter from an SkPaint 10725fbb3fa1138675379102a44405852555cefccbdJohn Reck // paint may be NULL, in which case defaults will be set 10825fbb3fa1138675379102a44405852555cefccbdJohn Reck bool setFromPaint(const SkPaint* paint); 10925fbb3fa1138675379102a44405852555cefccbdJohn Reck 11025fbb3fa1138675379102a44405852555cefccbdJohn Reck bool needsBlending() const { 11125fbb3fa1138675379102a44405852555cefccbdJohn Reck return !opaque() || alpha() < 255; 11225fbb3fa1138675379102a44405852555cefccbdJohn Reck } 11325fbb3fa1138675379102a44405852555cefccbdJohn Reck 11425fbb3fa1138675379102a44405852555cefccbdJohn Reck LayerProperties& operator=(const LayerProperties& other); 11525fbb3fa1138675379102a44405852555cefccbdJohn Reck 11625fbb3fa1138675379102a44405852555cefccbdJohn Reckprivate: 11725fbb3fa1138675379102a44405852555cefccbdJohn Reck LayerProperties(); 11825fbb3fa1138675379102a44405852555cefccbdJohn Reck ~LayerProperties(); 11925fbb3fa1138675379102a44405852555cefccbdJohn Reck void reset(); 12025fbb3fa1138675379102a44405852555cefccbdJohn Reck 121856f0cc3e382206e67c1a62fe878627d7dd9ada5Chris Craik // Private since external users should go through properties().effectiveLayerType() 122856f0cc3e382206e67c1a62fe878627d7dd9ada5Chris Craik LayerType type() const { 123856f0cc3e382206e67c1a62fe878627d7dd9ada5Chris Craik return mType; 124856f0cc3e382206e67c1a62fe878627d7dd9ada5Chris Craik } 125856f0cc3e382206e67c1a62fe878627d7dd9ada5Chris Craik 12625fbb3fa1138675379102a44405852555cefccbdJohn Reck friend class RenderProperties; 12725fbb3fa1138675379102a44405852555cefccbdJohn Reck 128182952f5eeefc2a21d76d4664ada0e2d78c1105cChris Craik LayerType mType = LayerType::None; 12925fbb3fa1138675379102a44405852555cefccbdJohn Reck // Whether or not that Layer's content is opaque, doesn't include alpha 13025fbb3fa1138675379102a44405852555cefccbdJohn Reck bool mOpaque; 13125fbb3fa1138675379102a44405852555cefccbdJohn Reck uint8_t mAlpha; 13225fbb3fa1138675379102a44405852555cefccbdJohn Reck SkXfermode::Mode mMode; 133182952f5eeefc2a21d76d4664ada0e2d78c1105cChris Craik SkColorFilter* mColorFilter = nullptr; 13425fbb3fa1138675379102a44405852555cefccbdJohn Reck}; 13525fbb3fa1138675379102a44405852555cefccbdJohn Reck 136acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck/* 137acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * Data structure that holds the properties for a RenderNode 138acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck */ 13925fbb3fa1138675379102a44405852555cefccbdJohn Reckclass ANDROID_API RenderProperties { 140acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckpublic: 141acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck RenderProperties(); 142acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck virtual ~RenderProperties(); 143acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 144a753f4c6cb8558795e673df1896532cd148781e2Chris Craik static bool setFlag(int flag, bool newValue, int* outFlags) { 145a753f4c6cb8558795e673df1896532cd148781e2Chris Craik if (newValue) { 146a753f4c6cb8558795e673df1896532cd148781e2Chris Craik if (!(flag & *outFlags)) { 147a753f4c6cb8558795e673df1896532cd148781e2Chris Craik *outFlags |= flag; 148a753f4c6cb8558795e673df1896532cd148781e2Chris Craik return true; 149a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } 150a753f4c6cb8558795e673df1896532cd148781e2Chris Craik return false; 151a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } else { 152a753f4c6cb8558795e673df1896532cd148781e2Chris Craik if (flag & *outFlags) { 153a753f4c6cb8558795e673df1896532cd148781e2Chris Craik *outFlags &= ~flag; 154a753f4c6cb8558795e673df1896532cd148781e2Chris Craik return true; 155a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } 156a753f4c6cb8558795e673df1896532cd148781e2Chris Craik return false; 157a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } 158a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } 159a753f4c6cb8558795e673df1896532cd148781e2Chris Craik 160d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck RenderProperties& operator=(const RenderProperties& other); 161d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 16279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setClipToBounds(bool clipToBounds) { 163a753f4c6cb8558795e673df1896532cd148781e2Chris Craik return setFlag(CLIP_TO_BOUNDS, clipToBounds, &mPrimitiveFields.mClippingFlags); 164a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } 165a753f4c6cb8558795e673df1896532cd148781e2Chris Craik 166a753f4c6cb8558795e673df1896532cd148781e2Chris Craik bool setClipBounds(const Rect& clipBounds) { 167a753f4c6cb8558795e673df1896532cd148781e2Chris Craik bool ret = setFlag(CLIP_TO_CLIP_BOUNDS, true, &mPrimitiveFields.mClippingFlags); 168a753f4c6cb8558795e673df1896532cd148781e2Chris Craik return RP_SET(mPrimitiveFields.mClipBounds, clipBounds) || ret; 169a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } 170a753f4c6cb8558795e673df1896532cd148781e2Chris Craik 171a753f4c6cb8558795e673df1896532cd148781e2Chris Craik bool setClipBoundsEmpty() { 172a753f4c6cb8558795e673df1896532cd148781e2Chris Craik return setFlag(CLIP_TO_CLIP_BOUNDS, false, &mPrimitiveFields.mClippingFlags); 173acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 174acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 17579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setProjectBackwards(bool shouldProject) { 17679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET(mPrimitiveFields.mProjectBackwards, shouldProject); 177acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 178acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 17979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setProjectionReceiver(bool shouldRecieve) { 18079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET(mPrimitiveFields.mProjectionReceiver, shouldRecieve); 181acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 182acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 183d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool isProjectionReceiver() const { 184d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mProjectionReceiver; 185acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 186acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 18779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setStaticMatrix(const SkMatrix* matrix) { 188acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck delete mStaticMatrix; 189d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck if (matrix) { 190d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mStaticMatrix = new SkMatrix(*matrix); 191d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } else { 192e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik mStaticMatrix = nullptr; 193d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 19479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 195acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 196acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 197acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck // Can return NULL 198d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck const SkMatrix* getStaticMatrix() const { 199acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck return mStaticMatrix; 200acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 201acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 20279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setAnimationMatrix(const SkMatrix* matrix) { 203acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck delete mAnimationMatrix; 204acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck if (matrix) { 205acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck mAnimationMatrix = new SkMatrix(*matrix); 206acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } else { 207e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik mAnimationMatrix = nullptr; 208acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 20979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 210acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 211acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 21279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setAlpha(float alpha) { 2133b52c03f5035b833d365215420739aa840ac5080John Reck alpha = MathUtils::clampAlpha(alpha); 21479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET(mPrimitiveFields.mAlpha, alpha); 215acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 216acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 217acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getAlpha() const { 218d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mAlpha; 219acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 220acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 22179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setHasOverlappingRendering(bool hasOverlappingRendering) { 22279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET(mPrimitiveFields.mHasOverlappingRendering, hasOverlappingRendering); 223acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 224acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 225acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck bool hasOverlappingRendering() const { 226d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mHasOverlappingRendering; 227acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 228acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 22979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setElevation(float elevation) { 23079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET(mPrimitiveFields.mElevation, elevation); 23179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck // Don't dirty matrix/pivot, since they don't respect Z 232cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik } 233cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik 234cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik float getElevation() const { 235cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik return mPrimitiveFields.mElevation; 236cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik } 237cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik 23879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setTranslationX(float translationX) { 23979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mTranslationX, translationX); 240acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 241acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 242acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getTranslationX() const { 243d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mTranslationX; 244acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 245acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 24679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setTranslationY(float translationY) { 24779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mTranslationY, translationY); 248acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 249acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 250acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getTranslationY() const { 251d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mTranslationY; 252acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 253acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 25479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setTranslationZ(float translationZ) { 25579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET(mPrimitiveFields.mTranslationZ, translationZ); 25679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck // mMatrixOrPivotDirty not set, since matrix doesn't respect Z 257acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 258acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 259acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getTranslationZ() const { 260d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mTranslationZ; 261acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 262acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 263e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // Animation helper 26479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setX(float value) { 26579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return setTranslationX(value - getLeft()); 266e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 267e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 268e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // Animation helper 269e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck float getX() const { 270e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return getLeft() + getTranslationX(); 271e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 272e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 273e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // Animation helper 27479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setY(float value) { 27579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return setTranslationY(value - getTop()); 276e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 277e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 278e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // Animation helper 279e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck float getY() const { 280e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return getTop() + getTranslationY(); 281e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 282e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 283e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // Animation helper 28479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setZ(float value) { 28579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return setTranslationZ(value - getElevation()); 286e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 287e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 288cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik float getZ() const { 289cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik return getElevation() + getTranslationZ(); 290cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik } 291cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik 29279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setRotation(float rotation) { 29379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mRotation, rotation); 294acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 295acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 296acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getRotation() const { 297d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mRotation; 298acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 299acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 30079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setRotationX(float rotationX) { 30179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mRotationX, rotationX); 302acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 303acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 304acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getRotationX() const { 305d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mRotationX; 306acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 307acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 30879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setRotationY(float rotationY) { 30979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mRotationY, rotationY); 310acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 311acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 312acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getRotationY() const { 313d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mRotationY; 314acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 315acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 31679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setScaleX(float scaleX) { 31779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mScaleX, scaleX); 318acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 319acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 320acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getScaleX() const { 321d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mScaleX; 322acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 323acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 32479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setScaleY(float scaleY) { 32579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mScaleY, scaleY); 326acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 327acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 328acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getScaleY() const { 329d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mScaleY; 330acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 331acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 33279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setPivotX(float pivotX) { 33379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck if (RP_SET(mPrimitiveFields.mPivotX, pivotX) 33479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck || !mPrimitiveFields.mPivotExplicitlySet) { 33579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 33679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck mPrimitiveFields.mPivotExplicitlySet = true; 33779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 33879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck } 33979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 340acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 341acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 342d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck /* Note that getPivotX and getPivotY are adjusted by updateMatrix(), 34379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck * so the value returned may be stale if the RenderProperties has been 34479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck * modified since the last call to updateMatrix() 345d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck */ 346d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float getPivotX() const { 347d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mPivotX; 348d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 349acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 35079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setPivotY(float pivotY) { 35179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck if (RP_SET(mPrimitiveFields.mPivotY, pivotY) 35279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck || !mPrimitiveFields.mPivotExplicitlySet) { 35379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 35479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck mPrimitiveFields.mPivotExplicitlySet = true; 35579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 35679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck } 35779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 358acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 359acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 360d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float getPivotY() const { 361d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mPivotY; 362d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 363acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 36449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik bool isPivotExplicitlySet() const { 36549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik return mPrimitiveFields.mPivotExplicitlySet; 36649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik } 36749e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik 36879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setCameraDistance(float distance) { 36949e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik if (distance != getCameraDistance()) { 370f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 37149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik mComputedFields.mTransformCamera.setCameraLocation(0, 0, distance); 37279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 373acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 37479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 375acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 376acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 377acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getCameraDistance() const { 37849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik // TODO: update getCameraLocationZ() to be const 37949e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik return const_cast<Sk3DView*>(&mComputedFields.mTransformCamera)->getCameraLocationZ(); 380acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 381acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 38279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setLeft(int left) { 38379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck if (RP_SET(mPrimitiveFields.mLeft, left)) { 384d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft; 385f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck if (!mPrimitiveFields.mPivotExplicitlySet) { 386f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 387acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 38879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 389acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 39079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 391acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 392acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 393acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getLeft() const { 394d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mLeft; 395acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 396acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 39779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setTop(int top) { 39879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck if (RP_SET(mPrimitiveFields.mTop, top)) { 399d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop; 400f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck if (!mPrimitiveFields.mPivotExplicitlySet) { 401f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 402acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 40379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 404acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 40579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 406acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 407acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 408acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getTop() const { 409d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mTop; 410acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 411acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 41279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setRight(int right) { 41379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck if (RP_SET(mPrimitiveFields.mRight, right)) { 414d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft; 415f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck if (!mPrimitiveFields.mPivotExplicitlySet) { 416f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 417acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 41879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 419acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 42079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 421acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 422acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 423acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getRight() const { 424d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mRight; 425acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 426acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 42779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setBottom(int bottom) { 42879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck if (RP_SET(mPrimitiveFields.mBottom, bottom)) { 429d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop; 430f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck if (!mPrimitiveFields.mPivotExplicitlySet) { 431f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 432acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 43379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 434acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 43579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 436acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 437acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 438acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getBottom() const { 439d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mBottom; 440acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 441acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 44279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setLeftTop(int left, int top) { 44379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool leftResult = setLeft(left); 44479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool topResult = setTop(top); 44579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return leftResult || topResult; 446acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 447acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 44879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setLeftTopRightBottom(int left, int top, int right, int bottom) { 449cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik if (left != mPrimitiveFields.mLeft || top != mPrimitiveFields.mTop 450cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik || right != mPrimitiveFields.mRight || bottom != mPrimitiveFields.mBottom) { 451d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mLeft = left; 452d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mTop = top; 453d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mRight = right; 454d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mBottom = bottom; 455d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft; 456d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop; 457f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck if (!mPrimitiveFields.mPivotExplicitlySet) { 458f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 459acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 46079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 461acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 46279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 463acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 464acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 465a753f4c6cb8558795e673df1896532cd148781e2Chris Craik bool offsetLeftRight(int offset) { 466acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck if (offset != 0) { 467d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mLeft += offset; 468d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mRight += offset; 46979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 470acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 47179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 472acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 473acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 474a753f4c6cb8558795e673df1896532cd148781e2Chris Craik bool offsetTopBottom(int offset) { 475acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck if (offset != 0) { 476d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mTop += offset; 477d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mBottom += offset; 47879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 479acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 48079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 481acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 482acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 483b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik int getWidth() const { 484d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mWidth; 485acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 486acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 487b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik int getHeight() const { 488d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mHeight; 489d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 490d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 491d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck const SkMatrix* getAnimationMatrix() const { 492d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mAnimationMatrix; 493d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 494d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 495f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck bool hasTransformMatrix() const { 496f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck return getTransformMatrix() && !getTransformMatrix()->isIdentity(); 497f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck } 498f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck 499f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck // May only call this if hasTransformMatrix() is true 500f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck bool isTransformTranslateOnly() const { 501f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck return getTransformMatrix()->getType() == SkMatrix::kTranslate_Mask; 502d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 503d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 50449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik const SkMatrix* getTransformMatrix() const { 505f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck LOG_ALWAYS_FATAL_IF(mPrimitiveFields.mMatrixOrPivotDirty, "Cannot get a dirty matrix!"); 506d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mComputedFields.mTransformMatrix; 507d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 508d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 509a753f4c6cb8558795e673df1896532cd148781e2Chris Craik int getClippingFlags() const { 510a753f4c6cb8558795e673df1896532cd148781e2Chris Craik return mPrimitiveFields.mClippingFlags; 511a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } 512a753f4c6cb8558795e673df1896532cd148781e2Chris Craik 513d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool getClipToBounds() const { 514a753f4c6cb8558795e673df1896532cd148781e2Chris Craik return mPrimitiveFields.mClippingFlags & CLIP_TO_BOUNDS; 515a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } 516a753f4c6cb8558795e673df1896532cd148781e2Chris Craik 517a753f4c6cb8558795e673df1896532cd148781e2Chris Craik void getClippingRectForFlags(uint32_t flags, Rect* outRect) const { 518a753f4c6cb8558795e673df1896532cd148781e2Chris Craik if (flags & CLIP_TO_BOUNDS) { 519a753f4c6cb8558795e673df1896532cd148781e2Chris Craik outRect->set(0, 0, getWidth(), getHeight()); 520a753f4c6cb8558795e673df1896532cd148781e2Chris Craik if (flags & CLIP_TO_CLIP_BOUNDS) { 521a753f4c6cb8558795e673df1896532cd148781e2Chris Craik outRect->intersect(mPrimitiveFields.mClipBounds); 522a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } 523a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } else { 524a753f4c6cb8558795e673df1896532cd148781e2Chris Craik outRect->set(mPrimitiveFields.mClipBounds); 525a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } 526d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 527d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 528d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool getHasOverlappingRendering() const { 529d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mHasOverlappingRendering; 530d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 531d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 532d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck const Outline& getOutline() const { 533d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mOutline; 534d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 535d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 5368c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik const RevealClip& getRevealClip() const { 5378c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik return mPrimitiveFields.mRevealClip; 5388c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik } 5398c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik 540d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool getProjectBackwards() const { 541d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mProjectBackwards; 542d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 543d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 544d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck void debugOutputProperties(const int level) const; 545d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 54625fbb3fa1138675379102a44405852555cefccbdJohn Reck void updateMatrix(); 547d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 548d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck Outline& mutableOutline() { 549d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mOutline; 550b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik } 551b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik 5528c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik RevealClip& mutableRevealClip() { 5538c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik return mPrimitiveFields.mRevealClip; 5548c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik } 5558c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik 55625fbb3fa1138675379102a44405852555cefccbdJohn Reck const LayerProperties& layerProperties() const { 55725fbb3fa1138675379102a44405852555cefccbdJohn Reck return mLayerProperties; 55825fbb3fa1138675379102a44405852555cefccbdJohn Reck } 55925fbb3fa1138675379102a44405852555cefccbdJohn Reck 56025fbb3fa1138675379102a44405852555cefccbdJohn Reck LayerProperties& mutateLayerProperties() { 56125fbb3fa1138675379102a44405852555cefccbdJohn Reck return mLayerProperties; 56225fbb3fa1138675379102a44405852555cefccbdJohn Reck } 56325fbb3fa1138675379102a44405852555cefccbdJohn Reck 564293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck // Returns true if damage calculations should be clipped to bounds 565293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck // TODO: Figure out something better for getZ(), as children should still be 566293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck // clipped to this RP's bounds. But as we will damage -INT_MAX to INT_MAX 567293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck // for this RP's getZ() anyway, this can be optimized when we have a 568293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck // Z damage estimate instead of INT_MAX 569293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck bool getClipDamageToBounds() const { 570293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck return getClipToBounds() && (getZ() <= 0 || getOutline().isEmpty()); 571293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck } 572293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck 5735c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik bool hasShadow() const { 574b5a5435a77bae40b55053ccde93b1ed45d0e8329Chris Craik return getZ() > 0.0f 575e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik && getOutline().getPath() != nullptr 5769fa364dc72613f4301b0783f0547fe6b01abac39Chris Craik && getOutline().getAlpha() != 0.0f; 5775c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik } 5785c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik 579856f0cc3e382206e67c1a62fe878627d7dd9ada5Chris Craik LayerType effectiveLayerType() const { 580856f0cc3e382206e67c1a62fe878627d7dd9ada5Chris Craik LayerType type = mLayerProperties.mType; 581856f0cc3e382206e67c1a62fe878627d7dd9ada5Chris Craik if (type == LayerType::None 582856f0cc3e382206e67c1a62fe878627d7dd9ada5Chris Craik && !MathUtils::isZero(mPrimitiveFields.mAlpha) 583856f0cc3e382206e67c1a62fe878627d7dd9ada5Chris Craik && mPrimitiveFields.mAlpha < 1 584856f0cc3e382206e67c1a62fe878627d7dd9ada5Chris Craik && mPrimitiveFields.mHasOverlappingRendering) { 585856f0cc3e382206e67c1a62fe878627d7dd9ada5Chris Craik return LayerType::RenderLayer; 586856f0cc3e382206e67c1a62fe878627d7dd9ada5Chris Craik } 587856f0cc3e382206e67c1a62fe878627d7dd9ada5Chris Craik return type; 588856f0cc3e382206e67c1a62fe878627d7dd9ada5Chris Craik } 589856f0cc3e382206e67c1a62fe878627d7dd9ada5Chris Craik 590acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckprivate: 591acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck // Rendering properties 592d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck struct PrimitiveFields { 593d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck PrimitiveFields(); 594d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 595d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck Outline mOutline; 5968c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik RevealClip mRevealClip; 597a753f4c6cb8558795e673df1896532cd148781e2Chris Craik int mClippingFlags; 598d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool mProjectBackwards; 599d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool mProjectionReceiver; 600d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float mAlpha; 601d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool mHasOverlappingRendering; 602cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik float mElevation; 603d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float mTranslationX, mTranslationY, mTranslationZ; 604d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float mRotation, mRotationX, mRotationY; 605d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float mScaleX, mScaleY; 606d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float mPivotX, mPivotY; 607d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck int mLeft, mTop, mRight, mBottom; 608d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck int mWidth, mHeight; 609d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool mPivotExplicitlySet; 610f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck bool mMatrixOrPivotDirty; 611a753f4c6cb8558795e673df1896532cd148781e2Chris Craik Rect mClipBounds; 612d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } mPrimitiveFields; 613d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 614acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck SkMatrix* mStaticMatrix; 615acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck SkMatrix* mAnimationMatrix; 61625fbb3fa1138675379102a44405852555cefccbdJohn Reck LayerProperties mLayerProperties; 617acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 618d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck /** 619d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck * These fields are all generated from other properties and are not set directly. 620d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck */ 621d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck struct ComputedFields { 622d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck ComputedFields(); 623d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck ~ComputedFields(); 624d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 625d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck /** 626d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck * Stores the total transformation of the DisplayList based upon its scalar 627d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck * translate/rotate/scale properties. 628d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck * 62949e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik * In the common translation-only case, the matrix isn't necessarily allocated, 63049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik * and the mTranslation properties are used directly. 631d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck */ 63249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik SkMatrix* mTransformMatrix; 63349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik 63449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik Sk3DView mTransformCamera; 635d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } mComputedFields; 636acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck}; 637acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 638acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck} /* namespace uirenderer */ 639acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck} /* namespace android */ 640acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 641b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#endif /* RENDERNODEPROPERTIES_H */ 642