84 lines
2.7 KiB
C++
84 lines
2.7 KiB
C++
|
/*
|
||
|
* 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);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|