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