|  | /* | 
|  | * Copyright 2019 Google Inc. | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  | #include "include/core/SkFont.h" | 
|  | #include "src/core/SkAutoMalloc.h" | 
|  | #include "src/core/SkFontPriv.h" | 
|  | #include "src/core/SkReadBuffer.h" | 
|  | #include "src/core/SkWriteBuffer.h" | 
|  | #include "tests/Test.h" | 
|  |  | 
|  | static SkFont serialize_deserialize(const SkFont& font, skiatest::Reporter* reporter) { | 
|  | SkBinaryWriteBuffer wb; | 
|  | SkFontPriv::Flatten(font, wb); | 
|  |  | 
|  | size_t size = wb.bytesWritten(); | 
|  | SkAutoMalloc storage(size); | 
|  | wb.writeToMemory(storage.get()); | 
|  |  | 
|  | SkReadBuffer rb(storage.get(), size); | 
|  |  | 
|  | SkFont clone; | 
|  | REPORTER_ASSERT(reporter, SkFontPriv::Unflatten(&clone, rb)); | 
|  | return clone; | 
|  | } | 
|  |  | 
|  | enum { | 
|  | kForceAutoHinting      = 1 << 0, | 
|  | kEmbeddedBitmaps       = 1 << 1, | 
|  | kSubpixel              = 1 << 2, | 
|  | kLinearMetrics         = 1 << 3, | 
|  | kEmbolden              = 1 << 4, | 
|  | kBaselineSnap          = 1 << 5, | 
|  |  | 
|  | kAllBits = 0x3F, | 
|  | }; | 
|  |  | 
|  | static void apply_flags(SkFont* font, unsigned flags) { | 
|  | font->setForceAutoHinting(SkToBool(flags & kForceAutoHinting)); | 
|  | font->setEmbeddedBitmaps( SkToBool(flags & kEmbeddedBitmaps)); | 
|  | font->setSubpixel(        SkToBool(flags & kSubpixel)); | 
|  | font->setLinearMetrics(   SkToBool(flags & kLinearMetrics)); | 
|  | font->setEmbolden(        SkToBool(flags & kEmbolden)); | 
|  | font->setBaselineSnap(    SkToBool(flags & kBaselineSnap)); | 
|  | } | 
|  |  | 
|  | DEF_TEST(Font_flatten, reporter) { | 
|  | const float sizes[] = {0, 0.001f, 1, 10, 10.001f, 100, 100000, 100000.01f}; | 
|  | const float scales[] = {-5, -1, 0, 1, 5}; | 
|  | const float skews[] = {-5, -1, 0, 1, 5}; | 
|  | const SkFont::Edging edges[] = { | 
|  | SkFont::Edging::kAlias, SkFont::Edging::kAntiAlias, SkFont::Edging::kSubpixelAntiAlias | 
|  | }; | 
|  | const SkFontHinting hints[] = { | 
|  | SkFontHinting::kNone, SkFontHinting::kSlight, SkFontHinting::kNormal, SkFontHinting::kFull | 
|  | }; | 
|  |  | 
|  | SkFont font; | 
|  | for (float size : sizes) { | 
|  | font.setSize(size); | 
|  | for (float scale : scales) { | 
|  | font.setScaleX(scale); | 
|  | for (float skew : skews) { | 
|  | font.setSkewX(skew); | 
|  | for (auto edge : edges) { | 
|  | font.setEdging(edge); | 
|  | for (auto hint : hints) { | 
|  | font.setHinting(hint); | 
|  | for (unsigned flags = 0; flags <= kAllBits; ++flags) { | 
|  | apply_flags(&font, flags); | 
|  |  | 
|  | SkFont clone = serialize_deserialize(font, reporter); | 
|  | REPORTER_ASSERT(reporter, font == clone); | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  | } |