Add missing documentation in Jellyfun.Drawing.Skia

This commit is contained in:
Mark Monteiro 2019-12-13 20:57:23 +01:00
parent 54dbdc695a
commit 88928118eb
6 changed files with 92 additions and 5 deletions

View File

@ -4,10 +4,19 @@ using SkiaSharp;
namespace Jellyfin.Drawing.Skia namespace Jellyfin.Drawing.Skia
{ {
/// <summary>
/// Static helper class used to draw percentage-played indicators on images.
/// </summary>
public static class PercentPlayedDrawer public static class PercentPlayedDrawer
{ {
private const int IndicatorHeight = 8; private const int IndicatorHeight = 8;
/// <summary>
/// Draw a percentage played indicator on a canvas.
/// </summary>
/// <param name="canvas">The canvas to draw the indicator on.</param>
/// <param name="imageSize">The size of the image being drawn on.</param>
/// <param name="percent">The percentage played to display with the indicator.</param>
public static void Process(SKCanvas canvas, ImageDimensions imageSize, double percent) public static void Process(SKCanvas canvas, ImageDimensions imageSize, double percent)
{ {
using (var paint = new SKPaint()) using (var paint = new SKPaint())

View File

@ -3,10 +3,21 @@ using SkiaSharp;
namespace Jellyfin.Drawing.Skia namespace Jellyfin.Drawing.Skia
{ {
/// <summary>
/// Static helper class for drawing 'played' indicators.
/// </summary>
public static class PlayedIndicatorDrawer public static class PlayedIndicatorDrawer
{ {
private const int OffsetFromTopRightCorner = 38; private const int OffsetFromTopRightCorner = 38;
/// <summary>
/// Draw a 'played' indicator in the top right corner of a canvas.
/// </summary>
/// <param name="canvas">The canvas to draw the indicator on.</param>
/// <param name="imageSize">
/// The dimensions of the image to draw the indicator on. The width is used to determine the x-position of the
/// indicator.
/// </param>
public static void DrawPlayedIndicator(SKCanvas canvas, ImageDimensions imageSize) public static void DrawPlayedIndicator(SKCanvas canvas, ImageDimensions imageSize)
{ {
var x = imageSize.Width - OffsetFromTopRightCorner; var x = imageSize.Width - OffsetFromTopRightCorner;

View File

@ -13,6 +13,9 @@ using static Jellyfin.Drawing.Skia.SkiaHelper;
namespace Jellyfin.Drawing.Skia namespace Jellyfin.Drawing.Skia
{ {
/// <summary>
/// Image encoder that uses <see cref="SkiaSharp"/> to manipulate images.
/// </summary>
public class SkiaEncoder : IImageEncoder public class SkiaEncoder : IImageEncoder
{ {
private readonly ILogger _logger; private readonly ILogger _logger;
@ -22,6 +25,9 @@ namespace Jellyfin.Drawing.Skia
private static readonly HashSet<string> _transparentImageTypes private static readonly HashSet<string> _transparentImageTypes
= new HashSet<string>(StringComparer.OrdinalIgnoreCase) { ".png", ".gif", ".webp" }; = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { ".png", ".gif", ".webp" };
/// <summary>
/// Initializes a new instance of the <see cref="SkiaEncoder"/> class.
/// </summary>
public SkiaEncoder( public SkiaEncoder(
ILogger<SkiaEncoder> logger, ILogger<SkiaEncoder> logger,
IApplicationPaths appPaths, IApplicationPaths appPaths,
@ -32,12 +38,16 @@ namespace Jellyfin.Drawing.Skia
_localizationManager = localizationManager; _localizationManager = localizationManager;
} }
/// <inheritdoc/>
public string Name => "Skia"; public string Name => "Skia";
/// <inheritdoc/>
public bool SupportsImageCollageCreation => true; public bool SupportsImageCollageCreation => true;
/// <inheritdoc/>
public bool SupportsImageEncoding => true; public bool SupportsImageEncoding => true;
/// <inheritdoc/>
public IReadOnlyCollection<string> SupportedInputFormats => public IReadOnlyCollection<string> SupportedInputFormats =>
new HashSet<string>(StringComparer.OrdinalIgnoreCase) new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{ {
@ -65,6 +75,7 @@ namespace Jellyfin.Drawing.Skia
"arw" "arw"
}; };
/// <inheritdoc/>
public IReadOnlyCollection<ImageFormat> SupportedOutputFormats public IReadOnlyCollection<ImageFormat> SupportedOutputFormats
=> new HashSet<ImageFormat>() { ImageFormat.Webp, ImageFormat.Jpg, ImageFormat.Png }; => new HashSet<ImageFormat>() { ImageFormat.Webp, ImageFormat.Jpg, ImageFormat.Png };
@ -80,6 +91,11 @@ namespace Jellyfin.Drawing.Skia
private static bool IsTransparent(SKColor color) private static bool IsTransparent(SKColor color)
=> (color.Red == 255 && color.Green == 255 && color.Blue == 255) || color.Alpha == 0; => (color.Red == 255 && color.Green == 255 && color.Blue == 255) || color.Alpha == 0;
/// <summary>
/// Convert a <see cref="ImageFormat"/> to a <see cref="SKEncodedImageFormat"/>.
/// </summary>
/// <param name="selectedFormat">The format to convert.</param>
/// <returns>The converted format.</returns>
public static SKEncodedImageFormat GetImageFormat(ImageFormat selectedFormat) public static SKEncodedImageFormat GetImageFormat(ImageFormat selectedFormat)
{ {
switch (selectedFormat) switch (selectedFormat)
@ -186,6 +202,9 @@ namespace Jellyfin.Drawing.Skia
} }
/// <inheritdoc /> /// <inheritdoc />
/// <exception cref="ArgumentNullException">If path is null.</exception>
/// <exception cref="FileNotFoundException">If the path is not valid.</exception>
/// <exception cref="SkiaCodecException">If the file at the specified path could not be used to generate a codec.</exception>
public ImageDimensions GetImageSize(string path) public ImageDimensions GetImageSize(string path)
{ {
if (path == null) if (path == null)
@ -497,6 +516,7 @@ namespace Jellyfin.Drawing.Skia
} }
} }
/// <inheritdoc/>
public string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, ImageOrientation? orientation, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat) public string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, ImageOrientation? orientation, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
{ {
if (string.IsNullOrWhiteSpace(inputPath)) if (string.IsNullOrWhiteSpace(inputPath))
@ -612,6 +632,7 @@ namespace Jellyfin.Drawing.Skia
return outputPath; return outputPath;
} }
/// <inheritdoc/>
public void CreateImageCollage(ImageCollageOptions options) public void CreateImageCollage(ImageCollageOptions options)
{ {
double ratio = (double)options.Width / options.Height; double ratio = (double)options.Width / options.Height;

View File

@ -5,15 +5,26 @@ using SkiaSharp;
namespace Jellyfin.Drawing.Skia namespace Jellyfin.Drawing.Skia
{ {
/// <summary>
/// Used to build collages of multiple images arranged in vertical strips.
/// </summary>
public class StripCollageBuilder public class StripCollageBuilder
{ {
private readonly SkiaEncoder _skiaEncoder; private readonly SkiaEncoder _skiaEncoder;
/// <summary>
/// Initializes a new instance of the <see cref="StripCollageBuilder"/> class.
/// </summary>
public StripCollageBuilder(SkiaEncoder skiaEncoder) public StripCollageBuilder(SkiaEncoder skiaEncoder)
{ {
_skiaEncoder = skiaEncoder; _skiaEncoder = skiaEncoder;
} }
/// <summary>
/// Check which format an image has been encoded with using its filename extension.
/// </summary>
/// <param name="outputPath">The path to the image to get the format for.</param>
/// <returns>The image format.</returns>
public static SKEncodedImageFormat GetEncodedFormat(string outputPath) public static SKEncodedImageFormat GetEncodedFormat(string outputPath)
{ {
if (outputPath == null) if (outputPath == null)
@ -48,6 +59,13 @@ namespace Jellyfin.Drawing.Skia
return SKEncodedImageFormat.Png; return SKEncodedImageFormat.Png;
} }
/// <summary>
/// Create a square collage.
/// </summary>
/// <param name="paths">The paths of the images to use in the collage.</param>
/// <param name="outputPath">The path at which to place the resulting collage image.</param>
/// <param name="width">The desired width of the collage.</param>
/// <param name="height">The desired height of the collage.</param>
public void BuildSquareCollage(string[] paths, string outputPath, int width, int height) public void BuildSquareCollage(string[] paths, string outputPath, int width, int height)
{ {
using (var bitmap = BuildSquareCollageBitmap(paths, width, height)) using (var bitmap = BuildSquareCollageBitmap(paths, width, height))
@ -58,6 +76,13 @@ namespace Jellyfin.Drawing.Skia
} }
} }
/// <summary>
/// Create a thumb collage.
/// </summary>
/// <param name="paths">The paths of the images to use in the collage.</param>
/// <param name="outputPath">The path at which to place the resulting image.</param>
/// <param name="width">The desired width of the collage.</param>
/// <param name="height">The desired height of the collage.</param>
public void BuildThumbCollage(string[] paths, string outputPath, int width, int height) public void BuildThumbCollage(string[] paths, string outputPath, int width, int height)
{ {
using (var bitmap = BuildThumbCollageBitmap(paths, width, height)) using (var bitmap = BuildThumbCollageBitmap(paths, width, height))

View File

@ -4,10 +4,25 @@ using SkiaSharp;
namespace Jellyfin.Drawing.Skia namespace Jellyfin.Drawing.Skia
{ {
/// <summary>
/// Static helper class for drawing unplayed count indicators.
/// </summary>
public static class UnplayedCountIndicator public static class UnplayedCountIndicator
{ {
/// <summary>
/// The x-offset used when drawing an unplayed count indicator.
/// </summary>
private const int OffsetFromTopRightCorner = 38; private const int OffsetFromTopRightCorner = 38;
/// <summary>
/// Draw an unplayed count indicator in the top right corner of a canvas.
/// </summary>
/// <param name="canvas">The canvas to draw the indicator on.</param>
/// <param name="imageSize">
/// The dimensions of the image to draw the indicator on. The width is used to determine the x-position of the
/// indicator.
/// </param>
/// <param name="count">The number to draw in the indicator.</param>
public static void DrawUnplayedCountIndicator(SKCanvas canvas, ImageDimensions imageSize, int count) public static void DrawUnplayedCountIndicator(SKCanvas canvas, ImageDimensions imageSize, int count)
{ {
var x = imageSize.Width - OffsetFromTopRightCorner; var x = imageSize.Width - OffsetFromTopRightCorner;

View File

@ -11,6 +11,7 @@ namespace MediaBrowser.Controller.Drawing
/// </summary> /// </summary>
/// <value>The supported input formats.</value> /// <value>The supported input formats.</value>
IReadOnlyCollection<string> SupportedInputFormats { get; } IReadOnlyCollection<string> SupportedInputFormats { get; }
/// <summary> /// <summary>
/// Gets the supported output formats. /// Gets the supported output formats.
/// </summary> /// </summary>
@ -18,9 +19,9 @@ namespace MediaBrowser.Controller.Drawing
IReadOnlyCollection<ImageFormat> SupportedOutputFormats { get; } IReadOnlyCollection<ImageFormat> SupportedOutputFormats { get; }
/// <summary> /// <summary>
/// Gets the name. /// Gets the display name for the encoder.
/// </summary> /// </summary>
/// <value>The name.</value> /// <value>The display name.</value>
string Name { get; } string Name { get; }
/// <summary> /// <summary>
@ -35,17 +36,22 @@ namespace MediaBrowser.Controller.Drawing
/// <value><c>true</c> if [supports image encoding]; otherwise, <c>false</c>.</value> /// <value><c>true</c> if [supports image encoding]; otherwise, <c>false</c>.</value>
bool SupportsImageEncoding { get; } bool SupportsImageEncoding { get; }
/// <summary>
/// Get the dimensions of an image from the filesystem.
/// </summary>
/// <param name="path">The filepath of the image.</param>
/// <returns>The image dimensions.</returns>
ImageDimensions GetImageSize(string path); ImageDimensions GetImageSize(string path);
/// <summary> /// <summary>
/// Encodes the image. /// Encode an image.
/// </summary> /// </summary>
string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, ImageOrientation? orientation, int quality, ImageProcessingOptions options, ImageFormat outputFormat); string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, ImageOrientation? orientation, int quality, ImageProcessingOptions options, ImageFormat outputFormat);
/// <summary> /// <summary>
/// Creates the image collage. /// Create an image collage.
/// </summary> /// </summary>
/// <param name="options">The options.</param> /// <param name="options">The options to use when creating the collage.</param>
void CreateImageCollage(ImageCollageOptions options); void CreateImageCollage(ImageCollageOptions options);
} }
} }