Browse Source

Extract `CFFParser` from fonts.js (issue 6777)

Jonas Jenwald 9 years ago
parent
commit
b961e1d21b
  1. 1646
      src/core/cff_parser.js
  2. 32
      src/core/font_renderer.js
  3. 1634
      src/core/fonts.js
  4. 75
      test/unit/font_spec.js
  5. 7
      test/unit/jasmine-boot.js

1646
src/core/cff_parser.js

File diff suppressed because it is too large Load Diff

32
src/core/font_renderer.js

@ -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;
})); }));

1634
src/core/fonts.js

File diff suppressed because it is too large Load Diff

75
test/unit/font_spec.js

@ -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() {

7
test/unit/jasmine-boot.js

@ -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

Loading…
Cancel
Save