public void RuntimeEffectChildrenWorksCorrectly() { using var blueShirt = SKImage.FromEncodedData(Path.Combine(PathToImages, "blue-shirt.jpg")); using var textureShader = blueShirt.ToShader(); var src = @" uniform shader color_map; uniform shader normal_map; half4 main() { return half4(0); }"; using var effect = SKRuntimeEffect.Create(src, out _); var children = new SKRuntimeEffectChildren(effect); children.Add("color_map", textureShader); Assert.Equal(new SKShader[] { textureShader, null }, children.ToArray()); children.Add("normal_map", textureShader); Assert.Equal(new SKShader[] { textureShader, textureShader }, children.ToArray()); children.Add("color_map", null); Assert.Equal(new SKShader[] { null, textureShader }, children.ToArray()); children.Reset(); Assert.Equal(new SKShader[] { null, null }, children.ToArray()); }
public TestEffect(string src) { effect = SKRuntimeEffect.Create(src, out var errorText); Assert.Null(errorText); Assert.NotNull(effect); uniforms = new SKRuntimeEffectUniforms(effect); children = new SKRuntimeEffectChildren(effect); }
public void RuntimeEffectChildrenMatchesEffect(string header, string[] children) { var src = $"{header} half4 main() {{ return half4(0); }}"; using var effect = SKRuntimeEffect.Create(src, out _); var effectChildren = new SKRuntimeEffectChildren(effect); Assert.Equal(children, effectChildren.Names); Assert.Equal(new SKShader[children.Length], effectChildren.ToArray()); }
public void RuntimeEffectInitializesCorrectChildren() { var src = @" uniform shader color_map; uniform shader normal_map; half4 main() { return half4(0); }"; using var effect = SKRuntimeEffect.Create(src, out _); var effectChildren = new SKRuntimeEffectChildren(effect); Assert.Equal(2, effectChildren.Count); Assert.Equal(2, effectChildren.Names.Count); Assert.Equal(new[] { "color_map", "normal_map" }, effectChildren.Names); Assert.Equal(new[] { "color_map", "normal_map" }, effectChildren); }
public void ImageCanClearBackground(float threshold, float exponent, uint backgroundColor, uint shirtColor) { using var ctx = CreateGlContext(); ctx.MakeCurrent(); using var grContext = GRContext.CreateGl(); var info = new SKImageInfo(500, 500, SKColorType.Rgba8888); using var surface = SKSurface.Create(grContext, false, info); var canvas = surface.Canvas; canvas.Clear(SKColors.Black); using var blueShirt = SKImage.FromEncodedData(Path.Combine(PathToImages, "blue-shirt.jpg")); using var textureShader = blueShirt.ToShader(); var src = @" uniform shader color_map; uniform float scale; uniform half exp; uniform float3 in_colors0; half4 main(float2 p) { half4 texColor = sample(color_map, p); if (length(abs(in_colors0 - pow(texColor.rgb, half3(exp)))) < scale) discard; return texColor; }"; using var effect = SKRuntimeEffect.Create(src, out var errorText); Assert.Null(errorText); Assert.NotNull(effect); var uniformSize = effect.UniformSize; Assert.Equal(5 * sizeof(float), uniformSize); var uniforms = new SKRuntimeEffectUniforms(effect) { ["scale"] = threshold, ["exp"] = exponent, ["in_colors0"] = new[] { 1f, 1f, 1f }, }; var children = new SKRuntimeEffectChildren(effect) { ["color_map"] = textureShader }; using var shader = effect.ToShader(true, uniforms, children); using var paint = new SKPaint { Shader = shader }; canvas.DrawRect(SKRect.Create(400, 400), paint); var actual = new SKColor[500 * 500]; fixed(void *a = actual) Assert.True(surface.ReadPixels(info, (IntPtr)a, info.RowBytes, 0, 0)); Assert.Equal(backgroundColor, actual[100 * info.Width + 100]); Assert.Equal(shirtColor, actual[230 * info.Width + 300]); }
public SKShader ToShader(bool isOpaque, SKRuntimeEffectUniforms uniforms, SKRuntimeEffectChildren children, SKMatrix localMatrix) => ToShader(isOpaque, uniforms.ToData(), children.ToArray(), &localMatrix);
public SKShader ToShader(bool isOpaque, SKRuntimeEffectUniforms uniforms, SKRuntimeEffectChildren children) => ToShader(isOpaque, uniforms.ToData(), children.ToArray(), null);
public SKColorFilter ToColorFilter(SKRuntimeEffectUniforms uniforms, SKRuntimeEffectChildren children) => ToColorFilter(uniforms.ToData(), children.ToArray());