| Index: Source/core/platform/graphics/ImageDecodingStore.h
|
| diff --git a/Source/core/platform/graphics/ImageDecodingStore.h b/Source/core/platform/graphics/ImageDecodingStore.h
|
| deleted file mode 100644
|
| index 77c24858ed3372dfe400874cacc5bb115a632f88..0000000000000000000000000000000000000000
|
| --- a/Source/core/platform/graphics/ImageDecodingStore.h
|
| +++ /dev/null
|
| @@ -1,323 +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.
|
| - */
|
| -
|
| -#ifndef ImageDecodingStore_h
|
| -#define ImageDecodingStore_h
|
| -
|
| -#include "SkSize.h"
|
| -#include "SkTypes.h"
|
| -#include "core/platform/graphics/DiscardablePixelRef.h"
|
| -#include "core/platform/image-decoders/ImageDecoder.h"
|
| -#include "platform/graphics/ScaledImageFragment.h"
|
| -#include "platform/graphics/SkSizeHash.h"
|
| -
|
| -#include "wtf/DoublyLinkedList.h"
|
| -#include "wtf/HashSet.h"
|
| -#include "wtf/OwnPtr.h"
|
| -#include "wtf/PassOwnPtr.h"
|
| -#include "wtf/ThreadingPrimitives.h"
|
| -#include "wtf/Vector.h"
|
| -
|
| -namespace WebCore {
|
| -
|
| -class ImageFrameGenerator;
|
| -class SharedBuffer;
|
| -
|
| -// FUNCTION
|
| -//
|
| -// ImageDecodingStore is a class used to manage image cache objects. There are two
|
| -// types of cache objects stored:
|
| -//
|
| -// 1. Image objects
|
| -// Each image object belongs to one frame decoded and/or resampled from an image
|
| -// file. The image object can be complete or partial. Complete means the image
|
| -// is fully decoded and will not mutate in future decoding passes. It can have
|
| -// multiple concurrent users. A partial image object has only one user.
|
| -//
|
| -// 2. Decoder objects
|
| -// A decoder object contains an image decoder. This allows decoding to resume
|
| -// from previous states. There can be one user per one decoder object at any
|
| -// time.
|
| -//
|
| -// EXTERNAL OBJECTS
|
| -//
|
| -// ScaledImageFragment
|
| -// A cached image object. Contains the bitmap and information about the bitmap
|
| -// image.
|
| -//
|
| -// ImageDecoder
|
| -// A decoder object. It is used to decode raw data into bitmap images.
|
| -//
|
| -// ImageFrameGenerator
|
| -// This is a direct user of this cache. Responsible for generating bitmap images
|
| -// using an ImageDecoder. It contains encoded image data and is used to represent
|
| -// one image file. It is used to index image and decoder objects in the cache.
|
| -//
|
| -// LazyDecodingPixelRef
|
| -// A read only user of this cache.
|
| -//
|
| -// THREAD SAFETY
|
| -//
|
| -// All public methods can be used on any thread.
|
| -
|
| -class ImageDecodingStore {
|
| -public:
|
| - static PassOwnPtr<ImageDecodingStore> create() { return adoptPtr(new ImageDecodingStore); }
|
| - ~ImageDecodingStore();
|
| -
|
| - static ImageDecodingStore* instance();
|
| - static void initializeOnce();
|
| - static void shutdown();
|
| -
|
| - // Access a complete cached image object. A complete cached image object is
|
| - // indexed by the origin (ImageFrameGenerator), scaled size and frame index
|
| - // within the image file.
|
| - // Return true if the cache object is found.
|
| - // Return false if the cache object cannot be found or it is incomplete.
|
| - bool lockCache(const ImageFrameGenerator*, const SkISize& scaledSize, size_t index, const ScaledImageFragment**);
|
| - void unlockCache(const ImageFrameGenerator*, const ScaledImageFragment*);
|
| - const ScaledImageFragment* insertAndLockCache(const ImageFrameGenerator*, PassOwnPtr<ScaledImageFragment>);
|
| -
|
| - // Access a cached decoder object. A decoder is indexed by origin (ImageFrameGenerator)
|
| - // and scaled size. Return true if the cached object is found.
|
| - bool lockDecoder(const ImageFrameGenerator*, const SkISize& scaledSize, ImageDecoder**);
|
| - void unlockDecoder(const ImageFrameGenerator*, const ImageDecoder*);
|
| - void insertDecoder(const ImageFrameGenerator*, PassOwnPtr<ImageDecoder>, bool isDiscardable);
|
| - void removeDecoder(const ImageFrameGenerator*, const ImageDecoder*);
|
| -
|
| - // Locks the cache for safety, but does not attempt to lock the object we're checking for.
|
| - bool isCached(const ImageFrameGenerator*, const SkISize& scaledSize, size_t index);
|
| -
|
| - // Remove all cache entries indexed by ImageFrameGenerator.
|
| - void removeCacheIndexedByGenerator(const ImageFrameGenerator*);
|
| -
|
| - void clear();
|
| - void setCacheLimitInBytes(size_t);
|
| - size_t memoryUsageInBytes();
|
| - int cacheEntries();
|
| - int imageCacheEntries();
|
| - int decoderCacheEntries();
|
| -
|
| -private:
|
| - // Image cache entry is identified by:
|
| - // 1. Pointer to ImageFrameGenerator.
|
| - // 2. Size of the image.
|
| - // 3. Frame index.
|
| - // 4. Frame generation. Increments on each progressive decode.
|
| - //
|
| - // The use of generation ID is to allow multiple versions of an image frame
|
| - // be stored in the cache. Each generation comes from a progressive decode.
|
| - //
|
| - // Decoder entries are identified by (1) and (2) only.
|
| - typedef std::pair<const ImageFrameGenerator*, SkISize> DecoderCacheKey;
|
| - typedef std::pair<size_t, size_t> IndexAndGeneration;
|
| - typedef std::pair<DecoderCacheKey, IndexAndGeneration> ImageCacheKey;
|
| -
|
| - // Base class for all cache entries.
|
| - class CacheEntry : public DoublyLinkedListNode<CacheEntry> {
|
| - friend class WTF::DoublyLinkedListNode<CacheEntry>;
|
| - public:
|
| - enum CacheType {
|
| - TypeImage,
|
| - TypeDecoder,
|
| - };
|
| -
|
| - CacheEntry(const ImageFrameGenerator* generator, int useCount, bool isDiscardable)
|
| - : m_generator(generator)
|
| - , m_useCount(useCount)
|
| - , m_isDiscardable(isDiscardable)
|
| - , m_prev(0)
|
| - , m_next(0)
|
| - {
|
| - }
|
| -
|
| - virtual ~CacheEntry()
|
| - {
|
| - ASSERT(!m_useCount);
|
| - }
|
| -
|
| - const ImageFrameGenerator* generator() const { return m_generator; }
|
| - int useCount() const { return m_useCount; }
|
| - void incrementUseCount() { ++m_useCount; }
|
| - void decrementUseCount() { --m_useCount; ASSERT(m_useCount >= 0); }
|
| - bool isDiscardable() const { return m_isDiscardable; }
|
| -
|
| - // FIXME: getSafeSize() returns size in bytes truncated to a 32-bits integer.
|
| - // Find a way to get the size in 64-bits.
|
| - virtual size_t memoryUsageInBytes() const = 0;
|
| - virtual CacheType type() const = 0;
|
| -
|
| - protected:
|
| - const ImageFrameGenerator* m_generator;
|
| - int m_useCount;
|
| - bool m_isDiscardable;
|
| -
|
| - private:
|
| - CacheEntry* m_prev;
|
| - CacheEntry* m_next;
|
| - };
|
| -
|
| - class ImageCacheEntry : public CacheEntry {
|
| - public:
|
| - static PassOwnPtr<ImageCacheEntry> createAndUse(const ImageFrameGenerator* generator, PassOwnPtr<ScaledImageFragment> image)
|
| - {
|
| - return adoptPtr(new ImageCacheEntry(generator, 1, image));
|
| - }
|
| -
|
| - ImageCacheEntry(const ImageFrameGenerator* generator, int count, PassOwnPtr<ScaledImageFragment> image)
|
| - : CacheEntry(generator, count, DiscardablePixelRef::isDiscardable(image->bitmap().pixelRef()))
|
| - , m_cachedImage(image)
|
| - {
|
| - }
|
| -
|
| - // FIXME: getSafeSize() returns size in bytes truncated to a 32-bits integer.
|
| - // Find a way to get the size in 64-bits.
|
| - virtual size_t memoryUsageInBytes() const { return cachedImage()->bitmap().getSafeSize(); }
|
| - virtual CacheType type() const { return TypeImage; }
|
| -
|
| - static ImageCacheKey makeCacheKey(const ImageFrameGenerator* generator, const SkISize& size, size_t index, size_t generation)
|
| - {
|
| - return std::make_pair(std::make_pair(generator, size), std::make_pair(index, generation));
|
| - }
|
| - ImageCacheKey cacheKey() const { return makeCacheKey(m_generator, m_cachedImage->scaledSize(), m_cachedImage->index(), m_cachedImage->generation()); }
|
| - const ScaledImageFragment* cachedImage() const { return m_cachedImage.get(); }
|
| - ScaledImageFragment* cachedImage() { return m_cachedImage.get(); }
|
| -
|
| - private:
|
| - OwnPtr<ScaledImageFragment> m_cachedImage;
|
| - };
|
| -
|
| - class DecoderCacheEntry : public CacheEntry {
|
| - public:
|
| - static PassOwnPtr<DecoderCacheEntry> create(const ImageFrameGenerator* generator, PassOwnPtr<ImageDecoder> decoder, bool isDiscardable)
|
| - {
|
| - return adoptPtr(new DecoderCacheEntry(generator, 0, decoder, isDiscardable));
|
| - }
|
| -
|
| - DecoderCacheEntry(const ImageFrameGenerator* generator, int count, PassOwnPtr<ImageDecoder> decoder, bool isDiscardable)
|
| - : CacheEntry(generator, count, isDiscardable)
|
| - , m_cachedDecoder(decoder)
|
| - , m_size(SkISize::Make(m_cachedDecoder->decodedSize().width(), m_cachedDecoder->decodedSize().height()))
|
| - {
|
| - }
|
| -
|
| - virtual size_t memoryUsageInBytes() const { return m_size.width() * m_size.height() * 4; }
|
| - virtual CacheType type() const { return TypeDecoder; }
|
| -
|
| - static DecoderCacheKey makeCacheKey(const ImageFrameGenerator* generator, const SkISize& size)
|
| - {
|
| - return std::make_pair(generator, size);
|
| - }
|
| - static DecoderCacheKey makeCacheKey(const ImageFrameGenerator* generator, const ImageDecoder* decoder)
|
| - {
|
| - return std::make_pair(generator, SkISize::Make(decoder->decodedSize().width(), decoder->decodedSize().height()));
|
| - }
|
| - DecoderCacheKey cacheKey() const { return makeCacheKey(m_generator, m_size); }
|
| - ImageDecoder* cachedDecoder() const { return m_cachedDecoder.get(); }
|
| -
|
| - private:
|
| - OwnPtr<ImageDecoder> m_cachedDecoder;
|
| - SkISize m_size;
|
| - };
|
| -
|
| - ImageDecodingStore();
|
| -
|
| - void prune();
|
| -
|
| - // These helper methods are called while m_mutex is locked.
|
| -
|
| - // Find and lock a cache entry, and return true on success.
|
| - // Memory of the cache entry can be discarded, in which case it is saved in
|
| - // deletionList.
|
| - bool lockCacheEntryInternal(ImageCacheEntry*, const ScaledImageFragment**, Vector<OwnPtr<CacheEntry> >* deletionList);
|
| -
|
| - template<class T, class U, class V> void insertCacheInternal(PassOwnPtr<T> cacheEntry, U* cacheMap, V* identifierMap);
|
| -
|
| - // Helper method to remove a cache entry. Ownership is transferred to
|
| - // deletionList. Use of Vector<> is handy when removing multiple entries.
|
| - template<class T, class U, class V> void removeFromCacheInternal(const T* cacheEntry, U* cacheMap, V* identifierMap, Vector<OwnPtr<CacheEntry> >* deletionList);
|
| -
|
| - // Helper method to remove a cache entry. Uses the templated version base on
|
| - // the type of cache entry.
|
| - void removeFromCacheInternal(const CacheEntry*, Vector<OwnPtr<CacheEntry> >* deletionList);
|
| -
|
| - // Helper method to remove all cache entries associated with a ImageFraneGenerator.
|
| - // Ownership of cache entries is transferred to deletionList.
|
| - template<class U, class V> void removeCacheIndexedByGeneratorInternal(U* cacheMap, V* identifierMap, const ImageFrameGenerator*, Vector<OwnPtr<CacheEntry> >* deletionList);
|
| -
|
| - // Helper method to remove cache entry pointers from the LRU list.
|
| - void removeFromCacheListInternal(const Vector<OwnPtr<CacheEntry> >& deletionList);
|
| -
|
| - void incrementMemoryUsage(size_t size) { m_memoryUsageInBytes += size; }
|
| - void decrementMemoryUsage(size_t size)
|
| - {
|
| - ASSERT(m_memoryUsageInBytes >= size);
|
| - m_memoryUsageInBytes -= size;
|
| - }
|
| -
|
| - // A doubly linked list that maintains usage history of cache entries.
|
| - // This is used for eviction of old entries.
|
| - // Head of this list is the least recently used cache entry.
|
| - // Tail of this list is the most recently used cache entry.
|
| - DoublyLinkedList<CacheEntry> m_orderedCacheList;
|
| -
|
| - // A lookup table for all image cache objects. Owns all image cache objects.
|
| - typedef HashMap<ImageCacheKey, OwnPtr<ImageCacheEntry> > ImageCacheMap;
|
| - ImageCacheMap m_imageCacheMap;
|
| -
|
| - // A lookup table for all decoder cache objects. Owns all decoder cache objects.
|
| - typedef HashMap<DecoderCacheKey, OwnPtr<DecoderCacheEntry> > DecoderCacheMap;
|
| - DecoderCacheMap m_decoderCacheMap;
|
| -
|
| - // A lookup table to map ImageFrameGenerator to all associated image
|
| - // cache keys.
|
| - typedef HashSet<ImageCacheKey> ImageCacheKeySet;
|
| - typedef HashMap<const ImageFrameGenerator*, ImageCacheKeySet> ImageCacheKeyMap;
|
| - ImageCacheKeyMap m_imageCacheKeyMap;
|
| -
|
| - // A lookup table to map ImageFrameGenerator to all associated
|
| - // decoder cache keys.
|
| - typedef HashSet<DecoderCacheKey> DecoderCacheKeySet;
|
| - typedef HashMap<const ImageFrameGenerator*, DecoderCacheKeySet> DecoderCacheKeyMap;
|
| - DecoderCacheKeyMap m_decoderCacheKeyMap;
|
| -
|
| - size_t m_cacheLimitInBytes;
|
| - size_t m_memoryUsageInBytes;
|
| -
|
| - // Protect concurrent access to these members:
|
| - // m_orderedCacheList
|
| - // m_imageCacheMap, m_decoderCacheMap and all CacheEntrys stored in it
|
| - // m_imageCacheKeyMap
|
| - // m_decoderCacheKeyMap
|
| - // m_cacheLimitInBytes
|
| - // m_memoryUsageInBytes
|
| - // This mutex also protects calls to underlying skBitmap's
|
| - // lockPixels()/unlockPixels() as they are not threadsafe.
|
| - Mutex m_mutex;
|
| -};
|
| -
|
| -} // namespace WebCore
|
| -
|
| -#endif
|
|
|