aboutsummaryrefslogtreecommitdiff
path: root/Jellyfin.Drawing.Skia/SkiaEncoder.cs
diff options
context:
space:
mode:
authorPatrick Barron <barronpm@gmail.com>2020-07-19 17:59:33 -0400
committerPatrick Barron <barronpm@gmail.com>2020-07-19 17:59:33 -0400
commitb51a10948a78932e1d96d44841e2608b08920e7a (patch)
tree111005260256a41b35e0a2caf7a56470c3e9edfb /Jellyfin.Drawing.Skia/SkiaEncoder.cs
parent2569793ff08a6331dacf1513bd74c6572e28fa50 (diff)
Rewrite OrientImage
Diffstat (limited to 'Jellyfin.Drawing.Skia/SkiaEncoder.cs')
-rw-r--r--Jellyfin.Drawing.Skia/SkiaEncoder.cs141
1 files changed, 39 insertions, 102 deletions
diff --git a/Jellyfin.Drawing.Skia/SkiaEncoder.cs b/Jellyfin.Drawing.Skia/SkiaEncoder.cs
index 999cad012..cabbcef8b 100644
--- a/Jellyfin.Drawing.Skia/SkiaEncoder.cs
+++ b/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/>