diff options
-rw-r--r-- | BUILD.gn | 3 | ||||
-rw-r--r-- | gn/tests.gni | 1 | ||||
-rw-r--r-- | src/ports/SkFontMgr_fontconfig.cpp | 15 | ||||
-rw-r--r-- | tests/FontMgrFontConfigTest.cpp | 95 |
4 files changed, 114 insertions, 0 deletions
@@ -1390,6 +1390,9 @@ if (skia_enable_tools) { if (!fontmgr_android_enabled) { sources -= [ "//tests/FontMgrAndroidParserTest.cpp" ] } + if (!(skia_use_freetype && skia_use_fontconfig)) { + sources -= [ "//tests/FontMgrFontConfigTest.cpp" ] + } deps = [ ":experimental_svg_model", ":flags", diff --git a/gn/tests.gni b/gn/tests.gni index 32c3337adc..2068ae527c 100644 --- a/gn/tests.gni +++ b/gn/tests.gni @@ -77,6 +77,7 @@ tests_sources = [ "$_tests/FontHostStreamTest.cpp", "$_tests/FontHostTest.cpp", "$_tests/FontMgrAndroidParserTest.cpp", + "$_tests/FontMgrFontConfigTest.cpp", "$_tests/FontMgrTest.cpp", "$_tests/FontNamesTest.cpp", "$_tests/FontObjTest.cpp", diff --git a/src/ports/SkFontMgr_fontconfig.cpp b/src/ports/SkFontMgr_fontconfig.cpp index 3589ae8100..e5aed18c60 100644 --- a/src/ports/SkFontMgr_fontconfig.cpp +++ b/src/ports/SkFontMgr_fontconfig.cpp @@ -525,6 +525,21 @@ public: return info; } + sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override { + std::unique_ptr<SkFontData> data = this->cloneFontData(args); + if (!data) { + return nullptr; + } + + SkString fFamilyName; + this->getFamilyName(&fFamilyName); + + return sk_make_sp<SkTypeface_stream>(std::move(data), + fFamilyName, + this->fontStyle(), + this->isFixedPitch()); + } + ~SkTypeface_fontconfig() override { // Hold the lock while unrefing the pattern. FCLocker lock; diff --git a/tests/FontMgrFontConfigTest.cpp b/tests/FontMgrFontConfigTest.cpp new file mode 100644 index 0000000000..0ecca63034 --- /dev/null +++ b/tests/FontMgrFontConfigTest.cpp @@ -0,0 +1,95 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include <fontconfig/fontconfig.h> +#include "Resources.h" +#include "SkCanvas.h" +#include "SkFontMgr.h" +#include "SkFontMgr_fontconfig.h" +#include "SkTypeface.h" +#include "Test.h" + +static bool bitmap_compare(const SkBitmap& ref, const SkBitmap& test) { + for (int y = 0; y < test.height(); ++y) { + for (int x = 0; x < test.width(); ++x) { + SkColor testColor = test.getColor(x, y); + SkColor refColor = ref.getColor(x, y); + if (refColor != testColor) { + return false; + } + } + } + return true; +} + +DEF_TEST(FontMgrFontConfig, reporter) { + FcConfig* config = FcConfigCreate(); + SkString distortablePath = GetResourcePath("fonts/Distortable.ttf"); + FcConfigAppFontAddFile( + config, reinterpret_cast<const FcChar8*>(distortablePath.c_str())); + FcConfigBuildFonts(config); + + sk_sp<SkFontMgr> fontMgr(SkFontMgr_New_FontConfig(config)); + sk_sp<SkTypeface> typeface(fontMgr->legacyMakeTypeface("Distortable", SkFontStyle())); + + SkBitmap bitmapStream; + bitmapStream.allocN32Pixels(64, 64); + SkCanvas canvasStream(bitmapStream); + canvasStream.drawColor(SK_ColorWHITE); + + SkBitmap bitmapClone; + bitmapClone.allocN32Pixels(64, 64); + SkCanvas canvasClone(bitmapClone); + canvasStream.drawColor(SK_ColorWHITE); + + SkPaint paintStream; + paintStream.setColor(SK_ColorGRAY); + paintStream.setTextSize(SkIntToScalar(20)); + paintStream.setAntiAlias(true); + paintStream.setLCDRenderText(true); + + SkPaint paintClone; + paintClone.setColor(SK_ColorGRAY); + paintClone.setTextSize(SkIntToScalar(20)); + paintClone.setAntiAlias(true); + paintClone.setLCDRenderText(true); + + std::unique_ptr<SkStreamAsset> distortableStream( + GetResourceAsStream("fonts/Distortable.ttf")); + if (!distortableStream) { + return; + } + + const char* text = "abc"; + const size_t textLen = strlen(text); + SkPoint point = SkPoint::Make(20.0f, 20.0f); + SkFourByteTag tag = SkSetFourByteTag('w', 'g', 'h', 't'); + + for (int i = 0; i < 10; ++i) { + SkScalar styleValue = + SkDoubleToScalar(0.5 + i * ((2.0 - 0.5) / 10)); + SkFontArguments::VariationPosition::Coordinate + coordinates[] = {{tag, styleValue}}; + SkFontArguments::VariationPosition + position = {coordinates, SK_ARRAY_COUNT(coordinates)}; + + paintStream.setTypeface(sk_sp<SkTypeface>( + fontMgr->makeFromStream(distortableStream->duplicate(), + SkFontArguments().setVariationDesignPosition(position)))); + paintClone.setTypeface(sk_sp<SkTypeface>( + typeface->makeClone(SkFontArguments().setVariationDesignPosition(position)))); + + canvasStream.drawColor(SK_ColorWHITE); + canvasStream.drawText(text, textLen, point.fX, point.fY, paintStream); + + canvasClone.drawColor(SK_ColorWHITE); + canvasClone.drawText(text, textLen, point.fX, point.fY, paintClone); + + bool success = bitmap_compare(bitmapStream, bitmapClone); + REPORTER_ASSERT(reporter, success); + } +}
\ No newline at end of file |