DamageAccumulator.h revision a447d29c65fb811cd184775a3476101a1cede929
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 27e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Recknamespace android { 28e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Recknamespace uirenderer { 29e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 30e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reckstruct DirtyStack; 31e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reckclass RenderNode; 32a447d29c65fb811cd184775a3476101a1cede929John Reckclass Matrix4; 33e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 34a447d29c65fb811cd184775a3476101a1cede929John Reckclass IDamageAccumulator { 35a447d29c65fb811cd184775a3476101a1cede929John Reckpublic: 36a447d29c65fb811cd184775a3476101a1cede929John Reck virtual void pushTransform(const RenderNode* transform) = 0; 37a447d29c65fb811cd184775a3476101a1cede929John Reck virtual void pushTransform(const Matrix4* transform) = 0; 38a447d29c65fb811cd184775a3476101a1cede929John Reck virtual void popTransform() = 0; 39a447d29c65fb811cd184775a3476101a1cede929John Reck virtual void dirty(float left, float top, float right, float bottom) = 0; 40a447d29c65fb811cd184775a3476101a1cede929John Reckprotected: 41a447d29c65fb811cd184775a3476101a1cede929John Reck virtual ~IDamageAccumulator() {} 42a447d29c65fb811cd184775a3476101a1cede929John Reck}; 43a447d29c65fb811cd184775a3476101a1cede929John Reck 44a447d29c65fb811cd184775a3476101a1cede929John Reckclass DamageAccumulator : public IDamageAccumulator { 45e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck PREVENT_COPY_AND_ASSIGN(DamageAccumulator); 46e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reckpublic: 47e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck DamageAccumulator(); 48e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck // mAllocator will clean everything up for us, no need for a dtor 49e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 50e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck // Push a transform node onto the stack. This should be called prior 51e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck // to any dirty() calls. Subsequent calls to dirty() 52a447d29c65fb811cd184775a3476101a1cede929John Reck // will be affected by the transform when popTransform() is called. 53a447d29c65fb811cd184775a3476101a1cede929John Reck virtual void pushTransform(const RenderNode* transform); 54a447d29c65fb811cd184775a3476101a1cede929John Reck virtual void pushTransform(const Matrix4* transform); 55a447d29c65fb811cd184775a3476101a1cede929John Reck 56e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck // Pops a transform node from the stack, propagating the dirty rect 57a447d29c65fb811cd184775a3476101a1cede929John Reck // up to the parent node. Returns the IDamageTransform that was just applied 58a447d29c65fb811cd184775a3476101a1cede929John Reck virtual void popTransform(); 59a447d29c65fb811cd184775a3476101a1cede929John Reck 60a447d29c65fb811cd184775a3476101a1cede929John Reck virtual void dirty(float left, float top, float right, float bottom); 61e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn 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 73a447d29c65fb811cd184775a3476101a1cede929John Reckclass NullDamageAccumulator : public IDamageAccumulator { 74a447d29c65fb811cd184775a3476101a1cede929John Reck PREVENT_COPY_AND_ASSIGN(NullDamageAccumulator); 75a447d29c65fb811cd184775a3476101a1cede929John Reckpublic: 76a447d29c65fb811cd184775a3476101a1cede929John Reck virtual void pushTransform(const RenderNode* transform) { } 77a447d29c65fb811cd184775a3476101a1cede929John Reck virtual void pushTransform(const Matrix4* transform) { } 78a447d29c65fb811cd184775a3476101a1cede929John Reck virtual void popTransform() { } 79a447d29c65fb811cd184775a3476101a1cede929John Reck virtual void dirty(float left, float top, float right, float bottom) { } 80a447d29c65fb811cd184775a3476101a1cede929John Reck 81a447d29c65fb811cd184775a3476101a1cede929John Reck ANDROID_API static NullDamageAccumulator* instance(); 82a447d29c65fb811cd184775a3476101a1cede929John Reck 83a447d29c65fb811cd184775a3476101a1cede929John Reckprivate: 84a447d29c65fb811cd184775a3476101a1cede929John Reck NullDamageAccumulator() {} 85a447d29c65fb811cd184775a3476101a1cede929John Reck ~NullDamageAccumulator() {} 86a447d29c65fb811cd184775a3476101a1cede929John Reck 87a447d29c65fb811cd184775a3476101a1cede929John Reck static NullDamageAccumulator sInstance; 88a447d29c65fb811cd184775a3476101a1cede929John Reck}; 89a447d29c65fb811cd184775a3476101a1cede929John Reck 90e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck} /* namespace uirenderer */ 91e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck} /* namespace android */ 92e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 93e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck#endif /* DAMAGEACCUMULATOR_H */ 94