/// <summary> /// Renders a given layer on a surface and caches it. /// </summary> /// <param name="setting">Display setting</param> /// <param name="layer">Which layer is it we're rendering</param> /// <param name="layerStyleDef">Style definition</param> /// <param name="layerStyle">Style to render</param> /// <param name="segments">Which segments to render</param> /// <param name="skewAngle">How much to skew</param> public void RasterizeLayer(DisplaySetting setting, RasterizeLayer layer, RasterizeLayerStyleDefinition layerStyleDef, RasterizeLayerStyle layerStyle, IEnumerable <int> segments, float skewAngle) { var source = _svgs[setting.SegmentType][setting.StyleDefinition.SegmentWeight]; //Logger.Info("Rasterizing {0} segments of layer {1} on display {2} segment size = {3}x{4}", setting.SegmentType, layer, setting.Display, setting.Dim.SvgWidth, setting.Dim.SvgHeight); using (var paint = new SKPaint()) { ApplyFilters(paint, layerStyleDef, layerStyle); foreach (var i in segments) { var initialKey = new RasterCacheKey(InitialCache, layer, setting.SegmentType, setting.StyleDefinition.SegmentWeight, i); var cacheKey = new RasterCacheKey(setting.Display, layer, setting.SegmentType, setting.StyleDefinition.SegmentWeight, i); if (!_rasterCache.ContainsKey(initialKey)) { _rasterCache[initialKey] = RasterizeSegment(source[i].Picture, setting.Dim, skewAngle, paint); } else { if (_rasterCache.ContainsKey(cacheKey)) { _rasterCache[cacheKey]?.Dispose(); } _rasterCache[cacheKey] = RasterizeSegment(source[i].Picture, setting.Dim, skewAngle, paint); } } } }
public void ApplyLayerStyle(RasterizeLayer layer, RasterizeLayerStyleDefinition layerStyleDef) { switch (layer) { case RasterizeLayer.OuterGlow: StyleDefinition.OuterGlow = layerStyleDef; break; case RasterizeLayer.InnerGlow: StyleDefinition.InnerGlow = layerStyleDef; break; case RasterizeLayer.Foreground: StyleDefinition.Foreground = layerStyleDef; break; case RasterizeLayer.Background: StyleDefinition.Background = layerStyleDef; break; default: throw new ArgumentOutOfRangeException(nameof(layer), layer, null); } Style = StyleDefinition.Scale(Dim.SvgScale); }
public RasterCacheKey(int display, RasterizeLayer layer, SegmentType type, SegmentWeight weight, int segment) { Display = display; Layer = layer; Type = type; Weight = weight; Segment = segment; }
public static void DrawSegment(DisplaySetting displaySetting, RasterizeLayer layer, ushort seg, SKCanvas canvas, SKPoint canvasPosition, double percentage) { using (var surfacePaint = new SKPaint()) { if (percentage < 1) { surfacePaint.Color = new SKColor(0, 0, 0, (byte)Math.Round(percentage * 255)); } for (var j = 0; j < Res.SegmentSize[displaySetting.SegmentType]; j++) { var rasterizedSegment = Res.GetRasterized(displaySetting.Display, layer, displaySetting.SegmentType, displaySetting.StyleDefinition.SegmentWeight, j); if (((seg >> j) & 0x1) != 0 && rasterizedSegment != null) { canvas.DrawSurface(rasterizedSegment, canvasPosition, surfacePaint); } } } }
/// <summary> /// Returns a surface of a segment that was previously generated. /// </summary> /// /// <remarks> /// Note that in order to avoid multiple rasterization for each display /// on startup, we initially use only one cache. Then, when displays /// get individually resized, each display has its own cache. /// </remarks> /// <param name="display">Display number</param> /// <param name="layer">Which layer</param> /// <param name="type">Which segment type</param> /// <param name="weight">SegmentWeight</param> /// <param name="segment">Which segment</param> /// <returns>Rasterized surface of null if rasterization is unavailable</returns> public SKSurface GetRasterized(int display, RasterizeLayer layer, SegmentType type, SegmentWeight weight, int segment) { // do we have an individual cache for that display already? var displayKey = new RasterCacheKey(display, layer, type, weight, segment); if (_rasterCache.ContainsKey(displayKey)) { return(_rasterCache[displayKey]); } // fallback on initial cache var initialKey = new RasterCacheKey(InitialCache, layer, type, weight, segment); if (_rasterCache.ContainsKey(initialKey)) { return(_rasterCache[initialKey]); } return(null); }