/* * Copyright 2014 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "include/core/SkYUVAInfo.h" #include "include/core/SkYUVAPixmaps.h" #include "src/core/SkCachedData.h" #include "src/core/SkResourceCache.h" #include "src/core/SkYUVPlanesCache.h" #include "tests/Test.h" enum LockedState { kUnlocked, kLocked, }; enum CachedState { kNotInCache, kInCache, }; static void check_data(skiatest::Reporter* reporter, SkCachedData* data, int refcnt, CachedState cacheState, LockedState lockedState) { REPORTER_ASSERT(reporter, data->testing_only_getRefCnt() == refcnt); REPORTER_ASSERT(reporter, data->testing_only_isInCache() == (kInCache == cacheState)); bool isLocked = (data->data() != nullptr); REPORTER_ASSERT(reporter, isLocked == (lockedState == kLocked)); } DEF_TEST(YUVPlanesCache, reporter) { SkResourceCache cache(1024); SkYUVAInfo yuvaInfo({5, 5}, SkYUVAInfo::PlaneConfig::kY_U_V, SkYUVAInfo::Subsampling::k420, kRec601_Limited_SkYUVColorSpace); SkYUVAPixmapInfo yuvaPixmapInfo(yuvaInfo, SkYUVAPixmapInfo::DataType::kUnorm8, /*rowBytes[]*/ nullptr); SkYUVAPixmaps yuvaPixmaps; const uint32_t genID = 12345678; SkCachedData* data = SkYUVPlanesCache::FindAndRef(genID, &yuvaPixmaps, &cache); REPORTER_ASSERT(reporter, !data); size_t size = yuvaPixmapInfo.computeTotalBytes(); data = cache.newCachedData(size); memset(data->writable_data(), 0xff, size); SkPixmap pmaps[SkYUVAInfo::kMaxPlanes]; yuvaPixmapInfo.initPixmapsFromSingleAllocation(data->writable_data(), pmaps); yuvaPixmaps = SkYUVAPixmaps::FromExternalPixmaps(yuvaInfo, pmaps); SkYUVPlanesCache::Add(genID, data, yuvaPixmaps, &cache); check_data(reporter, data, 2, kInCache, kLocked); data->unref(); check_data(reporter, data, 1, kInCache, kUnlocked); SkYUVAPixmaps yuvaPixmapsRead; data = SkYUVPlanesCache::FindAndRef(genID, &yuvaPixmapsRead, &cache); REPORTER_ASSERT(reporter, data); REPORTER_ASSERT(reporter, data->size() == size); REPORTER_ASSERT(reporter, yuvaPixmapsRead.yuvaInfo() == yuvaPixmaps.yuvaInfo()); for (int i = 0; i < yuvaPixmaps.numPlanes(); ++i) { REPORTER_ASSERT(reporter, yuvaPixmaps.plane(i).info() == yuvaPixmapsRead.plane(i).info()); REPORTER_ASSERT(reporter, yuvaPixmaps.plane(i).addr() == yuvaPixmapsRead.plane(i).addr()); REPORTER_ASSERT(reporter, yuvaPixmaps.plane(i).rowBytes() == yuvaPixmapsRead.plane(i).rowBytes()); } check_data(reporter, data, 2, kInCache, kLocked); cache.purgeAll(); check_data(reporter, data, 1, kNotInCache, kLocked); data->unref(); }