| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 "ots.h" | 5 #include "ots.h" |
| 6 | 6 |
| 7 #include <sys/types.h> | 7 #include <sys/types.h> |
| 8 #include <zlib.h> | 8 #include <zlib.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 { "GPOS", ots::ots_gpos_parse, ots::ots_gpos_serialise, | 136 { "GPOS", ots::ots_gpos_parse, ots::ots_gpos_serialise, |
| 137 ots::ots_gpos_should_serialise, ots::ots_gpos_free, false }, | 137 ots::ots_gpos_should_serialise, ots::ots_gpos_free, false }, |
| 138 { "GSUB", ots::ots_gsub_parse, ots::ots_gsub_serialise, | 138 { "GSUB", ots::ots_gsub_parse, ots::ots_gsub_serialise, |
| 139 ots::ots_gsub_should_serialise, ots::ots_gsub_free, false }, | 139 ots::ots_gsub_should_serialise, ots::ots_gsub_free, false }, |
| 140 { "vhea", ots::ots_vhea_parse, ots::ots_vhea_serialise, | 140 { "vhea", ots::ots_vhea_parse, ots::ots_vhea_serialise, |
| 141 ots::ots_vhea_should_serialise, ots::ots_vhea_free, false }, | 141 ots::ots_vhea_should_serialise, ots::ots_vhea_free, false }, |
| 142 { "vmtx", ots::ots_vmtx_parse, ots::ots_vmtx_serialise, | 142 { "vmtx", ots::ots_vmtx_parse, ots::ots_vmtx_serialise, |
| 143 ots::ots_vmtx_should_serialise, ots::ots_vmtx_free, false }, | 143 ots::ots_vmtx_should_serialise, ots::ots_vmtx_free, false }, |
| 144 { "MATH", ots::ots_math_parse, ots::ots_math_serialise, | 144 { "MATH", ots::ots_math_parse, ots::ots_math_serialise, |
| 145 ots::ots_math_should_serialise, ots::ots_math_free, false }, | 145 ots::ots_math_should_serialise, ots::ots_math_free, false }, |
| 146 { "CBDT", ots::ots_cbdt_parse, ots::ots_cbdt_serialise, |
| 147 ots::ots_cbdt_should_serialise, ots::ots_cbdt_free, false }, |
| 148 { "CBLC", ots::ots_cblc_parse, ots::ots_cblc_serialise, |
| 149 ots::ots_cblc_should_serialise, ots::ots_cblc_free, false }, |
| 146 // TODO(bashi): Support mort, base, and jstf tables. | 150 // TODO(bashi): Support mort, base, and jstf tables. |
| 147 { 0, NULL, NULL, NULL, NULL, false }, | 151 { 0, NULL, NULL, NULL, NULL, false }, |
| 148 }; | 152 }; |
| 149 | 153 |
| 150 bool ProcessGeneric(ots::OpenTypeFile *header, | 154 bool ProcessGeneric(ots::OpenTypeFile *header, |
| 151 uint32_t signature, | 155 uint32_t signature, |
| 152 ots::OTSStream *output, | 156 ots::OTSStream *output, |
| 153 const uint8_t *data, size_t length, | 157 const uint8_t *data, size_t length, |
| 154 const std::vector<OpenTypeTable>& tables, | 158 const std::vector<OpenTypeTable>& tables, |
| 155 ots::Buffer& file); | 159 ots::Buffer& file); |
| (...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 550 if (header->cff) { | 554 if (header->cff) { |
| 551 // font with PostScript glyph | 555 // font with PostScript glyph |
| 552 if (header->version != Tag("OTTO")) { | 556 if (header->version != Tag("OTTO")) { |
| 553 return OTS_FAILURE(); | 557 return OTS_FAILURE(); |
| 554 } | 558 } |
| 555 if (header->glyf || header->loca) { | 559 if (header->glyf || header->loca) { |
| 556 // mixing outline formats is not recommended | 560 // mixing outline formats is not recommended |
| 557 return OTS_FAILURE(); | 561 return OTS_FAILURE(); |
| 558 } | 562 } |
| 559 } else { | 563 } else { |
| 560 if (!header->glyf || !header->loca) { | 564 if ((!header->glyf || !header->loca) && (!header->cbdt || !header->cblc)) { |
| 561 // No TrueType glyph found. | 565 // No TrueType glyph or color bitmap found. |
| 562 // Note: bitmap-only fonts are not supported. | |
| 563 return OTS_FAILURE(); | 566 return OTS_FAILURE(); |
| 564 } | 567 } |
| 565 } | 568 } |
| 566 | 569 |
| 567 unsigned num_output_tables = 0; | 570 unsigned num_output_tables = 0; |
| 568 for (unsigned i = 0; ; ++i) { | 571 for (unsigned i = 0; ; ++i) { |
| 569 if (table_parsers[i].parse == NULL) { | 572 if (table_parsers[i].parse == NULL) { |
| 570 break; | 573 break; |
| 571 } | 574 } |
| 572 | 575 |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 678 return OTS_FAILURE(); | 681 return OTS_FAILURE(); |
| 679 } | 682 } |
| 680 | 683 |
| 681 return true; | 684 return true; |
| 682 } | 685 } |
| 683 | 686 |
| 684 } // namespace | 687 } // namespace |
| 685 | 688 |
| 686 namespace ots { | 689 namespace ots { |
| 687 | 690 |
| 691 bool g_drop_color_bitmap_tables = true; |
| 692 |
| 688 bool IsValidVersionTag(uint32_t tag) { | 693 bool IsValidVersionTag(uint32_t tag) { |
| 689 return tag == Tag("\x00\x01\x00\x00") || | 694 return tag == Tag("\x00\x01\x00\x00") || |
| 690 // OpenType fonts with CFF data have 'OTTO' tag. | 695 // OpenType fonts with CFF data have 'OTTO' tag. |
| 691 tag == Tag("OTTO") || | 696 tag == Tag("OTTO") || |
| 692 // Older Mac fonts might have 'true' or 'typ1' tag. | 697 // Older Mac fonts might have 'true' or 'typ1' tag. |
| 693 tag == Tag("true") || | 698 tag == Tag("true") || |
| 694 tag == Tag("typ1"); | 699 tag == Tag("typ1"); |
| 695 } | 700 } |
| 696 | 701 |
| 697 void DisableDebugOutput() { | 702 void DisableDebugOutput() { |
| 698 g_debug_output = false; | 703 g_debug_output = false; |
| 699 } | 704 } |
| 700 | 705 |
| 701 void EnableWOFF2() { | 706 void EnableWOFF2() { |
| 702 g_enable_woff2 = true; | 707 g_enable_woff2 = true; |
| 703 } | 708 } |
| 704 | 709 |
| 710 void DoNotDropColorBitmapTables() { |
| 711 g_drop_color_bitmap_tables = false; |
| 712 } |
| 713 |
| 705 bool Process(OTSStream *output, const uint8_t *data, size_t length) { | 714 bool Process(OTSStream *output, const uint8_t *data, size_t length) { |
| 706 OpenTypeFile header; | 715 OpenTypeFile header; |
| 707 if (length < 4) { | 716 if (length < 4) { |
| 708 return OTS_FAILURE(); | 717 return OTS_FAILURE(); |
| 709 } | 718 } |
| 710 | 719 |
| 711 bool result; | 720 bool result; |
| 712 if (data[0] == 'w' && data[1] == 'O' && data[2] == 'F' && data[3] == 'F') { | 721 if (data[0] == 'w' && data[1] == 'O' && data[2] == 'F' && data[3] == 'F') { |
| 713 result = ProcessWOFF(&header, output, data, length); | 722 result = ProcessWOFF(&header, output, data, length); |
| 714 } else if (g_enable_woff2 && | 723 } else if (g_enable_woff2 && |
| (...skipping 27 matching lines...) Expand all Loading... |
| 742 va_start(va, format); | 751 va_start(va, format); |
| 743 std::vfprintf(stderr, format, va); | 752 std::vfprintf(stderr, format, va); |
| 744 va_end(va); | 753 va_end(va); |
| 745 std::fprintf(stderr, "\n"); | 754 std::fprintf(stderr, "\n"); |
| 746 std::fflush(stderr); | 755 std::fflush(stderr); |
| 747 } | 756 } |
| 748 } | 757 } |
| 749 #endif | 758 #endif |
| 750 | 759 |
| 751 } // namespace ots | 760 } // namespace ots |
| OLD | NEW |