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 {
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()),
......
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