Index: src/core/SkFontDescriptor.cpp |
diff --git a/src/core/SkFontDescriptor.cpp b/src/core/SkFontDescriptor.cpp |
index 4a6b5db837141b769e3130c5f76a6093d94e157e..cb149b98a9e5eeb0f90eadeff3fa6256d5a4f4bd 100644 |
--- a/src/core/SkFontDescriptor.cpp |
+++ b/src/core/SkFontDescriptor.cpp |
@@ -17,12 +17,13 @@ enum { |
// These count backwards from 0xFF, so as not to collide with the SFNT |
// defines for names in its 'name' table. |
+ kFontAxes = 0xFC, |
kFontIndex = 0xFD, |
kFontFileName = 0xFE, // Remove when MIN_PICTURE_VERSION > 41 |
kSentinel = 0xFF, |
}; |
-SkFontDescriptor::SkFontDescriptor(SkTypeface::Style style) : fFontIndex(0), fStyle(style) { } |
+SkFontDescriptor::SkFontDescriptor(SkTypeface::Style style) : fStyle(style) { } |
static void read_string(SkStream* stream, SkString* string) { |
const uint32_t length = SkToU32(stream->readPackedUInt()); |
@@ -40,8 +41,7 @@ static void skip_string(SkStream* stream) { |
} |
} |
-static void write_string(SkWStream* stream, const SkString& string, |
- uint32_t id) { |
+static void write_string(SkWStream* stream, const SkString& string, uint32_t id) { |
if (!string.isEmpty()) { |
stream->writePackedUInt(id); |
stream->writePackedUInt(string.size()); |
@@ -58,9 +58,12 @@ static void write_uint(SkWStream* stream, size_t n, uint32_t id) { |
stream->writePackedUInt(n); |
} |
-SkFontDescriptor::SkFontDescriptor(SkStream* stream) : fFontIndex(0) { |
+SkFontDescriptor::SkFontDescriptor(SkStream* stream) { |
fStyle = (SkTypeface::Style)stream->readPackedUInt(); |
+ SkAutoSTMalloc<4, SkFixed> axis; |
+ size_t axisCount = 0; |
+ size_t index = 0; |
for (size_t id; (id = stream->readPackedUInt()) != kSentinel;) { |
switch (id) { |
case kFontFamilyName: |
@@ -72,8 +75,15 @@ SkFontDescriptor::SkFontDescriptor(SkStream* stream) : fFontIndex(0) { |
case kPostscriptName: |
read_string(stream, &fPostscriptName); |
break; |
+ case kFontAxes: |
+ axisCount = read_uint(stream); |
+ axis.reset(axisCount); |
+ for (size_t i = 0; i < axisCount; ++i) { |
+ axis[i] = read_uint(stream); |
+ } |
+ break; |
case kFontIndex: |
- fFontIndex = read_uint(stream); |
+ index = read_uint(stream); |
break; |
case kFontFileName: // Remove when MIN_PICTURE_VERSION > 41 |
skip_string(stream); |
@@ -88,7 +98,8 @@ SkFontDescriptor::SkFontDescriptor(SkStream* stream) : fFontIndex(0) { |
if (length > 0) { |
SkAutoTUnref<SkData> data(SkData::NewUninitialized(length)); |
if (stream->read(data->writable_data(), length) == length) { |
- fFontData.reset(SkNEW_ARGS(SkMemoryStream, (data))); |
+ fFontData.reset(new SkFontData(SkNEW_ARGS(SkMemoryStream, (data)), index, |
+ axis, axisCount)); |
} |
} |
} |
@@ -99,16 +110,25 @@ void SkFontDescriptor::serialize(SkWStream* stream) { |
write_string(stream, fFamilyName, kFontFamilyName); |
write_string(stream, fFullName, kFullName); |
write_string(stream, fPostscriptName, kPostscriptName); |
- if (fFontIndex) { |
- write_uint(stream, fFontIndex, kFontIndex); |
+ if (fFontData.get()) { |
+ if (fFontData->getIndex()) { |
+ write_uint(stream, fFontData->getIndex(), kFontIndex); |
+ } |
+ if (fFontData->getAxisCount()) { |
+ write_uint(stream, fFontData->getAxisCount(), kFontAxes); |
+ for (int i = 0; i < fFontData->getAxisCount(); ++i) { |
+ stream->writePackedUInt(fFontData->getAxis()[i]); |
+ } |
+ } |
} |
stream->writePackedUInt(kSentinel); |
- if (fFontData) { |
- size_t length = fFontData->getLength(); |
+ if (fFontData.get() && fFontData->hasStream()) { |
+ SkAutoTDelete<SkStreamAsset> fontData(fFontData->detachStream()); |
+ size_t length = fontData->getLength(); |
stream->writePackedUInt(length); |
- stream->writeStream(fFontData, length); |
+ stream->writeStream(fontData, length); |
} else { |
stream->writePackedUInt(0); |
} |