| /* | |
| * 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;) |