blob: 15f573b1aff22f238c2a633e6e2eec50d63a7db7 [file] [log] [blame]
/*
* Copyright 2018 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/SkFontStyle.h"
#include "include/core/SkFontTypes.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 "src/core/SkEnumerate.h"
#include "tools/Resources.h"
#include "tools/ToolUtils.h"
#include "tools/fonts/FontToolUtils.h"
#include <string.h>
#include <initializer_list>
namespace skiagm {
class ScaledEmojiRenderingGM : public GM {
public:
ScaledEmojiRenderingGM() {}
protected:
static constexpr ToolUtils::EmojiFontFormat formatsToTest[] = {
ToolUtils::EmojiFontFormat::ColrV0,
ToolUtils::EmojiFontFormat::Sbix,
ToolUtils::EmojiFontFormat::Cbdt,
ToolUtils::EmojiFontFormat::Test,
ToolUtils::EmojiFontFormat::Svg,
};
ToolUtils::EmojiTestSample fontSamples[std::size(formatsToTest)];
void onOnceBeforeDraw() override {
for (auto&& [i, format] : SkMakeEnumerate(formatsToTest)) {
fontSamples[i] = ToolUtils::EmojiSample(format);
if (!fontSamples[i].typeface) {
fontSamples[i].typeface = ToolUtils::DefaultTypeface();
}
}
}
SkString getName() const override { return SkString("scaledemoji_rendering"); }
SkISize getISize() override { return SkISize::Make(1200, 1200); }
void onDraw(SkCanvas* canvas) override {
canvas->drawColor(SK_ColorGRAY);
SkPaint textPaint;
textPaint.setColor(SK_ColorCYAN);
SkPaint boundsPaint;
boundsPaint.setStrokeWidth(2);
boundsPaint.setStyle(SkPaint::kStroke_Style);
boundsPaint.setColor(SK_ColorGREEN);
SkPaint advancePaint;
advancePaint.setColor(SK_ColorRED);
SkScalar y = 0;
for (auto& sample : fontSamples) {
SkFont font(sample.typeface);
font.setEdging(SkFont::Edging::kAlias);
const char* text = sample.sampleText;
SkFontMetrics metrics;
for (SkScalar textSize : { 70, 150 }) {
font.setSize(textSize);
font.getMetrics(&metrics);
// All typefaces should support subpixel mode
font.setSubpixel(true);
y += -metrics.fAscent;
SkScalar x = 0;
for (bool fakeBold : { false, true }) {
font.setEmbolden(fakeBold);
SkRect bounds;
SkScalar advance = font.measureText(text, strlen(text), SkTextEncoding::kUTF8,
&bounds, &textPaint);
canvas->drawSimpleText(text, strlen(text), SkTextEncoding::kUTF8,
x, y, font, textPaint);
if ((false)) {
bounds.offset(x, y);
canvas->drawRect(bounds, boundsPaint);
SkRect advanceRect = SkRect::MakeLTRB(x, y + 2, x + advance, y + 4);
canvas->drawRect(advanceRect, advancePaint);
}
x += bounds.width() * 1.2;
}
y += metrics.fDescent + metrics.fLeading;
x = 0;
}
}
}
private:
using INHERITED = GM;
};
//////////////////////////////////////////////////////////////////////////////
DEF_GM(return new ScaledEmojiRenderingGM;)
} // namespace skiagm