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