Give a shot at passing better information to hmtx (hinting is slightly broken)
This commit is contained in:
		
							parent
							
								
									798d7a10ca
								
							
						
					
					
						commit
						61da963dae
					
				
							
								
								
									
										63
									
								
								fonts.js
									
									
									
									
									
								
							
							
						
						
									
										63
									
								
								fonts.js
									
									
									
									
									
								
							@ -182,7 +182,16 @@ var Font = (function () {
 | 
			
		||||
    return array;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  function string16(value) {
 | 
			
		||||
  function string16(value, signed) {
 | 
			
		||||
    if (signed && value < 0) {
 | 
			
		||||
      value = Math.abs(value);
 | 
			
		||||
      var byte = (value >> 8) & 0xff;
 | 
			
		||||
      return String.fromCharCode(byte ^ 0xff) +
 | 
			
		||||
             String.fromCharCode(value & 0xff);
 | 
			
		||||
    } else if (signed) {
 | 
			
		||||
      return String.fromCharCode((value >> 7) & 0xff) +
 | 
			
		||||
             String.fromCharCode(value & 0xff);
 | 
			
		||||
    }
 | 
			
		||||
    return String.fromCharCode((value >> 8) & 0xff) +
 | 
			
		||||
           String.fromCharCode(value & 0xff);
 | 
			
		||||
  };
 | 
			
		||||
@ -732,10 +741,8 @@ var Font = (function () {
 | 
			
		||||
      */
 | 
			
		||||
      hmtx = "\x01\xF4\x00\x00"; // Fake .notdef
 | 
			
		||||
      var width = 0, lsb = 0;
 | 
			
		||||
      for (var i = 0; i < charstrings.length; i++) {
 | 
			
		||||
        width = charstrings[i].charstring[0];
 | 
			
		||||
        hmtx += string16(width) + string16(lsb);
 | 
			
		||||
      }
 | 
			
		||||
      for (var i = 0; i < charstrings.length; i++)
 | 
			
		||||
        hmtx += string16(charstrings[i].width) + string16(charstrings[i].lsb);
 | 
			
		||||
      hmtx = stringToArray(hmtx);
 | 
			
		||||
      createTableEntry(otf, offsets, "hmtx", hmtx);
 | 
			
		||||
 | 
			
		||||
@ -832,14 +839,14 @@ var Font = (function () {
 | 
			
		||||
 */
 | 
			
		||||
var FontsUtils = {
 | 
			
		||||
  _bytesArray: new Uint8Array(4),
 | 
			
		||||
  integerToBytes: function fu_integerToBytes(value, bytesCount) {
 | 
			
		||||
  integerToBytes: function fu_integerToBytes(value, bytesCount, signed) {
 | 
			
		||||
    var bytes = this._bytesArray;
 | 
			
		||||
 | 
			
		||||
    if (bytesCount == 1) {
 | 
			
		||||
      bytes.set([value]);
 | 
			
		||||
      return bytes[0];
 | 
			
		||||
    } else if (bytesCount == 2) {
 | 
			
		||||
      bytes.set([value >> 8, value]);
 | 
			
		||||
      bytes.set([value >> 8, value & 0xff]);
 | 
			
		||||
      return [bytes[0], bytes[1]];
 | 
			
		||||
    } else if (bytesCount == 4) {
 | 
			
		||||
      bytes.set([value >> 24, value >> 16, value >> 8, value]);
 | 
			
		||||
@ -1005,6 +1012,8 @@ var Type1Parser = function() {
 | 
			
		||||
 | 
			
		||||
  function decodeCharString(array) {
 | 
			
		||||
    var charstring = [];
 | 
			
		||||
    var lsb = 0;
 | 
			
		||||
    var width = 0;
 | 
			
		||||
 | 
			
		||||
    var z = 0;
 | 
			
		||||
    var value = "";
 | 
			
		||||
@ -1043,14 +1052,30 @@ var Type1Parser = function() {
 | 
			
		||||
        } else {
 | 
			
		||||
 | 
			
		||||
          // TODO Clean this code
 | 
			
		||||
          Gindex = Gindex || 1;
 | 
			
		||||
          if (value == 13) {
 | 
			
		||||
            var charWidthVector = charstring[1];
 | 
			
		||||
            var leftSidebearing = charstring[0];
 | 
			
		||||
 | 
			
		||||
            charstring.push(leftSidebearing, "hmoveto");
 | 
			
		||||
            width = charstring[1];
 | 
			
		||||
            lsb = charstring[0];
 | 
			
		||||
            //charstring.push(lsb, "hmoveto");
 | 
			
		||||
            charstring.splice(0, 1);
 | 
			
		||||
            continue;
 | 
			
		||||
          } else if (0 && lsb && value == 1) { // hstem
 | 
			
		||||
            charstring[Gindex] += lsb;
 | 
			
		||||
            lsb = 0;
 | 
			
		||||
          } else if (0 && lsb && value == 22) { // hmoveto
 | 
			
		||||
            error("hmoveto: " + charstring[Gindex]);
 | 
			
		||||
            charstring[Gindex] += lsb;
 | 
			
		||||
            lsb = 0;
 | 
			
		||||
          } else if (0 && lsb && value == 14) { // enchar
 | 
			
		||||
            var p = charstring[Gindex];
 | 
			
		||||
            if (IsNum(p)) {
 | 
			
		||||
              charstring[Gindex] += lsb;
 | 
			
		||||
            } else {
 | 
			
		||||
              charstring.splice(Gindex + 1, 0, lsb);
 | 
			
		||||
            }
 | 
			
		||||
            lsb = 0;
 | 
			
		||||
          }
 | 
			
		||||
          var Gindex = charstring.length;
 | 
			
		||||
 | 
			
		||||
          command = charStringDictionary[value];
 | 
			
		||||
        }
 | 
			
		||||
@ -1080,7 +1105,7 @@ var Type1Parser = function() {
 | 
			
		||||
      charstring.push(value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return charstring;
 | 
			
		||||
    return { charstring: charstring, width: width, lsb: lsb };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
@ -1107,19 +1132,21 @@ var Type1Parser = function() {
 | 
			
		||||
        length = parseInt(length);
 | 
			
		||||
        var data = eexecString.slice(i + 3, i + 3 + length);
 | 
			
		||||
        var encodedSubr = decrypt(data, kCharStringsEncryptionKey, 4);
 | 
			
		||||
        var subr = decodeCharString(encodedSubr);
 | 
			
		||||
        var str = decodeCharString(encodedSubr);
 | 
			
		||||
 | 
			
		||||
        subrs.push(subr);
 | 
			
		||||
        subrs.push(str.charstring);
 | 
			
		||||
        i += 3 + length;
 | 
			
		||||
      } else if (inGlyphs && c == 0x52) {
 | 
			
		||||
        length = parseInt(length);
 | 
			
		||||
        var data = eexecString.slice(i + 3, i + 3 + length);
 | 
			
		||||
        var encodedCharstring = decrypt(data, kCharStringsEncryptionKey, 4);
 | 
			
		||||
        var subr = decodeCharString(encodedCharstring);
 | 
			
		||||
        var str = decodeCharString(encodedCharstring);
 | 
			
		||||
 | 
			
		||||
        glyphs.push({
 | 
			
		||||
            glyph: glyph,
 | 
			
		||||
            data: subr
 | 
			
		||||
            data: str.charstring,
 | 
			
		||||
            lsb: str.lsb,
 | 
			
		||||
            width: str.width
 | 
			
		||||
        });
 | 
			
		||||
        i += 3 + length;
 | 
			
		||||
      } else if (inGlyphs && c == 0x2F) {
 | 
			
		||||
@ -1290,7 +1317,9 @@ CFF.prototype = {
 | 
			
		||||
        charstrings.push({
 | 
			
		||||
          glyph: glyph,
 | 
			
		||||
          unicode: unicode,
 | 
			
		||||
          charstring: glyphs[i].data
 | 
			
		||||
          charstring: glyphs[i].data,
 | 
			
		||||
          width: glyphs[i].width,
 | 
			
		||||
          lsb: glyphs[i].lsb
 | 
			
		||||
        });
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user