summaryrefslogtreecommitdiffstats
path: root/libs/hwui/DamageAccumulator.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/hwui/DamageAccumulator.h')
-rw-r--r--libs/hwui/DamageAccumulator.h48
1 files changed, 42 insertions, 6 deletions
diff --git a/libs/hwui/DamageAccumulator.h b/libs/hwui/DamageAccumulator.h
index c62a351..2ca30d4 100644
--- a/libs/hwui/DamageAccumulator.h
+++ b/libs/hwui/DamageAccumulator.h
@@ -16,6 +16,7 @@
#ifndef DAMAGEACCUMULATOR_H
#define DAMAGEACCUMULATOR_H
+#include <cutils/compiler.h>
#include <utils/LinearAllocator.h>
#include <SkMatrix.h>
@@ -28,8 +29,19 @@ namespace uirenderer {
struct DirtyStack;
class RenderNode;
+class Matrix4;
-class DamageAccumulator {
+class IDamageAccumulator {
+public:
+ virtual void pushTransform(const RenderNode* transform) = 0;
+ virtual void pushTransform(const Matrix4* transform) = 0;
+ virtual void popTransform() = 0;
+ virtual void dirty(float left, float top, float right, float bottom) = 0;
+protected:
+ virtual ~IDamageAccumulator() {}
+};
+
+class DamageAccumulator : public IDamageAccumulator {
PREVENT_COPY_AND_ASSIGN(DamageAccumulator);
public:
DamageAccumulator();
@@ -37,20 +49,44 @@ public:
// Push a transform node onto the stack. This should be called prior
// to any dirty() calls. Subsequent calls to dirty()
- // will be affected by the node's transform when popNode() is called.
- void pushNode(const RenderNode* node);
+ // will be affected by the transform when popTransform() is called.
+ virtual void pushTransform(const RenderNode* transform);
+ virtual void pushTransform(const Matrix4* transform);
+
// Pops a transform node from the stack, propagating the dirty rect
- // up to the parent node.
- void popNode();
- void dirty(float left, float top, float right, float bottom);
+ // up to the parent node. Returns the IDamageTransform that was just applied
+ virtual void popTransform();
+
+ virtual void dirty(float left, float top, float right, float bottom);
void finish(SkRect* totalDirty);
private:
+ void pushCommon();
+ void applyMatrix4Transform(DirtyStack* frame);
+ void applyRenderNodeTransform(DirtyStack* frame);
+
LinearAllocator mAllocator;
DirtyStack* mHead;
};
+class NullDamageAccumulator : public IDamageAccumulator {
+ PREVENT_COPY_AND_ASSIGN(NullDamageAccumulator);
+public:
+ virtual void pushTransform(const RenderNode* transform) { }
+ virtual void pushTransform(const Matrix4* transform) { }
+ virtual void popTransform() { }
+ virtual void dirty(float left, float top, float right, float bottom) { }
+
+ ANDROID_API static NullDamageAccumulator* instance();
+
+private:
+ NullDamageAccumulator() {}
+ ~NullDamageAccumulator() {}
+
+ static NullDamageAccumulator sInstance;
+};
+
} /* namespace uirenderer */
} /* namespace android */