Font selector

This commit is contained in:
2026-05-22 17:22:57 +10:00
parent c5f0a9df0e
commit 283f38dddb
15 changed files with 276 additions and 34 deletions

View File

@@ -62,17 +62,20 @@ std::string AllParametersShaderManifest()
"description": "All parameter restore test shader",
"category": "Tests",
"entryPoint": "shadeVideo",
"fonts": [{ "id": "inter", "path": "Inter.ttf" }],
"fonts": [
{ "id": "inter", "path": "Inter.ttf" },
{ "id": "mono", "path": "Mono.ttf" }
],
"parameters": [
{ "id": "gain", "label": "Gain", "type": "float", "default": 0.5, "min": 0.0, "max": 1.0 },
{ "id": "offset", "label": "Offset", "type": "vec2", "default": [0.0, 0.0], "min": [-1.0, -1.0], "max": [1.0, 1.0] },
{ "id": "tint", "label": "Tint", "type": "color", "default": [1.0, 1.0, 1.0, 1.0], "min": [0.0, 0.0, 0.0, 0.0], "max": [1.0, 1.0, 1.0, 1.0] },
{ "id": "enabled", "label": "Enabled", "type": "bool", "default": true },
{ "id": "mode", "label": "Mode", "type": "enum", "default": "soft", "options": [
{ "value": "soft", "label": "Soft" },
{ "value": "hard", "label": "Hard" }
{ "id": "mode", "label": "Mode", "type": "enum", "default": "inter", "options": [
{ "value": "inter", "label": "Inter" },
{ "value": "mono", "label": "Mono" }
] },
{ "id": "titleText", "label": "Title", "type": "text", "default": "DEFAULT", "font": "inter", "maxLength": 8 },
{ "id": "titleText", "label": "Title", "type": "text", "default": "DEFAULT", "font": "inter", "fontParameter": "mode", "maxLength": 8 },
{ "id": "drop", "label": "Drop", "type": "trigger" }
]
})";
@@ -94,10 +97,10 @@ RenderCadenceCompositor::SupportedShaderCatalog MakeCatalog(std::filesystem::pat
return LoadCatalog(root);
}
RenderCadenceCompositor::FontAtlasBuildOutput MakeFakeFontAtlas()
RenderCadenceCompositor::FontAtlasBuildOutput MakeFakeFontAtlas(const std::string& fontId = "inter")
{
RenderCadenceCompositor::FontAtlasBuildOutput atlas;
atlas.fontId = "inter";
atlas.fontId = fontId;
atlas.width = 2;
atlas.height = 2;
atlas.ascender = -0.8;
@@ -226,6 +229,7 @@ void TestInitializeFromRuntimeStateRestoresLayerStack()
WriteFile(root / "solid" / "shader.json", SolidShaderManifest(0.5, false));
WriteFile(root / "all-params" / "shader.slang", "float4 shadeVideo(float2 uv) { return float4(uv, 0.0, 1.0); }\n");
WriteFile(root / "all-params" / "Inter.ttf", "not a real font, but enough for restore catalog support checks");
WriteFile(root / "all-params" / "Mono.ttf", "not a real font, but enough for restore catalog support checks");
WriteFile(root / "all-params" / "shader.json", AllParametersShaderManifest());
RenderCadenceCompositor::SupportedShaderCatalog catalog = LoadCatalog(root);
@@ -242,7 +246,7 @@ void TestInitializeFromRuntimeStateRestoresLayerStack()
"offset": [0.25, -0.5],
"tint": [0.1, 0.2, 0.3, 0.4],
"enabled": false,
"mode": "hard",
"mode": "mono",
"titleText": "RESTORED-TEXT",
"drop": 4
}
@@ -275,7 +279,7 @@ void TestInitializeFromRuntimeStateRestoresLayerStack()
Expect(snapshot.displayLayers[0].parameterValues.at("offset").numberValues == std::vector<double>({ 0.25, -0.5 }), "restore preserves vec2 parameter values");
Expect(snapshot.displayLayers[0].parameterValues.at("tint").numberValues == std::vector<double>({ 0.1, 0.2, 0.3, 0.4 }), "restore preserves color parameter values");
Expect(!snapshot.displayLayers[0].parameterValues.at("enabled").booleanValue, "restore preserves boolean parameter values");
Expect(snapshot.displayLayers[0].parameterValues.at("mode").enumValue == "hard", "restore preserves enum parameter values");
Expect(snapshot.displayLayers[0].parameterValues.at("mode").enumValue == "mono", "restore preserves enum parameter values");
Expect(snapshot.displayLayers[0].parameterValues.at("titleText").textValue == "RESTORED", "restore normalizes and preserves text parameter values");
Expect(snapshot.displayLayers[0].parameterValues.at("drop").numberValues.front() == 4.0, "restore preserves trigger counts");
Expect(snapshot.displayLayers[1].id == "layer-33", "restore preserves later supported layer order");
@@ -488,6 +492,7 @@ void TestTextTexturesArePreparedInRuntimeModel()
std::filesystem::path root = MakeTestRoot();
WriteFile(root / "all-params" / "shader.slang", "float4 shadeVideo(float2 uv) { return float4(uv, 0.0, 1.0); }\n");
WriteFile(root / "all-params" / "Inter.ttf", "not a real font, but enough for catalog support checks");
WriteFile(root / "all-params" / "Mono.ttf", "not a real font, but enough for catalog support checks");
WriteFile(root / "all-params" / "shader.json", AllParametersShaderManifest());
RenderCadenceCompositor::SupportedShaderCatalog catalog = LoadCatalog(root);
@@ -503,6 +508,7 @@ void TestTextTexturesArePreparedInRuntimeModel()
artifact.fragmentShaderSource = "void main(){}";
artifact.parameterDefinitions = snapshot.displayLayers[0].parameterDefinitions;
artifact.fontAtlases.push_back(MakeFakeFontAtlas());
artifact.fontAtlases.push_back(MakeFakeFontAtlas("mono"));
artifact.message = "build ready";
Expect(model.MarkBuildReady(artifact, error), error.empty() ? "ready text artifact prepares textures" : error);
@@ -520,6 +526,12 @@ void TestTextTexturesArePreparedInRuntimeModel()
Expect(preparedUpdated.textValue == "AB", "updated text is prepared before render snapshot");
Expect(preparedUpdated.rgbaPixels && preparedUpdated.rgbaPixels != preparedDefault.rgbaPixels, "updated text receives a new prepared pixel payload");
Expect(model.UpdateParameter(model.FirstLayerId(), "mode", JsonValue("mono"), error), error.empty() ? "font selector update prepares texture" : error);
snapshot = model.Snapshot();
const RuntimePreparedTextTexture preparedWithNewFont = snapshot.renderLayers[0].artifact.preparedTextTextures[0];
Expect(preparedWithNewFont.textValue == "AB", "font selector update preserves current text");
Expect(preparedWithNewFont.rgbaPixels && preparedWithNewFont.rgbaPixels != preparedUpdated.rgbaPixels, "font selector update receives a new prepared pixel payload");
std::filesystem::remove_all(root);
}
}