OLD | NEW |
1 // Copyright 2014 Google Inc. All Rights Reserved. | 1 // Copyright 2014 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 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 // then this function will also return false. | 265 // then this function will also return false. |
266 | 266 |
267 size_t total_transform_length = 0; | 267 size_t total_transform_length = 0; |
268 for (const auto& font : font_collection.fonts) { | 268 for (const auto& font : font_collection.fonts) { |
269 total_transform_length += ComputeTotalTransformLength(font); | 269 total_transform_length += ComputeTotalTransformLength(font); |
270 } | 270 } |
271 size_t compression_buffer_size = CompressedBufferSize(total_transform_length); | 271 size_t compression_buffer_size = CompressedBufferSize(total_transform_length); |
272 std::vector<uint8_t> compression_buf(compression_buffer_size); | 272 std::vector<uint8_t> compression_buf(compression_buffer_size); |
273 uint32_t total_compressed_length = compression_buffer_size; | 273 uint32_t total_compressed_length = compression_buffer_size; |
274 | 274 |
275 // Collect all transformed data into one place. | 275 // Collect all transformed data into one place in output order. |
276 std::vector<uint8_t> transform_buf(total_transform_length); | 276 std::vector<uint8_t> transform_buf(total_transform_length); |
277 size_t transform_offset = 0; | 277 size_t transform_offset = 0; |
278 for (const auto& font : font_collection.fonts) { | 278 for (const auto& font : font_collection.fonts) { |
279 for (const auto& i : font.tables) { | 279 for (const auto tag : font.OutputOrderedTags()) { |
280 const Font::Table* table = font.FindTable(i.second.tag ^ 0x80808080); | 280 const Font::Table& original = font.tables.at(tag); |
281 if (i.second.IsReused()) continue; | 281 if (original.IsReused()) continue; |
282 if (i.second.tag & 0x80808080) continue; | 282 if (tag & 0x80808080) continue; |
| 283 const Font::Table* table_to_store = font.FindTable(tag ^ 0x80808080); |
| 284 if (table_to_store == NULL) table_to_store = &original; |
283 | 285 |
284 if (table == NULL) table = &i.second; | 286 StoreBytes(table_to_store->data, table_to_store->length, |
285 StoreBytes(table->data, table->length, | |
286 &transform_offset, &transform_buf[0]); | 287 &transform_offset, &transform_buf[0]); |
287 } | 288 } |
288 } | 289 } |
| 290 |
289 // Compress all transformed data in one stream. | 291 // Compress all transformed data in one stream. |
290 if (!Woff2Compress(transform_buf.data(), total_transform_length, | 292 if (!Woff2Compress(transform_buf.data(), total_transform_length, |
291 &compression_buf[0], | 293 &compression_buf[0], |
292 &total_compressed_length, | 294 &total_compressed_length, |
293 params.brotli_quality)) { | 295 params.brotli_quality)) { |
294 #ifdef FONT_COMPRESSION_BIN | 296 #ifdef FONT_COMPRESSION_BIN |
295 fprintf(stderr, "Compression of combined table failed.\n"); | 297 fprintf(stderr, "Compression of combined table failed.\n"); |
296 #endif | 298 #endif |
297 return FONT_COMPRESSION_FAILURE(); | 299 return FONT_COMPRESSION_FAILURE(); |
298 } | 300 } |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
461 #ifdef FONT_COMPRESSION_BIN | 463 #ifdef FONT_COMPRESSION_BIN |
462 fprintf(stderr, "Mismatch between computed and actual length " | 464 fprintf(stderr, "Mismatch between computed and actual length " |
463 "(%zd vs %zd)\n", *result_length, offset); | 465 "(%zd vs %zd)\n", *result_length, offset); |
464 #endif | 466 #endif |
465 return FONT_COMPRESSION_FAILURE(); | 467 return FONT_COMPRESSION_FAILURE(); |
466 } | 468 } |
467 return true; | 469 return true; |
468 } | 470 } |
469 | 471 |
470 } // namespace woff2 | 472 } // namespace woff2 |
OLD | NEW |