RenderProperties.cpp revision acb6f07623b7df3d4179f70ae03ade574616ffa6
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 */
16acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#include "RenderProperties.h"
17acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
18acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#include <SkMatrix.h>
19acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
20acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#include "Matrix.h"
21acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
22acb6f07623b7df3d4179f70ae03ade574616ffa6John Recknamespace android {
23acb6f07623b7df3d4179f70ae03ade574616ffa6John Recknamespace uirenderer {
24acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
25acb6f07623b7df3d4179f70ae03ade574616ffa6John ReckRenderProperties::RenderProperties()
26acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        : mClipToBounds(true)
27acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mProjectBackwards(false)
28acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mProjectionReceiver(false)
29acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mClipToOutline(false)
30acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mCastsShadow(false)
31acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mUsesGlobalCamera(false) // TODO: respect value when rendering
32acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mAlpha(1)
33acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mHasOverlappingRendering(true)
34acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mTranslationX(0), mTranslationY(0), mTranslationZ(0)
35acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mRotation(0), mRotationX(0), mRotationY(0)
36acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mScaleX(1), mScaleY(1)
37acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mPivotX(0), mPivotY(0)
38acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mCameraDistance(0)
39acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mLeft(0), mTop(0), mRight(0), mBottom(0)
40acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mWidth(0), mHeight(0)
41acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mPrevWidth(-1), mPrevHeight(-1)
42acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mPivotExplicitlySet(false)
43acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mMatrixDirty(false)
44acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mMatrixIsIdentity(true)
45acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mTransformMatrix(NULL)
46acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mMatrixFlags(0)
47acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mTransformCamera(NULL)
48acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mTransformMatrix3D(NULL)
49acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mStaticMatrix(NULL)
50acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mAnimationMatrix(NULL)
51acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        , mCaching(false) {
52acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    mOutline.rewind();
53acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck}
54acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
55acb6f07623b7df3d4179f70ae03ade574616ffa6John ReckRenderProperties::~RenderProperties() {
56acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    delete mTransformMatrix;
57acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    delete mTransformCamera;
58acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    delete mTransformMatrix3D;
59acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    delete mStaticMatrix;
60acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    delete mAnimationMatrix;
61acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck}
62acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
63acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckfloat RenderProperties::getPivotX() {
64acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    updateMatrix();
65acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    return mPivotX;
66acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck}
67acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
68acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckfloat RenderProperties::getPivotY() {
69acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    updateMatrix();
70acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    return mPivotY;
71acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck}
72acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
73acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckvoid RenderProperties::updateMatrix() {
74acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    if (mMatrixDirty) {
75acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        // NOTE: mTransformMatrix won't be up to date if a DisplayList goes from a complex transform
76acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        // to a pure translate. This is safe because the matrix isn't read in pure translate cases.
77acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (mMatrixFlags && mMatrixFlags != TRANSLATION) {
78acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            if (!mTransformMatrix) {
79acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                // only allocate a matrix if we have a complex transform
80acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mTransformMatrix = new Matrix4();
81acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
82acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            if (!mPivotExplicitlySet) {
83acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                if (mWidth != mPrevWidth || mHeight != mPrevHeight) {
84acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                    mPrevWidth = mWidth;
85acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                    mPrevHeight = mHeight;
86acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                    mPivotX = mPrevWidth / 2.0f;
87acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                    mPivotY = mPrevHeight / 2.0f;
88acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                }
89acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
90acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
91acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            if ((mMatrixFlags & ROTATION_3D) == 0) {
92acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mTransformMatrix->loadTranslate(
93acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                        mPivotX + mTranslationX,
94acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                        mPivotY + mTranslationY,
95acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                        0);
96acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mTransformMatrix->rotate(mRotation, 0, 0, 1);
97acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mTransformMatrix->scale(mScaleX, mScaleY, 1);
98acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mTransformMatrix->translate(-mPivotX, -mPivotY);
99acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            } else {
100acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                if (!mTransformCamera) {
101acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                    mTransformCamera = new Sk3DView();
102acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                    mTransformMatrix3D = new SkMatrix();
103acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                }
104acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                SkMatrix transformMatrix;
105acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                transformMatrix.reset();
106acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mTransformCamera->save();
107acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                transformMatrix.preScale(mScaleX, mScaleY, mPivotX, mPivotY);
108acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mTransformCamera->rotateX(mRotationX);
109acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mTransformCamera->rotateY(mRotationY);
110acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mTransformCamera->rotateZ(-mRotation);
111acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mTransformCamera->getMatrix(mTransformMatrix3D);
112acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY);
113acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mTransformMatrix3D->postTranslate(mPivotX + mTranslationX,
114acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                        mPivotY + mTranslationY);
115acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                transformMatrix.postConcat(*mTransformMatrix3D);
116acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mTransformCamera->restore();
117acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
118acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mTransformMatrix->load(transformMatrix);
119acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
120acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
121acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        mMatrixDirty = false;
122acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
123acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck}
124acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
125acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck} /* namespace uirenderer */
126acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck} /* namespace android */
127