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

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

Issue 2787053004: Respect colorSpace in DecodingImageGenerator::onGetPixels() (Closed)
Patch Set: Response to comments 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 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 decoder_color_behavior_(color_behavior), 110 decoder_color_behavior_(color_behavior),
111 is_multi_frame_(is_multi_frame), 111 is_multi_frame_(is_multi_frame),
112 decode_failed_(false), 112 decode_failed_(false),
113 yuv_decoding_failed_(false), 113 yuv_decoding_failed_(false),
114 frame_count_(0) {} 114 frame_count_(0) {}
115 115
116 ImageFrameGenerator::~ImageFrameGenerator() { 116 ImageFrameGenerator::~ImageFrameGenerator() {
117 ImageDecodingStore::Instance().RemoveCacheIndexedByGenerator(this); 117 ImageDecodingStore::Instance().RemoveCacheIndexedByGenerator(this);
118 } 118 }
119 119
120 bool ImageFrameGenerator::DecodeAndScale(SegmentReader* data, 120 bool ImageFrameGenerator::DecodeAndScale(
121 bool all_data_received, 121 SegmentReader* data,
122 size_t index, 122 bool all_data_received,
123 const SkImageInfo& info, 123 size_t index,
124 void* pixels, 124 const SkImageInfo& info,
125 size_t row_bytes) { 125 void* pixels,
126 size_t row_bytes,
127 ImageDecoder::AlphaOption alpha_option) {
126 if (decode_failed_) 128 if (decode_failed_)
127 return false; 129 return false;
128 130
129 TRACE_EVENT1("blink", "ImageFrameGenerator::decodeAndScale", "frame index", 131 TRACE_EVENT1("blink", "ImageFrameGenerator::decodeAndScale", "frame index",
130 static_cast<int>(index)); 132 static_cast<int>(index));
131 133
132 // This implementation does not support scaling so check the requested size. 134 // This implementation does not support scaling so check the requested size.
133 SkISize scaled_size = SkISize::Make(info.width(), info.height()); 135 SkISize scaled_size = SkISize::Make(info.width(), info.height());
134 ASSERT(full_size_ == scaled_size); 136 ASSERT(full_size_ == scaled_size);
135 137
136 // It is okay to allocate ref-counted ExternalMemoryAllocator on the stack, 138 // It is okay to allocate ref-counted ExternalMemoryAllocator on the stack,
137 // because 1) it contains references to memory that will be invalid after 139 // because 1) it contains references to memory that will be invalid after
138 // returning (i.e. a pointer to |pixels|) and therefore 2) should not live 140 // returning (i.e. a pointer to |pixels|) and therefore 2) should not live
139 // longer than the call to the current method. 141 // longer than the call to the current method.
140 ExternalMemoryAllocator external_allocator(info, pixels, row_bytes); 142 ExternalMemoryAllocator external_allocator(info, pixels, row_bytes);
141 SkBitmap bitmap = TryToResumeDecode(data, all_data_received, index, 143 SkBitmap bitmap =
142 scaled_size, &external_allocator); 144 TryToResumeDecode(data, all_data_received, index, scaled_size,
145 &external_allocator, alpha_option);
143 DCHECK(external_allocator.unique()); // Verify we have the only ref-count. 146 DCHECK(external_allocator.unique()); // Verify we have the only ref-count.
144 147
145 if (bitmap.isNull()) 148 if (bitmap.isNull())
146 return false; 149 return false;
147 150
148 // Check to see if the decoder has written directly to the pixel memory 151 // Check to see if the decoder has written directly to the pixel memory
149 // provided. If not, make a copy. 152 // provided. If not, make a copy.
150 ASSERT(bitmap.width() == scaled_size.width()); 153 ASSERT(bitmap.width() == scaled_size.width());
151 ASSERT(bitmap.height() == scaled_size.height()); 154 ASSERT(bitmap.height() == scaled_size.height());
152 SkAutoLockPixels bitmap_lock(bitmap); 155 SkAutoLockPixels bitmap_lock(bitmap);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 ASSERT(decoder->Failed()); 197 ASSERT(decoder->Failed());
195 yuv_decoding_failed_ = true; 198 yuv_decoding_failed_ = true;
196 return false; 199 return false;
197 } 200 }
198 201
199 SkBitmap ImageFrameGenerator::TryToResumeDecode( 202 SkBitmap ImageFrameGenerator::TryToResumeDecode(
200 SegmentReader* data, 203 SegmentReader* data,
201 bool all_data_received, 204 bool all_data_received,
202 size_t index, 205 size_t index,
203 const SkISize& scaled_size, 206 const SkISize& scaled_size,
204 SkBitmap::Allocator* allocator) { 207 SkBitmap::Allocator* allocator,
208 ImageDecoder::AlphaOption alpha_option) {
205 TRACE_EVENT1("blink", "ImageFrameGenerator::tryToResumeDecode", "frame index", 209 TRACE_EVENT1("blink", "ImageFrameGenerator::tryToResumeDecode", "frame index",
206 static_cast<int>(index)); 210 static_cast<int>(index));
207 211
208 ImageDecoder* decoder = 0; 212 ImageDecoder* decoder = 0;
209 213
210 // Lock the mutex, so only one thread can use the decoder at once. 214 // Lock the mutex, so only one thread can use the decoder at once.
211 MutexLocker lock(decode_mutex_); 215 MutexLocker lock(decode_mutex_);
212 const bool resume_decoding = 216 const bool resume_decoding = ImageDecodingStore::Instance().LockDecoder(
213 ImageDecodingStore::Instance().LockDecoder(this, full_size_, &decoder); 217 this, full_size_, alpha_option, &decoder);
214 ASSERT(!resume_decoding || decoder); 218 ASSERT(!resume_decoding || decoder);
215 219
216 SkBitmap full_size_image; 220 SkBitmap full_size_image;
217 bool complete = Decode(data, all_data_received, index, &decoder, 221 bool complete = Decode(data, all_data_received, index, &decoder,
218 &full_size_image, allocator); 222 &full_size_image, allocator, alpha_option);
219 223
220 if (!decoder) 224 if (!decoder)
221 return SkBitmap(); 225 return SkBitmap();
222 226
223 // If we are not resuming decoding that means the decoder is freshly 227 // If we are not resuming decoding that means the decoder is freshly
224 // created and we have ownership. If we are resuming decoding then 228 // created and we have ownership. If we are resuming decoding then
225 // the decoder is owned by ImageDecodingStore. 229 // the decoder is owned by ImageDecodingStore.
226 std::unique_ptr<ImageDecoder> decoder_container; 230 std::unique_ptr<ImageDecoder> decoder_container;
227 if (!resume_decoding) 231 if (!resume_decoding)
228 decoder_container = WTF::WrapUnique(decoder); 232 decoder_container = WTF::WrapUnique(decoder);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 has_alpha_[i] = true; 277 has_alpha_[i] = true;
274 } 278 }
275 has_alpha_[index] = has_alpha; 279 has_alpha_[index] = has_alpha;
276 } 280 }
277 281
278 bool ImageFrameGenerator::Decode(SegmentReader* data, 282 bool ImageFrameGenerator::Decode(SegmentReader* data,
279 bool all_data_received, 283 bool all_data_received,
280 size_t index, 284 size_t index,
281 ImageDecoder** decoder, 285 ImageDecoder** decoder,
282 SkBitmap* bitmap, 286 SkBitmap* bitmap,
283 SkBitmap::Allocator* allocator) { 287 SkBitmap::Allocator* allocator,
288 ImageDecoder::AlphaOption alpha_option) {
284 ASSERT(decode_mutex_.Locked()); 289 ASSERT(decode_mutex_.Locked());
285 TRACE_EVENT2("blink", "ImageFrameGenerator::decode", "width", 290 TRACE_EVENT2("blink", "ImageFrameGenerator::decode", "width",
286 full_size_.width(), "height", full_size_.height()); 291 full_size_.width(), "height", full_size_.height());
287 292
288 // Try to create an ImageDecoder if we are not given one. 293 // Try to create an ImageDecoder if we are not given one.
289 ASSERT(decoder); 294 ASSERT(decoder);
290 bool new_decoder = false; 295 bool new_decoder = false;
291 bool should_call_set_data = true; 296 bool should_call_set_data = true;
292 if (!*decoder) { 297 if (!*decoder) {
293 new_decoder = true; 298 new_decoder = true;
294 if (image_decoder_factory_) 299 if (image_decoder_factory_)
295 *decoder = image_decoder_factory_->Create().release(); 300 *decoder = image_decoder_factory_->Create().release();
296 301
297 if (!*decoder) { 302 if (!*decoder) {
298 *decoder = ImageDecoder::Create(data, all_data_received, 303 *decoder = ImageDecoder::Create(data, all_data_received, alpha_option,
299 ImageDecoder::kAlphaPremultiplied,
300 decoder_color_behavior_) 304 decoder_color_behavior_)
301 .release(); 305 .release();
302 // The newly created decoder just grabbed the data. No need to reset it. 306 // The newly created decoder just grabbed the data. No need to reset it.
303 should_call_set_data = false; 307 should_call_set_data = false;
304 } 308 }
305 309
306 if (!*decoder) 310 if (!*decoder)
307 return false; 311 return false;
308 } 312 }
309 313
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 // do YUV decoding. 386 // do YUV decoding.
383 std::unique_ptr<ImagePlanes> dummy_image_planes = 387 std::unique_ptr<ImagePlanes> dummy_image_planes =
384 WTF::WrapUnique(new ImagePlanes); 388 WTF::WrapUnique(new ImagePlanes);
385 decoder->SetImagePlanes(std::move(dummy_image_planes)); 389 decoder->SetImagePlanes(std::move(dummy_image_planes));
386 390
387 return UpdateYUVComponentSizes(decoder.get(), size_info->fSizes, 391 return UpdateYUVComponentSizes(decoder.get(), size_info->fSizes,
388 size_info->fWidthBytes); 392 size_info->fWidthBytes);
389 } 393 }
390 394
391 } // namespace blink 395 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698