Chromium Code Reviews| 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 18 matching lines...) Expand all Loading... | |
| 29 #include "platform/graphics/DecodingImageGenerator.h" | 29 #include "platform/graphics/DecodingImageGenerator.h" |
| 30 #include "platform/graphics/ImageDecodingStore.h" | 30 #include "platform/graphics/ImageDecodingStore.h" |
| 31 #include "platform/graphics/LazyDecodingPixelRef.h" | 31 #include "platform/graphics/LazyDecodingPixelRef.h" |
| 32 #include "third_party/skia/include/core/SkImageInfo.h" | 32 #include "third_party/skia/include/core/SkImageInfo.h" |
| 33 #include "wtf/PassOwnPtr.h" | 33 #include "wtf/PassOwnPtr.h" |
| 34 | 34 |
| 35 namespace WebCore { | 35 namespace WebCore { |
| 36 | 36 |
| 37 namespace { | 37 namespace { |
| 38 | 38 |
| 39 // URI label for a lazily decoded SkPixelRef. | |
| 40 const char labelLazyDecoded[] = "lazy"; | |
| 41 | |
| 42 // URI label for SkDiscardablePixelRef. | 39 // URI label for SkDiscardablePixelRef. |
| 43 const char labelDiscardable[] = "discardable"; | 40 const char labelDiscardable[] = "discardable"; |
| 44 | 41 |
| 45 } // namespace | 42 } // namespace |
| 46 | 43 |
| 47 bool DeferredImageDecoder::s_enabled = false; | 44 bool DeferredImageDecoder::s_enabled = false; |
| 48 bool DeferredImageDecoder::s_skiaDiscardableMemoryEnabled = false; | |
| 49 | 45 |
| 50 DeferredImageDecoder::DeferredImageDecoder(PassOwnPtr<ImageDecoder> actualDecode r) | 46 DeferredImageDecoder::DeferredImageDecoder(PassOwnPtr<ImageDecoder> actualDecode r) |
| 51 : m_allDataReceived(false) | 47 : m_allDataReceived(false) |
| 52 , m_lastDataSize(0) | 48 , m_lastDataSize(0) |
| 53 , m_dataChanged(false) | 49 , m_dataChanged(false) |
| 54 , m_actualDecoder(actualDecoder) | 50 , m_actualDecoder(actualDecoder) |
| 55 , m_orientation(DefaultImageOrientation) | 51 , m_orientation(DefaultImageOrientation) |
| 56 , m_repetitionCount(cAnimationNone) | 52 , m_repetitionCount(cAnimationNone) |
| 57 , m_hasColorProfile(false) | 53 , m_hasColorProfile(false) |
| 58 { | 54 { |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 70 | 66 |
| 71 PassOwnPtr<DeferredImageDecoder> DeferredImageDecoder::createForTesting(PassOwnP tr<ImageDecoder> decoder) | 67 PassOwnPtr<DeferredImageDecoder> DeferredImageDecoder::createForTesting(PassOwnP tr<ImageDecoder> decoder) |
| 72 { | 68 { |
| 73 return adoptPtr(new DeferredImageDecoder(decoder)); | 69 return adoptPtr(new DeferredImageDecoder(decoder)); |
| 74 } | 70 } |
| 75 | 71 |
| 76 bool DeferredImageDecoder::isLazyDecoded(const SkBitmap& bitmap) | 72 bool DeferredImageDecoder::isLazyDecoded(const SkBitmap& bitmap) |
| 77 { | 73 { |
| 78 return bitmap.pixelRef() | 74 return bitmap.pixelRef() |
| 79 && bitmap.pixelRef()->getURI() | 75 && bitmap.pixelRef()->getURI() |
| 80 && (!memcmp(bitmap.pixelRef()->getURI(), labelLazyDecoded, sizeof(labelL azyDecoded)) | 76 && !memcmp(bitmap.pixelRef()->getURI(), labelDiscardable, sizeof(labelDi scardable)); |
| 81 || !memcmp(bitmap.pixelRef()->getURI(), labelDiscardable, sizeof(lab elDiscardable))); | |
| 82 } | 77 } |
| 83 | 78 |
| 84 void DeferredImageDecoder::setEnabled(bool enabled) | 79 void DeferredImageDecoder::setEnabled(bool enabled) |
| 85 { | 80 { |
| 86 s_enabled = enabled; | 81 s_enabled = enabled; |
| 87 #if !OS(ANDROID) | |
| 88 // FIXME: This code is temporary to enable discardable memory for | |
| 89 // non-Android platforms. In the future all platforms will be | |
| 90 // the same and we can remove this code. | |
| 91 s_skiaDiscardableMemoryEnabled = enabled; | |
| 92 if (enabled) | 82 if (enabled) |
| 93 ImageDecodingStore::setImageCachingEnabled(false); | 83 ImageDecodingStore::setImageCachingEnabled(false); |
| 94 #endif | |
| 95 } | 84 } |
| 96 | 85 |
| 97 bool DeferredImageDecoder::enabled() | 86 bool DeferredImageDecoder::enabled() |
| 98 { | 87 { |
| 99 return s_enabled; | 88 return s_enabled; |
| 100 } | 89 } |
| 101 | 90 |
| 102 String DeferredImageDecoder::filenameExtension() const | 91 String DeferredImageDecoder::filenameExtension() const |
| 103 { | 92 { |
| 104 return m_actualDecoder ? m_actualDecoder->filenameExtension() : m_filenameEx tension; | 93 return m_actualDecoder ? m_actualDecoder->filenameExtension() : m_filenameEx tension; |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 266 } | 255 } |
| 267 } | 256 } |
| 268 | 257 |
| 269 if (m_allDataReceived) { | 258 if (m_allDataReceived) { |
| 270 m_repetitionCount = m_actualDecoder->repetitionCount(); | 259 m_repetitionCount = m_actualDecoder->repetitionCount(); |
| 271 m_actualDecoder.clear(); | 260 m_actualDecoder.clear(); |
| 272 m_data = nullptr; | 261 m_data = nullptr; |
| 273 } | 262 } |
| 274 } | 263 } |
| 275 | 264 |
| 276 // Creates either a SkBitmap backed by SkDiscardablePixelRef or a SkBitmap using the | 265 // Creates a SkBitmap that is backed by SkDiscardablePixelRef. |
| 277 // legacy LazyDecodingPixelRef. | |
|
Stephen White
2014/05/29 20:07:44
Out of curiosity, does this mean we can also remov
| |
| 278 SkBitmap DeferredImageDecoder::createBitmap(size_t index) | 266 SkBitmap DeferredImageDecoder::createBitmap(size_t index) |
| 279 { | 267 { |
| 280 // This code is temporary until the transition to SkDiscardablePixelRef is c omplete. | |
| 281 if (s_skiaDiscardableMemoryEnabled) | |
| 282 return createSkiaDiscardableBitmap(index); | |
| 283 return createLazyDecodingBitmap(index); | |
| 284 } | |
| 285 | |
| 286 // Creates a SkBitmap that is backed by SkDiscardablePixelRef. | |
| 287 SkBitmap DeferredImageDecoder::createSkiaDiscardableBitmap(size_t index) | |
| 288 { | |
| 289 IntSize decodedSize = m_actualDecoder->decodedSize(); | 268 IntSize decodedSize = m_actualDecoder->decodedSize(); |
| 290 ASSERT(decodedSize.width() > 0); | 269 ASSERT(decodedSize.width() > 0); |
| 291 ASSERT(decodedSize.height() > 0); | 270 ASSERT(decodedSize.height() > 0); |
| 292 | 271 |
| 293 SkImageInfo info; | 272 SkImageInfo info; |
| 294 info.fWidth = decodedSize.width(); | 273 info.fWidth = decodedSize.width(); |
| 295 info.fHeight = decodedSize.height(); | 274 info.fHeight = decodedSize.height(); |
| 275 #if SK_B32_SHIFT // Little-endian RGBA pixels. (Android) | |
|
reveman
2014/05/29 03:30:55
I assume this is the reason my previous patch fail
| |
| 276 info.fColorType = kRGBA_8888_SkColorType; | |
| 277 #else | |
| 296 info.fColorType = kBGRA_8888_SkColorType; | 278 info.fColorType = kBGRA_8888_SkColorType; |
| 279 #endif | |
| 297 info.fAlphaType = kPremul_SkAlphaType; | 280 info.fAlphaType = kPremul_SkAlphaType; |
| 298 | 281 |
| 299 SkBitmap bitmap; | 282 SkBitmap bitmap; |
| 300 DecodingImageGenerator* generator = new DecodingImageGenerator(m_frameGenera tor, info, index); | 283 DecodingImageGenerator* generator = new DecodingImageGenerator(m_frameGenera tor, info, index); |
| 301 bool installed = SkInstallDiscardablePixelRef(generator, &bitmap); | 284 bool installed = SkInstallDiscardablePixelRef(generator, &bitmap); |
| 302 ASSERT_UNUSED(installed, installed); | 285 ASSERT_UNUSED(installed, installed); |
| 303 bitmap.pixelRef()->setURI(labelDiscardable); | 286 bitmap.pixelRef()->setURI(labelDiscardable); |
| 304 generator->setGenerationId(bitmap.getGenerationID()); | 287 generator->setGenerationId(bitmap.getGenerationID()); |
| 305 return bitmap; | 288 return bitmap; |
| 306 } | 289 } |
| 307 | 290 |
| 308 SkBitmap DeferredImageDecoder::createLazyDecodingBitmap(size_t index) | |
| 309 { | |
| 310 IntSize decodedSize = m_actualDecoder->decodedSize(); | |
| 311 ASSERT(decodedSize.width() > 0); | |
| 312 ASSERT(decodedSize.height() > 0); | |
| 313 | |
| 314 SkImageInfo info; | |
| 315 info.fWidth = decodedSize.width(); | |
| 316 info.fHeight = decodedSize.height(); | |
| 317 info.fColorType = kPMColor_SkColorType; | |
| 318 info.fAlphaType = kPremul_SkAlphaType; | |
| 319 | |
| 320 // Creates a lazily decoded SkPixelRef that references the entire image with out scaling. | |
| 321 SkBitmap bitmap; | |
| 322 bitmap.setConfig(info); | |
| 323 bitmap.setPixelRef(new LazyDecodingPixelRef(info, m_frameGenerator, index))- >unref(); | |
| 324 | |
| 325 // Use the URI to identify this as a lazily decoded SkPixelRef of type LazyD ecodingPixelRef. | |
| 326 // FIXME: It would be more useful to give the actual image URI. | |
| 327 bitmap.pixelRef()->setURI(labelLazyDecoded); | |
| 328 | |
| 329 // Inform the bitmap that we will never change the pixels. This is a perform ance hint | |
| 330 // subsystems that may try to cache this bitmap (e.g. pictures, pipes, gpu, pdf, etc.) | |
| 331 bitmap.setImmutable(); | |
| 332 | |
| 333 return bitmap; | |
| 334 } | |
| 335 | |
| 336 bool DeferredImageDecoder::hotSpot(IntPoint& hotSpot) const | 291 bool DeferredImageDecoder::hotSpot(IntPoint& hotSpot) const |
| 337 { | 292 { |
| 338 // TODO: Implement. | 293 // TODO: Implement. |
| 339 return m_actualDecoder ? m_actualDecoder->hotSpot(hotSpot) : false; | 294 return m_actualDecoder ? m_actualDecoder->hotSpot(hotSpot) : false; |
| 340 } | 295 } |
| 341 | 296 |
| 342 } // namespace WebCore | 297 } // namespace WebCore |
| OLD | NEW |