RenderProperties.h revision a753f4c6cb8558795e673df1896532cd148781e2
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) {
212acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        alpha = fminf(1.0f, fmaxf(0.0f, 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) {
316fe02b4b344c37200486d8afc972560fb550cb17eChris Craik        LOG_ALWAYS_FATAL_IF(scaleX > 1000000, "invalid scaleX %e", 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) {
325fe02b4b344c37200486d8afc972560fb550cb17eChris Craik        LOG_ALWAYS_FATAL_IF(scaleY > 1000000, "invalid scaleY %e", scaleY);
32679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return RP_SET_AND_DIRTY(mPrimitiveFields.mScaleY, scaleY);
327acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
328acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
329acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getScaleY() const {
330d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mScaleY;
331acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
332acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
33379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setPivotX(float pivotX) {
33479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        if (RP_SET(mPrimitiveFields.mPivotX, pivotX)
33579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck                || !mPrimitiveFields.mPivotExplicitlySet) {
33679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
33779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            mPrimitiveFields.mPivotExplicitlySet = true;
33879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return true;
33979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        }
34079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return false;
341acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
342acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
343d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    /* Note that getPivotX and getPivotY are adjusted by updateMatrix(),
34479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck     * so the value returned may be stale if the RenderProperties has been
34579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck     * modified since the last call to updateMatrix()
346d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     */
347d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    float getPivotX() const {
348d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mPivotX;
349d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
350acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
35179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setPivotY(float pivotY) {
35279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        if (RP_SET(mPrimitiveFields.mPivotY, pivotY)
35379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck                || !mPrimitiveFields.mPivotExplicitlySet) {
35479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
35579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            mPrimitiveFields.mPivotExplicitlySet = true;
35679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return true;
35779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        }
35879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return false;
359acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
360acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
361d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    float getPivotY() const {
362d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mPivotY;
363d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
364acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
36549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    bool isPivotExplicitlySet() const {
36649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        return mPrimitiveFields.mPivotExplicitlySet;
36749e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    }
36849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
36979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setCameraDistance(float distance) {
37049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        if (distance != getCameraDistance()) {
371f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
37249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik            mComputedFields.mTransformCamera.setCameraLocation(0, 0, distance);
37379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return true;
374acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
37579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return false;
376acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
377acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
378acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getCameraDistance() const {
37949e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        // TODO: update getCameraLocationZ() to be const
38049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        return const_cast<Sk3DView*>(&mComputedFields.mTransformCamera)->getCameraLocationZ();
381acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
382acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
38379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setLeft(int left) {
38479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        if (RP_SET(mPrimitiveFields.mLeft, left)) {
385d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft;
386f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
387f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
388acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
38979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return true;
390acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
39179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return false;
392acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
393acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
394acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getLeft() const {
395d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mLeft;
396acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
397acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
39879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setTop(int top) {
39979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        if (RP_SET(mPrimitiveFields.mTop, top)) {
400d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop;
401f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
402f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
403acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
40479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return true;
405acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
40679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return false;
407acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
408acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
409acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTop() const {
410d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mTop;
411acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
412acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
41379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setRight(int right) {
41479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        if (RP_SET(mPrimitiveFields.mRight, right)) {
415d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft;
416f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
417f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
418acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
41979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return true;
420acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
42179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return false;
422acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
423acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
424acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRight() const {
425d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mRight;
426acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
427acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
42879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setBottom(int bottom) {
42979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        if (RP_SET(mPrimitiveFields.mBottom, bottom)) {
430d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop;
431f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
432f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
433acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
43479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return true;
435acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
43679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return false;
437acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
438acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
439acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getBottom() const {
440d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mBottom;
441acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
442acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
44379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setLeftTop(int left, int top) {
44479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        bool leftResult = setLeft(left);
44579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        bool topResult = setTop(top);
44679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return leftResult || topResult;
447acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
448acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
44979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setLeftTopRightBottom(int left, int top, int right, int bottom) {
450cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik        if (left != mPrimitiveFields.mLeft || top != mPrimitiveFields.mTop
451cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik                || right != mPrimitiveFields.mRight || bottom != mPrimitiveFields.mBottom) {
452d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mLeft = left;
453d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTop = top;
454d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRight = right;
455d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mBottom = bottom;
456d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft;
457d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop;
458f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
459f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
460acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
46179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return true;
462acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
46379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return false;
464acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
465acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
466a753f4c6cb8558795e673df1896532cd148781e2Chris Craik    bool offsetLeftRight(int offset) {
467acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (offset != 0) {
468d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mLeft += offset;
469d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRight += offset;
47079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return true;
471acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
47279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return false;
473acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
474acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
475a753f4c6cb8558795e673df1896532cd148781e2Chris Craik    bool offsetTopBottom(int offset) {
476acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (offset != 0) {
477d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTop += offset;
478d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mBottom += offset;
47979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return true;
480acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
48179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return false;
482acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
483acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
484b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    int getWidth() const {
485d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mWidth;
486acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
487acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
488b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    int getHeight() const {
489d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mHeight;
490d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
491d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
492d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    const SkMatrix* getAnimationMatrix() const {
493d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mAnimationMatrix;
494d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
495d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
496f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck    bool hasTransformMatrix() const {
497f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck        return getTransformMatrix() && !getTransformMatrix()->isIdentity();
498f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck    }
499f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck
500f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck    // May only call this if hasTransformMatrix() is true
501f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck    bool isTransformTranslateOnly() const {
502f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck        return getTransformMatrix()->getType() == SkMatrix::kTranslate_Mask;
503d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
504d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
50549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    const SkMatrix* getTransformMatrix() const {
506f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck        LOG_ALWAYS_FATAL_IF(mPrimitiveFields.mMatrixOrPivotDirty, "Cannot get a dirty matrix!");
507d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mComputedFields.mTransformMatrix;
508d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
509d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
510a753f4c6cb8558795e673df1896532cd148781e2Chris Craik    int getClippingFlags() const {
511a753f4c6cb8558795e673df1896532cd148781e2Chris Craik        return mPrimitiveFields.mClippingFlags;
512a753f4c6cb8558795e673df1896532cd148781e2Chris Craik    }
513a753f4c6cb8558795e673df1896532cd148781e2Chris Craik
514d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool getClipToBounds() const {
515a753f4c6cb8558795e673df1896532cd148781e2Chris Craik        return mPrimitiveFields.mClippingFlags & CLIP_TO_BOUNDS;
516a753f4c6cb8558795e673df1896532cd148781e2Chris Craik    }
517a753f4c6cb8558795e673df1896532cd148781e2Chris Craik
518a753f4c6cb8558795e673df1896532cd148781e2Chris Craik    void getClippingRectForFlags(uint32_t flags, Rect* outRect) const {
519a753f4c6cb8558795e673df1896532cd148781e2Chris Craik        if (flags & CLIP_TO_BOUNDS) {
520a753f4c6cb8558795e673df1896532cd148781e2Chris Craik            outRect->set(0, 0, getWidth(), getHeight());
521a753f4c6cb8558795e673df1896532cd148781e2Chris Craik            if (flags & CLIP_TO_CLIP_BOUNDS) {
522a753f4c6cb8558795e673df1896532cd148781e2Chris Craik                outRect->intersect(mPrimitiveFields.mClipBounds);
523a753f4c6cb8558795e673df1896532cd148781e2Chris Craik            }
524a753f4c6cb8558795e673df1896532cd148781e2Chris Craik        } else {
525a753f4c6cb8558795e673df1896532cd148781e2Chris Craik            outRect->set(mPrimitiveFields.mClipBounds);
526a753f4c6cb8558795e673df1896532cd148781e2Chris Craik        }
527d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
528d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
529d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool getHasOverlappingRendering() const {
530d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mHasOverlappingRendering;
531d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
532d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
533d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    const Outline& getOutline() const {
534d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mOutline;
535d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
536d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
5378c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    const RevealClip& getRevealClip() const {
5388c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        return mPrimitiveFields.mRevealClip;
5398c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
5408c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
541d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool getProjectBackwards() const {
542d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mProjectBackwards;
543d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
544d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
545d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    void debugOutputProperties(const int level) const;
546d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
54725fbb3fa1138675379102a44405852555cefccbdJohn Reck    void updateMatrix();
548d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
5498c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    bool hasClippingPath() const {
5502bcad176757386d906157bb898167fbcebe9f55eChris Craik        return mPrimitiveFields.mRevealClip.willClip();
5518c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
5528c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
5538c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    const SkPath* getClippingPath() const {
5542bcad176757386d906157bb898167fbcebe9f55eChris Craik        return mPrimitiveFields.mRevealClip.getPath();
5558c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
5568c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
5578c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    SkRegion::Op getClippingPathOp() const {
5582bcad176757386d906157bb898167fbcebe9f55eChris Craik        return mPrimitiveFields.mRevealClip.isInverseClip()
5592bcad176757386d906157bb898167fbcebe9f55eChris Craik                ? SkRegion::kDifference_Op : SkRegion::kIntersect_Op;
5608c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
5618c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
562d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    Outline& mutableOutline() {
563d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mOutline;
564b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    }
565b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
5668c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    RevealClip& mutableRevealClip() {
5678c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        return mPrimitiveFields.mRevealClip;
5688c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
5698c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
57025fbb3fa1138675379102a44405852555cefccbdJohn Reck    const LayerProperties& layerProperties() const {
57125fbb3fa1138675379102a44405852555cefccbdJohn Reck        return mLayerProperties;
57225fbb3fa1138675379102a44405852555cefccbdJohn Reck    }
57325fbb3fa1138675379102a44405852555cefccbdJohn Reck
57425fbb3fa1138675379102a44405852555cefccbdJohn Reck    LayerProperties& mutateLayerProperties() {
57525fbb3fa1138675379102a44405852555cefccbdJohn Reck        return mLayerProperties;
57625fbb3fa1138675379102a44405852555cefccbdJohn Reck    }
57725fbb3fa1138675379102a44405852555cefccbdJohn Reck
578293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck    // Returns true if damage calculations should be clipped to bounds
579293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck    // TODO: Figure out something better for getZ(), as children should still be
580293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck    // clipped to this RP's bounds. But as we will damage -INT_MAX to INT_MAX
581293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck    // for this RP's getZ() anyway, this can be optimized when we have a
582293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck    // Z damage estimate instead of INT_MAX
583293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck    bool getClipDamageToBounds() const {
584293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck        return getClipToBounds() && (getZ() <= 0 || getOutline().isEmpty());
585293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck    }
586293e868bfc1b07aad2cb2ebeee5b07424852c510John Reck
587acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckprivate:
588acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    // Rendering properties
589d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    struct PrimitiveFields {
590d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        PrimitiveFields();
591d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
592d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        Outline mOutline;
5938c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        RevealClip mRevealClip;
594a753f4c6cb8558795e673df1896532cd148781e2Chris Craik        int mClippingFlags;
595d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mProjectBackwards;
596d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mProjectionReceiver;
597d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mAlpha;
598d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mHasOverlappingRendering;
599cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik        float mElevation;
600d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mTranslationX, mTranslationY, mTranslationZ;
601d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mRotation, mRotationX, mRotationY;
602d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mScaleX, mScaleY;
603d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mPivotX, mPivotY;
604d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        int mLeft, mTop, mRight, mBottom;
605d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        int mWidth, mHeight;
606d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mPivotExplicitlySet;
607f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck        bool mMatrixOrPivotDirty;
608a753f4c6cb8558795e673df1896532cd148781e2Chris Craik        Rect mClipBounds;
609d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    } mPrimitiveFields;
610d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
611acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    SkMatrix* mStaticMatrix;
612acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    SkMatrix* mAnimationMatrix;
61325fbb3fa1138675379102a44405852555cefccbdJohn Reck    LayerProperties mLayerProperties;
614acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
615d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    /**
616d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     * These fields are all generated from other properties and are not set directly.
617d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     */
618d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    struct ComputedFields {
619d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        ComputedFields();
620d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        ~ComputedFields();
621d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
622d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        /**
623d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         * Stores the total transformation of the DisplayList based upon its scalar
624d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         * translate/rotate/scale properties.
625d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         *
62649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik         * In the common translation-only case, the matrix isn't necessarily allocated,
62749e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik         * and the mTranslation properties are used directly.
628d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         */
62949e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        SkMatrix* mTransformMatrix;
63049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
63149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        Sk3DView mTransformCamera;
632d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    } mComputedFields;
633acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck};
634acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
635acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck} /* namespace uirenderer */
636acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck} /* namespace android */
637acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
638b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#endif /* RENDERNODEPROPERTIES_H */
639