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