blob: 08da0b6df2195888a8b452e75a0edf93a87c8aea [file] [edit]
/*
* Copyright 2026 Behdad Esfahbod. All Rights Reserved.
*/
cbuffer Uniforms : register(b0) {
float4x4 mvp;
float2 viewport;
float gamma;
float stem_darkening;
float4 foreground;
float debug;
float3 _pad;
};
struct VSInput {
float2 position : POSITION;
float2 texcoord : TEXCOORD0;
float2 normal : NORMAL;
float emPerPos : TEXCOORD1;
uint glyphLoc : TEXCOORD2;
};
struct PSInput {
float4 pos : SV_Position;
float2 texcoord : TEXCOORD0;
nointerpolation uint glyphLoc : TEXCOORD1;
};
PSInput vs_main (VSInput input) {
float2 pos = input.position;
float2 tex = input.texcoord;
float4 jac = float4 (input.emPerPos, 0.0, 0.0, -input.emPerPos);
hb_gpu_dilate (pos, tex, input.normal, jac, mvp, viewport);
PSInput output;
output.pos = mul (mvp, float4 (pos, 0.0, 1.0));
output.texcoord = tex;
output.glyphLoc = input.glyphLoc;
return output;
}
float4 ps_main (PSInput input) : SV_Target {
#ifdef HB_GPU_DEMO_DRAW
float cov = hb_gpu_draw (input.texcoord, input.glyphLoc);
float4 c = float4 (foreground.rgb * foreground.a, foreground.a) * cov;
#else
float cov;
float4 c = hb_gpu_paint (input.texcoord, input.glyphLoc, foreground, cov);
if (cov > 0.0 && cov < 1.0) {
float adj = cov;
if (stem_darkening > 0.0) {
float brightness = c.a > 0.0
? dot (c.rgb, float3 (1.0/3.0, 1.0/3.0, 1.0/3.0)) / c.a : 0.0;
float2 fw = fwidth (input.texcoord);
adj = hb_gpu_stem_darken (adj, brightness,
1.0 / max (fw.x, fw.y));
}
if (gamma != 1.0)
adj = pow (adj, gamma);
c *= adj / cov;
}
#endif
return c;
}