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