Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / src / core / SkFontDescriptor.cpp
index 7679d92..7426894 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "SkFontDescriptor.h"
 #include "SkStream.h"
+#include <SkData.h>
 
 enum {
     // these must match the sfnt 'name' enums
@@ -16,16 +17,15 @@ enum {
 
     // These count backwards from 0xFF, so as not to collide with the SFNT
     // defines for names in its 'name' table.
+    kFontIndex      = 0xFD,
     kFontFileName   = 0xFE,
     kSentinel       = 0xFF,
 };
 
-SkFontDescriptor::SkFontDescriptor(SkTypeface::Style style) {
-    fStyle = style;
-}
+SkFontDescriptor::SkFontDescriptor(SkTypeface::Style style) : fFontIndex(0), fStyle(style) { }
 
 static void read_string(SkStream* stream, SkString* string) {
-    const uint32_t length = stream->readPackedUInt();
+    const uint32_t length = SkToU32(stream->readPackedUInt());
     if (length > 0) {
         string->resize(length);
         stream->read(string->writable_str(), length);
@@ -41,11 +41,20 @@ static void write_string(SkWStream* stream, const SkString& string,
     }
 }
 
-SkFontDescriptor::SkFontDescriptor(SkStream* stream) {
+static size_t read_uint(SkStream* stream) {
+    return stream->readPackedUInt();
+}
+
+static void write_uint(SkWStream* stream, size_t n, uint32_t id) {
+    stream->writePackedUInt(id);
+    stream->writePackedUInt(n);
+}
+
+SkFontDescriptor::SkFontDescriptor(SkStream* stream) : fFontIndex(0) {
     fStyle = (SkTypeface::Style)stream->readPackedUInt();
 
-    for (;;) {
-        switch (stream->readPackedUInt()) {
+    for (size_t id; (id = stream->readPackedUInt()) != kSentinel;) {
+        switch (id) {
             case kFontFamilyName:
                 read_string(stream, &fFamilyName);
                 break;
@@ -55,16 +64,25 @@ SkFontDescriptor::SkFontDescriptor(SkStream* stream) {
             case kPostscriptName:
                 read_string(stream, &fPostscriptName);
                 break;
+            case kFontIndex:
+                fFontIndex = read_uint(stream);
+                break;
             case kFontFileName:
                 read_string(stream, &fFontFileName);
                 break;
-            case kSentinel:
-                return;
             default:
                 SkDEBUGFAIL("Unknown id used by a font descriptor");
                 return;
         }
     }
+
+    size_t length = stream->readPackedUInt();
+    if (length > 0) {
+        SkAutoTUnref<SkData> data(SkData::NewUninitialized(length));
+        if (stream->read(data->writable_data(), length) == length) {
+            fFontData.reset(SkNEW_ARGS(SkMemoryStream, (data)));
+        }
+    }
 }
 
 void SkFontDescriptor::serialize(SkWStream* stream) {
@@ -74,6 +92,17 @@ void SkFontDescriptor::serialize(SkWStream* stream) {
     write_string(stream, fFullName, kFullName);
     write_string(stream, fPostscriptName, kPostscriptName);
     write_string(stream, fFontFileName, kFontFileName);
+    if (fFontIndex) {
+        write_uint(stream, fFontIndex, kFontIndex);
+    }
 
     stream->writePackedUInt(kSentinel);
+
+    if (fFontData) {
+        size_t length = fFontData->getLength();
+        stream->writePackedUInt(length);
+        stream->writeStream(fFontData, length);
+    } else {
+        stream->writePackedUInt(0);
+    }
 }