blob: f5dadd3d4f91e6ca5d9b22f619d5137ee1d795f6 [file] [log] [blame]
djsollen@google.com97145162012-05-31 19:55:08 +00001/*
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
11enum {
12 kFontFamilyName = 0x01,
13 kFontStyle = 0x02,
14 kFontFileName = 0xFD,
15 kSentinel = 0xFE,
16};
17
18SkFontDescriptor::SkFontDescriptor() {
19 fFontStyle = SkTypeface::kNormal;
20}
21
22static 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
32static 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
40SkFontDescriptor::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
63void 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}