Пример #1
0
        private async Task <string> CreateBadge(CancellationToken token)
        {
            //Get the badge icon
            IImage badgeIcon = null;

            if (_mode == Mode.File)
            {
                badgeIcon = await _canvasService.GetImage(FileIcon, token);
            }
            else if (_mode == Mode.Svg)
            {
                badgeIcon = await _canvasService.GetSvgImage(SvgIcon, SvgWidth, SvgHeight, token);
            }

            if (badgeIcon == null)
            {
                return(null);
            }

            token.ThrowIfCancellationRequested();

            IImageCanvas canvas = null;

            if (IsBadgeVisible)
            {
                //InitializeCache frames
                var font      = new Font(null, BadgeFontSize);
                var metrics   = _canvasService.MeasureText(BadgeCount.ToString(), font);
                var textSize  = metrics.Size;
                var badgeSize = new Size(BadgePadding.Left + BadgePadding.Right + textSize.Width,
                                         BadgePadding.Top + BadgePadding.Bottom + textSize.Height);
                var canvasSize = new Size(badgeIcon.Size.Width + badgeSize.Width - BadgeInsets.Width,
                                          badgeIcon.Size.Height + badgeSize.Height - BadgeInsets.Height);

                //Create canvas
                canvas = _canvasService.GetCanvas(canvasSize);
                token.ThrowIfCancellationRequested();

                //Draw icon
                var imageFrame = new Rect(0, badgeSize.Height - BadgeInsets.Height, badgeIcon.Size.Width,
                                          badgeIcon.Size.Height);
                canvas.DrawImage(badgeIcon, imageFrame);
                token.ThrowIfCancellationRequested();

                //Draw the badge rounded rect
                var badgeFrame = new Rect(badgeIcon.Size.Width - BadgeInsets.Width, 0, badgeSize.Width,
                                          badgeSize.Height);
                var color      = GetColor(BadgeColor);
                var badgeImage = _canvasService.GetRoundedImage(badgeFrame.Size, color, BadgeRadius);
                canvas.DrawImage(badgeImage, badgeFrame);
                token.ThrowIfCancellationRequested();

                //Draw badge text
                var textFrame = new Rect(badgeFrame.X + BadgePadding.Left,
                                         badgeFrame.Y + BadgePadding.Top + metrics.Ascent, textSize.Width, textSize.Height);
                canvas.DrawText(BadgeCount.ToString(), textFrame, font, TextAlignment.Center,
                                GetColor(BadgeTextColor));
            }
            else
            {
                //Create canvas
                canvas = _canvasService.GetCanvas(badgeIcon.Size);
                token.ThrowIfCancellationRequested();

                //Draw icon
                var imageFrame = new Rect(0, 0, badgeIcon.Size.Width, badgeIcon.Size.Height);
                canvas.DrawImage(badgeIcon, imageFrame);
            }

            token.ThrowIfCancellationRequested();

            //Get the result image
            var image = canvas.GetImage();

            //Save the image to cache
            var filename = GetBadgeCacheFileName();
            var path     = PortablePath.Combine(_cacheFolder.Path, filename);
            await _canvasService.SaveImage(image, _cacheFolder.Path, filename, token);

            return(path);
        }