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)#include "cc/quads/draw_quad.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/values.h" 9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "cc/base/math_util.h" 10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "cc/debug/traced_value.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/checkerboard_draw_quad.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/debug_border_draw_quad.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/io_surface_draw_quad.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/quads/picture_draw_quad.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/render_pass_draw_quad.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/solid_color_draw_quad.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/stream_video_draw_quad.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/texture_draw_quad.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/tile_draw_quad.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/yuv_video_draw_quad.h" 21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/gfx/quad_f.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template<typename T> T* TypedCopy(const cc::DrawQuad* other) { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new T(*T::MaterialCast(other)); 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DrawQuad::DrawQuad() 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : material(INVALID), 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_blending(false), 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shared_quad_state() { 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DrawQuad::SetAll(const SharedQuadState* shared_quad_state, 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Material material, 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect rect, 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect opaque_rect, 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect visible_rect, 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool needs_blending) { 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(rect.Contains(visible_rect)) << "rect: " << rect.ToString() 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) << " visible_rect: " 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) << visible_rect.ToString(); 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(opaque_rect.IsEmpty() || rect.Contains(opaque_rect)) 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) << "rect: " << rect.ToString() << "opaque_rect " 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) << opaque_rect.ToString(); 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->material = material; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->rect = rect; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->opaque_rect = opaque_rect; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->visible_rect = visible_rect; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->needs_blending = needs_blending; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->shared_quad_state = shared_quad_state; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(shared_quad_state); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(material != INVALID); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DrawQuad::~DrawQuad() { 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<DrawQuad> DrawQuad::Copy( 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SharedQuadState* copied_shared_quad_state) const { 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DrawQuad> copy_quad; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (material) { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case CHECKERBOARD: 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy_quad.reset(TypedCopy<CheckerboardDrawQuad>(this)); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case DEBUG_BORDER: 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy_quad.reset(TypedCopy<DebugBorderDrawQuad>(this)); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case IO_SURFACE_CONTENT: 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy_quad.reset(TypedCopy<IOSurfaceDrawQuad>(this)); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case PICTURE_CONTENT: 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) copy_quad.reset(TypedCopy<PictureDrawQuad>(this)); 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case TEXTURE_CONTENT: 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy_quad.reset(TypedCopy<TextureDrawQuad>(this)); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SOLID_COLOR: 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy_quad.reset(TypedCopy<SolidColorDrawQuad>(this)); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case TILED_CONTENT: 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy_quad.reset(TypedCopy<TileDrawQuad>(this)); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case STREAM_VIDEO_CONTENT: 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy_quad.reset(TypedCopy<StreamVideoDrawQuad>(this)); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case YUV_VIDEO_CONTENT: 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy_quad.reset(TypedCopy<YUVVideoDrawQuad>(this)); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case RENDER_PASS: // RenderPass quads have their own copy() method. 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case INVALID: 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(FATAL) << "Invalid DrawQuad material " << material; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy_quad->shared_quad_state = copied_shared_quad_state; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return copy_quad.Pass(); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochscoped_ptr<base::Value> DrawQuad::AsValue() const { 105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue()); 106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch value->SetInteger("material", material); 107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch value->Set("shared_state", 108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TracedValue::CreateIDRef(shared_quad_state).release()); 109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch value->Set("content_space_rect", MathUtil::AsValue(rect).release()); 111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool rect_is_clipped; 112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch gfx::QuadF rect_as_target_space_quad = MathUtil::MapQuad( 113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch shared_quad_state->content_to_target_transform, 114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch gfx::QuadF(rect), 115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &rect_is_clipped); 116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch value->Set("rect_as_target_space_quad", 117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch MathUtil::AsValue(rect_as_target_space_quad).release()); 118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch value->SetBoolean("rect_is_clipped", rect_is_clipped); 119ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 120ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch value->Set("content_space_opaque_rect", 121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch MathUtil::AsValue(opaque_rect).release()); 122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool opaque_rect_is_clipped; 123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch gfx::QuadF opaque_rect_as_target_space_quad = MathUtil::MapQuad( 124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch shared_quad_state->content_to_target_transform, 125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch gfx::QuadF(opaque_rect), 126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &opaque_rect_is_clipped); 127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch value->Set("opaque_rect_as_target_space_quad", 128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch MathUtil::AsValue(opaque_rect_as_target_space_quad).release()); 129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch value->SetBoolean("opaque_rect_is_clipped", opaque_rect_is_clipped); 130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch value->Set("content_space_visible_rect", 132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch MathUtil::AsValue(visible_rect).release()); 133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool visible_rect_is_clipped; 134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch gfx::QuadF visible_rect_as_target_space_quad = MathUtil::MapQuad( 135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch shared_quad_state->content_to_target_transform, 136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch gfx::QuadF(visible_rect), 137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &visible_rect_is_clipped); 138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch value->Set("visible_rect_as_target_space_quad", 139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch MathUtil::AsValue(visible_rect_as_target_space_quad).release()); 140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch value->SetBoolean("visible_rect_is_clipped", visible_rect_is_clipped); 141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch value->SetBoolean("needs_blending", needs_blending); 143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch value->SetBoolean("should_draw_with_blending", ShouldDrawWithBlending()); 144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ExtendValue(value.get()); 145ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return value.PassAs<base::Value>(); 146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 149