소스 검색

Rewrite OrientImage

Patrick Barron 4 년 전
부모
커밋
b51a10948a
1개의 변경된 파일39개의 추가작업 그리고 102개의 파일을 삭제
  1. 39 102
      Jellyfin.Drawing.Skia/SkiaEncoder.cs

+ 39 - 102
Jellyfin.Drawing.Skia/SkiaEncoder.cs

@@ -372,118 +372,55 @@ namespace Jellyfin.Drawing.Skia
 
         private SKBitmap OrientImage(SKBitmap bitmap, SKEncodedOrigin origin)
         {
-            switch (origin)
+            if (origin == SKEncodedOrigin.Default)
             {
-                case SKEncodedOrigin.TopRight:
-                    {
-                        var rotated = new SKBitmap(bitmap.Width, bitmap.Height);
-                        using var surface = new SKCanvas(rotated);
-                        surface.Translate(rotated.Width, 0);
-                        surface.Scale(-1, 1);
-                        surface.DrawBitmap(bitmap, 0, 0);
+                return bitmap;
+            }
 
-                        return rotated;
-                    }
+            var needsFlip = origin == SKEncodedOrigin.LeftBottom
+                            || origin == SKEncodedOrigin.LeftTop
+                            || origin == SKEncodedOrigin.RightBottom
+                            || origin == SKEncodedOrigin.RightTop;
+            var rotated = needsFlip
+                ? new SKBitmap(bitmap.Height, bitmap.Width)
+                : new SKBitmap(bitmap.Width, bitmap.Height);
+            using var surface = new SKCanvas(rotated);
+            var midX = (float)rotated.Width / 2;
+            var midY = (float)rotated.Height / 2;
 
+            switch (origin)
+            {
+                case SKEncodedOrigin.TopRight:
+                    surface.Scale(-1, 1, midX, midY);
+                    break;
                 case SKEncodedOrigin.BottomRight:
-                    {
-                        var rotated = new SKBitmap(bitmap.Width, bitmap.Height);
-                        using var surface = new SKCanvas(rotated);
-                        float px = (float)bitmap.Width / 2;
-                        float py = (float)bitmap.Height / 2;
-
-                        surface.RotateDegrees(180, px, py);
-                        surface.DrawBitmap(bitmap, 0, 0);
-
-                        return rotated;
-                    }
-
+                    surface.RotateDegrees(180, midX, midY);
+                    break;
                 case SKEncodedOrigin.BottomLeft:
-                    {
-                        var rotated = new SKBitmap(bitmap.Width, bitmap.Height);
-                        using var surface = new SKCanvas(rotated);
-                        float px = (float)bitmap.Width / 2;
-
-                        float py = (float)bitmap.Height / 2;
-
-                        surface.Translate(rotated.Width, 0);
-                        surface.Scale(-1, 1);
-
-                        surface.RotateDegrees(180, px, py);
-                        surface.DrawBitmap(bitmap, 0, 0);
-
-                        return rotated;
-                    }
-
+                    surface.Scale(1, -1, midX, midY);
+                    break;
                 case SKEncodedOrigin.LeftTop:
-                {
-                    // TODO: Remove dual canvases, had trouble with flipping
-                    using var rotated = new SKBitmap(bitmap.Height, bitmap.Width);
-                    using (var surface = new SKCanvas(rotated))
-                    {
-                        surface.Translate(rotated.Width, 0);
-
-                        surface.RotateDegrees(90);
-
-                        surface.DrawBitmap(bitmap, 0, 0);
-                    }
-
-                    var flippedBitmap = new SKBitmap(rotated.Width, rotated.Height);
-                    using (var flippedCanvas = new SKCanvas(flippedBitmap))
-                    {
-                        flippedCanvas.Translate(flippedBitmap.Width, 0);
-                        flippedCanvas.Scale(-1, 1);
-                        flippedCanvas.DrawBitmap(rotated, 0, 0);
-                    }
-
-                    return flippedBitmap;
-                }
+                    surface.Translate(0, -rotated.Height);
+                    surface.Scale(1, -1, midX, midY);
+                    surface.RotateDegrees(-90);
+                    break;
                 case SKEncodedOrigin.RightTop:
-                    {
-                        var rotated = new SKBitmap(bitmap.Height, bitmap.Width);
-                        using var surface = new SKCanvas(rotated);
-                        surface.Translate(rotated.Width, 0);
-                        surface.RotateDegrees(90);
-                        surface.DrawBitmap(bitmap, 0, 0);
-
-                        return rotated;
-                    }
-
+                    surface.Translate(rotated.Width, 0);
+                    surface.RotateDegrees(90);
+                    break;
                 case SKEncodedOrigin.RightBottom:
-                {
-                    // TODO: Remove dual canvases, had trouble with flipping
-                    using var rotated = new SKBitmap(bitmap.Height, bitmap.Width);
-                    using (var surface = new SKCanvas(rotated))
-                    {
-                        surface.Translate(0, rotated.Height);
-                        surface.RotateDegrees(270);
-                        surface.DrawBitmap(bitmap, 0, 0);
-                    }
-
-                    var flippedBitmap = new SKBitmap(rotated.Width, rotated.Height);
-                    using (var flippedCanvas = new SKCanvas(flippedBitmap))
-                    {
-                        flippedCanvas.Translate(flippedBitmap.Width, 0);
-                        flippedCanvas.Scale(-1, 1);
-                        flippedCanvas.DrawBitmap(rotated, 0, 0);
-                    }
-
-                    return flippedBitmap;
-                }
-
+                    surface.Translate(rotated.Width, 0);
+                    surface.Scale(1, -1, midX, midY);
+                    surface.RotateDegrees(90);
+                    break;
                 case SKEncodedOrigin.LeftBottom:
-                    {
-                        var rotated = new SKBitmap(bitmap.Height, bitmap.Width);
-                        using var surface = new SKCanvas(rotated);
-                        surface.Translate(0, rotated.Height);
-                        surface.RotateDegrees(270);
-                        surface.DrawBitmap(bitmap, 0, 0);
-
-                        return rotated;
-                    }
-
-                default: return bitmap;
+                    surface.Translate(0, rotated.Height);
+                    surface.RotateDegrees(-90);
+                    break;
             }
+
+            surface.DrawBitmap(bitmap, 0, 0);
+            return rotated;
         }
 
         /// <inheritdoc/>