Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(175)

Side by Side Diff: third_party/ots/src/metrics.cc

Issue 1252363005: Update OTS to revision a7a3b94 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/ots/src/metrics.h ('k') | third_party/ots/src/name.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "metrics.h" 5 #include "metrics.h"
6 6
7 #include "head.h" 7 #include "head.h"
8 #include "maxp.h" 8 #include "maxp.h"
9 9
10 // OpenType horizontal and vertical common header format 10 // OpenType horizontal and vertical common header format
11 // http://www.microsoft.com/typography/otspec/hhea.htm 11 // http://www.microsoft.com/typography/otspec/hhea.htm
12 // http://www.microsoft.com/typography/otspec/vhea.htm 12 // http://www.microsoft.com/typography/otspec/vhea.htm
13 13
14 #define TABLE_NAME "metrics" // XXX: use individual table names 14 #define TABLE_NAME "metrics" // XXX: use individual table names
15 15
16 namespace ots { 16 namespace ots {
17 17
18 bool ParseMetricsHeader(OpenTypeFile *file, Buffer *table, 18 bool ParseMetricsHeader(Font *font, Buffer *table,
19 OpenTypeMetricsHeader *header) { 19 OpenTypeMetricsHeader *header) {
20 if (!table->ReadS16(&header->ascent) || 20 if (!table->ReadS16(&header->ascent) ||
21 !table->ReadS16(&header->descent) || 21 !table->ReadS16(&header->descent) ||
22 !table->ReadS16(&header->linegap) || 22 !table->ReadS16(&header->linegap) ||
23 !table->ReadU16(&header->adv_width_max) || 23 !table->ReadU16(&header->adv_width_max) ||
24 !table->ReadS16(&header->min_sb1) || 24 !table->ReadS16(&header->min_sb1) ||
25 !table->ReadS16(&header->min_sb2) || 25 !table->ReadS16(&header->min_sb2) ||
26 !table->ReadS16(&header->max_extent) || 26 !table->ReadS16(&header->max_extent) ||
27 !table->ReadS16(&header->caret_slope_rise) || 27 !table->ReadS16(&header->caret_slope_rise) ||
28 !table->ReadS16(&header->caret_slope_run) || 28 !table->ReadS16(&header->caret_slope_run) ||
29 !table->ReadS16(&header->caret_offset)) { 29 !table->ReadS16(&header->caret_offset)) {
30 return OTS_FAILURE_MSG("Failed to read metrics header"); 30 return OTS_FAILURE_MSG("Failed to read metrics header");
31 } 31 }
32 32
33 if (header->ascent < 0) { 33 if (header->ascent < 0) {
34 OTS_WARNING("bad ascent: %d", header->ascent); 34 OTS_WARNING("bad ascent: %d", header->ascent);
35 header->ascent = 0; 35 header->ascent = 0;
36 } 36 }
37 if (header->linegap < 0) { 37 if (header->linegap < 0) {
38 OTS_WARNING("bad linegap: %d", header->linegap); 38 OTS_WARNING("bad linegap: %d", header->linegap);
39 header->linegap = 0; 39 header->linegap = 0;
40 } 40 }
41 41
42 if (!file->head) { 42 if (!font->head) {
43 return OTS_FAILURE_MSG("Missing head font table"); 43 return OTS_FAILURE_MSG("Missing head font table");
44 } 44 }
45 45
46 // if the font is non-slanted, caret_offset should be zero. 46 // if the font is non-slanted, caret_offset should be zero.
47 if (!(file->head->mac_style & 2) && 47 if (!(font->head->mac_style & 2) &&
48 (header->caret_offset != 0)) { 48 (header->caret_offset != 0)) {
49 OTS_WARNING("bad caret offset: %d", header->caret_offset); 49 OTS_WARNING("bad caret offset: %d", header->caret_offset);
50 header->caret_offset = 0; 50 header->caret_offset = 0;
51 } 51 }
52 52
53 // skip the reserved bytes 53 // skip the reserved bytes
54 if (!table->Skip(8)) { 54 if (!table->Skip(8)) {
55 return OTS_FAILURE_MSG("Failed to skip reserverd bytes"); 55 return OTS_FAILURE_MSG("Failed to skip reserverd bytes");
56 } 56 }
57 57
58 int16_t data_format; 58 int16_t data_format;
59 if (!table->ReadS16(&data_format)) { 59 if (!table->ReadS16(&data_format)) {
60 return OTS_FAILURE_MSG("Failed to read data format"); 60 return OTS_FAILURE_MSG("Failed to read data format");
61 } 61 }
62 if (data_format) { 62 if (data_format) {
63 return OTS_FAILURE_MSG("Bad data format %d", data_format); 63 return OTS_FAILURE_MSG("Bad data format %d", data_format);
64 } 64 }
65 65
66 if (!table->ReadU16(&header->num_metrics)) { 66 if (!table->ReadU16(&header->num_metrics)) {
67 return OTS_FAILURE_MSG("Failed to read number of metrics"); 67 return OTS_FAILURE_MSG("Failed to read number of metrics");
68 } 68 }
69 69
70 if (!file->maxp) { 70 if (!font->maxp) {
71 return OTS_FAILURE_MSG("Missing maxp font table"); 71 return OTS_FAILURE_MSG("Missing maxp font table");
72 } 72 }
73 73
74 if (header->num_metrics > file->maxp->num_glyphs) { 74 if (header->num_metrics > font->maxp->num_glyphs) {
75 return OTS_FAILURE_MSG("Bad number of metrics %d", header->num_metrics); 75 return OTS_FAILURE_MSG("Bad number of metrics %d", header->num_metrics);
76 } 76 }
77 77
78 return true; 78 return true;
79 } 79 }
80 80
81 bool SerialiseMetricsHeader(const ots::OpenTypeFile *file, 81 bool SerialiseMetricsHeader(const ots::Font *font,
82 OTSStream *out, 82 OTSStream *out,
83 const OpenTypeMetricsHeader *header) { 83 const OpenTypeMetricsHeader *header) {
84 if (!out->WriteU32(header->version) || 84 if (!out->WriteU32(header->version) ||
85 !out->WriteS16(header->ascent) || 85 !out->WriteS16(header->ascent) ||
86 !out->WriteS16(header->descent) || 86 !out->WriteS16(header->descent) ||
87 !out->WriteS16(header->linegap) || 87 !out->WriteS16(header->linegap) ||
88 !out->WriteU16(header->adv_width_max) || 88 !out->WriteU16(header->adv_width_max) ||
89 !out->WriteS16(header->min_sb1) || 89 !out->WriteS16(header->min_sb1) ||
90 !out->WriteS16(header->min_sb2) || 90 !out->WriteS16(header->min_sb2) ||
91 !out->WriteS16(header->max_extent) || 91 !out->WriteS16(header->max_extent) ||
92 !out->WriteS16(header->caret_slope_rise) || 92 !out->WriteS16(header->caret_slope_rise) ||
93 !out->WriteS16(header->caret_slope_run) || 93 !out->WriteS16(header->caret_slope_run) ||
94 !out->WriteS16(header->caret_offset) || 94 !out->WriteS16(header->caret_offset) ||
95 !out->WriteR64(0) || // reserved 95 !out->WriteR64(0) || // reserved
96 !out->WriteS16(0) || // metric data format 96 !out->WriteS16(0) || // metric data format
97 !out->WriteU16(header->num_metrics)) { 97 !out->WriteU16(header->num_metrics)) {
98 return OTS_FAILURE_MSG("Failed to write metrics"); 98 return OTS_FAILURE_MSG("Failed to write metrics");
99 } 99 }
100 100
101 return true; 101 return true;
102 } 102 }
103 103
104 bool ParseMetricsTable(const ots::OpenTypeFile *file, 104 bool ParseMetricsTable(const ots::Font *font,
105 Buffer *table, 105 Buffer *table,
106 const uint16_t num_glyphs, 106 const uint16_t num_glyphs,
107 const OpenTypeMetricsHeader *header, 107 const OpenTypeMetricsHeader *header,
108 OpenTypeMetricsTable *metrics) { 108 OpenTypeMetricsTable *metrics) {
109 // |num_metrics| is a uint16_t, so it's bounded < 65536. This limits that 109 // |num_metrics| is a uint16_t, so it's bounded < 65536. This limits that
110 // amount of memory that we'll allocate for this to a sane amount. 110 // amount of memory that we'll allocate for this to a sane amount.
111 const unsigned num_metrics = header->num_metrics; 111 const unsigned num_metrics = header->num_metrics;
112 112
113 if (num_metrics > num_glyphs) { 113 if (num_metrics > num_glyphs) {
114 return OTS_FAILURE_MSG("Bad number of metrics %d", num_metrics); 114 return OTS_FAILURE_MSG("Bad number of metrics %d", num_metrics);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 sb = header->min_sb1; 162 sb = header->min_sb1;
163 } 163 }
164 #endif 164 #endif
165 165
166 metrics->sbs.push_back(sb); 166 metrics->sbs.push_back(sb);
167 } 167 }
168 168
169 return true; 169 return true;
170 } 170 }
171 171
172 bool SerialiseMetricsTable(const ots::OpenTypeFile *file, 172 bool SerialiseMetricsTable(const ots::Font *font,
173 OTSStream *out, 173 OTSStream *out,
174 const OpenTypeMetricsTable *metrics) { 174 const OpenTypeMetricsTable *metrics) {
175 for (unsigned i = 0; i < metrics->entries.size(); ++i) { 175 for (unsigned i = 0; i < metrics->entries.size(); ++i) {
176 if (!out->WriteU16(metrics->entries[i].first) || 176 if (!out->WriteU16(metrics->entries[i].first) ||
177 !out->WriteS16(metrics->entries[i].second)) { 177 !out->WriteS16(metrics->entries[i].second)) {
178 return OTS_FAILURE_MSG("Failed to write metric %d", i); 178 return OTS_FAILURE_MSG("Failed to write metric %d", i);
179 } 179 }
180 } 180 }
181 181
182 for (unsigned i = 0; i < metrics->sbs.size(); ++i) { 182 for (unsigned i = 0; i < metrics->sbs.size(); ++i) {
183 if (!out->WriteS16(metrics->sbs[i])) { 183 if (!out->WriteS16(metrics->sbs[i])) {
184 return OTS_FAILURE_MSG("Failed to write side bearing %ld", i + metrics->en tries.size()); 184 return OTS_FAILURE_MSG("Failed to write side bearing %ld", i + metrics->en tries.size());
185 } 185 }
186 } 186 }
187 187
188 return true; 188 return true;
189 } 189 }
190 190
191 } // namespace ots 191 } // namespace ots
192 192
193 #undef TABLE_NAME 193 #undef TABLE_NAME
OLDNEW
« no previous file with comments | « third_party/ots/src/metrics.h ('k') | third_party/ots/src/name.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698