| /* | |
| * Copyright 2022 Google LLC | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "include/core/SkData.h" | |
| #include "include/core/SkFont.h" | |
| #include "include/core/SkRefCnt.h" | |
| #include "src/core/SkReadBuffer.h" | |
| #include "src/core/SkStrike.h" | |
| #include "src/core/SkStrikeCache.h" | |
| #include "src/core/SkStrikeSpec.h" | |
| #include "src/core/SkWriteBuffer.h" | |
| #include "src/text/StrikeForGPU.h" | |
| #include "tests/Test.h" | |
| #include <cstdint> | |
| #include <memory> | |
| #include <optional> | |
| #include <utility> | |
| using namespace sktext; | |
| DEF_TEST(SkStrikePromise_Basic, reporter) { | |
| auto strikeCache = std::make_unique<SkStrikeCache>(); | |
| auto [strikeSpec, _] = SkStrikeSpec::MakeCanonicalized(SkFont()); | |
| class Pinner : public ::SkStrikePinner { | |
| public: | |
| // Changing canDelete to return true causes this test to expectedly fail. | |
| bool canDelete() override { return false; } | |
| }; | |
| intptr_t toCompareWith; | |
| sk_sp<SkData> data; | |
| // Ensure that the ref in srcPromise is dropped. | |
| { | |
| // Make a strike with a Pinner. | |
| auto strike = strikeCache->createStrike(strikeSpec, nullptr, std::make_unique<Pinner>()); | |
| toCompareWith = reinterpret_cast<intptr_t>(strike.get()); | |
| SkStrikePromise srcPromise(std::move(strike)); | |
| SkBinaryWriteBuffer writeBuffer({}); | |
| srcPromise.flatten(writeBuffer); | |
| data = writeBuffer.snapshotAsData(); | |
| } | |
| // Remove all unpinned strikes. | |
| strikeCache->purgeAll(); | |
| SkReadBuffer readBuffer{data->data(), data->size()}; | |
| std::optional<SkStrikePromise> dstPromise = SkStrikePromise::MakeFromBuffer( | |
| readBuffer, nullptr, strikeCache.get()); | |
| REPORTER_ASSERT(reporter, dstPromise.has_value()); | |
| REPORTER_ASSERT(reporter, | |
| reinterpret_cast<intptr_t>(dstPromise->strike()) == toCompareWith); | |
| } |