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