Exemple #1
0
        public void RuntimeEffectUniformsThrowsCorrectly(string name, object value)
        {
            var src = @"
uniform float uniform_float;
uniform float uniform_float_array[2];
half4 main() { return half4(0); }";

            using var effect = SKRuntimeEffect.Create(src, out _);
            var uniforms = new SKRuntimeEffectUniforms(effect);

            if (value is int intValue)
            {
                Assert.Throws <ArgumentException>(() => uniforms.Add(name, intValue));
            }
            else if (value is float floatValue)
            {
                Assert.Throws <ArgumentException>(() => uniforms.Add(name, floatValue));
            }
            else if (value is float[] floatArray)
            {
                Assert.Throws <ArgumentException>(() => uniforms.Add(name, floatArray));
            }
            else
            {
                throw new ArgumentException($"Invalid test data type {value}");
            }
        }
Exemple #2
0
        public void InvalidColorFilters(string src)
        {
            using var effect = SKRuntimeEffect.Create(src, out var errorText);

            var uniforms = new SKRuntimeEffectUniforms(effect);

            Assert.NotNull(effect.ToShader(false, uniforms));
            Assert.Null(effect.ToColorFilter(uniforms));
        }
Exemple #3
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);
            }
Exemple #4
0
        public void RuntimeEffectUniformsThrowsWhithInvalidName()
        {
            var src = @"
uniform float uniform_float;
half4 main() { return half4(0); }";

            using var effect = SKRuntimeEffect.Create(src, out _);
            var uniforms = new SKRuntimeEffectUniforms(effect);

            Assert.Throws <ArgumentOutOfRangeException>(() => uniforms.Add("invalid", 1f));
        }
Exemple #5
0
        public void RuntimeEffectUniformsMatchesEffect(string header, string[] uniforms)
        {
            var src = $"{header} half4 main() {{ return half4(0); }}";

            using var effect = SKRuntimeEffect.Create(src, out _);

            var effectUniforms = new SKRuntimeEffectUniforms(effect);

            Assert.Equal(uniforms, effectUniforms.Names);
            Assert.Equal(effect.UniformSize, effectUniforms.ToData().Size);
            Assert.Equal(uniforms, effectUniforms);
        }
Exemple #6
0
        public void RuntimeEffectUniformsWorksCorrectly()
        {
            var src = @"
uniform float uniform_float;
uniform float uniform_float_array[2];
uniform float2 uniform_float2;
half4 main() { return half4(0); }";

            using var effect = SKRuntimeEffect.Create(src, out _);
            var uniforms = new SKRuntimeEffectUniforms(effect);

            uniforms.Add("uniform_float", 1f);
            uniforms.Add("uniform_float_array", new[] { 1f, 2f });
            uniforms.Add("uniform_float2", new[] { 1f, 2f });
            uniforms.Reset();
        }
Exemple #7
0
        public void RuntimeEffectUniformsWorksCorrectlyWithCollectionIndexer()
        {
            var src = @"
uniform float uniform_float;
uniform float uniform_float_array[2];
uniform float2 uniform_float2;
half4 main() { return half4(0); }";

            using var effect = SKRuntimeEffect.Create(src, out _);

            var uniforms = new SKRuntimeEffectUniforms(effect)
            {
                ["uniform_float"]       = 1f,
                ["uniform_float_array"] = new[] { 1f, 2f },
                ["uniform_float2"]      = new[] { 1f, 2f }
            };
        }
Exemple #8
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]);
        }