blob: b460acc7ae0bbb78ac1b54cdbf05634865936c15 [file]
/*
* Copyright 2026 Google LLC
*
* 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/SkColorSpace.h"
#include "include/core/SkFont.h"
#include "include/core/SkFontStyle.h"
#include "include/core/SkFontTypes.h"
#include "include/core/SkImageInfo.h"
#include "include/core/SkMatrix.h"
#include "include/core/SkPaint.h"
#include "include/core/SkPoint.h"
#include "include/core/SkRect.h"
#include "include/core/SkRefCnt.h"
#include "include/core/SkScalar.h"
#include "include/core/SkSize.h"
#include "include/core/SkString.h"
#include "include/core/SkSurface.h"
#include "include/core/SkSurfaceProps.h"
#include "include/core/SkTextBlob.h"
#include "include/core/SkTypeface.h"
#include "include/core/SkTypes.h"
#include "include/gpu/GpuTypes.h"
#include "include/private/SkTemplates.h"
#include "include/private/SkTo.h"
#include "tools/ToolUtils.h"
#include "tools/fonts/FontToolUtils.h"
#if defined(SK_GRAPHITE)
#include "include/gpu/graphite/Recorder.h"
#include "include/gpu/graphite/Surface.h"
#include "src/gpu/graphite/RecorderPriv.h"
#endif
#include <string.h>
using namespace skia_private;
class CrBug478659067GM : public skiagm::GM {
public:
CrBug478659067GM() {
this->setBGColor(0xFFFFFFFF);
}
protected:
SkString getName() const override { return SkString("crbug_478659067"); }
SkISize getISize() override { return SkISize::Make(1024, 1280); }
DrawResult onDraw(SkCanvas* canvas, SkString* errorMsg) override {
SkISize size = this->getISize();
if (!canvas->getBaseLayerSize().isEmpty()) {
size = canvas->getBaseLayerSize();
}
SkImageInfo info = SkImageInfo::MakeN32(size.width(), size.height(), kPremul_SkAlphaType,
canvas->imageInfo().refColorSpace());
SkSurfaceProps inputProps;
canvas->getProps(&inputProps);
SkSurfaceProps props(SkSurfaceProps::kUseDeviceIndependentFonts_Flag | inputProps.flags(),
inputProps.pixelGeometry());
sk_sp<SkSurface> surface;
SkScalar dfSize = 162;
#if defined(SK_GRAPHITE)
if (auto recorder = canvas->recorder()) {
surface = SkSurfaces::RenderTarget(recorder, info, skgpu::Mipmapped::kNo, &props);
dfSize = recorder->priv().caps()->glyphsAsPathsFontSize();
}
#endif
// Effectively make this test graphite only
if (!surface) {
*errorMsg = "Graphite only";
return DrawResult::kSkip;
}
// Create a new canvas with the DeviceIndepdentFonts flag enabled
SkCanvas* graphiteCanvas = surface->getCanvas();
graphiteCanvas->clear(0xffffffff);
const char* dfText = "TheQuickBrownFoxJumpsOverTheLazyDog_0123456789";
const size_t dfLen = strlen(dfText);
SkScalar scale = graphiteCanvas->getLocalToDeviceAs3x3().getMaxScale();
if (scale <= 0.0f) {
scale = 1.0f;
}
SkFont font(ToolUtils::CreatePortableTypeface("serif", SkFontStyle()));
font.setSize((dfSize - 64) / scale);
font.setEdging(SkFont::Edging::kSubpixelAntiAlias);
font.setSubpixel(true);
SkPaint paint;
paint.setColor(SK_ColorBLACK);
SkScalar lineSpacing = font.getSize();
for (int i = 1; i <= 6; ++i) {
SkAutoCanvasRestore acr(graphiteCanvas, true);
graphiteCanvas->translate(SkIntToScalar(10), (i * lineSpacing) - 10);
// We skew the font in order to prevent glyph reuse. This is needed to overflow the
// cache page
font.setSkewX(i * 0.05f);
graphiteCanvas->drawSimpleText(dfText, dfLen, SkTextEncoding::kUTF8, 0, 0, font, paint);
}
graphiteCanvas->getSurface()->draw(canvas, 0, 0);
return DrawResult::kOk;
}
};
DEF_GM(return new CrBug478659067GM;)