Commit d0cb7fd1 authored by vmpstr's avatar vmpstr Committed by Commit bot

cc, images: Add auto finish draw class to ensure robustness.

This patch makes the code more robust in that it adds a class which
automatically calls image draw finished on exit. This ensures that
any changes to the code (more early outs) won't forget to call that
function.

R=ericrk
CQ_INCLUDE_TRYBOTS=master.tryserver.blink:linux_precise_blink_rel

Review-Url: https://codereview.chromium.org/2256833006
Cr-Commit-Position: refs/heads/master@{#413367}
parent b6e13876
...@@ -60,7 +60,25 @@ class AutoRemoveKeyFromTaskMap { ...@@ -60,7 +60,25 @@ class AutoRemoveKeyFromTaskMap {
std::unordered_map<SoftwareImageDecodeController::ImageKey, std::unordered_map<SoftwareImageDecodeController::ImageKey,
scoped_refptr<TileTask>, scoped_refptr<TileTask>,
SoftwareImageDecodeController::ImageKeyHash>* task_map_; 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 { class ImageDecodeTaskImpl : public TileTask {
...@@ -550,10 +568,10 @@ SoftwareImageDecodeController::GetSubrectImageDecode( ...@@ -550,10 +568,10 @@ SoftwareImageDecodeController::GetSubrectImageDecode(
auto decoded_draw_image = GetDecodedImageForDrawInternal( auto decoded_draw_image = GetDecodedImageForDrawInternal(
original_size_key, original_size_draw_image); original_size_key, original_size_draw_image);
if (!decoded_draw_image.image()) { AutoDrawWithImageFinished auto_finish_draw(this, original_size_draw_image,
DrawWithImageFinished(original_size_draw_image, decoded_draw_image); decoded_draw_image);
if (!decoded_draw_image.image())
return nullptr; return nullptr;
}
SkImageInfo subrect_info = CreateImageInfo( SkImageInfo subrect_info = CreateImageInfo(
key.target_size().width(), key.target_size().height(), format_); key.target_size().width(), key.target_size().height(), format_);
...@@ -577,8 +595,6 @@ SoftwareImageDecodeController::GetSubrectImageDecode( ...@@ -577,8 +595,6 @@ SoftwareImageDecodeController::GetSubrectImageDecode(
// We have a decoded image, and we're reading into already allocated memory. // We have a decoded image, and we're reading into already allocated memory.
// This should never fail. // This should never fail.
DCHECK(result); DCHECK(result);
// Release the original image, since we don't need it anymore.
DrawWithImageFinished(original_size_draw_image, decoded_draw_image);
} }
return base::WrapUnique( return base::WrapUnique(
new DecodedImage(subrect_info, std::move(subrect_pixels), new DecodedImage(subrect_info, std::move(subrect_pixels),
...@@ -605,10 +621,10 @@ SoftwareImageDecodeController::GetScaledImageDecode( ...@@ -605,10 +621,10 @@ SoftwareImageDecodeController::GetScaledImageDecode(
auto decoded_draw_image = GetDecodedImageForDrawInternal( auto decoded_draw_image = GetDecodedImageForDrawInternal(
original_size_key, original_size_draw_image); original_size_key, original_size_draw_image);
if (!decoded_draw_image.image()) { AutoDrawWithImageFinished auto_finish_draw(this, original_size_draw_image,
DrawWithImageFinished(original_size_draw_image, decoded_draw_image); decoded_draw_image);
if (!decoded_draw_image.image())
return nullptr; return nullptr;
}
SkPixmap decoded_pixmap; SkPixmap decoded_pixmap;
bool result = decoded_draw_image.image()->peekPixels(&decoded_pixmap); bool result = decoded_draw_image.image()->peekPixels(&decoded_pixmap);
...@@ -643,11 +659,6 @@ SoftwareImageDecodeController::GetScaledImageDecode( ...@@ -643,11 +659,6 @@ SoftwareImageDecodeController::GetScaledImageDecode(
DCHECK(result) << key.ToString(); 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( return base::WrapUnique(
new DecodedImage(scaled_info, std::move(scaled_pixels), new DecodedImage(scaled_info, std::move(scaled_pixels),
SkSize::Make(-key.src_rect().x(), -key.src_rect().y()), SkSize::Make(-key.src_rect().x(), -key.src_rect().y()),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment