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