浏览代码

Merge pull request #2861 from MediaBrowser/dev

Dev
Luke 8 年之前
父节点
当前提交
fd62146e46

+ 4 - 5
Emby.Drawing.ImageMagick/Emby.Drawing.ImageMagick.csproj

@@ -31,8 +31,7 @@
   </PropertyGroup>
   </PropertyGroup>
   <ItemGroup>
   <ItemGroup>
     <Reference Include="ImageMagickSharp, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
     <Reference Include="ImageMagickSharp, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
-      <HintPath>..\packages\ImageMagickSharp.1.0.0.18\lib\net45\ImageMagickSharp.dll</HintPath>
-      <Private>True</Private>
+      <HintPath>..\packages\ImageMagickSharp.1.0.0.19\lib\net45\ImageMagickSharp.dll</HintPath>
     </Reference>
     </Reference>
     <Reference Include="System" />
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Core" />
@@ -55,9 +54,6 @@
   <ItemGroup>
   <ItemGroup>
     <EmbeddedResource Include="fonts\robotoregular.ttf" />
     <EmbeddedResource Include="fonts\robotoregular.ttf" />
   </ItemGroup>
   </ItemGroup>
-  <ItemGroup>
-    <None Include="packages.config" />
-  </ItemGroup>
   <ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj">
     <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj">
       <Project>{9142eefa-7570-41e1-bfcc-468bb571af2f}</Project>
       <Project>{9142eefa-7570-41e1-bfcc-468bb571af2f}</Project>
@@ -72,6 +68,9 @@
       <Name>MediaBrowser.Model</Name>
       <Name>MediaBrowser.Model</Name>
     </ProjectReference>
     </ProjectReference>
   </ItemGroup>
   </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.
        Other similar extension points exist, see Microsoft.Common.targets.

+ 1 - 1
Emby.Drawing.ImageMagick/packages.config

@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
 <packages>
-  <package id="ImageMagickSharp" version="1.0.0.18" targetFramework="net452" />
+  <package id="ImageMagickSharp" version="1.0.0.19" targetFramework="net452" />
 </packages>
 </packages>

+ 126 - 55
Emby.Drawing.Skia/SkiaEncoder.cs

@@ -76,7 +76,7 @@ namespace Emby.Drawing.Skia
 
 
         private static bool IsTransparent(SKColor color)
         private static bool IsTransparent(SKColor color)
         {
         {
-            
+
             return (color.Red == 255 && color.Green == 255 && color.Blue == 255) || color.Alpha == 0;
             return (color.Red == 255 && color.Green == 255 && color.Blue == 255) || color.Alpha == 0;
         }
         }
 
 
@@ -267,7 +267,7 @@ namespace Emby.Drawing.Skia
                     {
                     {
                         using (bitmap)
                         using (bitmap)
                         {
                         {
-                            return RotateAndFlip(bitmap, origin);
+                            return OrientImage(bitmap, origin);
                         }
                         }
                     }
                     }
                 }
                 }
@@ -278,82 +278,153 @@ namespace Emby.Drawing.Skia
             return GetBitmap(path, cropWhitespace, false, out origin);
             return GetBitmap(path, cropWhitespace, false, out origin);
         }
         }
 
 
-        private SKBitmap RotateAndFlip(SKBitmap original, SKCodecOrigin origin)
+        private SKBitmap OrientImage(SKBitmap bitmap, SKCodecOrigin origin)
         {
         {
-            // these are the origins that represent a 90 degree turn in some fashion
-            var differentOrientations = new SKCodecOrigin[]
+            //var transformations = {
+            //    2: { rotate: 0, flip: true},
+            //    3: { rotate: 180, flip: false},
+            //    4: { rotate: 180, flip: true},
+            //    5: { rotate: 90, flip: true},
+            //    6: { rotate: 90, flip: false},
+            //    7: { rotate: 270, flip: true},
+            //    8: { rotate: 270, flip: false},
+            //}
+
+            switch (origin)
             {
             {
-                SKCodecOrigin.LeftBottom,
-                SKCodecOrigin.LeftTop,
-                SKCodecOrigin.RightBottom,
-                SKCodecOrigin.RightTop
-            };
 
 
-            // check if we need to turn the image
-            bool isDifferentOrientation = differentOrientations.Any(o => o == origin);
+                case SKCodecOrigin.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);
+                        }
 
 
-            // define new width/height
-            var width = isDifferentOrientation ? original.Height : original.Width;
-            var height = isDifferentOrientation ? original.Width : original.Height;
+                        return rotated;
+                    }
 
 
-            var bitmap = new SKBitmap(width, height, true);
+                case SKCodecOrigin.BottomRight:
+                    {
+                        var rotated = new SKBitmap(bitmap.Width, bitmap.Height);
+                        using (var surface = new SKCanvas(rotated))
+                        {
+                            float px = bitmap.Width;
+                            px /= 2;
 
 
-            // todo: the stuff in this switch statement should be rewritten to use pointers
-            switch (origin)
-            {
-                case SKCodecOrigin.LeftBottom:
+                            float py = bitmap.Height;
+                            py /= 2;
 
 
-                    for (var x = 0; x < original.Width; x++)
-                        for (var y = 0; y < original.Height; y++)
-                            bitmap.SetPixel(y, original.Width - 1 - x, original.GetPixel(x, y));
-                    break;
+                            surface.RotateDegrees(180, px, py);
+                            surface.DrawBitmap(bitmap, 0, 0);
+                        }
 
 
-                case SKCodecOrigin.RightTop:
+                        return rotated;
+                    }
 
 
-                    for (var x = 0; x < original.Width; x++)
-                        for (var y = 0; y < original.Height; y++)
-                            bitmap.SetPixel(original.Height - 1 - y, x, original.GetPixel(x, y));
-                    break;
+                case SKCodecOrigin.BottomLeft:
+                    {
+                        var rotated = new SKBitmap(bitmap.Width, bitmap.Height);
+                        using (var surface = new SKCanvas(rotated))
+                        {
+                            float px = bitmap.Width;
+                            px /= 2;
 
 
-                case SKCodecOrigin.RightBottom:
+                            float py = bitmap.Height;
+                            py /= 2;
 
 
-                    for (var x = 0; x < original.Width; x++)
-                        for (var y = 0; y < original.Height; y++)
-                            bitmap.SetPixel(original.Height - 1 - y, original.Width - 1 - x, original.GetPixel(x, y));
+                            surface.Translate(rotated.Width, 0);
+                            surface.Scale(-1, 1);
 
 
-                    break;
+                            surface.RotateDegrees(180, px, py);
+                            surface.DrawBitmap(bitmap, 0, 0);
+                        }
+
+                        return rotated;
+                    }
 
 
                 case SKCodecOrigin.LeftTop:
                 case SKCodecOrigin.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);
 
 
-                    for (var x = 0; x < original.Width; x++)
-                        for (var y = 0; y < original.Height; y++)
-                            bitmap.SetPixel(y, x, original.GetPixel(x, y));
-                    break;
+                                surface.RotateDegrees(90);
 
 
-                case SKCodecOrigin.BottomLeft:
+                                surface.DrawBitmap(bitmap, 0, 0);
 
 
-                    for (var x = 0; x < original.Width; x++)
-                        for (var y = 0; y < original.Height; y++)
-                            bitmap.SetPixel(x, original.Height - 1 - y, original.GetPixel(x, y));
-                    break;
+                            }
 
 
-                case SKCodecOrigin.BottomRight:
+                            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);
+                            }
 
 
-                    for (var x = 0; x < original.Width; x++)
-                        for (var y = 0; y < original.Height; y++)
-                            bitmap.SetPixel(original.Width - 1 - x, original.Height - 1 - y, original.GetPixel(x, y));
-                    break;
+                            return flippedBitmap;
+                        }
+                    }
 
 
-                case SKCodecOrigin.TopRight:
+                case SKCodecOrigin.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);
+                        }
 
 
-                    for (var x = 0; x < original.Width; x++)
-                        for (var y = 0; y < original.Height; y++)
-                            bitmap.SetPixel(original.Width - 1 - x, y, original.GetPixel(x, y));
-                    break;
+                        return rotated;
+                    }
 
 
-            }
+                case SKCodecOrigin.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);
+                            }
 
 
-            return bitmap;
+                            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;
+                        }
+                    }
+
+                case SKCodecOrigin.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;
+            }
         }
         }
 
 
         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)

+ 1 - 0
Emby.Server.Implementations/ApplicationHost.cs

@@ -1073,6 +1073,7 @@ namespace Emby.Server.Implementations
             builder.AppendLine(string.Format("Operating system: {0}", Environment.OSVersion));
             builder.AppendLine(string.Format("Operating system: {0}", Environment.OSVersion));
             builder.AppendLine(string.Format("64-Bit OS: {0}", Environment.Is64BitOperatingSystem));
             builder.AppendLine(string.Format("64-Bit OS: {0}", Environment.Is64BitOperatingSystem));
             builder.AppendLine(string.Format("64-Bit Process: {0}", Environment.Is64BitProcess));
             builder.AppendLine(string.Format("64-Bit Process: {0}", Environment.Is64BitProcess));
+            builder.AppendLine(string.Format("User Interactive: {0}", Environment.UserInteractive));
 
 
             Type type = Type.GetType("Mono.Runtime");
             Type type = Type.GetType("Mono.Runtime");
             if (type != null)
             if (type != null)

+ 25 - 18
MediaBrowser.ServerApplication/MainStartup.cs

@@ -196,30 +196,37 @@ namespace MediaBrowser.ServerApplication
 
 
         private static bool IsAlreadyRunningAsService(string applicationPath)
         private static bool IsAlreadyRunningAsService(string applicationPath)
         {
         {
-            var serviceName = BackgroundService.GetExistingServiceName();
+            try
+            {
+                var serviceName = BackgroundService.GetExistingServiceName();
 
 
-            WqlObjectQuery wqlObjectQuery = new WqlObjectQuery(string.Format("SELECT * FROM Win32_Service WHERE State = 'Running' AND Name = '{0}'", serviceName));
-            ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher(wqlObjectQuery);
-            ManagementObjectCollection managementObjectCollection = managementObjectSearcher.Get();
+                WqlObjectQuery wqlObjectQuery = new WqlObjectQuery(string.Format("SELECT * FROM Win32_Service WHERE State = 'Running' AND Name = '{0}'", serviceName));
+                ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher(wqlObjectQuery);
+                ManagementObjectCollection managementObjectCollection = managementObjectSearcher.Get();
 
 
-            foreach (ManagementObject managementObject in managementObjectCollection)
-            {
-                var obj = managementObject.GetPropertyValue("PathName");
-                if (obj == null)
+                foreach (ManagementObject managementObject in managementObjectCollection)
                 {
                 {
-                    continue;
-                }
-                var path = obj.ToString();
+                    var obj = managementObject.GetPropertyValue("PathName");
+                    if (obj == null)
+                    {
+                        continue;
+                    }
+                    var path = obj.ToString();
 
 
-                _logger.Info("Service path: {0}", path);
-                // Need to use indexOf instead of equality because the path will have the full service command line
-                if (path.IndexOf(applicationPath, StringComparison.OrdinalIgnoreCase) != -1)
-                {
-                    _logger.Info("The windows service is already running");
-                    MessageBox.Show("Emby Server is already running as a Windows Service. Only one instance is allowed at a time. To run as a tray icon, shut down the Windows Service.");
-                    return true;
+                    _logger.Info("Service path: {0}", path);
+                    // Need to use indexOf instead of equality because the path will have the full service command line
+                    if (path.IndexOf(applicationPath, StringComparison.OrdinalIgnoreCase) != -1)
+                    {
+                        _logger.Info("The windows service is already running");
+                        MessageBox.Show("Emby Server is already running as a Windows Service. Only one instance is allowed at a time. To run as a tray icon, shut down the Windows Service.");
+                        return true;
+                    }
                 }
                 }
             }
             }
+            catch (COMException)
+            {
+                // Catch errors thrown due to WMI not being initialized
+            }
 
 
             return false;
             return false;
         }
         }

+ 1 - 1
SharedVersion.cs

@@ -1,3 +1,3 @@
 using System.Reflection;
 using System.Reflection;
 
 
-[assembly: AssemblyVersion("3.2.30.4")]
+[assembly: AssemblyVersion("3.2.30.5")]