/// <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);
                    }
                }
            }
        }
Esempio n. 2
0
        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;
 }
Esempio n. 4
0
 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);
        }