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

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

Issue 1487543005: Update OTS to revision 99a3b7f (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years 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.cc ('k') | third_party/ots/src/ots.h » ('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 "name.h" 5 #include "name.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cstring> 8 #include <cstring>
9 9
10 // name - Naming Table 10 // name - Naming Table
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 return OTS_FAILURE_MSG("Failed to read name count"); 72 return OTS_FAILURE_MSG("Failed to read name count");
73 } 73 }
74 74
75 uint16_t string_offset = 0; 75 uint16_t string_offset = 0;
76 if (!table.ReadU16(&string_offset) || string_offset > length) { 76 if (!table.ReadU16(&string_offset) || string_offset > length) {
77 return OTS_FAILURE_MSG("Failed to read strings offset"); 77 return OTS_FAILURE_MSG("Failed to read strings offset");
78 } 78 }
79 const char* string_base = reinterpret_cast<const char*>(data) + 79 const char* string_base = reinterpret_cast<const char*>(data) +
80 string_offset; 80 string_offset;
81 81
82 NameRecord prev_record;
83 bool sort_required = false; 82 bool sort_required = false;
84 83
85 // Read all the names, discarding any with invalid IDs, 84 // Read all the names, discarding any with invalid IDs,
86 // and any where the offset/length would be outside the table. 85 // and any where the offset/length would be outside the table.
87 // A stricter alternative would be to reject the font if there 86 // A stricter alternative would be to reject the font if there
88 // are invalid name records, but it's not clear that is necessary. 87 // are invalid name records, but it's not clear that is necessary.
89 for (unsigned i = 0; i < count; ++i) { 88 for (unsigned i = 0; i < count; ++i) {
90 NameRecord rec; 89 NameRecord rec;
91 uint16_t name_length, name_offset = 0; 90 uint16_t name_length, name_offset = 0;
92 if (!table.ReadU16(&rec.platform_id) || 91 if (!table.ReadU16(&rec.platform_id) ||
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 if (!CheckPsNameAscii(rec.text)) { 141 if (!CheckPsNameAscii(rec.text)) {
143 continue; 142 continue;
144 } 143 }
145 } else if (rec.platform_id == 0 || rec.platform_id == 3) { 144 } else if (rec.platform_id == 0 || rec.platform_id == 3) {
146 if (!CheckPsNameUtf16Be(rec.text)) { 145 if (!CheckPsNameUtf16Be(rec.text)) {
147 continue; 146 continue;
148 } 147 }
149 } 148 }
150 } 149 }
151 150
152 if ((i > 0) && !(prev_record < rec)) { 151 if (!name->names.empty() && !(name->names.back() < rec)) {
153 OTS_WARNING("name records are not sorted."); 152 OTS_WARNING("name records are not sorted.");
154 sort_required = true; 153 sort_required = true;
155 } 154 }
156 155
157 name->names.push_back(rec); 156 name->names.push_back(rec);
158 prev_record = rec;
159 } 157 }
160 158
161 if (format == 1) { 159 if (format == 1) {
162 // extended name table format with language tags 160 // extended name table format with language tags
163 uint16_t lang_tag_count; 161 uint16_t lang_tag_count;
164 if (!table.ReadU16(&lang_tag_count)) { 162 if (!table.ReadU16(&lang_tag_count)) {
165 return OTS_FAILURE_MSG("Failed to read language tag count"); 163 return OTS_FAILURE_MSG("Failed to read language tag count");
166 } 164 }
167 for (unsigned i = 0; i < lang_tag_count; ++i) { 165 for (unsigned i = 0; i < lang_tag_count; ++i) {
168 uint16_t tag_length = 0; 166 uint16_t tag_length = 0;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 "OTS derived font", 201 "OTS derived font",
204 "1.000", 202 "1.000",
205 "OTS-derived-font" 203 "OTS-derived-font"
206 }; 204 };
207 205
208 // scan the names to check whether the required "standard" ones are present; 206 // scan the names to check whether the required "standard" ones are present;
209 // if not, we'll add our fixed versions here 207 // if not, we'll add our fixed versions here
210 bool mac_name[kStdNameCount] = { 0 }; 208 bool mac_name[kStdNameCount] = { 0 };
211 bool win_name[kStdNameCount] = { 0 }; 209 bool win_name[kStdNameCount] = { 0 };
212 for (std::vector<NameRecord>::iterator name_iter = name->names.begin(); 210 for (std::vector<NameRecord>::iterator name_iter = name->names.begin();
213 name_iter != name->names.end(); name_iter++) { 211 name_iter != name->names.end(); ++name_iter) {
214 const uint16_t id = name_iter->name_id; 212 const uint16_t id = name_iter->name_id;
215 if (id >= kStdNameCount || kStdNames[id] == NULL) { 213 if (id >= kStdNameCount || kStdNames[id] == NULL) {
216 continue; 214 continue;
217 } 215 }
218 if (name_iter->platform_id == 1) { 216 if (name_iter->platform_id == 1) {
219 mac_name[id] = true; 217 mac_name[id] = true;
220 continue; 218 continue;
221 } 219 }
222 if (name_iter->platform_id == 3) { 220 if (name_iter->platform_id == 3) {
223 win_name[id] = true; 221 win_name[id] = true;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 return OTS_FAILURE_MSG("Bad string offset %ld", string_offset); 270 return OTS_FAILURE_MSG("Bad string offset %ld", string_offset);
273 } 271 }
274 if (!out->WriteU16(format) || 272 if (!out->WriteU16(format) ||
275 !out->WriteU16(name_count) || 273 !out->WriteU16(name_count) ||
276 !out->WriteU16(static_cast<uint16_t>(string_offset))) { 274 !out->WriteU16(static_cast<uint16_t>(string_offset))) {
277 return OTS_FAILURE_MSG("Failed to write name header"); 275 return OTS_FAILURE_MSG("Failed to write name header");
278 } 276 }
279 277
280 std::string string_data; 278 std::string string_data;
281 for (std::vector<NameRecord>::const_iterator name_iter = name->names.begin(); 279 for (std::vector<NameRecord>::const_iterator name_iter = name->names.begin();
282 name_iter != name->names.end(); name_iter++) { 280 name_iter != name->names.end(); ++name_iter) {
283 const NameRecord& rec = *name_iter; 281 const NameRecord& rec = *name_iter;
284 if (string_data.size() + rec.text.size() > 282 if (string_data.size() + rec.text.size() >
285 std::numeric_limits<uint16_t>::max() || 283 std::numeric_limits<uint16_t>::max() ||
286 !out->WriteU16(rec.platform_id) || 284 !out->WriteU16(rec.platform_id) ||
287 !out->WriteU16(rec.encoding_id) || 285 !out->WriteU16(rec.encoding_id) ||
288 !out->WriteU16(rec.language_id) || 286 !out->WriteU16(rec.language_id) ||
289 !out->WriteU16(rec.name_id) || 287 !out->WriteU16(rec.name_id) ||
290 !out->WriteU16(static_cast<uint16_t>(rec.text.size())) || 288 !out->WriteU16(static_cast<uint16_t>(rec.text.size())) ||
291 !out->WriteU16(static_cast<uint16_t>(string_data.size())) ) { 289 !out->WriteU16(static_cast<uint16_t>(string_data.size())) ) {
292 return OTS_FAILURE_MSG("Faile to write name entry"); 290 return OTS_FAILURE_MSG("Faile to write name entry");
293 } 291 }
294 string_data.append(rec.text); 292 string_data.append(rec.text);
295 } 293 }
296 294
297 if (format == 1) { 295 if (format == 1) {
298 if (!out->WriteU16(lang_tag_count)) { 296 if (!out->WriteU16(lang_tag_count)) {
299 return OTS_FAILURE_MSG("Faile to write language tag count"); 297 return OTS_FAILURE_MSG("Faile to write language tag count");
300 } 298 }
301 for (std::vector<std::string>::const_iterator tag_iter = 299 for (std::vector<std::string>::const_iterator tag_iter =
302 name->lang_tags.begin(); 300 name->lang_tags.begin();
303 tag_iter != name->lang_tags.end(); tag_iter++) { 301 tag_iter != name->lang_tags.end(); ++tag_iter) {
304 if (string_data.size() + tag_iter->size() > 302 if (string_data.size() + tag_iter->size() >
305 std::numeric_limits<uint16_t>::max() || 303 std::numeric_limits<uint16_t>::max() ||
306 !out->WriteU16(static_cast<uint16_t>(tag_iter->size())) || 304 !out->WriteU16(static_cast<uint16_t>(tag_iter->size())) ||
307 !out->WriteU16(static_cast<uint16_t>(string_data.size()))) { 305 !out->WriteU16(static_cast<uint16_t>(string_data.size()))) {
308 return OTS_FAILURE_MSG("Failed to write string"); 306 return OTS_FAILURE_MSG("Failed to write string");
309 } 307 }
310 string_data.append(*tag_iter); 308 string_data.append(*tag_iter);
311 } 309 }
312 } 310 }
313 311
314 if (!out->Write(string_data.data(), string_data.size())) { 312 if (!out->Write(string_data.data(), string_data.size())) {
315 return OTS_FAILURE_MSG("Faile to write string data"); 313 return OTS_FAILURE_MSG("Faile to write string data");
316 } 314 }
317 315
318 return true; 316 return true;
319 } 317 }
320 318
321 void ots_name_reuse(Font *font, Font *other) { 319 void ots_name_reuse(Font *font, Font *other) {
322 font->name = other->name; 320 font->name = other->name;
323 font->name_reused = true; 321 font->name_reused = true;
324 } 322 }
325 323
326 void ots_name_free(Font *font) { 324 void ots_name_free(Font *font) {
327 delete font->name; 325 delete font->name;
328 } 326 }
329 327
330 } // namespace 328 } // namespace
331 329
332 #undef TABLE_NAME 330 #undef TABLE_NAME
OLDNEW
« no previous file with comments | « third_party/ots/src/metrics.cc ('k') | third_party/ots/src/ots.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698