Index: cc/tiles/software_image_decode_cache.cc |
diff --git a/cc/tiles/software_image_decode_cache.cc b/cc/tiles/software_image_decode_cache.cc |
index c40e5561bbd40c35efd77fab9d421e01f068a2a3..5616c3c35d2a53d748d906a2c43003cdca9117af 100644 |
--- a/cc/tiles/software_image_decode_cache.cc |
+++ b/cc/tiles/software_image_decode_cache.cc |
@@ -138,7 +138,7 @@ class ImageDecodeTaskImpl : public TileTask { |
SkSize GetScaleAdjustment(const ImageDecodeCacheKey& key) { |
// If the requested filter quality did not require scale, then the adjustment |
// is identity. |
- if (key.can_use_original_decode() || key.should_use_subrect()) { |
+ if (key.can_use_original_size_decode() || key.should_use_subrect()) { |
return SkSize::Make(1.f, 1.f); |
} else if (key.filter_quality() == kMedium_SkFilterQuality) { |
return MipMapUtil::GetScaleAdjustmentForSize(key.src_rect().size(), |
@@ -600,6 +600,10 @@ SoftwareImageDecodeCache::GetOriginalImageDecode(sk_sp<const SkImage> image) { |
return nullptr; |
} |
} |
+ |
+ // TODO(ccameron,msarett): Convert image to target color space. |
+ // http://crbug.com/706613 |
+ |
return base::MakeUnique<DecodedImage>(decoded_info, std::move(decoded_pixels), |
SkSize::Make(0, 0), |
next_tracing_id_.GetNext()); |
@@ -611,13 +615,13 @@ SoftwareImageDecodeCache::GetSubrectImageDecode(const ImageKey& key, |
// Construct a key to use in GetDecodedImageForDrawInternal(). |
// This allows us to reuse an image in any cache if available. |
gfx::Rect full_image_rect(image->width(), image->height()); |
- DrawImage original_size_draw_image(std::move(image), |
- gfx::RectToSkIRect(full_image_rect), |
- kNone_SkFilterQuality, SkMatrix::I()); |
+ DrawImage original_size_draw_image( |
+ std::move(image), gfx::RectToSkIRect(full_image_rect), |
+ kNone_SkFilterQuality, SkMatrix::I(), key.target_color_space()); |
ImageKey original_size_key = |
ImageKey::FromDrawImage(original_size_draw_image); |
// Sanity checks. |
- DCHECK(original_size_key.can_use_original_decode()) |
+ DCHECK(original_size_key.can_use_original_size_decode()) |
<< original_size_key.ToString(); |
DCHECK(full_image_rect.size() == original_size_key.target_size()); |
@@ -655,6 +659,10 @@ SoftwareImageDecodeCache::GetSubrectImageDecode(const ImageKey& key, |
// This should never fail. |
DCHECK(result); |
} |
+ |
+ // TODO(ccameron,msarett): Convert image to target color space. |
+ // http://crbug.com/706613 |
+ |
return base::WrapUnique( |
new DecodedImage(subrect_info, std::move(subrect_pixels), |
SkSize::Make(-key.src_rect().x(), -key.src_rect().y()), |
@@ -667,13 +675,13 @@ SoftwareImageDecodeCache::GetScaledImageDecode(const ImageKey& key, |
// Construct a key to use in GetDecodedImageForDrawInternal(). |
// This allows us to reuse an image in any cache if available. |
gfx::Rect full_image_rect(image->width(), image->height()); |
- DrawImage original_size_draw_image(std::move(image), |
- gfx::RectToSkIRect(full_image_rect), |
- kNone_SkFilterQuality, SkMatrix::I()); |
+ DrawImage original_size_draw_image( |
+ std::move(image), gfx::RectToSkIRect(full_image_rect), |
+ kNone_SkFilterQuality, SkMatrix::I(), key.target_color_space()); |
ImageKey original_size_key = |
ImageKey::FromDrawImage(original_size_draw_image); |
// Sanity checks. |
- DCHECK(original_size_key.can_use_original_decode()) |
+ DCHECK(original_size_key.can_use_original_size_decode()) |
<< original_size_key.ToString(); |
DCHECK(full_image_rect.size() == original_size_key.target_size()); |
@@ -717,6 +725,9 @@ SoftwareImageDecodeCache::GetScaledImageDecode(const ImageKey& key, |
DCHECK(result) << key.ToString(); |
} |
+ // TODO(ccameron,msarett): Convert image to target color space. |
+ // http://crbug.com/706613 |
+ |
return base::MakeUnique<DecodedImage>( |
scaled_info, std::move(scaled_pixels), |
SkSize::Make(-key.src_rect().x(), -key.src_rect().y()), |
@@ -966,10 +977,11 @@ ImageDecodeCacheKey ImageDecodeCacheKey::FromDrawImage(const DrawImage& image) { |
} |
} |
- bool can_use_original_decode = |
+ bool can_use_original_size_decode = |
quality == kLow_SkFilterQuality || quality == kNone_SkFilterQuality; |
+ |
bool should_use_subrect = false; |
- if (can_use_original_decode && |
+ if (can_use_original_size_decode && |
(image.image()->width() >= kMinDimensionToSubrect || |
image.image()->height() >= kMinDimensionToSubrect)) { |
base::CheckedNumeric<size_t> checked_original_size = 4u; |
@@ -986,7 +998,7 @@ ImageDecodeCacheKey ImageDecodeCacheKey::FromDrawImage(const DrawImage& image) { |
if (original_size > kMemoryThresholdToSubrect && |
src_rect_size <= original_size * kMemoryRatioToSubrect) { |
should_use_subrect = true; |
- can_use_original_decode = false; |
+ can_use_original_size_decode = false; |
} |
} |
@@ -997,7 +1009,7 @@ ImageDecodeCacheKey ImageDecodeCacheKey::FromDrawImage(const DrawImage& image) { |
if (!target_size.IsEmpty()) { |
if (should_use_subrect) |
target_size = src_rect.size(); |
- else if (can_use_original_decode) |
+ else if (can_use_original_size_decode) |
target_size = gfx::Size(image.image()->width(), image.image()->height()); |
} |
@@ -1009,23 +1021,26 @@ ImageDecodeCacheKey ImageDecodeCacheKey::FromDrawImage(const DrawImage& image) { |
} |
return ImageDecodeCacheKey(image.image()->uniqueID(), src_rect, target_size, |
- quality, can_use_original_decode, |
- should_use_subrect); |
+ image.target_color_space(), quality, |
+ can_use_original_size_decode, should_use_subrect); |
} |
-ImageDecodeCacheKey::ImageDecodeCacheKey(uint32_t image_id, |
- const gfx::Rect& src_rect, |
- const gfx::Size& target_size, |
- SkFilterQuality filter_quality, |
- bool can_use_original_decode, |
- bool should_use_subrect) |
+ImageDecodeCacheKey::ImageDecodeCacheKey( |
+ uint32_t image_id, |
+ const gfx::Rect& src_rect, |
+ const gfx::Size& target_size, |
+ const gfx::ColorSpace& target_color_space, |
+ SkFilterQuality filter_quality, |
+ bool can_use_original_size_decode, |
+ bool should_use_subrect) |
: image_id_(image_id), |
src_rect_(src_rect), |
target_size_(target_size), |
+ target_color_space_(target_color_space), |
filter_quality_(filter_quality), |
- can_use_original_decode_(can_use_original_decode), |
+ can_use_original_size_decode_(can_use_original_size_decode), |
should_use_subrect_(should_use_subrect) { |
- if (can_use_original_decode_) { |
+ if (can_use_original_size_decode_) { |
hash_ = std::hash<uint32_t>()(image_id_); |
} else { |
// TODO(vmpstr): This is a mess. Maybe it's faster to just search the vector |
@@ -1041,6 +1056,8 @@ ImageDecodeCacheKey::ImageDecodeCacheKey(uint32_t image_id, |
hash_ = base::HashInts(base::HashInts(src_rect_hash, target_size_hash), |
base::HashInts(image_id_, filter_quality_)); |
} |
+ // Include the target color space in the hash regardless of scaling. |
+ hash_ = base::HashInts(hash_, target_color_space.GetHash()); |
} |
ImageDecodeCacheKey::ImageDecodeCacheKey(const ImageDecodeCacheKey& other) = |
@@ -1051,8 +1068,9 @@ std::string ImageDecodeCacheKey::ToString() const { |
str << "id[" << image_id_ << "] src_rect[" << src_rect_.x() << "," |
<< src_rect_.y() << " " << src_rect_.width() << "x" << src_rect_.height() |
<< "] target_size[" << target_size_.width() << "x" |
- << target_size_.height() << "] filter_quality[" << filter_quality_ |
- << "] can_use_original_decode [" << can_use_original_decode_ |
+ << target_size_.height() << "] target_color_space" |
+ << target_color_space_.ToString() << " filter_quality[" << filter_quality_ |
+ << "] can_use_original_size_decode [" << can_use_original_size_decode_ |
<< "] should_use_subrect [" << should_use_subrect_ << "] hash [" << hash_ |
<< "]"; |
return str.str(); |