Modules/Sketch2D/bench/BenchScenario.cpp
Шурупов Илья Викторович 81949323d9 Rename the code name to Sketch2D
Stroke2D becomes Sketch2D across folders, files, namespaces, classes,
targets, scripts, the Android package (online.ilushabasic.sketch2d)
and the update URL. A stroke2d-sketches folder is adopted like the
older leo-sketches one.
2026-10-17 19:47:01 +03:00

149 lines
5 KiB
C++

#include "BenchScenario.hpp"
#include <cctype>
#include <cstdio>
namespace tp::sketch2d::bench {
namespace {
std::string number(halnf value) {
char text[32];
std::snprintf(text, sizeof(text), "%g", value);
return text;
}
std::string presetLabel(BrushType type) {
const BrushPreset* preset = findBrushPreset(type);
return preset ? preset->name : "brush";
}
std::string slug(std::string text) {
for (char& character : text) {
if (character == ' ') character = '-';
else character = (char) std::tolower((unsigned char) character);
}
return text;
}
Scenario base(const std::string& group, const std::string& input, BrushType brush, halnf size) {
Scenario scenario;
scenario.group = group;
scenario.input = input;
scenario.brush = brush;
scenario.size = size;
return scenario;
}
void addSizeSweep(std::vector<Scenario>& scenarios, const std::string& input) {
for (halnf size : { 4.0f, 20.0f, 80.0f, 250.0f }) {
Scenario scenario = base("brush size", input, BrushType::Round, size);
scenario.name = "round size " + number(size);
scenarios.push_back(scenario);
}
}
void addZoomSweep(std::vector<Scenario>& scenarios, const std::string& input) {
for (halnf zoom : { 0.25f, 1.0f, 4.0f }) {
Scenario scenario = base("zoom", input, BrushType::Round, 20);
scenario.zoom = zoom;
scenario.name = "round zoom " + number(zoom) + "x";
scenarios.push_back(scenario);
}
}
void addPresetSweep(std::vector<Scenario>& scenarios, const std::string& input) {
for (BrushType type : { BrushType::Ink,
BrushType::Pencil,
BrushType::Marker,
BrushType::Calligraphy,
BrushType::Jagged,
BrushType::Flat,
BrushType::Air }) {
Scenario scenario = base("brush preset", input, type, 40);
scenario.name = slug(presetLabel(type)) + " size 40";
scenarios.push_back(scenario);
}
}
void addParameterSweep(std::vector<Scenario>& scenarios, const std::string& input) {
Scenario textured = base("brush parameters", input, BrushType::Round, 60);
textured.name = "round textured";
textured.tune = [](Brush& brush) { brush.set(BrushParameter::Texture, 1); };
scenarios.push_back(textured);
Scenario dense = base("brush parameters", input, BrushType::Round, 60);
dense.name = "round spacing 1%";
dense.tune = [](Brush& brush) { brush.setSpacing(0.01f); };
scenarios.push_back(dense);
Scenario soft = base("brush parameters", input, BrushType::Round, 60);
soft.name = "round soft half opacity";
soft.tune = [](Brush& brush) {
brush.setHardness(0);
brush.setOpacity(0.5f);
};
scenarios.push_back(soft);
}
void addStabilizerSweep(std::vector<Scenario>& scenarios, const std::string& input) {
for (halnf amount : { 0.0f, 0.325f, 0.7f, 1.0f }) {
Scenario scenario = base("stabilizer", input, BrushType::Round, 20);
scenario.stabilizer = amount;
scenario.name = "round stabilizer " + number(amount);
scenarios.push_back(scenario);
}
}
void addEraserSweep(std::vector<Scenario>& scenarios, const std::string& input) {
for (halnf size : { 20.0f, 120.0f }) {
Scenario scenario = base("eraser", input, BrushType::Eraser, size);
scenario.prepaint = true;
scenario.name = "eraser size " + number(size);
scenarios.push_back(scenario);
}
Scenario zoomed = base("eraser", input, BrushType::Eraser, 40);
zoomed.prepaint = true;
zoomed.zoom = 0.25f;
zoomed.name = "eraser zoom 0.25x";
scenarios.push_back(zoomed);
Scenario mode = base("eraser", input, BrushType::Calligraphy, 40);
mode.prepaint = true;
mode.eraserMode = true;
mode.name = "calligraphy eraser mode";
scenarios.push_back(mode);
}
}
std::string Scenario::describe() const {
if (session) {
const SessionSnapshot& recorded = *session;
return "recorded session from " + recorded.environment.date + " on " + recorded.environment.device + " at " +
recorded.environment.revision + ": " + presetLabel(recorded.brush.type) + ", size " +
number(recorded.brush.size()) + ", zoom " + number(recorded.view.zoom) + "x, " +
std::to_string(recorded.document.layers.size()) + " layers";
}
std::string text =
presetLabel(brush) + ", size " + number(size) + ", zoom " + number(zoom) + "x, stabilizer " + number(stabilizer);
if (eraserMode) text += ", eraser mode";
if (prepaint) text += ", on painted layer";
return text;
}
std::vector<Scenario> brushAndEraserScenarios(const std::vector<std::string>& inputs) {
std::vector<Scenario> scenarios;
for (const std::string& input : inputs) {
const size_t first = scenarios.size();
addSizeSweep(scenarios, input);
addZoomSweep(scenarios, input);
addPresetSweep(scenarios, input);
addParameterSweep(scenarios, input);
addStabilizerSweep(scenarios, input);
addEraserSweep(scenarios, input);
if (inputs.size() < 2) continue;
for (size_t index = first; index < scenarios.size(); index++)
scenarios[index].name = input + " / " + scenarios[index].name;
}
return scenarios;
}
}