RenderProperties.h revision 9fa364dc72613f4301b0783f0547fe6b01abac39
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> 29b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik 30e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include "Animator.h" 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_* 5225fbb3fa1138675379102a44405852555cefccbdJohn Reckenum LayerType { 5325fbb3fa1138675379102a44405852555cefccbdJohn Reck kLayerTypeNone = 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. 5625fbb3fa1138675379102a44405852555cefccbdJohn Reck kLayerTypeSoftware = 1, 5725fbb3fa1138675379102a44405852555cefccbdJohn Reck kLayerTypeRenderLayer = 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 LayerType type() const { 7725fbb3fa1138675379102a44405852555cefccbdJohn Reck return mType; 7825fbb3fa1138675379102a44405852555cefccbdJohn Reck } 7925fbb3fa1138675379102a44405852555cefccbdJohn Reck 8025fbb3fa1138675379102a44405852555cefccbdJohn Reck bool setOpaque(bool opaque) { 8125fbb3fa1138675379102a44405852555cefccbdJohn Reck return RP_SET(mOpaque, opaque); 8225fbb3fa1138675379102a44405852555cefccbdJohn Reck } 8325fbb3fa1138675379102a44405852555cefccbdJohn Reck 8425fbb3fa1138675379102a44405852555cefccbdJohn Reck bool opaque() const { 8525fbb3fa1138675379102a44405852555cefccbdJohn Reck return mOpaque; 8625fbb3fa1138675379102a44405852555cefccbdJohn Reck } 8725fbb3fa1138675379102a44405852555cefccbdJohn Reck 8825fbb3fa1138675379102a44405852555cefccbdJohn Reck bool setAlpha(uint8_t alpha) { 8925fbb3fa1138675379102a44405852555cefccbdJohn Reck return RP_SET(mAlpha, alpha); 9025fbb3fa1138675379102a44405852555cefccbdJohn Reck } 9125fbb3fa1138675379102a44405852555cefccbdJohn Reck 9225fbb3fa1138675379102a44405852555cefccbdJohn Reck uint8_t alpha() const { 9325fbb3fa1138675379102a44405852555cefccbdJohn Reck return mAlpha; 9425fbb3fa1138675379102a44405852555cefccbdJohn Reck } 9525fbb3fa1138675379102a44405852555cefccbdJohn Reck 9625fbb3fa1138675379102a44405852555cefccbdJohn Reck bool setXferMode(SkXfermode::Mode mode) { 9725fbb3fa1138675379102a44405852555cefccbdJohn Reck return RP_SET(mMode, mode); 9825fbb3fa1138675379102a44405852555cefccbdJohn Reck } 9925fbb3fa1138675379102a44405852555cefccbdJohn Reck 10025fbb3fa1138675379102a44405852555cefccbdJohn Reck SkXfermode::Mode xferMode() const { 10125fbb3fa1138675379102a44405852555cefccbdJohn Reck return mMode; 10225fbb3fa1138675379102a44405852555cefccbdJohn Reck } 10325fbb3fa1138675379102a44405852555cefccbdJohn Reck 10425fbb3fa1138675379102a44405852555cefccbdJohn Reck bool setColorFilter(SkColorFilter* filter); 10525fbb3fa1138675379102a44405852555cefccbdJohn Reck 10625fbb3fa1138675379102a44405852555cefccbdJohn Reck SkColorFilter* colorFilter() const { 10725fbb3fa1138675379102a44405852555cefccbdJohn Reck return mColorFilter; 10825fbb3fa1138675379102a44405852555cefccbdJohn Reck } 10925fbb3fa1138675379102a44405852555cefccbdJohn Reck 11025fbb3fa1138675379102a44405852555cefccbdJohn Reck // Sets alpha, xfermode, and colorfilter from an SkPaint 11125fbb3fa1138675379102a44405852555cefccbdJohn Reck // paint may be NULL, in which case defaults will be set 11225fbb3fa1138675379102a44405852555cefccbdJohn Reck bool setFromPaint(const SkPaint* paint); 11325fbb3fa1138675379102a44405852555cefccbdJohn Reck 11425fbb3fa1138675379102a44405852555cefccbdJohn Reck bool needsBlending() const { 11525fbb3fa1138675379102a44405852555cefccbdJohn Reck return !opaque() || alpha() < 255; 11625fbb3fa1138675379102a44405852555cefccbdJohn Reck } 11725fbb3fa1138675379102a44405852555cefccbdJohn Reck 11825fbb3fa1138675379102a44405852555cefccbdJohn Reck LayerProperties& operator=(const LayerProperties& other); 11925fbb3fa1138675379102a44405852555cefccbdJohn Reck 12025fbb3fa1138675379102a44405852555cefccbdJohn Reckprivate: 12125fbb3fa1138675379102a44405852555cefccbdJohn Reck LayerProperties(); 12225fbb3fa1138675379102a44405852555cefccbdJohn Reck ~LayerProperties(); 12325fbb3fa1138675379102a44405852555cefccbdJohn Reck void reset(); 12425fbb3fa1138675379102a44405852555cefccbdJohn Reck 12525fbb3fa1138675379102a44405852555cefccbdJohn Reck friend class RenderProperties; 12625fbb3fa1138675379102a44405852555cefccbdJohn Reck 12725fbb3fa1138675379102a44405852555cefccbdJohn Reck LayerType mType; 12825fbb3fa1138675379102a44405852555cefccbdJohn Reck // Whether or not that Layer's content is opaque, doesn't include alpha 12925fbb3fa1138675379102a44405852555cefccbdJohn Reck bool mOpaque; 13025fbb3fa1138675379102a44405852555cefccbdJohn Reck uint8_t mAlpha; 13125fbb3fa1138675379102a44405852555cefccbdJohn Reck SkXfermode::Mode mMode; 13225fbb3fa1138675379102a44405852555cefccbdJohn Reck SkColorFilter* mColorFilter; 13325fbb3fa1138675379102a44405852555cefccbdJohn Reck}; 13425fbb3fa1138675379102a44405852555cefccbdJohn Reck 135acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck/* 136acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * Data structure that holds the properties for a RenderNode 137acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck */ 13825fbb3fa1138675379102a44405852555cefccbdJohn Reckclass ANDROID_API RenderProperties { 139acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckpublic: 140acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck RenderProperties(); 141acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck virtual ~RenderProperties(); 142acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 143a753f4c6cb8558795e673df1896532cd148781e2Chris Craik static bool setFlag(int flag, bool newValue, int* outFlags) { 144a753f4c6cb8558795e673df1896532cd148781e2Chris Craik if (newValue) { 145a753f4c6cb8558795e673df1896532cd148781e2Chris Craik if (!(flag & *outFlags)) { 146a753f4c6cb8558795e673df1896532cd148781e2Chris Craik *outFlags |= flag; 147a753f4c6cb8558795e673df1896532cd148781e2Chris Craik return true; 148a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } 149a753f4c6cb8558795e673df1896532cd148781e2Chris Craik return false; 150a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } else { 151a753f4c6cb8558795e673df1896532cd148781e2Chris Craik if (flag & *outFlags) { 152a753f4c6cb8558795e673df1896532cd148781e2Chris Craik *outFlags &= ~flag; 153a753f4c6cb8558795e673df1896532cd148781e2Chris Craik return true; 154a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } 155a753f4c6cb8558795e673df1896532cd148781e2Chris Craik return false; 156a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } 157a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } 158a753f4c6cb8558795e673df1896532cd148781e2Chris Craik 159d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck RenderProperties& operator=(const RenderProperties& other); 160d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 16179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setClipToBounds(bool clipToBounds) { 162a753f4c6cb8558795e673df1896532cd148781e2Chris Craik return setFlag(CLIP_TO_BOUNDS, clipToBounds, &mPrimitiveFields.mClippingFlags); 163a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } 164a753f4c6cb8558795e673df1896532cd148781e2Chris Craik 165a753f4c6cb8558795e673df1896532cd148781e2Chris Craik bool setClipBounds(const Rect& clipBounds) { 166a753f4c6cb8558795e673df1896532cd148781e2Chris Craik bool ret = setFlag(CLIP_TO_CLIP_BOUNDS, true, &mPrimitiveFields.mClippingFlags); 167a753f4c6cb8558795e673df1896532cd148781e2Chris Craik return RP_SET(mPrimitiveFields.mClipBounds, clipBounds) || ret; 168a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } 169a753f4c6cb8558795e673df1896532cd148781e2Chris Craik 170a753f4c6cb8558795e673df1896532cd148781e2Chris Craik bool setClipBoundsEmpty() { 171a753f4c6cb8558795e673df1896532cd148781e2Chris Craik return setFlag(CLIP_TO_CLIP_BOUNDS, false, &mPrimitiveFields.mClippingFlags); 172acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 173acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 17479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setProjectBackwards(bool shouldProject) { 17579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET(mPrimitiveFields.mProjectBackwards, shouldProject); 176acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 177acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 17879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setProjectionReceiver(bool shouldRecieve) { 17979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET(mPrimitiveFields.mProjectionReceiver, shouldRecieve); 180acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 181acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 182d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool isProjectionReceiver() const { 183d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mProjectionReceiver; 184acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 185acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 18679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setStaticMatrix(const SkMatrix* matrix) { 187acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck delete mStaticMatrix; 188d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck if (matrix) { 189d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mStaticMatrix = new SkMatrix(*matrix); 190d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } else { 191d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mStaticMatrix = NULL; 192d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 19379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 194acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 195acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 196acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck // Can return NULL 197d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck const SkMatrix* getStaticMatrix() const { 198acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck return mStaticMatrix; 199acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 200acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 20179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setAnimationMatrix(const SkMatrix* matrix) { 202acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck delete mAnimationMatrix; 203acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck if (matrix) { 204acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck mAnimationMatrix = new SkMatrix(*matrix); 205acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } else { 206acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck mAnimationMatrix = NULL; 207acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 20879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 209acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 210acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 21179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setAlpha(float alpha) { 2123b52c03f5035b833d365215420739aa840ac5080John Reck alpha = MathUtils::clampAlpha(alpha); 21379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET(mPrimitiveFields.mAlpha, alpha); 214acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 215acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 216acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getAlpha() const { 217d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mAlpha; 218acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 219acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 22079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setHasOverlappingRendering(bool hasOverlappingRendering) { 22179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET(mPrimitiveFields.mHasOverlappingRendering, hasOverlappingRendering); 222acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 223acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 224acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck bool hasOverlappingRendering() const { 225d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mHasOverlappingRendering; 226acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 227acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 22879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setElevation(float elevation) { 22979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET(mPrimitiveFields.mElevation, elevation); 23079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck // Don't dirty matrix/pivot, since they don't respect Z 231cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik } 232cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik 233cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik float getElevation() const { 234cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik return mPrimitiveFields.mElevation; 235cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik } 236cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik 23779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setTranslationX(float translationX) { 23879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mTranslationX, translationX); 239acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 240acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 241acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getTranslationX() const { 242d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mTranslationX; 243acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 244acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 24579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setTranslationY(float translationY) { 24679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mTranslationY, translationY); 247acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 248acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 249acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getTranslationY() const { 250d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mTranslationY; 251acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 252acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 25379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setTranslationZ(float translationZ) { 25479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET(mPrimitiveFields.mTranslationZ, translationZ); 25579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck // mMatrixOrPivotDirty not set, since matrix doesn't respect Z 256acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 257acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 258acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getTranslationZ() const { 259d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mTranslationZ; 260acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 261acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 262e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // Animation helper 26379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setX(float value) { 26479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return setTranslationX(value - getLeft()); 265e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 266e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 267e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // Animation helper 268e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck float getX() const { 269e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return getLeft() + getTranslationX(); 270e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 271e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 272e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // Animation helper 27379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setY(float value) { 27479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return setTranslationY(value - getTop()); 275e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 276e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 277e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // Animation helper 278e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck float getY() const { 279e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return getTop() + getTranslationY(); 280e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 281e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 282e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // Animation helper 28379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setZ(float value) { 28479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return setTranslationZ(value - getElevation()); 285e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 286e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 287cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik float getZ() const { 288cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik return getElevation() + getTranslationZ(); 289cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik } 290cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik 29179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setRotation(float rotation) { 29279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mRotation, rotation); 293acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 294acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 295acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getRotation() const { 296d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mRotation; 297acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 298acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 29979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setRotationX(float rotationX) { 30079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mRotationX, rotationX); 301acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 302acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 303acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getRotationX() const { 304d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mRotationX; 305acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 306acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 30779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setRotationY(float rotationY) { 30879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mRotationY, rotationY); 309acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 310acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 311acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getRotationY() const { 312d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mRotationY; 313acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 314acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 31579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setScaleX(float scaleX) { 31679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mScaleX, scaleX); 317acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 318acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 319acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getScaleX() const { 320d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mScaleX; 321acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 322acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 32379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setScaleY(float scaleY) { 32479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mScaleY, scaleY); 325acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 326acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 327acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getScaleY() const { 328d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mScaleY; 329acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 330acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 33179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setPivotX(float pivotX) { 33279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck if (RP_SET(mPrimitiveFields.mPivotX, pivotX) 33379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck || !mPrimitiveFields.mPivotExplicitlySet) { 33479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 33579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck mPrimitiveFields.mPivotExplicitlySet = true; 33679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 33779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck } 33879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 339acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 340acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 341d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck /* Note that getPivotX and getPivotY are adjusted by updateMatrix(), 34279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck * so the value returned may be stale if the RenderProperties has been 34379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck * modified since the last call to updateMatrix() 344d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck */ 345d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float getPivotX() const { 346d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mPivotX; 347d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 348acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 34979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setPivotY(float pivotY) { 35079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck if (RP_SET(mPrimitiveFields.mPivotY, pivotY) 35179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck || !mPrimitiveFields.mPivotExplicitlySet) { 35279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 35379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck mPrimitiveFields.mPivotExplicitlySet = true; 35479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 35579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck } 35679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 357acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 358acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 359d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float getPivotY() const { 360d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mPivotY; 361d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 362acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 36349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik bool isPivotExplicitlySet() const { 36449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik return mPrimitiveFields.mPivotExplicitlySet; 36549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik } 36649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik 36779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setCameraDistance(float distance) { 36849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik if (distance != getCameraDistance()) { 369f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 37049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik mComputedFields.mTransformCamera.setCameraLocation(0, 0, distance); 37179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 372acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 37379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 374acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 375acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 376acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getCameraDistance() const { 37749e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik // TODO: update getCameraLocationZ() to be const 37849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik return const_cast<Sk3DView*>(&mComputedFields.mTransformCamera)->getCameraLocationZ(); 379acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 380acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 38179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setLeft(int left) { 38279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck if (RP_SET(mPrimitiveFields.mLeft, left)) { 383d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft; 384f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck if (!mPrimitiveFields.mPivotExplicitlySet) { 385f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 386acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 38779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 388acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 38979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 390acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 391acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 392acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getLeft() const { 393d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mLeft; 394acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 395acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 39679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setTop(int top) { 39779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck if (RP_SET(mPrimitiveFields.mTop, top)) { 398d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop; 399f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck if (!mPrimitiveFields.mPivotExplicitlySet) { 400f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 401acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 40279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 403acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 40479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 405acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 406acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 407acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getTop() const { 408d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mTop; 409acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 410acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 41179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setRight(int right) { 41279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck if (RP_SET(mPrimitiveFields.mRight, right)) { 413d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft; 414f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck if (!mPrimitiveFields.mPivotExplicitlySet) { 415f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 416acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 41779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 418acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 41979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 420acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 421acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 422acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getRight() const { 423d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mRight; 424acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 425acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 42679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setBottom(int bottom) { 42779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck if (RP_SET(mPrimitiveFields.mBottom, bottom)) { 428d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop; 429f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck if (!mPrimitiveFields.mPivotExplicitlySet) { 430f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 431acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 43279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 433acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 43479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 435acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 436acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 437acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getBottom() const { 438d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mBottom; 439acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 440acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 44179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setLeftTop(int left, int top) { 44279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool leftResult = setLeft(left); 44379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool topResult = setTop(top); 44479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return leftResult || topResult; 445acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 446acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 44779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setLeftTopRightBottom(int left, int top, int right, int bottom) { 448cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik if (left != mPrimitiveFields.mLeft || top != mPrimitiveFields.mTop 449cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik || right != mPrimitiveFields.mRight || bottom != mPrimitiveFields.mBottom) { 450d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mLeft = left; 451d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mTop = top; 452d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mRight = right; 453d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mBottom = bottom; 454d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft; 455d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop; 456f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck if (!mPrimitiveFields.mPivotExplicitlySet) { 457f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 458acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 45979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 460acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 46179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 462acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 463acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 464a753f4c6cb8558795e673df1896532cd148781e2Chris Craik bool offsetLeftRight(int offset) { 465acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck if (offset != 0) { 466d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mLeft += offset; 467d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mRight += offset; 46879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 469acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 47079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 471acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 472acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 473a753f4c6cb8558795e673df1896532cd148781e2Chris Craik bool offsetTopBottom(int offset) { 474acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck if (offset != 0) { 475d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mTop += offset; 476d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mBottom += offset; 47779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 478acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 47979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 480acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 481acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 482b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik int getWidth() const { 483d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mWidth; 484acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 485acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 486b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik int getHeight() const { 487d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mHeight; 488d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 489d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 490d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck const SkMatrix* getAnimationMatrix() const { 491d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mAnimationMatrix; 492d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 493d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 494f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck bool hasTransformMatrix() const { 495f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck return getTransformMatrix() && !getTransformMatrix()->isIdentity(); 496f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck } 497f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck 498f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck // May only call this if hasTransformMatrix() is true 499f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck bool isTransformTranslateOnly() const { 500f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck return getTransformMatrix()->getType() == SkMatrix::kTranslate_Mask; 501d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 502d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 50349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik const SkMatrix* getTransformMatrix() const { 504f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck LOG_ALWAYS_FATAL_IF(mPrimitiveFields.mMatrixOrPivotDirty, "Cannot get a dirty matrix!"); 505d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mComputedFields.mTransformMatrix; 506d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 507d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 508a753f4c6cb8558795e673df1896532cd148781e2Chris Craik int getClippingFlags() const { 509a753f4c6cb8558795e673df1896532cd148781e2Chris Craik return mPrimitiveFields.mClippingFlags; 510a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } 511a753f4c6cb8558795e673df1896532cd148781e2Chris Craik 512d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool getClipToBounds() const { 513a753f4c6cb8558795e673df1896532cd148781e2Chris Craik return mPrimitiveFields.mClippingFlags & CLIP_TO_BOUNDS; 514a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } 515a753f4c6cb8558795e673df1896532cd148781e2Chris Craik 516a753f4c6cb8558795e673df1896532cd148781e2Chris Craik void getClippingRectForFlags(uint32_t flags, Rect* outRect) const { 517a753f4c6cb8558795e673df1896532cd148781e2Chris Craik if (flags & CLIP_TO_BOUNDS) { 518a753f4c6cb8558795e673df1896532cd148781e2Chris Craik outRect->set(0, 0, getWidth(), getHeight()); 519a753f4c6cb8558795e673df1896532cd148781e2Chris Craik if (flags & CLIP_TO_CLIP_BOUNDS) { 520a753f4c6cb8558795e673df1896532cd148781e2Chris Craik outRect->intersect(mPrimitiveFields.mClipBounds); 521a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } 522a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } else { 523a753f4c6cb8558795e673df1896532cd148781e2Chris Craik outRect->set(mPrimitiveFields.mClipBounds); 524a753f4c6cb8558795e673df1896532cd148781e2Chris Craik } 525d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 526d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 527d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool getHasOverlappingRendering() const { 528d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mHasOverlappingRendering; 529d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 530d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 531d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck const Outline& getOutline() const { 532d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mOutline; 533d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 534d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 5358c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik const RevealClip& getRevealClip() const { 5368c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik return mPrimitiveFields.mRevealClip; 5378c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik } 5388c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik 539d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool getProjectBackwards() const { 540d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mProjectBackwards; 541d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 542d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 543d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck void debugOutputProperties(const int level) const; 544d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 54525fbb3fa1138675379102a44405852555cefccbdJohn Reck void updateMatrix(); 546d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 547d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck Outline& mutableOutline() { 548d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mOutline; 549b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik } 550b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik 5518c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik RevealClip& mutableRevealClip() { 5528c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik return mPrimitiveFields.mRevealClip; 5538c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik } 5548c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik 55525fbb3fa1138675379102a44405852555cefccbdJohn Reck const LayerProperties& layerProperties() const { 55625fbb3fa1138675379102a44405852555cefccbdJohn Reck return mLayerProperties; 55725fbb3fa1138675379102a44405852555cefccbdJohn Reck } 55825fbb3fa1138675379102a44405852555cefccbdJohn Reck 55925fbb3fa1138675379102a44405852555cefccbdJohn Reck LayerProperties& mutateLayerProperties() { 56025fbb3fa1138675379102a44405852555cefccbdJohn Reck return mLayerProperties; 56125fbb3fa1138675379102a44405852555cefccbdJohn Reck } 56225fbb3fa1138675379102a44405852555cefccbdJohn Reck 563293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck // Returns true if damage calculations should be clipped to bounds 564293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck // TODO: Figure out something better for getZ(), as children should still be 565293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck // clipped to this RP's bounds. But as we will damage -INT_MAX to INT_MAX 566293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck // for this RP's getZ() anyway, this can be optimized when we have a 567293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck // Z damage estimate instead of INT_MAX 568293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck bool getClipDamageToBounds() const { 569293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck return getClipToBounds() && (getZ() <= 0 || getOutline().isEmpty()); 570293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck } 571293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck 5725c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik bool hasShadow() const { 5739fa364dc72613f4301b0783f0547fe6b01abac39Chris Craik return getZ() >= 0.0f 5749fa364dc72613f4301b0783f0547fe6b01abac39Chris Craik && getOutline().getPath() != NULL 5759fa364dc72613f4301b0783f0547fe6b01abac39Chris Craik && getOutline().getAlpha() != 0.0f; 5765c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik } 5775c75c52e048a01c23b18f4e31ae624b5fe43e23cChris Craik 578acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckprivate: 579acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck // Rendering properties 580d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck struct PrimitiveFields { 581d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck PrimitiveFields(); 582d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 583d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck Outline mOutline; 5848c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik RevealClip mRevealClip; 585a753f4c6cb8558795e673df1896532cd148781e2Chris Craik int mClippingFlags; 586d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool mProjectBackwards; 587d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool mProjectionReceiver; 588d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float mAlpha; 589d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool mHasOverlappingRendering; 590cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik float mElevation; 591d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float mTranslationX, mTranslationY, mTranslationZ; 592d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float mRotation, mRotationX, mRotationY; 593d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float mScaleX, mScaleY; 594d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float mPivotX, mPivotY; 595d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck int mLeft, mTop, mRight, mBottom; 596d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck int mWidth, mHeight; 597d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool mPivotExplicitlySet; 598f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck bool mMatrixOrPivotDirty; 599a753f4c6cb8558795e673df1896532cd148781e2Chris Craik Rect mClipBounds; 600d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } mPrimitiveFields; 601d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 602acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck SkMatrix* mStaticMatrix; 603acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck SkMatrix* mAnimationMatrix; 60425fbb3fa1138675379102a44405852555cefccbdJohn Reck LayerProperties mLayerProperties; 605acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 606d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck /** 607d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck * These fields are all generated from other properties and are not set directly. 608d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck */ 609d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck struct ComputedFields { 610d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck ComputedFields(); 611d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck ~ComputedFields(); 612d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 613d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck /** 614d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck * Stores the total transformation of the DisplayList based upon its scalar 615d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck * translate/rotate/scale properties. 616d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck * 61749e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik * In the common translation-only case, the matrix isn't necessarily allocated, 61849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik * and the mTranslation properties are used directly. 619d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck */ 62049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik SkMatrix* mTransformMatrix; 62149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik 62249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik Sk3DView mTransformCamera; 623d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } mComputedFields; 624acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck}; 625acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 626acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck} /* namespace uirenderer */ 627acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck} /* namespace android */ 628acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 629b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#endif /* RENDERNODEPROPERTIES_H */ 630