blob: ae7dc5486647ad59e192ba39c93a5841349e67c1 [file] [log] [blame]
/*
* Copyright 2022 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "gm/gm.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkColor.h"
#include "include/core/SkFont.h"
#include "include/core/SkFontMetrics.h"
#include "include/core/SkFontMgr.h"
#include "include/core/SkPaint.h"
#include "include/core/SkRefCnt.h"
#include "include/core/SkScalar.h"
#include "include/core/SkSize.h"
#include "include/core/SkString.h"
#include "include/core/SkTypeface.h"
#include "include/core/SkTypes.h"
#include "tools/Resources.h"
#include "tools/ToolUtils.h"
#include <string.h>
namespace skiagm {
// Copied from https://github.com/googlefonts/color-fonts#colrv1-test-font glyph descriptions markdown file.
namespace ColrV1TestDefinitions {
const uint32_t color_circles_palette[] = {0xf0e00, 0xf0e01};
};
namespace {
const char kColrCpalTestFontPath[] = "fonts/test_glyphs-glyf_colr_1.ttf";
constexpr SkFontArguments::Palette::Override kColorOverridesAll[] = {
// A gradient of dark to light purple for the circle palette test glyph.
// Randomly ordered with `shuf`.
// Add a repeat (later overrides override earlier overrides).
// Add three out of bounds entries (font has 12 palette entries).
{ 6, 0xffffff00},
{ 2, 0xff76078f},
{ 4, 0xffb404c4},
{ 1, 0xff510970},
{ 6, 0xfffa00ff},
{ 8, 0xff888888},
{10, 0xff888888},
{ 9, 0xff888888},
{ 7, 0xff888888},
{11, 0xff888888},
{ 0, 0xff310b55},
{ 3, 0xff9606aa},
{ 5, 0xffd802e2},
{13, 0xff00ffff},
{12, 0xff00ffff},
{-1, 0xff00ff00},
};
constexpr SkFontArguments::Palette::Override kColorOverridesOne[] = {
{2, 0xff02dfe2},
};
constexpr SkFontArguments::Palette kLightPaletteOverride{2, nullptr, 0};
constexpr SkFontArguments::Palette kDarkPaletteOverride{1, nullptr, 0};
constexpr SkFontArguments::Palette kOnePaletteOverride{
0, kColorOverridesOne, std::size(kColorOverridesOne)};
constexpr SkFontArguments::Palette kAllPaletteOverride{
0, kColorOverridesAll, std::size(kColorOverridesAll)};
} // namespace
class FontPaletteGM : public GM {
public:
FontPaletteGM(const char* test_name,
const SkFontArguments::Palette& paletteOverride)
: fName(test_name), fPalette(paletteOverride) {}
protected:
sk_sp<SkTypeface> fTypefaceDefault;
sk_sp<SkTypeface> fTypefaceFromStream;
sk_sp<SkTypeface> fTypefaceCloned;
void onOnceBeforeDraw() override {
SkFontArguments paletteArguments;
paletteArguments.setPalette(fPalette);
fTypefaceDefault = MakeResourceAsTypeface(kColrCpalTestFontPath);
fTypefaceCloned =
fTypefaceDefault ? fTypefaceDefault->makeClone(paletteArguments) : nullptr;
fTypefaceFromStream = SkFontMgr::RefDefault()->makeFromStream(
GetResourceAsStream(kColrCpalTestFontPath), paletteArguments);
}
SkString onShortName() override {
SkString gm_name = SkStringPrintf("font_palette_%s", fName.c_str());
return gm_name;
}
SkISize onISize() override { return SkISize::Make(1000, 400); }
DrawResult onDraw(SkCanvas* canvas, SkString* errorMsg) override {
canvas->drawColor(SK_ColorWHITE);
SkPaint paint;
canvas->translate(10, 20);
if (!fTypefaceCloned || !fTypefaceFromStream) {
*errorMsg = "Did not recognize COLR v1 test font format.";
return DrawResult::kSkip;
}
SkFontMetrics metrics;
SkScalar y = 0;
SkScalar textSize = 200;
for (auto& typeface : { fTypefaceFromStream, fTypefaceCloned} ) {
SkFont defaultFont(fTypefaceDefault);
SkFont paletteFont(typeface);
defaultFont.setSize(textSize);
paletteFont.setSize(textSize);
defaultFont.getMetrics(&metrics);
y += -metrics.fAscent;
// Set a recognizable foreground color which is not to be overriden.
paint.setColor(SK_ColorGRAY);
// Draw the default palette on the left, for COLRv0 and COLRv1.
canvas->drawSimpleText(
ColrV1TestDefinitions::color_circles_palette,
std::size(ColrV1TestDefinitions::color_circles_palette) * sizeof(uint32_t),
SkTextEncoding::kUTF32,
0,
y,
defaultFont,
paint);
// Draw the overriden palette on the right.
canvas->drawSimpleText(
ColrV1TestDefinitions::color_circles_palette,
std::size(ColrV1TestDefinitions::color_circles_palette) * sizeof(uint32_t),
SkTextEncoding::kUTF32,
440,
y,
paletteFont,
paint);
y += metrics.fDescent + metrics.fLeading;
}
return DrawResult::kOk;
}
private:
using INHERITED = GM;
SkString fName;
SkFontArguments::Palette fPalette;
};
DEF_GM(return new FontPaletteGM("default", SkFontArguments::Palette()));
DEF_GM(return new FontPaletteGM("light", kLightPaletteOverride));
DEF_GM(return new FontPaletteGM("dark", kDarkPaletteOverride));
DEF_GM(return new FontPaletteGM("one", kOnePaletteOverride));
DEF_GM(return new FontPaletteGM("all", kAllPaletteOverride));
} // namespace skiagm