xref: /aosp_15_r20/external/skia/tests/FontTest.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2019 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFont.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontTypes.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypeface.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTo.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkAutoMalloc.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkFontPriv.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkPtrRecorder.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkReadBuffer.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkWriteBuffer.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "tools/ToolUtils.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fonts/FontToolUtils.h"
22*c8dee2aaSAndroid Build Coastguard Worker 
23*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
24*c8dee2aaSAndroid Build Coastguard Worker 
serialize_deserialize(const SkFont & font,skiatest::Reporter * reporter)25*c8dee2aaSAndroid Build Coastguard Worker static SkFont serialize_deserialize(const SkFont& font, skiatest::Reporter* reporter) {
26*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkRefCntSet> typefaces = sk_make_sp<SkRefCntSet>();
27*c8dee2aaSAndroid Build Coastguard Worker     SkBinaryWriteBuffer wb({});
28*c8dee2aaSAndroid Build Coastguard Worker     wb.setTypefaceRecorder(typefaces);
29*c8dee2aaSAndroid Build Coastguard Worker 
30*c8dee2aaSAndroid Build Coastguard Worker     SkFontPriv::Flatten(font, wb);
31*c8dee2aaSAndroid Build Coastguard Worker     size_t size = wb.bytesWritten();
32*c8dee2aaSAndroid Build Coastguard Worker     SkAutoMalloc storage(size);
33*c8dee2aaSAndroid Build Coastguard Worker     wb.writeToMemory(storage.get());
34*c8dee2aaSAndroid Build Coastguard Worker 
35*c8dee2aaSAndroid Build Coastguard Worker     int count = typefaces->count();
36*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT((!font.getTypeface() && count == 0) ||
37*c8dee2aaSAndroid Build Coastguard Worker              ( font.getTypeface() && count == 1));
38*c8dee2aaSAndroid Build Coastguard Worker     if (count) {
39*c8dee2aaSAndroid Build Coastguard Worker         SkTypeface* typeface;
40*c8dee2aaSAndroid Build Coastguard Worker         typefaces->copyToArray((SkRefCnt**)&typeface);
41*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(typeface == font.getTypeface());
42*c8dee2aaSAndroid Build Coastguard Worker     }
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker     SkReadBuffer rb(storage.get(), size);
45*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkTypeface> cloneTypeface = font.refTypeface();
46*c8dee2aaSAndroid Build Coastguard Worker     if (count) {
47*c8dee2aaSAndroid Build Coastguard Worker         rb.setTypefaceArray(&cloneTypeface, 1);
48*c8dee2aaSAndroid Build Coastguard Worker     }
49*c8dee2aaSAndroid Build Coastguard Worker     SkFont clone;
50*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, SkFontPriv::Unflatten(&clone, rb));
51*c8dee2aaSAndroid Build Coastguard Worker     return clone;
52*c8dee2aaSAndroid Build Coastguard Worker }
53*c8dee2aaSAndroid Build Coastguard Worker 
54*c8dee2aaSAndroid Build Coastguard Worker enum {
55*c8dee2aaSAndroid Build Coastguard Worker     kForceAutoHinting      = 1 << 0,
56*c8dee2aaSAndroid Build Coastguard Worker     kEmbeddedBitmaps       = 1 << 1,
57*c8dee2aaSAndroid Build Coastguard Worker     kSubpixel              = 1 << 2,
58*c8dee2aaSAndroid Build Coastguard Worker     kLinearMetrics         = 1 << 3,
59*c8dee2aaSAndroid Build Coastguard Worker     kEmbolden              = 1 << 4,
60*c8dee2aaSAndroid Build Coastguard Worker     kBaselineSnap          = 1 << 5,
61*c8dee2aaSAndroid Build Coastguard Worker 
62*c8dee2aaSAndroid Build Coastguard Worker     kAllBits = 0x3F,
63*c8dee2aaSAndroid Build Coastguard Worker };
64*c8dee2aaSAndroid Build Coastguard Worker 
apply_flags(SkFont * font,unsigned flags)65*c8dee2aaSAndroid Build Coastguard Worker static void apply_flags(SkFont* font, unsigned flags) {
66*c8dee2aaSAndroid Build Coastguard Worker     font->setForceAutoHinting(SkToBool(flags & kForceAutoHinting));
67*c8dee2aaSAndroid Build Coastguard Worker     font->setEmbeddedBitmaps( SkToBool(flags & kEmbeddedBitmaps));
68*c8dee2aaSAndroid Build Coastguard Worker     font->setSubpixel(        SkToBool(flags & kSubpixel));
69*c8dee2aaSAndroid Build Coastguard Worker     font->setLinearMetrics(   SkToBool(flags & kLinearMetrics));
70*c8dee2aaSAndroid Build Coastguard Worker     font->setEmbolden(        SkToBool(flags & kEmbolden));
71*c8dee2aaSAndroid Build Coastguard Worker     font->setBaselineSnap(    SkToBool(flags & kBaselineSnap));
72*c8dee2aaSAndroid Build Coastguard Worker }
73*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(Font_flatten,reporter)74*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(Font_flatten, reporter) {
75*c8dee2aaSAndroid Build Coastguard Worker     const float sizes[] = {0, 0.001f, 1, 10, 10.001f, 100000.01f};
76*c8dee2aaSAndroid Build Coastguard Worker     const float scales[] = {-5, 0, 1, 5};
77*c8dee2aaSAndroid Build Coastguard Worker     const float skews[] = {-5, 0, 5};
78*c8dee2aaSAndroid Build Coastguard Worker     const SkFont::Edging edges[] = {
79*c8dee2aaSAndroid Build Coastguard Worker         SkFont::Edging::kAlias, SkFont::Edging::kSubpixelAntiAlias
80*c8dee2aaSAndroid Build Coastguard Worker     };
81*c8dee2aaSAndroid Build Coastguard Worker     const SkFontHinting hints[] = {
82*c8dee2aaSAndroid Build Coastguard Worker         SkFontHinting::kNone, SkFontHinting::kFull
83*c8dee2aaSAndroid Build Coastguard Worker     };
84*c8dee2aaSAndroid Build Coastguard Worker     const unsigned int flags[] = {
85*c8dee2aaSAndroid Build Coastguard Worker         kForceAutoHinting, kEmbeddedBitmaps, kSubpixel, kLinearMetrics, kEmbolden, kBaselineSnap,
86*c8dee2aaSAndroid Build Coastguard Worker         kAllBits,
87*c8dee2aaSAndroid Build Coastguard Worker     };
88*c8dee2aaSAndroid Build Coastguard Worker     const sk_sp<SkTypeface> typefaces[] = {
89*c8dee2aaSAndroid Build Coastguard Worker         nullptr, ToolUtils::SampleUserTypeface()
90*c8dee2aaSAndroid Build Coastguard Worker     };
91*c8dee2aaSAndroid Build Coastguard Worker 
92*c8dee2aaSAndroid Build Coastguard Worker     SkFont font;
93*c8dee2aaSAndroid Build Coastguard Worker     for (float size : sizes) {
94*c8dee2aaSAndroid Build Coastguard Worker         font.setSize(size);
95*c8dee2aaSAndroid Build Coastguard Worker         for (float scale : scales) {
96*c8dee2aaSAndroid Build Coastguard Worker             font.setScaleX(scale);
97*c8dee2aaSAndroid Build Coastguard Worker             for (float skew : skews) {
98*c8dee2aaSAndroid Build Coastguard Worker                 font.setSkewX(skew);
99*c8dee2aaSAndroid Build Coastguard Worker                 for (auto edge : edges) {
100*c8dee2aaSAndroid Build Coastguard Worker                     font.setEdging(edge);
101*c8dee2aaSAndroid Build Coastguard Worker                     for (auto hint : hints) {
102*c8dee2aaSAndroid Build Coastguard Worker                         font.setHinting(hint);
103*c8dee2aaSAndroid Build Coastguard Worker                         for (auto flag : flags) {
104*c8dee2aaSAndroid Build Coastguard Worker                             apply_flags(&font, flag);
105*c8dee2aaSAndroid Build Coastguard Worker                             for (const sk_sp<SkTypeface>& typeface : typefaces) {
106*c8dee2aaSAndroid Build Coastguard Worker                                 font.setTypeface(typeface);
107*c8dee2aaSAndroid Build Coastguard Worker                                 SkFont clone = serialize_deserialize(font, reporter);
108*c8dee2aaSAndroid Build Coastguard Worker                                 REPORTER_ASSERT(reporter, font == clone);
109*c8dee2aaSAndroid Build Coastguard Worker                             }
110*c8dee2aaSAndroid Build Coastguard Worker                         }
111*c8dee2aaSAndroid Build Coastguard Worker                     }
112*c8dee2aaSAndroid Build Coastguard Worker                 }
113*c8dee2aaSAndroid Build Coastguard Worker             }
114*c8dee2aaSAndroid Build Coastguard Worker         }
115*c8dee2aaSAndroid Build Coastguard Worker     }
116*c8dee2aaSAndroid Build Coastguard Worker }
117