1e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck/* 2e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck * Copyright (C) 2014 The Android Open Source Project 3e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck * 4e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck * Licensed under the Apache License, Version 2.0 (the "License"); 5e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck * you may not use this file except in compliance with the License. 6e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck * You may obtain a copy of the License at 7e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck * 8e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck * http://www.apache.org/licenses/LICENSE-2.0 9e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck * 10e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck * Unless required by applicable law or agreed to in writing, software 11e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck * distributed under the License is distributed on an "AS IS" BASIS, 12e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck * See the License for the specific language governing permissions and 14e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck * limitations under the License. 15e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck */ 16e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck#ifndef DAMAGEACCUMULATOR_H 17e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck#define DAMAGEACCUMULATOR_H 18e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 19a447d29c65fb811cd184775a3476101a1cede929John Reck#include <cutils/compiler.h> 20e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck#include <utils/LinearAllocator.h> 21e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 22e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck#include <SkMatrix.h> 23e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck#include <SkRect.h> 24e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 25e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck#include "utils/Macros.h" 26e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 27c128823940fb0be96eda810fa9f0c75f66d944b0John Reck// Smaller than INT_MIN/INT_MAX because we offset these values 28c128823940fb0be96eda810fa9f0c75f66d944b0John Reck// and thus don't want to be adding offsets to INT_MAX, that's bad 29c128823940fb0be96eda810fa9f0c75f66d944b0John Reck#define DIRTY_MIN (-0x7ffffff-1) 30c128823940fb0be96eda810fa9f0c75f66d944b0John Reck#define DIRTY_MAX (0x7ffffff) 31c128823940fb0be96eda810fa9f0c75f66d944b0John Reck 32e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Recknamespace android { 33e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Recknamespace uirenderer { 34e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 35e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reckstruct DirtyStack; 36e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reckclass RenderNode; 37a447d29c65fb811cd184775a3476101a1cede929John Reckclass Matrix4; 38e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 3969e5adffb19135d51bde8e458f4907d7265f3e23Chris Craikclass DamageAccumulator { 40e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck PREVENT_COPY_AND_ASSIGN(DamageAccumulator); 41e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reckpublic: 42e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck DamageAccumulator(); 43e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck // mAllocator will clean everything up for us, no need for a dtor 44e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 45e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck // Push a transform node onto the stack. This should be called prior 46e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck // to any dirty() calls. Subsequent calls to dirty() 47a447d29c65fb811cd184775a3476101a1cede929John Reck // will be affected by the transform when popTransform() is called. 4869e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik void pushTransform(const RenderNode* transform); 4969e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik void pushTransform(const Matrix4* transform); 50a447d29c65fb811cd184775a3476101a1cede929John Reck 51e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck // Pops a transform node from the stack, propagating the dirty rect 52a447d29c65fb811cd184775a3476101a1cede929John Reck // up to the parent node. Returns the IDamageTransform that was just applied 5369e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik void popTransform(); 54a447d29c65fb811cd184775a3476101a1cede929John Reck 5569e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik void dirty(float left, float top, float right, float bottom); 56e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 5725fbb3fa1138675379102a44405852555cefccbdJohn Reck // Returns the current dirty area, *NOT* transformed by pushed transforms 58c71bfcaa182e3d4fd9874362d3b4781fda934a21Chris Craik void peekAtDirty(SkRect* dest) const; 5969e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik 60f648108f83d4e74811919e9811efb8fcc184b8a3John Reck ANDROID_API void computeCurrentTransform(Matrix4* outMatrix) const; 6125fbb3fa1138675379102a44405852555cefccbdJohn Reck 62e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck void finish(SkRect* totalDirty); 63e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 64e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reckprivate: 65a447d29c65fb811cd184775a3476101a1cede929John Reck void pushCommon(); 66a447d29c65fb811cd184775a3476101a1cede929John Reck void applyMatrix4Transform(DirtyStack* frame); 67a447d29c65fb811cd184775a3476101a1cede929John Reck void applyRenderNodeTransform(DirtyStack* frame); 68a447d29c65fb811cd184775a3476101a1cede929John Reck 69e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck LinearAllocator mAllocator; 70e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck DirtyStack* mHead; 71e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck}; 72e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 73e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck} /* namespace uirenderer */ 74e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck} /* namespace android */ 75e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 76e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck#endif /* DAMAGEACCUMULATOR_H */ 77