| Index: Source/core/platform/graphics/DeferredImageDecoder.cpp
|
| diff --git a/Source/core/platform/graphics/DeferredImageDecoder.cpp b/Source/core/platform/graphics/DeferredImageDecoder.cpp
|
| deleted file mode 100644
|
| index 0dab6c5264adc2dd65fe58a30867f815090c63ee..0000000000000000000000000000000000000000
|
| --- a/Source/core/platform/graphics/DeferredImageDecoder.cpp
|
| +++ /dev/null
|
| @@ -1,257 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2012 Google Inc. All rights reserved.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions
|
| - * are met:
|
| - * 1. Redistributions of source code must retain the above copyright
|
| - * notice, this list of conditions and the following disclaimer.
|
| - * 2. Redistributions in binary form must reproduce the above copyright
|
| - * notice, this list of conditions and the following disclaimer in the
|
| - * documentation and/or other materials provided with the distribution.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
|
| - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
| - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
| - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
|
| - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
| - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
| - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
| - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
| - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| - */
|
| -
|
| -#include "config.h"
|
| -#include "core/platform/graphics/DeferredImageDecoder.h"
|
| -
|
| -#include "core/platform/graphics/ImageFrameGenerator.h"
|
| -#include "core/platform/graphics/LazyDecodingPixelRef.h"
|
| -#include "wtf/PassOwnPtr.h"
|
| -
|
| -namespace WebCore {
|
| -
|
| -namespace {
|
| -
|
| -// URI label for a lazily decoded SkPixelRef.
|
| -const char labelLazyDecoded[] = "lazy";
|
| -
|
| -} // namespace
|
| -
|
| -bool DeferredImageDecoder::s_enabled = false;
|
| -
|
| -DeferredImageDecoder::DeferredImageDecoder(PassOwnPtr<ImageDecoder> actualDecoder)
|
| - : m_allDataReceived(false)
|
| - , m_actualDecoder(actualDecoder)
|
| - , m_orientation(DefaultImageOrientation)
|
| - , m_repetitionCount(cAnimationNone)
|
| -{
|
| -}
|
| -
|
| -DeferredImageDecoder::~DeferredImageDecoder()
|
| -{
|
| -}
|
| -
|
| -PassOwnPtr<DeferredImageDecoder> DeferredImageDecoder::create(const SharedBuffer& data, ImageSource::AlphaOption alphaOption, ImageSource::GammaAndColorProfileOption gammaAndColorOption)
|
| -{
|
| - OwnPtr<ImageDecoder> actualDecoder = ImageDecoder::create(data, alphaOption, gammaAndColorOption);
|
| - return actualDecoder ? adoptPtr(new DeferredImageDecoder(actualDecoder.release())) : nullptr;
|
| -}
|
| -
|
| -PassOwnPtr<DeferredImageDecoder> DeferredImageDecoder::createForTesting(PassOwnPtr<ImageDecoder> decoder)
|
| -{
|
| - return adoptPtr(new DeferredImageDecoder(decoder));
|
| -}
|
| -
|
| -bool DeferredImageDecoder::isLazyDecoded(const SkBitmap& bitmap)
|
| -{
|
| - return bitmap.pixelRef()
|
| - && bitmap.pixelRef()->getURI()
|
| - && !memcmp(bitmap.pixelRef()->getURI(), labelLazyDecoded, sizeof(labelLazyDecoded));
|
| -}
|
| -
|
| -void DeferredImageDecoder::setEnabled(bool enabled)
|
| -{
|
| - s_enabled = enabled;
|
| -}
|
| -
|
| -String DeferredImageDecoder::filenameExtension() const
|
| -{
|
| - return m_actualDecoder ? m_actualDecoder->filenameExtension() : m_filenameExtension;
|
| -}
|
| -
|
| -ImageFrame* DeferredImageDecoder::frameBufferAtIndex(size_t index)
|
| -{
|
| - prepareLazyDecodedFrames();
|
| - if (index < m_lazyDecodedFrames.size()) {
|
| - // ImageFrameGenerator has the latest known alpha state. There will
|
| - // be a performance boost if this frame is opaque.
|
| - m_lazyDecodedFrames[index]->setHasAlpha(m_frameGenerator->hasAlpha(index));
|
| - return m_lazyDecodedFrames[index].get();
|
| - }
|
| - if (m_actualDecoder)
|
| - return m_actualDecoder->frameBufferAtIndex(index);
|
| - return 0;
|
| -}
|
| -
|
| -void DeferredImageDecoder::setData(SharedBuffer* data, bool allDataReceived)
|
| -{
|
| - if (m_actualDecoder) {
|
| - m_data = data;
|
| - m_allDataReceived = allDataReceived;
|
| - m_actualDecoder->setData(data, allDataReceived);
|
| - prepareLazyDecodedFrames();
|
| - }
|
| -
|
| - if (m_frameGenerator)
|
| - m_frameGenerator->setData(data, allDataReceived);
|
| -}
|
| -
|
| -bool DeferredImageDecoder::isSizeAvailable()
|
| -{
|
| - // m_actualDecoder is 0 only if image decoding is deferred and that
|
| - // means image header decoded successfully and size is available.
|
| - return m_actualDecoder ? m_actualDecoder->isSizeAvailable() : true;
|
| -}
|
| -
|
| -IntSize DeferredImageDecoder::size() const
|
| -{
|
| - return m_actualDecoder ? m_actualDecoder->size() : m_size;
|
| -}
|
| -
|
| -IntSize DeferredImageDecoder::frameSizeAtIndex(size_t index) const
|
| -{
|
| - // FIXME: Frame size is assumed to be uniform. This might not be true for
|
| - // future supported codecs.
|
| - return m_actualDecoder ? m_actualDecoder->frameSizeAtIndex(index) : m_size;
|
| -}
|
| -
|
| -size_t DeferredImageDecoder::frameCount()
|
| -{
|
| - return m_actualDecoder ? m_actualDecoder->frameCount() : m_lazyDecodedFrames.size();
|
| -}
|
| -
|
| -int DeferredImageDecoder::repetitionCount() const
|
| -{
|
| - return m_actualDecoder ? m_actualDecoder->repetitionCount() : m_repetitionCount;
|
| -}
|
| -
|
| -size_t DeferredImageDecoder::clearCacheExceptFrame(size_t clearExceptFrame)
|
| -{
|
| - // If image decoding is deferred then frame buffer cache is managed by
|
| - // the compositor and this call is ignored.
|
| - return m_actualDecoder ? m_actualDecoder->clearCacheExceptFrame(clearExceptFrame) : 0;
|
| -}
|
| -
|
| -bool DeferredImageDecoder::frameHasAlphaAtIndex(size_t index) const
|
| -{
|
| - if (m_actualDecoder)
|
| - return m_actualDecoder->frameHasAlphaAtIndex(index);
|
| - if (!m_frameGenerator->isMultiFrame())
|
| - return m_frameGenerator->hasAlpha(index);
|
| - return true;
|
| -}
|
| -
|
| -bool DeferredImageDecoder::frameIsCompleteAtIndex(size_t index) const
|
| -{
|
| - if (m_actualDecoder)
|
| - return m_actualDecoder->frameIsCompleteAtIndex(index);
|
| - if (index < m_lazyDecodedFrames.size())
|
| - return m_lazyDecodedFrames[index]->status() == ImageFrame::FrameComplete;
|
| - return false;
|
| -}
|
| -
|
| -float DeferredImageDecoder::frameDurationAtIndex(size_t index) const
|
| -{
|
| - if (m_actualDecoder)
|
| - return m_actualDecoder->frameDurationAtIndex(index);
|
| - if (index < m_lazyDecodedFrames.size())
|
| - return m_lazyDecodedFrames[index]->duration();
|
| - return 0;
|
| -}
|
| -
|
| -unsigned DeferredImageDecoder::frameBytesAtIndex(size_t index) const
|
| -{
|
| - // If frame decoding is deferred then it is not managed by MemoryCache
|
| - // so return 0 here.
|
| - return m_frameGenerator ? 0 : m_actualDecoder->frameBytesAtIndex(index);
|
| -}
|
| -
|
| -ImageOrientation DeferredImageDecoder::orientation() const
|
| -{
|
| - return m_actualDecoder ? m_actualDecoder->orientation() : m_orientation;
|
| -}
|
| -
|
| -void DeferredImageDecoder::activateLazyDecoding()
|
| -{
|
| - if (m_frameGenerator)
|
| - return;
|
| - m_size = m_actualDecoder->size();
|
| - m_orientation = m_actualDecoder->orientation();
|
| - m_filenameExtension = m_actualDecoder->filenameExtension();
|
| - const bool isSingleFrame = m_actualDecoder->repetitionCount() == cAnimationNone || (m_allDataReceived && m_actualDecoder->frameCount() == 1u);
|
| - m_frameGenerator = ImageFrameGenerator::create(SkISize::Make(m_actualDecoder->decodedSize().width(), m_actualDecoder->decodedSize().height()), m_data, m_allDataReceived, !isSingleFrame);
|
| -}
|
| -
|
| -void DeferredImageDecoder::prepareLazyDecodedFrames()
|
| -{
|
| - if (!s_enabled
|
| - || !m_actualDecoder
|
| - || !m_actualDecoder->isSizeAvailable()
|
| - || m_actualDecoder->filenameExtension() == "ico")
|
| - return;
|
| -
|
| - activateLazyDecoding();
|
| -
|
| - const size_t previousSize = m_lazyDecodedFrames.size();
|
| - m_lazyDecodedFrames.resize(m_actualDecoder->frameCount());
|
| - for (size_t i = previousSize; i < m_lazyDecodedFrames.size(); ++i) {
|
| - OwnPtr<ImageFrame> frame(adoptPtr(new ImageFrame()));
|
| - frame->setSkBitmap(createLazyDecodingBitmap(i));
|
| - frame->setDuration(m_actualDecoder->frameDurationAtIndex(i));
|
| - frame->setStatus(m_actualDecoder->frameIsCompleteAtIndex(i) ? ImageFrame::FrameComplete : ImageFrame::FramePartial);
|
| - m_lazyDecodedFrames[i] = frame.release();
|
| - }
|
| -
|
| - // The last lazy decoded frame created from previous call might be
|
| - // incomplete so update its state.
|
| - if (previousSize)
|
| - m_lazyDecodedFrames[previousSize - 1]->setStatus(m_actualDecoder->frameIsCompleteAtIndex(previousSize - 1) ? ImageFrame::FrameComplete : ImageFrame::FramePartial);
|
| -
|
| - if (m_allDataReceived) {
|
| - m_repetitionCount = m_actualDecoder->repetitionCount();
|
| - m_actualDecoder.clear();
|
| - m_data = nullptr;
|
| - }
|
| -}
|
| -
|
| -SkBitmap DeferredImageDecoder::createLazyDecodingBitmap(size_t index)
|
| -{
|
| - IntSize decodedSize = m_actualDecoder->decodedSize();
|
| - ASSERT(decodedSize.width() > 0);
|
| - ASSERT(decodedSize.height() > 0);
|
| -
|
| - // Creates a lazily decoded SkPixelRef that references the entire image without scaling.
|
| - SkBitmap bitmap;
|
| - bitmap.setConfig(SkBitmap::kARGB_8888_Config, decodedSize.width(), decodedSize.height());
|
| - bitmap.setPixelRef(new LazyDecodingPixelRef(m_frameGenerator, index))->unref();
|
| -
|
| - // Use the URI to identify this as a lazily decoded SkPixelRef of type LazyDecodingPixelRef.
|
| - // FIXME: It would be more useful to give the actual image URI.
|
| - bitmap.pixelRef()->setURI(labelLazyDecoded);
|
| -
|
| - // Inform the bitmap that we will never change the pixels. This is a performance hint
|
| - // subsystems that may try to cache this bitmap (e.g. pictures, pipes, gpu, pdf, etc.)
|
| - bitmap.setImmutable();
|
| -
|
| - return bitmap;
|
| -}
|
| -
|
| -bool DeferredImageDecoder::hotSpot(IntPoint& hotSpot) const
|
| -{
|
| - // TODO: Implement.
|
| - return m_actualDecoder ? m_actualDecoder->hotSpot(hotSpot) : false;
|
| -}
|
| -
|
| -} // namespace WebCore
|
|
|