Chromium Code Reviews| Index: cc/resources/resource_provider.cc |
| diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc |
| index bd2b5a883e534d68850a53765060d1b3b4210593..e34909e81144de4761bc55bd3af50b7786a499fe 100644 |
| --- a/cc/resources/resource_provider.cc |
| +++ b/cc/resources/resource_provider.cc |
| @@ -389,28 +389,31 @@ SkCanvas* ResourceProvider::RasterBuffer::LockForWrite() { |
| return locked_canvas_; |
| } |
| -void ResourceProvider::RasterBuffer::UnlockForWrite() { |
| +bool ResourceProvider::RasterBuffer::UnlockForWrite() { |
| if (locked_canvas_) { |
| locked_canvas_->restoreToCount(canvas_save_count_); |
| locked_canvas_ = NULL; |
| } |
| - DoUnlockForWrite(); |
| + return DoUnlockForWrite(); |
| } |
| ResourceProvider::DirectRasterBuffer::DirectRasterBuffer( |
| const Resource* resource, |
| ResourceProvider* resource_provider) |
| - : RasterBuffer(resource, resource_provider) {} |
| + : RasterBuffer(resource, resource_provider), surface_generation_id_(0u) {} |
| ResourceProvider::DirectRasterBuffer::~DirectRasterBuffer() {} |
| SkCanvas* ResourceProvider::DirectRasterBuffer::DoLockForWrite() { |
| if (!surface_) |
| surface_ = CreateSurface(); |
| + surface_generation_id_ = surface_ ? surface_->generationID() : 0u; |
| return surface_ ? surface_->getCanvas() : NULL; |
| } |
| -void ResourceProvider::DirectRasterBuffer::DoUnlockForWrite() {} |
| +bool ResourceProvider::DirectRasterBuffer::DoUnlockForWrite() { |
| + return surface_ ? surface_generation_id_ != surface_->generationID() : false; |
| +} |
| skia::RefPtr<SkSurface> ResourceProvider::DirectRasterBuffer::CreateSurface() { |
| skia::RefPtr<SkSurface> surface; |
| @@ -453,7 +456,9 @@ skia::RefPtr<SkSurface> ResourceProvider::DirectRasterBuffer::CreateSurface() { |
| ResourceProvider::BitmapRasterBuffer::BitmapRasterBuffer( |
| const Resource* resource, |
| ResourceProvider* resource_provider) |
| - : RasterBuffer(resource, resource_provider), mapped_buffer_(NULL) {} |
| + : RasterBuffer(resource, resource_provider), |
| + mapped_buffer_(NULL), |
| + raster_bitmap_generation_id_(0u) {} |
| ResourceProvider::BitmapRasterBuffer::~BitmapRasterBuffer() {} |
| @@ -492,19 +497,26 @@ SkCanvas* ResourceProvider::BitmapRasterBuffer::DoLockForWrite() { |
| skia::RefPtr<SkBitmapDevice> device = |
| skia::AdoptRef(new SkBitmapDevice(raster_bitmap_)); |
| raster_canvas_ = skia::AdoptRef(new SkCanvas(device.get())); |
| + raster_bitmap_generation_id_ = raster_bitmap_.getGenerationID(); |
| return raster_canvas_.get(); |
| } |
| -void ResourceProvider::BitmapRasterBuffer::DoUnlockForWrite() { |
| +bool ResourceProvider::BitmapRasterBuffer::DoUnlockForWrite() { |
| raster_canvas_.clear(); |
| - SkBitmap::Config buffer_config = SkBitmapConfig(resource()->format); |
| - if (mapped_buffer_ && (buffer_config != raster_bitmap_.config())) |
| - CopyBitmap(raster_bitmap_, mapped_buffer_, buffer_config); |
| + bool raster_bitmap_changed = |
| + raster_bitmap_generation_id_ != raster_bitmap_.getGenerationID(); |
|
vmpstr
2014/02/19 00:49:31
Is this like a good check? According to skia heade
reveman
2014/02/19 01:41:13
Done.
|
| + |
| + if (raster_bitmap_changed) { |
| + SkBitmap::Config buffer_config = SkBitmapConfig(resource()->format); |
| + if (mapped_buffer_ && (buffer_config != raster_bitmap_.config())) |
| + CopyBitmap(raster_bitmap_, mapped_buffer_, buffer_config); |
| + } |
| raster_bitmap_.reset(); |
| UnmapBuffer(); |
| mapped_buffer_ = NULL; |
| + return raster_bitmap_changed; |
| } |
| ResourceProvider::ImageRasterBuffer::ImageRasterBuffer( |
| @@ -1737,10 +1749,10 @@ SkCanvas* ResourceProvider::MapPixelRasterBuffer(ResourceId id) { |
| return resource->pixel_raster_buffer->LockForWrite(); |
| } |
| -void ResourceProvider::UnmapPixelRasterBuffer(ResourceId id) { |
| +bool ResourceProvider::UnmapPixelRasterBuffer(ResourceId id) { |
| Resource* resource = GetResource(id); |
| DCHECK(resource->pixel_raster_buffer.get()); |
| - resource->pixel_raster_buffer->UnlockForWrite(); |
| + return resource->pixel_raster_buffer->UnlockForWrite(); |
| } |
| void ResourceProvider::AcquirePixelBuffer(Resource* resource) { |