@ -124,7 +124,7 @@ var serifFonts = {
@@ -124,7 +124,7 @@ var serifFonts = {
var FontLoader = {
listeningForFontLoad : false ,
bind : function ( fonts , callback ) {
bind : function fontLoaderBind ( fonts , callback ) {
function checkFontsLoaded ( ) {
for ( var i = 0 ; i < objs . length ; i ++ ) {
var fontObj = objs [ i ] ;
@ -180,7 +180,8 @@ var FontLoader = {
@@ -180,7 +180,8 @@ var FontLoader = {
// loaded in a subdocument. It's expected that the load of |rules|
// has already started in this (outer) document, so that they should
// be ordered before the load in the subdocument.
prepareFontLoadEvent : function ( rules , names , objs ) {
prepareFontLoadEvent : function fontLoaderPrepareFontLoadEvent ( rules , names ,
objs ) {
/** Hack begin */
// There's no event when a font has finished downloading so the
// following code is a dirty hack to 'guess' when a font is
@ -219,7 +220,7 @@ var FontLoader = {
@@ -219,7 +220,7 @@ var FontLoader = {
if ( ! this . listeningForFontLoad ) {
window . addEventListener (
'message' ,
function ( e ) {
function fontLoaderMessage ( e ) {
var fontNames = JSON . parse ( e . data ) ;
for ( var i = 0 ; i < objs . length ; ++ i ) {
var font = objs [ i ] ;
@ -247,7 +248,7 @@ var FontLoader = {
@@ -247,7 +248,7 @@ var FontLoader = {
fontNamesArray += '"' + names [ i ] + '", ' ;
}
src += ' var fontNames=[' + fontNamesArray + '];\n' ;
src += ' window.onload = function () {\n' ;
src += ' window.onload = function fontLoaderOnload () {\n' ;
src += ' parent.postMessage(JSON.stringify(fontNames), "*");\n' ;
src += ' }' ;
src += '</script></head><body>' ;
@ -447,13 +448,14 @@ var Font = (function Font() {
@@ -447,13 +448,14 @@ var Font = (function Font() {
}
var data ;
switch ( properties . type ) {
var type = properties . type ;
switch ( type ) {
case 'Type1' :
case 'CIDFontType0' :
this . mimetype = 'font/opentype' ;
var subtype = properties . subtype ;
var cff = ( subtype === 'Type1 C' ) ?
var cff = ( subtype == 'Type1C' || subtype == 'CIDFontType0 C' ) ?
new Type2CFF ( file , properties ) : new CFF ( name , file , properties ) ;
// Wrap the CFF data inside an OTF font file
@ -475,7 +477,7 @@ var Font = (function Font() {
@@ -475,7 +477,7 @@ var Font = (function Font() {
}
this . data = data ;
this . type = properties . type ;
this . type = type ;
this . textMatrix = properties . textMatrix ;
this . defaultWidth = properties . defaultWidth ;
this . loadedName = getUniqueName ( ) ;
@ -598,7 +600,7 @@ var Font = (function Font() {
@@ -598,7 +600,7 @@ var Font = (function Font() {
var length = glyphs . length ;
for ( var n = 0 ; n < length ; ++ n )
codes . push ( { unicode : glyphs [ n ] . unicode , code : n } ) ;
codes . sort ( function ( a , b ) {
codes . sort ( function fontGetRangesSort ( a , b ) {
return a . unicode - b . unicode ;
} ) ;
@ -927,7 +929,7 @@ var Font = (function Font() {
@@ -927,7 +929,7 @@ var Font = (function Font() {
}
// Check that table are sorted by platformID then encodingID,
records . sort ( function ( a , b ) {
records . sort ( function fontReplaceCMapTableSort ( a , b ) {
return ( ( a . platformID << 16 ) + a . encodingID ) -
( ( b . platformID << 16 ) + b . encodingID ) ;
} ) ;
@ -1060,11 +1062,11 @@ var Font = (function Font() {
@@ -1060,11 +1062,11 @@ var Font = (function Font() {
var itemSize , itemDecode , itemEncode ;
if ( isGlyphLocationsLong ) {
itemSize = 4 ;
itemDecode = function ( data , offset ) {
itemDecode = function fontItemDecodeLong ( data , offset ) {
return ( data [ offset ] << 24 ) | ( data [ offset + 1 ] << 16 ) |
( data [ offset + 2 ] << 8 ) | data [ offset + 3 ] ;
} ;
itemEncode = function ( data , offset , value ) {
itemEncode = function fontItemEncodeLong ( data , offset , value ) {
data [ offset ] = ( value >>> 24 ) & 0xFF ;
data [ offset + 1 ] = ( value >> 16 ) & 0xFF ;
data [ offset + 2 ] = ( value >> 8 ) & 0xFF ;
@ -1072,10 +1074,10 @@ var Font = (function Font() {
@@ -1072,10 +1074,10 @@ var Font = (function Font() {
} ;
} else {
itemSize = 2 ;
itemDecode = function ( data , offset ) {
itemDecode = function fontItemDecode ( data , offset ) {
return ( data [ offset ] << 9 ) | ( data [ offset + 1 ] << 1 ) ;
} ;
itemEncode = function ( data , offset , value ) {
itemEncode = function fontItemEncode ( data , offset , value ) {
data [ offset ] = ( value >> 9 ) & 0xFF ;
data [ offset + 1 ] = ( value >> 1 ) & 0xFF ;
} ;
@ -1322,7 +1324,7 @@ var Font = (function Font() {
@@ -1322,7 +1324,7 @@ var Font = (function Font() {
'cmap' : createCMapTable ( charstrings . slice ( ) , font . glyphIds ) ,
// Font header
'head' : ( function ( ) {
'head' : ( function fontFieldsHead ( ) {
return stringToArray (
'\x00\x01\x00\x00' + // Version number
'\x00\x00\x10\x00' + // fontRevision
@ -1344,7 +1346,7 @@ var Font = (function Font() {
@@ -1344,7 +1346,7 @@ var Font = (function Font() {
} ) ( ) ,
// Horizontal header
'hhea' : ( function ( ) {
'hhea' : ( function fontFieldsHhea ( ) {
return stringToArray (
'\x00\x01\x00\x00' + // Version number
string16 ( properties . ascent ) + // Typographic Ascent
@ -1367,7 +1369,7 @@ var Font = (function Font() {
@@ -1367,7 +1369,7 @@ var Font = (function Font() {
} ) ( ) ,
// Horizontal metrics
'hmtx' : ( function ( ) {
'hmtx' : ( function fontFieldsHmtx ( ) {
var hmtx = '\x00\x00\x00\x00' ; // Fake .notdef
for ( var i = 0 ; i < charstrings . length ; i ++ ) {
hmtx += string16 ( charstrings [ i ] . width ) + string16 ( 0 ) ;
@ -1376,7 +1378,7 @@ var Font = (function Font() {
@@ -1376,7 +1378,7 @@ var Font = (function Font() {
} ) ( ) ,
// Maximum profile
'maxp' : ( function ( ) {
'maxp' : ( function fontFieldsMaxp ( ) {
return stringToArray (
'\x00\x00\x50\x00' + // Version number
string16 ( charstrings . length + 1 ) ) ; // Num of glyphs
@ -1504,7 +1506,7 @@ var Font = (function Font() {
@@ -1504,7 +1506,7 @@ var Font = (function Font() {
* program . Some of its logic depends on the Type2 charstrings
* structure .
* /
var Type1Parser = function ( ) {
var Type1Parser = function type1Parser ( ) {
/ *
* Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence
* of Plaintext Bytes . The function took a key as a parameter which can be
@ -2032,7 +2034,7 @@ var CFFStrings = [
@@ -2032,7 +2034,7 @@ var CFFStrings = [
var type1Parser = new Type1Parser ( ) ;
var CFF = function ( name , file , properties ) {
var CFF = function cFF ( name , file , properties ) {
// Get the data block containing glyphs and subrs informations
var headerBlock = file . getBytes ( properties . length1 ) ;
type1Parser . extractFontHeader ( headerBlock , properties ) ;
@ -2232,7 +2234,7 @@ CFF.prototype = {
@@ -2232,7 +2234,7 @@ CFF.prototype = {
'names' : this . createCFFIndexHeader ( [ name ] ) ,
'topDict' : ( function topDict ( self ) {
return function ( ) {
return function cFFWrapTopDict ( ) {
var header = '\x00\x01\x01\x01' ;
var dict =
'\xf8\x1b\x00' + // version
@ -2309,7 +2311,7 @@ CFF.prototype = {
@@ -2309,7 +2311,7 @@ CFF.prototype = {
'charstrings' : this . createCFFIndexHeader ( [ [ 0x8B , 0x0E ] ] . concat ( glyphs ) ,
true ) ,
'private' : ( function ( self ) {
'private' : ( function cFFWrapPrivate ( self ) {
var data =
'\x8b\x14' + // defaultWidth
'\x8b\x15' ; // nominalWidth
@ -2362,7 +2364,7 @@ CFF.prototype = {
@@ -2362,7 +2364,7 @@ CFF.prototype = {
}
} ;
var Type2CFF = ( function ( ) {
var Type2CFF = ( function type2CFF ( ) {
// TODO: replace parsing code with the Type2Parser in font_utils.js
function constructor ( file , properties ) {
var bytes = file . getBytes ( ) ;
@ -2387,16 +2389,21 @@ var Type2CFF = (function() {
@@ -2387,16 +2389,21 @@ var Type2CFF = (function() {
var strings = this . getStrings ( stringIndex ) ;
var baseDict = this . parseDict ( dictIndex . get ( 0 ) ) ;
var baseDict = this . parseDict ( dictIndex . get ( 0 ) . data ) ;
var topDict = this . getTopDict ( baseDict , strings ) ;
var bytes = this . bytes ;
var privateDict = { } ;
var privateInfo = topDict . Private ;
var privOffset = privateInfo [ 1 ] , privLength = privateInfo [ 0 ] ;
var privBytes = bytes . subarray ( privOffset , privOffset + privLength ) ;
baseDict = this . parseDict ( privBytes ) ;
var privDict = this . getPrivDict ( baseDict , strings ) ;
if ( privateInfo ) {
var privOffset = privateInfo [ 1 ] , privLength = privateInfo [ 0 ] ;
var privBytes = bytes . subarray ( privOffset , privOffset + privLength ) ;
baseDict = this . parseDict ( privBytes ) ;
privateDict = this . getPrivDict ( baseDict , strings ) ;
} else {
privateDict . defaultWidthX = properties . defaultWidth ;
}
var charStrings = this . parseIndex ( topDict . CharStrings ) ;
var charset = this . parseCharsets ( topDict . charset ,
@ -2412,10 +2419,37 @@ var Type2CFF = (function() {
@@ -2412,10 +2419,37 @@ var Type2CFF = (function() {
if ( hasSupplement )
bytes [ topDict . Encoding ] = 0 ;
// The CFF specification state that the 'dotsection' command
// (12, 0) is deprecated and treated as a no-op, but all Type2
// charstrings processors should support them. Unfortunately
// the font sanitizer don't. As a workaround the sequence (12, 0)
// is replaced by a useless (0, hmoveto).
var count = charStrings . length ;
for ( var i = 0 ; i < count ; i ++ ) {
var charstring = charStrings . get ( i ) ;
var start = charstring . start ;
var data = charstring . data ;
var length = data . length ;
for ( var j = 0 ; j <= length ; j ) {
var value = data [ j ++ ] ;
if ( value == 12 && data [ j ++ ] == 0 ) {
bytes [ start + j - 2 ] = 139 ;
bytes [ start + j - 1 ] = 22 ;
} else if ( value === 28 ) {
j += 2 ;
} else if ( value >= 247 && value <= 254 ) {
j ++ ;
} else if ( value == 255 ) {
j += 4 ;
}
}
}
// charstrings contains info about glyphs (one element per glyph
// containing mappings for {unicode, width})
var charstrings = this . getCharStrings ( charset , charStrings ,
privDict , this . properties ) ;
private Dict , this . properties ) ;
// create the mapping between charstring and glyph id
var glyphIds = [ ] ;
@ -2432,10 +2466,8 @@ var Type2CFF = (function() {
@@ -2432,10 +2466,8 @@ var Type2CFF = (function() {
} ,
getCharStrings : function cff _charstrings ( charsets , charStrings ,
privDict , properties ) {
var defaultWidth = privDict [ 'defaultWidthX' ] ;
var nominalWidth = privDict [ 'nominalWidthX' ] ;
privateDict , properties ) {
var defaultWidth = privateDict [ 'defaultWidthX' ] ;
var charstrings = [ ] ;
var differences = properties . differences ;
var index = 0 ;
@ -2472,7 +2504,9 @@ var Type2CFF = (function() {
@@ -2472,7 +2504,9 @@ var Type2CFF = (function() {
}
// sort the array by the unicode value
charstrings . sort ( function ( a , b ) { return a . unicode - b . unicode } ) ;
charstrings . sort ( function type2CFFGetCharStringsSort ( a , b ) {
return a . unicode - b . unicode ;
} ) ;
return charstrings ;
} ,
@ -2492,8 +2526,8 @@ var Type2CFF = (function() {
@@ -2492,8 +2526,8 @@ var Type2CFF = (function() {
if ( pos == 0 || pos == 1 ) {
var gid = 1 ;
var baseEncoding =
pos ? Encodings . ExpertEncoding : Encodings . StandardEncoding ;
var baseEncoding = pos ? Encodings . ExpertEncoding . slice ( ) :
Encodings . StandardEncoding . slice ( ) ;
for ( var i = 0 ; i < charset . length ; i ++ ) {
var index = baseEncoding . indexOf ( charset [ i ] ) ;
if ( index != - 1 )
@ -2538,37 +2572,42 @@ var Type2CFF = (function() {
@@ -2538,37 +2572,42 @@ var Type2CFF = (function() {
} ,
parseCharsets : function cff _parsecharsets ( pos , length , strings ) {
if ( pos == 0 ) {
return ISOAdobeCharset . slice ( ) ;
} else if ( pos == 1 ) {
return ExpertCharset . slice ( ) ;
} else if ( pos == 2 ) {
return ExpertSubsetCharset . slice ( ) ;
}
var bytes = this . bytes ;
var format = bytes [ pos ++ ] ;
var charset = [ '.notdef' ] ;
// subtract 1 for the .notdef glyph
length -= 1 ;
switch ( format ) {
case 0 :
for ( var i = 0 ; i < length ; ++ i ) {
var id = bytes [ pos ++ ] ;
id = ( id << 8 ) | bytes [ pos ++ ] ;
charset . push ( strings [ id ] ) ;
for ( var i = 0 ; i < length ; i ++ ) {
var sid = ( bytes [ pos ++ ] << 8 ) | bytes [ pos ++ ] ;
charset . push ( strings [ sid ] ) ;
}
break ;
case 1 :
while ( charset . length <= length ) {
var first = bytes [ pos ++ ] ;
first = ( first << 8 ) | bytes [ pos ++ ] ;
var numLeft = bytes [ pos ++ ] ;
for ( var i = 0 ; i <= numLeft ; ++ i )
charset . push ( strings [ first ++ ] ) ;
var sid = ( bytes [ pos ++ ] << 8 ) | bytes [ pos ++ ] ;
var count = bytes [ pos ++ ] ;
for ( var i = 0 ; i <= count ; i ++ )
charset . push ( strings [ sid ++ ] ) ;
}
break ;
case 2 :
while ( charset . length <= length ) {
var first = bytes [ pos ++ ] ;
first = ( first << 8 ) | bytes [ pos ++ ] ;
var numLeft = bytes [ pos ++ ] ;
numLeft = ( numLeft << 8 ) | bytes [ pos ++ ] ;
for ( var i = 0 ; i <= numLeft ; ++ i )
charset . push ( strings [ first ++ ] ) ;
var sid = ( bytes [ pos ++ ] << 8 ) | bytes [ pos ++ ] ;
var count = ( bytes [ pos ++ ] << 8 ) | bytes [ pos ++ ] ;
for ( var i = 0 ; i <= count ; i ++ )
charset . push ( strings [ sid ++ ] ) ;
}
break ;
default :
@ -2643,20 +2682,20 @@ var Type2CFF = (function() {
@@ -2643,20 +2682,20 @@ var Type2CFF = (function() {
}
return dict ;
} ,
getStrings : function cff _gets trings ( stringIndex ) {
function bytesToString ( bytesArr ) {
var s = '' ;
for ( var i = 0 , ii = bytesArr . length ; i < ii ; ++ i )
s += String . fromCharCode ( bytesArr [ i ] ) ;
return s ;
getStrings : function cff _getS trings ( stringIndex ) {
function bytesToString ( bytesArray ) {
var str = '' ;
for ( var i = 0 , length = bytesArray . length ; i < length ; i ++ )
str += String . fromCharCode ( bytesArray [ i ] ) ;
return str ;
}
var stringArray = [ ] ;
for ( var i = 0 , ii = CFFStrings . length ; i < ii ; ++ i )
for ( var i = 0 , length = CFFStrings . length ; i < length ; i ++ )
stringArray . push ( CFFStrings [ i ] ) ;
for ( var i = 0 , ii = stringIndex . length ; i < ii ; ++ i )
stringArray . push ( bytesToString ( stringIndex . get ( i ) ) ) ;
for ( var i = 0 , length = stringIndex . length ; i < length ; i ++ )
stringArray . push ( bytesToString ( stringIndex . get ( i ) . data ) ) ;
return stringArray ;
} ,
@ -2702,7 +2741,7 @@ var Type2CFF = (function() {
@@ -2702,7 +2741,7 @@ var Type2CFF = (function() {
} else if ( value <= 254 ) {
return - ( ( value - 251 ) * 256 ) - dict [ pos ++ ] - 108 ;
} else {
error ( 'Incorrect byte ' ) ;
error ( '255 is not a valid DICT command ' ) ;
}
return - 1 ;
}
@ -2779,7 +2818,11 @@ var Type2CFF = (function() {
@@ -2779,7 +2818,11 @@ var Type2CFF = (function() {
var start = offsets [ index ] ;
var end = offsets [ index + 1 ] ;
return bytes . subarray ( start , end ) ;
return {
start : start ,
end : end ,
data : bytes . subarray ( start , end )
} ;
} ,
length : count ,
endPos : end