blob: 8378320d0186c38bc42bf807e26408c118f9611f [file]
static const char *demo_shader_msl =
"/*\n"
" * Copyright 2026 Behdad Esfahbod. All Rights Reserved.\n"
" */\n"
"\n"
"struct Uniforms {\n"
" float4x4 matViewProjection;\n"
" float2 viewport;\n"
" float gamma;\n"
" float stem_darkening;\n"
" float4 foreground;\n"
" float debug;\n"
"};\n"
"\n"
"struct VertexIn {\n"
" float2 position [[attribute(0)]];\n"
" float2 texcoord [[attribute(1)]];\n"
" float2 normal [[attribute(2)]];\n"
" float emPerPos [[attribute(3)]];\n"
" uint glyphLoc [[attribute(4)]];\n"
"};\n"
"\n"
"struct VertexOut {\n"
" float4 position [[position]];\n"
" float2 texcoord;\n"
" uint glyphLoc [[flat]];\n"
"};\n"
"\n"
"vertex VertexOut vertex_main(VertexIn in [[stage_in]],\n"
" constant Uniforms& uniforms [[buffer(1)]]) {\n"
" float2 pos = in.position;\n"
" float2 tex = in.texcoord;\n"
" float4 jac = float4(in.emPerPos, 0.0, 0.0, -in.emPerPos);\n"
"\n"
" hb_gpu_dilate(pos, tex, in.normal, jac,\n"
" uniforms.matViewProjection, uniforms.viewport);\n"
"\n"
" VertexOut out;\n"
" out.position = uniforms.matViewProjection * float4(pos, 0.0, 1.0);\n"
" out.texcoord = tex;\n"
" out.glyphLoc = in.glyphLoc;\n"
" return out;\n"
"}\n"
"\n"
"fragment float4 fragment_main(VertexOut in [[stage_in]],\n"
" constant Uniforms& uniforms [[buffer(1)]],\n"
" device const short4* atlas [[buffer(0)]]) {\n"
"#ifdef HB_GPU_DEMO_DRAW\n"
" float cov = hb_gpu_draw(in.texcoord, in.glyphLoc, atlas);\n"
" float4 c = float4(uniforms.foreground.rgb * uniforms.foreground.a,\n"
" uniforms.foreground.a) * cov;\n"
"#else\n"
" float cov;\n"
" float4 c = hb_gpu_paint(in.texcoord, in.glyphLoc, uniforms.foreground,\n"
" atlas, cov);\n"
"\n"
" if (cov > 0.0 && cov < 1.0) {\n"
" float adj = cov;\n"
" if (uniforms.stem_darkening > 0.0) {\n"
" float brightness = c.a > 0.0\n"
" ? dot(c.rgb, float3(1.0 / 3.0)) / c.a : 0.0;\n"
" float2 fw = fwidth(in.texcoord);\n"
" adj = hb_gpu_stem_darken(adj, brightness,\n"
" 1.0 / max(fw.x, fw.y));\n"
" }\n"
" if (uniforms.gamma != 1.0)\n"
" adj = pow(adj, uniforms.gamma);\n"
" c *= adj / cov;\n"
" }\n"
"#endif\n"
"\n"
" if (uniforms.debug > 0.0) {\n"
" int2 counts = _hb_gpu_curve_counts(in.texcoord, in.glyphLoc, atlas);\n"
" float r = clamp(float(counts.x) / 8.0, 0.0, 1.0);\n"
" float g = clamp(float(counts.y) / 8.0, 0.0, 1.0);\n"
" return float4(r, g, c.a, max(max(r, g), c.a));\n"
" }\n"
"\n"
" return c;\n"
"}\n"
;