Update filter tool to write out paths to .cpp file

https://codereview.appspot.com/6843125/



git-svn-id: http://skia.googlecode.com/svn/trunk@6714 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tools/path_utils.cpp b/tools/path_utils.cpp
new file mode 100644
index 0000000..217554d
--- /dev/null
+++ b/tools/path_utils.cpp
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "path_utils.h"
+#include "SkPath.h"
+#include "SkStream.h"
+
+namespace sk_tools {
+    static int gCurPathID = 0;
+
+    void dump_path_prefix(SkFILEWStream* pathStream) {
+        if (NULL == pathStream) {
+            return;
+        }
+ 
+        pathStream->writeText("#include \"SkScalar.h\"\n");
+        pathStream->writeText("#include \"SkPoint.h\"\n");
+        pathStream->writeText("#include \"SkBitmap.h\"\n");
+        pathStream->writeText("#include \"SkDevice.h\"\n");
+        pathStream->writeText("#include \"SkString.h\"\n");
+        pathStream->writeText("#include \"SkImageEncoder.h\"\n");
+    }
+
+    void dump_path(SkFILEWStream* pathStream, const SkPath& path) {
+        if (NULL == pathStream) {
+            return;
+        }
+
+        static const int kMaxPts = 200;
+        static const int kMaxVerbs = 200;
+
+        int numPts = path.countPoints();
+        int numVerbs = path.countVerbs();
+
+        SkASSERT(numPts <= kMaxPts);
+        SkASSERT(numVerbs <= kMaxVerbs);
+
+        SkPoint pts[kMaxPts];
+        uint8_t verbs[kMaxVerbs];
+
+        path.getPoints(pts, kMaxPts);
+        path.getVerbs(verbs, kMaxVerbs);
+
+        const char* gStrs[] = {
+            "kMove_Verb",
+            "kLine_Verb",
+            "kQuad_Verb",
+            "kCubic_Verb",
+            "kClose_Verb",
+            "kDone_Verb"
+        };
+
+        pathStream->writeText("static const int numPts");
+        pathStream->writeDecAsText(gCurPathID);
+        pathStream->writeText(" = ");
+        pathStream->writeDecAsText(numPts);
+        pathStream->writeText(";\n");
+
+        pathStream->writeText("SkPoint pts");
+        pathStream->writeDecAsText(gCurPathID);
+        pathStream->writeText("[] = {\n");
+
+        for (int i = 0; i < numPts; ++i) {
+            SkString temp;
+
+            pathStream->writeText("      { ");
+            temp.appendScalar(pts[i].fX);
+            temp.append("f, ");
+            temp.appendScalar(pts[i].fY);
+            temp.append("f },\n");
+            pathStream->writeText(temp.c_str());
+        }
+        pathStream->writeText("};\n");
+
+        pathStream->writeText("static const int numVerbs");
+        pathStream->writeDecAsText(gCurPathID);
+        pathStream->writeText(" = ");
+        pathStream->writeDecAsText(numVerbs);
+        pathStream->writeText(";\n");
+            
+        pathStream->writeText("uint8_t verbs");
+        pathStream->writeDecAsText(gCurPathID);
+        pathStream->writeText("[] = {\n");
+
+        for (int i = 0; i < numVerbs; ++i) {
+            pathStream->writeText("\tSkPath::");
+            pathStream->writeText(gStrs[verbs[i]]);
+            pathStream->writeText(",\n");
+        }
+        pathStream->writeText("};\n");
+
+        gCurPathID++;
+    }
+
+    void dump_path_suffix(SkFILEWStream* pathStream) {
+        if (NULL == pathStream) {
+            return;
+        }
+
+        pathStream->writeText("int numPaths = ");
+        pathStream->writeDecAsText(gCurPathID);
+        pathStream->writeText(";\n");
+
+        pathStream->writeText("int sizes[] = {\n");
+        for (int i = 0; i < gCurPathID; ++i) {
+            pathStream->writeText("\t numPts");
+            pathStream->writeDecAsText(i);
+            pathStream->writeText(", numVerbs");
+            pathStream->writeDecAsText(i);
+            pathStream->writeText(",\n");
+        }
+        pathStream->writeText("};\n");
+
+        pathStream->writeText("const SkPoint* points[] = {\n");
+        for (int i = 0; i < gCurPathID; ++i) {
+            pathStream->writeText("\tpts");
+            pathStream->writeDecAsText(i);
+            pathStream->writeText(",\n");
+        }
+        pathStream->writeText("};\n");
+
+        pathStream->writeText("const uint8_t* verbs[] = {\n");
+        for (int i = 0; i < gCurPathID; ++i) {
+            pathStream->writeText("\t(const uint8_t*)verbs");
+            pathStream->writeDecAsText(i);
+            pathStream->writeText(",\n");
+        }
+        pathStream->writeText("};\n");
+    }
+}