@@ -1335,6 +1335,18 @@ var Type1Parser = function() {
1335
1335
* Returns an object containing a Subrs array and a CharStrings array
1336
1336
* extracted from and eexec encrypted block of data
1337
1337
*/
1338
+ function readNumberArray (str , index ) {
1339
+ var start = ++index ;
1340
+ var count = 0 ;
1341
+ while (str [index ++] != "]" )
1342
+ count ++;
1343
+
1344
+ var array = str .substr (start , count ).split (" " );
1345
+ for (var i = 0 ; i < array .length ; i ++)
1346
+ array [i ] = parseFloat (array [i ] || 0 );
1347
+ return array ;
1348
+ };
1349
+
1338
1350
this .extractFontProgram = function t1_extractFontProgram (stream ) {
1339
1351
var eexec = decrypt (stream , kEexecEncryptionKey , 4 );
1340
1352
var eexecString = "" ;
@@ -1344,7 +1356,11 @@ var Type1Parser = function() {
1344
1356
var glyphsSection = false , subrsSection = false ;
1345
1357
var extracted = {
1346
1358
subrs : [],
1347
- charstrings : []
1359
+ charstrings : [],
1360
+ properties : {
1361
+ stemSnapH : [0 , 0 ],
1362
+ stemSnapV : [0 , 0 ]
1363
+ }
1348
1364
};
1349
1365
1350
1366
var glyph = "" ;
@@ -1372,14 +1388,32 @@ var Type1Parser = function() {
1372
1388
extracted .subrs .push (str .charstring );
1373
1389
}
1374
1390
i += length + 3 ;
1375
- } else if (c == " " ) {
1391
+ } else if (c == " " || c == " \n " ) {
1376
1392
length = parseInt (token );
1377
1393
token = "" ;
1378
1394
} else {
1379
1395
token += c ;
1380
1396
if (!glyphsSection ) {
1381
- glyphsSection = token .indexOf ("/CharString" ) != -1 ;
1382
- subrsSection = subrsSection || token .indexOf ("Subrs" ) != -1 ;
1397
+ switch (token ) {
1398
+ case "/CharString" :
1399
+ glyphsSection = true ;
1400
+ break ;
1401
+ case "/Subrs" :
1402
+ subrsSection = true ;
1403
+ break ;
1404
+ case "/StdHW" :
1405
+ extracted .properties .stdHW = readNumberArray (eexecString , i + 2 )[0 ];
1406
+ break ;
1407
+ case "/StdVW" :
1408
+ extracted .properties .stdVW = readNumberArray (eexecString , i + 2 )[0 ];
1409
+ break ;
1410
+ case "/StemSnapH" :
1411
+ extracted .properties .stemSnapH = readNumberArray (eexecString , i + 2 );
1412
+ break ;
1413
+ case "/StemSnapV" :
1414
+ extracted .properties .stemSnapV = readNumberArray (eexecString , i + 2 );
1415
+ break ;
1416
+ }
1383
1417
} else if (c == "/" ) {
1384
1418
token = glyph = "" ;
1385
1419
while ((c = eexecString [++i ]) != " " )
@@ -1400,18 +1434,6 @@ var Type1Parser = function() {
1400
1434
textMatrix : null
1401
1435
};
1402
1436
1403
- function readNumberArray (str , index ) {
1404
- var start = ++index ;
1405
- var count = 0 ;
1406
- while ((c = str [index ++]) != "]" )
1407
- count ++;
1408
-
1409
- var array = str .substr (start , count ).split (" " );
1410
- for (var i = 0 ; i < array .length ; i ++)
1411
- array [i ] = parseFloat (array [i ]);
1412
- return array ;
1413
- };
1414
-
1415
1437
var token = "" ;
1416
1438
var count = headerString .length ;
1417
1439
for (var i = 0 ; i < count ; i ++) {
@@ -1439,7 +1461,6 @@ var Type1Parser = function() {
1439
1461
1440
1462
return info ;
1441
1463
};
1442
-
1443
1464
};
1444
1465
1445
1466
/**
@@ -1513,13 +1534,14 @@ var CFF = function(name, file, properties) {
1513
1534
1514
1535
var headerBlock = file .getBytes (length1 );
1515
1536
var header = type1Parser .extractFontHeader (headerBlock );
1516
- for (var info in header ) {
1537
+ for (var info in header )
1517
1538
properties [info ] = header [info ];
1518
- }
1519
1539
1520
1540
// Decrypt the data blocks and retrieve it's content
1521
1541
var eexecBlock = file .getBytes (length2 );
1522
1542
var data = type1Parser .extractFontProgram (eexecBlock );
1543
+ for (var info in data .properties )
1544
+ properties [info ] = data .properties [info ];
1523
1545
1524
1546
var charstrings = this .getOrderedCharStrings (data .charstrings );
1525
1547
var type2Charstrings = this .getType2Charstrings (charstrings );
@@ -1758,14 +1780,22 @@ CFF.prototype = {
1758
1780
" charstrings ": this.createCFFIndexHeader([[0x8B, 0x0E]].concat(glyphs), true),
1759
1781
1760
1782
" private ": (function(self) {
1761
- log(properties.stemSnapH);
1762
1783
var data =
1763
1784
" \x8b \x14 " + // defaultWidth
1764
1785
" \x8b \x15 " + // nominalWidth
1765
- " \x8b \x0a " + // StdHW
1766
- " \x8b \x0a " + // StdVW
1767
- " \x8b \x8b \x0c \x0c " + // StemSnapH
1768
- " \x8b \x8b \x0c \x0d "; // StemSnapV
1786
+ self.encodeNumber(properties.stdHW) + " \x0a " + // StdHW
1787
+ self.encodeNumber(properties.stdVW) + " \x0b "; // StdVW
1788
+
1789
+ var stemH = properties.stemSnapH;
1790
+ for (var i = 0; i < stemH.length; i++)
1791
+ data += self.encodeNumber(stemH[i]);
1792
+ data += " \x0c \x0c "; // StemSnapH
1793
+
1794
+ var stemV = properties.stemSnapV;
1795
+ for (var i = 0; i < stemV.length; i++)
1796
+ data += self.encodeNumber(stemV[i]);
1797
+ data += " \x0c \x0d "; // StemSnapV
1798
+
1769
1799
data += self.encodeNumber(data.length + 4) + " \x13 "; // Subrs offset
1770
1800
1771
1801
return data;
0 commit comments