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 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 | 98 |
99 // Check that tables are non-overlapping. | 99 // Check that tables are non-overlapping. |
100 uint32_t last_offset = 12UL + 16UL * font->num_tables; | 100 uint32_t last_offset = 12UL + 16UL * font->num_tables; |
101 for (const auto& i : intervals) { | 101 for (const auto& i : intervals) { |
102 if (i.first < last_offset || i.first + i.second < i.first) { | 102 if (i.first < last_offset || i.first + i.second < i.first) { |
103 return FONT_COMPRESSION_FAILURE(); | 103 return FONT_COMPRESSION_FAILURE(); |
104 } | 104 } |
105 last_offset = i.first + i.second; | 105 last_offset = i.first + i.second; |
106 } | 106 } |
107 | 107 |
| 108 // Sanity check key tables |
| 109 const Font::Table* head_table = font->FindTable(kHeadTableTag); |
| 110 if (head_table != NULL && head_table->length < 52) { |
| 111 return FONT_COMPRESSION_FAILURE(); |
| 112 } |
| 113 |
108 return true; | 114 return true; |
109 } | 115 } |
110 | 116 |
111 bool ReadCollectionFont(Buffer* file, const uint8_t* data, size_t len, | 117 bool ReadCollectionFont(Buffer* file, const uint8_t* data, size_t len, |
112 Font* font, | 118 Font* font, |
113 std::map<uint32_t, Font::Table*>* all_tables) { | 119 std::map<uint32_t, Font::Table*>* all_tables) { |
114 if (!file->ReadU32(&font->flavor)) { | 120 if (!file->ReadU32(&font->flavor)) { |
115 return FONT_COMPRESSION_FAILURE(); | 121 return FONT_COMPRESSION_FAILURE(); |
116 } | 122 } |
117 if (!ReadTrueTypeFont(file, data, len, font)) { | 123 if (!ReadTrueTypeFont(file, data, len, font)) { |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
174 if (font->flavor == kTtcFontFlavor) { | 180 if (font->flavor == kTtcFontFlavor) { |
175 return FONT_COMPRESSION_FAILURE(); | 181 return FONT_COMPRESSION_FAILURE(); |
176 } | 182 } |
177 return ReadTrueTypeFont(&file, data, len, font); | 183 return ReadTrueTypeFont(&file, data, len, font); |
178 } | 184 } |
179 | 185 |
180 bool ReadFontCollection(const uint8_t* data, size_t len, | 186 bool ReadFontCollection(const uint8_t* data, size_t len, |
181 FontCollection* font_collection) { | 187 FontCollection* font_collection) { |
182 Buffer file(data, len); | 188 Buffer file(data, len); |
183 | 189 |
184 uint32_t flavor; | 190 if (!file.ReadU32(&font_collection->flavor)) { |
185 if (!file.ReadU32(&flavor)) { | |
186 return FONT_COMPRESSION_FAILURE(); | 191 return FONT_COMPRESSION_FAILURE(); |
187 } | 192 } |
188 | 193 |
189 if (flavor != kTtcFontFlavor) { | 194 if (font_collection->flavor != kTtcFontFlavor) { |
190 font_collection->fonts.resize(1); | 195 font_collection->fonts.resize(1); |
191 Font& font = font_collection->fonts[0]; | 196 Font& font = font_collection->fonts[0]; |
192 font.flavor = flavor; | 197 font.flavor = font_collection->flavor; |
193 return ReadTrueTypeFont(&file, data, len, &font); | 198 return ReadTrueTypeFont(&file, data, len, &font); |
194 } | 199 } |
195 return ReadTrueTypeCollection(&file, data, len, font_collection); | 200 return ReadTrueTypeCollection(&file, data, len, font_collection); |
196 } | 201 } |
197 | 202 |
198 size_t FontFileSize(const Font& font) { | 203 size_t FontFileSize(const Font& font) { |
199 size_t max_offset = 12ULL + 16ULL * font.num_tables; | 204 size_t max_offset = 12ULL + 16ULL * font.num_tables; |
200 for (const auto& i : font.tables) { | 205 for (const auto& i : font.tables) { |
201 const Font::Table& table = i.second; | 206 const Font::Table& table = i.second; |
202 size_t padding_size = (4 - (table.length & 3)) & 3; | 207 size_t padding_size = (4 - (table.length & 3)) & 3; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 } | 284 } |
280 | 285 |
281 return true; | 286 return true; |
282 } | 287 } |
283 | 288 |
284 bool WriteFontCollection(const FontCollection& font_collection, uint8_t* dst, | 289 bool WriteFontCollection(const FontCollection& font_collection, uint8_t* dst, |
285 size_t dst_size) { | 290 size_t dst_size) { |
286 size_t offset = 0; | 291 size_t offset = 0; |
287 | 292 |
288 // It's simpler if this just a simple sfnt | 293 // It's simpler if this just a simple sfnt |
289 if (font_collection.fonts.size() == 1) { | 294 if (font_collection.flavor != kTtcFontFlavor) { |
290 return WriteFont(font_collection.fonts[0], &offset, dst, dst_size); | 295 return WriteFont(font_collection.fonts[0], &offset, dst, dst_size); |
291 } | 296 } |
292 | 297 |
293 // Write TTC header | 298 // Write TTC header |
294 StoreU32(kTtcFontFlavor, &offset, dst); | 299 StoreU32(kTtcFontFlavor, &offset, dst); |
295 StoreU32(font_collection.header_version, &offset, dst); | 300 StoreU32(font_collection.header_version, &offset, dst); |
296 StoreU32(font_collection.fonts.size(), &offset, dst); | 301 StoreU32(font_collection.fonts.size(), &offset, dst); |
297 | 302 |
298 // Offset Table, zeroed for now | 303 // Offset Table, zeroed for now |
299 size_t offset_table = offset; // where to write offsets later | 304 size_t offset_table = offset; // where to write offsets later |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 std::map<uint32_t, Font::Table>::iterator it = | 393 std::map<uint32_t, Font::Table>::iterator it = |
389 font->tables.find(kDsigTableTag); | 394 font->tables.find(kDsigTableTag); |
390 if (it != font->tables.end()) { | 395 if (it != font->tables.end()) { |
391 font->tables.erase(it); | 396 font->tables.erase(it); |
392 font->num_tables = font->tables.size(); | 397 font->num_tables = font->tables.size(); |
393 } | 398 } |
394 return true; | 399 return true; |
395 } | 400 } |
396 | 401 |
397 } // namespace woff2 | 402 } // namespace woff2 |
OLD | NEW |