Extract CFFParser from fonts.js (issue 6777)

This commit is contained in:
Jonas Jenwald 2016-03-31 19:53:07 +02:00
parent a250c150ab
commit b961e1d21b
5 changed files with 1721 additions and 1673 deletions

1646
src/core/cff_parser.js Normal file

File diff suppressed because it is too large Load Diff

View File

@ -17,17 +17,19 @@
(function (root, factory) { (function (root, factory) {
if (typeof define === 'function' && define.amd) { if (typeof define === 'function' && define.amd) {
define('pdfjs/core/font_renderer', ['exports', 'pdfjs/shared/util', define('pdfjs/core/font_renderer', ['exports', 'pdfjs/shared/util',
'pdfjs/core/stream', 'pdfjs/core/glyphlist', 'pdfjs/core/encodings'], 'pdfjs/core/stream', 'pdfjs/core/glyphlist', 'pdfjs/core/encodings',
factory); 'pdfjs/core/cff_parser'], factory);
} else if (typeof exports !== 'undefined') { } else if (typeof exports !== 'undefined') {
factory(exports, require('../shared/util.js'), require('./stream.js'), factory(exports, require('../shared/util.js'), require('./stream.js'),
require('./glyphlist.js'), require('./encodings.js')); require('./glyphlist.js'), require('./encodings.js'),
require('./cff_parser.js'));
} else { } else {
factory((root.pdfjsCoreFontRenderer = {}), root.pdfjsSharedUtil, factory((root.pdfjsCoreFontRenderer = {}), root.pdfjsSharedUtil,
root.pdfjsCoreStream, root.pdfjsCoreGlyphList, root.pdfjsCoreEncodings); root.pdfjsCoreStream, root.pdfjsCoreGlyphList, root.pdfjsCoreEncodings,
root.pdfjsCoreCFFParser);
} }
}(this, function (exports, sharedUtil, coreStream, coreGlyphList, }(this, function (exports, sharedUtil, coreStream, coreGlyphList,
coreEncodings) { coreEncodings, coreCFFParser) {
var Util = sharedUtil.Util; var Util = sharedUtil.Util;
var bytesToString = sharedUtil.bytesToString; var bytesToString = sharedUtil.bytesToString;
@ -35,9 +37,7 @@ var error = sharedUtil.error;
var Stream = coreStream.Stream; var Stream = coreStream.Stream;
var getGlyphsUnicode = coreGlyphList.getGlyphsUnicode; var getGlyphsUnicode = coreGlyphList.getGlyphsUnicode;
var StandardEncoding = coreEncodings.StandardEncoding; var StandardEncoding = coreEncodings.StandardEncoding;
var CFFParser = coreCFFParser.CFFParser;
var coreFonts; // see _setCoreFonts below
var CFFParser; // = coreFonts.CFFParser;
var FontRendererFactory = (function FontRendererFactoryClosure() { var FontRendererFactory = (function FontRendererFactoryClosure() {
function getLong(data, offset) { function getLong(data, offset) {
@ -99,10 +99,10 @@ var FontRendererFactory = (function FontRendererFactoryClosure() {
error('not supported cmap: ' + format); error('not supported cmap: ' + format);
} }
function parseCff(data, start, end) { function parseCff(data, start, end, seacAnalysisEnabled) {
var properties = {}; var properties = {};
var parser = new CFFParser(new Stream(data, start, end - start), var parser = new CFFParser(new Stream(data, start, end - start),
properties); properties, seacAnalysisEnabled);
var cff = parser.parse(); var cff = parser.parse();
return { return {
glyphs: cff.charStrings.objects, glyphs: cff.charStrings.objects,
@ -696,7 +696,7 @@ var FontRendererFactory = (function FontRendererFactoryClosure() {
return { return {
create: function FontRendererFactory_create(font) { create: function FontRendererFactory_create(font, seacAnalysisEnabled) {
var data = new Uint8Array(font.data); var data = new Uint8Array(font.data);
var cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm; var cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm;
var numTables = getUshort(data, 4); var numTables = getUshort(data, 4);
@ -719,7 +719,7 @@ var FontRendererFactory = (function FontRendererFactoryClosure() {
indexToLocFormat = getUshort(data, offset + 50); indexToLocFormat = getUshort(data, offset + 50);
break; break;
case 'CFF ': case 'CFF ':
cff = parseCff(data, offset, offset + length); cff = parseCff(data, offset, offset + length, seacAnalysisEnabled);
break; break;
} }
} }
@ -736,13 +736,5 @@ var FontRendererFactory = (function FontRendererFactoryClosure() {
}; };
})(); })();
// TODO refactor to remove cyclic dependency on fonts.js
function _setCoreFonts(coreFonts_) {
coreFonts = coreFonts_;
CFFParser = coreFonts_.CFFParser;
}
exports._setCoreFonts = _setCoreFonts;
exports.FontRendererFactory = FontRendererFactory; exports.FontRendererFactory = FontRendererFactory;
})); }));

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,5 @@
/* globals expect, it, describe, CFFCompiler, CFFParser, CFFIndex, CFFStrings, /* globals expect, it, describe, CFFCompiler, CFFParser, CFFIndex, CFFStrings,
SEAC_ANALYSIS_ENABLED, Type1Parser, StringStream, Type1Parser, StringStream, SEAC_ANALYSIS_ENABLED */
_enableSeacAnalysis */
'use strict'; 'use strict';
@ -38,7 +37,7 @@ describe('font', function() {
} }
describe('CFFParser', function() { describe('CFFParser', function() {
var parser = new CFFParser(fontData, {}); var parser = new CFFParser(fontData, {}, SEAC_ANALYSIS_ENABLED);
var cff = parser.parse(); var cff = parser.parse();
it('parses header', function() { it('parses header', function() {
@ -117,46 +116,42 @@ describe('font', function() {
}); });
it('parses a CharString endchar with 4 args w/seac enabled', function() { it('parses a CharString endchar with 4 args w/seac enabled', function() {
var seacAnalysisState = SEAC_ANALYSIS_ENABLED; var parser = new CFFParser(fontData, {},
try { /* seacAnalysisEnabled = */ true);
_enableSeacAnalysis(true); var cff = parser.parse();
var bytes = new Uint8Array([0, 1, // count
1, // offsetSize var bytes = new Uint8Array([0, 1, // count
0, // offset[0] 1, // offsetSize
237, 247, 22, 247, 72, 204, 247, 86, 14]); 0, // offset[0]
parser.bytes = bytes; 237, 247, 22, 247, 72, 204, 247, 86, 14]);
var charStringsIndex = parser.parseIndex(0).obj; parser.bytes = bytes;
var result = parser.parseCharStrings(charStringsIndex); var charStringsIndex = parser.parseIndex(0).obj;
expect(result.charStrings.count).toEqual(1); var result = parser.parseCharStrings(charStringsIndex);
expect(result.charStrings.get(0).length).toEqual(1); expect(result.charStrings.count).toEqual(1);
expect(result.seacs.length).toEqual(1); expect(result.charStrings.get(0).length).toEqual(1);
expect(result.seacs[0].length).toEqual(4); expect(result.seacs.length).toEqual(1);
expect(result.seacs[0][0]).toEqual(130); expect(result.seacs[0].length).toEqual(4);
expect(result.seacs[0][1]).toEqual(180); expect(result.seacs[0][0]).toEqual(130);
expect(result.seacs[0][2]).toEqual(65); expect(result.seacs[0][1]).toEqual(180);
expect(result.seacs[0][3]).toEqual(194); expect(result.seacs[0][2]).toEqual(65);
} finally { expect(result.seacs[0][3]).toEqual(194);
_enableSeacAnalysis(seacAnalysisState);
}
}); });
it('parses a CharString endchar with 4 args w/seac disabled', function() { it('parses a CharString endchar with 4 args w/seac disabled', function() {
var seacAnalysisState = SEAC_ANALYSIS_ENABLED; var parser = new CFFParser(fontData, {},
try { /* seacAnalysisEnabled = */ false);
_enableSeacAnalysis(false); var cff = parser.parse();
var bytes = new Uint8Array([0, 1, // count
1, // offsetSize var bytes = new Uint8Array([0, 1, // count
0, // offset[0] 1, // offsetSize
237, 247, 22, 247, 72, 204, 247, 86, 14]); 0, // offset[0]
parser.bytes = bytes; 237, 247, 22, 247, 72, 204, 247, 86, 14]);
var charStringsIndex = parser.parseIndex(0).obj; parser.bytes = bytes;
var result = parser.parseCharStrings(charStringsIndex); var charStringsIndex = parser.parseIndex(0).obj;
expect(result.charStrings.count).toEqual(1); var result = parser.parseCharStrings(charStringsIndex);
expect(result.charStrings.get(0).length).toEqual(9); expect(result.charStrings.count).toEqual(1);
expect(result.seacs.length).toEqual(0); expect(result.charStrings.get(0).length).toEqual(9);
} finally { expect(result.seacs.length).toEqual(0);
_enableSeacAnalysis(seacAnalysisState);
}
}); });
it('parses a CharString endchar no args', function() { it('parses a CharString endchar no args', function() {

View File

@ -48,12 +48,12 @@ function initializePDFJS(callback) {
'pdfjs/core/annotation', 'pdfjs/core/crypto', 'pdfjs/core/stream', 'pdfjs/core/annotation', 'pdfjs/core/crypto', 'pdfjs/core/stream',
'pdfjs/core/fonts', 'pdfjs/core/ps_parser', 'pdfjs/core/function', 'pdfjs/core/fonts', 'pdfjs/core/ps_parser', 'pdfjs/core/function',
'pdfjs/core/parser', 'pdfjs/core/evaluator', 'pdfjs/core/cmap', 'pdfjs/core/parser', 'pdfjs/core/evaluator', 'pdfjs/core/cmap',
'pdfjs/core/worker', 'pdfjs/core/network', 'pdfjs/display/api', 'pdfjs/core/worker', 'pdfjs/core/network', 'pdfjs/core/cff_parser',
'pdfjs/display/metadata', 'pdfjs/display/dom_utils'], 'pdfjs/display/api', 'pdfjs/display/metadata', 'pdfjs/display/dom_utils'],
function (sharedUtil, displayGlobal, corePrimitives, coreAnnotation, function (sharedUtil, displayGlobal, corePrimitives, coreAnnotation,
coreCrypto, coreStream, coreFonts, corePsParser, coreFunction, coreCrypto, coreStream, coreFonts, corePsParser, coreFunction,
coreParser, coreEvaluator, coreCMap, coreWorker, coreNetwork, coreParser, coreEvaluator, coreCMap, coreWorker, coreNetwork,
displayAPI, displayMetadata, displayDOMUtils) { coreCFFParser, displayAPI, displayMetadata, displayDOMUtils) {
pdfjsLibs = { pdfjsLibs = {
sharedUtil: sharedUtil, sharedUtil: sharedUtil,
@ -70,6 +70,7 @@ function initializePDFJS(callback) {
coreCMap: coreCMap, coreCMap: coreCMap,
coreWorker: coreWorker, coreWorker: coreWorker,
coreNetwork: coreNetwork, coreNetwork: coreNetwork,
coreCFFParser: coreCFFParser,
displayAPI: displayAPI, displayAPI: displayAPI,
displayMetadata: displayMetadata, displayMetadata: displayMetadata,
displayDOMUtils: displayDOMUtils displayDOMUtils: displayDOMUtils