// Copyright 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "cc/resources/caching_bitmap_content_layer_updater.h" #include "base/logging.h" #include "cc/resources/layer_painter.h" #include "skia/ext/platform_canvas.h" namespace cc { scoped_refptr CachingBitmapContentLayerUpdater::Create( scoped_ptr painter, RenderingStatsInstrumentation* stats_instrumentation, int layer_id) { return make_scoped_refptr( new CachingBitmapContentLayerUpdater(painter.Pass(), stats_instrumentation, layer_id)); } CachingBitmapContentLayerUpdater::CachingBitmapContentLayerUpdater( scoped_ptr painter, RenderingStatsInstrumentation* stats_instrumentation, int layer_id) : BitmapContentLayerUpdater(painter.Pass(), stats_instrumentation, layer_id), pixels_did_change_(false) {} CachingBitmapContentLayerUpdater::~CachingBitmapContentLayerUpdater() {} void CachingBitmapContentLayerUpdater::PrepareToUpdate( gfx::Rect content_rect, gfx::Size tile_size, float contents_width_scale, float contents_height_scale, gfx::Rect* resulting_opaque_rect, RenderingStats* stats) { BitmapContentLayerUpdater::PrepareToUpdate(content_rect, tile_size, contents_width_scale, contents_height_scale, resulting_opaque_rect, stats); const SkBitmap& new_bitmap = canvas_->getDevice()->accessBitmap(false); SkAutoLockPixels lock(new_bitmap); DCHECK_GT(new_bitmap.bytesPerPixel(), 0); pixels_did_change_ = new_bitmap.config() != cached_bitmap_.config() || new_bitmap.height() != cached_bitmap_.height() || new_bitmap.width() != cached_bitmap_.width() || memcmp(new_bitmap.getPixels(), cached_bitmap_.getPixels(), new_bitmap.getSafeSize()); if (pixels_did_change_) new_bitmap.deepCopyTo(&cached_bitmap_, new_bitmap.config()); } } // namespace cc