12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CC_QUADS_DRAW_QUAD_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CC_QUADS_DRAW_QUAD_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/cc_export.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/shared_quad_state.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_provider.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace base {
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace debug {
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TracedValue;
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass Value;
18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass DictionaryValue;
19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DrawQuad is a bag of data used for drawing a quad. Because different
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// materials need different bits of per-quad data to render, classes that derive
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// from DrawQuad store additional data in their derived instance. The Material
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enum is used to "safely" downcast to the derived class.
27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Note: quads contain rects and sizes, which live in different spaces. There is
28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// the "content space", which is the arbitrary space in which the quad's
29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// geometry is defined (generally related to the layer that produced the quad,
30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// e.g. the content space for TiledLayerImpls, or the geometry space for
31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// PictureLayerImpls). There is also the "target space", which is the space, in
32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// "physical" pixels, of the render target where the quads is drawn. The quad's
33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// transform maps the content space to the target space.
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CC_EXPORT DrawQuad {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum Material {
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    INVALID,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECKERBOARD,
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DEBUG_BORDER,
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IO_SURFACE_CONTENT,
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PICTURE_CONTENT,
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RENDER_PASS,
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SOLID_COLOR,
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    STREAM_VIDEO_CONTENT,
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SURFACE_CONTENT,
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TEXTURE_CONTENT,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TILED_CONTENT,
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    YUV_VIDEO_CONTENT,
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MATERIAL_LAST = YUV_VIDEO_CONTENT
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DrawQuad();
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(danakj): Chromify or remove these SharedQuadState helpers.
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Transform& quadTransform() const {
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return shared_quad_state->content_to_target_transform;
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect visibleContentRect() const {
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return shared_quad_state->visible_content_rect;
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect clipRect() const { return shared_quad_state->clip_rect; }
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool isClipped() const { return shared_quad_state->is_clipped; }
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float opacity() const { return shared_quad_state->opacity; }
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Material material;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This rect, after applying the quad_transform(), gives the geometry that
68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // this quad should draw to. This rect lives in content space.
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect rect;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // This specifies the region of the quad that is opaque. This rect lives in
72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // content space.
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect opaque_rect;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Allows changing the rect that gets drawn to make it smaller. This value
76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // should be clipped to |rect|. This rect lives in content space.
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect visible_rect;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // By default blending is used when some part of the quad is not opaque.
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // With this setting, it is possible to force blending on regardless of the
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // opaque area.
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool needs_blending;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Stores state common to a large bundle of quads; kept separate for memory
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // efficiency. There is special treatment to reconstruct these pointers
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // during serialization.
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const SharedQuadState* shared_quad_state;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsDebugQuad() const { return material == DEBUG_BORDER; }
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ShouldDrawWithBlending() const {
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (needs_blending || shared_quad_state->opacity < 1.0f)
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return true;
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (visible_rect.IsEmpty())
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return false;
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return !opaque_rect.Contains(visible_rect);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef ResourceProvider::ResourceId ResourceId;
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef base::Callback<ResourceId(ResourceId)> ResourceIteratorCallback;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void IterateResources(const ResourceIteratorCallback& callback) = 0;
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Is the left edge of this tile aligned with the originating layer's
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // left edge?
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsLeftEdge() const { return !rect.x(); }
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Is the top edge of this tile aligned with the originating layer's
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // top edge?
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsTopEdge() const { return !rect.y(); }
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Is the right edge of this tile aligned with the originating layer's
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // right edge?
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsRightEdge() const {
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return rect.right() == shared_quad_state->content_bounds.width();
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Is the bottom edge of this tile aligned with the originating layer's
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // bottom edge?
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsBottomEdge() const {
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return rect.bottom() == shared_quad_state->content_bounds.height();
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Is any edge of this tile aligned with the originating layer's
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // corresponding edge?
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsEdge() const {
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return IsLeftEdge() || IsTopEdge() || IsRightEdge() || IsBottomEdge();
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void AsValueInto(base::debug::TracedValue* value) const;
130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DrawQuad();
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetAll(const SharedQuadState* shared_quad_state,
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              Material material,
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              const gfx::Rect& rect,
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              const gfx::Rect& opaque_rect,
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              const gfx::Rect& visible_rect,
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              bool needs_blending);
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void ExtendValue(base::debug::TracedValue* value) const = 0;
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace cc
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CC_QUADS_DRAW_QUAD_H_
146