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

Side by Side Diff: src/layout.cc

Issue 139563002: [OTS] Add support for the MATH table. (Closed) Base URL: https://chromium.googlesource.com/external/ots.git@master
Patch Set: Add <limits> header. Created 6 years, 11 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 | « src/layout.h ('k') | src/math.cc » ('j') | src/math.cc » ('J')
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 "layout.h" 5 #include "layout.h"
6 6
7 #include <limits> 7 #include <limits>
8 #include <vector> 8 #include <vector>
9 9
10 #include "gdef.h" 10 #include "gdef.h"
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 OTS_WARNING("bad class value: %u", class_value); 329 OTS_WARNING("bad class value: %u", class_value);
330 return OTS_FAILURE(); 330 return OTS_FAILURE();
331 } 331 }
332 last_end = end; 332 last_end = end;
333 } 333 }
334 334
335 return true; 335 return true;
336 } 336 }
337 337
338 bool ParseCoverageFormat1(const uint8_t *data, size_t length, 338 bool ParseCoverageFormat1(const uint8_t *data, size_t length,
339 const uint16_t num_glyphs) { 339 const uint16_t num_glyphs,
340 const uint16_t expected_num_glyphs) {
340 ots::Buffer subtable(data, length); 341 ots::Buffer subtable(data, length);
341 342
342 // Skip format field. 343 // Skip format field.
343 if (!subtable.Skip(2)) { 344 if (!subtable.Skip(2)) {
344 return OTS_FAILURE(); 345 return OTS_FAILURE();
345 } 346 }
346 347
347 uint16_t glyph_count = 0; 348 uint16_t glyph_count = 0;
348 if (!subtable.ReadU16(&glyph_count)) { 349 if (!subtable.ReadU16(&glyph_count)) {
349 return OTS_FAILURE(); 350 return OTS_FAILURE();
350 } 351 }
351 if (glyph_count > num_glyphs) { 352 if (glyph_count > num_glyphs) {
352 OTS_WARNING("bad glyph count: %u", glyph_count); 353 OTS_WARNING("bad glyph count: %u", glyph_count);
353 return OTS_FAILURE(); 354 return OTS_FAILURE();
354 } 355 }
355 for (unsigned i = 0; i < glyph_count; ++i) { 356 for (unsigned i = 0; i < glyph_count; ++i) {
356 uint16_t glyph = 0; 357 uint16_t glyph = 0;
357 if (!subtable.ReadU16(&glyph)) { 358 if (!subtable.ReadU16(&glyph)) {
358 return OTS_FAILURE(); 359 return OTS_FAILURE();
359 } 360 }
360 if (glyph > num_glyphs) { 361 if (glyph > num_glyphs) {
361 OTS_WARNING("bad glyph ID: %u", glyph); 362 OTS_WARNING("bad glyph ID: %u", glyph);
362 return OTS_FAILURE(); 363 return OTS_FAILURE();
363 } 364 }
364 } 365 }
365 366
367 if (expected_num_glyphs && expected_num_glyphs != glyph_count) {
368 OTS_WARNING("unexpected number of glyphs: %u", glyph_count);
369 return OTS_FAILURE();
370 }
371
366 return true; 372 return true;
367 } 373 }
368 374
369 bool ParseCoverageFormat2(const uint8_t *data, size_t length, 375 bool ParseCoverageFormat2(const uint8_t *data, size_t length,
370 const uint16_t num_glyphs) { 376 const uint16_t num_glyphs,
377 const uint16_t expected_num_glyphs) {
371 ots::Buffer subtable(data, length); 378 ots::Buffer subtable(data, length);
372 379
373 // Skip format field. 380 // Skip format field.
374 if (!subtable.Skip(2)) { 381 if (!subtable.Skip(2)) {
375 return OTS_FAILURE(); 382 return OTS_FAILURE();
376 } 383 }
377 384
378 uint16_t range_count = 0; 385 uint16_t range_count = 0;
379 if (!subtable.ReadU16(&range_count)) { 386 if (!subtable.ReadU16(&range_count)) {
380 return OTS_FAILURE(); 387 return OTS_FAILURE();
(...skipping 23 matching lines...) Expand all
404 return OTS_FAILURE(); 411 return OTS_FAILURE();
405 } 412 }
406 if (start_coverage_index != last_start_coverage_index) { 413 if (start_coverage_index != last_start_coverage_index) {
407 OTS_WARNING("bad start coverage index."); 414 OTS_WARNING("bad start coverage index.");
408 return OTS_FAILURE(); 415 return OTS_FAILURE();
409 } 416 }
410 last_end = end; 417 last_end = end;
411 last_start_coverage_index += end - start + 1; 418 last_start_coverage_index += end - start + 1;
412 } 419 }
413 420
421 if (expected_num_glyphs &&
422 expected_num_glyphs != last_start_coverage_index) {
423 OTS_WARNING("unexpected number of glyphs: %u", last_start_coverage_index);
424 return OTS_FAILURE();
425 }
426
414 return true; 427 return true;
415 } 428 }
416 429
417 // Parsers for Contextual subtables in GSUB/GPOS tables. 430 // Parsers for Contextual subtables in GSUB/GPOS tables.
418 431
419 bool ParseLookupRecord(ots::Buffer *subtable, const uint16_t num_glyphs, 432 bool ParseLookupRecord(ots::Buffer *subtable, const uint16_t num_glyphs,
420 const uint16_t num_lookups) { 433 const uint16_t num_lookups) {
421 uint16_t sequence_index = 0; 434 uint16_t sequence_index = 0;
422 uint16_t lookup_list_index = 0; 435 uint16_t lookup_list_index = 0;
423 if (!subtable->ReadU16(&sequence_index) || 436 if (!subtable->ReadU16(&sequence_index) ||
(...skipping 904 matching lines...) Expand 10 before | Expand all | Expand 10 after
1328 if (format == 1) { 1341 if (format == 1) {
1329 return ParseClassDefFormat1(data, length, num_glyphs, num_classes); 1342 return ParseClassDefFormat1(data, length, num_glyphs, num_classes);
1330 } else if (format == 2) { 1343 } else if (format == 2) {
1331 return ParseClassDefFormat2(data, length, num_glyphs, num_classes); 1344 return ParseClassDefFormat2(data, length, num_glyphs, num_classes);
1332 } 1345 }
1333 1346
1334 return OTS_FAILURE(); 1347 return OTS_FAILURE();
1335 } 1348 }
1336 1349
1337 bool ParseCoverageTable(const uint8_t *data, size_t length, 1350 bool ParseCoverageTable(const uint8_t *data, size_t length,
1338 const uint16_t num_glyphs) { 1351 const uint16_t num_glyphs,
1352 const uint16_t expected_num_glyphs) {
1339 Buffer subtable(data, length); 1353 Buffer subtable(data, length);
1340 1354
1341 uint16_t format = 0; 1355 uint16_t format = 0;
1342 if (!subtable.ReadU16(&format)) { 1356 if (!subtable.ReadU16(&format)) {
1343 return OTS_FAILURE(); 1357 return OTS_FAILURE();
1344 } 1358 }
1345 if (format == 1) { 1359 if (format == 1) {
1346 return ParseCoverageFormat1(data, length, num_glyphs); 1360 return ParseCoverageFormat1(data, length, num_glyphs, expected_num_glyphs);
1347 } else if (format == 2) { 1361 } else if (format == 2) {
1348 return ParseCoverageFormat2(data, length, num_glyphs); 1362 return ParseCoverageFormat2(data, length, num_glyphs, expected_num_glyphs);
1349 } 1363 }
1350 1364
1351 return OTS_FAILURE(); 1365 return OTS_FAILURE();
1352 } 1366 }
1353 1367
1354 bool ParseDeviceTable(const uint8_t *data, size_t length) { 1368 bool ParseDeviceTable(const uint8_t *data, size_t length) {
1355 Buffer subtable(data, length); 1369 Buffer subtable(data, length);
1356 1370
1357 uint16_t start_size = 0; 1371 uint16_t start_size = 0;
1358 uint16_t end_size = 0; 1372 uint16_t end_size = 0;
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1473 if (!parser->Parse(file, data + offset_extension, length - offset_extension, 1487 if (!parser->Parse(file, data + offset_extension, length - offset_extension,
1474 lookup_type)) { 1488 lookup_type)) {
1475 return OTS_FAILURE(); 1489 return OTS_FAILURE();
1476 } 1490 }
1477 1491
1478 return true; 1492 return true;
1479 } 1493 }
1480 1494
1481 } // namespace ots 1495 } // namespace ots
1482 1496
OLDNEW
« no previous file with comments | « src/layout.h ('k') | src/math.cc » ('j') | src/math.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698