blob: cc683ddf6abff0974b299827f84ae22a97775bfc [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 "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();)