| /* |
| * 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 "bench/Benchmark.h" |
| #include "include/core/SkCanvas.h" |
| #include "include/core/SkFont.h" |
| #include "include/core/SkPaint.h" |
| #include "include/core/SkRSXform.h" |
| #include "include/core/SkString.h" |
| #include "include/core/SkTextBlob.h" |
| #include "include/private/SkTDArray.h" |
| #include "src/core/SkRandom.h" |
| #include "tools/fonts/FontToolUtils.h" |
| |
| // Creates an RSX form blob from the the randomized fXforms |
| sk_sp<SkTextBlob> makeBlob() { |
| SkFont font; |
| SkTDArray<SkGlyphID> glyphs; |
| SkTDArray<SkRSXform> xForms; |
| font = ToolUtils::DefaultFont(); |
| font.setSubpixel(true); |
| font.setSize(20); |
| |
| const char* text = "Keep your sentences short, but not overly so."; |
| int glyphCount = font.countText(text, strlen(text), SkTextEncoding::kUTF8); |
| glyphs.append(glyphCount); |
| font.textToGlyphs( |
| text, strlen(text), SkTextEncoding::kUTF8, {glyphs.data(), (size_t)glyphCount}); |
| |
| xForms.append(glyphCount); |
| SkRandom rand; |
| SkScalar x = 0; |
| for (int i = 0; i < glyphCount; ++i) { |
| SkScalar s = rand.nextF() * 0.5f + 0.5f; |
| SkScalar a = rand.nextF() * SK_ScalarPI * 0.25f; |
| xForms[i] = SkRSXform::Make(s * SkScalarCos(a), s * SkScalarSin(a), x, rand.nextF() * 20); |
| x += 20; |
| } |
| |
| return SkTextBlob::MakeFromRSXform(glyphs.data(), |
| glyphs.size() * sizeof(SkGlyphID), |
| {xForms.data(), (size_t)xForms.size()}, |
| font, |
| SkTextEncoding::kGlyphID); |
| } |
| |
| class GlyphRunRSXformCachedBench : public Benchmark { |
| public: |
| GlyphRunRSXformCachedBench() {} |
| |
| protected: |
| const char* onGetName() override { return "GlyphRunRSXform_cached"; } |
| |
| void onDelayedSetup() override { fBlob = makeBlob(); } |
| |
| void onDraw(int loops, SkCanvas* canvas) override { |
| SkPaint paint; |
| for (int i = 0; i < loops; i++) { |
| canvas->drawTextBlob(fBlob, 0, 0, paint); |
| } |
| } |
| |
| private: |
| sk_sp<SkTextBlob> fBlob; |
| }; |
| |
| DEF_BENCH(return new GlyphRunRSXformCachedBench();) |