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)