diff -r 000000000000 -r 6474c204b198 gfx/skia/trunk/src/core/SkFontDescriptor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/skia/trunk/src/core/SkFontDescriptor.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,79 @@ +/* + * 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 "SkFontDescriptor.h" +#include "SkStream.h" + +enum { + // these must match the sfnt 'name' enums + kFontFamilyName = 0x01, + kFullName = 0x04, + kPostscriptName = 0x06, + + // These count backwards from 0xFF, so as not to collide with the SFNT + // defines for names in its 'name' table. + kFontFileName = 0xFE, + kSentinel = 0xFF, +}; + +SkFontDescriptor::SkFontDescriptor(SkTypeface::Style style) { + fStyle = style; +} + +static void read_string(SkStream* stream, SkString* string) { + const uint32_t length = SkToU32(stream->readPackedUInt()); + if (length > 0) { + string->resize(length); + stream->read(string->writable_str(), length); + } +} + +static void write_string(SkWStream* stream, const SkString& string, + uint32_t id) { + if (!string.isEmpty()) { + stream->writePackedUInt(id); + stream->writePackedUInt(string.size()); + stream->write(string.c_str(), string.size()); + } +} + +SkFontDescriptor::SkFontDescriptor(SkStream* stream) { + fStyle = (SkTypeface::Style)stream->readPackedUInt(); + + for (;;) { + switch (stream->readPackedUInt()) { + case kFontFamilyName: + read_string(stream, &fFamilyName); + break; + case kFullName: + read_string(stream, &fFullName); + break; + case kPostscriptName: + read_string(stream, &fPostscriptName); + break; + case kFontFileName: + read_string(stream, &fFontFileName); + break; + case kSentinel: + return; + default: + SkDEBUGFAIL("Unknown id used by a font descriptor"); + return; + } + } +} + +void SkFontDescriptor::serialize(SkWStream* stream) { + stream->writePackedUInt(fStyle); + + write_string(stream, fFamilyName, kFontFamilyName); + write_string(stream, fFullName, kFullName); + write_string(stream, fPostscriptName, kPostscriptName); + write_string(stream, fFontFileName, kFontFileName); + + stream->writePackedUInt(kSentinel); +}