104617139f7f715bdc05a32a58e65e3c208bccff4reed/*
204617139f7f715bdc05a32a58e65e3c208bccff4reed * Copyright 2014 Google Inc.
304617139f7f715bdc05a32a58e65e3c208bccff4reed *
404617139f7f715bdc05a32a58e65e3c208bccff4reed * Use of this source code is governed by a BSD-style license that can be
504617139f7f715bdc05a32a58e65e3c208bccff4reed * found in the LICENSE file.
604617139f7f715bdc05a32a58e65e3c208bccff4reed */
704617139f7f715bdc05a32a58e65e3c208bccff4reed
804617139f7f715bdc05a32a58e65e3c208bccff4reed#ifndef SkBitmapCache_DEFINED
904617139f7f715bdc05a32a58e65e3c208bccff4reed#define SkBitmapCache_DEFINED
1004617139f7f715bdc05a32a58e65e3c208bccff4reed
1114b6aba0997a8b463eae824d770fc5ad1ab89617reed#include "SkBitmap.h"
126644d9353f3f0c09914385fd762e073f98d54205reed#include "SkMipMap.h"
13680fb9e8f10d24b5fe35c90338de37c57392f1aareed
1498ed7b6d01c16ad9ace652ec25861689d765d0b5reedclass SkImage;
1530ad5306be25565484a3dd76237984e071b7c4b3reedclass SkResourceCache;
1604617139f7f715bdc05a32a58e65e3c208bccff4reed
177eeba2587760a0802fd2b90765b4fd0e5e895375reeduint64_t SkMakeResourceCacheSharedIDForBitmap(uint32_t bitmapGenID);
187eeba2587760a0802fd2b90765b4fd0e5e895375reed
197eeba2587760a0802fd2b90765b4fd0e5e895375reedvoid SkNotifyBitmapGenIDIsStale(uint32_t bitmapGenID);
207eeba2587760a0802fd2b90765b4fd0e5e895375reed
2198ed7b6d01c16ad9ace652ec25861689d765d0b5reedstruct SkBitmapCacheDesc {
225fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed    uint32_t    fImageID;       // != 0
235fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed    int32_t     fScaledWidth;   // 0 for unscaled
245fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed    int32_t     fScaledHeight;  // 0 for unscaled
255fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed    SkIRect     fSubset;        // always set to a valid rect (entire or subset)
2698ed7b6d01c16ad9ace652ec25861689d765d0b5reed
275fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed    void validate() const {
285fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed        SkASSERT(fImageID);
295fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed        if (fScaledWidth || fScaledHeight) {
305fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed            SkASSERT(fScaledWidth && fScaledHeight);
315fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed        }
325fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed        SkASSERT(fSubset.fLeft >= 0 && fSubset.fTop >= 0);
335fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed        SkASSERT(fSubset.width() > 0 && fSubset.height() > 0);
345fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed    }
355fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed
365fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed    static SkBitmapCacheDesc Make(const SkBitmap&, int scaledWidth, int scaledHeight);
3798ed7b6d01c16ad9ace652ec25861689d765d0b5reed    static SkBitmapCacheDesc Make(const SkBitmap&);
385fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed    static SkBitmapCacheDesc Make(const SkImage*, int scaledWidth, int scaledHeight);
3998ed7b6d01c16ad9ace652ec25861689d765d0b5reed    static SkBitmapCacheDesc Make(const SkImage*);
405fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed
415fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed    // Use with care -- width/height must match the original bitmap/image
425fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed    static SkBitmapCacheDesc Make(uint32_t genID, int origWidth, int origHeight);
4398ed7b6d01c16ad9ace652ec25861689d765d0b5reed};
4498ed7b6d01c16ad9ace652ec25861689d765d0b5reed
4504617139f7f715bdc05a32a58e65e3c208bccff4reedclass SkBitmapCache {
4604617139f7f715bdc05a32a58e65e3c208bccff4reedpublic:
47680fb9e8f10d24b5fe35c90338de37c57392f1aareed    /**
4898ed7b6d01c16ad9ace652ec25861689d765d0b5reed     *  Search based on the desc. If found, returns true and
49680fb9e8f10d24b5fe35c90338de37c57392f1aareed     *  result will be set to the matching bitmap with its pixels already locked.
50680fb9e8f10d24b5fe35c90338de37c57392f1aareed     */
517a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed    static bool Find(const SkBitmapCacheDesc&, SkBitmap* result);
528159146699f691b88f60564fc0811a6da3e8693fpiotaixr
537a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed    class Rec;
547a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed    struct RecDeleter { void operator()(Rec* r) { PrivateDeleteRec(r); } };
557a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed    typedef std::unique_ptr<Rec, RecDeleter> RecPtr;
567a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed
577a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed    static RecPtr Alloc(const SkBitmapCacheDesc&, const SkImageInfo&, SkPixmap*);
587a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed    static void Add(RecPtr, SkBitmap*);
597a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed
607a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reedprivate:
617a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed    static void PrivateDeleteRec(Rec*);
6204617139f7f715bdc05a32a58e65e3c208bccff4reed};
6304617139f7f715bdc05a32a58e65e3c208bccff4reed
6404617139f7f715bdc05a32a58e65e3c208bccff4reedclass SkMipMapCache {
6504617139f7f715bdc05a32a58e65e3c208bccff4reedpublic:
665fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed    // Note: the scaled width/height in desc must be 0, as any other value would not make sense.
677b8400dad2f82dcc6ed3c7cc1707ebaf85f04840Brian Osman    static const SkMipMap* FindAndRef(const SkBitmapCacheDesc&, SkDestinationSurfaceColorMode,
6898ed7b6d01c16ad9ace652ec25861689d765d0b5reed                                      SkResourceCache* localCache = nullptr);
697b8400dad2f82dcc6ed3c7cc1707ebaf85f04840Brian Osman    static const SkMipMap* AddAndRef(const SkBitmap& src, SkDestinationSurfaceColorMode,
706644d9353f3f0c09914385fd762e073f98d54205reed                                     SkResourceCache* localCache = nullptr);
7104617139f7f715bdc05a32a58e65e3c208bccff4reed};
7204617139f7f715bdc05a32a58e65e3c208bccff4reed
7304617139f7f715bdc05a32a58e65e3c208bccff4reed#endif
74