| OLD | NEW |
| 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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 float m_duration; | 54 float m_duration; |
| 55 bool m_isComplete; | 55 bool m_isComplete; |
| 56 size_t m_frameBytes; | 56 size_t m_frameBytes; |
| 57 uint32_t m_uniqueID; | 57 uint32_t m_uniqueID; |
| 58 }; | 58 }; |
| 59 | 59 |
| 60 std::unique_ptr<DeferredImageDecoder> DeferredImageDecoder::create( | 60 std::unique_ptr<DeferredImageDecoder> DeferredImageDecoder::create( |
| 61 PassRefPtr<SharedBuffer> passData, | 61 PassRefPtr<SharedBuffer> passData, |
| 62 bool dataComplete, | 62 bool dataComplete, |
| 63 ImageDecoder::AlphaOption alphaOption, | 63 ImageDecoder::AlphaOption alphaOption, |
| 64 ImageDecoder::ColorSpaceOption colorOptions) { | 64 ImageDecoder::ColorSpaceOption colorOptions, |
| 65 sk_sp<SkColorSpace> targetColorSpace) { |
| 65 RefPtr<SharedBuffer> data = passData; | 66 RefPtr<SharedBuffer> data = passData; |
| 66 | 67 |
| 67 std::unique_ptr<ImageDecoder> actualDecoder = | 68 std::unique_ptr<ImageDecoder> actualDecoder = |
| 68 ImageDecoder::create(data, dataComplete, alphaOption, colorOptions); | 69 ImageDecoder::create(data, dataComplete, alphaOption, colorOptions, |
| 69 | 70 std::move(targetColorSpace)); |
| 70 if (!actualDecoder) | 71 if (!actualDecoder) |
| 71 return nullptr; | 72 return nullptr; |
| 72 | 73 |
| 73 std::unique_ptr<DeferredImageDecoder> decoder( | 74 std::unique_ptr<DeferredImageDecoder> decoder( |
| 74 new DeferredImageDecoder(std::move(actualDecoder))); | 75 new DeferredImageDecoder(std::move(actualDecoder))); |
| 75 | 76 |
| 76 // Since we've just instantiated a fresh decoder, there's no need to reset its | 77 // Since we've just instantiated a fresh decoder, there's no need to reset its |
| 77 // data. | 78 // data. |
| 78 decoder->setDataInternal(data.release(), dataComplete, false); | 79 decoder->setDataInternal(data.release(), dataComplete, false); |
| 79 | 80 |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 return; | 261 return; |
| 261 | 262 |
| 262 m_size = m_actualDecoder->size(); | 263 m_size = m_actualDecoder->size(); |
| 263 m_hasHotSpot = m_actualDecoder->hotSpot(m_hotSpot); | 264 m_hasHotSpot = m_actualDecoder->hotSpot(m_hotSpot); |
| 264 m_filenameExtension = m_actualDecoder->filenameExtension(); | 265 m_filenameExtension = m_actualDecoder->filenameExtension(); |
| 265 // JPEG images support YUV decoding; other decoders do not. (WebP could in the | 266 // JPEG images support YUV decoding; other decoders do not. (WebP could in the |
| 266 // future.) | 267 // future.) |
| 267 m_canYUVDecode = RuntimeEnabledFeatures::decodeToYUVEnabled() && | 268 m_canYUVDecode = RuntimeEnabledFeatures::decodeToYUVEnabled() && |
| 268 (m_filenameExtension == "jpg"); | 269 (m_filenameExtension == "jpg"); |
| 269 m_hasEmbeddedColorSpace = m_actualDecoder->hasEmbeddedColorSpace(); | 270 m_hasEmbeddedColorSpace = m_actualDecoder->hasEmbeddedColorSpace(); |
| 271 m_colorSpaceForSkImages = m_actualDecoder->colorSpaceForSkImages(); |
| 270 | 272 |
| 271 const bool isSingleFrame = | 273 const bool isSingleFrame = |
| 272 m_actualDecoder->repetitionCount() == cAnimationNone || | 274 m_actualDecoder->repetitionCount() == cAnimationNone || |
| 273 (m_allDataReceived && m_actualDecoder->frameCount() == 1u); | 275 (m_allDataReceived && m_actualDecoder->frameCount() == 1u); |
| 274 const SkISize decodedSize = | 276 const SkISize decodedSize = |
| 275 SkISize::Make(m_actualDecoder->decodedSize().width(), | 277 SkISize::Make(m_actualDecoder->decodedSize().width(), |
| 276 m_actualDecoder->decodedSize().height()); | 278 m_actualDecoder->decodedSize().height()); |
| 277 m_frameGenerator = ImageFrameGenerator::create( | 279 m_frameGenerator = ImageFrameGenerator::create( |
| 278 decodedSize, m_actualDecoder->colorSpace(), !isSingleFrame); | 280 decodedSize, !isSingleFrame, m_actualDecoder->colorSpaceOption(), |
| 281 m_actualDecoder->targetColorSpace()); |
| 279 } | 282 } |
| 280 | 283 |
| 281 void DeferredImageDecoder::prepareLazyDecodedFrames() { | 284 void DeferredImageDecoder::prepareLazyDecodedFrames() { |
| 282 if (!m_actualDecoder || !m_actualDecoder->isSizeAvailable()) | 285 if (!m_actualDecoder || !m_actualDecoder->isSizeAvailable()) |
| 283 return; | 286 return; |
| 284 | 287 |
| 285 activateLazyDecoding(); | 288 activateLazyDecoding(); |
| 286 | 289 |
| 287 const size_t previousSize = m_frameData.size(); | 290 const size_t previousSize = m_frameData.size(); |
| 288 m_frameData.resize(m_actualDecoder->frameCount()); | 291 m_frameData.resize(m_actualDecoder->frameCount()); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 319 ASSERT(decodedSize.width() > 0); | 322 ASSERT(decodedSize.width() > 0); |
| 320 ASSERT(decodedSize.height() > 0); | 323 ASSERT(decodedSize.height() > 0); |
| 321 | 324 |
| 322 sk_sp<SkROBuffer> roBuffer(m_rwBuffer->newRBufferSnapshot()); | 325 sk_sp<SkROBuffer> roBuffer(m_rwBuffer->newRBufferSnapshot()); |
| 323 RefPtr<SegmentReader> segmentReader = | 326 RefPtr<SegmentReader> segmentReader = |
| 324 SegmentReader::createFromSkROBuffer(std::move(roBuffer)); | 327 SegmentReader::createFromSkROBuffer(std::move(roBuffer)); |
| 325 | 328 |
| 326 SkImageInfo info = SkImageInfo::MakeN32( | 329 SkImageInfo info = SkImageInfo::MakeN32( |
| 327 decodedSize.width(), decodedSize.height(), | 330 decodedSize.width(), decodedSize.height(), |
| 328 knownToBeOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType, | 331 knownToBeOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType, |
| 329 m_frameGenerator->getColorSpace()); | 332 m_colorSpaceForSkImages); |
| 330 | 333 |
| 331 DecodingImageGenerator* generator = new DecodingImageGenerator( | 334 DecodingImageGenerator* generator = new DecodingImageGenerator( |
| 332 m_frameGenerator, info, segmentReader.release(), m_allDataReceived, index, | 335 m_frameGenerator, info, segmentReader.release(), m_allDataReceived, index, |
| 333 m_frameData[index].m_uniqueID); | 336 m_frameData[index].m_uniqueID); |
| 334 sk_sp<SkImage> image = SkImage::MakeFromGenerator( | 337 sk_sp<SkImage> image = SkImage::MakeFromGenerator( |
| 335 generator); // SkImage takes ownership of the generator. | 338 generator); // SkImage takes ownership of the generator. |
| 336 if (!image) | 339 if (!image) |
| 337 return nullptr; | 340 return nullptr; |
| 338 | 341 |
| 339 // We can consider decoded bitmap constant and reuse uniqueID only after all | 342 // We can consider decoded bitmap constant and reuse uniqueID only after all |
| (...skipping 23 matching lines...) Expand all Loading... |
| 363 | 366 |
| 364 namespace WTF { | 367 namespace WTF { |
| 365 template <> | 368 template <> |
| 366 struct VectorTraits<blink::DeferredFrameData> | 369 struct VectorTraits<blink::DeferredFrameData> |
| 367 : public SimpleClassVectorTraits<blink::DeferredFrameData> { | 370 : public SimpleClassVectorTraits<blink::DeferredFrameData> { |
| 368 STATIC_ONLY(VectorTraits); | 371 STATIC_ONLY(VectorTraits); |
| 369 static const bool canInitializeWithMemset = | 372 static const bool canInitializeWithMemset = |
| 370 false; // Not all DeferredFrameData members initialize to 0. | 373 false; // Not all DeferredFrameData members initialize to 0. |
| 371 }; | 374 }; |
| 372 } | 375 } |
| OLD | NEW |