Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(119)

Side by Side Diff: third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.cpp

Issue 2787053004: Respect colorSpace in DecodingImageGenerator::onGetPixels() (Closed)
Patch Set: Rebase Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 decoder_color_behavior_(color_behavior), 123 decoder_color_behavior_(color_behavior),
124 is_multi_frame_(is_multi_frame), 124 is_multi_frame_(is_multi_frame),
125 decode_failed_(false), 125 decode_failed_(false),
126 yuv_decoding_failed_(false), 126 yuv_decoding_failed_(false),
127 frame_count_(0) {} 127 frame_count_(0) {}
128 128
129 ImageFrameGenerator::~ImageFrameGenerator() { 129 ImageFrameGenerator::~ImageFrameGenerator() {
130 ImageDecodingStore::Instance().RemoveCacheIndexedByGenerator(this); 130 ImageDecodingStore::Instance().RemoveCacheIndexedByGenerator(this);
131 } 131 }
132 132
133 bool ImageFrameGenerator::DecodeAndScale(SegmentReader* data, 133 bool ImageFrameGenerator::DecodeAndScale(
134 bool all_data_received, 134 SegmentReader* data,
135 size_t index, 135 bool all_data_received,
136 const SkImageInfo& info, 136 size_t index,
137 void* pixels, 137 const SkImageInfo& info,
138 size_t row_bytes) { 138 void* pixels,
139 size_t row_bytes,
140 ImageDecoder::AlphaOption alpha_option) {
139 if (decode_failed_) 141 if (decode_failed_)
140 return false; 142 return false;
141 143
142 TRACE_EVENT1("blink", "ImageFrameGenerator::decodeAndScale", "frame index", 144 TRACE_EVENT1("blink", "ImageFrameGenerator::decodeAndScale", "frame index",
143 static_cast<int>(index)); 145 static_cast<int>(index));
144 146
145 // This implementation does not support scaling so check the requested size. 147 // This implementation does not support scaling so check the requested size.
146 SkISize scaled_size = SkISize::Make(info.width(), info.height()); 148 SkISize scaled_size = SkISize::Make(info.width(), info.height());
147 DCHECK(full_size_ == scaled_size); 149 DCHECK(full_size_ == scaled_size);
148 150
149 // It is okay to allocate ref-counted ExternalMemoryAllocator on the stack, 151 // It is okay to allocate ref-counted ExternalMemoryAllocator on the stack,
150 // because 1) it contains references to memory that will be invalid after 152 // because 1) it contains references to memory that will be invalid after
151 // returning (i.e. a pointer to |pixels|) and therefore 2) should not live 153 // returning (i.e. a pointer to |pixels|) and therefore 2) should not live
152 // longer than the call to the current method. 154 // longer than the call to the current method.
153 ExternalMemoryAllocator external_allocator(info, pixels, row_bytes); 155 ExternalMemoryAllocator external_allocator(info, pixels, row_bytes);
154 SkBitmap bitmap = TryToResumeDecode(data, all_data_received, index, 156 SkBitmap bitmap =
155 scaled_size, &external_allocator); 157 TryToResumeDecode(data, all_data_received, index, scaled_size,
158 &external_allocator, alpha_option);
156 DCHECK(external_allocator.unique()); // Verify we have the only ref-count. 159 DCHECK(external_allocator.unique()); // Verify we have the only ref-count.
157 160
158 if (bitmap.isNull()) 161 if (bitmap.isNull())
159 return false; 162 return false;
160 163
161 // Check to see if the decoder has written directly to the pixel memory 164 // Check to see if the decoder has written directly to the pixel memory
162 // provided. If not, make a copy. 165 // provided. If not, make a copy.
163 DCHECK_EQ(bitmap.width(), scaled_size.width()); 166 DCHECK_EQ(bitmap.width(), scaled_size.width());
164 DCHECK_EQ(bitmap.height(), scaled_size.height()); 167 DCHECK_EQ(bitmap.height(), scaled_size.height());
165 SkAutoLockPixels bitmap_lock(bitmap); 168 SkAutoLockPixels bitmap_lock(bitmap);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 DCHECK(decoder->Failed()); 210 DCHECK(decoder->Failed());
208 yuv_decoding_failed_ = true; 211 yuv_decoding_failed_ = true;
209 return false; 212 return false;
210 } 213 }
211 214
212 SkBitmap ImageFrameGenerator::TryToResumeDecode( 215 SkBitmap ImageFrameGenerator::TryToResumeDecode(
213 SegmentReader* data, 216 SegmentReader* data,
214 bool all_data_received, 217 bool all_data_received,
215 size_t index, 218 size_t index,
216 const SkISize& scaled_size, 219 const SkISize& scaled_size,
217 SkBitmap::Allocator* allocator) { 220 SkBitmap::Allocator* allocator,
221 ImageDecoder::AlphaOption alpha_option) {
218 TRACE_EVENT1("blink", "ImageFrameGenerator::tryToResumeDecode", "frame index", 222 TRACE_EVENT1("blink", "ImageFrameGenerator::tryToResumeDecode", "frame index",
219 static_cast<int>(index)); 223 static_cast<int>(index));
220 224
221 ImageDecoder* decoder = 0; 225 ImageDecoder* decoder = 0;
222 226
223 // Lock the mutex, so only one thread can use the decoder at once. 227 // Lock the mutex, so only one thread can use the decoder at once.
224 MutexLocker lock(decode_mutex_); 228 MutexLocker lock(decode_mutex_);
225 const bool resume_decoding = 229 const bool resume_decoding = ImageDecodingStore::Instance().LockDecoder(
226 ImageDecodingStore::Instance().LockDecoder(this, full_size_, &decoder); 230 this, full_size_, alpha_option, &decoder);
227 DCHECK(!resume_decoding || decoder); 231 DCHECK(!resume_decoding || decoder);
228 232
229 SkBitmap full_size_image; 233 SkBitmap full_size_image;
230 bool complete = Decode(data, all_data_received, index, &decoder, 234 bool complete = Decode(data, all_data_received, index, &decoder,
231 &full_size_image, allocator); 235 &full_size_image, allocator, alpha_option);
232 236
233 if (!decoder) 237 if (!decoder)
234 return SkBitmap(); 238 return SkBitmap();
235 239
236 // If we are not resuming decoding that means the decoder is freshly 240 // If we are not resuming decoding that means the decoder is freshly
237 // created and we have ownership. If we are resuming decoding then 241 // created and we have ownership. If we are resuming decoding then
238 // the decoder is owned by ImageDecodingStore. 242 // the decoder is owned by ImageDecodingStore.
239 std::unique_ptr<ImageDecoder> decoder_container; 243 std::unique_ptr<ImageDecoder> decoder_container;
240 if (!resume_decoding) 244 if (!resume_decoding)
241 decoder_container = WTF::WrapUnique(decoder); 245 decoder_container = WTF::WrapUnique(decoder);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 has_alpha_[i] = true; 290 has_alpha_[i] = true;
287 } 291 }
288 has_alpha_[index] = has_alpha; 292 has_alpha_[index] = has_alpha;
289 } 293 }
290 294
291 bool ImageFrameGenerator::Decode(SegmentReader* data, 295 bool ImageFrameGenerator::Decode(SegmentReader* data,
292 bool all_data_received, 296 bool all_data_received,
293 size_t index, 297 size_t index,
294 ImageDecoder** decoder, 298 ImageDecoder** decoder,
295 SkBitmap* bitmap, 299 SkBitmap* bitmap,
296 SkBitmap::Allocator* allocator) { 300 SkBitmap::Allocator* allocator,
301 ImageDecoder::AlphaOption alpha_option) {
297 #if DCHECK_IS_ON() 302 #if DCHECK_IS_ON()
298 DCHECK(decode_mutex_.Locked()); 303 DCHECK(decode_mutex_.Locked());
299 #endif 304 #endif
300 TRACE_EVENT2("blink", "ImageFrameGenerator::decode", "width", 305 TRACE_EVENT2("blink", "ImageFrameGenerator::decode", "width",
301 full_size_.width(), "height", full_size_.height()); 306 full_size_.width(), "height", full_size_.height());
302 307
303 // Try to create an ImageDecoder if we are not given one. 308 // Try to create an ImageDecoder if we are not given one.
304 DCHECK(decoder); 309 DCHECK(decoder);
305 bool new_decoder = false; 310 bool new_decoder = false;
306 bool should_call_set_data = true; 311 bool should_call_set_data = true;
307 if (!*decoder) { 312 if (!*decoder) {
308 new_decoder = true; 313 new_decoder = true;
309 if (image_decoder_factory_) 314 if (image_decoder_factory_)
310 *decoder = image_decoder_factory_->Create().release(); 315 *decoder = image_decoder_factory_->Create().release();
311 316
312 if (!*decoder) { 317 if (!*decoder) {
313 *decoder = ImageDecoder::Create(data, all_data_received, 318 *decoder = ImageDecoder::Create(data, all_data_received, alpha_option,
314 ImageDecoder::kAlphaPremultiplied,
315 decoder_color_behavior_) 319 decoder_color_behavior_)
316 .release(); 320 .release();
317 // The newly created decoder just grabbed the data. No need to reset it. 321 // The newly created decoder just grabbed the data. No need to reset it.
318 should_call_set_data = false; 322 should_call_set_data = false;
319 } 323 }
320 324
321 if (!*decoder) 325 if (!*decoder)
322 return false; 326 return false;
323 } 327 }
324 328
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 // do YUV decoding. 401 // do YUV decoding.
398 std::unique_ptr<ImagePlanes> dummy_image_planes = 402 std::unique_ptr<ImagePlanes> dummy_image_planes =
399 WTF::WrapUnique(new ImagePlanes); 403 WTF::WrapUnique(new ImagePlanes);
400 decoder->SetImagePlanes(std::move(dummy_image_planes)); 404 decoder->SetImagePlanes(std::move(dummy_image_planes));
401 405
402 return UpdateYUVComponentSizes(decoder.get(), size_info->fSizes, 406 return UpdateYUVComponentSizes(decoder.get(), size_info->fSizes,
403 size_info->fWidthBytes); 407 size_info->fWidthBytes);
404 } 408 }
405 409
406 } // namespace blink 410 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698