Example #1
0
        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());
        }
Example #2
0
            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);
            }
Example #3
0
        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());
        }
Example #4
0
        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);
        }
Example #5
0
        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());