djsollen@google.com | 9714516 | 2012-05-31 19:55:08 +0000 | [diff] [blame^] | 1 | /* |
| 2 | * Copyright 2012 Google Inc. |
| 3 | * |
| 4 | * Use of this source code is governed by a BSD-style license that can be |
| 5 | * found in the LICENSE file. |
| 6 | */ |
| 7 | |
| 8 | #include "SkFontDescriptor.h" |
| 9 | #include "SkStream.h" |
| 10 | |
| 11 | enum { |
| 12 | kFontFamilyName = 0x01, |
| 13 | kFontStyle = 0x02, |
| 14 | kFontFileName = 0xFD, |
| 15 | kSentinel = 0xFE, |
| 16 | }; |
| 17 | |
| 18 | SkFontDescriptor::SkFontDescriptor() { |
| 19 | fFontStyle = SkTypeface::kNormal; |
| 20 | } |
| 21 | |
| 22 | static const char* read_string(SkStream* stream) { |
| 23 | SkString string; |
| 24 | const uint32_t length = stream->readPackedUInt(); |
| 25 | if (length > 0) { |
| 26 | string.resize(length); |
| 27 | stream->read(string.writable_str(), length); |
| 28 | } |
| 29 | return string.c_str(); |
| 30 | } |
| 31 | |
| 32 | static void write_string(SkWStream* stream, SkString string, uint32_t id) { |
| 33 | if (!string.isEmpty()) { |
| 34 | stream->writePackedUInt(id); |
| 35 | stream->writePackedUInt(string.size()); |
| 36 | stream->write(string.c_str(), string.size()); |
| 37 | } |
| 38 | } |
| 39 | |
| 40 | SkFontDescriptor::SkFontDescriptor(SkStream* stream) { |
| 41 | fFontStyle = SkTypeface::kNormal; |
| 42 | |
| 43 | uint32_t id = stream->readPackedUInt(); |
| 44 | while (id != kSentinel) { |
| 45 | switch (id) { |
| 46 | case kFontFamilyName: { |
| 47 | fFontFamilyName.set(read_string(stream)); |
| 48 | } break; |
| 49 | case kFontStyle: { |
| 50 | fFontStyle = (SkTypeface::Style)stream->readPackedUInt(); |
| 51 | } break; |
| 52 | case kFontFileName: { |
| 53 | fFontFileName.set(read_string(stream)); |
| 54 | } break; |
| 55 | default: |
| 56 | SkDEBUGFAIL("Unknown id used by a font descriptor"); |
| 57 | } |
| 58 | int prevId = id; |
| 59 | id = stream->readPackedUInt(); |
| 60 | } |
| 61 | } |
| 62 | |
| 63 | void SkFontDescriptor::serialize(SkWStream* stream) { |
| 64 | write_string(stream, fFontFamilyName, kFontFamilyName); |
| 65 | write_string(stream, fFontFileName, kFontFileName); |
| 66 | |
| 67 | if (fFontStyle != SkTypeface::kNormal) { |
| 68 | stream->writePackedUInt(kFontStyle); |
| 69 | stream->writePackedUInt((uint32_t)fFontStyle); |
| 70 | } |
| 71 | |
| 72 | stream->writePackedUInt(kSentinel); |
| 73 | } |