|
|
|
@ -225,10 +225,7 @@ namespace Avalonia.Skia |
|
|
|
/// <inheritdoc />
|
|
|
|
public IRenderTargetBitmapImpl CreateLayer(Size size) |
|
|
|
{ |
|
|
|
var normalizedDpi = new Vector(_dpi.X / SkiaPlatform.DefaultDpi.X, _dpi.Y / SkiaPlatform.DefaultDpi.Y); |
|
|
|
var pixelSize = size * normalizedDpi; |
|
|
|
|
|
|
|
return CreateRenderTarget((int) pixelSize.Width, (int) pixelSize.Height, _dpi); |
|
|
|
return CreateRenderTarget(size); |
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
@ -387,26 +384,27 @@ namespace Avalonia.Skia |
|
|
|
/// <param name="targetSize">Target size.</param>
|
|
|
|
/// <param name="tileBrush">Tile brush to use.</param>
|
|
|
|
/// <param name="tileBrushImage">Tile brush image.</param>
|
|
|
|
/// <param name="interpolationMode">The bitmap interpolation mode.</param>
|
|
|
|
private void ConfigureTileBrush(ref PaintWrapper paintWrapper, Size targetSize, ITileBrush tileBrush, IDrawableBitmapImpl tileBrushImage) |
|
|
|
{ |
|
|
|
var calc = new TileBrushCalculator(tileBrush, |
|
|
|
new Size(tileBrushImage.PixelSize.Width, tileBrushImage.PixelSize.Height), targetSize); |
|
|
|
|
|
|
|
var intermediate = CreateRenderTarget( |
|
|
|
(int)calc.IntermediateSize.Width, |
|
|
|
(int)calc.IntermediateSize.Height, _dpi); |
|
|
|
var calc = new TileBrushCalculator(tileBrush, tileBrushImage.PixelSize.ToSize(_dpi), targetSize); |
|
|
|
var intermediate = CreateRenderTarget(calc.IntermediateSize); |
|
|
|
|
|
|
|
paintWrapper.AddDisposable(intermediate); |
|
|
|
|
|
|
|
using (var context = intermediate.CreateDrawingContext(null)) |
|
|
|
{ |
|
|
|
var rect = new Rect(0, 0, tileBrushImage.PixelSize.Width, tileBrushImage.PixelSize.Height); |
|
|
|
var sourceRect = new Rect(tileBrushImage.PixelSize.ToSize(96)); |
|
|
|
var targetRect = new Rect(tileBrushImage.PixelSize.ToSize(_dpi)); |
|
|
|
|
|
|
|
context.Clear(Colors.Transparent); |
|
|
|
context.PushClip(calc.IntermediateClip); |
|
|
|
context.Transform = calc.IntermediateTransform; |
|
|
|
context.DrawImage(RefCountable.CreateUnownedNotClonable(tileBrushImage), 1, rect, rect, tileBrush.BitmapInterpolationMode); |
|
|
|
context.DrawImage( |
|
|
|
RefCountable.CreateUnownedNotClonable(tileBrushImage), |
|
|
|
1, |
|
|
|
sourceRect, |
|
|
|
targetRect, |
|
|
|
tileBrush.BitmapInterpolationMode); |
|
|
|
context.PopClip(); |
|
|
|
} |
|
|
|
|
|
|
|
@ -433,7 +431,14 @@ namespace Avalonia.Skia |
|
|
|
var image = intermediate.SnapshotImage(); |
|
|
|
paintWrapper.AddDisposable(image); |
|
|
|
|
|
|
|
using (var shader = image.ToShader(tileX, tileY, tileTransform)) |
|
|
|
var paintTransform = default(SKMatrix); |
|
|
|
|
|
|
|
SKMatrix.Concat( |
|
|
|
ref paintTransform, |
|
|
|
tileTransform, |
|
|
|
SKMatrix.MakeScale((float)(96.0 / _dpi.X), (float)(96.0 / _dpi.Y))); |
|
|
|
|
|
|
|
using (var shader = image.ToShader(tileX, tileY, paintTransform)) |
|
|
|
{ |
|
|
|
paintWrapper.Paint.Shader = shader; |
|
|
|
} |
|
|
|
@ -457,7 +462,7 @@ namespace Avalonia.Skia |
|
|
|
|
|
|
|
if (intermediateSize.Width >= 1 && intermediateSize.Height >= 1) |
|
|
|
{ |
|
|
|
var intermediate = CreateRenderTarget((int)intermediateSize.Width, (int)intermediateSize.Height, _dpi); |
|
|
|
var intermediate = CreateRenderTarget(intermediateSize); |
|
|
|
|
|
|
|
using (var ctx = intermediate.CreateDrawingContext(visualBrushRenderer)) |
|
|
|
{ |
|
|
|
@ -609,18 +614,17 @@ namespace Avalonia.Skia |
|
|
|
/// <summary>
|
|
|
|
/// Create new render target compatible with this drawing context.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="width">Width.</param>
|
|
|
|
/// <param name="height">Height.</param>
|
|
|
|
/// <param name="dpi">Drawing dpi.</param>
|
|
|
|
/// <param name="size">The size of the render target in DIPs.</param>
|
|
|
|
/// <param name="format">Pixel format.</param>
|
|
|
|
/// <returns></returns>
|
|
|
|
private SurfaceRenderTarget CreateRenderTarget(int width, int height, Vector dpi, PixelFormat? format = null) |
|
|
|
private SurfaceRenderTarget CreateRenderTarget(Size size, PixelFormat? format = null) |
|
|
|
{ |
|
|
|
var pixelSize = PixelSize.FromSize(size, _dpi); |
|
|
|
var createInfo = new SurfaceRenderTarget.CreateInfo |
|
|
|
{ |
|
|
|
Width = width, |
|
|
|
Height = height, |
|
|
|
Dpi = dpi, |
|
|
|
Width = pixelSize.Width, |
|
|
|
Height = pixelSize.Height, |
|
|
|
Dpi = _dpi, |
|
|
|
Format = format, |
|
|
|
DisableTextLcdRendering = !_canTextUseLcdRendering, |
|
|
|
GrContext = _grContext |
|
|
|
|