OLD | NEW |
1 // Copyright 2013 Google Inc. All Rights Reserved. | 1 // Copyright 2013 Google Inc. All Rights Reserved. |
2 // | 2 // |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
6 // | 6 // |
7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
8 // | 8 // |
9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 for (const auto& i : tables) { | 42 for (const auto& i : tables) { |
43 const Font::Table& table = i.second; | 43 const Font::Table& table = i.second; |
44 // This is a transformed table, we will write it together with the | 44 // This is a transformed table, we will write it together with the |
45 // original version. | 45 // original version. |
46 if (table.tag & 0x80808080) { | 46 if (table.tag & 0x80808080) { |
47 continue; | 47 continue; |
48 } | 48 } |
49 output_order.push_back(table.tag); | 49 output_order.push_back(table.tag); |
50 } | 50 } |
51 | 51 |
52 // Alphabetize and do not put loca immediately after glyf | 52 // Alphabetize then put loca immediately after glyf |
53 // This violates woff2 spec but results in a font that passes OTS | |
54 std::sort(output_order.begin(), output_order.end()); | |
55 // TODO(user): change to match spec once browsers are on newer OTS | |
56 /* | |
57 auto glyf_loc = std::find(output_order.begin(), output_order.end(), | 53 auto glyf_loc = std::find(output_order.begin(), output_order.end(), |
58 kGlyfTableTag); | 54 kGlyfTableTag); |
59 auto loca_loc = std::find(output_order.begin(), output_order.end(), | 55 auto loca_loc = std::find(output_order.begin(), output_order.end(), |
60 kLocaTableTag); | 56 kLocaTableTag); |
61 if (glyf_loc != output_order.end() && loca_loc != output_order.end()) { | 57 if (glyf_loc != output_order.end() && loca_loc != output_order.end()) { |
62 output_order.erase(loca_loc); | 58 output_order.erase(loca_loc); |
63 output_order.insert(std::find(output_order.begin(), output_order.end(), | 59 output_order.insert(std::find(output_order.begin(), output_order.end(), |
64 kGlyfTableTag) + 1, kLocaTableTag); | 60 kGlyfTableTag) + 1, kLocaTableTag); |
65 }*/ | 61 } |
66 | 62 |
67 return output_order; | 63 return output_order; |
68 } | 64 } |
69 | 65 |
70 bool ReadTrueTypeFont(Buffer* file, const uint8_t* data, size_t len, | 66 bool ReadTrueTypeFont(Buffer* file, const uint8_t* data, size_t len, |
71 Font* font) { | 67 Font* font) { |
72 // We don't care about the search_range, entry_selector and range_shift | 68 // We don't care about the search_range, entry_selector and range_shift |
73 // fields, they will always be computed upon writing the font. | 69 // fields, they will always be computed upon writing the font. |
74 if (!file->ReadU16(&font->num_tables) || | 70 if (!file->ReadU16(&font->num_tables) || |
75 !file->Skip(6)) { | 71 !file->Skip(6)) { |
76 return FONT_COMPRESSION_FAILURE(); | 72 return FONT_COMPRESSION_FAILURE(); |
77 } | 73 } |
78 | 74 |
79 std::map<uint32_t, uint32_t> intervals; | 75 std::map<uint32_t, uint32_t> intervals; |
80 for (uint16_t i = 0; i < font->num_tables; ++i) { | 76 for (uint16_t i = 0; i < font->num_tables; ++i) { |
81 Font::Table table; | 77 Font::Table table; |
| 78 table.flag_byte = 0; |
82 table.reuse_of = NULL; | 79 table.reuse_of = NULL; |
83 if (!file->ReadU32(&table.tag) || | 80 if (!file->ReadU32(&table.tag) || |
84 !file->ReadU32(&table.checksum) || | 81 !file->ReadU32(&table.checksum) || |
85 !file->ReadU32(&table.offset) || | 82 !file->ReadU32(&table.offset) || |
86 !file->ReadU32(&table.length)) { | 83 !file->ReadU32(&table.length)) { |
87 return FONT_COMPRESSION_FAILURE(); | 84 return FONT_COMPRESSION_FAILURE(); |
88 } | 85 } |
89 if ((table.offset & 3) != 0 || | 86 if ((table.offset & 3) != 0 || |
90 table.length > len || | 87 table.length > len || |
91 len - table.length < table.offset) { | 88 len - table.length < table.offset) { |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 std::map<uint32_t, Font::Table>::iterator it = | 388 std::map<uint32_t, Font::Table>::iterator it = |
392 font->tables.find(kDsigTableTag); | 389 font->tables.find(kDsigTableTag); |
393 if (it != font->tables.end()) { | 390 if (it != font->tables.end()) { |
394 font->tables.erase(it); | 391 font->tables.erase(it); |
395 font->num_tables = font->tables.size(); | 392 font->num_tables = font->tables.size(); |
396 } | 393 } |
397 return true; | 394 return true; |
398 } | 395 } |
399 | 396 |
400 } // namespace woff2 | 397 } // namespace woff2 |
OLD | NEW |