| Index: src/core/SkTextBlob.cpp
 | 
| diff --git a/src/core/SkTextBlob.cpp b/src/core/SkTextBlob.cpp
 | 
| index ded801aaa945312e9f329a823a636b9e887aa299..d928d7bc258b4df3c0ebd163e5358b5b1d35fa2e 100644
 | 
| --- a/src/core/SkTextBlob.cpp
 | 
| +++ b/src/core/SkTextBlob.cpp
 | 
| @@ -7,6 +7,9 @@
 | 
|  
 | 
|  #include "SkTextBlob.h"
 | 
|  
 | 
| +#include "SkReadBuffer.h"
 | 
| +#include "SkWriteBuffer.h"
 | 
| +
 | 
|  SkTextBlob::SkTextBlob(uint16_t *glyphs, SkScalar *pos, const SkTArray<Run> *runs,
 | 
|                         const SkRect& bounds)
 | 
|      : fGlyphBuffer(glyphs)
 | 
| @@ -26,6 +29,86 @@ uint32_t SkTextBlob::uniqueID() const {
 | 
|      return fUniqueID;
 | 
|  }
 | 
|  
 | 
| +unsigned SkTextBlob::ScalarsPerGlyph(GlyphPositioning pos) {
 | 
| +    // GlyphPositioning values are directly mapped to scalars-per-glyph.
 | 
| +    SkASSERT(pos <= 2);
 | 
| +    return pos;
 | 
| +}
 | 
| +
 | 
| +void SkTextBlob::flatten(SkWriteBuffer& buffer) const {
 | 
| +    int runCount = (NULL == fRuns.get()) ? 0 : fRuns->count();
 | 
| +
 | 
| +    buffer.write32(runCount);
 | 
| +    buffer.writeRect(fBounds);
 | 
| +
 | 
| +    SkPaint runPaint;
 | 
| +    RunIterator it(this);
 | 
| +    while (!it.done()) {
 | 
| +        SkASSERT(it.glyphCount() > 0);
 | 
| +
 | 
| +        buffer.write32(it.glyphCount());
 | 
| +        buffer.write32(it.positioning());
 | 
| +        buffer.writePoint(it.offset());
 | 
| +        // This should go away when switching to SkFont
 | 
| +        it.applyFontToPaint(&runPaint);
 | 
| +        buffer.writePaint(runPaint);
 | 
| +
 | 
| +        buffer.writeByteArray(it.glyphs(), it.glyphCount() * sizeof(uint16_t));
 | 
| +        buffer.writeByteArray(it.pos(),
 | 
| +            it.glyphCount() * sizeof(SkScalar) * ScalarsPerGlyph(it.positioning()));
 | 
| +
 | 
| +        it.next();
 | 
| +        SkDEBUGCODE(runCount--);
 | 
| +    }
 | 
| +    SkASSERT(0 == runCount);
 | 
| +}
 | 
| +
 | 
| +const SkTextBlob* SkTextBlob::CreateFromBuffer(SkReadBuffer& reader) {
 | 
| +    int runCount = reader.read32();
 | 
| +    if (runCount < 0) {
 | 
| +        return NULL;
 | 
| +    }
 | 
| +
 | 
| +    SkRect bounds;
 | 
| +    reader.readRect(&bounds);
 | 
| +
 | 
| +    SkTextBlobBuilder blobBuilder;
 | 
| +    for (int i = 0; i < runCount; ++i) {
 | 
| +        int glyphCount = reader.read32();
 | 
| +        GlyphPositioning pos = static_cast<GlyphPositioning>(reader.read32());
 | 
| +        if (glyphCount <= 0 || pos > kFull_Positioning) {
 | 
| +            return NULL;
 | 
| +        }
 | 
| +
 | 
| +        SkPoint offset;
 | 
| +        reader.readPoint(&offset);
 | 
| +        SkPaint font;
 | 
| +        reader.readPaint(&font);
 | 
| +
 | 
| +        const SkTextBlobBuilder::RunBuffer* buf = NULL;
 | 
| +        switch (pos) {
 | 
| +        case kDefault_Positioning:
 | 
| +            buf = &blobBuilder.allocRun(font, glyphCount, offset.x(), offset.y(), &bounds);
 | 
| +            break;
 | 
| +        case kHorizontal_Positioning:
 | 
| +            buf = &blobBuilder.allocRunPosH(font, glyphCount, offset.y(), &bounds);
 | 
| +            break;
 | 
| +        case kFull_Positioning:
 | 
| +            buf = &blobBuilder.allocRunPos(font, glyphCount, &bounds);
 | 
| +            break;
 | 
| +        default:
 | 
| +            return NULL;
 | 
| +        }
 | 
| +
 | 
| +        if (!reader.readByteArray(buf->glyphs, glyphCount * sizeof(uint16_t)) ||
 | 
| +            !reader.readByteArray(buf->pos, glyphCount * sizeof(SkScalar) * ScalarsPerGlyph(pos))) {
 | 
| +            return NULL;
 | 
| +        }
 | 
| +    }
 | 
| +
 | 
| +    return blobBuilder.build();
 | 
| +}
 | 
| +
 | 
|  SkTextBlob::RunIterator::RunIterator(const SkTextBlob* blob)
 | 
|      : fBlob(blob)
 | 
|      , fIndex(0) {
 | 
| @@ -161,9 +244,7 @@ void SkTextBlobBuilder::allocInternal(const SkPaint &font,
 | 
|  
 | 
|      this->ensureRun(font, positioning, offset);
 | 
|  
 | 
| -    // SkTextBlob::GlyphPositioning values are directly mapped to scalars-per-glyph.
 | 
| -    unsigned posScalarsPerGlyph = positioning;
 | 
| -    SkASSERT(posScalarsPerGlyph <= 2);
 | 
| +    unsigned posScalarsPerGlyph = SkTextBlob::ScalarsPerGlyph(positioning);
 | 
|  
 | 
|      fGlyphBuffer.append(count);
 | 
|      fPosBuffer.append(count * posScalarsPerGlyph);
 | 
| 
 |