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" 84311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "base/values.h" 94311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "cc/base/math_util.h" 104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen 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" 214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen 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) { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->material = material; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->rect = rect; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->opaque_rect = opaque_rect; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->visible_rect = visible_rect; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->needs_blending = needs_blending; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->shared_quad_state = shared_quad_state; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(shared_quad_state); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(material != INVALID); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DrawQuad::~DrawQuad() { 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<DrawQuad> DrawQuad::Copy( 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SharedQuadState* copied_shared_quad_state) const { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DrawQuad> copy_quad; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (material) { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case CHECKERBOARD: 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy_quad.reset(TypedCopy<CheckerboardDrawQuad>(this)); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case DEBUG_BORDER: 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy_quad.reset(TypedCopy<DebugBorderDrawQuad>(this)); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case IO_SURFACE_CONTENT: 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy_quad.reset(TypedCopy<IOSurfaceDrawQuad>(this)); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case PICTURE_CONTENT: 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) copy_quad.reset(TypedCopy<PictureDrawQuad>(this)); 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case TEXTURE_CONTENT: 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy_quad.reset(TypedCopy<TextureDrawQuad>(this)); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SOLID_COLOR: 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy_quad.reset(TypedCopy<SolidColorDrawQuad>(this)); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case TILED_CONTENT: 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy_quad.reset(TypedCopy<TileDrawQuad>(this)); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case STREAM_VIDEO_CONTENT: 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy_quad.reset(TypedCopy<StreamVideoDrawQuad>(this)); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case YUV_VIDEO_CONTENT: 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy_quad.reset(TypedCopy<YUVVideoDrawQuad>(this)); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case RENDER_PASS: // RenderPass quads have their own copy() method. 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case INVALID: 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(FATAL) << "Invalid DrawQuad material " << material; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy_quad->shared_quad_state = copied_shared_quad_state; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return copy_quad.Pass(); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 974311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochscoped_ptr<base::Value> DrawQuad::AsValue() const { 984311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue()); 994311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->SetInteger("material", material); 1004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->Set("shared_state", 1014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch TracedValue::CreateIDRef(shared_quad_state).release()); 1024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 1034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->Set("content_space_rect", MathUtil::AsValue(rect).release()); 1044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch bool rect_is_clipped; 1054311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch gfx::QuadF rect_as_target_space_quad = MathUtil::MapQuad( 1064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch shared_quad_state->content_to_target_transform, 1074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch gfx::QuadF(rect), 1084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &rect_is_clipped); 1094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->Set("rect_as_target_space_quad", 1104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch MathUtil::AsValue(rect_as_target_space_quad).release()); 1114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->SetBoolean("rect_is_clipped", rect_is_clipped); 1124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 1134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->Set("content_space_opaque_rect", 1144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch MathUtil::AsValue(opaque_rect).release()); 1154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch bool opaque_rect_is_clipped; 1164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch gfx::QuadF opaque_rect_as_target_space_quad = MathUtil::MapQuad( 1174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch shared_quad_state->content_to_target_transform, 1184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch gfx::QuadF(opaque_rect), 1194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &opaque_rect_is_clipped); 1204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->Set("opaque_rect_as_target_space_quad", 1214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch MathUtil::AsValue(opaque_rect_as_target_space_quad).release()); 1224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->SetBoolean("opaque_rect_is_clipped", opaque_rect_is_clipped); 1234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 1244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->Set("content_space_visible_rect", 1254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch MathUtil::AsValue(visible_rect).release()); 1264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch bool visible_rect_is_clipped; 1274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch gfx::QuadF visible_rect_as_target_space_quad = MathUtil::MapQuad( 1284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch shared_quad_state->content_to_target_transform, 1294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch gfx::QuadF(visible_rect), 1304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &visible_rect_is_clipped); 1314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->Set("visible_rect_as_target_space_quad", 1324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch MathUtil::AsValue(visible_rect_as_target_space_quad).release()); 1334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->SetBoolean("visible_rect_is_clipped", visible_rect_is_clipped); 1344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 1354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->SetBoolean("needs_blending", needs_blending); 1364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->SetBoolean("should_draw_with_blending", ShouldDrawWithBlending()); 1374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ExtendValue(value.get()); 1384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return value.PassAs<base::Value>(); 1394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch} 1404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 142