diff --git a/src/Skia/Avalonia.Skia/Assets/NoiseAsset_256X256_PNG.png b/src/Skia/Avalonia.Skia/Assets/NoiseAsset_256X256_PNG.png new file mode 100644 index 0000000000..41de173d90 Binary files /dev/null and b/src/Skia/Avalonia.Skia/Assets/NoiseAsset_256X256_PNG.png differ diff --git a/src/Skia/Avalonia.Skia/Avalonia.Skia.csproj b/src/Skia/Avalonia.Skia/Avalonia.Skia.csproj index 68da513528..d5ad70b944 100644 --- a/src/Skia/Avalonia.Skia/Avalonia.Skia.csproj +++ b/src/Skia/Avalonia.Skia/Avalonia.Skia.csproj @@ -7,6 +7,9 @@ true true + + + diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs index 01eddd2aad..63b51dcccb 100644 --- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs +++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs @@ -34,6 +34,7 @@ namespace Avalonia.Skia private readonly SKPaint _strokePaint = new SKPaint(); private readonly SKPaint _fillPaint = new SKPaint(); private readonly SKPaint _boxShadowPaint = new SKPaint(); + private static SKShader s_acrylicNoiseShader; /// /// Context create info. @@ -652,21 +653,6 @@ namespace Avalonia.Skia } } - static SKColor SimpleColorBurn(SKColor bg, SKColor fg) - { - using (var bmp = new SKBitmap(1, 1)) - { - bmp.SetPixel(0, 0, bg); - using (var canvas = new SKCanvas(bmp)) - using (var paint = new SKPaint - { - Color = fg - }) - canvas.DrawRect(-1, -1, 3, 3, paint); - return bmp.GetPixel(0, 0); - } - } - static SKColorFilter CreateAlphaColorFilter(double opacity) { if (opacity > 1) @@ -711,19 +697,24 @@ namespace Avalonia.Skia acrylicBrush.BackgroundSource == AcrylicBackgroundSource.Digger ? acrylicBrush.TintOpacity : 1; - var noiseOpcity = 0.06 * brush.Opacity; + const double noiseOpcity = 0.06; - var tintColor = acrylicBrush.TintColor; - var excl = new SKColor(255, 255, 255, (byte)(255 * 0.1)); - var tint = new SKColor(tintColor.R, tintColor.G, tintColor.B, (byte)(255 * ((tintColor.A / 255.0) * acrylicBrush.Opacity))); + var tintColor = acrylicBrush.TintColor; + var tint = new SKColor(tintColor.R, tintColor.G, tintColor.B, (byte)(255 * ((tintColor.A / 255.0) * acrylicBrush.Opacity))); + + if(s_acrylicNoiseShader == null) + { + using(var stream = typeof(DrawingContextImpl).Assembly.GetManifestResourceStream("Avalonia.Skia.Assets.NoiseAsset_256X256_PNG.png")) + using (var bitmap = SKBitmap.Decode(stream)) + { + s_acrylicNoiseShader = SKShader.CreateBitmap(bitmap, SKShaderTileMode.Repeat, SKShaderTileMode.Repeat) + .WithColorFilter(CreateAlphaColorFilter(noiseOpcity)); + } - tint = SimpleColorBurn(excl, tint); + } using (var tintShader = SKShader.CreateColor(tint)) - using (var noiseShader = - SKShader.CreatePerlinNoiseTurbulence(15.876f, 15.876f, 2, 0.76829314f) - .WithColorFilter(CreateAlphaColorFilter(noiseOpcity))) - using (var compose = SKShader.CreateCompose(tintShader, noiseShader)) + using (var compose = SKShader.CreateCompose(tintShader, s_acrylicNoiseShader)) { paint.Shader = compose;