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

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

Issue 794223003: Cheaper thread-safe atomic initialization of static references. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Add type check for initial value Created 5 years, 11 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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 , m_isMultiFrame(isMultiFrame) 87 , m_isMultiFrame(isMultiFrame)
88 , m_decodeFailedAndEmpty(false) 88 , m_decodeFailedAndEmpty(false)
89 , m_decodeCount(0) 89 , m_decodeCount(0)
90 , m_frameCount(0) 90 , m_frameCount(0)
91 { 91 {
92 setData(data.get(), allDataReceived); 92 setData(data.get(), allDataReceived);
93 } 93 }
94 94
95 ImageFrameGenerator::~ImageFrameGenerator() 95 ImageFrameGenerator::~ImageFrameGenerator()
96 { 96 {
97 ImageDecodingStore::instance()->removeCacheIndexedByGenerator(this); 97 ImageDecodingStore::instance().removeCacheIndexedByGenerator(this);
98 } 98 }
99 99
100 void ImageFrameGenerator::setData(PassRefPtr<SharedBuffer> data, bool allDataRec eived) 100 void ImageFrameGenerator::setData(PassRefPtr<SharedBuffer> data, bool allDataRec eived)
101 { 101 {
102 m_data.setData(data.get(), allDataReceived); 102 m_data.setData(data.get(), allDataReceived);
103 } 103 }
104 104
105 void ImageFrameGenerator::copyData(RefPtr<SharedBuffer>* data, bool* allDataRece ived) 105 void ImageFrameGenerator::copyData(RefPtr<SharedBuffer>* data, bool* allDataRece ived)
106 { 106 {
107 SharedBuffer* buffer = 0; 107 SharedBuffer* buffer = 0;
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 if (yuvDecoded) 187 if (yuvDecoded)
188 setHasAlpha(0, false); // YUV is always opaque 188 setHasAlpha(0, false); // YUV is always opaque
189 return yuvDecoded; 189 return yuvDecoded;
190 } 190 }
191 191
192 SkBitmap ImageFrameGenerator::tryToResumeDecode(const SkISize& scaledSize, size_ t index) 192 SkBitmap ImageFrameGenerator::tryToResumeDecode(const SkISize& scaledSize, size_ t index)
193 { 193 {
194 TRACE_EVENT1("blink", "ImageFrameGenerator::tryToResumeDecodeAndScale", "ind ex", static_cast<int>(index)); 194 TRACE_EVENT1("blink", "ImageFrameGenerator::tryToResumeDecodeAndScale", "ind ex", static_cast<int>(index));
195 195
196 ImageDecoder* decoder = 0; 196 ImageDecoder* decoder = 0;
197 const bool resumeDecoding = ImageDecodingStore::instance()->lockDecoder(this , m_fullSize, &decoder); 197 const bool resumeDecoding = ImageDecodingStore::instance().lockDecoder(this, m_fullSize, &decoder);
198 ASSERT(!resumeDecoding || decoder); 198 ASSERT(!resumeDecoding || decoder);
199 199
200 SkBitmap fullSizeImage; 200 SkBitmap fullSizeImage;
201 bool complete = decode(index, &decoder, &fullSizeImage); 201 bool complete = decode(index, &decoder, &fullSizeImage);
202 202
203 if (!decoder) 203 if (!decoder)
204 return SkBitmap(); 204 return SkBitmap();
205 if (index >= m_frameComplete.size()) 205 if (index >= m_frameComplete.size())
206 m_frameComplete.resize(index + 1); 206 m_frameComplete.resize(index + 1);
207 m_frameComplete[index] = complete; 207 m_frameComplete[index] = complete;
208 208
209 // If we are not resuming decoding that means the decoder is freshly 209 // If we are not resuming decoding that means the decoder is freshly
210 // created and we have ownership. If we are resuming decoding then 210 // created and we have ownership. If we are resuming decoding then
211 // the decoder is owned by ImageDecodingStore. 211 // the decoder is owned by ImageDecodingStore.
212 OwnPtr<ImageDecoder> decoderContainer; 212 OwnPtr<ImageDecoder> decoderContainer;
213 if (!resumeDecoding) 213 if (!resumeDecoding)
214 decoderContainer = adoptPtr(decoder); 214 decoderContainer = adoptPtr(decoder);
215 215
216 if (fullSizeImage.isNull()) { 216 if (fullSizeImage.isNull()) {
217 // If decode has failed and resulted an empty image we can save work 217 // If decode has failed and resulted an empty image we can save work
218 // in the future by returning early. 218 // in the future by returning early.
219 m_decodeFailedAndEmpty = !m_isMultiFrame && decoder->failed(); 219 m_decodeFailedAndEmpty = !m_isMultiFrame && decoder->failed();
220 220
221 if (resumeDecoding) 221 if (resumeDecoding)
222 ImageDecodingStore::instance()->unlockDecoder(this, decoder); 222 ImageDecodingStore::instance().unlockDecoder(this, decoder);
223 return SkBitmap(); 223 return SkBitmap();
224 } 224 }
225 225
226 // If the image generated is complete then there is no need to keep 226 // If the image generated is complete then there is no need to keep
227 // the decoder. For multi-frame images, if all frames in the image are 227 // the decoder. For multi-frame images, if all frames in the image are
228 // decoded, we remove the decoder. 228 // decoded, we remove the decoder.
229 bool removeDecoder; 229 bool removeDecoder;
230 230
231 if (m_isMultiFrame) { 231 if (m_isMultiFrame) {
232 size_t decodedFrameCount = 0; 232 size_t decodedFrameCount = 0;
233 for (Vector<bool>::iterator it = m_frameComplete.begin(); it != m_frameC omplete.end(); ++it) { 233 for (Vector<bool>::iterator it = m_frameComplete.begin(); it != m_frameC omplete.end(); ++it) {
234 if (*it) 234 if (*it)
235 decodedFrameCount++; 235 decodedFrameCount++;
236 } 236 }
237 removeDecoder = m_frameCount && (decodedFrameCount == m_frameCount); 237 removeDecoder = m_frameCount && (decodedFrameCount == m_frameCount);
238 } else { 238 } else {
239 removeDecoder = complete; 239 removeDecoder = complete;
240 } 240 }
241 241
242 if (resumeDecoding) { 242 if (resumeDecoding) {
243 if (removeDecoder) { 243 if (removeDecoder) {
244 ImageDecodingStore::instance()->removeDecoder(this, decoder); 244 ImageDecodingStore::instance().removeDecoder(this, decoder);
245 m_frameComplete.clear(); 245 m_frameComplete.clear();
246 } else {
247 ImageDecodingStore::instance().unlockDecoder(this, decoder);
246 } 248 }
247 else
248 ImageDecodingStore::instance()->unlockDecoder(this, decoder);
249 } else if (!removeDecoder) { 249 } else if (!removeDecoder) {
250 ImageDecodingStore::instance()->insertDecoder(this, decoderContainer.rel ease()); 250 ImageDecodingStore::instance().insertDecoder(this, decoderContainer.rele ase());
251 } 251 }
252 return fullSizeImage; 252 return fullSizeImage;
253 } 253 }
254 254
255 void ImageFrameGenerator::setHasAlpha(size_t index, bool hasAlpha) 255 void ImageFrameGenerator::setHasAlpha(size_t index, bool hasAlpha)
256 { 256 {
257 MutexLocker lock(m_alphaMutex); 257 MutexLocker lock(m_alphaMutex);
258 if (index >= m_hasAlpha.size()) { 258 if (index >= m_hasAlpha.size()) {
259 const size_t oldSize = m_hasAlpha.size(); 259 const size_t oldSize = m_hasAlpha.size();
260 m_hasAlpha.resize(index + 1); 260 m_hasAlpha.resize(index + 1);
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 357
358 // Setting a dummy ImagePlanes object signals to the decoder that we want to do YUV decoding. 358 // Setting a dummy ImagePlanes object signals to the decoder that we want to do YUV decoding.
359 decoder->setData(data, allDataReceived); 359 decoder->setData(data, allDataReceived);
360 OwnPtr<ImagePlanes> dummyImagePlanes = adoptPtr(new ImagePlanes); 360 OwnPtr<ImagePlanes> dummyImagePlanes = adoptPtr(new ImagePlanes);
361 decoder->setImagePlanes(dummyImagePlanes.release()); 361 decoder->setImagePlanes(dummyImagePlanes.release());
362 362
363 return updateYUVComponentSizes(decoder.get(), componentSizes, ImageDecoder:: SizeForMemoryAllocation); 363 return updateYUVComponentSizes(decoder.get(), componentSizes, ImageDecoder:: SizeForMemoryAllocation);
364 } 364 }
365 365
366 } // namespace blink 366 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698