14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/ui_resource_layer_impl.h" 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/strings/stringprintf.h" 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/values.h" 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/base/math_util.h" 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/quads/texture_draw_quad.h" 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/trees/occlusion_tracker.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/gfx/rect_f.h" 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace cc { 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)UIResourceLayerImpl::UIResourceLayerImpl(LayerTreeImpl* tree_impl, int id) 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : LayerImpl(tree_impl, id), 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ui_resource_id_(0), 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) uv_top_left_(0.f, 0.f), 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) uv_bottom_right_(1.f, 1.f) { 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[0] = 1.0f; 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[1] = 1.0f; 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[2] = 1.0f; 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[3] = 1.0f; 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)UIResourceLayerImpl::~UIResourceLayerImpl() {} 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)scoped_ptr<LayerImpl> UIResourceLayerImpl::CreateLayerImpl( 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeImpl* tree_impl) { 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return UIResourceLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>(); 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void UIResourceLayerImpl::PushPropertiesTo(LayerImpl* layer) { 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerImpl::PushPropertiesTo(layer); 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UIResourceLayerImpl* layer_impl = static_cast<UIResourceLayerImpl*>(layer); 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_impl->SetUIResourceId(ui_resource_id_); 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_impl->SetImageBounds(image_bounds_); 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_impl->SetUV(uv_top_left_, uv_bottom_right_); 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_impl->SetVertexOpacity(vertex_opacity_); 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void UIResourceLayerImpl::SetUIResourceId(UIResourceId uid) { 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (uid == ui_resource_id_) 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ui_resource_id_ = uid; 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NoteLayerPropertyChanged(); 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void UIResourceLayerImpl::SetImageBounds(const gfx::Size& image_bounds) { 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // This check imposes an ordering on the call sequence. An UIResource must 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // exist before SetImageBounds can be called. 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(ui_resource_id_); 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (image_bounds_ == image_bounds) 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) image_bounds_ = image_bounds; 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NoteLayerPropertyChanged(); 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void UIResourceLayerImpl::SetUV(const gfx::PointF& top_left, 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& bottom_right) { 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (uv_top_left_ == top_left && uv_bottom_right_ == bottom_right) 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) uv_top_left_ = top_left; 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) uv_bottom_right_ = bottom_right; 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NoteLayerPropertyChanged(); 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void UIResourceLayerImpl::SetVertexOpacity(const float vertex_opacity[4]) { 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (vertex_opacity_[0] == vertex_opacity[0] && 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[1] == vertex_opacity[1] && 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[2] == vertex_opacity[2] && 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[3] == vertex_opacity[3]) 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[0] = vertex_opacity[0]; 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[1] = vertex_opacity[1]; 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[2] = vertex_opacity[2]; 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_[3] = vertex_opacity[3]; 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NoteLayerPropertyChanged(); 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool UIResourceLayerImpl::WillDraw(DrawMode draw_mode, 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ResourceProvider* resource_provider) { 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!ui_resource_id_ || draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return LayerImpl::WillDraw(draw_mode, resource_provider); 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UIResourceLayerImpl::AppendQuads( 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderPass* render_pass, 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const OcclusionTracker<LayerImpl>& occlusion_tracker, 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AppendQuadsData* append_quads_data) { 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SharedQuadState* shared_quad_state = 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_pass->CreateAndAppendSharedQuadState(); 100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PopulateSharedQuadState(shared_quad_state); 101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) AppendDebugBorderQuad( 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_pass, content_bounds(), shared_quad_state, append_quads_data); 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!ui_resource_id_) 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ResourceProvider::ResourceId resource = 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_impl()->ResourceIdForUIResource(ui_resource_id_); 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!resource) 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) static const bool flipped = false; 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) static const bool premultiplied_alpha = true; 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(!bounds().IsEmpty()); 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool opaque = layer_tree_impl()->IsUIResourceOpaque(ui_resource_id_) || 1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) contents_opaque(); 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect quad_rect(bounds()); 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect opaque_rect(opaque ? quad_rect : gfx::Rect()); 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Rect visible_quad_rect = 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci occlusion_tracker.GetCurrentOcclusionForLayer( 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci draw_properties().target_space_transform) 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .GetUnoccludedContentRect(quad_rect); 12823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (visible_quad_rect.IsEmpty()) 12923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return; 13023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TextureDrawQuad* quad = 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) quad->SetNew(shared_quad_state, 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) quad_rect, 1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) opaque_rect, 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) visible_quad_rect, 1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource, 1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) premultiplied_alpha, 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) uv_top_left_, 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) uv_bottom_right_, 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SK_ColorTRANSPARENT, 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) vertex_opacity_, 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) flipped); 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char* UIResourceLayerImpl::LayerTypeAsString() const { 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return "cc::UIResourceLayerImpl"; 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)base::DictionaryValue* UIResourceLayerImpl::LayerTreeAsJson() const { 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::DictionaryValue* result = LayerImpl::LayerTreeAsJson(); 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result->Set("ImageBounds", MathUtil::AsValue(image_bounds_).release()); 1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::ListValue* list = new base::ListValue; 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) list->AppendDouble(vertex_opacity_[0]); 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) list->AppendDouble(vertex_opacity_[1]); 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) list->AppendDouble(vertex_opacity_[2]); 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) list->AppendDouble(vertex_opacity_[3]); 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result->Set("VertexOpacity", list); 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result->Set("UVTopLeft", MathUtil::AsValue(uv_top_left_).release()); 1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result->Set("UVBottomRight", MathUtil::AsValue(uv_bottom_right_).release()); 1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return result; 1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace cc 169