]> git.parisson.com Git - pdf.js.git/commitdiff
Calculate the checksumAdjustement for the file
authorVivien Nicolas <21@vingtetun.org>
Mon, 4 Jul 2011 04:07:49 +0000 (06:07 +0200)
committerVivien Nicolas <21@vingtetun.org>
Mon, 4 Jul 2011 04:07:49 +0000 (06:07 +0200)
fonts.js

index dceda2cdda0d9d8231585f731daba07ff280cc5b..1964121c49ac8dfa5809e8e5e6b4c79eaa4e35d6 100644 (file)
--- a/fonts.js
+++ b/fonts.js
@@ -1024,14 +1024,14 @@ var Font = (function Font() {
       // to write the table entry information about a table and another offset
       // representing the offset where to draw the actual data of a particular
       // table
-      var kRequiredTablesCount = 9;
+      var tablesCount = 9;
       var offsets = {
         currentOffset: 0,
-        virtualOffset: 9 * (4 * 4)
+        virtualOffset: tablesCount * (4 * 4)
       };
 
       var otf = new Uint8Array(kMaxFontFileSize);
-      createOpenTypeHeader("\x4F\x54\x54\x4F", otf, offsets, 9);
+      createOpenTypeHeader("\x4F\x54\x54\x4F", otf, offsets, tablesCount);
 
            var charstrings = font.charstrings;
            properties.fixedPitch = isFixedPitch(charstrings);
@@ -1115,12 +1115,26 @@ var Font = (function Font() {
       for (var field in fields)
         createTableEntry(otf, offsets, field, fields[field]);
 
+      var headPosition = 0;
       for (var field in fields) {
         var table = fields[field];
+        if (field == "head")
+          headPosition = offsets.currentOffset;
+
         otf.set(table, offsets.currentOffset);
         offsets.currentOffset += table.length;
       }
 
+      // Now calculate the checksumAdjustement for all the file and put it into
+      // head. This will make the head checksum incorrect but per spec that's
+      // the way it works.
+      var checksumAdjustement = 0;
+      for (var i = 0; i < offsets.currentOffset; i+=4)
+        checksumAdjustement += int16([otf[i], otf[i+1], otf[i+2], otf[i+3]]);
+      checksumAdjustement = 0xB1B0AFBA - checksumAdjustement;
+      otf.set(stringToArray(string32(checksumAdjustement)), headPosition + (2 * 4));
+
+
       var fontData = [];
       for (var i = 0; i < offsets.currentOffset; i++)
         fontData.push(otf[i]);