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