1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2014 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 "include/core/SkYUVAInfo.h" 9cb93a386Sopenharmony_ci#include "include/core/SkYUVAPixmaps.h" 10cb93a386Sopenharmony_ci#include "src/core/SkCachedData.h" 11cb93a386Sopenharmony_ci#include "src/core/SkResourceCache.h" 12cb93a386Sopenharmony_ci#include "src/core/SkYUVPlanesCache.h" 13cb93a386Sopenharmony_ci#include "tests/Test.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_cienum LockedState { 16cb93a386Sopenharmony_ci kUnlocked, 17cb93a386Sopenharmony_ci kLocked, 18cb93a386Sopenharmony_ci}; 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_cienum CachedState { 21cb93a386Sopenharmony_ci kNotInCache, 22cb93a386Sopenharmony_ci kInCache, 23cb93a386Sopenharmony_ci}; 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_cistatic void check_data(skiatest::Reporter* reporter, SkCachedData* data, 26cb93a386Sopenharmony_ci int refcnt, CachedState cacheState, LockedState lockedState) { 27cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, data->testing_only_getRefCnt() == refcnt); 28cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, data->testing_only_isInCache() == (kInCache == cacheState)); 29cb93a386Sopenharmony_ci bool isLocked = (data->data() != nullptr); 30cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, isLocked == (lockedState == kLocked)); 31cb93a386Sopenharmony_ci} 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ciDEF_TEST(YUVPlanesCache, reporter) { 34cb93a386Sopenharmony_ci SkResourceCache cache(1024); 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ci SkYUVAInfo yuvaInfo({5, 5}, 37cb93a386Sopenharmony_ci SkYUVAInfo::PlaneConfig::kY_U_V, 38cb93a386Sopenharmony_ci SkYUVAInfo::Subsampling::k420, 39cb93a386Sopenharmony_ci kRec601_Limited_SkYUVColorSpace); 40cb93a386Sopenharmony_ci SkYUVAPixmapInfo yuvaPixmapInfo(yuvaInfo, 41cb93a386Sopenharmony_ci SkYUVAPixmapInfo::DataType::kUnorm8, 42cb93a386Sopenharmony_ci /*rowBytes[]*/ nullptr); 43cb93a386Sopenharmony_ci SkYUVAPixmaps yuvaPixmaps; 44cb93a386Sopenharmony_ci const uint32_t genID = 12345678; 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ci SkCachedData* data = SkYUVPlanesCache::FindAndRef(genID, &yuvaPixmaps, &cache); 47cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, !data); 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci size_t size = yuvaPixmapInfo.computeTotalBytes(); 50cb93a386Sopenharmony_ci data = cache.newCachedData(size); 51cb93a386Sopenharmony_ci memset(data->writable_data(), 0xff, size); 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci SkPixmap pmaps[SkYUVAInfo::kMaxPlanes]; 54cb93a386Sopenharmony_ci yuvaPixmapInfo.initPixmapsFromSingleAllocation(data->writable_data(), pmaps); 55cb93a386Sopenharmony_ci yuvaPixmaps = SkYUVAPixmaps::FromExternalPixmaps(yuvaInfo, pmaps); 56cb93a386Sopenharmony_ci 57cb93a386Sopenharmony_ci SkYUVPlanesCache::Add(genID, data, yuvaPixmaps, &cache); 58cb93a386Sopenharmony_ci check_data(reporter, data, 2, kInCache, kLocked); 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_ci data->unref(); 61cb93a386Sopenharmony_ci check_data(reporter, data, 1, kInCache, kUnlocked); 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ci SkYUVAPixmaps yuvaPixmapsRead; 64cb93a386Sopenharmony_ci data = SkYUVPlanesCache::FindAndRef(genID, &yuvaPixmapsRead, &cache); 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, data); 67cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, data->size() == size); 68cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, yuvaPixmapsRead.yuvaInfo() == yuvaPixmaps.yuvaInfo()); 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ci for (int i = 0; i < yuvaPixmaps.numPlanes(); ++i) { 71cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, yuvaPixmaps.plane(i).info() == yuvaPixmapsRead.plane(i).info()); 72cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, yuvaPixmaps.plane(i).addr() == yuvaPixmapsRead.plane(i).addr()); 73cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, yuvaPixmaps.plane(i).rowBytes() == 74cb93a386Sopenharmony_ci yuvaPixmapsRead.plane(i).rowBytes()); 75cb93a386Sopenharmony_ci } 76cb93a386Sopenharmony_ci 77cb93a386Sopenharmony_ci check_data(reporter, data, 2, kInCache, kLocked); 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci cache.purgeAll(); 80cb93a386Sopenharmony_ci check_data(reporter, data, 1, kNotInCache, kLocked); 81cb93a386Sopenharmony_ci data->unref(); 82cb93a386Sopenharmony_ci} 83