Reuse shaders/paint where possible

Added noise test
This commit is contained in:
SpoinkyNL committed 2019-12-05 08:23:00 +01:00
1 parent 49cf96e12c
commit 33d0fca15e
14 files changed
+494 -31

No files matched your search

+27 -23
View File
@@ -17,6 +17,8 @@ namespace Artemis.Core.Models.Profile
{
private readonly List<LayerElement> _layerElements;
private List<ArtemisLed> _leds;
private SKBitmap _renderBitmap;
private SKCanvas _renderCanvas;
public Layer(Profile profile, ProfileElement parent, string name)
{
@@ -70,33 +72,28 @@ namespace Artemis.Core.Models.Profile
foreach (var layerElement in LayerElements)
layerElement.RenderPreProcess(surface, canvas);
using (var bitmap = new SKBitmap(new SKImageInfo((int) RenderRectangle.Width, (int) RenderRectangle.Height)))
using (var layerCanvas = new SKCanvas(bitmap))
_renderCanvas.Clear();
foreach (var layerElement in LayerElements)
layerElement.Render(surface, _renderCanvas);
var baseShader = SKShader.CreateBitmap(_renderBitmap, SKShaderTileMode.Repeat, SKShaderTileMode.Repeat, SKMatrix.MakeTranslation(RenderRectangle.Left, RenderRectangle.Top));
foreach (var layerElement in LayerElements)
{
layerCanvas.Clear();
var newBaseShader = layerElement.RenderPostProcess(surface, _renderBitmap, baseShader);
if (newBaseShader == null)
continue;
foreach (var layerElement in LayerElements)
layerElement.Render(surface, layerCanvas);
// Dispose the old base shader if the layer element provided a new one
if (!ReferenceEquals(baseShader, newBaseShader))
baseShader.Dispose();
var baseShader = SKShader.CreateBitmap(bitmap, SKShaderTileMode.Repeat, SKShaderTileMode.Repeat, SKMatrix.MakeTranslation(RenderRectangle.Left, RenderRectangle.Top));
foreach (var layerElement in LayerElements)
{
var newBaseShader = layerElement.RenderPostProcess(surface, bitmap, baseShader);
if (newBaseShader == null)
continue;
// Dispose the old base shader if the layer element provided a new one
if (!ReferenceEquals(baseShader, newBaseShader))
baseShader.Dispose();
baseShader = newBaseShader;
}
//canvas.ClipPath(RenderPath);
canvas.DrawRect(RenderRectangle, new SKPaint {Shader = baseShader, FilterQuality = SKFilterQuality.Low});
baseShader.Dispose();
baseShader = newBaseShader;
}
canvas.ClipPath(RenderPath);
canvas.DrawRect(RenderRectangle, new SKPaint {Shader = baseShader, FilterQuality = SKFilterQuality.Low});
baseShader.Dispose();
canvas.Restore();
}
@@ -188,7 +185,7 @@ namespace Artemis.Core.Models.Profile
_leds = leds;
CalculateRenderProperties();
}
internal void CalculateRenderProperties()
{
if (!Leds.Any())
@@ -208,6 +205,13 @@ namespace Artemis.Core.Models.Profile
path.AddRect(artemisLed.AbsoluteRenderRectangle);
RenderPath = path;
var oldBitmap = _renderBitmap;
var oldCanvas = _renderCanvas;
_renderBitmap = new SKBitmap(new SKImageInfo((int) RenderRectangle.Width, (int) RenderRectangle.Height));
_renderCanvas = new SKCanvas(_renderBitmap);
oldBitmap?.Dispose();
oldCanvas?.Dispose();
OnRenderPropertiesUpdated();
}
+1 -1
View File
@@ -57,7 +57,7 @@ namespace Artemis.Core.Services
_logger.Warning("RgbDevice provider {deviceProvider} has no devices", deviceProvider.GetType().Name);
return;
}
foreach (var surfaceDevice in deviceProvider.Devices)
{
if (!_loadedDevices.Contains(surfaceDevice))