summaryrefslogtreecommitdiffstats
path: root/cc/draw_quad.h
diff options
context:
space:
mode:
Diffstat (limited to 'cc/draw_quad.h')
-rw-r--r--cc/draw_quad.h93
1 files changed, 93 insertions, 0 deletions
diff --git a/cc/draw_quad.h b/cc/draw_quad.h
index 638cbb2..05a6906 100644
--- a/cc/draw_quad.h
+++ b/cc/draw_quad.h
@@ -1,3 +1,96 @@
// Copyright 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+
+#ifndef CCDrawQuad_h
+#define CCDrawQuad_h
+
+#include "CCSharedQuadState.h"
+
+namespace cc {
+
+// WARNING! All CCXYZDrawQuad classes must remain PODs (plain old data).
+// They are intended to be "serializable" by copying their raw bytes, so they
+// must not contain any non-bit-copyable member variables!
+//
+// Furthermore, the class members need to be packed so they are aligned
+// properly and don't have paddings/gaps, otherwise memory check tools
+// like Valgrind will complain about uninitialized memory usage when
+// transferring these classes over the wire.
+#pragma pack(push, 4)
+
+// CCDrawQuad is a bag of data used for drawing a quad. Because different
+// materials need different bits of per-quad data to render, classes that derive
+// from CCDrawQuad store additional data in their derived instance. The Material
+// enum is used to "safely" downcast to the derived class.
+class CCDrawQuad {
+public:
+ enum Material {
+ Invalid,
+ Checkerboard,
+ DebugBorder,
+ IOSurfaceContent,
+ RenderPass,
+ TextureContent,
+ SolidColor,
+ TiledContent,
+ YUVVideoContent,
+ StreamVideoContent,
+ };
+
+ IntRect quadRect() const { return m_quadRect; }
+ const WebKit::WebTransformationMatrix& quadTransform() const { return m_sharedQuadState->quadTransform; }
+ IntRect visibleContentRect() const { return m_sharedQuadState->visibleContentRect; }
+ IntRect clippedRectInTarget() const { return m_sharedQuadState->clippedRectInTarget; }
+ float opacity() const { return m_sharedQuadState->opacity; }
+ // For the purposes of blending, what part of the contents of this quad are opaque?
+ IntRect opaqueRect() const;
+ bool needsBlending() const { return m_needsBlending || !opaqueRect().contains(m_quadVisibleRect); }
+
+ // Allows changing the rect that gets drawn to make it smaller. Parameter passed
+ // in will be clipped to quadRect().
+ void setQuadVisibleRect(const IntRect&);
+ IntRect quadVisibleRect() const { return m_quadVisibleRect; }
+ bool isDebugQuad() const { return m_material == DebugBorder; }
+
+ Material material() const { return m_material; }
+
+ // Returns transfer size of this object based on the derived class (by
+ // looking at the material type).
+ unsigned size() const;
+
+ scoped_ptr<CCDrawQuad> copy(const CCSharedQuadState* copiedSharedQuadState) const;
+
+ const CCSharedQuadState* sharedQuadState() const { return m_sharedQuadState; }
+ int sharedQuadStateId() const { return m_sharedQuadStateId; }
+ void setSharedQuadState(const CCSharedQuadState*);
+
+protected:
+ CCDrawQuad(const CCSharedQuadState*, Material, const IntRect&);
+
+ // Stores state common to a large bundle of quads; kept separate for memory
+ // efficiency. There is special treatment to reconstruct these pointers
+ // during serialization.
+ const CCSharedQuadState* m_sharedQuadState;
+ int m_sharedQuadStateId;
+
+ Material m_material;
+ IntRect m_quadRect;
+ IntRect m_quadVisibleRect;
+
+ // By default, the shared quad state determines whether or not this quad is
+ // opaque or needs blending. Derived classes can override with these
+ // variables.
+ bool m_quadOpaque;
+ bool m_needsBlending;
+
+ // Be default, this rect is empty. It is used when the shared quad state and above
+ // variables determine that the quad is not fully opaque but may be partially opaque.
+ IntRect m_opaqueRect;
+};
+
+#pragma pack(pop)
+
+}
+
+#endif