• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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     // these must match the sfnt 'name' enums
13     kFontFamilyName = 0x01,
14     kFullName       = 0x04,
15     kPostscriptName = 0x06,
16 
17     // These count backwards from 0xFF, so as not to collide with the SFNT
18     // defines for names in its 'name' table.
19     kFontFileName   = 0xFE,
20     kSentinel       = 0xFF,
21 };
22 
SkFontDescriptor(SkTypeface::Style style)23 SkFontDescriptor::SkFontDescriptor(SkTypeface::Style style) {
24     fStyle = style;
25 }
26 
read_string(SkStream * stream,SkString * string)27 static void read_string(SkStream* stream, SkString* string) {
28     const uint32_t length = SkToU32(stream->readPackedUInt());
29     if (length > 0) {
30         string->resize(length);
31         stream->read(string->writable_str(), length);
32     }
33 }
34 
write_string(SkWStream * stream,const SkString & string,uint32_t id)35 static void write_string(SkWStream* stream, const SkString& string,
36                          uint32_t id) {
37     if (!string.isEmpty()) {
38         stream->writePackedUInt(id);
39         stream->writePackedUInt(string.size());
40         stream->write(string.c_str(), string.size());
41     }
42 }
43 
SkFontDescriptor(SkStream * stream)44 SkFontDescriptor::SkFontDescriptor(SkStream* stream) {
45     fStyle = (SkTypeface::Style)stream->readPackedUInt();
46 
47     for (;;) {
48         switch (stream->readPackedUInt()) {
49             case kFontFamilyName:
50                 read_string(stream, &fFamilyName);
51                 break;
52             case kFullName:
53                 read_string(stream, &fFullName);
54                 break;
55             case kPostscriptName:
56                 read_string(stream, &fPostscriptName);
57                 break;
58             case kFontFileName:
59                 read_string(stream, &fFontFileName);
60                 break;
61             case kSentinel:
62                 return;
63             default:
64                 SkDEBUGFAIL("Unknown id used by a font descriptor");
65                 return;
66         }
67     }
68 }
69 
serialize(SkWStream * stream)70 void SkFontDescriptor::serialize(SkWStream* stream) {
71     stream->writePackedUInt(fStyle);
72 
73     write_string(stream, fFamilyName, kFontFamilyName);
74     write_string(stream, fFullName, kFullName);
75     write_string(stream, fPostscriptName, kPostscriptName);
76     write_string(stream, fFontFileName, kFontFileName);
77 
78     stream->writePackedUInt(kSentinel);
79 }
80