|  | @@ -91,9 +91,6 @@ namespace Jellyfin.Drawing.Skia
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private static bool IsTransparent(SKColor color)
 | 
	
		
			
				|  |  | -            => (color.Red == 255 && color.Green == 255 && color.Blue == 255) || color.Alpha == 0;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
		
			
				|  |  |          /// Convert a <see cref="ImageFormat"/> to a <see cref="SKEncodedImageFormat"/>.
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
	
		
			
				|  | @@ -111,65 +108,6 @@ namespace Jellyfin.Drawing.Skia
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private static bool IsTransparentRow(SKBitmap bmp, int row)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            for (var i = 0; i < bmp.Width; ++i)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                if (!IsTransparent(bmp.GetPixel(i, row)))
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    return false;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            return true;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        private static bool IsTransparentColumn(SKBitmap bmp, int col)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            for (var i = 0; i < bmp.Height; ++i)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                if (!IsTransparent(bmp.GetPixel(col, i)))
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    return false;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            return true;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        private SKBitmap CropWhiteSpace(SKBitmap bitmap)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            var topmost = 0;
 | 
	
		
			
				|  |  | -            while (topmost < bitmap.Height && IsTransparentRow(bitmap, topmost))
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                topmost++;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            int bottommost = bitmap.Height;
 | 
	
		
			
				|  |  | -            while (bottommost >= 0 && IsTransparentRow(bitmap, bottommost - 1))
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                bottommost--;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            var leftmost = 0;
 | 
	
		
			
				|  |  | -            while (leftmost < bitmap.Width && IsTransparentColumn(bitmap, leftmost))
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                leftmost++;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            var rightmost = bitmap.Width;
 | 
	
		
			
				|  |  | -            while (rightmost >= 0 && IsTransparentColumn(bitmap, rightmost - 1))
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                rightmost--;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            var newRect = SKRectI.Create(leftmost, topmost, rightmost - leftmost, bottommost - topmost);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            using var image = SKImage.FromBitmap(bitmap);
 | 
	
		
			
				|  |  | -            using var subset = image.Subset(newRect);
 | 
	
		
			
				|  |  | -            return SKBitmap.FromImage(subset);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          /// <inheritdoc />
 | 
	
		
			
				|  |  |          /// <exception cref="ArgumentNullException">The path is null.</exception>
 | 
	
		
			
				|  |  |          /// <exception cref="FileNotFoundException">The path is not valid.</exception>
 | 
	
	
		
			
				|  | @@ -312,22 +250,11 @@ namespace Jellyfin.Drawing.Skia
 | 
	
		
			
				|  |  |              return resultBitmap;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private SKBitmap? GetBitmap(string path, bool cropWhitespace, bool forceAnalyzeBitmap, ImageOrientation? orientation, out SKEncodedOrigin origin)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            if (cropWhitespace)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                using var bitmap = Decode(path, forceAnalyzeBitmap, orientation, out origin);
 | 
	
		
			
				|  |  | -                return bitmap == null ? null : CropWhiteSpace(bitmap);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            return Decode(path, forceAnalyzeBitmap, orientation, out origin);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        private SKBitmap? GetBitmap(string path, bool cropWhitespace, bool autoOrient, ImageOrientation? orientation)
 | 
	
		
			
				|  |  | +        private SKBitmap? GetBitmap(string path, bool autoOrient, ImageOrientation? orientation)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              if (autoOrient)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                var bitmap = GetBitmap(path, cropWhitespace, true, orientation, out var origin);
 | 
	
		
			
				|  |  | +                var bitmap = Decode(path, true, orientation, out var origin);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  if (bitmap != null && origin != SKEncodedOrigin.TopLeft)
 | 
	
		
			
				|  |  |                  {
 | 
	
	
		
			
				|  | @@ -340,7 +267,7 @@ namespace Jellyfin.Drawing.Skia
 | 
	
		
			
				|  |  |                  return bitmap;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            return GetBitmap(path, cropWhitespace, false, orientation, out _);
 | 
	
		
			
				|  |  | +            return Decode(path, false, orientation, out _);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          private SKBitmap OrientImage(SKBitmap bitmap, SKEncodedOrigin origin)
 | 
	
	
		
			
				|  | @@ -461,7 +388,7 @@ namespace Jellyfin.Drawing.Skia
 | 
	
		
			
				|  |  |              var blur = options.Blur ?? 0;
 | 
	
		
			
				|  |  |              var hasIndicator = options.AddPlayedIndicator || options.UnplayedCount.HasValue || !options.PercentPlayed.Equals(0);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            using var bitmap = GetBitmap(inputPath, options.CropWhiteSpace, autoOrient, orientation);
 | 
	
		
			
				|  |  | +            using var bitmap = GetBitmap(inputPath, autoOrient, orientation);
 | 
	
		
			
				|  |  |              if (bitmap == null)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  throw new InvalidDataException($"Skia unable to read image {inputPath}");
 | 
	
	
		
			
				|  | @@ -469,9 +396,7 @@ namespace Jellyfin.Drawing.Skia
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              var originalImageSize = new ImageDimensions(bitmap.Width, bitmap.Height);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            if (!options.CropWhiteSpace
 | 
	
		
			
				|  |  | -                && options.HasDefaultOptions(inputPath, originalImageSize)
 | 
	
		
			
				|  |  | -                && !autoOrient)
 | 
	
		
			
				|  |  | +            if (options.HasDefaultOptions(inputPath, originalImageSize) && !autoOrient)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  // Just spit out the original file if all the options are default
 | 
	
		
			
				|  |  |                  return inputPath;
 |