| Index: cc/resources/image_raster_worker_pool.cc
|
| diff --git a/cc/resources/image_raster_worker_pool.cc b/cc/resources/image_raster_worker_pool.cc
|
| index 5800ce1f8c0cb3c0d92428140c19eed475a30a70..24b5089b1245d4445b44795e2bc5a289cffd94bf 100644
|
| --- a/cc/resources/image_raster_worker_pool.cc
|
| +++ b/cc/resources/image_raster_worker_pool.cc
|
| @@ -14,7 +14,8 @@ namespace {
|
|
|
| class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask {
|
| public:
|
| - typedef base::Callback<void(bool was_canceled)> Reply;
|
| + typedef base::Callback<void(bool was_canceled, bool map_image_successful)>
|
| + Reply;
|
|
|
| ImageWorkerPoolTaskImpl(internal::RasterWorkerPoolTask* task,
|
| TaskVector* dependencies,
|
| @@ -30,7 +31,9 @@ class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask {
|
|
|
| // Overridden from internal::WorkerPoolTask:
|
| virtual void RunOnThread(unsigned thread_index) OVERRIDE {
|
| - DCHECK(buffer_);
|
| + if (!buffer_)
|
| + return;
|
| +
|
| SkBitmap bitmap;
|
| bitmap.setConfig(SkBitmap::kARGB_8888_Config,
|
| task_->resource()->size().width(),
|
| @@ -41,7 +44,7 @@ class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask {
|
| task_->RunOnThread(&device, thread_index);
|
| }
|
| virtual void DispatchCompletionCallback() OVERRIDE {
|
| - reply_.Run(!HasFinishedRunning());
|
| + reply_.Run(!HasFinishedRunning(), !!buffer_);
|
| }
|
|
|
| private:
|
| @@ -95,7 +98,9 @@ void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) {
|
|
|
| // Map image for raster.
|
| uint8* buffer = resource_provider()->MapImage(task->resource()->id());
|
| - int stride = resource_provider()->GetImageStride(task->resource()->id());
|
| + int stride = 0;
|
| + if (buffer)
|
| + stride = resource_provider()->GetImageStride(task->resource()->id());
|
|
|
| // TODO(reveman): Avoid having to make a copy of dependencies.
|
| internal::WorkerPoolTask::TaskVector dependencies = task->dependencies();
|
| @@ -124,17 +129,20 @@ void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) {
|
|
|
| void ImageRasterWorkerPool::OnRasterTaskCompleted(
|
| scoped_refptr<internal::RasterWorkerPoolTask> task,
|
| - bool was_canceled) {
|
| + bool was_canceled,
|
| + bool map_image_successful) {
|
| TRACE_EVENT1("cc", "ImageRasterWorkerPool::OnRasterTaskCompleted",
|
| "was_canceled", was_canceled);
|
|
|
| DCHECK(image_tasks_.find(task) != image_tasks_.end());
|
|
|
| - // Balanced with MapImage() call in ScheduleTasks().
|
| - resource_provider()->UnmapImage(task->resource()->id());
|
| + if (map_image_successful) {
|
| + // Balanced with MapImage() call in ScheduleTasks().
|
| + resource_provider()->UnmapImage(task->resource()->id());
|
|
|
| - // Bind image to resource.
|
| - resource_provider()->BindImage(task->resource()->id());
|
| + // Bind image to resource.
|
| + resource_provider()->BindImage(task->resource()->id());
|
| + }
|
|
|
| if (!was_canceled)
|
| task->DidRun();
|
|
|