1/* 2 * Copyright 2015 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8#include "SkBitmapCache.h" 9#include "SkResourceCache.h" 10#include "SkYUVPlanesCache.h" 11 12#define CHECK_LOCAL(localCache, localName, globalName, ...) \ 13 ((localCache) ? localCache->localName(__VA_ARGS__) : SkResourceCache::globalName(__VA_ARGS__)) 14 15namespace { 16static unsigned gYUVPlanesKeyNamespaceLabel; 17 18struct YUVValue { 19 SkYUVPlanesCache::Info fInfo; 20 SkCachedData* fData; 21}; 22 23struct YUVPlanesKey : public SkResourceCache::Key { 24 YUVPlanesKey(uint32_t genID) 25 : fGenID(genID) 26 { 27 this->init(&gYUVPlanesKeyNamespaceLabel, SkMakeResourceCacheSharedIDForBitmap(genID), 28 sizeof(genID)); 29 } 30 31 uint32_t fGenID; 32}; 33 34struct YUVPlanesRec : public SkResourceCache::Rec { 35 YUVPlanesRec(YUVPlanesKey key, SkCachedData* data, SkYUVPlanesCache::Info* info) 36 : fKey(key) 37 { 38 fValue.fData = data; 39 fValue.fInfo = *info; 40 fValue.fData->attachToCacheAndRef(); 41 } 42 ~YUVPlanesRec() { 43 fValue.fData->detachFromCacheAndUnref(); 44 } 45 46 YUVPlanesKey fKey; 47 YUVValue fValue; 48 49 const Key& getKey() const override { return fKey; } 50 size_t bytesUsed() const override { return sizeof(*this) + fValue.fData->size(); } 51 52 static bool Visitor(const SkResourceCache::Rec& baseRec, void* contextData) { 53 const YUVPlanesRec& rec = static_cast<const YUVPlanesRec&>(baseRec); 54 YUVValue* result = static_cast<YUVValue*>(contextData); 55 56 SkCachedData* tmpData = rec.fValue.fData; 57 tmpData->ref(); 58 if (NULL == tmpData->data()) { 59 tmpData->unref(); 60 return false; 61 } 62 result->fData = tmpData; 63 result->fInfo = rec.fValue.fInfo; 64 return true; 65 } 66}; 67} // namespace 68 69SkCachedData* SkYUVPlanesCache::FindAndRef(uint32_t genID, Info* info, 70 SkResourceCache* localCache) { 71 YUVValue result; 72 YUVPlanesKey key(genID); 73 if (!CHECK_LOCAL(localCache, find, Find, key, YUVPlanesRec::Visitor, &result)) { 74 return NULL; 75 } 76 77 *info = result.fInfo; 78 return result.fData; 79} 80 81void SkYUVPlanesCache::Add(uint32_t genID, SkCachedData* data, Info* info, 82 SkResourceCache* localCache) { 83 YUVPlanesKey key(genID); 84 return CHECK_LOCAL(localCache, add, Add, SkNEW_ARGS(YUVPlanesRec, (key, data, info))); 85} 86