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