15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Copyright 2010 The Chromium Authors. All rights reserved. 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// found in the LICENSE file. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "cc/layers/picture_image_layer.h" 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "cc/layers/picture_image_layer_impl.h" 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h" 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace cc { 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)scoped_refptr<PictureImageLayer> PictureImageLayer::Create() { 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return make_scoped_refptr(new PictureImageLayer()); 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PictureImageLayer::PictureImageLayer() : PictureLayer(this) {} 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PictureImageLayer::~PictureImageLayer() { 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ClearClient(); 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)scoped_ptr<LayerImpl> PictureImageLayer::CreateLayerImpl( 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayerTreeImpl* tree_impl) { 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return PictureImageLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>(); 2502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch} 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool PictureImageLayer::HasDrawableContent() const { 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !bitmap_.isNull() && PictureLayer::HasDrawableContent(); 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void PictureImageLayer::SetBitmap(const SkBitmap& bitmap) { 325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // SetBitmap() currently gets called whenever there is any 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // style change that affects the layer even if that change doesn't 3409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // affect the actual contents of the image (e.g. a CSS animation). 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // With this check in place we avoid unecessary texture uploads. 361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (bitmap.pixelRef() && bitmap.pixelRef() == bitmap_.pixelRef()) 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return; 38591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 39591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch bitmap_ = bitmap; 40591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch UpdateDrawsContent(HasDrawableContent()); 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SetNeedsDisplay(); 42f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu} 43f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu 44f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid PictureImageLayer::PaintContents( 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SkCanvas* canvas, 46c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) const gfx::Rect& clip, 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ContentLayerClient::GraphicsContextStatus gc_status) { 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!bitmap_.width() || !bitmap_.height()) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SkScalar content_to_layer_scale_x = 52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) SkFloatToScalar(static_cast<float>(bounds().width()) / bitmap_.width()); 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SkScalar content_to_layer_scale_y = 54926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) SkFloatToScalar(static_cast<float>(bounds().height()) / bitmap_.height()); 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) canvas->scale(content_to_layer_scale_x, content_to_layer_scale_y); 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Because Android WebView resourceless software draw mode rasters directly 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to the root canvas, this draw must use the kSrcOver_Mode so that 59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // transparent images blend correctly. 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) canvas->drawBitmap(bitmap_, 0, 0); 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool PictureImageLayer::FillsBoundsCompletely() const { 64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace cc 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)