experimental: xps_to_png program (windows only)
authorHal Canary <halcanary@google.com>
Thu, 13 Oct 2016 19:30:11 +0000 (15:30 -0400)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Fri, 14 Oct 2016 13:27:55 +0000 (13:27 +0000)
BUG=skia:409
NOTRY=true
Change-Id: Ib0df603535de71b0a324808c17e47691435df666
Reviewed-on: https://skia-review.googlesource.com/3342
Reviewed-by: Hal Canary <halcanary@google.com>
Commit-Queue: Hal Canary <halcanary@google.com>

experimental/xps_to_png/compile_xps_to_png.bat [new file with mode: 0644]
experimental/xps_to_png/xps_to_png.cs [new file with mode: 0644]

diff --git a/experimental/xps_to_png/compile_xps_to_png.bat b/experimental/xps_to_png/compile_xps_to_png.bat
new file mode 100644 (file)
index 0000000..4c34293
--- /dev/null
@@ -0,0 +1,14 @@
+@rem Copyright 2016 Google Inc.\r
+@rem\r
+@rem Use of this source code is governed by a BSD-style license that can be\r
+@rem found in the LICENSE file.\r
+\r
+"C:\PROGRA~2\MSBUILD\14.0\BIN\AMD64\CSC.EXE" ^\r
+/lib:"\PROGRA~2\REFERE~1\MICROS~1\FRAMEW~1\NETFRA~1\V4.5.2" ^\r
+/reference:"ReachFramework.dll" ^\r
+/reference:"WindowsBase.dll" ^\r
+/reference:"PresentationCore.dll" ^\r
+/reference:"PresentationFramework.dll" ^\r
+"%~dp0%xps_to_png.cs"\r
+\r
+\r
diff --git a/experimental/xps_to_png/xps_to_png.cs b/experimental/xps_to_png/xps_to_png.cs
new file mode 100644 (file)
index 0000000..951d4d7
--- /dev/null
@@ -0,0 +1,77 @@
+/*\r
+ * Copyright 2016 Google Inc.\r
+ *\r
+ * Use of this source code is governed by a BSD-style license that can be\r
+ * found in the LICENSE file.\r
+ */\r
+\r
+/*\r
+Compile with:\r
+\r
+    "...../csc" \\r
+        /lib:"....." \\r
+        /reference:"ReachFramework.dll" \\r
+        /reference:"WindowsBase.dll" \\r
+        /reference:"PresentationCore.dll" \\r
+        /reference:"PresentationFramework.dll" \\r
+        xps_to_png.cs\r
+\r
+*/\r
+// logic inspired by this example: https://goo.gl/nCxrjQ\r
+class Program {\r
+    static void convert(string path, string out_path) {\r
+        System.Windows.Xps.Packaging.XpsDocument xpsDoc =\r
+            new System.Windows.Xps.Packaging.XpsDocument(path, System.IO.FileAccess.Read);\r
+        if (xpsDoc == null) {\r
+            throw new System.Exception("XpsDocumentfailed");\r
+        }\r
+        System.Windows.Documents.FixedDocumentSequence docSeq = xpsDoc.GetFixedDocumentSequence();\r
+        if (docSeq == null) {\r
+            throw new System.Exception("GetFixedDocumentSequence failed");\r
+        }\r
+        System.Windows.Documents.DocumentReferenceCollection drc = docSeq.References;\r
+        int index = 0;\r
+        foreach (System.Windows.Documents.DocumentReference dr in drc) {\r
+            System.Windows.Documents.FixedDocument dp = dr.GetDocument(false);\r
+            foreach (System.Windows.Documents.PageContent pc in dp.Pages) {\r
+                System.Windows.Documents.FixedPage fixedPage = pc.GetPageRoot(false);\r
+                double width = fixedPage.Width;\r
+                double height = fixedPage.Height;\r
+                System.Windows.Size sz = new System.Windows.Size(width, height);\r
+                fixedPage.Measure(sz);\r
+                fixedPage.Arrange(new System.Windows.Rect(new System.Windows.Point(), sz));\r
+                fixedPage.UpdateLayout();\r
+                System.Windows.Media.Imaging.BitmapImage bitmap = new System.Windows.Media.Imaging.BitmapImage();\r
+                System.Windows.Media.Imaging.RenderTargetBitmap renderTarget =\r
+                    new System.Windows.Media.Imaging.RenderTargetBitmap((int)width, (int)height, 96, 96,\r
+                                                                        System.Windows.Media.PixelFormats.Default);\r
+                renderTarget.Render(fixedPage);\r
+                System.Windows.Media.Imaging.BitmapEncoder encoder = new System.Windows.Media.Imaging.PngBitmapEncoder();\r
+                encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(renderTarget));\r
+                System.IO.FileStream pageOutStream = new System.IO.FileStream(\r
+                    string.Format("{0}_{1}.png", out_path, index),\r
+                    System.IO.FileMode.Create, System.IO.FileAccess.Write);\r
+                encoder.Save(pageOutStream);\r
+                pageOutStream.Close();\r
+                ++index;\r
+            }\r
+        }\r
+    }\r
+        // Executes convert, catching thrown exceptions, and printing them to stdout, and exiting immediately\r
+    static void try_convert(string path, string out_path) {\r
+        try {\r
+            convert(path, out_path);\r
+        } catch (System.Exception e) {\r
+            System.Console.WriteLine(e);\r
+            System.Environment.Exit(1);\r
+        }\r
+    }\r
+        // For each command line argument, convert xps to sequence of pngs\r
+    static void Main(string[] args) {\r
+        foreach (string arg in args) {\r
+            System.Threading.Thread t = new System.Threading.Thread(() => try_convert(arg, arg));\r
+            t.SetApartmentState(System.Threading.ApartmentState.STA);\r
+            t.Start();\r
+        }\r
+    }\r
+}\r