OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/tiles/software_image_decode_controller.h" | 5 #include "cc/tiles/software_image_decode_controller.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <functional> | 9 #include <functional> |
10 | 10 |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
100 key.target_size().width() / static_cast<float>(key.src_rect().width()); | 100 key.target_size().width() / static_cast<float>(key.src_rect().width()); |
101 float y_scale = | 101 float y_scale = |
102 key.target_size().height() / static_cast<float>(key.src_rect().height()); | 102 key.target_size().height() / static_cast<float>(key.src_rect().height()); |
103 return SkSize::Make(x_scale, y_scale); | 103 return SkSize::Make(x_scale, y_scale); |
104 } | 104 } |
105 | 105 |
106 SkFilterQuality GetDecodedFilterQuality(const ImageDecodeControllerKey& key) { | 106 SkFilterQuality GetDecodedFilterQuality(const ImageDecodeControllerKey& key) { |
107 return std::min(key.filter_quality(), kLow_SkFilterQuality); | 107 return std::min(key.filter_quality(), kLow_SkFilterQuality); |
108 } | 108 } |
109 | 109 |
110 SkColorType SkColorTypeForDecoding(ResourceFormat format) { | |
111 // Use kN32_SkColorType if there is no corresponding SkColorType. | |
112 switch (format) { | |
113 case RGBA_4444: | |
114 return kARGB_4444_SkColorType; | |
115 case RGBA_8888: | |
116 case BGRA_8888: | |
117 return kN32_SkColorType; | |
118 case ALPHA_8: | |
119 return kAlpha_8_SkColorType; | |
120 case RGB_565: | |
121 return kRGB_565_SkColorType; | |
122 case LUMINANCE_8: | |
reed1
2016/03/17 14:38:23
kGray_8_SkColorType
bashi
2016/03/17 23:29:38
Done.
| |
123 case ETC1: | |
124 case RED_8: | |
125 case LUMINANCE_F16: | |
reed1
2016/03/17 14:38:23
BTW -- not hard for Skia to add native support for
bashi
2016/03/17 23:29:38
I'm not sure but I guess that LUM_16 is not common
| |
126 return kN32_SkColorType; | |
127 } | |
128 NOTREACHED(); | |
129 return kN32_SkColorType; | |
130 } | |
131 | |
132 SkImageInfo CreateImageInfo(size_t width, | |
133 size_t height, | |
134 ResourceFormat format) { | |
135 return SkImageInfo::Make(width, height, SkColorTypeForDecoding(format), | |
136 kPremul_SkAlphaType); | |
reed1
2016/03/17 14:38:23
FYI -- Skia is actively working on native support
| |
137 } | |
138 | |
110 } // namespace | 139 } // namespace |
111 | 140 |
112 SoftwareImageDecodeController::SoftwareImageDecodeController() | 141 SoftwareImageDecodeController::SoftwareImageDecodeController( |
142 ResourceFormat format) | |
113 : decoded_images_(ImageMRUCache::NO_AUTO_EVICT), | 143 : decoded_images_(ImageMRUCache::NO_AUTO_EVICT), |
114 at_raster_decoded_images_(ImageMRUCache::NO_AUTO_EVICT), | 144 at_raster_decoded_images_(ImageMRUCache::NO_AUTO_EVICT), |
115 locked_images_budget_(kLockedMemoryLimitBytes) {} | 145 locked_images_budget_(kLockedMemoryLimitBytes), |
146 format_(format) {} | |
116 | 147 |
117 SoftwareImageDecodeController::~SoftwareImageDecodeController() { | 148 SoftwareImageDecodeController::~SoftwareImageDecodeController() { |
118 DCHECK_EQ(0u, decoded_images_ref_counts_.size()); | 149 DCHECK_EQ(0u, decoded_images_ref_counts_.size()); |
119 DCHECK_EQ(0u, at_raster_decoded_images_ref_counts_.size()); | 150 DCHECK_EQ(0u, at_raster_decoded_images_ref_counts_.size()); |
120 } | 151 } |
121 | 152 |
122 bool SoftwareImageDecodeController::GetTaskForImageAndRef( | 153 bool SoftwareImageDecodeController::GetTaskForImageAndRef( |
123 const DrawImage& image, | 154 const DrawImage& image, |
124 uint64_t prepare_tiles_id, | 155 uint64_t prepare_tiles_id, |
125 scoped_refptr<ImageDecodeTask>* task) { | 156 scoped_refptr<ImageDecodeTask>* task) { |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
338 const DrawImage& draw_image) { | 369 const DrawImage& draw_image) { |
339 TRACE_EVENT1("disabled-by-default-cc.debug", | 370 TRACE_EVENT1("disabled-by-default-cc.debug", |
340 "SoftwareImageDecodeController::DecodeImageInternal", "key", | 371 "SoftwareImageDecodeController::DecodeImageInternal", "key", |
341 key.ToString()); | 372 key.ToString()); |
342 const SkImage* image = draw_image.image(); | 373 const SkImage* image = draw_image.image(); |
343 | 374 |
344 // If we can use the original decode, then we don't need to do scaling. We can | 375 // If we can use the original decode, then we don't need to do scaling. We can |
345 // just read pixels into the final memory. | 376 // just read pixels into the final memory. |
346 if (key.can_use_original_decode()) { | 377 if (key.can_use_original_decode()) { |
347 SkImageInfo decoded_info = | 378 SkImageInfo decoded_info = |
348 SkImageInfo::MakeN32Premul(image->width(), image->height()); | 379 CreateImageInfo(image->width(), image->height(), format_); |
349 scoped_ptr<base::DiscardableMemory> decoded_pixels; | 380 scoped_ptr<base::DiscardableMemory> decoded_pixels; |
350 { | 381 { |
351 TRACE_EVENT0( | 382 TRACE_EVENT0( |
352 "disabled-by-default-cc.debug", | 383 "disabled-by-default-cc.debug", |
353 "SoftwareImageDecodeController::DecodeImageInternal - allocate " | 384 "SoftwareImageDecodeController::DecodeImageInternal - allocate " |
354 "decoded pixels"); | 385 "decoded pixels"); |
355 decoded_pixels = | 386 decoded_pixels = |
356 base::DiscardableMemoryAllocator::GetInstance() | 387 base::DiscardableMemoryAllocator::GetInstance() |
357 ->AllocateLockedDiscardableMemory(decoded_info.minRowBytes() * | 388 ->AllocateLockedDiscardableMemory(decoded_info.minRowBytes() * |
358 decoded_info.height()); | 389 decoded_info.height()); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
407 DCHECK(result); | 438 DCHECK(result); |
408 if (key.src_rect() != full_image_rect) { | 439 if (key.src_rect() != full_image_rect) { |
409 result = decoded_pixmap.extractSubset(&decoded_pixmap, | 440 result = decoded_pixmap.extractSubset(&decoded_pixmap, |
410 gfx::RectToSkIRect(key.src_rect())); | 441 gfx::RectToSkIRect(key.src_rect())); |
411 DCHECK(result); | 442 DCHECK(result); |
412 } | 443 } |
413 | 444 |
414 // Now we have a decoded_pixmap which represents the src_rect at the | 445 // Now we have a decoded_pixmap which represents the src_rect at the |
415 // original scale. All we need to do is scale it. | 446 // original scale. All we need to do is scale it. |
416 DCHECK(!key.target_size().IsEmpty()); | 447 DCHECK(!key.target_size().IsEmpty()); |
417 SkImageInfo scaled_info = SkImageInfo::MakeN32Premul( | 448 SkImageInfo scaled_info = CreateImageInfo( |
418 key.target_size().width(), key.target_size().height()); | 449 key.target_size().width(), key.target_size().height(), format_); |
419 scoped_ptr<base::DiscardableMemory> scaled_pixels; | 450 scoped_ptr<base::DiscardableMemory> scaled_pixels; |
420 { | 451 { |
421 TRACE_EVENT0( | 452 TRACE_EVENT0( |
422 "disabled-by-default-cc.debug", | 453 "disabled-by-default-cc.debug", |
423 "SoftwareImageDecodeController::DecodeImageInternal - allocate " | 454 "SoftwareImageDecodeController::DecodeImageInternal - allocate " |
424 "scaled pixels"); | 455 "scaled pixels"); |
425 scaled_pixels = base::DiscardableMemoryAllocator::GetInstance() | 456 scaled_pixels = base::DiscardableMemoryAllocator::GetInstance() |
426 ->AllocateLockedDiscardableMemory( | 457 ->AllocateLockedDiscardableMemory( |
427 scaled_info.minRowBytes() * scaled_info.height()); | 458 scaled_info.minRowBytes() * scaled_info.height()); |
428 } | 459 } |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
852 void SoftwareImageDecodeController::MemoryBudget::ResetUsage() { | 883 void SoftwareImageDecodeController::MemoryBudget::ResetUsage() { |
853 current_usage_bytes_ = 0; | 884 current_usage_bytes_ = 0; |
854 } | 885 } |
855 | 886 |
856 size_t SoftwareImageDecodeController::MemoryBudget::GetCurrentUsageSafe() | 887 size_t SoftwareImageDecodeController::MemoryBudget::GetCurrentUsageSafe() |
857 const { | 888 const { |
858 return current_usage_bytes_.ValueOrDie(); | 889 return current_usage_bytes_.ValueOrDie(); |
859 } | 890 } |
860 | 891 |
861 } // namespace cc | 892 } // namespace cc |
OLD | NEW |