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