1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2014 The Android Open Source Project 3*d57664e9SAndroid Build Coastguard Worker * 4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*d57664e9SAndroid Build Coastguard Worker * 8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*d57664e9SAndroid Build Coastguard Worker * 10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*d57664e9SAndroid Build Coastguard Worker * limitations under the License. 15*d57664e9SAndroid Build Coastguard Worker */ 16*d57664e9SAndroid Build Coastguard Worker #ifndef DAMAGEACCUMULATOR_H 17*d57664e9SAndroid Build Coastguard Worker #define DAMAGEACCUMULATOR_H 18*d57664e9SAndroid Build Coastguard Worker 19*d57664e9SAndroid Build Coastguard Worker #include <cutils/compiler.h> 20*d57664e9SAndroid Build Coastguard Worker #include <utils/LinearAllocator.h> 21*d57664e9SAndroid Build Coastguard Worker 22*d57664e9SAndroid Build Coastguard Worker #include <SkMatrix.h> 23*d57664e9SAndroid Build Coastguard Worker #include <SkRect.h> 24*d57664e9SAndroid Build Coastguard Worker #include <effects/StretchEffect.h> 25*d57664e9SAndroid Build Coastguard Worker 26*d57664e9SAndroid Build Coastguard Worker #include "utils/Macros.h" 27*d57664e9SAndroid Build Coastguard Worker 28*d57664e9SAndroid Build Coastguard Worker // Smaller than INT_MIN/INT_MAX because we offset these values 29*d57664e9SAndroid Build Coastguard Worker // and thus don't want to be adding offsets to INT_MAX, that's bad 30*d57664e9SAndroid Build Coastguard Worker #define DIRTY_MIN (-0x7ffffff - 1) 31*d57664e9SAndroid Build Coastguard Worker #define DIRTY_MAX (0x8000000) 32*d57664e9SAndroid Build Coastguard Worker 33*d57664e9SAndroid Build Coastguard Worker namespace android { 34*d57664e9SAndroid Build Coastguard Worker namespace uirenderer { 35*d57664e9SAndroid Build Coastguard Worker 36*d57664e9SAndroid Build Coastguard Worker struct DirtyStack; 37*d57664e9SAndroid Build Coastguard Worker class RenderNode; 38*d57664e9SAndroid Build Coastguard Worker class Matrix4; 39*d57664e9SAndroid Build Coastguard Worker 40*d57664e9SAndroid Build Coastguard Worker class DamageAccumulator { 41*d57664e9SAndroid Build Coastguard Worker PREVENT_COPY_AND_ASSIGN(DamageAccumulator); 42*d57664e9SAndroid Build Coastguard Worker 43*d57664e9SAndroid Build Coastguard Worker public: 44*d57664e9SAndroid Build Coastguard Worker DamageAccumulator(); 45*d57664e9SAndroid Build Coastguard Worker // mAllocator will clean everything up for us, no need for a dtor 46*d57664e9SAndroid Build Coastguard Worker 47*d57664e9SAndroid Build Coastguard Worker // Push a transform node onto the stack. This should be called prior 48*d57664e9SAndroid Build Coastguard Worker // to any dirty() calls. Subsequent calls to dirty() 49*d57664e9SAndroid Build Coastguard Worker // will be affected by the transform when popTransform() is called. 50*d57664e9SAndroid Build Coastguard Worker void pushTransform(const RenderNode* transform); 51*d57664e9SAndroid Build Coastguard Worker void pushTransform(const Matrix4* transform); 52*d57664e9SAndroid Build Coastguard Worker 53*d57664e9SAndroid Build Coastguard Worker // Pops a transform node from the stack, propagating the dirty rect 54*d57664e9SAndroid Build Coastguard Worker // up to the parent node. Returns the IDamageTransform that was just applied 55*d57664e9SAndroid Build Coastguard Worker void popTransform(); 56*d57664e9SAndroid Build Coastguard Worker 57*d57664e9SAndroid Build Coastguard Worker void dirty(float left, float top, float right, float bottom); 58*d57664e9SAndroid Build Coastguard Worker 59*d57664e9SAndroid Build Coastguard Worker // Returns the current dirty area, *NOT* transformed by pushed transforms 60*d57664e9SAndroid Build Coastguard Worker void peekAtDirty(SkRect* dest) const; 61*d57664e9SAndroid Build Coastguard Worker 62*d57664e9SAndroid Build Coastguard Worker void computeCurrentTransform(Matrix4* outMatrix) const; 63*d57664e9SAndroid Build Coastguard Worker 64*d57664e9SAndroid Build Coastguard Worker SkRect computeClipAndTransform(const SkRect& bounds, Matrix4* outMatrix) const; 65*d57664e9SAndroid Build Coastguard Worker 66*d57664e9SAndroid Build Coastguard Worker void finish(SkRect* totalDirty); 67*d57664e9SAndroid Build Coastguard Worker 68*d57664e9SAndroid Build Coastguard Worker struct StretchResult { 69*d57664e9SAndroid Build Coastguard Worker /** 70*d57664e9SAndroid Build Coastguard Worker * Stretch parameters configured on the stretch container 71*d57664e9SAndroid Build Coastguard Worker */ 72*d57664e9SAndroid Build Coastguard Worker const StretchEffect* stretchEffect; 73*d57664e9SAndroid Build Coastguard Worker 74*d57664e9SAndroid Build Coastguard Worker /** 75*d57664e9SAndroid Build Coastguard Worker * Bounds of the stretching container 76*d57664e9SAndroid Build Coastguard Worker */ 77*d57664e9SAndroid Build Coastguard Worker const SkRect parentBounds; 78*d57664e9SAndroid Build Coastguard Worker 79*d57664e9SAndroid Build Coastguard Worker /** 80*d57664e9SAndroid Build Coastguard Worker * Width of the stretch container 81*d57664e9SAndroid Build Coastguard Worker */ 82*d57664e9SAndroid Build Coastguard Worker const float width; 83*d57664e9SAndroid Build Coastguard Worker 84*d57664e9SAndroid Build Coastguard Worker /** 85*d57664e9SAndroid Build Coastguard Worker * Height of the stretch container 86*d57664e9SAndroid Build Coastguard Worker */ 87*d57664e9SAndroid Build Coastguard Worker const float height; 88*d57664e9SAndroid Build Coastguard Worker }; 89*d57664e9SAndroid Build Coastguard Worker 90*d57664e9SAndroid Build Coastguard Worker [[nodiscard]] StretchResult findNearestStretchEffect() const; 91*d57664e9SAndroid Build Coastguard Worker 92*d57664e9SAndroid Build Coastguard Worker private: 93*d57664e9SAndroid Build Coastguard Worker void pushCommon(); 94*d57664e9SAndroid Build Coastguard Worker void applyMatrix4Transform(DirtyStack* frame); 95*d57664e9SAndroid Build Coastguard Worker void applyRenderNodeTransform(DirtyStack* frame); 96*d57664e9SAndroid Build Coastguard Worker 97*d57664e9SAndroid Build Coastguard Worker LinearAllocator mAllocator; 98*d57664e9SAndroid Build Coastguard Worker DirtyStack* mHead; 99*d57664e9SAndroid Build Coastguard Worker }; 100*d57664e9SAndroid Build Coastguard Worker 101*d57664e9SAndroid Build Coastguard Worker } /* namespace uirenderer */ 102*d57664e9SAndroid Build Coastguard Worker } /* namespace android */ 103*d57664e9SAndroid Build Coastguard Worker 104*d57664e9SAndroid Build Coastguard Worker #endif /* DAMAGEACCUMULATOR_H */ 105