| // Copyright 2014 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/android/compositor/layer/thumbnail_layer.h" |
| |
| #include "cc/slim/ui_resource_layer.h" |
| #include "chrome/browser/thumbnail/cc/thumbnail.h" |
| #include "ui/gfx/geometry/size_conversions.h" |
| |
| namespace android { |
| |
| // static |
| scoped_refptr<ThumbnailLayer> ThumbnailLayer::Create() { |
| return base::WrapRefCounted(new ThumbnailLayer()); |
| } |
| |
| void ThumbnailLayer::SetThumbnail(thumbnail::Thumbnail* thumbnail) { |
| layer_->SetUIResourceId(thumbnail->ui_resource_id()); |
| UpdateSizes(thumbnail->scaled_content_size(), thumbnail->scaled_data_size()); |
| } |
| |
| void ThumbnailLayer::Clip(const gfx::Rect& clipping) { |
| last_clipping_ = clipping; |
| clipped_ = true; |
| |
| gfx::Size clipped_content = gfx::Size(content_size_.width() - clipping.x(), |
| content_size_.height() - clipping.y()); |
| clipped_content.SetToMin(clipping.size()); |
| layer_->SetBounds(clipped_content); |
| |
| layer_->SetUV( |
| gfx::PointF(clipping.x() / resource_size_.width(), |
| clipping.y() / resource_size_.height()), |
| gfx::PointF( |
| (clipping.x() + clipped_content.width()) / resource_size_.width(), |
| (clipping.y() + clipped_content.height()) / resource_size_.height())); |
| } |
| |
| void ThumbnailLayer::ClearClip() { |
| layer_->SetUV(gfx::PointF(0.f, 0.f), gfx::PointF(1.f, 1.f)); |
| layer_->SetBounds(gfx::Size(content_size_.width(), content_size_.height())); |
| clipped_ = false; |
| } |
| |
| void ThumbnailLayer::AddSelfToParentOrReplaceAt( |
| scoped_refptr<cc::slim::Layer> parent, |
| size_t index) { |
| if (index >= parent->children().size()) { |
| parent->AddChild(layer_); |
| } else if (parent->children()[index]->id() != layer_->id()) { |
| parent->ReplaceChild(parent->children()[index].get(), layer_); |
| } |
| } |
| |
| scoped_refptr<cc::slim::Layer> ThumbnailLayer::layer() { |
| return layer_; |
| } |
| |
| ThumbnailLayer::ThumbnailLayer() : layer_(cc::slim::UIResourceLayer::Create()) { |
| layer_->SetIsDrawable(true); |
| } |
| |
| ThumbnailLayer::~ThumbnailLayer() = default; |
| |
| void ThumbnailLayer::UpdateSizes(const gfx::SizeF& content_size, |
| const gfx::SizeF& resource_size) { |
| if (content_size != content_size_ || resource_size != resource_size_) { |
| content_size_ = content_size; |
| resource_size_ = resource_size; |
| if (clipped_) { |
| Clip(last_clipping_); |
| } else { |
| ClearClip(); |
| } |
| } |
| } |
| |
| } // namespace android |