xref: /third_party/skia/tests/ShaperTest.cpp (revision cb93a386)
1cb93a386Sopenharmony_ci// Copyright 2019 Google LLC.
2cb93a386Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
3cb93a386Sopenharmony_ci
4cb93a386Sopenharmony_ci#include "tests/Test.h"
5cb93a386Sopenharmony_ci
6cb93a386Sopenharmony_ci#if !defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) && !defined(SK_BUILD_FOR_GOOGLE3)
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#include "include/core/SkData.h"
9cb93a386Sopenharmony_ci#include "include/core/SkFont.h"
10cb93a386Sopenharmony_ci#include "include/core/SkPoint.h"
11cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h"
12cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h"
13cb93a386Sopenharmony_ci#include "include/core/SkTypes.h"
14cb93a386Sopenharmony_ci#include "include/private/SkTo.h"
15cb93a386Sopenharmony_ci#include "modules/skshaper/include/SkShaper.h"
16cb93a386Sopenharmony_ci#include "tools/Resources.h"
17cb93a386Sopenharmony_ci
18cb93a386Sopenharmony_ci#include <cstdint>
19cb93a386Sopenharmony_ci#include <memory>
20cb93a386Sopenharmony_ci
21cb93a386Sopenharmony_cinamespace {
22cb93a386Sopenharmony_cistruct RunHandler final : public SkShaper::RunHandler {
23cb93a386Sopenharmony_ci    const char* fResource;
24cb93a386Sopenharmony_ci    skiatest::Reporter* fReporter;
25cb93a386Sopenharmony_ci    std::unique_ptr<SkGlyphID[]> fGlyphs;
26cb93a386Sopenharmony_ci    std::unique_ptr<SkPoint[]> fPositions;
27cb93a386Sopenharmony_ci    std::unique_ptr<uint32_t[]> fClusters;
28cb93a386Sopenharmony_ci    SkShaper::RunHandler::Range fRange;
29cb93a386Sopenharmony_ci    unsigned fGlyphCount = 0;
30cb93a386Sopenharmony_ci
31cb93a386Sopenharmony_ci    RunHandler(const char* resource, skiatest::Reporter* reporter)
32cb93a386Sopenharmony_ci        : fResource(resource), fReporter(reporter) {}
33cb93a386Sopenharmony_ci
34cb93a386Sopenharmony_ci    void beginLine() override {}
35cb93a386Sopenharmony_ci    void runInfo(const SkShaper::RunHandler::RunInfo& info) override {}
36cb93a386Sopenharmony_ci    void commitRunInfo() override {}
37cb93a386Sopenharmony_ci    SkShaper::RunHandler::Buffer runBuffer(const SkShaper::RunHandler::RunInfo& info) override {
38cb93a386Sopenharmony_ci        fGlyphCount = SkToUInt(info.glyphCount);
39cb93a386Sopenharmony_ci        fRange = info.utf8Range;
40cb93a386Sopenharmony_ci        fGlyphs = std::make_unique<SkGlyphID[]>(info.glyphCount);
41cb93a386Sopenharmony_ci        fPositions = std::make_unique<SkPoint[]>(info.glyphCount);
42cb93a386Sopenharmony_ci        fClusters = std::make_unique<uint32_t[]>(info.glyphCount);
43cb93a386Sopenharmony_ci        return SkShaper::RunHandler::Buffer{fGlyphs.get(),
44cb93a386Sopenharmony_ci                                            fPositions.get(),
45cb93a386Sopenharmony_ci                                            nullptr,
46cb93a386Sopenharmony_ci                                            fClusters.get(),
47cb93a386Sopenharmony_ci                                            {0, 0}};
48cb93a386Sopenharmony_ci    }
49cb93a386Sopenharmony_ci    void commitRunBuffer(const RunInfo& info) override {
50cb93a386Sopenharmony_ci        REPORTER_ASSERT(fReporter, fGlyphCount == info.glyphCount, "%s", fResource);
51cb93a386Sopenharmony_ci        REPORTER_ASSERT(fReporter, fRange.begin() == info.utf8Range.begin(), "%s", fResource);
52cb93a386Sopenharmony_ci        REPORTER_ASSERT(fReporter, fRange.size() == info.utf8Range.size(), "%s", fResource);
53cb93a386Sopenharmony_ci        for (unsigned i = 0; i < fGlyphCount; ++i) {
54cb93a386Sopenharmony_ci            REPORTER_ASSERT(fReporter, fClusters[i] >= fRange.begin(),
55cb93a386Sopenharmony_ci                            "%s %u %u", fResource, i, fGlyphCount);
56cb93a386Sopenharmony_ci            REPORTER_ASSERT(fReporter, fClusters[i] <  fRange.end(),
57cb93a386Sopenharmony_ci                            "%s %u %u", fResource, i, fGlyphCount);
58cb93a386Sopenharmony_ci        }
59cb93a386Sopenharmony_ci    }
60cb93a386Sopenharmony_ci    void commitLine() override {}
61cb93a386Sopenharmony_ci};
62cb93a386Sopenharmony_ci
63cb93a386Sopenharmony_civoid shaper_test(skiatest::Reporter* reporter, const char* name, SkData* data) {
64cb93a386Sopenharmony_ci    auto shaper = SkShaper::Make();
65cb93a386Sopenharmony_ci    if (!shaper) {
66cb93a386Sopenharmony_ci        ERRORF(reporter, "Could not create shaper.");
67cb93a386Sopenharmony_ci        return;
68cb93a386Sopenharmony_ci    }
69cb93a386Sopenharmony_ci
70cb93a386Sopenharmony_ci    constexpr float kWidth = 400;
71cb93a386Sopenharmony_ci    SkFont font(SkTypeface::MakeDefault());
72cb93a386Sopenharmony_ci    RunHandler rh(name, reporter);
73cb93a386Sopenharmony_ci    shaper->shape((const char*)data->data(), data->size(), font, true, kWidth, &rh);
74cb93a386Sopenharmony_ci
75cb93a386Sopenharmony_ci    constexpr SkFourByteTag latn = SkSetFourByteTag('l','a','t','n');
76cb93a386Sopenharmony_ci    auto fontIterator = SkShaper::TrivialFontRunIterator(font, data->size());
77cb93a386Sopenharmony_ci    auto bidiIterator = SkShaper::TrivialBiDiRunIterator(0, data->size());
78cb93a386Sopenharmony_ci    auto scriptIterator = SkShaper::TrivialScriptRunIterator(latn, data->size());
79cb93a386Sopenharmony_ci    auto languageIterator = SkShaper::TrivialLanguageRunIterator("en-US", data->size());
80cb93a386Sopenharmony_ci    shaper->shape((const char*)data->data(), data->size(),
81cb93a386Sopenharmony_ci                  fontIterator, bidiIterator, scriptIterator, languageIterator, kWidth, &rh);
82cb93a386Sopenharmony_ci}
83cb93a386Sopenharmony_ci
84cb93a386Sopenharmony_civoid cluster_test(skiatest::Reporter* reporter, const char* resource) {
85cb93a386Sopenharmony_ci    auto data = GetResourceAsData(resource);
86cb93a386Sopenharmony_ci    if (!data) {
87cb93a386Sopenharmony_ci        ERRORF(reporter, "Could not get resource %s.", resource);
88cb93a386Sopenharmony_ci        return;
89cb93a386Sopenharmony_ci    }
90cb93a386Sopenharmony_ci
91cb93a386Sopenharmony_ci    shaper_test(reporter, resource, data.get());
92cb93a386Sopenharmony_ci}
93cb93a386Sopenharmony_ci
94cb93a386Sopenharmony_ci}  // namespace
95cb93a386Sopenharmony_ci
96cb93a386Sopenharmony_ciDEF_TEST(Shaper_cluster_empty, r) { shaper_test(r, "empty", SkData::MakeEmpty().get()); }
97cb93a386Sopenharmony_ci
98cb93a386Sopenharmony_ci#define SHAPER_TEST(X) DEF_TEST(Shaper_cluster_ ## X, r) { cluster_test(r, "text/" #X ".txt"); }
99cb93a386Sopenharmony_ciSHAPER_TEST(arabic)
100cb93a386Sopenharmony_ciSHAPER_TEST(armenian)
101cb93a386Sopenharmony_ciSHAPER_TEST(balinese)
102cb93a386Sopenharmony_ciSHAPER_TEST(buginese)
103cb93a386Sopenharmony_ciSHAPER_TEST(cherokee)
104cb93a386Sopenharmony_ciSHAPER_TEST(cyrillic)
105cb93a386Sopenharmony_ciSHAPER_TEST(emoji)
106cb93a386Sopenharmony_ciSHAPER_TEST(english)
107cb93a386Sopenharmony_ciSHAPER_TEST(ethiopic)
108cb93a386Sopenharmony_ciSHAPER_TEST(greek)
109cb93a386Sopenharmony_ciSHAPER_TEST(hangul)
110cb93a386Sopenharmony_ciSHAPER_TEST(han_simplified)
111cb93a386Sopenharmony_ciSHAPER_TEST(han_traditional)
112cb93a386Sopenharmony_ciSHAPER_TEST(hebrew)
113cb93a386Sopenharmony_ciSHAPER_TEST(javanese)
114cb93a386Sopenharmony_ciSHAPER_TEST(kana)
115cb93a386Sopenharmony_ciSHAPER_TEST(lao)
116cb93a386Sopenharmony_ciSHAPER_TEST(mandaic)
117cb93a386Sopenharmony_ciSHAPER_TEST(newtailue)
118cb93a386Sopenharmony_ciSHAPER_TEST(nko)
119cb93a386Sopenharmony_ciSHAPER_TEST(sinhala)
120cb93a386Sopenharmony_ciSHAPER_TEST(sundanese)
121cb93a386Sopenharmony_ciSHAPER_TEST(syriac)
122cb93a386Sopenharmony_ciSHAPER_TEST(thaana)
123cb93a386Sopenharmony_ciSHAPER_TEST(thai)
124cb93a386Sopenharmony_ciSHAPER_TEST(tibetan)
125cb93a386Sopenharmony_ciSHAPER_TEST(tifnagh)
126cb93a386Sopenharmony_ciSHAPER_TEST(vai)
127cb93a386Sopenharmony_ci
128cb93a386Sopenharmony_ci// TODO(bungeman): fix these broken tests. (https://bugs.skia.org/9050)
129cb93a386Sopenharmony_ci//SHAPER_TEST(bengali)
130cb93a386Sopenharmony_ci//SHAPER_TEST(devanagari)
131cb93a386Sopenharmony_ci//SHAPER_TEST(khmer)
132cb93a386Sopenharmony_ci//SHAPER_TEST(myanmar)
133cb93a386Sopenharmony_ci//SHAPER_TEST(taitham)
134cb93a386Sopenharmony_ci//SHAPER_TEST(tamil)
135cb93a386Sopenharmony_ci#undef SHAPER_TEST
136cb93a386Sopenharmony_ci
137cb93a386Sopenharmony_ci#endif  // !defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) && !defined(SK_BUILD_FOR_GOOGLE3)
138