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

Side by Side Diff: src/ots.cc

Issue 13918002: [OTS] Integrate WOFF 2.0 algorithm into OTS (Closed) Base URL: http://ots.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « ots-common.gypi ('k') | src/woff2.h » ('j') | src/woff2.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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>
11 #include <cstdlib> 11 #include <cstdlib>
12 #include <cstring> 12 #include <cstring>
13 #include <limits> 13 #include <limits>
14 #include <map> 14 #include <map>
15 #include <vector> 15 #include <vector>
16 16
17 #include "woff2.h"
18
17 // The OpenType Font File 19 // The OpenType Font File
18 // http://www.microsoft.com/typography/otspec/cmap.htm 20 // http://www.microsoft.com/typography/otspec/cmap.htm
19 21
20 namespace { 22 namespace {
21 23
22 bool g_debug_output = true; 24 bool g_debug_output = true;
25 bool g_enable_woff2 = false;
23 26
24 struct OpenTypeTable { 27 struct OpenTypeTable {
25 uint32_t tag; 28 uint32_t tag;
26 uint32_t chksum; 29 uint32_t chksum;
27 uint32_t offset; 30 uint32_t offset;
28 uint32_t length; 31 uint32_t length;
29 uint32_t uncompressed_length; 32 uint32_t uncompressed_length;
30 }; 33 };
31 34
32 // Round a value up to the nearest multiple of 4. Don't round the value in the 35 // Round a value up to the nearest multiple of 4. Don't round the value in the
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 return OTS_FAILURE(); 398 return OTS_FAILURE();
396 } 399 }
397 } 400 }
398 if (block_end != Round4(length)) { 401 if (block_end != Round4(length)) {
399 return OTS_FAILURE(); 402 return OTS_FAILURE();
400 } 403 }
401 404
402 return ProcessGeneric(header, woff_tag, output, data, length, tables, file); 405 return ProcessGeneric(header, woff_tag, output, data, length, tables, file);
403 } 406 }
404 407
408 bool ProcessWOFF2(ots::OpenTypeFile *header,
409 ots::OTSStream *output, const uint8_t *data, size_t length) {
410 size_t decompressed_size = ots::ComputeWOFF2FinalSize(data, length);
411 if (decompressed_size == 0) {
412 return OTS_FAILURE();
413 }
414
415 std::vector<uint8_t> decompressed_buffer(decompressed_size);
Yusuke Sato 2013/04/17 18:38:46 * Do we have to zero-fill the buffer? * Please def
Kunihiko Sakamoto 2013/04/23 06:36:26 Done.
Yusuke Sato 2013/05/07 06:11:27 std::vector<uint8_t> decompressed_buffer(decompres
Kunihiko Sakamoto 2013/05/07 10:17:23 Oh, got it. We should zero clear this buffer, beca
416 if (!ots::ConvertWOFF2ToTTF(&decompressed_buffer[0], decompressed_size,
417 data, length)) {
418 return OTS_FAILURE();
419 }
420 return ProcessTTF(header, output, &decompressed_buffer[0], decompressed_size);
421 }
422
405 bool ProcessGeneric(ots::OpenTypeFile *header, uint32_t signature, 423 bool ProcessGeneric(ots::OpenTypeFile *header, uint32_t signature,
406 ots::OTSStream *output, 424 ots::OTSStream *output,
407 const uint8_t *data, size_t length, 425 const uint8_t *data, size_t length,
408 const std::vector<OpenTypeTable>& tables, 426 const std::vector<OpenTypeTable>& tables,
409 ots::Buffer& file) { 427 ots::Buffer& file) {
410 const size_t data_offset = file.offset(); 428 const size_t data_offset = file.offset();
411 429
412 uint32_t uncompressed_sum = 0; 430 uint32_t uncompressed_sum = 0;
413 431
414 for (unsigned i = 0; i < header->num_tables; ++i) { 432 for (unsigned i = 0; i < header->num_tables; ++i) {
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
676 } 694 }
677 695
678 } // namespace 696 } // namespace
679 697
680 namespace ots { 698 namespace ots {
681 699
682 void DisableDebugOutput() { 700 void DisableDebugOutput() {
683 g_debug_output = false; 701 g_debug_output = false;
684 } 702 }
685 703
704 void EnableWOFF2() {
705 g_enable_woff2 = true;
706 }
707
686 bool Process(OTSStream *output, const uint8_t *data, size_t length) { 708 bool Process(OTSStream *output, const uint8_t *data, size_t length) {
687 OpenTypeFile header; 709 OpenTypeFile header;
688 if (length < 4) { 710 if (length < 4) {
689 return OTS_FAILURE(); 711 return OTS_FAILURE();
690 } 712 }
691 713
692 bool result; 714 bool result;
693 if (data[0] == 'w' && data[1] == 'O' && data[2] == 'F' && data[3] == 'F') { 715 if (data[0] == 'w' && data[1] == 'O' && data[2] == 'F' && data[3] == 'F') {
694 result = ProcessWOFF(&header, output, data, length); 716 result = ProcessWOFF(&header, output, data, length);
717 } else if (g_enable_woff2 &&
718 data[0] == 'w' && data[1] == 'O' && data[2] == 'F' &&
719 data[3] == '2') {
720 result = ProcessWOFF2(&header, output, data, length);
695 } else { 721 } else {
696 result = ProcessTTF(&header, output, data, length); 722 result = ProcessTTF(&header, output, data, length);
697 } 723 }
698 724
699 for (unsigned i = 0; ; ++i) { 725 for (unsigned i = 0; ; ++i) {
700 if (table_parsers[i].parse == NULL) break; 726 if (table_parsers[i].parse == NULL) break;
701 table_parsers[i].free(&header); 727 table_parsers[i].free(&header);
702 } 728 }
703 return result; 729 return result;
704 } 730 }
(...skipping 14 matching lines...) Expand all
719 va_start(va, format); 745 va_start(va, format);
720 std::vfprintf(stderr, format, va); 746 std::vfprintf(stderr, format, va);
721 va_end(va); 747 va_end(va);
722 std::fprintf(stderr, "\n"); 748 std::fprintf(stderr, "\n");
723 std::fflush(stderr); 749 std::fflush(stderr);
724 } 750 }
725 } 751 }
726 #endif 752 #endif
727 753
728 } // namespace ots 754 } // namespace ots
OLDNEW
« no previous file with comments | « ots-common.gypi ('k') | src/woff2.h » ('j') | src/woff2.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698