Index: cc/tiles/software_image_decode_controller.cc |
diff --git a/cc/tiles/software_image_decode_controller.cc b/cc/tiles/software_image_decode_controller.cc |
index ee19c9a10168ba690b06c04cae8212f594bcb920..f262e86463ff86f9cc79f6f77619d049a3410e28 100644 |
--- a/cc/tiles/software_image_decode_controller.cc |
+++ b/cc/tiles/software_image_decode_controller.cc |
@@ -60,7 +60,25 @@ class AutoRemoveKeyFromTaskMap { |
std::unordered_map<SoftwareImageDecodeController::ImageKey, |
scoped_refptr<TileTask>, |
SoftwareImageDecodeController::ImageKeyHash>* task_map_; |
- SoftwareImageDecodeController::ImageKey key_; |
+ const SoftwareImageDecodeController::ImageKey& key_; |
+}; |
+ |
+class AutoDrawWithImageFinished { |
+ public: |
+ AutoDrawWithImageFinished(SoftwareImageDecodeController* controller, |
+ const DrawImage& draw_image, |
+ const DecodedDrawImage& decoded_draw_image) |
+ : controller_(controller), |
+ draw_image_(draw_image), |
+ decoded_draw_image_(decoded_draw_image) {} |
+ ~AutoDrawWithImageFinished() { |
+ controller_->DrawWithImageFinished(draw_image_, decoded_draw_image_); |
+ } |
+ |
+ private: |
+ SoftwareImageDecodeController* controller_; |
+ const DrawImage& draw_image_; |
+ const DecodedDrawImage& decoded_draw_image_; |
}; |
class ImageDecodeTaskImpl : public TileTask { |
@@ -550,10 +568,10 @@ SoftwareImageDecodeController::GetSubrectImageDecode( |
auto decoded_draw_image = GetDecodedImageForDrawInternal( |
original_size_key, original_size_draw_image); |
- if (!decoded_draw_image.image()) { |
- DrawWithImageFinished(original_size_draw_image, decoded_draw_image); |
+ AutoDrawWithImageFinished auto_finish_draw(this, original_size_draw_image, |
+ decoded_draw_image); |
+ if (!decoded_draw_image.image()) |
return nullptr; |
- } |
SkImageInfo subrect_info = CreateImageInfo( |
key.target_size().width(), key.target_size().height(), format_); |
@@ -577,8 +595,6 @@ SoftwareImageDecodeController::GetSubrectImageDecode( |
// We have a decoded image, and we're reading into already allocated memory. |
// This should never fail. |
DCHECK(result); |
- // Release the original image, since we don't need it anymore. |
- DrawWithImageFinished(original_size_draw_image, decoded_draw_image); |
} |
return base::WrapUnique( |
new DecodedImage(subrect_info, std::move(subrect_pixels), |
@@ -605,10 +621,10 @@ SoftwareImageDecodeController::GetScaledImageDecode( |
auto decoded_draw_image = GetDecodedImageForDrawInternal( |
original_size_key, original_size_draw_image); |
- if (!decoded_draw_image.image()) { |
- DrawWithImageFinished(original_size_draw_image, decoded_draw_image); |
+ AutoDrawWithImageFinished auto_finish_draw(this, original_size_draw_image, |
+ decoded_draw_image); |
+ if (!decoded_draw_image.image()) |
return nullptr; |
- } |
SkPixmap decoded_pixmap; |
bool result = decoded_draw_image.image()->peekPixels(&decoded_pixmap); |
@@ -643,11 +659,6 @@ SoftwareImageDecodeController::GetScaledImageDecode( |
DCHECK(result) << key.ToString(); |
} |
- // Release the original sized decode. Any other intermediate result to release |
- // would be the subrect memory. However, that's in a scoped_ptr and will be |
- // deleted automatically when we return. |
- DrawWithImageFinished(original_size_draw_image, decoded_draw_image); |
- |
return base::WrapUnique( |
new DecodedImage(scaled_info, std::move(scaled_pixels), |
SkSize::Make(-key.src_rect().x(), -key.src_rect().y()), |