1 /* 2 * Copyright (C) 2012 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 17 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 18 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 19 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 20 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 21 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #include "config.h" 27 #include "platform/graphics/LazyDecodingPixelRef.h" 28 29 #include "SkData.h" 30 #include "platform/TraceEvent.h" 31 #include "platform/graphics/ImageDecodingStore.h" 32 #include "platform/graphics/ImageFrameGenerator.h" 33 34 namespace WebCore { 35 36 LazyDecodingPixelRef::LazyDecodingPixelRef(const SkImageInfo& info, PassRefPtr<ImageFrameGenerator> frameGenerator, size_t index) 37 : LazyPixelRef(info) 38 , m_frameGenerator(frameGenerator) 39 , m_frameIndex(index) 40 , m_lockedImageResource(0) 41 , m_objectTracker(this) 42 { 43 } 44 45 LazyDecodingPixelRef::~LazyDecodingPixelRef() 46 { 47 } 48 49 SkData* LazyDecodingPixelRef::onRefEncodedData() 50 { 51 // If the image has been clipped or scaled, do not return the original encoded data, since 52 // on playback it will not be known how the clipping/scaling was done. 53 RefPtr<SharedBuffer> buffer = nullptr; 54 bool allDataReceived = false; 55 m_frameGenerator->copyData(&buffer, &allDataReceived); 56 if (buffer && allDataReceived) { 57 SkData* skdata = SkData::NewWithCopy((void*)buffer->data(), buffer->size()); 58 return skdata; 59 } 60 return 0; 61 } 62 63 bool LazyDecodingPixelRef::onNewLockPixels(LockRec* rec) 64 { 65 TRACE_EVENT_ASYNC_BEGIN0("webkit", "LazyDecodingPixelRef::onNewLockPixels", this); 66 67 ASSERT(!m_lockedImageResource); 68 69 SkISize size = m_frameGenerator->getFullSize(); 70 if (!ImageDecodingStore::instance()->lockCache(m_frameGenerator.get(), size, m_frameIndex, &m_lockedImageResource)) 71 m_lockedImageResource = 0; 72 73 // Use ImageFrameGenerator to generate the image. It will lock the cache 74 // entry for us. 75 if (!m_lockedImageResource) { 76 PlatformInstrumentation::willDecodeLazyPixelRef(getGenerationID()); 77 m_lockedImageResource = m_frameGenerator->decodeAndScale(size, m_frameIndex); 78 PlatformInstrumentation::didDecodeLazyPixelRef(); 79 } 80 if (!m_lockedImageResource) 81 return false; 82 83 ASSERT(!m_lockedImageResource->bitmap().isNull()); 84 ASSERT(m_lockedImageResource->scaledSize() == size); 85 rec->fPixels = m_lockedImageResource->bitmap().getAddr(0, 0); 86 rec->fColorTable = 0; 87 rec->fRowBytes = m_lockedImageResource->bitmap().rowBytes(); 88 return true; 89 } 90 91 void LazyDecodingPixelRef::onUnlockPixels() 92 { 93 if (m_lockedImageResource) { 94 ImageDecodingStore::instance()->unlockCache(m_frameGenerator.get(), m_lockedImageResource); 95 m_lockedImageResource = 0; 96 } 97 98 TRACE_EVENT_ASYNC_END0("webkit", "LazyDecodingPixelRef::lockPixels", this); 99 } 100 101 bool LazyDecodingPixelRef::onLockPixelsAreWritable() const 102 { 103 return false; 104 } 105 106 bool LazyDecodingPixelRef::MaybeDecoded() 107 { 108 return ImageDecodingStore::instance()->isCached(m_frameGenerator.get(), m_frameGenerator->getFullSize(), m_frameIndex); 109 } 110 111 bool LazyDecodingPixelRef::PrepareToDecode(const LazyPixelRef::PrepareParams& params) 112 { 113 ASSERT(false); 114 return false; 115 } 116 117 void LazyDecodingPixelRef::Decode() 118 { 119 lockPixels(); 120 unlockPixels(); 121 } 122 123 124 } // namespace blink 125