add typeface flattening



git-svn-id: http://skia.googlecode.com/svn/trunk@1245 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/pipe/SkGPipeRead.cpp b/src/pipe/SkGPipeRead.cpp
index f022277..43abf89 100644
--- a/src/pipe/SkGPipeRead.cpp
+++ b/src/pipe/SkGPipeRead.cpp
@@ -20,6 +20,8 @@
 #include "SkGPipe.h"
 #include "SkGPipePriv.h"
 #include "SkReader32.h"
+#include "SkStream.h"
+#include "SkTypeface.h"
 
 class SkGPipeState {
 public:
@@ -32,9 +34,22 @@
     //  Returns the specified paint from our list, or creates a new paint if
     //  index == count. If index > count, return NULL
     SkPaint* editPaint(uint32_t drawOp32);
-    
+
+    SkTypeface* findTypeface(int id) const {
+        SkASSERT(id <= fTypefaces.count());
+        return id ? fTypefaces[id - 1] : NULL;
+    }
+    void addTypeface(SkReader32* reader) {
+        size_t size = reader->readU32();
+        const void* data = reader->skip(SkAlign4(size));
+        SkMemoryStream stream(data, size, false);
+        // fTypefaces takes over ownership of the typeface reference
+        *fTypefaces.append() = SkTypeface::Deserialize(&stream);
+    }
+
 private:
     SkTDArray<SkPaint*> fPaints;
+    SkTDArray<SkTypeface*> fTypefaces;
 };
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -389,6 +404,7 @@
             case kTextSize_PaintOp: p->setTextSize(reader->readScalar()); break;
             case kTextScaleX_PaintOp: p->setTextScaleX(reader->readScalar()); break;
             case kTextSkewX_PaintOp: p->setTextSkewX(reader->readScalar()); break;
+            case kTypeface_PaintOp: p->setTypeface(state->findTypeface(data)); break;
                 
             // flag to reference a cached index instead of inflating?
             case kPathEffect_PaintOp: inflate_patheffect(reader, p); break;
@@ -403,6 +419,11 @@
     } while (!done);
 }
 
+static void defTypeface_rp(SkCanvas*, SkReader32* reader, uint32_t,
+                           SkGPipeState* state) {
+    state->addTypeface(reader);
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 
 static void skip_rp(SkCanvas*, SkReader32* reader, uint32_t op32, SkGPipeState*) {
@@ -446,6 +467,7 @@
     skew_rp,
     translate_rp,
     paintOp_rp,
+    defTypeface_rp,
     done_rp
 };
 
@@ -457,6 +479,7 @@
 }
 
 SkGPipeState::~SkGPipeState() {
+    fTypefaces.unrefAll();
     fPaints.deleteAll();
 }