/*
|
* Copyright 2015 Google Inc.
|
*
|
* Use of this source code is governed by a BSD-style license that can be
|
* found in the LICENSE file.
|
*/
|
|
#include "SkBitmapCache.h"
|
#include "SkResourceCache.h"
|
#include "SkYUVPlanesCache.h"
|
|
#define CHECK_LOCAL(localCache, localName, globalName, ...) \
|
((localCache) ? localCache->localName(__VA_ARGS__) : SkResourceCache::globalName(__VA_ARGS__))
|
|
namespace {
|
static unsigned gYUVPlanesKeyNamespaceLabel;
|
|
struct YUVValue {
|
SkYUVPlanesCache::Info fInfo;
|
SkCachedData* fData;
|
};
|
|
struct YUVPlanesKey : public SkResourceCache::Key {
|
YUVPlanesKey(uint32_t genID)
|
: fGenID(genID)
|
{
|
this->init(&gYUVPlanesKeyNamespaceLabel, SkMakeResourceCacheSharedIDForBitmap(genID),
|
sizeof(genID));
|
}
|
|
uint32_t fGenID;
|
};
|
|
struct YUVPlanesRec : public SkResourceCache::Rec {
|
YUVPlanesRec(YUVPlanesKey key, SkCachedData* data, SkYUVPlanesCache::Info* info)
|
: fKey(key)
|
{
|
fValue.fData = data;
|
fValue.fInfo = *info;
|
fValue.fData->attachToCacheAndRef();
|
}
|
~YUVPlanesRec() override {
|
fValue.fData->detachFromCacheAndUnref();
|
}
|
|
YUVPlanesKey fKey;
|
YUVValue fValue;
|
|
const Key& getKey() const override { return fKey; }
|
size_t bytesUsed() const override { return sizeof(*this) + fValue.fData->size(); }
|
const char* getCategory() const override { return "yuv-planes"; }
|
SkDiscardableMemory* diagnostic_only_getDiscardable() const override {
|
return fValue.fData->diagnostic_only_getDiscardable();
|
}
|
|
static bool Visitor(const SkResourceCache::Rec& baseRec, void* contextData) {
|
const YUVPlanesRec& rec = static_cast<const YUVPlanesRec&>(baseRec);
|
YUVValue* result = static_cast<YUVValue*>(contextData);
|
|
SkCachedData* tmpData = rec.fValue.fData;
|
tmpData->ref();
|
if (nullptr == tmpData->data()) {
|
tmpData->unref();
|
return false;
|
}
|
result->fData = tmpData;
|
result->fInfo = rec.fValue.fInfo;
|
return true;
|
}
|
};
|
} // namespace
|
|
SkCachedData* SkYUVPlanesCache::FindAndRef(uint32_t genID, Info* info,
|
SkResourceCache* localCache) {
|
YUVValue result;
|
YUVPlanesKey key(genID);
|
if (!CHECK_LOCAL(localCache, find, Find, key, YUVPlanesRec::Visitor, &result)) {
|
return nullptr;
|
}
|
|
*info = result.fInfo;
|
return result.fData;
|
}
|
|
void SkYUVPlanesCache::Add(uint32_t genID, SkCachedData* data, Info* info,
|
SkResourceCache* localCache) {
|
YUVPlanesKey key(genID);
|
return CHECK_LOCAL(localCache, add, Add, new YUVPlanesRec(key, data, info));
|
}
|