Add xps device to skia.
http://codereview.appspot.com/5076041/


git-svn-id: http://skia.googlecode.com/svn/trunk@2437 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gm/gmmain.cpp b/gm/gmmain.cpp
index 65e76e2..254a624 100644
--- a/gm/gmmain.cpp
+++ b/gm/gmmain.cpp
@@ -1,12 +1,11 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "gm.h"
 
+#include "gm.h"
 #include "GrContext.h"
 #include "GrRenderTarget.h"
 
@@ -28,6 +27,10 @@
     #include "SkPDFDocument.h"
 #endif
 
+#ifdef SK_SUPPORT_XPS
+    #include "SkXPSDevice.h"
+#endif
+
 #ifdef SK_BUILD_FOR_MAC
     #include "SkCGUtils.h"
     #define CAN_IMAGE_PDF   1
@@ -195,9 +198,10 @@
     return true;
 }
 
-static bool write_pdf(const SkString& path, const SkDynamicMemoryWStream& pdf) {
+static bool write_document(const SkString& path,
+                           const SkDynamicMemoryWStream& document) {
     SkFILEWStream stream(path.c_str());
-    SkAutoDataUnref data(pdf.copyToData());
+    SkAutoDataUnref data(document.copyToData());
     return stream.writeData(data.get());
 }
 
@@ -205,6 +209,7 @@
   kRaster_Backend,
   kGPU_Backend,
   kPDF_Backend,
+  kXPS_Backend,
 };
 
 struct ConfigData {
@@ -278,21 +283,55 @@
 #endif
 }
 
+static void generate_xps(GM* gm, SkDynamicMemoryWStream& xps) {
+#ifdef SK_SUPPORT_XPS
+    SkISize size = gm->getISize();
+    
+    SkSize trimSize = SkSize::Make(SkIntToScalar(size.width()),
+                                   SkIntToScalar(size.height()));
+    static const double inchesPerMeter = 10000.0 / 254.0;
+    static const double upm = 72 * inchesPerMeter;
+    SkVector unitsPerMeter = SkPoint::Make(SkDoubleToScalar(upm),
+                                           SkDoubleToScalar(upm));
+    static const double ppm = 200 * inchesPerMeter;
+    SkVector pixelsPerMeter = SkPoint::Make(SkDoubleToScalar(ppm),
+                                            SkDoubleToScalar(ppm));
+
+    SkXPSDevice* dev = new SkXPSDevice();
+    SkAutoUnref aur(dev);
+
+    SkCanvas c(dev);
+    dev->beginPortfolio(&xps);
+    dev->beginSheet(unitsPerMeter, pixelsPerMeter, trimSize);
+    gm->draw(&c);
+    dev->endSheet();
+    dev->endPortfolio();
+
+#endif
+}
+
 static bool write_reference_image(const ConfigData& gRec,
                                   const char writePath [],
                                   const char renderModeDescriptor [],
                                   const SkString& name,
                                   SkBitmap& bitmap,
-                                  SkDynamicMemoryWStream* pdf) {
+                                  SkDynamicMemoryWStream* document) {
     SkString path;
     bool success = false;
-    if (gRec.fBackend != kPDF_Backend || CAN_IMAGE_PDF) {
+    if (gRec.fBackend == kRaster_Backend ||
+        gRec.fBackend == kGPU_Backend ||
+        (gRec.fBackend == kPDF_Backend && CAN_IMAGE_PDF)) {
+    
         path = make_filename(writePath, renderModeDescriptor, name, "png");
         success = write_bitmap(path, bitmap);
     }
     if (kPDF_Backend == gRec.fBackend) {
         path = make_filename(writePath, renderModeDescriptor, name, "pdf");
-        success = write_pdf(path, *pdf);
+        success = write_document(path, *document);
+    }
+    if (kXPS_Backend == gRec.fBackend) {
+        path = make_filename(writePath, renderModeDescriptor, name, "xps");
+        success = write_document(path, *document);
     }
     if (!success) {
         fprintf(stderr, "FAILED to write %s\n", path.c_str());
@@ -355,7 +394,10 @@
     if (writePath) {
         write_reference_image(gRec, writePath, renderModeDescriptor,
                               name, bitmap, pdf);
-    } else if (readPath && (gRec.fBackend != kPDF_Backend || CAN_IMAGE_PDF)) {
+    } else if (readPath && (
+                   gRec.fBackend == kRaster_Backend ||
+                   gRec.fBackend == kGPU_Backend ||
+                   (gRec.fBackend == kPDF_Backend && CAN_IMAGE_PDF))) {
         return compare_to_reference_image(readPath, name, bitmap,
                                    diffPath, renderModeDescriptor);
     } else if (comparisonBitmap) {
@@ -409,7 +451,7 @@
                          GrContext* context,
                          GrRenderTarget* rt,
                          SkBitmap* bitmap) {
-    SkDynamicMemoryWStream pdf;
+    SkDynamicMemoryWStream document;
 
     if (gRec.fBackend == kRaster_Backend ||
         gRec.fBackend == kGPU_Backend) {
@@ -419,15 +461,17 @@
             return true;
         }
     } else if (gRec.fBackend == kPDF_Backend) {
-        generate_pdf(gm, pdf);
+        generate_pdf(gm, document);
 #if CAN_IMAGE_PDF
         SkAutoDataUnref data(pdf.copyToData());
         SkMemoryStream stream(data.data(), data.size());
         SkPDFDocumentToBitmap(&stream, bitmap);
 #endif
+    } else if (gRec.fBackend == kXPS_Backend) {
+        generate_xps(gm, document);
     }
     return handle_test_results(gm, gRec, writePath, readPath, diffPath,
-                        "", *bitmap, &pdf, NULL);
+                               "", *bitmap, &document, NULL);
 }
 
 static bool test_picture_playback(GM* gm,
@@ -490,6 +534,9 @@
 #ifdef SK_SUPPORT_PDF
     { SkBitmap::kARGB_8888_Config, kPDF_Backend,    "pdf" },
 #endif
+#ifdef SK_SUPPORT_XPS
+    { SkBitmap::kARGB_8888_Config, kXPS_Backend,    "xps" },
+#endif
 };
 
 namespace skiagm {