RenderProperties.h revision 25fbb3fa1138675379102a44405852555cefccbd
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> 24acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 25acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#include <SkCamera.h> 26acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#include <SkMatrix.h> 278c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik#include <SkRegion.h> 28b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik 29e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include "Animator.h" 30b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#include "Rect.h" 318c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik#include "RevealClip.h" 32b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#include "Outline.h" 33acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 34acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass SkBitmap; 3525fbb3fa1138675379102a44405852555cefccbdJohn Reckclass SkColorFilter; 36acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass SkPaint; 37acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 38acb6f07623b7df3d4179f70ae03ade574616ffa6John Recknamespace android { 39acb6f07623b7df3d4179f70ae03ade574616ffa6John Recknamespace uirenderer { 40acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 41acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass Matrix4; 42acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass RenderNode; 4325fbb3fa1138675379102a44405852555cefccbdJohn Reckclass RenderProperties; 44acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 4579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck// The __VA_ARGS__ will be executed if a & b are not equal 4679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck#define RP_SET(a, b, ...) (a != b ? (a = b, ##__VA_ARGS__, true) : false) 4779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck#define RP_SET_AND_DIRTY(a, b) RP_SET(a, b, mPrimitiveFields.mMatrixOrPivotDirty = true) 4879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck 4925fbb3fa1138675379102a44405852555cefccbdJohn Reck// Keep in sync with View.java:LAYER_TYPE_* 5025fbb3fa1138675379102a44405852555cefccbdJohn Reckenum LayerType { 5125fbb3fa1138675379102a44405852555cefccbdJohn Reck kLayerTypeNone = 0, 5225fbb3fa1138675379102a44405852555cefccbdJohn Reck // Although we cannot build the software layer directly (must be done at 5325fbb3fa1138675379102a44405852555cefccbdJohn Reck // record time), this information is used when applying alpha. 5425fbb3fa1138675379102a44405852555cefccbdJohn Reck kLayerTypeSoftware = 1, 5525fbb3fa1138675379102a44405852555cefccbdJohn Reck kLayerTypeRenderLayer = 2, 5625fbb3fa1138675379102a44405852555cefccbdJohn Reck // TODO: LayerTypeSurfaceTexture? Maybe? 5725fbb3fa1138675379102a44405852555cefccbdJohn Reck}; 5825fbb3fa1138675379102a44405852555cefccbdJohn Reck 5925fbb3fa1138675379102a44405852555cefccbdJohn Reckclass ANDROID_API LayerProperties { 6025fbb3fa1138675379102a44405852555cefccbdJohn Reckpublic: 6125fbb3fa1138675379102a44405852555cefccbdJohn Reck bool setType(LayerType type) { 6225fbb3fa1138675379102a44405852555cefccbdJohn Reck if (RP_SET(mType, type)) { 6325fbb3fa1138675379102a44405852555cefccbdJohn Reck reset(); 6425fbb3fa1138675379102a44405852555cefccbdJohn Reck return true; 6525fbb3fa1138675379102a44405852555cefccbdJohn Reck } 6625fbb3fa1138675379102a44405852555cefccbdJohn Reck return false; 6725fbb3fa1138675379102a44405852555cefccbdJohn Reck } 6825fbb3fa1138675379102a44405852555cefccbdJohn Reck 6925fbb3fa1138675379102a44405852555cefccbdJohn Reck LayerType type() const { 7025fbb3fa1138675379102a44405852555cefccbdJohn Reck return mType; 7125fbb3fa1138675379102a44405852555cefccbdJohn Reck } 7225fbb3fa1138675379102a44405852555cefccbdJohn Reck 7325fbb3fa1138675379102a44405852555cefccbdJohn Reck bool setOpaque(bool opaque) { 7425fbb3fa1138675379102a44405852555cefccbdJohn Reck return RP_SET(mOpaque, opaque); 7525fbb3fa1138675379102a44405852555cefccbdJohn Reck } 7625fbb3fa1138675379102a44405852555cefccbdJohn Reck 7725fbb3fa1138675379102a44405852555cefccbdJohn Reck bool opaque() const { 7825fbb3fa1138675379102a44405852555cefccbdJohn Reck return mOpaque; 7925fbb3fa1138675379102a44405852555cefccbdJohn Reck } 8025fbb3fa1138675379102a44405852555cefccbdJohn Reck 8125fbb3fa1138675379102a44405852555cefccbdJohn Reck bool setAlpha(uint8_t alpha) { 8225fbb3fa1138675379102a44405852555cefccbdJohn Reck return RP_SET(mAlpha, alpha); 8325fbb3fa1138675379102a44405852555cefccbdJohn Reck } 8425fbb3fa1138675379102a44405852555cefccbdJohn Reck 8525fbb3fa1138675379102a44405852555cefccbdJohn Reck uint8_t alpha() const { 8625fbb3fa1138675379102a44405852555cefccbdJohn Reck return mAlpha; 8725fbb3fa1138675379102a44405852555cefccbdJohn Reck } 8825fbb3fa1138675379102a44405852555cefccbdJohn Reck 8925fbb3fa1138675379102a44405852555cefccbdJohn Reck bool setXferMode(SkXfermode::Mode mode) { 9025fbb3fa1138675379102a44405852555cefccbdJohn Reck return RP_SET(mMode, mode); 9125fbb3fa1138675379102a44405852555cefccbdJohn Reck } 9225fbb3fa1138675379102a44405852555cefccbdJohn Reck 9325fbb3fa1138675379102a44405852555cefccbdJohn Reck SkXfermode::Mode xferMode() const { 9425fbb3fa1138675379102a44405852555cefccbdJohn Reck return mMode; 9525fbb3fa1138675379102a44405852555cefccbdJohn Reck } 9625fbb3fa1138675379102a44405852555cefccbdJohn Reck 9725fbb3fa1138675379102a44405852555cefccbdJohn Reck bool setColorFilter(SkColorFilter* filter); 9825fbb3fa1138675379102a44405852555cefccbdJohn Reck 9925fbb3fa1138675379102a44405852555cefccbdJohn Reck SkColorFilter* colorFilter() const { 10025fbb3fa1138675379102a44405852555cefccbdJohn Reck return mColorFilter; 10125fbb3fa1138675379102a44405852555cefccbdJohn Reck } 10225fbb3fa1138675379102a44405852555cefccbdJohn Reck 10325fbb3fa1138675379102a44405852555cefccbdJohn Reck // Sets alpha, xfermode, and colorfilter from an SkPaint 10425fbb3fa1138675379102a44405852555cefccbdJohn Reck // paint may be NULL, in which case defaults will be set 10525fbb3fa1138675379102a44405852555cefccbdJohn Reck bool setFromPaint(const SkPaint* paint); 10625fbb3fa1138675379102a44405852555cefccbdJohn Reck 10725fbb3fa1138675379102a44405852555cefccbdJohn Reck bool needsBlending() const { 10825fbb3fa1138675379102a44405852555cefccbdJohn Reck return !opaque() || alpha() < 255; 10925fbb3fa1138675379102a44405852555cefccbdJohn Reck } 11025fbb3fa1138675379102a44405852555cefccbdJohn Reck 11125fbb3fa1138675379102a44405852555cefccbdJohn Reck LayerProperties& operator=(const LayerProperties& other); 11225fbb3fa1138675379102a44405852555cefccbdJohn Reck 11325fbb3fa1138675379102a44405852555cefccbdJohn Reckprivate: 11425fbb3fa1138675379102a44405852555cefccbdJohn Reck LayerProperties(); 11525fbb3fa1138675379102a44405852555cefccbdJohn Reck ~LayerProperties(); 11625fbb3fa1138675379102a44405852555cefccbdJohn Reck void reset(); 11725fbb3fa1138675379102a44405852555cefccbdJohn Reck 11825fbb3fa1138675379102a44405852555cefccbdJohn Reck friend class RenderProperties; 11925fbb3fa1138675379102a44405852555cefccbdJohn Reck 12025fbb3fa1138675379102a44405852555cefccbdJohn Reck LayerType mType; 12125fbb3fa1138675379102a44405852555cefccbdJohn Reck // Whether or not that Layer's content is opaque, doesn't include alpha 12225fbb3fa1138675379102a44405852555cefccbdJohn Reck bool mOpaque; 12325fbb3fa1138675379102a44405852555cefccbdJohn Reck uint8_t mAlpha; 12425fbb3fa1138675379102a44405852555cefccbdJohn Reck SkXfermode::Mode mMode; 12525fbb3fa1138675379102a44405852555cefccbdJohn Reck SkColorFilter* mColorFilter; 12625fbb3fa1138675379102a44405852555cefccbdJohn Reck}; 12725fbb3fa1138675379102a44405852555cefccbdJohn Reck 128acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck/* 129acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * Data structure that holds the properties for a RenderNode 130acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck */ 13125fbb3fa1138675379102a44405852555cefccbdJohn Reckclass ANDROID_API RenderProperties { 132acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckpublic: 133acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck RenderProperties(); 134acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck virtual ~RenderProperties(); 135acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 136d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck RenderProperties& operator=(const RenderProperties& other); 137d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 13879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setClipToBounds(bool clipToBounds) { 13979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET(mPrimitiveFields.mClipToBounds, clipToBounds); 140acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 141acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 14279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setProjectBackwards(bool shouldProject) { 14379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET(mPrimitiveFields.mProjectBackwards, shouldProject); 144acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 145acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 14679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setProjectionReceiver(bool shouldRecieve) { 14779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET(mPrimitiveFields.mProjectionReceiver, shouldRecieve); 148acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 149acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 150d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool isProjectionReceiver() const { 151d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mProjectionReceiver; 152acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 153acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 15479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setStaticMatrix(const SkMatrix* matrix) { 155acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck delete mStaticMatrix; 156d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck if (matrix) { 157d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mStaticMatrix = new SkMatrix(*matrix); 158d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } else { 159d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mStaticMatrix = NULL; 160d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 16179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 162acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 163acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 164acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck // Can return NULL 165d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck const SkMatrix* getStaticMatrix() const { 166acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck return mStaticMatrix; 167acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 168acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 16979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setAnimationMatrix(const SkMatrix* matrix) { 170acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck delete mAnimationMatrix; 171acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck if (matrix) { 172acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck mAnimationMatrix = new SkMatrix(*matrix); 173acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } else { 174acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck mAnimationMatrix = NULL; 175acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 17679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 177acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 178acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 17979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setAlpha(float alpha) { 180acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck alpha = fminf(1.0f, fmaxf(0.0f, alpha)); 18179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET(mPrimitiveFields.mAlpha, alpha); 182acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 183acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 184acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getAlpha() const { 185d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mAlpha; 186acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 187acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 18879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setHasOverlappingRendering(bool hasOverlappingRendering) { 18979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET(mPrimitiveFields.mHasOverlappingRendering, hasOverlappingRendering); 190acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 191acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 192acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck bool hasOverlappingRendering() const { 193d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mHasOverlappingRendering; 194acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 195acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 19679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setElevation(float elevation) { 19779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET(mPrimitiveFields.mElevation, elevation); 19879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck // Don't dirty matrix/pivot, since they don't respect Z 199cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik } 200cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik 201cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik float getElevation() const { 202cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik return mPrimitiveFields.mElevation; 203cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik } 204cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik 20579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setTranslationX(float translationX) { 20679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mTranslationX, translationX); 207acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 208acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 209acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getTranslationX() const { 210d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mTranslationX; 211acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 212acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 21379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setTranslationY(float translationY) { 21479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mTranslationY, translationY); 215acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 216acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 217acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getTranslationY() const { 218d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mTranslationY; 219acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 220acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 22179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setTranslationZ(float translationZ) { 22279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET(mPrimitiveFields.mTranslationZ, translationZ); 22379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck // mMatrixOrPivotDirty not set, since matrix doesn't respect Z 224acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 225acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 226acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getTranslationZ() const { 227d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mTranslationZ; 228acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 229acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 230e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // Animation helper 23179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setX(float value) { 23279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return setTranslationX(value - getLeft()); 233e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 234e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 235e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // Animation helper 236e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck float getX() const { 237e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return getLeft() + getTranslationX(); 238e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 239e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 240e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // Animation helper 24179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setY(float value) { 24279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return setTranslationY(value - getTop()); 243e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 244e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 245e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // Animation helper 246e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck float getY() const { 247e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return getTop() + getTranslationY(); 248e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 249e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 250e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // Animation helper 25179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setZ(float value) { 25279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return setTranslationZ(value - getElevation()); 253e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 254e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 255cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik float getZ() const { 256cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik return getElevation() + getTranslationZ(); 257cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik } 258cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik 25979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setRotation(float rotation) { 26079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mRotation, rotation); 261acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 262acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 263acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getRotation() const { 264d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mRotation; 265acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 266acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 26779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setRotationX(float rotationX) { 26879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mRotationX, rotationX); 269acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 270acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 271acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getRotationX() const { 272d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mRotationX; 273acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 274acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 27579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setRotationY(float rotationY) { 27679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mRotationY, rotationY); 277acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 278acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 279acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getRotationY() const { 280d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mRotationY; 281acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 282acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 28379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setScaleX(float scaleX) { 28479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mScaleX, scaleX); 285acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 286acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 287acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getScaleX() const { 288d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mScaleX; 289acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 290acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 29179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setScaleY(float scaleY) { 29279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return RP_SET_AND_DIRTY(mPrimitiveFields.mScaleY, scaleY); 293acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 294acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 295acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getScaleY() const { 296d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mScaleY; 297acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 298acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 29979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setPivotX(float pivotX) { 30079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck if (RP_SET(mPrimitiveFields.mPivotX, pivotX) 30179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck || !mPrimitiveFields.mPivotExplicitlySet) { 30279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 30379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck mPrimitiveFields.mPivotExplicitlySet = true; 30479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 30579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck } 30679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 307acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 308acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 309d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck /* Note that getPivotX and getPivotY are adjusted by updateMatrix(), 31079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck * so the value returned may be stale if the RenderProperties has been 31179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck * modified since the last call to updateMatrix() 312d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck */ 313d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float getPivotX() const { 314d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mPivotX; 315d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 316acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 31779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setPivotY(float pivotY) { 31879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck if (RP_SET(mPrimitiveFields.mPivotY, pivotY) 31979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck || !mPrimitiveFields.mPivotExplicitlySet) { 32079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 32179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck mPrimitiveFields.mPivotExplicitlySet = true; 32279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 32379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck } 32479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 325acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 326acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 327d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float getPivotY() const { 328d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mPivotY; 329d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 330acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 33149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik bool isPivotExplicitlySet() const { 33249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik return mPrimitiveFields.mPivotExplicitlySet; 33349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik } 33449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik 33579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setCameraDistance(float distance) { 33649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik if (distance != getCameraDistance()) { 337f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 33849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik mComputedFields.mTransformCamera.setCameraLocation(0, 0, distance); 33979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 340acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 34179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 342acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 343acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 344acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getCameraDistance() const { 34549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik // TODO: update getCameraLocationZ() to be const 34649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik return const_cast<Sk3DView*>(&mComputedFields.mTransformCamera)->getCameraLocationZ(); 347acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 348acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 34979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setLeft(int left) { 35079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck if (RP_SET(mPrimitiveFields.mLeft, left)) { 351d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft; 352f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck if (!mPrimitiveFields.mPivotExplicitlySet) { 353f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 354acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 35579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 356acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 35779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 358acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 359acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 360acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getLeft() const { 361d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mLeft; 362acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 363acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 36479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setTop(int top) { 36579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck if (RP_SET(mPrimitiveFields.mTop, top)) { 366d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop; 367f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck if (!mPrimitiveFields.mPivotExplicitlySet) { 368f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 369acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 37079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 371acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 37279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 373acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 374acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 375acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getTop() const { 376d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mTop; 377acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 378acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 37979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setRight(int right) { 38079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck if (RP_SET(mPrimitiveFields.mRight, right)) { 381d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft; 382f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck if (!mPrimitiveFields.mPivotExplicitlySet) { 383f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 384acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 38579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 386acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 38779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 388acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 389acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 390acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getRight() const { 391d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mRight; 392acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 393acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 39479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setBottom(int bottom) { 39579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck if (RP_SET(mPrimitiveFields.mBottom, bottom)) { 396d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop; 397f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck if (!mPrimitiveFields.mPivotExplicitlySet) { 398f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 399acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 40079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 401acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 40279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 403acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 404acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 405acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck float getBottom() const { 406d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mBottom; 407acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 408acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 40979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setLeftTop(int left, int top) { 41079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool leftResult = setLeft(left); 41179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool topResult = setTop(top); 41279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return leftResult || topResult; 413acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 414acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 41579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool setLeftTopRightBottom(int left, int top, int right, int bottom) { 416cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik if (left != mPrimitiveFields.mLeft || top != mPrimitiveFields.mTop 417cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik || right != mPrimitiveFields.mRight || bottom != mPrimitiveFields.mBottom) { 418d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mLeft = left; 419d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mTop = top; 420d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mRight = right; 421d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mBottom = bottom; 422d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft; 423d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop; 424f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck if (!mPrimitiveFields.mPivotExplicitlySet) { 425f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck mPrimitiveFields.mMatrixOrPivotDirty = true; 426acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 42779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 428acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 42979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 430acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 431acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 43279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool offsetLeftRight(float offset) { 433acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck if (offset != 0) { 434d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mLeft += offset; 435d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mRight += offset; 43679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 437acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 43879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 439acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 440acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 44179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck bool offsetTopBottom(float offset) { 442acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck if (offset != 0) { 443d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mTop += offset; 444d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck mPrimitiveFields.mBottom += offset; 44579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return true; 446acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 44779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck return false; 448acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 449acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 450b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik int getWidth() const { 451d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mWidth; 452acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck } 453acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 454b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik int getHeight() const { 455d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mHeight; 456d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 457d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 458d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck const SkMatrix* getAnimationMatrix() const { 459d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mAnimationMatrix; 460d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 461d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 462f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck bool hasTransformMatrix() const { 463f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck return getTransformMatrix() && !getTransformMatrix()->isIdentity(); 464f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck } 465f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck 466f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck // May only call this if hasTransformMatrix() is true 467f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck bool isTransformTranslateOnly() const { 468f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck return getTransformMatrix()->getType() == SkMatrix::kTranslate_Mask; 469d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 470d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 47149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik const SkMatrix* getTransformMatrix() const { 472f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck LOG_ALWAYS_FATAL_IF(mPrimitiveFields.mMatrixOrPivotDirty, "Cannot get a dirty matrix!"); 473d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mComputedFields.mTransformMatrix; 474d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 475d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 476d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool getClipToBounds() const { 477d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mClipToBounds; 478d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 479d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 480d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool getHasOverlappingRendering() const { 481d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mHasOverlappingRendering; 482d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 483d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 484d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck const Outline& getOutline() const { 485d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mOutline; 486d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 487d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 4888c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik const RevealClip& getRevealClip() const { 4898c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik return mPrimitiveFields.mRevealClip; 4908c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik } 4918c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik 492d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool getProjectBackwards() const { 493d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mProjectBackwards; 494d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } 495d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 496d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck void debugOutputProperties(const int level) const; 497d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 49825fbb3fa1138675379102a44405852555cefccbdJohn Reck void updateMatrix(); 499d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 5008c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik bool hasClippingPath() const { 5012bcad176757386d906157bb898167fbcebe9f55eChris Craik return mPrimitiveFields.mRevealClip.willClip(); 5028c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik } 5038c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik 5048c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik const SkPath* getClippingPath() const { 5052bcad176757386d906157bb898167fbcebe9f55eChris Craik return mPrimitiveFields.mRevealClip.getPath(); 5068c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik } 5078c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik 5088c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik SkRegion::Op getClippingPathOp() const { 5092bcad176757386d906157bb898167fbcebe9f55eChris Craik return mPrimitiveFields.mRevealClip.isInverseClip() 5102bcad176757386d906157bb898167fbcebe9f55eChris Craik ? SkRegion::kDifference_Op : SkRegion::kIntersect_Op; 5118c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik } 5128c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik 513d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck Outline& mutableOutline() { 514d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck return mPrimitiveFields.mOutline; 515b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik } 516b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik 5178c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik RevealClip& mutableRevealClip() { 5188c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik return mPrimitiveFields.mRevealClip; 5198c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik } 5208c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik 52125fbb3fa1138675379102a44405852555cefccbdJohn Reck const LayerProperties& layerProperties() const { 52225fbb3fa1138675379102a44405852555cefccbdJohn Reck return mLayerProperties; 52325fbb3fa1138675379102a44405852555cefccbdJohn Reck } 52425fbb3fa1138675379102a44405852555cefccbdJohn Reck 52525fbb3fa1138675379102a44405852555cefccbdJohn Reck LayerProperties& mutateLayerProperties() { 52625fbb3fa1138675379102a44405852555cefccbdJohn Reck return mLayerProperties; 52725fbb3fa1138675379102a44405852555cefccbdJohn Reck } 52825fbb3fa1138675379102a44405852555cefccbdJohn Reck 529acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckprivate: 530acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 531acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck // Rendering properties 532d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck struct PrimitiveFields { 533d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck PrimitiveFields(); 534d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 535d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck Outline mOutline; 5368c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik RevealClip mRevealClip; 537d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool mClipToBounds; 538d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool mProjectBackwards; 539d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool mProjectionReceiver; 540d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float mAlpha; 541d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool mHasOverlappingRendering; 542cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik float mElevation; 543d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float mTranslationX, mTranslationY, mTranslationZ; 544d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float mRotation, mRotationX, mRotationY; 545d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float mScaleX, mScaleY; 546d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck float mPivotX, mPivotY; 547d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck int mLeft, mTop, mRight, mBottom; 548d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck int mWidth, mHeight; 549d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck bool mPivotExplicitlySet; 550f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck bool mMatrixOrPivotDirty; 551d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } mPrimitiveFields; 552d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 553acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck SkMatrix* mStaticMatrix; 554acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck SkMatrix* mAnimationMatrix; 55525fbb3fa1138675379102a44405852555cefccbdJohn Reck LayerProperties mLayerProperties; 556acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 557d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck /** 558d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck * These fields are all generated from other properties and are not set directly. 559d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck */ 560d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck struct ComputedFields { 561d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck ComputedFields(); 562d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck ~ComputedFields(); 563d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck 564d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck /** 565d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck * Stores the total transformation of the DisplayList based upon its scalar 566d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck * translate/rotate/scale properties. 567d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck * 56849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik * In the common translation-only case, the matrix isn't necessarily allocated, 56949e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik * and the mTranslation properties are used directly. 570d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck */ 57149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik SkMatrix* mTransformMatrix; 57249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik 57349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik Sk3DView mTransformCamera; 574d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck } mComputedFields; 575acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck}; 576acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 577acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck} /* namespace uirenderer */ 578acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck} /* namespace android */ 579acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck 580b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#endif /* RENDERNODEPROPERTIES_H */ 581