From 2caf01f43b7153127f8d26b26da3f762cbf321d4 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 8 Mar 2015 23:56:42 -0400 Subject: [PATCH] embed fonts --- .../Drawing/ImageProcessor.cs | 4 +- .../Drawing/PlayedIndicatorDrawer.cs | 46 ++++++++++++++++++- .../Drawing/UnplayedCountIndicator.cs | 16 +++++-- ...MediaBrowser.Server.Implementations.csproj | 2 + 4 files changed, 61 insertions(+), 7 deletions(-) diff --git a/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs b/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs index 80cfd7f3ed..cb6058f3f1 100644 --- a/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs +++ b/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs @@ -282,13 +282,13 @@ namespace MediaBrowser.Server.Implementations.Drawing { var currentImageSize = new ImageSize(imageWidth, imageHeight); - new PlayedIndicatorDrawer().DrawPlayedIndicator(wand, currentImageSize); + new PlayedIndicatorDrawer(_appPaths).DrawPlayedIndicator(wand, currentImageSize); } else if (options.UnplayedCount.HasValue) { var currentImageSize = new ImageSize(imageWidth, imageHeight); - new UnplayedCountIndicator().DrawUnplayedCountIndicator(wand, currentImageSize, options.UnplayedCount.Value); + new UnplayedCountIndicator(_appPaths).DrawUnplayedCountIndicator(wand, currentImageSize, options.UnplayedCount.Value); } if (options.PercentPlayed > 0) diff --git a/MediaBrowser.Server.Implementations/Drawing/PlayedIndicatorDrawer.cs b/MediaBrowser.Server.Implementations/Drawing/PlayedIndicatorDrawer.cs index 6dd0b0fe76..359065cc2e 100644 --- a/MediaBrowser.Server.Implementations/Drawing/PlayedIndicatorDrawer.cs +++ b/MediaBrowser.Server.Implementations/Drawing/PlayedIndicatorDrawer.cs @@ -1,5 +1,8 @@ using ImageMagickSharp; +using MediaBrowser.Common.Configuration; using MediaBrowser.Model.Drawing; +using System; +using System.IO; namespace MediaBrowser.Server.Implementations.Drawing { @@ -8,6 +11,13 @@ namespace MediaBrowser.Server.Implementations.Drawing private const int FontSize = 52; private const int OffsetFromTopRightCorner = 38; + private readonly IApplicationPaths _appPaths; + + public PlayedIndicatorDrawer(IApplicationPaths appPaths) + { + _appPaths = appPaths; + } + public void DrawPlayedIndicator(MagickWand wand, ImageSize imageSize) { var x = imageSize.Width - OffsetFromTopRightCorner; @@ -24,7 +34,7 @@ namespace MediaBrowser.Server.Implementations.Drawing pixel.Opacity = 0; pixel.Color = "white"; draw.FillColor = pixel; - draw.Font = "Webdings"; + draw.Font = ExtractFont("webdings.ttf", _appPaths); draw.FontSize = FontSize; draw.FontStyle = FontStyleType.NormalStyle; draw.TextAlignment = TextAlignType.CenterAlign; @@ -35,8 +45,42 @@ namespace MediaBrowser.Server.Implementations.Drawing draw.FillColor = pixel; wand.CurrentImage.DrawImage(draw); } + } + } + + internal static string ExtractFont(string name, IApplicationPaths paths) + { + var filePath = Path.Combine(paths.ProgramDataPath, "fonts", name); + + if (File.Exists(filePath)) + { + return filePath; + } + + var namespacePath = typeof(PlayedIndicatorDrawer).Namespace + ".fonts." + name; + var tempPath = Path.Combine(paths.TempDirectory, Guid.NewGuid().ToString("N") + ".ttf"); + Directory.CreateDirectory(Path.GetDirectoryName(tempPath)); + + using (var stream = typeof(PlayedIndicatorDrawer).Assembly.GetManifestResourceStream(namespacePath)) + { + using (var fileStream = new FileStream(tempPath, FileMode.Create, FileAccess.Write, FileShare.Read)) + { + stream.CopyTo(fileStream); + } + } + Directory.CreateDirectory(Path.GetDirectoryName(filePath)); + + try + { + File.Copy(tempPath, filePath, false); } + catch (IOException) + { + + } + + return tempPath; } } } diff --git a/MediaBrowser.Server.Implementations/Drawing/UnplayedCountIndicator.cs b/MediaBrowser.Server.Implementations/Drawing/UnplayedCountIndicator.cs index c10084c9b2..65212a3155 100644 --- a/MediaBrowser.Server.Implementations/Drawing/UnplayedCountIndicator.cs +++ b/MediaBrowser.Server.Implementations/Drawing/UnplayedCountIndicator.cs @@ -1,6 +1,7 @@ -using System.Globalization; -using ImageMagickSharp; +using ImageMagickSharp; +using MediaBrowser.Common.Configuration; using MediaBrowser.Model.Drawing; +using System.Globalization; namespace MediaBrowser.Server.Implementations.Drawing { @@ -8,6 +9,13 @@ namespace MediaBrowser.Server.Implementations.Drawing { private const int OffsetFromTopRightCorner = 38; + private readonly IApplicationPaths _appPaths; + + public UnplayedCountIndicator(IApplicationPaths appPaths) + { + _appPaths = appPaths; + } + public void DrawUnplayedCountIndicator(MagickWand wand, ImageSize imageSize, int count) { var x = imageSize.Width - OffsetFromTopRightCorner; @@ -25,7 +33,7 @@ namespace MediaBrowser.Server.Implementations.Drawing pixel.Opacity = 0; pixel.Color = "white"; draw.FillColor = pixel; - draw.Font = "Sans-Serif"; + draw.Font = PlayedIndicatorDrawer.ExtractFont("robotoregular.ttf", _appPaths); draw.FontStyle = FontStyleType.NormalStyle; draw.TextAlignment = TextAlignType.CenterAlign; draw.FontWeight = FontWeightType.RegularStyle; @@ -36,7 +44,7 @@ namespace MediaBrowser.Server.Implementations.Drawing if (text.Length == 1) { - x += 2; + x += 1; } else if (text.Length == 2) { diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index 923e57b9b3..f645951a7b 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -426,6 +426,8 @@ + +