12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/image_layer_updater.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource.h"
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_update_queue.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ImageLayerUpdater::Resource::Resource(ImageLayerUpdater* updater,
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      scoped_ptr<PrioritizedResource> texture)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : LayerUpdater::Resource(texture.Pass()), updater_(updater) {}
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ImageLayerUpdater::Resource::~Resource() {}
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ImageLayerUpdater::Resource::Update(ResourceUpdateQueue* queue,
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         gfx::Rect source_rect,
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         gfx::Vector2d dest_offset,
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                         bool partial_update) {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  updater_->UpdateTexture(
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      queue, texture(), source_rect, dest_offset, partial_update);
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<ImageLayerUpdater> ImageLayerUpdater::Create() {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return make_scoped_refptr(new ImageLayerUpdater());
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<LayerUpdater::Resource> ImageLayerUpdater::CreateResource(
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrioritizedResourceManager* manager) {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return scoped_ptr<LayerUpdater::Resource>(
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new Resource(this, PrioritizedResource::Create(manager)));
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ImageLayerUpdater::UpdateTexture(ResourceUpdateQueue* queue,
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      PrioritizedResource* texture,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      gfx::Rect source_rect,
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      gfx::Vector2d dest_offset,
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      bool partial_update) {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Source rect should never go outside the image pixels, even if this
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is requested because the texture extends outside the image.
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect clipped_source_rect = source_rect;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect image_rect = gfx::Rect(0, 0, bitmap_.width(), bitmap_.height());
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  clipped_source_rect.Intersect(image_rect);
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Vector2d clipped_dest_offset =
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dest_offset +
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Vector2d(clipped_source_rect.origin() - source_rect.origin());
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceUpdate upload = ResourceUpdate::Create(
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      texture, &bitmap_, image_rect, clipped_source_rect, clipped_dest_offset);
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (partial_update)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    queue->AppendPartialUpload(upload);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    queue->AppendFullUpload(upload);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ImageLayerUpdater::SetBitmap(const SkBitmap& bitmap) {
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(bitmap.pixelRef());
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bitmap_ = bitmap;
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool ImageLayerUpdater::UsingBitmap(const SkBitmap& bitmap) const {
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return bitmap.pixelRef() == bitmap_.pixelRef();
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace cc
69