@@ -2938,6 +2938,7 @@ var Font = (function FontClosure() {
2938
2938
}
2939
2939
this .toFontChar = toFontChar ;
2940
2940
}
2941
+ var unitsPerEm = properties .unitsPerEm || 1000 ; // defaulting to 1000
2941
2942
2942
2943
var fields = {
2943
2944
// PostScript Font Program
@@ -2958,7 +2959,7 @@ var Font = (function FontClosure() {
2958
2959
'\x00\x00\x00\x00' + // checksumAdjustement
2959
2960
'\x5F\x0F\x3C\xF5' + // magicNumber
2960
2961
'\x00\x00' + // Flags
2961
- '\x03\xE8' + // unitsPerEM (defaulting to 1000)
2962
+ safeString16 ( unitsPerEm ) + // unitsPerEM
2962
2963
'\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // creation date
2963
2964
'\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // modifification date
2964
2965
'\x00\x00' + // xMin
@@ -4413,6 +4414,19 @@ var CFFParser = (function CFFParserClosure() {
4413
4414
var charStringOffset = topDict .getByName ('CharStrings' );
4414
4415
cff .charStrings = this .parseCharStrings (charStringOffset );
4415
4416
4417
+ var fontMatrix = topDict .getByName ('FontMatrix' );
4418
+ if (fontMatrix ) {
4419
+ // estimating unitsPerEM for the font
4420
+ properties .unitsPerEm = 1 / fontMatrix [0 ];
4421
+ }
4422
+
4423
+ var fontBBox = topDict .getByName ('FontBBox' );
4424
+ if (fontBBox ) {
4425
+ // adjusting ascent/descent
4426
+ properties .ascent = fontBBox [3 ];
4427
+ properties .descent = fontBBox [1 ];
4428
+ }
4429
+
4416
4430
var charset , encoding ;
4417
4431
if (cff .isCIDFont ) {
4418
4432
var fdArrayIndex = this .parseIndex (topDict .getByName ('FDArray' )).obj ;
@@ -4486,7 +4500,7 @@ var CFFParser = (function CFFParserClosure() {
4486
4500
return parseFloatOperand (pos );
4487
4501
} else if (value === 28 ) {
4488
4502
value = dict [pos ++];
4489
- value = (value << 8 ) | dict [pos ++];
4503
+ value = (( value << 24 ) | ( dict [pos ++] << 16 )) >> 16 ;
4490
4504
return value ;
4491
4505
} else if (value === 29 ) {
4492
4506
value = dict [pos ++];
0 commit comments