2012-09-01 07:48:21 +09:00
|
|
|
|
/* Copyright 2012 Mozilla Foundation
|
|
|
|
|
*
|
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
|
*
|
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
*
|
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
|
* limitations under the License.
|
|
|
|
|
*/
|
2011-10-26 10:18:22 +09:00
|
|
|
|
|
2017-04-02 23:14:30 +09:00
|
|
|
|
import {
|
|
|
|
|
assert, CMapCompressionType, createPromiseCapability, error,
|
|
|
|
|
FONT_IDENTITY_MATRIX, getLookupTableFactory, IDENTITY_MATRIX, ImageKind, info,
|
|
|
|
|
isArray, isNum, isString, NativeImageDecoding, OPS, TextRenderingMode,
|
|
|
|
|
UNSUPPORTED_FEATURES, Util, warn
|
|
|
|
|
} from '../shared/util';
|
|
|
|
|
import { CMapFactory, IdentityCMap } from './cmap';
|
|
|
|
|
import { DecodeStream, JpegStream, Stream } from './stream';
|
|
|
|
|
import {
|
|
|
|
|
Dict, isCmd, isDict, isEOF, isName, isRef, isStream, Name
|
|
|
|
|
} from './primitives';
|
|
|
|
|
import {
|
|
|
|
|
ErrorFont, Font, FontFlags, getFontType, IdentityToUnicodeMap, ToUnicodeMap
|
|
|
|
|
} from './fonts';
|
|
|
|
|
import {
|
|
|
|
|
getEncoding, MacRomanEncoding, StandardEncoding, SymbolSetEncoding,
|
|
|
|
|
WinAnsiEncoding, ZapfDingbatsEncoding
|
|
|
|
|
} from './encodings';
|
|
|
|
|
import {
|
|
|
|
|
getNormalizedUnicodes, getUnicodeForGlyph, reverseIfRtl
|
|
|
|
|
} from './unicode';
|
|
|
|
|
import {
|
|
|
|
|
getSerifFonts, getStdFontMap, getSymbolsFonts
|
|
|
|
|
} from './standard_fonts';
|
|
|
|
|
import { getTilingPatternIR, Pattern } from './pattern';
|
|
|
|
|
import { isPDFFunction, PDFFunction } from './function';
|
|
|
|
|
import { Lexer, Parser } from './parser';
|
|
|
|
|
import { bidi } from './bidi';
|
|
|
|
|
import { ColorSpace } from './colorspace';
|
|
|
|
|
import { getGlyphsUnicode } from './glyphlist';
|
|
|
|
|
import { getMetrics } from './metrics';
|
|
|
|
|
import { MurmurHash3_64 } from './murmurhash3';
|
|
|
|
|
import { PDFImage } from './image';
|
2015-11-22 01:32:47 +09:00
|
|
|
|
|
2011-12-09 07:18:43 +09:00
|
|
|
|
var PartialEvaluator = (function PartialEvaluatorClosure() {
|
Change the signatures of the `PartialEvaluator` "constructor" and its `getOperatorList`/`getTextContent` methods to take parameter objects
Currently these methods accept a large number of parameters, which creates quite unwieldy call-sites. When invoking them, you have to remember not only what arguments to supply, but also the correct order, to avoid runtime errors.
Furthermore, since some of the parameters are optional, you also have to remember to pass e.g. `null` or `undefined` for those ones.
Also, adding new parameters to these methods (which happens occasionally), often becomes unnecessarily tedious (based on personal experience).
Please note that I do *not* think that we need/should convert *every* single method in `evaluator.js` (or elsewhere in `/core` files) to take parameter objects. However, in my opinion, once a method starts relying on approximately five parameter (or even more), passing them in individually becomes quite cumbersome.
With these changes, I obviously needed to update the `evaluator_spec.js` unit-tests. The main change there, except the new method signatures[1], is that it's now re-using *one* `PartialEvalutor` instance, since I couldn't see any compelling reason for creating a new one in every single test.
*Note:* If this patch is accepted, my intention is to (time permitting) see if it makes sense to convert additional methods in `evaluator.js` (and other `/core` files) in a similar fashion, but I figured that it'd be a good idea to limit the initial scope somewhat.
---
[1] A fun fact here, note how the `PartialEvaluator` signature used in `evaluator_spec.js` wasn't even correct in the current `master`.
2017-04-30 06:13:51 +09:00
|
|
|
|
const DefaultPartialEvaluatorOptions = {
|
2016-03-03 09:48:21 +09:00
|
|
|
|
forceDataSchema: false,
|
|
|
|
|
maxImageSize: -1,
|
|
|
|
|
disableFontFace: false,
|
2017-05-08 12:32:44 +09:00
|
|
|
|
nativeImageDecoderSupport: NativeImageDecoding.DECODE,
|
[api-minor] Always allow e.g. rendering to continue even if there are errors, and add a `stopAtErrors` parameter to `getDocument` to opt-out of this behaviour (issue 6342, issue 3795, bug 1130815)
Other PDF readers, e.g. Adobe Reader and PDFium (in Chrome), will attempt to render as much of a page as possible even if there are errors present.
Currently we just bail as soon the first error is hit, which means that we'll usually not render anything in these cases and just display a blank page instead.
NOTE: This patch changes the default behaviour of the PDF.js API to always attempt to recover as much data as possible, even when encountering errors during e.g. `getOperatorList`/`getTextContent`, which thus improve our handling of corrupt PDF files and allow the default viewer to handle errors slightly more gracefully.
In the event that an API consumer wishes to use the old behaviour, where we stop parsing as soon as an error is encountered, the `stopAtErrors` parameter can be set at `getDocument`.
Fixes, inasmuch it's possible since the PDF files are corrupt, e.g. issue 6342, issue 3795, and [bug 1130815](https://bugzilla.mozilla.org/show_bug.cgi?id=1130815) (and probably others too).
2017-02-19 22:03:08 +09:00
|
|
|
|
ignoreErrors: false,
|
2016-03-03 09:48:21 +09:00
|
|
|
|
};
|
|
|
|
|
|
2016-04-01 21:36:16 +09:00
|
|
|
|
function NativeImageDecoder(xref, resources, handler, forceDataSchema) {
|
|
|
|
|
this.xref = xref;
|
|
|
|
|
this.resources = resources;
|
|
|
|
|
this.handler = handler;
|
|
|
|
|
this.forceDataSchema = forceDataSchema;
|
|
|
|
|
}
|
|
|
|
|
NativeImageDecoder.prototype = {
|
2017-04-27 19:58:44 +09:00
|
|
|
|
canDecode(image) {
|
2016-04-01 21:36:16 +09:00
|
|
|
|
return image instanceof JpegStream &&
|
|
|
|
|
NativeImageDecoder.isDecodable(image, this.xref, this.resources);
|
|
|
|
|
},
|
2017-04-27 19:58:44 +09:00
|
|
|
|
decode(image) {
|
2016-04-01 21:36:16 +09:00
|
|
|
|
// For natively supported JPEGs send them to the main thread for decoding.
|
|
|
|
|
var dict = image.dict;
|
|
|
|
|
var colorSpace = dict.get('ColorSpace', 'CS');
|
|
|
|
|
colorSpace = ColorSpace.parse(colorSpace, this.xref, this.resources);
|
|
|
|
|
var numComps = colorSpace.numComps;
|
|
|
|
|
var decodePromise = this.handler.sendWithPromise('JpegDecode',
|
|
|
|
|
[image.getIR(this.forceDataSchema), numComps]);
|
|
|
|
|
return decodePromise.then(function (message) {
|
|
|
|
|
var data = message.data;
|
|
|
|
|
return new Stream(data, 0, data.length, image.dict);
|
|
|
|
|
});
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
},
|
2016-04-01 21:36:16 +09:00
|
|
|
|
};
|
|
|
|
|
/**
|
|
|
|
|
* Checks if the image can be decoded and displayed by the browser without any
|
|
|
|
|
* further processing such as color space conversions.
|
|
|
|
|
*/
|
|
|
|
|
NativeImageDecoder.isSupported =
|
|
|
|
|
function NativeImageDecoder_isSupported(image, xref, res) {
|
2016-09-22 21:07:20 +09:00
|
|
|
|
var dict = image.dict;
|
|
|
|
|
if (dict.has('DecodeParms') || dict.has('DP')) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
var cs = ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res);
|
2016-04-01 21:36:16 +09:00
|
|
|
|
return (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB') &&
|
2016-09-22 21:07:20 +09:00
|
|
|
|
cs.isDefaultDecode(dict.getArray('Decode', 'D'));
|
2016-04-01 21:36:16 +09:00
|
|
|
|
};
|
|
|
|
|
/**
|
|
|
|
|
* Checks if the image can be decoded by the browser.
|
|
|
|
|
*/
|
|
|
|
|
NativeImageDecoder.isDecodable =
|
|
|
|
|
function NativeImageDecoder_isDecodable(image, xref, res) {
|
2016-09-22 21:07:20 +09:00
|
|
|
|
var dict = image.dict;
|
|
|
|
|
if (dict.has('DecodeParms') || dict.has('DP')) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
var cs = ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res);
|
2016-04-01 21:36:16 +09:00
|
|
|
|
return (cs.numComps === 1 || cs.numComps === 3) &&
|
2016-09-22 21:07:20 +09:00
|
|
|
|
cs.isDefaultDecode(dict.getArray('Decode', 'D'));
|
2016-04-01 21:36:16 +09:00
|
|
|
|
};
|
|
|
|
|
|
Change the signatures of the `PartialEvaluator` "constructor" and its `getOperatorList`/`getTextContent` methods to take parameter objects
Currently these methods accept a large number of parameters, which creates quite unwieldy call-sites. When invoking them, you have to remember not only what arguments to supply, but also the correct order, to avoid runtime errors.
Furthermore, since some of the parameters are optional, you also have to remember to pass e.g. `null` or `undefined` for those ones.
Also, adding new parameters to these methods (which happens occasionally), often becomes unnecessarily tedious (based on personal experience).
Please note that I do *not* think that we need/should convert *every* single method in `evaluator.js` (or elsewhere in `/core` files) to take parameter objects. However, in my opinion, once a method starts relying on approximately five parameter (or even more), passing them in individually becomes quite cumbersome.
With these changes, I obviously needed to update the `evaluator_spec.js` unit-tests. The main change there, except the new method signatures[1], is that it's now re-using *one* `PartialEvalutor` instance, since I couldn't see any compelling reason for creating a new one in every single test.
*Note:* If this patch is accepted, my intention is to (time permitting) see if it makes sense to convert additional methods in `evaluator.js` (and other `/core` files) in a similar fashion, but I figured that it'd be a good idea to limit the initial scope somewhat.
---
[1] A fun fact here, note how the `PartialEvaluator` signature used in `evaluator_spec.js` wasn't even correct in the current `master`.
2017-04-30 06:13:51 +09:00
|
|
|
|
function PartialEvaluator({ pdfManager, xref, handler, pageIndex, idFactory,
|
|
|
|
|
fontCache, builtInCMapCache, options = null, }) {
|
2013-04-19 02:41:33 +09:00
|
|
|
|
this.pdfManager = pdfManager;
|
2011-10-25 08:55:23 +09:00
|
|
|
|
this.xref = xref;
|
|
|
|
|
this.handler = handler;
|
2012-10-29 05:10:34 +09:00
|
|
|
|
this.pageIndex = pageIndex;
|
2017-01-09 00:51:30 +09:00
|
|
|
|
this.idFactory = idFactory;
|
2013-11-15 06:43:38 +09:00
|
|
|
|
this.fontCache = fontCache;
|
2017-02-14 22:28:31 +09:00
|
|
|
|
this.builtInCMapCache = builtInCMapCache;
|
2016-03-03 09:48:21 +09:00
|
|
|
|
this.options = options || DefaultPartialEvaluatorOptions;
|
2017-02-12 23:54:41 +09:00
|
|
|
|
|
2017-04-27 19:58:44 +09:00
|
|
|
|
this.fetchBuiltInCMap = (name) => {
|
|
|
|
|
var cachedCMap = this.builtInCMapCache[name];
|
2017-02-14 22:28:31 +09:00
|
|
|
|
if (cachedCMap) {
|
|
|
|
|
return Promise.resolve(cachedCMap);
|
|
|
|
|
}
|
Change the signatures of the `PartialEvaluator` "constructor" and its `getOperatorList`/`getTextContent` methods to take parameter objects
Currently these methods accept a large number of parameters, which creates quite unwieldy call-sites. When invoking them, you have to remember not only what arguments to supply, but also the correct order, to avoid runtime errors.
Furthermore, since some of the parameters are optional, you also have to remember to pass e.g. `null` or `undefined` for those ones.
Also, adding new parameters to these methods (which happens occasionally), often becomes unnecessarily tedious (based on personal experience).
Please note that I do *not* think that we need/should convert *every* single method in `evaluator.js` (or elsewhere in `/core` files) to take parameter objects. However, in my opinion, once a method starts relying on approximately five parameter (or even more), passing them in individually becomes quite cumbersome.
With these changes, I obviously needed to update the `evaluator_spec.js` unit-tests. The main change there, except the new method signatures[1], is that it's now re-using *one* `PartialEvalutor` instance, since I couldn't see any compelling reason for creating a new one in every single test.
*Note:* If this patch is accepted, my intention is to (time permitting) see if it makes sense to convert additional methods in `evaluator.js` (and other `/core` files) in a similar fashion, but I figured that it'd be a good idea to limit the initial scope somewhat.
---
[1] A fun fact here, note how the `PartialEvaluator` signature used in `evaluator_spec.js` wasn't even correct in the current `master`.
2017-04-30 06:13:51 +09:00
|
|
|
|
return this.handler.sendWithPromise('FetchBuiltInCMap', {
|
2017-04-27 19:58:44 +09:00
|
|
|
|
name,
|
|
|
|
|
}).then((data) => {
|
2017-02-14 22:28:31 +09:00
|
|
|
|
if (data.compressionType !== CMapCompressionType.NONE) {
|
|
|
|
|
// Given the size of uncompressed CMaps, only cache compressed ones.
|
2017-04-27 19:58:44 +09:00
|
|
|
|
this.builtInCMapCache[name] = data;
|
2017-02-14 22:28:31 +09:00
|
|
|
|
}
|
|
|
|
|
return data;
|
2017-02-12 23:54:41 +09:00
|
|
|
|
});
|
|
|
|
|
};
|
2011-10-25 08:55:23 +09:00
|
|
|
|
}
|
|
|
|
|
|
2014-05-10 10:41:03 +09:00
|
|
|
|
// Trying to minimize Date.now() usage and check every 100 time
|
|
|
|
|
var TIME_SLOT_DURATION_MS = 20;
|
|
|
|
|
var CHECK_TIME_EVERY = 100;
|
|
|
|
|
function TimeSlotManager() {
|
|
|
|
|
this.reset();
|
|
|
|
|
}
|
|
|
|
|
TimeSlotManager.prototype = {
|
|
|
|
|
check: function TimeSlotManager_check() {
|
|
|
|
|
if (++this.checked < CHECK_TIME_EVERY) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
this.checked = 0;
|
|
|
|
|
return this.endTime <= Date.now();
|
|
|
|
|
},
|
|
|
|
|
reset: function TimeSlotManager_reset() {
|
|
|
|
|
this.endTime = Date.now() + TIME_SLOT_DURATION_MS;
|
|
|
|
|
this.checked = 0;
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
},
|
2014-05-10 10:41:03 +09:00
|
|
|
|
};
|
|
|
|
|
|
2017-04-11 03:58:02 +09:00
|
|
|
|
// Convert PDF blend mode names to HTML5 blend mode names.
|
|
|
|
|
function normalizeBlendMode(value) {
|
|
|
|
|
if (!isName(value)) {
|
|
|
|
|
return 'source-over';
|
|
|
|
|
}
|
|
|
|
|
switch (value.name) {
|
|
|
|
|
case 'Normal':
|
|
|
|
|
case 'Compatible':
|
|
|
|
|
return 'source-over';
|
|
|
|
|
case 'Multiply':
|
|
|
|
|
return 'multiply';
|
|
|
|
|
case 'Screen':
|
|
|
|
|
return 'screen';
|
|
|
|
|
case 'Overlay':
|
|
|
|
|
return 'overlay';
|
|
|
|
|
case 'Darken':
|
|
|
|
|
return 'darken';
|
|
|
|
|
case 'Lighten':
|
|
|
|
|
return 'lighten';
|
|
|
|
|
case 'ColorDodge':
|
|
|
|
|
return 'color-dodge';
|
|
|
|
|
case 'ColorBurn':
|
|
|
|
|
return 'color-burn';
|
|
|
|
|
case 'HardLight':
|
|
|
|
|
return 'hard-light';
|
|
|
|
|
case 'SoftLight':
|
|
|
|
|
return 'soft-light';
|
|
|
|
|
case 'Difference':
|
|
|
|
|
return 'difference';
|
|
|
|
|
case 'Exclusion':
|
|
|
|
|
return 'exclusion';
|
|
|
|
|
case 'Hue':
|
|
|
|
|
return 'hue';
|
|
|
|
|
case 'Saturation':
|
|
|
|
|
return 'saturation';
|
|
|
|
|
case 'Color':
|
|
|
|
|
return 'color';
|
|
|
|
|
case 'Luminosity':
|
|
|
|
|
return 'luminosity';
|
|
|
|
|
}
|
|
|
|
|
warn('Unsupported blend mode: ' + value.name);
|
|
|
|
|
return 'source-over';
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-10 10:41:03 +09:00
|
|
|
|
var deferred = Promise.resolve();
|
|
|
|
|
|
2013-04-09 07:14:56 +09:00
|
|
|
|
var TILING_PATTERN = 1, SHADING_PATTERN = 2;
|
|
|
|
|
|
2011-12-09 07:18:43 +09:00
|
|
|
|
PartialEvaluator.prototype = {
|
2017-04-27 19:58:44 +09:00
|
|
|
|
clone(newOptions = DefaultPartialEvaluatorOptions) {
|
2017-04-05 20:32:36 +09:00
|
|
|
|
var newEvaluator = Object.create(this);
|
|
|
|
|
newEvaluator.options = newOptions;
|
|
|
|
|
return newEvaluator;
|
|
|
|
|
},
|
|
|
|
|
|
2013-08-01 03:17:36 +09:00
|
|
|
|
hasBlendModes: function PartialEvaluator_hasBlendModes(resources) {
|
|
|
|
|
if (!isDict(resources)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2014-03-26 23:07:38 +09:00
|
|
|
|
var processed = Object.create(null);
|
|
|
|
|
if (resources.objId) {
|
|
|
|
|
processed[resources.objId] = true;
|
|
|
|
|
}
|
|
|
|
|
|
2016-02-10 01:09:17 +09:00
|
|
|
|
var nodes = [resources], xref = this.xref;
|
2013-08-01 03:17:36 +09:00
|
|
|
|
while (nodes.length) {
|
2016-02-10 01:09:17 +09:00
|
|
|
|
var key, i, ii;
|
2013-08-01 03:17:36 +09:00
|
|
|
|
var node = nodes.shift();
|
|
|
|
|
// First check the current resources for blend modes.
|
|
|
|
|
var graphicStates = node.get('ExtGState');
|
|
|
|
|
if (isDict(graphicStates)) {
|
2016-02-10 01:09:17 +09:00
|
|
|
|
var graphicStatesKeys = graphicStates.getKeys();
|
|
|
|
|
for (i = 0, ii = graphicStatesKeys.length; i < ii; i++) {
|
|
|
|
|
key = graphicStatesKeys[i];
|
|
|
|
|
|
|
|
|
|
var graphicState = graphicStates.get(key);
|
|
|
|
|
var bm = graphicState.get('BM');
|
2013-08-01 03:17:36 +09:00
|
|
|
|
if (isName(bm) && bm.name !== 'Normal') {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Descend into the XObjects to look for more resources and blend modes.
|
|
|
|
|
var xObjects = node.get('XObject');
|
|
|
|
|
if (!isDict(xObjects)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2016-02-10 01:09:17 +09:00
|
|
|
|
var xObjectsKeys = xObjects.getKeys();
|
|
|
|
|
for (i = 0, ii = xObjectsKeys.length; i < ii; i++) {
|
|
|
|
|
key = xObjectsKeys[i];
|
|
|
|
|
|
|
|
|
|
var xObject = xObjects.getRaw(key);
|
|
|
|
|
if (isRef(xObject)) {
|
|
|
|
|
if (processed[xObject.toString()]) {
|
|
|
|
|
// The XObject has already been processed, and by avoiding a
|
|
|
|
|
// redundant `xref.fetch` we can *significantly* reduce the load
|
|
|
|
|
// time for badly generated PDF files (fixes issue6961.pdf).
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
xObject = xref.fetch(xObject);
|
|
|
|
|
}
|
2013-08-01 03:17:36 +09:00
|
|
|
|
if (!isStream(xObject)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2014-06-10 18:29:25 +09:00
|
|
|
|
if (xObject.dict.objId) {
|
|
|
|
|
if (processed[xObject.dict.objId]) {
|
|
|
|
|
// stream has objId and is processed already
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
processed[xObject.dict.objId] = true;
|
|
|
|
|
}
|
2013-08-01 03:17:36 +09:00
|
|
|
|
var xResources = xObject.dict.get('Resources');
|
2014-03-26 23:07:38 +09:00
|
|
|
|
// Checking objId to detect an infinite loop.
|
|
|
|
|
if (isDict(xResources) &&
|
|
|
|
|
(!xResources.objId || !processed[xResources.objId])) {
|
2013-08-01 03:17:36 +09:00
|
|
|
|
nodes.push(xResources);
|
2014-03-26 23:07:38 +09:00
|
|
|
|
if (xResources.objId) {
|
|
|
|
|
processed[xResources.objId] = true;
|
|
|
|
|
}
|
2013-08-01 03:17:36 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
},
|
2012-09-14 00:09:46 +09:00
|
|
|
|
|
2013-04-09 07:14:56 +09:00
|
|
|
|
buildFormXObject: function PartialEvaluator_buildFormXObject(resources,
|
2013-08-01 03:17:36 +09:00
|
|
|
|
xobj, smask,
|
2014-01-17 22:16:52 +09:00
|
|
|
|
operatorList,
|
2015-10-21 10:50:32 +09:00
|
|
|
|
task,
|
2014-04-10 08:44:07 +09:00
|
|
|
|
initialState) {
|
[api-minor] Always allow e.g. rendering to continue even if there are errors, and add a `stopAtErrors` parameter to `getDocument` to opt-out of this behaviour (issue 6342, issue 3795, bug 1130815)
Other PDF readers, e.g. Adobe Reader and PDFium (in Chrome), will attempt to render as much of a page as possible even if there are errors present.
Currently we just bail as soon the first error is hit, which means that we'll usually not render anything in these cases and just display a blank page instead.
NOTE: This patch changes the default behaviour of the PDF.js API to always attempt to recover as much data as possible, even when encountering errors during e.g. `getOperatorList`/`getTextContent`, which thus improve our handling of corrupt PDF files and allow the default viewer to handle errors slightly more gracefully.
In the event that an API consumer wishes to use the old behaviour, where we stop parsing as soon as an error is encountered, the `stopAtErrors` parameter can be set at `getDocument`.
Fixes, inasmuch it's possible since the PDF files are corrupt, e.g. issue 6342, issue 3795, and [bug 1130815](https://bugzilla.mozilla.org/show_bug.cgi?id=1130815) (and probably others too).
2017-02-19 22:03:08 +09:00
|
|
|
|
var dict = xobj.dict;
|
|
|
|
|
var matrix = dict.getArray('Matrix');
|
|
|
|
|
var bbox = dict.getArray('BBox');
|
|
|
|
|
var group = dict.get('Group');
|
2013-04-09 07:14:56 +09:00
|
|
|
|
if (group) {
|
|
|
|
|
var groupOptions = {
|
2017-04-27 19:58:44 +09:00
|
|
|
|
matrix,
|
|
|
|
|
bbox,
|
|
|
|
|
smask,
|
2013-04-09 07:14:56 +09:00
|
|
|
|
isolated: false,
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
knockout: false,
|
2012-10-16 01:48:45 +09:00
|
|
|
|
};
|
2013-04-09 07:14:56 +09:00
|
|
|
|
|
|
|
|
|
var groupSubtype = group.get('S');
|
2014-05-22 02:47:42 +09:00
|
|
|
|
var colorSpace;
|
2016-08-04 22:13:37 +09:00
|
|
|
|
if (isName(groupSubtype, 'Transparency')) {
|
2014-03-23 03:15:51 +09:00
|
|
|
|
groupOptions.isolated = (group.get('I') || false);
|
|
|
|
|
groupOptions.knockout = (group.get('K') || false);
|
2014-05-22 02:47:42 +09:00
|
|
|
|
colorSpace = (group.has('CS') ?
|
|
|
|
|
ColorSpace.parse(group.get('CS'), this.xref, resources) : null);
|
2013-04-09 07:14:56 +09:00
|
|
|
|
}
|
2014-05-22 02:47:42 +09:00
|
|
|
|
|
|
|
|
|
if (smask && smask.backdrop) {
|
|
|
|
|
colorSpace = colorSpace || ColorSpace.singletons.rgb;
|
|
|
|
|
smask.backdrop = colorSpace.getRgb(smask.backdrop, 0);
|
|
|
|
|
}
|
|
|
|
|
|
2013-11-14 04:43:38 +09:00
|
|
|
|
operatorList.addOp(OPS.beginGroup, [groupOptions]);
|
2012-10-16 01:48:45 +09:00
|
|
|
|
}
|
2012-09-14 00:09:46 +09:00
|
|
|
|
|
2013-11-14 04:43:38 +09:00
|
|
|
|
operatorList.addOp(OPS.paintFormXObjectBegin, [matrix, bbox]);
|
2012-09-14 00:09:46 +09:00
|
|
|
|
|
Change the signatures of the `PartialEvaluator` "constructor" and its `getOperatorList`/`getTextContent` methods to take parameter objects
Currently these methods accept a large number of parameters, which creates quite unwieldy call-sites. When invoking them, you have to remember not only what arguments to supply, but also the correct order, to avoid runtime errors.
Furthermore, since some of the parameters are optional, you also have to remember to pass e.g. `null` or `undefined` for those ones.
Also, adding new parameters to these methods (which happens occasionally), often becomes unnecessarily tedious (based on personal experience).
Please note that I do *not* think that we need/should convert *every* single method in `evaluator.js` (or elsewhere in `/core` files) to take parameter objects. However, in my opinion, once a method starts relying on approximately five parameter (or even more), passing them in individually becomes quite cumbersome.
With these changes, I obviously needed to update the `evaluator_spec.js` unit-tests. The main change there, except the new method signatures[1], is that it's now re-using *one* `PartialEvalutor` instance, since I couldn't see any compelling reason for creating a new one in every single test.
*Note:* If this patch is accepted, my intention is to (time permitting) see if it makes sense to convert additional methods in `evaluator.js` (and other `/core` files) in a similar fashion, but I figured that it'd be a good idea to limit the initial scope somewhat.
---
[1] A fun fact here, note how the `PartialEvaluator` signature used in `evaluator_spec.js` wasn't even correct in the current `master`.
2017-04-30 06:13:51 +09:00
|
|
|
|
return this.getOperatorList({
|
|
|
|
|
stream: xobj,
|
|
|
|
|
task,
|
|
|
|
|
resources: dict.get('Resources') || resources,
|
|
|
|
|
operatorList,
|
|
|
|
|
initialState,
|
|
|
|
|
}).then(function () {
|
|
|
|
|
operatorList.addOp(OPS.paintFormXObjectEnd, []);
|
|
|
|
|
|
|
|
|
|
if (group) {
|
|
|
|
|
operatorList.addOp(OPS.endGroup, [groupOptions]);
|
|
|
|
|
}
|
|
|
|
|
});
|
2013-04-09 07:14:56 +09:00
|
|
|
|
},
|
2011-10-25 08:55:23 +09:00
|
|
|
|
|
2014-03-23 03:15:51 +09:00
|
|
|
|
buildPaintImageXObject:
|
|
|
|
|
function PartialEvaluator_buildPaintImageXObject(resources, image,
|
|
|
|
|
inline, operatorList,
|
2014-10-27 01:03:44 +09:00
|
|
|
|
cacheKey, imageCache) {
|
2013-04-09 07:14:56 +09:00
|
|
|
|
var dict = image.dict;
|
|
|
|
|
var w = dict.get('Width', 'W');
|
|
|
|
|
var h = dict.get('Height', 'H');
|
2011-10-25 08:55:23 +09:00
|
|
|
|
|
2014-04-09 20:04:27 +09:00
|
|
|
|
if (!(w && isNum(w)) || !(h && isNum(h))) {
|
|
|
|
|
warn('Image dimensions are missing, or not numbers.');
|
|
|
|
|
return;
|
|
|
|
|
}
|
2016-03-03 09:48:21 +09:00
|
|
|
|
var maxImageSize = this.options.maxImageSize;
|
|
|
|
|
if (maxImageSize !== -1 && w * h > maxImageSize) {
|
2013-07-11 01:52:37 +09:00
|
|
|
|
warn('Image exceeded maximum allowed size and was removed.');
|
2013-08-01 03:17:36 +09:00
|
|
|
|
return;
|
2013-07-11 01:52:37 +09:00
|
|
|
|
}
|
|
|
|
|
|
2014-03-23 03:15:51 +09:00
|
|
|
|
var imageMask = (dict.get('ImageMask', 'IM') || false);
|
2014-04-08 06:42:54 +09:00
|
|
|
|
var imgData, args;
|
2013-04-09 07:14:56 +09:00
|
|
|
|
if (imageMask) {
|
2014-03-23 03:15:51 +09:00
|
|
|
|
// This depends on a tmpCanvas being filled with the
|
2013-04-09 07:14:56 +09:00
|
|
|
|
// current fillStyle, such that processing the pixel
|
|
|
|
|
// data can't be done here. Instead of creating a
|
|
|
|
|
// complete PDFImage, only read the information needed
|
|
|
|
|
// for later.
|
|
|
|
|
|
|
|
|
|
var width = dict.get('Width', 'W');
|
|
|
|
|
var height = dict.get('Height', 'H');
|
|
|
|
|
var bitStrideLength = (width + 7) >> 3;
|
|
|
|
|
var imgArray = image.getBytes(bitStrideLength * height);
|
2016-05-06 02:16:35 +09:00
|
|
|
|
var decode = dict.getArray('Decode', 'D');
|
2014-03-23 03:15:51 +09:00
|
|
|
|
var inverseDecode = (!!decode && decode[0] > 0);
|
2013-04-09 07:14:56 +09:00
|
|
|
|
|
2014-04-08 06:42:54 +09:00
|
|
|
|
imgData = PDFImage.createMask(imgArray, width, height,
|
2014-06-13 09:37:41 +09:00
|
|
|
|
image instanceof DecodeStream,
|
|
|
|
|
inverseDecode);
|
2014-02-25 00:59:02 +09:00
|
|
|
|
imgData.cached = true;
|
2014-04-08 06:42:54 +09:00
|
|
|
|
args = [imgData];
|
2014-02-25 00:59:02 +09:00
|
|
|
|
operatorList.addOp(OPS.paintImageMaskXObject, args);
|
|
|
|
|
if (cacheKey) {
|
2014-10-27 01:03:44 +09:00
|
|
|
|
imageCache[cacheKey] = {
|
|
|
|
|
fn: OPS.paintImageMaskXObject,
|
2017-04-27 19:58:44 +09:00
|
|
|
|
args,
|
2014-10-27 01:03:44 +09:00
|
|
|
|
};
|
2014-02-25 00:59:02 +09:00
|
|
|
|
}
|
2013-08-01 03:17:36 +09:00
|
|
|
|
return;
|
2013-04-09 07:14:56 +09:00
|
|
|
|
}
|
|
|
|
|
|
2014-03-23 03:15:51 +09:00
|
|
|
|
var softMask = (dict.get('SMask', 'SM') || false);
|
|
|
|
|
var mask = (dict.get('Mask') || false);
|
2013-04-09 07:14:56 +09:00
|
|
|
|
|
|
|
|
|
var SMALL_IMAGE_DIMENSIONS = 200;
|
|
|
|
|
// Inlining small images into the queue as RGB data
|
2014-03-23 03:15:51 +09:00
|
|
|
|
if (inline && !softMask && !mask && !(image instanceof JpegStream) &&
|
2013-04-09 07:14:56 +09:00
|
|
|
|
(w + h) < SMALL_IMAGE_DIMENSIONS) {
|
|
|
|
|
var imageObj = new PDFImage(this.xref, resources, image,
|
|
|
|
|
inline, null, null);
|
2014-02-26 08:11:15 +09:00
|
|
|
|
// We force the use of RGBA_32BPP images here, because we can't handle
|
|
|
|
|
// any other kind.
|
2014-04-08 06:42:54 +09:00
|
|
|
|
imgData = imageObj.createImageData(/* forceRGBA = */ true);
|
2013-11-14 04:43:38 +09:00
|
|
|
|
operatorList.addOp(OPS.paintInlineImageXObject, [imgData]);
|
2013-08-01 03:17:36 +09:00
|
|
|
|
return;
|
2011-10-25 08:55:23 +09:00
|
|
|
|
}
|
|
|
|
|
|
2017-05-08 12:32:44 +09:00
|
|
|
|
var nativeImageDecoderSupport = this.options.nativeImageDecoderSupport;
|
2013-04-09 07:14:56 +09:00
|
|
|
|
// If there is no imageMask, create the PDFImage and a lot
|
|
|
|
|
// of image processing can be done here.
|
2017-01-09 00:51:30 +09:00
|
|
|
|
var objId = 'img_' + this.idFactory.createObjId();
|
2013-08-01 03:17:36 +09:00
|
|
|
|
operatorList.addDependency(objId);
|
2014-04-08 06:42:54 +09:00
|
|
|
|
args = [objId, w, h];
|
2013-04-09 07:14:56 +09:00
|
|
|
|
|
2017-05-08 12:32:44 +09:00
|
|
|
|
if (nativeImageDecoderSupport !== NativeImageDecoding.NONE &&
|
2017-02-07 06:09:19 +09:00
|
|
|
|
!softMask && !mask && image instanceof JpegStream &&
|
2016-04-01 21:36:16 +09:00
|
|
|
|
NativeImageDecoder.isSupported(image, this.xref, resources)) {
|
2013-04-09 07:14:56 +09:00
|
|
|
|
// These JPEGs don't need any more processing so we can just send it.
|
2013-11-14 04:43:38 +09:00
|
|
|
|
operatorList.addOp(OPS.paintJpegXObject, args);
|
Cache JPEG images, just as we do for other image formats, in `evaluator.js` (issue 8380)
For some reason, we're putting all kind of images *except* JPEG into the `imageCache` in `evaluator.js`.[1]
This means that in the PDF file in issue 8380, we'll keep sending the *same* two small images[2] to the main-thread and decoding them over and over. This is obviously hugely inefficient!
As can be seen from the discussion in the issue, the performance becomes *extremely* bad if the user has the addon "Adblock Plus" installed. However, even in a clean Firefox profile, the performance isn't that great.
This patch not only addresses the performance implications of the "Adblock Plus" addon together with that particular PDF file, but it *also* improves the rendering times considerably for *all* users.
Locally, with a clean profile, the rendering times are reduced from `~2000 ms` to `~500 ms` for my setup!
Obviously, the general structure of the PDF file and its operator sequence is still hugely inefficient, however I'd say that the performance with this patch is good enough to consider the issue (as it stands) resolved.[3]
Fixes 8380.
---
[1] Not technically true, since inline images are cached from `parser.js`, but whatever :-)
[2] The two JPEG images have dimensions 1x2, respectively 4x2.
[3] To make this even more efficient, a new state would have to be added to the `QueueOptimizer`. Given that PDF files this stupid fortunately aren't too common, I'm not convinced that it's worth doing.
2017-05-07 19:34:47 +09:00
|
|
|
|
this.handler.send('obj', [objId, this.pageIndex, 'JpegStream',
|
|
|
|
|
image.getIR(this.options.forceDataSchema)]);
|
|
|
|
|
if (cacheKey) {
|
|
|
|
|
imageCache[cacheKey] = {
|
|
|
|
|
fn: OPS.paintJpegXObject,
|
|
|
|
|
args,
|
|
|
|
|
};
|
|
|
|
|
}
|
2013-08-01 03:17:36 +09:00
|
|
|
|
return;
|
2013-04-09 07:14:56 +09:00
|
|
|
|
}
|
|
|
|
|
|
2016-04-01 21:36:16 +09:00
|
|
|
|
// Creates native image decoder only if a JPEG image or mask is present.
|
|
|
|
|
var nativeImageDecoder = null;
|
2017-05-08 12:32:44 +09:00
|
|
|
|
if (nativeImageDecoderSupport === NativeImageDecoding.DECODE &&
|
2017-02-07 06:09:19 +09:00
|
|
|
|
(image instanceof JpegStream || mask instanceof JpegStream ||
|
|
|
|
|
softMask instanceof JpegStream)) {
|
2017-04-30 06:36:43 +09:00
|
|
|
|
nativeImageDecoder = new NativeImageDecoder(this.xref, resources,
|
|
|
|
|
this.handler, this.options.forceDataSchema);
|
2016-04-01 21:36:16 +09:00
|
|
|
|
}
|
|
|
|
|
|
2017-04-30 06:36:43 +09:00
|
|
|
|
PDFImage.buildImage(this.handler, this.xref, resources, image, inline,
|
|
|
|
|
nativeImageDecoder).then((imageObj) => {
|
|
|
|
|
var imgData = imageObj.createImageData(/* forceRGBA = */ false);
|
|
|
|
|
this.handler.send('obj', [objId, this.pageIndex, 'Image', imgData],
|
|
|
|
|
[imgData.data.buffer]);
|
|
|
|
|
}).catch((reason) => {
|
|
|
|
|
warn('Unable to decode image: ' + reason);
|
|
|
|
|
this.handler.send('obj', [objId, this.pageIndex, 'Image', null]);
|
|
|
|
|
});
|
2014-03-23 03:15:51 +09:00
|
|
|
|
|
2013-11-14 04:43:38 +09:00
|
|
|
|
operatorList.addOp(OPS.paintImageXObject, args);
|
2014-02-24 23:00:08 +09:00
|
|
|
|
if (cacheKey) {
|
2014-10-27 01:03:44 +09:00
|
|
|
|
imageCache[cacheKey] = {
|
|
|
|
|
fn: OPS.paintImageXObject,
|
2017-04-27 19:58:44 +09:00
|
|
|
|
args,
|
2014-10-27 01:03:44 +09:00
|
|
|
|
};
|
2014-02-24 23:00:08 +09:00
|
|
|
|
}
|
2013-04-09 07:14:56 +09:00
|
|
|
|
},
|
|
|
|
|
|
2014-01-24 02:13:32 +09:00
|
|
|
|
handleSMask: function PartialEvaluator_handleSmask(smask, resources,
|
2015-10-21 10:50:32 +09:00
|
|
|
|
operatorList, task,
|
2014-04-10 08:44:07 +09:00
|
|
|
|
stateManager) {
|
2014-01-24 02:13:32 +09:00
|
|
|
|
var smaskContent = smask.get('G');
|
|
|
|
|
var smaskOptions = {
|
|
|
|
|
subtype: smask.get('S').name,
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
backdrop: smask.get('BC'),
|
2014-01-24 02:13:32 +09:00
|
|
|
|
};
|
2015-12-05 03:52:45 +09:00
|
|
|
|
|
|
|
|
|
// The SMask might have a alpha/luminosity value transfer function --
|
|
|
|
|
// we will build a map of integer values in range 0..255 to be fast.
|
|
|
|
|
var transferObj = smask.get('TR');
|
|
|
|
|
if (isPDFFunction(transferObj)) {
|
|
|
|
|
var transferFn = PDFFunction.parse(this.xref, transferObj);
|
|
|
|
|
var transferMap = new Uint8Array(256);
|
|
|
|
|
var tmp = new Float32Array(1);
|
2016-02-03 21:31:48 +09:00
|
|
|
|
for (var i = 0; i < 256; i++) {
|
2015-12-05 03:52:45 +09:00
|
|
|
|
tmp[0] = i / 255;
|
|
|
|
|
transferFn(tmp, 0, tmp, 0);
|
|
|
|
|
transferMap[i] = (tmp[0] * 255) | 0;
|
|
|
|
|
}
|
|
|
|
|
smaskOptions.transferMap = transferMap;
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-10 10:21:15 +09:00
|
|
|
|
return this.buildFormXObject(resources, smaskContent, smaskOptions,
|
[api-minor] Always allow e.g. rendering to continue even if there are errors, and add a `stopAtErrors` parameter to `getDocument` to opt-out of this behaviour (issue 6342, issue 3795, bug 1130815)
Other PDF readers, e.g. Adobe Reader and PDFium (in Chrome), will attempt to render as much of a page as possible even if there are errors present.
Currently we just bail as soon the first error is hit, which means that we'll usually not render anything in these cases and just display a blank page instead.
NOTE: This patch changes the default behaviour of the PDF.js API to always attempt to recover as much data as possible, even when encountering errors during e.g. `getOperatorList`/`getTextContent`, which thus improve our handling of corrupt PDF files and allow the default viewer to handle errors slightly more gracefully.
In the event that an API consumer wishes to use the old behaviour, where we stop parsing as soon as an error is encountered, the `stopAtErrors` parameter can be set at `getDocument`.
Fixes, inasmuch it's possible since the PDF files are corrupt, e.g. issue 6342, issue 3795, and [bug 1130815](https://bugzilla.mozilla.org/show_bug.cgi?id=1130815) (and probably others too).
2017-02-19 22:03:08 +09:00
|
|
|
|
operatorList, task,
|
|
|
|
|
stateManager.state.clone());
|
2014-01-24 02:13:32 +09:00
|
|
|
|
},
|
|
|
|
|
|
2017-05-24 19:12:14 +09:00
|
|
|
|
handleTilingType(fn, args, resources, pattern, patternDict, operatorList,
|
|
|
|
|
task) {
|
2013-04-09 07:14:56 +09:00
|
|
|
|
// Create an IR of the pattern code.
|
2017-05-24 19:12:14 +09:00
|
|
|
|
let tilingOpList = new OperatorList();
|
2015-10-21 03:22:06 +09:00
|
|
|
|
// Merge the available resources, to prevent issues when the patternDict
|
|
|
|
|
// is missing some /Resources entries (fixes issue6541.pdf).
|
2017-05-24 19:12:14 +09:00
|
|
|
|
let resourcesArray = [patternDict.get('Resources'), resources];
|
|
|
|
|
let patternResources = Dict.merge(this.xref, resourcesArray);
|
2015-10-21 03:22:06 +09:00
|
|
|
|
|
Change the signatures of the `PartialEvaluator` "constructor" and its `getOperatorList`/`getTextContent` methods to take parameter objects
Currently these methods accept a large number of parameters, which creates quite unwieldy call-sites. When invoking them, you have to remember not only what arguments to supply, but also the correct order, to avoid runtime errors.
Furthermore, since some of the parameters are optional, you also have to remember to pass e.g. `null` or `undefined` for those ones.
Also, adding new parameters to these methods (which happens occasionally), often becomes unnecessarily tedious (based on personal experience).
Please note that I do *not* think that we need/should convert *every* single method in `evaluator.js` (or elsewhere in `/core` files) to take parameter objects. However, in my opinion, once a method starts relying on approximately five parameter (or even more), passing them in individually becomes quite cumbersome.
With these changes, I obviously needed to update the `evaluator_spec.js` unit-tests. The main change there, except the new method signatures[1], is that it's now re-using *one* `PartialEvalutor` instance, since I couldn't see any compelling reason for creating a new one in every single test.
*Note:* If this patch is accepted, my intention is to (time permitting) see if it makes sense to convert additional methods in `evaluator.js` (and other `/core` files) in a similar fashion, but I figured that it'd be a good idea to limit the initial scope somewhat.
---
[1] A fun fact here, note how the `PartialEvaluator` signature used in `evaluator_spec.js` wasn't even correct in the current `master`.
2017-04-30 06:13:51 +09:00
|
|
|
|
return this.getOperatorList({
|
|
|
|
|
stream: pattern,
|
|
|
|
|
task,
|
|
|
|
|
resources: patternResources,
|
|
|
|
|
operatorList: tilingOpList,
|
2017-05-24 19:12:14 +09:00
|
|
|
|
}).then(function() {
|
|
|
|
|
return getTilingPatternIR({
|
[api-minor] Always allow e.g. rendering to continue even if there are errors, and add a `stopAtErrors` parameter to `getDocument` to opt-out of this behaviour (issue 6342, issue 3795, bug 1130815)
Other PDF readers, e.g. Adobe Reader and PDFium (in Chrome), will attempt to render as much of a page as possible even if there are errors present.
Currently we just bail as soon the first error is hit, which means that we'll usually not render anything in these cases and just display a blank page instead.
NOTE: This patch changes the default behaviour of the PDF.js API to always attempt to recover as much data as possible, even when encountering errors during e.g. `getOperatorList`/`getTextContent`, which thus improve our handling of corrupt PDF files and allow the default viewer to handle errors slightly more gracefully.
In the event that an API consumer wishes to use the old behaviour, where we stop parsing as soon as an error is encountered, the `stopAtErrors` parameter can be set at `getDocument`.
Fixes, inasmuch it's possible since the PDF files are corrupt, e.g. issue 6342, issue 3795, and [bug 1130815](https://bugzilla.mozilla.org/show_bug.cgi?id=1130815) (and probably others too).
2017-02-19 22:03:08 +09:00
|
|
|
|
fnArray: tilingOpList.fnArray,
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
argsArray: tilingOpList.argsArray,
|
2017-05-24 19:12:14 +09:00
|
|
|
|
}, patternDict, args);
|
|
|
|
|
}).then(function(tilingPatternIR) {
|
|
|
|
|
// Add the dependencies to the parent operator list so they are
|
|
|
|
|
// resolved before the sub operator list is executed synchronously.
|
|
|
|
|
operatorList.addDependencies(tilingOpList.dependencies);
|
|
|
|
|
operatorList.addOp(fn, tilingPatternIR);
|
|
|
|
|
}, (reason) => {
|
|
|
|
|
if (this.options.ignoreErrors) {
|
|
|
|
|
// Error(s) in the TilingPattern -- sending unsupported feature
|
|
|
|
|
// notification and allow rendering to continue.
|
|
|
|
|
this.handler.send('UnsupportedFeature',
|
|
|
|
|
{ featureId: UNSUPPORTED_FEATURES.unknown, });
|
|
|
|
|
warn(`handleTilingType - ignoring pattern: "${reason}".`);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
throw reason;
|
[api-minor] Always allow e.g. rendering to continue even if there are errors, and add a `stopAtErrors` parameter to `getDocument` to opt-out of this behaviour (issue 6342, issue 3795, bug 1130815)
Other PDF readers, e.g. Adobe Reader and PDFium (in Chrome), will attempt to render as much of a page as possible even if there are errors present.
Currently we just bail as soon the first error is hit, which means that we'll usually not render anything in these cases and just display a blank page instead.
NOTE: This patch changes the default behaviour of the PDF.js API to always attempt to recover as much data as possible, even when encountering errors during e.g. `getOperatorList`/`getTextContent`, which thus improve our handling of corrupt PDF files and allow the default viewer to handle errors slightly more gracefully.
In the event that an API consumer wishes to use the old behaviour, where we stop parsing as soon as an error is encountered, the `stopAtErrors` parameter can be set at `getDocument`.
Fixes, inasmuch it's possible since the PDF files are corrupt, e.g. issue 6342, issue 3795, and [bug 1130815](https://bugzilla.mozilla.org/show_bug.cgi?id=1130815) (and probably others too).
2017-02-19 22:03:08 +09:00
|
|
|
|
});
|
2013-04-09 07:14:56 +09:00
|
|
|
|
},
|
2012-09-14 00:09:46 +09:00
|
|
|
|
|
2014-03-23 03:15:51 +09:00
|
|
|
|
handleSetFont:
|
|
|
|
|
function PartialEvaluator_handleSetFont(resources, fontArgs, fontRef,
|
2015-10-21 10:50:32 +09:00
|
|
|
|
operatorList, task, state) {
|
2013-04-09 07:14:56 +09:00
|
|
|
|
// TODO(mack): Not needed?
|
|
|
|
|
var fontName;
|
|
|
|
|
if (fontArgs) {
|
|
|
|
|
fontArgs = fontArgs.slice();
|
|
|
|
|
fontName = fontArgs[0].name;
|
|
|
|
|
}
|
2013-08-01 03:17:36 +09:00
|
|
|
|
|
2017-04-30 06:36:43 +09:00
|
|
|
|
return this.loadFont(fontName, fontRef, resources).then((translated) => {
|
2014-05-20 06:27:54 +09:00
|
|
|
|
if (!translated.font.isType3Font) {
|
|
|
|
|
return translated;
|
|
|
|
|
}
|
2017-04-30 06:36:43 +09:00
|
|
|
|
return translated.loadType3Data(this, resources, operatorList, task).
|
2015-10-21 10:50:32 +09:00
|
|
|
|
then(function () {
|
2014-05-20 06:27:54 +09:00
|
|
|
|
return translated;
|
2017-04-30 06:36:43 +09:00
|
|
|
|
}).catch((reason) => {
|
2015-12-01 05:42:47 +09:00
|
|
|
|
// Error in the font data -- sending unsupported feature notification.
|
2017-04-30 06:36:43 +09:00
|
|
|
|
this.handler.send('UnsupportedFeature',
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
{ featureId: UNSUPPORTED_FEATURES.font, });
|
2015-11-28 04:05:51 +09:00
|
|
|
|
return new TranslatedFont('g_font_error',
|
|
|
|
|
new ErrorFont('Type3 font load error: ' + reason), translated.font);
|
2014-05-10 10:21:15 +09:00
|
|
|
|
});
|
2017-04-30 06:36:43 +09:00
|
|
|
|
}).then((translated) => {
|
2014-05-20 06:27:54 +09:00
|
|
|
|
state.font = translated.font;
|
2017-04-30 06:36:43 +09:00
|
|
|
|
translated.send(this.handler);
|
2014-05-20 06:27:54 +09:00
|
|
|
|
return translated.loadedName;
|
|
|
|
|
});
|
2013-04-09 07:14:56 +09:00
|
|
|
|
},
|
2013-03-13 09:20:38 +09:00
|
|
|
|
|
2014-04-10 08:44:07 +09:00
|
|
|
|
handleText: function PartialEvaluator_handleText(chars, state) {
|
2014-05-20 06:27:54 +09:00
|
|
|
|
var font = state.font;
|
2013-08-20 08:33:20 +09:00
|
|
|
|
var glyphs = font.charsToGlyphs(chars);
|
2014-04-10 08:44:07 +09:00
|
|
|
|
var isAddToPathSet = !!(state.textRenderingMode &
|
2013-08-20 08:33:20 +09:00
|
|
|
|
TextRenderingMode.ADD_TO_PATH_FLAG);
|
2016-03-03 09:48:21 +09:00
|
|
|
|
if (font.data && (isAddToPathSet || this.options.disableFontFace)) {
|
2017-04-30 06:36:43 +09:00
|
|
|
|
var buildPath = (fontChar) => {
|
2013-08-20 08:33:20 +09:00
|
|
|
|
if (!font.renderer.hasBuiltPath(fontChar)) {
|
|
|
|
|
var path = font.renderer.getPathJs(fontChar);
|
|
|
|
|
this.handler.send('commonobj', [
|
|
|
|
|
font.loadedName + '_path_' + fontChar,
|
|
|
|
|
'FontPath',
|
|
|
|
|
path
|
|
|
|
|
]);
|
|
|
|
|
}
|
2017-04-30 06:36:43 +09:00
|
|
|
|
};
|
2014-05-04 00:28:30 +09:00
|
|
|
|
|
|
|
|
|
for (var i = 0, ii = glyphs.length; i < ii; i++) {
|
|
|
|
|
var glyph = glyphs[i];
|
|
|
|
|
buildPath(glyph.fontChar);
|
|
|
|
|
|
|
|
|
|
// If the glyph has an accent we need to build a path for its
|
|
|
|
|
// fontChar too, otherwise CanvasGraphics_paintChar will fail.
|
|
|
|
|
var accent = glyph.accent;
|
|
|
|
|
if (accent && accent.fontChar) {
|
|
|
|
|
buildPath(accent.fontChar);
|
|
|
|
|
}
|
2013-08-20 08:33:20 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return glyphs;
|
|
|
|
|
},
|
|
|
|
|
|
2013-08-01 03:17:36 +09:00
|
|
|
|
setGState: function PartialEvaluator_setGState(resources, gState,
|
2015-10-21 10:50:32 +09:00
|
|
|
|
operatorList, task,
|
2017-03-26 21:12:53 +09:00
|
|
|
|
stateManager) {
|
2014-08-18 14:21:45 +09:00
|
|
|
|
// This array holds the converted/processed state data.
|
|
|
|
|
var gStateObj = [];
|
2016-02-04 00:53:18 +09:00
|
|
|
|
var gStateKeys = gState.getKeys();
|
2014-08-18 14:21:45 +09:00
|
|
|
|
var promise = Promise.resolve();
|
2016-02-04 00:53:18 +09:00
|
|
|
|
for (var i = 0, ii = gStateKeys.length; i < ii; i++) {
|
2017-04-30 06:36:43 +09:00
|
|
|
|
let key = gStateKeys[i];
|
|
|
|
|
let value = gState.get(key);
|
2013-04-09 07:14:56 +09:00
|
|
|
|
switch (key) {
|
|
|
|
|
case 'Type':
|
|
|
|
|
break;
|
|
|
|
|
case 'LW':
|
|
|
|
|
case 'LC':
|
|
|
|
|
case 'LJ':
|
|
|
|
|
case 'ML':
|
|
|
|
|
case 'D':
|
|
|
|
|
case 'RI':
|
|
|
|
|
case 'FL':
|
|
|
|
|
case 'CA':
|
|
|
|
|
case 'ca':
|
|
|
|
|
gStateObj.push([key, value]);
|
|
|
|
|
break;
|
|
|
|
|
case 'Font':
|
2017-04-30 06:36:43 +09:00
|
|
|
|
promise = promise.then(() => {
|
|
|
|
|
return this.handleSetFont(resources, null, value[0], operatorList,
|
2015-10-21 10:50:32 +09:00
|
|
|
|
task, stateManager.state).
|
2014-05-10 10:21:15 +09:00
|
|
|
|
then(function (loadedName) {
|
|
|
|
|
operatorList.addDependency(loadedName);
|
|
|
|
|
gStateObj.push([key, [loadedName, value[1]]]);
|
|
|
|
|
});
|
|
|
|
|
});
|
2013-04-09 07:14:56 +09:00
|
|
|
|
break;
|
|
|
|
|
case 'BM':
|
2017-04-11 03:58:02 +09:00
|
|
|
|
gStateObj.push([key, normalizeBlendMode(value)]);
|
2013-04-09 07:14:56 +09:00
|
|
|
|
break;
|
|
|
|
|
case 'SMask':
|
2016-08-04 22:13:37 +09:00
|
|
|
|
if (isName(value, 'None')) {
|
2014-01-24 02:13:32 +09:00
|
|
|
|
gStateObj.push([key, false]);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2016-02-04 00:53:18 +09:00
|
|
|
|
if (isDict(value)) {
|
2017-04-30 06:36:43 +09:00
|
|
|
|
promise = promise.then(() => {
|
|
|
|
|
return this.handleSMask(value, resources, operatorList,
|
2015-10-21 10:50:32 +09:00
|
|
|
|
task, stateManager);
|
2017-04-30 06:36:43 +09:00
|
|
|
|
});
|
2014-01-24 02:13:32 +09:00
|
|
|
|
gStateObj.push([key, true]);
|
|
|
|
|
} else {
|
|
|
|
|
warn('Unsupported SMask type');
|
|
|
|
|
}
|
|
|
|
|
|
2013-04-09 07:14:56 +09:00
|
|
|
|
break;
|
|
|
|
|
// Only generate info log messages for the following since
|
2014-08-15 12:34:53 +09:00
|
|
|
|
// they are unlikely to have a big impact on the rendering.
|
2013-04-09 07:14:56 +09:00
|
|
|
|
case 'OP':
|
|
|
|
|
case 'op':
|
|
|
|
|
case 'OPM':
|
|
|
|
|
case 'BG':
|
|
|
|
|
case 'BG2':
|
|
|
|
|
case 'UCR':
|
|
|
|
|
case 'UCR2':
|
|
|
|
|
case 'TR':
|
|
|
|
|
case 'TR2':
|
|
|
|
|
case 'HT':
|
|
|
|
|
case 'SM':
|
|
|
|
|
case 'SA':
|
|
|
|
|
case 'AIS':
|
|
|
|
|
case 'TK':
|
|
|
|
|
// TODO implement these operators.
|
|
|
|
|
info('graphic state operator ' + key);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
info('Unknown graphic state operator ' + key);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-05-10 10:21:15 +09:00
|
|
|
|
return promise.then(function () {
|
2016-02-03 22:29:20 +09:00
|
|
|
|
if (gStateObj.length > 0) {
|
2014-08-15 12:34:53 +09:00
|
|
|
|
operatorList.addOp(OPS.setGState, [gStateObj]);
|
|
|
|
|
}
|
2014-05-10 10:21:15 +09:00
|
|
|
|
});
|
2013-04-09 07:14:56 +09:00
|
|
|
|
},
|
2012-12-08 03:19:43 +09:00
|
|
|
|
|
2017-03-26 21:12:53 +09:00
|
|
|
|
loadFont: function PartialEvaluator_loadFont(fontName, font, resources) {
|
2013-08-01 03:17:36 +09:00
|
|
|
|
function errorFont() {
|
2014-05-20 06:27:54 +09:00
|
|
|
|
return Promise.resolve(new TranslatedFont('g_font_error',
|
|
|
|
|
new ErrorFont('Font ' + fontName + ' is not available'), font));
|
2011-10-25 08:55:23 +09:00
|
|
|
|
}
|
2017-03-26 21:12:53 +09:00
|
|
|
|
|
|
|
|
|
var fontRef, xref = this.xref;
|
2013-06-26 02:33:53 +09:00
|
|
|
|
if (font) { // Loading by ref.
|
|
|
|
|
assert(isRef(font));
|
|
|
|
|
fontRef = font;
|
|
|
|
|
} else { // Loading by name.
|
|
|
|
|
var fontRes = resources.get('Font');
|
|
|
|
|
if (fontRes) {
|
|
|
|
|
fontRef = fontRes.getRaw(fontName);
|
|
|
|
|
} else {
|
|
|
|
|
warn('fontRes not available');
|
2013-08-01 03:17:36 +09:00
|
|
|
|
return errorFont();
|
2013-06-26 02:33:53 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
2014-06-12 19:46:39 +09:00
|
|
|
|
if (!fontRef) {
|
|
|
|
|
warn('fontRef not available');
|
|
|
|
|
return errorFont();
|
|
|
|
|
}
|
|
|
|
|
|
2013-06-26 02:33:53 +09:00
|
|
|
|
if (this.fontCache.has(fontRef)) {
|
|
|
|
|
return this.fontCache.get(fontRef);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
font = xref.fetchIfRef(fontRef);
|
|
|
|
|
if (!isDict(font)) {
|
2013-08-01 03:17:36 +09:00
|
|
|
|
return errorFont();
|
2013-05-04 03:13:45 +09:00
|
|
|
|
}
|
2014-03-04 02:44:45 +09:00
|
|
|
|
|
Slightly refactor the `fontRef` handling in `PartialEvaluator_loadFont` (issue 7403 and issue 7402)
Originally, I was just going to change this code to use `Ref_toString` in a couple more places. When I started reading the code, I figured that it wouldn't hurt to clean up a couple of comments. While doing this, I noticed that the logic for the (rare) `isDict(fontRef)` case could do with a few improvements.
There should be no functional changes with this patch, but given the added reference checks, we will now avoid bogus `Ref`s when resolving font aliases. In practice, as issue 7403 shows, the current code can break certain PDF files even if it's very rare.
Note that the only thing that this patch will change, is the `font.loadedName` in the case where a `fontRef` is a reference *and* the font doesn't have a descriptor. Previously for `fontRef = Ref(4, 0)` we'd get `font.loadedName = 'g_d0_f4_0'`, and with this patch `font.loadedName = g_d0_f4R`, which is actually one character shorted in most cases. (Given that `Ref_toString` contains an optimization for the `gen === 0` case, which is by far the most common `gen` value.)
In the already existing fallback case, where the `fontName` is used to when creating the `font.loadedName`, we allow any alphanumeric character. Hence I don't see how (as mentioned above) e.g. `font.loadedName = g_d0_f4R` would be an issue here.
2016-05-23 22:32:04 +09:00
|
|
|
|
// We are holding `font.translated` references just for `fontRef`s that
|
|
|
|
|
// are not actually `Ref`s, but rather `Dict`s. See explanation below.
|
2014-05-20 06:27:54 +09:00
|
|
|
|
if (font.translated) {
|
|
|
|
|
return font.translated;
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-10 10:21:15 +09:00
|
|
|
|
var fontCapability = createPromiseCapability();
|
|
|
|
|
|
2017-03-26 21:12:53 +09:00
|
|
|
|
var preEvaluatedFont = this.preEvaluateFont(font);
|
2014-03-04 02:44:45 +09:00
|
|
|
|
var descriptor = preEvaluatedFont.descriptor;
|
Slightly refactor the `fontRef` handling in `PartialEvaluator_loadFont` (issue 7403 and issue 7402)
Originally, I was just going to change this code to use `Ref_toString` in a couple more places. When I started reading the code, I figured that it wouldn't hurt to clean up a couple of comments. While doing this, I noticed that the logic for the (rare) `isDict(fontRef)` case could do with a few improvements.
There should be no functional changes with this patch, but given the added reference checks, we will now avoid bogus `Ref`s when resolving font aliases. In practice, as issue 7403 shows, the current code can break certain PDF files even if it's very rare.
Note that the only thing that this patch will change, is the `font.loadedName` in the case where a `fontRef` is a reference *and* the font doesn't have a descriptor. Previously for `fontRef = Ref(4, 0)` we'd get `font.loadedName = 'g_d0_f4_0'`, and with this patch `font.loadedName = g_d0_f4R`, which is actually one character shorted in most cases. (Given that `Ref_toString` contains an optimization for the `gen === 0` case, which is by far the most common `gen` value.)
In the already existing fallback case, where the `fontName` is used to when creating the `font.loadedName`, we allow any alphanumeric character. Hence I don't see how (as mentioned above) e.g. `font.loadedName = g_d0_f4R` would be an issue here.
2016-05-23 22:32:04 +09:00
|
|
|
|
|
|
|
|
|
var fontRefIsRef = isRef(fontRef), fontID;
|
|
|
|
|
if (fontRefIsRef) {
|
|
|
|
|
fontID = fontRef.toString();
|
|
|
|
|
}
|
|
|
|
|
|
2014-03-04 02:44:45 +09:00
|
|
|
|
if (isDict(descriptor)) {
|
|
|
|
|
if (!descriptor.fontAliases) {
|
|
|
|
|
descriptor.fontAliases = Object.create(null);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var fontAliases = descriptor.fontAliases;
|
|
|
|
|
var hash = preEvaluatedFont.hash;
|
|
|
|
|
if (fontAliases[hash]) {
|
|
|
|
|
var aliasFontRef = fontAliases[hash].aliasRef;
|
Slightly refactor the `fontRef` handling in `PartialEvaluator_loadFont` (issue 7403 and issue 7402)
Originally, I was just going to change this code to use `Ref_toString` in a couple more places. When I started reading the code, I figured that it wouldn't hurt to clean up a couple of comments. While doing this, I noticed that the logic for the (rare) `isDict(fontRef)` case could do with a few improvements.
There should be no functional changes with this patch, but given the added reference checks, we will now avoid bogus `Ref`s when resolving font aliases. In practice, as issue 7403 shows, the current code can break certain PDF files even if it's very rare.
Note that the only thing that this patch will change, is the `font.loadedName` in the case where a `fontRef` is a reference *and* the font doesn't have a descriptor. Previously for `fontRef = Ref(4, 0)` we'd get `font.loadedName = 'g_d0_f4_0'`, and with this patch `font.loadedName = g_d0_f4R`, which is actually one character shorted in most cases. (Given that `Ref_toString` contains an optimization for the `gen === 0` case, which is by far the most common `gen` value.)
In the already existing fallback case, where the `fontName` is used to when creating the `font.loadedName`, we allow any alphanumeric character. Hence I don't see how (as mentioned above) e.g. `font.loadedName = g_d0_f4R` would be an issue here.
2016-05-23 22:32:04 +09:00
|
|
|
|
if (fontRefIsRef && aliasFontRef &&
|
|
|
|
|
this.fontCache.has(aliasFontRef)) {
|
2014-03-04 02:44:45 +09:00
|
|
|
|
this.fontCache.putAlias(fontRef, aliasFontRef);
|
2014-05-20 06:27:54 +09:00
|
|
|
|
return this.fontCache.get(fontRef);
|
2014-03-04 02:44:45 +09:00
|
|
|
|
}
|
Slightly refactor the `fontRef` handling in `PartialEvaluator_loadFont` (issue 7403 and issue 7402)
Originally, I was just going to change this code to use `Ref_toString` in a couple more places. When I started reading the code, I figured that it wouldn't hurt to clean up a couple of comments. While doing this, I noticed that the logic for the (rare) `isDict(fontRef)` case could do with a few improvements.
There should be no functional changes with this patch, but given the added reference checks, we will now avoid bogus `Ref`s when resolving font aliases. In practice, as issue 7403 shows, the current code can break certain PDF files even if it's very rare.
Note that the only thing that this patch will change, is the `font.loadedName` in the case where a `fontRef` is a reference *and* the font doesn't have a descriptor. Previously for `fontRef = Ref(4, 0)` we'd get `font.loadedName = 'g_d0_f4_0'`, and with this patch `font.loadedName = g_d0_f4R`, which is actually one character shorted in most cases. (Given that `Ref_toString` contains an optimization for the `gen === 0` case, which is by far the most common `gen` value.)
In the already existing fallback case, where the `fontName` is used to when creating the `font.loadedName`, we allow any alphanumeric character. Hence I don't see how (as mentioned above) e.g. `font.loadedName = g_d0_f4R` would be an issue here.
2016-05-23 22:32:04 +09:00
|
|
|
|
} else {
|
2014-03-04 02:44:45 +09:00
|
|
|
|
fontAliases[hash] = {
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
fontID: Font.getFontID(),
|
2014-03-04 02:44:45 +09:00
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
Slightly refactor the `fontRef` handling in `PartialEvaluator_loadFont` (issue 7403 and issue 7402)
Originally, I was just going to change this code to use `Ref_toString` in a couple more places. When I started reading the code, I figured that it wouldn't hurt to clean up a couple of comments. While doing this, I noticed that the logic for the (rare) `isDict(fontRef)` case could do with a few improvements.
There should be no functional changes with this patch, but given the added reference checks, we will now avoid bogus `Ref`s when resolving font aliases. In practice, as issue 7403 shows, the current code can break certain PDF files even if it's very rare.
Note that the only thing that this patch will change, is the `font.loadedName` in the case where a `fontRef` is a reference *and* the font doesn't have a descriptor. Previously for `fontRef = Ref(4, 0)` we'd get `font.loadedName = 'g_d0_f4_0'`, and with this patch `font.loadedName = g_d0_f4R`, which is actually one character shorted in most cases. (Given that `Ref_toString` contains an optimization for the `gen === 0` case, which is by far the most common `gen` value.)
In the already existing fallback case, where the `fontName` is used to when creating the `font.loadedName`, we allow any alphanumeric character. Hence I don't see how (as mentioned above) e.g. `font.loadedName = g_d0_f4R` would be an issue here.
2016-05-23 22:32:04 +09:00
|
|
|
|
if (fontRefIsRef) {
|
|
|
|
|
fontAliases[hash].aliasRef = fontRef;
|
|
|
|
|
}
|
2014-03-04 02:44:45 +09:00
|
|
|
|
fontID = fontAliases[hash].fontID;
|
|
|
|
|
}
|
|
|
|
|
|
Slightly refactor the `fontRef` handling in `PartialEvaluator_loadFont` (issue 7403 and issue 7402)
Originally, I was just going to change this code to use `Ref_toString` in a couple more places. When I started reading the code, I figured that it wouldn't hurt to clean up a couple of comments. While doing this, I noticed that the logic for the (rare) `isDict(fontRef)` case could do with a few improvements.
There should be no functional changes with this patch, but given the added reference checks, we will now avoid bogus `Ref`s when resolving font aliases. In practice, as issue 7403 shows, the current code can break certain PDF files even if it's very rare.
Note that the only thing that this patch will change, is the `font.loadedName` in the case where a `fontRef` is a reference *and* the font doesn't have a descriptor. Previously for `fontRef = Ref(4, 0)` we'd get `font.loadedName = 'g_d0_f4_0'`, and with this patch `font.loadedName = g_d0_f4R`, which is actually one character shorted in most cases. (Given that `Ref_toString` contains an optimization for the `gen === 0` case, which is by far the most common `gen` value.)
In the already existing fallback case, where the `fontName` is used to when creating the `font.loadedName`, we allow any alphanumeric character. Hence I don't see how (as mentioned above) e.g. `font.loadedName = g_d0_f4R` would be an issue here.
2016-05-23 22:32:04 +09:00
|
|
|
|
// Workaround for bad PDF generators that reference fonts incorrectly,
|
|
|
|
|
// where `fontRef` is a `Dict` rather than a `Ref` (fixes bug946506.pdf).
|
Attempt to cache fonts that are direct objects (i.e. `Dict`s), as opposed to `Ref`s, to prevent re-rendering after `cleanup` from breaking (issue 7403 and issue 7402)
Fonts that are not referenced by `Ref`s are very uncommon in practice, but it can unfortunately happen. In this case, we're currently not caching them in the usual way, i.e. by `Ref`, which leads to failures when a page is rendered after `cleanup` has run.
The simplest solution would have been to remove the `font.translated` workaround, but since this would have meant loading these kind of fonts over and over, the patch attempts to be a bit clever about this situation.
Note that if we instead loaded fonts per *page*, instead of per document, this issue wouldn't have existed.
2016-06-11 21:28:59 +09:00
|
|
|
|
// In this case we should not put the font into `this.fontCache` (which is
|
|
|
|
|
// a `RefSetCache`), since it's not meaningful to use a `Dict` as a key.
|
|
|
|
|
//
|
|
|
|
|
// However, if we don't cache the font it's not possible to remove it
|
|
|
|
|
// when `cleanup` is triggered from the API, which causes issues on
|
|
|
|
|
// subsequent rendering operations (see issue7403.pdf).
|
|
|
|
|
// A simple workaround would be to just not hold `font.translated`
|
|
|
|
|
// references in this case, but this would force us to unnecessarily load
|
|
|
|
|
// the same fonts over and over.
|
|
|
|
|
//
|
|
|
|
|
// Instead, we cheat a bit by attempting to use a modified `fontID` as a
|
|
|
|
|
// key in `this.fontCache`, to allow the font to be cached.
|
|
|
|
|
// NOTE: This works because `RefSetCache` calls `toString()` on provided
|
|
|
|
|
// keys. Also, since `fontRef` is used when getting cached fonts,
|
|
|
|
|
// we'll not accidentally match fonts cached with the `fontID`.
|
Slightly refactor the `fontRef` handling in `PartialEvaluator_loadFont` (issue 7403 and issue 7402)
Originally, I was just going to change this code to use `Ref_toString` in a couple more places. When I started reading the code, I figured that it wouldn't hurt to clean up a couple of comments. While doing this, I noticed that the logic for the (rare) `isDict(fontRef)` case could do with a few improvements.
There should be no functional changes with this patch, but given the added reference checks, we will now avoid bogus `Ref`s when resolving font aliases. In practice, as issue 7403 shows, the current code can break certain PDF files even if it's very rare.
Note that the only thing that this patch will change, is the `font.loadedName` in the case where a `fontRef` is a reference *and* the font doesn't have a descriptor. Previously for `fontRef = Ref(4, 0)` we'd get `font.loadedName = 'g_d0_f4_0'`, and with this patch `font.loadedName = g_d0_f4R`, which is actually one character shorted in most cases. (Given that `Ref_toString` contains an optimization for the `gen === 0` case, which is by far the most common `gen` value.)
In the already existing fallback case, where the `fontName` is used to when creating the `font.loadedName`, we allow any alphanumeric character. Hence I don't see how (as mentioned above) e.g. `font.loadedName = g_d0_f4R` would be an issue here.
2016-05-23 22:32:04 +09:00
|
|
|
|
if (fontRefIsRef) {
|
2014-05-10 10:21:15 +09:00
|
|
|
|
this.fontCache.put(fontRef, fontCapability.promise);
|
Slightly refactor the `fontRef` handling in `PartialEvaluator_loadFont` (issue 7403 and issue 7402)
Originally, I was just going to change this code to use `Ref_toString` in a couple more places. When I started reading the code, I figured that it wouldn't hurt to clean up a couple of comments. While doing this, I noticed that the logic for the (rare) `isDict(fontRef)` case could do with a few improvements.
There should be no functional changes with this patch, but given the added reference checks, we will now avoid bogus `Ref`s when resolving font aliases. In practice, as issue 7403 shows, the current code can break certain PDF files even if it's very rare.
Note that the only thing that this patch will change, is the `font.loadedName` in the case where a `fontRef` is a reference *and* the font doesn't have a descriptor. Previously for `fontRef = Ref(4, 0)` we'd get `font.loadedName = 'g_d0_f4_0'`, and with this patch `font.loadedName = g_d0_f4R`, which is actually one character shorted in most cases. (Given that `Ref_toString` contains an optimization for the `gen === 0` case, which is by far the most common `gen` value.)
In the already existing fallback case, where the `fontName` is used to when creating the `font.loadedName`, we allow any alphanumeric character. Hence I don't see how (as mentioned above) e.g. `font.loadedName = g_d0_f4R` would be an issue here.
2016-05-23 22:32:04 +09:00
|
|
|
|
} else {
|
|
|
|
|
if (!fontID) {
|
2017-01-09 00:51:30 +09:00
|
|
|
|
fontID = this.idFactory.createObjId();
|
Slightly refactor the `fontRef` handling in `PartialEvaluator_loadFont` (issue 7403 and issue 7402)
Originally, I was just going to change this code to use `Ref_toString` in a couple more places. When I started reading the code, I figured that it wouldn't hurt to clean up a couple of comments. While doing this, I noticed that the logic for the (rare) `isDict(fontRef)` case could do with a few improvements.
There should be no functional changes with this patch, but given the added reference checks, we will now avoid bogus `Ref`s when resolving font aliases. In practice, as issue 7403 shows, the current code can break certain PDF files even if it's very rare.
Note that the only thing that this patch will change, is the `font.loadedName` in the case where a `fontRef` is a reference *and* the font doesn't have a descriptor. Previously for `fontRef = Ref(4, 0)` we'd get `font.loadedName = 'g_d0_f4_0'`, and with this patch `font.loadedName = g_d0_f4R`, which is actually one character shorted in most cases. (Given that `Ref_toString` contains an optimization for the `gen === 0` case, which is by far the most common `gen` value.)
In the already existing fallback case, where the `fontName` is used to when creating the `font.loadedName`, we allow any alphanumeric character. Hence I don't see how (as mentioned above) e.g. `font.loadedName = g_d0_f4R` would be an issue here.
2016-05-23 22:32:04 +09:00
|
|
|
|
}
|
Attempt to cache fonts that are direct objects (i.e. `Dict`s), as opposed to `Ref`s, to prevent re-rendering after `cleanup` from breaking (issue 7403 and issue 7402)
Fonts that are not referenced by `Ref`s are very uncommon in practice, but it can unfortunately happen. In this case, we're currently not caching them in the usual way, i.e. by `Ref`, which leads to failures when a page is rendered after `cleanup` has run.
The simplest solution would have been to remove the `font.translated` workaround, but since this would have meant loading these kind of fonts over and over, the patch attempts to be a bit clever about this situation.
Note that if we instead loaded fonts per *page*, instead of per document, this issue wouldn't have existed.
2016-06-11 21:28:59 +09:00
|
|
|
|
this.fontCache.put('id_' + fontID, fontCapability.promise);
|
2013-12-17 08:19:31 +09:00
|
|
|
|
}
|
Attempt to cache fonts that are direct objects (i.e. `Dict`s), as opposed to `Ref`s, to prevent re-rendering after `cleanup` from breaking (issue 7403 and issue 7402)
Fonts that are not referenced by `Ref`s are very uncommon in practice, but it can unfortunately happen. In this case, we're currently not caching them in the usual way, i.e. by `Ref`, which leads to failures when a page is rendered after `cleanup` has run.
The simplest solution would have been to remove the `font.translated` workaround, but since this would have meant loading these kind of fonts over and over, the patch attempts to be a bit clever about this situation.
Note that if we instead loaded fonts per *page*, instead of per document, this issue wouldn't have existed.
2016-06-11 21:28:59 +09:00
|
|
|
|
assert(fontID, 'The "fontID" must be defined.');
|
2013-05-04 03:13:45 +09:00
|
|
|
|
|
2014-03-23 03:15:51 +09:00
|
|
|
|
// Keep track of each font we translated so the caller can
|
|
|
|
|
// load them asynchronously before calling display on a page.
|
Slightly refactor the `fontRef` handling in `PartialEvaluator_loadFont` (issue 7403 and issue 7402)
Originally, I was just going to change this code to use `Ref_toString` in a couple more places. When I started reading the code, I figured that it wouldn't hurt to clean up a couple of comments. While doing this, I noticed that the logic for the (rare) `isDict(fontRef)` case could do with a few improvements.
There should be no functional changes with this patch, but given the added reference checks, we will now avoid bogus `Ref`s when resolving font aliases. In practice, as issue 7403 shows, the current code can break certain PDF files even if it's very rare.
Note that the only thing that this patch will change, is the `font.loadedName` in the case where a `fontRef` is a reference *and* the font doesn't have a descriptor. Previously for `fontRef = Ref(4, 0)` we'd get `font.loadedName = 'g_d0_f4_0'`, and with this patch `font.loadedName = g_d0_f4R`, which is actually one character shorted in most cases. (Given that `Ref_toString` contains an optimization for the `gen === 0` case, which is by far the most common `gen` value.)
In the already existing fallback case, where the `fontName` is used to when creating the `font.loadedName`, we allow any alphanumeric character. Hence I don't see how (as mentioned above) e.g. `font.loadedName = g_d0_f4R` would be an issue here.
2016-05-23 22:32:04 +09:00
|
|
|
|
font.loadedName = 'g_' + this.pdfManager.docId + '_f' + fontID;
|
2012-02-21 22:28:42 +09:00
|
|
|
|
|
2014-05-20 06:27:54 +09:00
|
|
|
|
font.translated = fontCapability.promise;
|
2013-04-09 07:14:56 +09:00
|
|
|
|
|
2014-05-20 06:27:54 +09:00
|
|
|
|
// TODO move promises into translate font
|
|
|
|
|
var translatedPromise;
|
|
|
|
|
try {
|
2017-03-26 21:12:53 +09:00
|
|
|
|
translatedPromise = this.translateFont(preEvaluatedFont);
|
2014-05-20 06:27:54 +09:00
|
|
|
|
} catch (e) {
|
|
|
|
|
translatedPromise = Promise.reject(e);
|
2011-10-25 08:55:23 +09:00
|
|
|
|
}
|
2014-05-20 06:27:54 +09:00
|
|
|
|
|
|
|
|
|
translatedPromise.then(function (translatedFont) {
|
2014-06-16 23:52:04 +09:00
|
|
|
|
if (translatedFont.fontType !== undefined) {
|
|
|
|
|
var xrefFontStats = xref.stats.fontTypes;
|
|
|
|
|
xrefFontStats[translatedFont.fontType] = true;
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-20 06:27:54 +09:00
|
|
|
|
fontCapability.resolve(new TranslatedFont(font.loadedName,
|
|
|
|
|
translatedFont, font));
|
2017-04-30 06:36:43 +09:00
|
|
|
|
}).catch((reason) => {
|
2014-05-20 06:27:54 +09:00
|
|
|
|
// TODO fontCapability.reject?
|
2015-12-01 05:42:47 +09:00
|
|
|
|
// Error in the font data -- sending unsupported feature notification.
|
2017-04-30 06:36:43 +09:00
|
|
|
|
this.handler.send('UnsupportedFeature',
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
{ featureId: UNSUPPORTED_FEATURES.font, });
|
2014-06-16 23:52:04 +09:00
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// error, but it's still nice to have font type reported
|
|
|
|
|
var descriptor = preEvaluatedFont.descriptor;
|
|
|
|
|
var fontFile3 = descriptor && descriptor.get('FontFile3');
|
|
|
|
|
var subtype = fontFile3 && fontFile3.get('Subtype');
|
|
|
|
|
var fontType = getFontType(preEvaluatedFont.type,
|
|
|
|
|
subtype && subtype.name);
|
|
|
|
|
var xrefFontStats = xref.stats.fontTypes;
|
|
|
|
|
xrefFontStats[fontType] = true;
|
|
|
|
|
} catch (ex) { }
|
|
|
|
|
|
2014-05-20 06:27:54 +09:00
|
|
|
|
fontCapability.resolve(new TranslatedFont(font.loadedName,
|
|
|
|
|
new ErrorFont(reason instanceof Error ? reason.message : reason),
|
|
|
|
|
font));
|
|
|
|
|
});
|
|
|
|
|
return fontCapability.promise;
|
2013-04-09 07:14:56 +09:00
|
|
|
|
},
|
|
|
|
|
|
2014-04-30 23:09:04 +09:00
|
|
|
|
buildPath: function PartialEvaluator_buildPath(operatorList, fn, args) {
|
|
|
|
|
var lastIndex = operatorList.length - 1;
|
2014-08-08 19:50:54 +09:00
|
|
|
|
if (!args) {
|
|
|
|
|
args = [];
|
|
|
|
|
}
|
2014-04-30 23:09:04 +09:00
|
|
|
|
if (lastIndex < 0 ||
|
|
|
|
|
operatorList.fnArray[lastIndex] !== OPS.constructPath) {
|
|
|
|
|
operatorList.addOp(OPS.constructPath, [[fn], args]);
|
|
|
|
|
} else {
|
|
|
|
|
var opArgs = operatorList.argsArray[lastIndex];
|
|
|
|
|
opArgs[0].push(fn);
|
|
|
|
|
Array.prototype.push.apply(opArgs[1], args);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
2014-05-22 02:47:42 +09:00
|
|
|
|
handleColorN: function PartialEvaluator_handleColorN(operatorList, fn, args,
|
2017-03-26 21:12:53 +09:00
|
|
|
|
cs, patterns,
|
|
|
|
|
resources, task) {
|
2014-05-22 02:47:42 +09:00
|
|
|
|
// compile tiling patterns
|
|
|
|
|
var patternName = args[args.length - 1];
|
|
|
|
|
// SCN/scn applies patterns along with normal colors
|
|
|
|
|
var pattern;
|
|
|
|
|
if (isName(patternName) &&
|
|
|
|
|
(pattern = patterns.get(patternName.name))) {
|
|
|
|
|
var dict = (isStream(pattern) ? pattern.dict : pattern);
|
|
|
|
|
var typeNum = dict.get('PatternType');
|
|
|
|
|
|
2014-06-02 19:43:20 +09:00
|
|
|
|
if (typeNum === TILING_PATTERN) {
|
2014-05-22 02:47:42 +09:00
|
|
|
|
var color = cs.base ? cs.base.getRgb(args, 0) : null;
|
|
|
|
|
return this.handleTilingType(fn, color, resources, pattern,
|
2015-10-21 10:50:32 +09:00
|
|
|
|
dict, operatorList, task);
|
2014-06-02 19:43:20 +09:00
|
|
|
|
} else if (typeNum === SHADING_PATTERN) {
|
2014-05-22 02:47:42 +09:00
|
|
|
|
var shading = dict.get('Shading');
|
2016-05-06 02:16:35 +09:00
|
|
|
|
var matrix = dict.getArray('Matrix');
|
2017-03-26 21:12:53 +09:00
|
|
|
|
pattern = Pattern.parseShading(shading, matrix, this.xref, resources,
|
2015-12-01 05:42:47 +09:00
|
|
|
|
this.handler);
|
2014-05-22 02:47:42 +09:00
|
|
|
|
operatorList.addOp(fn, pattern.getIR());
|
|
|
|
|
return Promise.resolve();
|
|
|
|
|
}
|
2017-04-08 18:47:22 +09:00
|
|
|
|
return Promise.reject(new Error('Unknown PatternType: ' + typeNum));
|
2014-05-22 02:47:42 +09:00
|
|
|
|
}
|
|
|
|
|
// TODO shall we fail here?
|
|
|
|
|
operatorList.addOp(fn, args);
|
|
|
|
|
return Promise.resolve();
|
|
|
|
|
},
|
|
|
|
|
|
Change the signatures of the `PartialEvaluator` "constructor" and its `getOperatorList`/`getTextContent` methods to take parameter objects
Currently these methods accept a large number of parameters, which creates quite unwieldy call-sites. When invoking them, you have to remember not only what arguments to supply, but also the correct order, to avoid runtime errors.
Furthermore, since some of the parameters are optional, you also have to remember to pass e.g. `null` or `undefined` for those ones.
Also, adding new parameters to these methods (which happens occasionally), often becomes unnecessarily tedious (based on personal experience).
Please note that I do *not* think that we need/should convert *every* single method in `evaluator.js` (or elsewhere in `/core` files) to take parameter objects. However, in my opinion, once a method starts relying on approximately five parameter (or even more), passing them in individually becomes quite cumbersome.
With these changes, I obviously needed to update the `evaluator_spec.js` unit-tests. The main change there, except the new method signatures[1], is that it's now re-using *one* `PartialEvalutor` instance, since I couldn't see any compelling reason for creating a new one in every single test.
*Note:* If this patch is accepted, my intention is to (time permitting) see if it makes sense to convert additional methods in `evaluator.js` (and other `/core` files) in a similar fashion, but I figured that it'd be a good idea to limit the initial scope somewhat.
---
[1] A fun fact here, note how the `PartialEvaluator` signature used in `evaluator_spec.js` wasn't even correct in the current `master`.
2017-04-30 06:13:51 +09:00
|
|
|
|
getOperatorList({ stream, task, resources, operatorList,
|
|
|
|
|
initialState = null, }) {
|
|
|
|
|
// Ensure that `resources`/`initialState` is correctly initialized,
|
|
|
|
|
// even if the provided parameter is e.g. `null`.
|
|
|
|
|
resources = resources || Dict.empty;
|
|
|
|
|
initialState = initialState || new EvalState();
|
|
|
|
|
|
|
|
|
|
assert(operatorList, 'getOperatorList: missing "operatorList" parameter');
|
|
|
|
|
|
2013-04-09 07:14:56 +09:00
|
|
|
|
var self = this;
|
|
|
|
|
var xref = this.xref;
|
2016-01-28 02:04:13 +09:00
|
|
|
|
var imageCache = Object.create(null);
|
2011-10-25 08:55:23 +09:00
|
|
|
|
|
2014-03-26 23:07:38 +09:00
|
|
|
|
var xobjs = (resources.get('XObject') || Dict.empty);
|
|
|
|
|
var patterns = (resources.get('Pattern') || Dict.empty);
|
Change the signatures of the `PartialEvaluator` "constructor" and its `getOperatorList`/`getTextContent` methods to take parameter objects
Currently these methods accept a large number of parameters, which creates quite unwieldy call-sites. When invoking them, you have to remember not only what arguments to supply, but also the correct order, to avoid runtime errors.
Furthermore, since some of the parameters are optional, you also have to remember to pass e.g. `null` or `undefined` for those ones.
Also, adding new parameters to these methods (which happens occasionally), often becomes unnecessarily tedious (based on personal experience).
Please note that I do *not* think that we need/should convert *every* single method in `evaluator.js` (or elsewhere in `/core` files) to take parameter objects. However, in my opinion, once a method starts relying on approximately five parameter (or even more), passing them in individually becomes quite cumbersome.
With these changes, I obviously needed to update the `evaluator_spec.js` unit-tests. The main change there, except the new method signatures[1], is that it's now re-using *one* `PartialEvalutor` instance, since I couldn't see any compelling reason for creating a new one in every single test.
*Note:* If this patch is accepted, my intention is to (time permitting) see if it makes sense to convert additional methods in `evaluator.js` (and other `/core` files) in a similar fashion, but I figured that it'd be a good idea to limit the initial scope somewhat.
---
[1] A fun fact here, note how the `PartialEvaluator` signature used in `evaluator_spec.js` wasn't even correct in the current `master`.
2017-04-30 06:13:51 +09:00
|
|
|
|
var stateManager = new StateManager(initialState);
|
2014-04-10 08:44:07 +09:00
|
|
|
|
var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
|
2014-05-10 10:41:03 +09:00
|
|
|
|
var timeSlotManager = new TimeSlotManager();
|
2014-05-10 10:21:15 +09:00
|
|
|
|
|
[api-minor] Always allow e.g. rendering to continue even if there are errors, and add a `stopAtErrors` parameter to `getDocument` to opt-out of this behaviour (issue 6342, issue 3795, bug 1130815)
Other PDF readers, e.g. Adobe Reader and PDFium (in Chrome), will attempt to render as much of a page as possible even if there are errors present.
Currently we just bail as soon the first error is hit, which means that we'll usually not render anything in these cases and just display a blank page instead.
NOTE: This patch changes the default behaviour of the PDF.js API to always attempt to recover as much data as possible, even when encountering errors during e.g. `getOperatorList`/`getTextContent`, which thus improve our handling of corrupt PDF files and allow the default viewer to handle errors slightly more gracefully.
In the event that an API consumer wishes to use the old behaviour, where we stop parsing as soon as an error is encountered, the `stopAtErrors` parameter can be set at `getDocument`.
Fixes, inasmuch it's possible since the PDF files are corrupt, e.g. issue 6342, issue 3795, and [bug 1130815](https://bugzilla.mozilla.org/show_bug.cgi?id=1130815) (and probably others too).
2017-02-19 22:03:08 +09:00
|
|
|
|
function closePendingRestoreOPS(argument) {
|
|
|
|
|
for (var i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) {
|
|
|
|
|
operatorList.addOp(OPS.restore, []);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-11 22:59:09 +09:00
|
|
|
|
return new Promise(function promiseBody(resolve, reject) {
|
|
|
|
|
var next = function (promise) {
|
|
|
|
|
promise.then(function () {
|
|
|
|
|
try {
|
|
|
|
|
promiseBody(resolve, reject);
|
|
|
|
|
} catch (ex) {
|
|
|
|
|
reject(ex);
|
|
|
|
|
}
|
|
|
|
|
}, reject);
|
|
|
|
|
};
|
2015-10-21 10:50:32 +09:00
|
|
|
|
task.ensureNotTerminated();
|
2014-05-10 10:41:03 +09:00
|
|
|
|
timeSlotManager.reset();
|
2014-06-19 00:15:35 +09:00
|
|
|
|
var stop, operation = {}, i, ii, cs;
|
2014-08-11 09:23:23 +09:00
|
|
|
|
while (!(stop = timeSlotManager.check())) {
|
|
|
|
|
// The arguments parsed by read() are used beyond this loop, so we
|
|
|
|
|
// cannot reuse the same array on each iteration. Therefore we pass
|
|
|
|
|
// in |null| as the initial value (see the comment on
|
|
|
|
|
// EvaluatorPreprocessor_read() for why).
|
|
|
|
|
operation.args = null;
|
|
|
|
|
if (!(preprocessor.read(operation))) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
2014-05-10 10:21:15 +09:00
|
|
|
|
var args = operation.args;
|
|
|
|
|
var fn = operation.fn;
|
|
|
|
|
|
|
|
|
|
switch (fn | 0) {
|
|
|
|
|
case OPS.paintXObject:
|
|
|
|
|
if (args[0].code) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
// eagerly compile XForm objects
|
|
|
|
|
var name = args[0].name;
|
2015-06-22 20:33:15 +09:00
|
|
|
|
if (!name) {
|
|
|
|
|
warn('XObject must be referred to by name.');
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2014-10-27 01:03:44 +09:00
|
|
|
|
if (imageCache[name] !== undefined) {
|
|
|
|
|
operatorList.addOp(imageCache[name].fn, imageCache[name].args);
|
2014-06-20 12:52:39 +09:00
|
|
|
|
args = null;
|
2014-02-24 23:00:08 +09:00
|
|
|
|
continue;
|
|
|
|
|
}
|
2014-03-23 03:15:51 +09:00
|
|
|
|
|
2014-05-10 10:21:15 +09:00
|
|
|
|
var xobj = xobjs.get(name);
|
|
|
|
|
if (xobj) {
|
|
|
|
|
assert(isStream(xobj), 'XObject should be a stream');
|
|
|
|
|
|
|
|
|
|
var type = xobj.dict.get('Subtype');
|
2016-08-04 22:13:37 +09:00
|
|
|
|
assert(isName(type), 'XObject should have a Name subtype');
|
2014-05-10 10:21:15 +09:00
|
|
|
|
|
2014-05-29 06:20:08 +09:00
|
|
|
|
if (type.name === 'Form') {
|
2014-05-10 10:21:15 +09:00
|
|
|
|
stateManager.save();
|
2016-03-11 22:59:09 +09:00
|
|
|
|
next(self.buildFormXObject(resources, xobj, null,
|
|
|
|
|
operatorList, task,
|
|
|
|
|
stateManager.state.clone()).
|
2014-05-10 10:21:15 +09:00
|
|
|
|
then(function () {
|
|
|
|
|
stateManager.restore();
|
2016-03-11 22:59:09 +09:00
|
|
|
|
}));
|
|
|
|
|
return;
|
2014-05-29 06:20:08 +09:00
|
|
|
|
} else if (type.name === 'Image') {
|
2014-05-10 10:21:15 +09:00
|
|
|
|
self.buildPaintImageXObject(resources, xobj, false,
|
|
|
|
|
operatorList, name, imageCache);
|
2014-06-20 12:52:39 +09:00
|
|
|
|
args = null;
|
2014-05-10 10:21:15 +09:00
|
|
|
|
continue;
|
2014-05-29 06:20:08 +09:00
|
|
|
|
} else if (type.name === 'PS') {
|
|
|
|
|
// PostScript XObjects are unused when viewing documents.
|
|
|
|
|
// See section 4.7.1 of Adobe's PDF reference.
|
|
|
|
|
info('Ignored XObject subtype PS');
|
|
|
|
|
continue;
|
2014-05-10 10:21:15 +09:00
|
|
|
|
} else {
|
|
|
|
|
error('Unhandled XObject subtype ' + type.name);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case OPS.setFont:
|
|
|
|
|
var fontSize = args[1];
|
|
|
|
|
// eagerly collect all fonts
|
2016-03-11 22:59:09 +09:00
|
|
|
|
next(self.handleSetFont(resources, args, null, operatorList,
|
|
|
|
|
task, stateManager.state).
|
2014-05-10 10:21:15 +09:00
|
|
|
|
then(function (loadedName) {
|
|
|
|
|
operatorList.addDependency(loadedName);
|
|
|
|
|
operatorList.addOp(OPS.setFont, [loadedName, fontSize]);
|
2016-03-11 22:59:09 +09:00
|
|
|
|
}));
|
|
|
|
|
return;
|
2014-05-10 10:21:15 +09:00
|
|
|
|
case OPS.endInlineImage:
|
|
|
|
|
var cacheKey = args[0].cacheKey;
|
2014-10-27 01:03:44 +09:00
|
|
|
|
if (cacheKey) {
|
|
|
|
|
var cacheEntry = imageCache[cacheKey];
|
|
|
|
|
if (cacheEntry !== undefined) {
|
|
|
|
|
operatorList.addOp(cacheEntry.fn, cacheEntry.args);
|
|
|
|
|
args = null;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2014-02-25 00:59:02 +09:00
|
|
|
|
}
|
2014-05-10 10:21:15 +09:00
|
|
|
|
self.buildPaintImageXObject(resources, args[0], true,
|
|
|
|
|
operatorList, cacheKey, imageCache);
|
2014-06-20 12:52:39 +09:00
|
|
|
|
args = null;
|
2013-11-19 09:50:58 +09:00
|
|
|
|
continue;
|
2014-05-10 10:21:15 +09:00
|
|
|
|
case OPS.showText:
|
|
|
|
|
args[0] = self.handleText(args[0], stateManager.state);
|
|
|
|
|
break;
|
|
|
|
|
case OPS.showSpacedText:
|
|
|
|
|
var arr = args[0];
|
2014-05-24 03:36:54 +09:00
|
|
|
|
var combinedGlyphs = [];
|
2014-05-10 10:21:15 +09:00
|
|
|
|
var arrLength = arr.length;
|
2015-08-28 20:42:01 +09:00
|
|
|
|
var state = stateManager.state;
|
2014-05-10 10:21:15 +09:00
|
|
|
|
for (i = 0; i < arrLength; ++i) {
|
2014-05-24 03:36:54 +09:00
|
|
|
|
var arrItem = arr[i];
|
|
|
|
|
if (isString(arrItem)) {
|
|
|
|
|
Array.prototype.push.apply(combinedGlyphs,
|
2015-08-28 20:42:01 +09:00
|
|
|
|
self.handleText(arrItem, state));
|
2014-05-24 03:36:54 +09:00
|
|
|
|
} else if (isNum(arrItem)) {
|
|
|
|
|
combinedGlyphs.push(arrItem);
|
2014-05-10 10:21:15 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
2014-05-24 03:36:54 +09:00
|
|
|
|
args[0] = combinedGlyphs;
|
|
|
|
|
fn = OPS.showText;
|
2014-05-10 10:21:15 +09:00
|
|
|
|
break;
|
|
|
|
|
case OPS.nextLineShowText:
|
2014-05-24 03:36:54 +09:00
|
|
|
|
operatorList.addOp(OPS.nextLine);
|
2014-05-10 10:21:15 +09:00
|
|
|
|
args[0] = self.handleText(args[0], stateManager.state);
|
2014-05-24 03:36:54 +09:00
|
|
|
|
fn = OPS.showText;
|
2014-05-10 10:21:15 +09:00
|
|
|
|
break;
|
|
|
|
|
case OPS.nextLineSetSpacingShowText:
|
2014-05-24 03:36:54 +09:00
|
|
|
|
operatorList.addOp(OPS.nextLine);
|
|
|
|
|
operatorList.addOp(OPS.setWordSpacing, [args.shift()]);
|
|
|
|
|
operatorList.addOp(OPS.setCharSpacing, [args.shift()]);
|
|
|
|
|
args[0] = self.handleText(args[0], stateManager.state);
|
|
|
|
|
fn = OPS.showText;
|
2014-05-10 10:21:15 +09:00
|
|
|
|
break;
|
|
|
|
|
case OPS.setTextRenderingMode:
|
|
|
|
|
stateManager.state.textRenderingMode = args[0];
|
|
|
|
|
break;
|
2014-05-22 02:47:42 +09:00
|
|
|
|
|
2014-05-10 10:21:15 +09:00
|
|
|
|
case OPS.setFillColorSpace:
|
2014-05-22 02:47:42 +09:00
|
|
|
|
stateManager.state.fillColorSpace =
|
|
|
|
|
ColorSpace.parse(args[0], xref, resources);
|
|
|
|
|
continue;
|
2014-05-10 10:21:15 +09:00
|
|
|
|
case OPS.setStrokeColorSpace:
|
2014-05-22 02:47:42 +09:00
|
|
|
|
stateManager.state.strokeColorSpace =
|
|
|
|
|
ColorSpace.parse(args[0], xref, resources);
|
|
|
|
|
continue;
|
|
|
|
|
case OPS.setFillColor:
|
|
|
|
|
cs = stateManager.state.fillColorSpace;
|
|
|
|
|
args = cs.getRgb(args, 0);
|
|
|
|
|
fn = OPS.setFillRGBColor;
|
|
|
|
|
break;
|
|
|
|
|
case OPS.setStrokeColor:
|
|
|
|
|
cs = stateManager.state.strokeColorSpace;
|
|
|
|
|
args = cs.getRgb(args, 0);
|
|
|
|
|
fn = OPS.setStrokeRGBColor;
|
|
|
|
|
break;
|
|
|
|
|
case OPS.setFillGray:
|
|
|
|
|
stateManager.state.fillColorSpace = ColorSpace.singletons.gray;
|
|
|
|
|
args = ColorSpace.singletons.gray.getRgb(args, 0);
|
|
|
|
|
fn = OPS.setFillRGBColor;
|
|
|
|
|
break;
|
|
|
|
|
case OPS.setStrokeGray:
|
|
|
|
|
stateManager.state.strokeColorSpace = ColorSpace.singletons.gray;
|
|
|
|
|
args = ColorSpace.singletons.gray.getRgb(args, 0);
|
|
|
|
|
fn = OPS.setStrokeRGBColor;
|
|
|
|
|
break;
|
|
|
|
|
case OPS.setFillCMYKColor:
|
|
|
|
|
stateManager.state.fillColorSpace = ColorSpace.singletons.cmyk;
|
|
|
|
|
args = ColorSpace.singletons.cmyk.getRgb(args, 0);
|
|
|
|
|
fn = OPS.setFillRGBColor;
|
|
|
|
|
break;
|
|
|
|
|
case OPS.setStrokeCMYKColor:
|
|
|
|
|
stateManager.state.strokeColorSpace = ColorSpace.singletons.cmyk;
|
|
|
|
|
args = ColorSpace.singletons.cmyk.getRgb(args, 0);
|
|
|
|
|
fn = OPS.setStrokeRGBColor;
|
|
|
|
|
break;
|
|
|
|
|
case OPS.setFillRGBColor:
|
|
|
|
|
stateManager.state.fillColorSpace = ColorSpace.singletons.rgb;
|
|
|
|
|
args = ColorSpace.singletons.rgb.getRgb(args, 0);
|
2014-05-10 10:21:15 +09:00
|
|
|
|
break;
|
2014-05-22 02:47:42 +09:00
|
|
|
|
case OPS.setStrokeRGBColor:
|
|
|
|
|
stateManager.state.strokeColorSpace = ColorSpace.singletons.rgb;
|
|
|
|
|
args = ColorSpace.singletons.rgb.getRgb(args, 0);
|
|
|
|
|
break;
|
|
|
|
|
case OPS.setFillColorN:
|
|
|
|
|
cs = stateManager.state.fillColorSpace;
|
|
|
|
|
if (cs.name === 'Pattern') {
|
2016-03-11 22:59:09 +09:00
|
|
|
|
next(self.handleColorN(operatorList, OPS.setFillColorN, args,
|
2017-03-26 21:12:53 +09:00
|
|
|
|
cs, patterns, resources, task));
|
2016-03-11 22:59:09 +09:00
|
|
|
|
return;
|
2014-05-22 02:47:42 +09:00
|
|
|
|
}
|
|
|
|
|
args = cs.getRgb(args, 0);
|
|
|
|
|
fn = OPS.setFillRGBColor;
|
|
|
|
|
break;
|
|
|
|
|
case OPS.setStrokeColorN:
|
|
|
|
|
cs = stateManager.state.strokeColorSpace;
|
|
|
|
|
if (cs.name === 'Pattern') {
|
2016-03-11 22:59:09 +09:00
|
|
|
|
next(self.handleColorN(operatorList, OPS.setStrokeColorN, args,
|
2017-03-26 21:12:53 +09:00
|
|
|
|
cs, patterns, resources, task));
|
2016-03-11 22:59:09 +09:00
|
|
|
|
return;
|
2014-05-22 02:47:42 +09:00
|
|
|
|
}
|
|
|
|
|
args = cs.getRgb(args, 0);
|
|
|
|
|
fn = OPS.setStrokeRGBColor;
|
|
|
|
|
break;
|
|
|
|
|
|
2014-05-10 10:21:15 +09:00
|
|
|
|
case OPS.shadingFill:
|
|
|
|
|
var shadingRes = resources.get('Shading');
|
2017-03-26 20:53:13 +09:00
|
|
|
|
assert(shadingRes, 'No shading resource found');
|
2013-06-05 09:57:52 +09:00
|
|
|
|
|
2014-05-22 02:47:42 +09:00
|
|
|
|
var shading = shadingRes.get(args[0].name);
|
2017-03-26 20:53:13 +09:00
|
|
|
|
assert(shading, 'No shading object found');
|
2013-06-05 09:57:52 +09:00
|
|
|
|
|
2014-05-10 10:21:15 +09:00
|
|
|
|
var shadingFill = Pattern.parseShading(shading, null, xref,
|
2015-12-01 05:42:47 +09:00
|
|
|
|
resources, self.handler);
|
2014-05-10 10:21:15 +09:00
|
|
|
|
var patternIR = shadingFill.getIR();
|
|
|
|
|
args = [patternIR];
|
|
|
|
|
fn = OPS.shadingFill;
|
2014-03-23 03:15:51 +09:00
|
|
|
|
break;
|
2014-05-10 10:21:15 +09:00
|
|
|
|
case OPS.setGState:
|
|
|
|
|
var dictName = args[0];
|
|
|
|
|
var extGState = resources.get('ExtGState');
|
2014-01-17 22:16:52 +09:00
|
|
|
|
|
2014-05-10 10:21:15 +09:00
|
|
|
|
if (!isDict(extGState) || !extGState.has(dictName.name)) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
2011-10-25 08:55:23 +09:00
|
|
|
|
|
2014-05-10 10:21:15 +09:00
|
|
|
|
var gState = extGState.get(dictName.name);
|
2017-03-26 21:12:53 +09:00
|
|
|
|
next(self.setGState(resources, gState, operatorList, task,
|
|
|
|
|
stateManager));
|
2016-03-11 22:59:09 +09:00
|
|
|
|
return;
|
2014-05-10 10:21:15 +09:00
|
|
|
|
case OPS.moveTo:
|
|
|
|
|
case OPS.lineTo:
|
|
|
|
|
case OPS.curveTo:
|
|
|
|
|
case OPS.curveTo2:
|
|
|
|
|
case OPS.curveTo3:
|
|
|
|
|
case OPS.closePath:
|
|
|
|
|
self.buildPath(operatorList, fn, args);
|
|
|
|
|
continue;
|
2014-06-24 05:07:31 +09:00
|
|
|
|
case OPS.rectangle:
|
|
|
|
|
self.buildPath(operatorList, fn, args);
|
|
|
|
|
continue;
|
2015-10-21 22:39:25 +09:00
|
|
|
|
case OPS.markPoint:
|
|
|
|
|
case OPS.markPointProps:
|
|
|
|
|
case OPS.beginMarkedContent:
|
|
|
|
|
case OPS.beginMarkedContentProps:
|
|
|
|
|
case OPS.endMarkedContent:
|
|
|
|
|
case OPS.beginCompat:
|
|
|
|
|
case OPS.endCompat:
|
|
|
|
|
// Ignore operators where the corresponding handlers are known to
|
|
|
|
|
// be no-op in CanvasGraphics (display/canvas.js). This prevents
|
|
|
|
|
// serialization errors and is also a bit more efficient.
|
|
|
|
|
// We could also try to serialize all objects in a general way,
|
|
|
|
|
// e.g. as done in https://github.com/mozilla/pdf.js/pull/6266,
|
|
|
|
|
// but doing so is meaningless without knowing the semantics.
|
|
|
|
|
continue;
|
|
|
|
|
default:
|
2016-02-13 02:15:49 +09:00
|
|
|
|
// Note: Ignore the operator if it has `Dict` arguments, since
|
|
|
|
|
// those are non-serializable, otherwise postMessage will throw
|
2015-10-21 22:39:25 +09:00
|
|
|
|
// "An object could not be cloned.".
|
2016-02-13 02:15:49 +09:00
|
|
|
|
if (args !== null) {
|
|
|
|
|
for (i = 0, ii = args.length; i < ii; i++) {
|
|
|
|
|
if (args[i] instanceof Dict) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (i < ii) {
|
|
|
|
|
warn('getOperatorList - ignoring operator: ' + fn);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-05-10 10:21:15 +09:00
|
|
|
|
}
|
|
|
|
|
operatorList.addOp(fn, args);
|
|
|
|
|
}
|
2014-05-10 10:41:03 +09:00
|
|
|
|
if (stop) {
|
2016-03-11 22:59:09 +09:00
|
|
|
|
next(deferred);
|
2014-05-10 10:41:03 +09:00
|
|
|
|
return;
|
|
|
|
|
}
|
2014-05-10 10:21:15 +09:00
|
|
|
|
// Some PDFs don't close all restores inside object/form.
|
|
|
|
|
// Closing those for them.
|
[api-minor] Always allow e.g. rendering to continue even if there are errors, and add a `stopAtErrors` parameter to `getDocument` to opt-out of this behaviour (issue 6342, issue 3795, bug 1130815)
Other PDF readers, e.g. Adobe Reader and PDFium (in Chrome), will attempt to render as much of a page as possible even if there are errors present.
Currently we just bail as soon the first error is hit, which means that we'll usually not render anything in these cases and just display a blank page instead.
NOTE: This patch changes the default behaviour of the PDF.js API to always attempt to recover as much data as possible, even when encountering errors during e.g. `getOperatorList`/`getTextContent`, which thus improve our handling of corrupt PDF files and allow the default viewer to handle errors slightly more gracefully.
In the event that an API consumer wishes to use the old behaviour, where we stop parsing as soon as an error is encountered, the `stopAtErrors` parameter can be set at `getDocument`.
Fixes, inasmuch it's possible since the PDF files are corrupt, e.g. issue 6342, issue 3795, and [bug 1130815](https://bugzilla.mozilla.org/show_bug.cgi?id=1130815) (and probably others too).
2017-02-19 22:03:08 +09:00
|
|
|
|
closePendingRestoreOPS();
|
2014-05-10 10:21:15 +09:00
|
|
|
|
resolve();
|
2017-04-30 06:36:43 +09:00
|
|
|
|
}).catch((reason) => {
|
[api-minor] Always allow e.g. rendering to continue even if there are errors, and add a `stopAtErrors` parameter to `getDocument` to opt-out of this behaviour (issue 6342, issue 3795, bug 1130815)
Other PDF readers, e.g. Adobe Reader and PDFium (in Chrome), will attempt to render as much of a page as possible even if there are errors present.
Currently we just bail as soon the first error is hit, which means that we'll usually not render anything in these cases and just display a blank page instead.
NOTE: This patch changes the default behaviour of the PDF.js API to always attempt to recover as much data as possible, even when encountering errors during e.g. `getOperatorList`/`getTextContent`, which thus improve our handling of corrupt PDF files and allow the default viewer to handle errors slightly more gracefully.
In the event that an API consumer wishes to use the old behaviour, where we stop parsing as soon as an error is encountered, the `stopAtErrors` parameter can be set at `getDocument`.
Fixes, inasmuch it's possible since the PDF files are corrupt, e.g. issue 6342, issue 3795, and [bug 1130815](https://bugzilla.mozilla.org/show_bug.cgi?id=1130815) (and probably others too).
2017-02-19 22:03:08 +09:00
|
|
|
|
if (this.options.ignoreErrors) {
|
|
|
|
|
// Error(s) in the OperatorList -- sending unsupported feature
|
|
|
|
|
// notification and allow rendering to continue.
|
|
|
|
|
this.handler.send('UnsupportedFeature',
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
{ featureId: UNSUPPORTED_FEATURES.unknown, });
|
[api-minor] Always allow e.g. rendering to continue even if there are errors, and add a `stopAtErrors` parameter to `getDocument` to opt-out of this behaviour (issue 6342, issue 3795, bug 1130815)
Other PDF readers, e.g. Adobe Reader and PDFium (in Chrome), will attempt to render as much of a page as possible even if there are errors present.
Currently we just bail as soon the first error is hit, which means that we'll usually not render anything in these cases and just display a blank page instead.
NOTE: This patch changes the default behaviour of the PDF.js API to always attempt to recover as much data as possible, even when encountering errors during e.g. `getOperatorList`/`getTextContent`, which thus improve our handling of corrupt PDF files and allow the default viewer to handle errors slightly more gracefully.
In the event that an API consumer wishes to use the old behaviour, where we stop parsing as soon as an error is encountered, the `stopAtErrors` parameter can be set at `getDocument`.
Fixes, inasmuch it's possible since the PDF files are corrupt, e.g. issue 6342, issue 3795, and [bug 1130815](https://bugzilla.mozilla.org/show_bug.cgi?id=1130815) (and probably others too).
2017-02-19 22:03:08 +09:00
|
|
|
|
warn('getOperatorList - ignoring errors during task: ' + task.name);
|
|
|
|
|
|
|
|
|
|
closePendingRestoreOPS();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
throw reason;
|
2017-04-30 06:36:43 +09:00
|
|
|
|
});
|
2011-10-25 08:55:23 +09:00
|
|
|
|
},
|
|
|
|
|
|
Change the signatures of the `PartialEvaluator` "constructor" and its `getOperatorList`/`getTextContent` methods to take parameter objects
Currently these methods accept a large number of parameters, which creates quite unwieldy call-sites. When invoking them, you have to remember not only what arguments to supply, but also the correct order, to avoid runtime errors.
Furthermore, since some of the parameters are optional, you also have to remember to pass e.g. `null` or `undefined` for those ones.
Also, adding new parameters to these methods (which happens occasionally), often becomes unnecessarily tedious (based on personal experience).
Please note that I do *not* think that we need/should convert *every* single method in `evaluator.js` (or elsewhere in `/core` files) to take parameter objects. However, in my opinion, once a method starts relying on approximately five parameter (or even more), passing them in individually becomes quite cumbersome.
With these changes, I obviously needed to update the `evaluator_spec.js` unit-tests. The main change there, except the new method signatures[1], is that it's now re-using *one* `PartialEvalutor` instance, since I couldn't see any compelling reason for creating a new one in every single test.
*Note:* If this patch is accepted, my intention is to (time permitting) see if it makes sense to convert additional methods in `evaluator.js` (and other `/core` files) in a similar fashion, but I figured that it'd be a good idea to limit the initial scope somewhat.
---
[1] A fun fact here, note how the `PartialEvaluator` signature used in `evaluator_spec.js` wasn't even correct in the current `master`.
2017-04-30 06:13:51 +09:00
|
|
|
|
getTextContent({ stream, task, resources, stateManager = null,
|
|
|
|
|
normalizeWhitespace = false, combineTextItems = false, }) {
|
|
|
|
|
// Ensure that `resources`/`stateManager` is correctly initialized,
|
|
|
|
|
// even if the provided parameter is e.g. `null`.
|
|
|
|
|
resources = resources || Dict.empty;
|
|
|
|
|
stateManager = stateManager || new StateManager(new TextState());
|
2014-01-18 04:26:00 +09:00
|
|
|
|
|
2015-11-24 00:57:43 +09:00
|
|
|
|
var WhitespaceRegexp = /\s/g;
|
|
|
|
|
|
2014-04-10 08:44:07 +09:00
|
|
|
|
var textContent = {
|
|
|
|
|
items: [],
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
styles: Object.create(null),
|
2014-04-10 08:44:07 +09:00
|
|
|
|
};
|
2015-11-04 01:12:41 +09:00
|
|
|
|
var textContentItem = {
|
|
|
|
|
initialized: false,
|
|
|
|
|
str: [],
|
|
|
|
|
width: 0,
|
|
|
|
|
height: 0,
|
|
|
|
|
vertical: false,
|
|
|
|
|
lastAdvanceWidth: 0,
|
|
|
|
|
lastAdvanceHeight: 0,
|
|
|
|
|
textAdvanceScale: 0,
|
2015-11-06 23:40:44 +09:00
|
|
|
|
spaceWidth: 0,
|
|
|
|
|
fakeSpaceMin: Infinity,
|
|
|
|
|
fakeMultiSpaceMin: Infinity,
|
|
|
|
|
fakeMultiSpaceMax: -0,
|
|
|
|
|
textRunBreakAllowed: false,
|
2015-11-04 01:12:41 +09:00
|
|
|
|
transform: null,
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
fontName: null,
|
2015-11-04 01:12:41 +09:00
|
|
|
|
};
|
2015-02-14 15:27:17 +09:00
|
|
|
|
var SPACE_FACTOR = 0.3;
|
2012-11-10 06:34:11 +09:00
|
|
|
|
var MULTI_SPACE_FACTOR = 1.5;
|
2015-11-06 23:40:44 +09:00
|
|
|
|
var MULTI_SPACE_FACTOR_MAX = 4;
|
2011-12-11 08:24:54 +09:00
|
|
|
|
|
2013-08-01 03:17:36 +09:00
|
|
|
|
var self = this;
|
|
|
|
|
var xref = this.xref;
|
|
|
|
|
|
2012-09-12 07:10:34 +09:00
|
|
|
|
// The xobj is parsed iff it's needed, e.g. if there is a `DO` cmd.
|
|
|
|
|
var xobjs = null;
|
2016-01-28 02:04:13 +09:00
|
|
|
|
var xobjsCache = Object.create(null);
|
2011-12-11 08:24:54 +09:00
|
|
|
|
|
2014-04-10 08:44:07 +09:00
|
|
|
|
var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
|
2013-04-09 07:14:56 +09:00
|
|
|
|
|
2014-04-10 08:44:07 +09:00
|
|
|
|
var textState;
|
|
|
|
|
|
2015-11-04 01:12:41 +09:00
|
|
|
|
function ensureTextContentItem() {
|
|
|
|
|
if (textContentItem.initialized) {
|
|
|
|
|
return textContentItem;
|
|
|
|
|
}
|
2014-04-10 08:44:07 +09:00
|
|
|
|
var font = textState.font;
|
|
|
|
|
if (!(font.loadedName in textContent.styles)) {
|
|
|
|
|
textContent.styles[font.loadedName] = {
|
|
|
|
|
fontFamily: font.fallbackName,
|
|
|
|
|
ascent: font.ascent,
|
|
|
|
|
descent: font.descent,
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
vertical: font.vertical,
|
2014-04-10 08:44:07 +09:00
|
|
|
|
};
|
|
|
|
|
}
|
2015-11-04 01:12:41 +09:00
|
|
|
|
textContentItem.fontName = font.loadedName;
|
|
|
|
|
|
|
|
|
|
// 9.4.4 Text Space Details
|
|
|
|
|
var tsm = [textState.fontSize * textState.textHScale, 0,
|
|
|
|
|
0, textState.fontSize,
|
|
|
|
|
0, textState.textRise];
|
|
|
|
|
|
|
|
|
|
if (font.isType3Font &&
|
|
|
|
|
textState.fontMatrix !== FONT_IDENTITY_MATRIX &&
|
|
|
|
|
textState.fontSize === 1) {
|
|
|
|
|
var glyphHeight = font.bbox[3] - font.bbox[1];
|
|
|
|
|
if (glyphHeight > 0) {
|
|
|
|
|
glyphHeight = glyphHeight * textState.fontMatrix[3];
|
|
|
|
|
tsm[3] *= glyphHeight;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var trm = Util.transform(textState.ctm,
|
|
|
|
|
Util.transform(textState.textMatrix, tsm));
|
|
|
|
|
textContentItem.transform = trm;
|
|
|
|
|
if (!font.vertical) {
|
|
|
|
|
textContentItem.width = 0;
|
|
|
|
|
textContentItem.height = Math.sqrt(trm[2] * trm[2] + trm[3] * trm[3]);
|
|
|
|
|
textContentItem.vertical = false;
|
|
|
|
|
} else {
|
|
|
|
|
textContentItem.width = Math.sqrt(trm[0] * trm[0] + trm[1] * trm[1]);
|
|
|
|
|
textContentItem.height = 0;
|
|
|
|
|
textContentItem.vertical = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var a = textState.textLineMatrix[0];
|
|
|
|
|
var b = textState.textLineMatrix[1];
|
|
|
|
|
var scaleLineX = Math.sqrt(a * a + b * b);
|
|
|
|
|
a = textState.ctm[0];
|
|
|
|
|
b = textState.ctm[1];
|
|
|
|
|
var scaleCtmX = Math.sqrt(a * a + b * b);
|
|
|
|
|
textContentItem.textAdvanceScale = scaleCtmX * scaleLineX;
|
|
|
|
|
textContentItem.lastAdvanceWidth = 0;
|
|
|
|
|
textContentItem.lastAdvanceHeight = 0;
|
|
|
|
|
|
2015-11-06 23:40:44 +09:00
|
|
|
|
var spaceWidth = font.spaceWidth / 1000 * textState.fontSize;
|
|
|
|
|
if (spaceWidth) {
|
|
|
|
|
textContentItem.spaceWidth = spaceWidth;
|
|
|
|
|
textContentItem.fakeSpaceMin = spaceWidth * SPACE_FACTOR;
|
|
|
|
|
textContentItem.fakeMultiSpaceMin = spaceWidth * MULTI_SPACE_FACTOR;
|
|
|
|
|
textContentItem.fakeMultiSpaceMax =
|
|
|
|
|
spaceWidth * MULTI_SPACE_FACTOR_MAX;
|
|
|
|
|
// It's okay for monospace fonts to fake as much space as needed.
|
|
|
|
|
textContentItem.textRunBreakAllowed = !font.isMonospace;
|
|
|
|
|
} else {
|
|
|
|
|
textContentItem.spaceWidth = 0;
|
|
|
|
|
textContentItem.fakeSpaceMin = Infinity;
|
|
|
|
|
textContentItem.fakeMultiSpaceMin = Infinity;
|
|
|
|
|
textContentItem.fakeMultiSpaceMax = 0;
|
|
|
|
|
textContentItem.textRunBreakAllowed = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2015-11-04 01:12:41 +09:00
|
|
|
|
textContentItem.initialized = true;
|
|
|
|
|
return textContentItem;
|
2014-04-10 08:44:07 +09:00
|
|
|
|
}
|
|
|
|
|
|
2015-11-24 00:57:43 +09:00
|
|
|
|
function replaceWhitespace(str) {
|
|
|
|
|
// Replaces all whitespaces with standard spaces (0x20), to avoid
|
|
|
|
|
// alignment issues between the textLayer and the canvas if the text
|
|
|
|
|
// contains e.g. tabs (fixes issue6612.pdf).
|
|
|
|
|
var i = 0, ii = str.length, code;
|
|
|
|
|
while (i < ii && (code = str.charCodeAt(i)) >= 0x20 && code <= 0x7F) {
|
|
|
|
|
i++;
|
|
|
|
|
}
|
|
|
|
|
return (i < ii ? str.replace(WhitespaceRegexp, ' ') : str);
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-04 01:12:41 +09:00
|
|
|
|
function runBidiTransform(textChunk) {
|
2014-06-18 22:59:52 +09:00
|
|
|
|
var str = textChunk.str.join('');
|
2016-03-03 09:48:21 +09:00
|
|
|
|
var bidiResult = bidi(str, -1, textChunk.vertical);
|
2015-11-04 01:12:41 +09:00
|
|
|
|
return {
|
2015-11-24 00:57:43 +09:00
|
|
|
|
str: (normalizeWhitespace ? replaceWhitespace(bidiResult.str) :
|
|
|
|
|
bidiResult.str),
|
2015-11-04 01:12:41 +09:00
|
|
|
|
dir: bidiResult.dir,
|
|
|
|
|
width: textChunk.width,
|
|
|
|
|
height: textChunk.height,
|
|
|
|
|
transform: textChunk.transform,
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
fontName: textChunk.fontName,
|
2015-11-04 01:12:41 +09:00
|
|
|
|
};
|
2014-04-10 08:44:07 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function handleSetFont(fontName, fontRef) {
|
2017-03-26 21:12:53 +09:00
|
|
|
|
return self.loadFont(fontName, fontRef, resources).
|
2014-05-20 06:27:54 +09:00
|
|
|
|
then(function (translated) {
|
|
|
|
|
textState.font = translated.font;
|
|
|
|
|
textState.fontMatrix = translated.font.fontMatrix ||
|
2014-05-10 10:21:15 +09:00
|
|
|
|
FONT_IDENTITY_MATRIX;
|
|
|
|
|
});
|
2014-04-10 08:44:07 +09:00
|
|
|
|
}
|
|
|
|
|
|
2015-11-04 01:12:41 +09:00
|
|
|
|
function buildTextContentItem(chars) {
|
2014-04-10 08:44:07 +09:00
|
|
|
|
var font = textState.font;
|
2015-11-04 01:12:41 +09:00
|
|
|
|
var textChunk = ensureTextContentItem();
|
2014-04-10 08:44:07 +09:00
|
|
|
|
var width = 0;
|
|
|
|
|
var height = 0;
|
|
|
|
|
var glyphs = font.charsToGlyphs(chars);
|
|
|
|
|
for (var i = 0; i < glyphs.length; i++) {
|
|
|
|
|
var glyph = glyphs[i];
|
|
|
|
|
var glyphWidth = null;
|
2017-01-19 22:00:36 +09:00
|
|
|
|
if (font.vertical && glyph.vmetric) {
|
|
|
|
|
glyphWidth = glyph.vmetric[0];
|
2014-04-10 08:44:07 +09:00
|
|
|
|
} else {
|
|
|
|
|
glyphWidth = glyph.width;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var glyphUnicode = glyph.unicode;
|
2016-01-22 07:10:42 +09:00
|
|
|
|
var NormalizedUnicodes = getNormalizedUnicodes();
|
2014-06-02 19:43:20 +09:00
|
|
|
|
if (NormalizedUnicodes[glyphUnicode] !== undefined) {
|
2014-04-10 08:44:07 +09:00
|
|
|
|
glyphUnicode = NormalizedUnicodes[glyphUnicode];
|
|
|
|
|
}
|
|
|
|
|
glyphUnicode = reverseIfRtl(glyphUnicode);
|
|
|
|
|
|
2015-11-02 23:54:15 +09:00
|
|
|
|
var charSpacing = textState.charSpacing;
|
|
|
|
|
if (glyph.isSpace) {
|
|
|
|
|
var wordSpacing = textState.wordSpacing;
|
|
|
|
|
charSpacing += wordSpacing;
|
|
|
|
|
if (wordSpacing > 0) {
|
2015-11-06 23:40:44 +09:00
|
|
|
|
addFakeSpaces(wordSpacing, textChunk.str);
|
2015-11-02 23:54:15 +09:00
|
|
|
|
}
|
2015-05-10 18:28:15 +09:00
|
|
|
|
}
|
|
|
|
|
|
2014-04-10 08:44:07 +09:00
|
|
|
|
var tx = 0;
|
|
|
|
|
var ty = 0;
|
|
|
|
|
if (!font.vertical) {
|
|
|
|
|
var w0 = glyphWidth * textState.fontMatrix[0];
|
2015-05-10 18:28:15 +09:00
|
|
|
|
tx = (w0 * textState.fontSize + charSpacing) *
|
2014-04-10 08:44:07 +09:00
|
|
|
|
textState.textHScale;
|
|
|
|
|
width += tx;
|
|
|
|
|
} else {
|
|
|
|
|
var w1 = glyphWidth * textState.fontMatrix[0];
|
2015-05-10 18:28:15 +09:00
|
|
|
|
ty = w1 * textState.fontSize + charSpacing;
|
2014-04-10 08:44:07 +09:00
|
|
|
|
height += ty;
|
|
|
|
|
}
|
|
|
|
|
textState.translateTextMatrix(tx, ty);
|
|
|
|
|
|
2014-06-18 22:59:52 +09:00
|
|
|
|
textChunk.str.push(glyphUnicode);
|
2014-04-10 08:44:07 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!font.vertical) {
|
2015-11-04 01:12:41 +09:00
|
|
|
|
textChunk.lastAdvanceWidth = width;
|
2016-12-07 07:07:16 +09:00
|
|
|
|
textChunk.width += width;
|
2014-04-10 08:44:07 +09:00
|
|
|
|
} else {
|
2015-11-04 01:12:41 +09:00
|
|
|
|
textChunk.lastAdvanceHeight = height;
|
2016-12-07 07:07:16 +09:00
|
|
|
|
textChunk.height += Math.abs(height);
|
2014-04-10 08:44:07 +09:00
|
|
|
|
}
|
2015-11-06 23:40:44 +09:00
|
|
|
|
|
2014-04-10 08:44:07 +09:00
|
|
|
|
return textChunk;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-02 23:54:15 +09:00
|
|
|
|
function addFakeSpaces(width, strBuf) {
|
2015-11-06 23:40:44 +09:00
|
|
|
|
if (width < textContentItem.fakeSpaceMin) {
|
2015-11-02 23:54:15 +09:00
|
|
|
|
return;
|
|
|
|
|
}
|
2015-11-06 23:40:44 +09:00
|
|
|
|
if (width < textContentItem.fakeMultiSpaceMin) {
|
|
|
|
|
strBuf.push(' ');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var fakeSpaces = Math.round(width / textContentItem.spaceWidth);
|
|
|
|
|
while (fakeSpaces-- > 0) {
|
2015-11-02 23:54:15 +09:00
|
|
|
|
strBuf.push(' ');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-04 01:12:41 +09:00
|
|
|
|
function flushTextContentItem() {
|
|
|
|
|
if (!textContentItem.initialized) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2016-12-07 07:07:16 +09:00
|
|
|
|
|
|
|
|
|
// Do final text scaling
|
|
|
|
|
textContentItem.width *= textContentItem.textAdvanceScale;
|
|
|
|
|
textContentItem.height *= textContentItem.textAdvanceScale;
|
2015-11-04 01:12:41 +09:00
|
|
|
|
textContent.items.push(runBidiTransform(textContentItem));
|
|
|
|
|
|
|
|
|
|
textContentItem.initialized = false;
|
|
|
|
|
textContentItem.str.length = 0;
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-10 10:41:03 +09:00
|
|
|
|
var timeSlotManager = new TimeSlotManager();
|
|
|
|
|
|
2016-03-11 22:59:09 +09:00
|
|
|
|
return new Promise(function promiseBody(resolve, reject) {
|
|
|
|
|
var next = function (promise) {
|
|
|
|
|
promise.then(function () {
|
|
|
|
|
try {
|
|
|
|
|
promiseBody(resolve, reject);
|
|
|
|
|
} catch (ex) {
|
|
|
|
|
reject(ex);
|
|
|
|
|
}
|
|
|
|
|
}, reject);
|
|
|
|
|
};
|
2015-10-21 10:50:32 +09:00
|
|
|
|
task.ensureNotTerminated();
|
2014-05-10 10:41:03 +09:00
|
|
|
|
timeSlotManager.reset();
|
2014-08-11 09:23:23 +09:00
|
|
|
|
var stop, operation = {}, args = [];
|
|
|
|
|
while (!(stop = timeSlotManager.check())) {
|
|
|
|
|
// The arguments parsed by read() are not used beyond this loop, so
|
|
|
|
|
// we can reuse the same array on every iteration, thus avoiding
|
|
|
|
|
// unnecessary allocations.
|
|
|
|
|
args.length = 0;
|
|
|
|
|
operation.args = args;
|
|
|
|
|
if (!(preprocessor.read(operation))) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
2014-05-10 10:21:15 +09:00
|
|
|
|
textState = stateManager.state;
|
|
|
|
|
var fn = operation.fn;
|
2014-08-11 09:23:23 +09:00
|
|
|
|
args = operation.args;
|
2016-05-15 05:13:12 +09:00
|
|
|
|
var advance, diff;
|
2014-08-11 09:23:23 +09:00
|
|
|
|
|
2014-05-10 10:21:15 +09:00
|
|
|
|
switch (fn | 0) {
|
|
|
|
|
case OPS.setFont:
|
2016-06-01 06:01:35 +09:00
|
|
|
|
// Optimization to ignore multiple identical Tf commands.
|
|
|
|
|
var fontNameArg = args[0].name, fontSizeArg = args[1];
|
|
|
|
|
if (textState.font && fontNameArg === textState.fontName &&
|
|
|
|
|
fontSizeArg === textState.fontSize) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-04 01:12:41 +09:00
|
|
|
|
flushTextContentItem();
|
2016-06-01 06:01:35 +09:00
|
|
|
|
textState.fontName = fontNameArg;
|
|
|
|
|
textState.fontSize = fontSizeArg;
|
|
|
|
|
next(handleSetFont(fontNameArg, null));
|
2016-03-11 22:59:09 +09:00
|
|
|
|
return;
|
2014-05-10 10:21:15 +09:00
|
|
|
|
case OPS.setTextRise:
|
2015-11-04 01:12:41 +09:00
|
|
|
|
flushTextContentItem();
|
2014-05-10 10:21:15 +09:00
|
|
|
|
textState.textRise = args[0];
|
|
|
|
|
break;
|
|
|
|
|
case OPS.setHScale:
|
2015-11-04 01:12:41 +09:00
|
|
|
|
flushTextContentItem();
|
2014-05-10 10:21:15 +09:00
|
|
|
|
textState.textHScale = args[0] / 100;
|
|
|
|
|
break;
|
|
|
|
|
case OPS.setLeading:
|
2015-11-04 01:12:41 +09:00
|
|
|
|
flushTextContentItem();
|
2014-05-10 10:21:15 +09:00
|
|
|
|
textState.leading = args[0];
|
|
|
|
|
break;
|
|
|
|
|
case OPS.moveText:
|
2015-11-04 01:12:41 +09:00
|
|
|
|
// Optimization to treat same line movement as advance
|
|
|
|
|
var isSameTextLine = !textState.font ? false :
|
|
|
|
|
((textState.font.vertical ? args[0] : args[1]) === 0);
|
2015-11-06 23:40:44 +09:00
|
|
|
|
advance = args[0] - args[1];
|
2016-07-04 01:29:47 +09:00
|
|
|
|
if (combineTextItems &&
|
|
|
|
|
isSameTextLine && textContentItem.initialized &&
|
2015-11-06 23:40:44 +09:00
|
|
|
|
advance > 0 &&
|
|
|
|
|
advance <= textContentItem.fakeMultiSpaceMax) {
|
2015-11-04 01:12:41 +09:00
|
|
|
|
textState.translateTextLineMatrix(args[0], args[1]);
|
|
|
|
|
textContentItem.width +=
|
|
|
|
|
(args[0] - textContentItem.lastAdvanceWidth);
|
|
|
|
|
textContentItem.height +=
|
|
|
|
|
(args[1] - textContentItem.lastAdvanceHeight);
|
2016-05-15 05:13:12 +09:00
|
|
|
|
diff = (args[0] - textContentItem.lastAdvanceWidth) -
|
|
|
|
|
(args[1] - textContentItem.lastAdvanceHeight);
|
2015-11-06 23:40:44 +09:00
|
|
|
|
addFakeSpaces(diff, textContentItem.str);
|
2015-11-04 01:12:41 +09:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
flushTextContentItem();
|
2014-05-10 10:21:15 +09:00
|
|
|
|
textState.translateTextLineMatrix(args[0], args[1]);
|
|
|
|
|
textState.textMatrix = textState.textLineMatrix.slice();
|
|
|
|
|
break;
|
|
|
|
|
case OPS.setLeadingMoveText:
|
2015-11-04 01:12:41 +09:00
|
|
|
|
flushTextContentItem();
|
2014-05-10 10:21:15 +09:00
|
|
|
|
textState.leading = -args[1];
|
|
|
|
|
textState.translateTextLineMatrix(args[0], args[1]);
|
|
|
|
|
textState.textMatrix = textState.textLineMatrix.slice();
|
|
|
|
|
break;
|
|
|
|
|
case OPS.nextLine:
|
2015-11-04 01:12:41 +09:00
|
|
|
|
flushTextContentItem();
|
2014-05-10 10:21:15 +09:00
|
|
|
|
textState.carriageReturn();
|
|
|
|
|
break;
|
|
|
|
|
case OPS.setTextMatrix:
|
2016-05-15 05:13:12 +09:00
|
|
|
|
// Optimization to treat same line movement as advance.
|
|
|
|
|
advance = textState.calcTextLineMatrixAdvance(
|
|
|
|
|
args[0], args[1], args[2], args[3], args[4], args[5]);
|
2016-07-04 01:29:47 +09:00
|
|
|
|
if (combineTextItems &&
|
|
|
|
|
advance !== null && textContentItem.initialized &&
|
2016-05-15 05:13:12 +09:00
|
|
|
|
advance.value > 0 &&
|
|
|
|
|
advance.value <= textContentItem.fakeMultiSpaceMax) {
|
|
|
|
|
textState.translateTextLineMatrix(advance.width,
|
|
|
|
|
advance.height);
|
|
|
|
|
textContentItem.width +=
|
|
|
|
|
(advance.width - textContentItem.lastAdvanceWidth);
|
|
|
|
|
textContentItem.height +=
|
|
|
|
|
(advance.height - textContentItem.lastAdvanceHeight);
|
|
|
|
|
diff = (advance.width - textContentItem.lastAdvanceWidth) -
|
|
|
|
|
(advance.height - textContentItem.lastAdvanceHeight);
|
|
|
|
|
addFakeSpaces(diff, textContentItem.str);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-04 01:12:41 +09:00
|
|
|
|
flushTextContentItem();
|
2014-05-10 10:21:15 +09:00
|
|
|
|
textState.setTextMatrix(args[0], args[1], args[2], args[3],
|
|
|
|
|
args[4], args[5]);
|
|
|
|
|
textState.setTextLineMatrix(args[0], args[1], args[2], args[3],
|
|
|
|
|
args[4], args[5]);
|
|
|
|
|
break;
|
|
|
|
|
case OPS.setCharSpacing:
|
|
|
|
|
textState.charSpacing = args[0];
|
|
|
|
|
break;
|
|
|
|
|
case OPS.setWordSpacing:
|
|
|
|
|
textState.wordSpacing = args[0];
|
|
|
|
|
break;
|
|
|
|
|
case OPS.beginText:
|
2015-11-04 01:12:41 +09:00
|
|
|
|
flushTextContentItem();
|
2014-05-10 10:21:15 +09:00
|
|
|
|
textState.textMatrix = IDENTITY_MATRIX.slice();
|
|
|
|
|
textState.textLineMatrix = IDENTITY_MATRIX.slice();
|
|
|
|
|
break;
|
|
|
|
|
case OPS.showSpacedText:
|
|
|
|
|
var items = args[0];
|
|
|
|
|
var offset;
|
|
|
|
|
for (var j = 0, jj = items.length; j < jj; j++) {
|
|
|
|
|
if (typeof items[j] === 'string') {
|
2015-11-04 01:12:41 +09:00
|
|
|
|
buildTextContentItem(items[j]);
|
2016-10-13 20:47:17 +09:00
|
|
|
|
} else if (isNum(items[j])) {
|
2015-11-06 23:40:44 +09:00
|
|
|
|
ensureTextContentItem();
|
|
|
|
|
|
2015-08-28 20:42:01 +09:00
|
|
|
|
// PDF Specification 5.3.2 states:
|
|
|
|
|
// The number is expressed in thousandths of a unit of text
|
|
|
|
|
// space.
|
|
|
|
|
// This amount is subtracted from the current horizontal or
|
|
|
|
|
// vertical coordinate, depending on the writing mode.
|
|
|
|
|
// In the default coordinate system, a positive adjustment
|
|
|
|
|
// has the effect of moving the next glyph painted either to
|
|
|
|
|
// the left or down by the given amount.
|
2015-11-06 23:40:44 +09:00
|
|
|
|
advance = items[j] * textState.fontSize / 1000;
|
|
|
|
|
var breakTextRun = false;
|
2015-08-28 20:42:01 +09:00
|
|
|
|
if (textState.font.vertical) {
|
2016-12-07 07:07:16 +09:00
|
|
|
|
offset = advance;
|
|
|
|
|
textState.translateTextMatrix(0, offset);
|
2015-11-06 23:40:44 +09:00
|
|
|
|
breakTextRun = textContentItem.textRunBreakAllowed &&
|
|
|
|
|
advance > textContentItem.fakeMultiSpaceMax;
|
|
|
|
|
if (!breakTextRun) {
|
|
|
|
|
// Value needs to be added to height to paint down.
|
|
|
|
|
textContentItem.height += offset;
|
|
|
|
|
}
|
2015-08-28 20:42:01 +09:00
|
|
|
|
} else {
|
2015-11-06 23:40:44 +09:00
|
|
|
|
advance = -advance;
|
2016-12-07 07:07:16 +09:00
|
|
|
|
offset = advance * textState.textHScale;
|
|
|
|
|
textState.translateTextMatrix(offset, 0);
|
2015-11-06 23:40:44 +09:00
|
|
|
|
breakTextRun = textContentItem.textRunBreakAllowed &&
|
|
|
|
|
advance > textContentItem.fakeMultiSpaceMax;
|
|
|
|
|
if (!breakTextRun) {
|
|
|
|
|
// Value needs to be subtracted from width to paint left.
|
|
|
|
|
textContentItem.width += offset;
|
|
|
|
|
}
|
2014-05-10 10:21:15 +09:00
|
|
|
|
}
|
2015-11-06 23:40:44 +09:00
|
|
|
|
if (breakTextRun) {
|
|
|
|
|
flushTextContentItem();
|
|
|
|
|
} else if (advance > 0) {
|
2015-11-04 01:12:41 +09:00
|
|
|
|
addFakeSpaces(advance, textContentItem.str);
|
2012-09-15 02:53:06 +09:00
|
|
|
|
}
|
2013-06-05 09:57:52 +09:00
|
|
|
|
}
|
2013-08-01 03:17:36 +09:00
|
|
|
|
}
|
2014-03-23 03:15:51 +09:00
|
|
|
|
break;
|
2014-05-10 10:21:15 +09:00
|
|
|
|
case OPS.showText:
|
2015-11-04 01:12:41 +09:00
|
|
|
|
buildTextContentItem(args[0]);
|
2014-05-10 10:21:15 +09:00
|
|
|
|
break;
|
|
|
|
|
case OPS.nextLineShowText:
|
2015-11-04 01:12:41 +09:00
|
|
|
|
flushTextContentItem();
|
2014-05-10 10:21:15 +09:00
|
|
|
|
textState.carriageReturn();
|
2015-11-04 01:12:41 +09:00
|
|
|
|
buildTextContentItem(args[0]);
|
2014-05-10 10:21:15 +09:00
|
|
|
|
break;
|
|
|
|
|
case OPS.nextLineSetSpacingShowText:
|
2015-11-04 01:12:41 +09:00
|
|
|
|
flushTextContentItem();
|
2014-05-10 10:21:15 +09:00
|
|
|
|
textState.wordSpacing = args[0];
|
|
|
|
|
textState.charSpacing = args[1];
|
|
|
|
|
textState.carriageReturn();
|
2015-11-04 01:12:41 +09:00
|
|
|
|
buildTextContentItem(args[2]);
|
2014-05-10 10:21:15 +09:00
|
|
|
|
break;
|
|
|
|
|
case OPS.paintXObject:
|
2015-11-04 01:12:41 +09:00
|
|
|
|
flushTextContentItem();
|
2014-05-10 10:21:15 +09:00
|
|
|
|
if (args[0].code) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
2012-09-12 07:10:34 +09:00
|
|
|
|
|
2014-05-10 10:21:15 +09:00
|
|
|
|
if (!xobjs) {
|
|
|
|
|
xobjs = (resources.get('XObject') || Dict.empty);
|
|
|
|
|
}
|
2012-09-12 07:10:34 +09:00
|
|
|
|
|
2014-05-10 10:21:15 +09:00
|
|
|
|
var name = args[0].name;
|
|
|
|
|
if (xobjsCache.key === name) {
|
|
|
|
|
if (xobjsCache.texts) {
|
2015-11-04 01:12:41 +09:00
|
|
|
|
Util.appendToArray(textContent.items, xobjsCache.texts.items);
|
2014-05-10 10:21:15 +09:00
|
|
|
|
Util.extendObj(textContent.styles, xobjsCache.texts.styles);
|
|
|
|
|
}
|
|
|
|
|
break;
|
2014-02-24 23:00:08 +09:00
|
|
|
|
}
|
|
|
|
|
|
2014-05-10 10:21:15 +09:00
|
|
|
|
var xobj = xobjs.get(name);
|
|
|
|
|
if (!xobj) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
assert(isStream(xobj), 'XObject should be a stream');
|
2013-06-05 09:57:52 +09:00
|
|
|
|
|
2014-05-10 10:21:15 +09:00
|
|
|
|
var type = xobj.dict.get('Subtype');
|
2016-08-04 22:13:37 +09:00
|
|
|
|
assert(isName(type), 'XObject should have a Name subtype');
|
2013-06-05 09:57:52 +09:00
|
|
|
|
|
2017-03-07 00:50:22 +09:00
|
|
|
|
if (type.name !== 'Form') {
|
2014-05-10 10:21:15 +09:00
|
|
|
|
xobjsCache.key = name;
|
|
|
|
|
xobjsCache.texts = null;
|
|
|
|
|
break;
|
|
|
|
|
}
|
2012-09-15 11:52:37 +09:00
|
|
|
|
|
[api-minor] Always allow e.g. rendering to continue even if there are errors, and add a `stopAtErrors` parameter to `getDocument` to opt-out of this behaviour (issue 6342, issue 3795, bug 1130815)
Other PDF readers, e.g. Adobe Reader and PDFium (in Chrome), will attempt to render as much of a page as possible even if there are errors present.
Currently we just bail as soon the first error is hit, which means that we'll usually not render anything in these cases and just display a blank page instead.
NOTE: This patch changes the default behaviour of the PDF.js API to always attempt to recover as much data as possible, even when encountering errors during e.g. `getOperatorList`/`getTextContent`, which thus improve our handling of corrupt PDF files and allow the default viewer to handle errors slightly more gracefully.
In the event that an API consumer wishes to use the old behaviour, where we stop parsing as soon as an error is encountered, the `stopAtErrors` parameter can be set at `getDocument`.
Fixes, inasmuch it's possible since the PDF files are corrupt, e.g. issue 6342, issue 3795, and [bug 1130815](https://bugzilla.mozilla.org/show_bug.cgi?id=1130815) (and probably others too).
2017-02-19 22:03:08 +09:00
|
|
|
|
// Use a new `StateManager` to prevent incorrect positioning of
|
|
|
|
|
// textItems *after* the Form XObject, since errors in the data
|
|
|
|
|
// can otherwise prevent `restore` operators from being executed.
|
|
|
|
|
// NOTE: This is only an issue when `options.ignoreErrors = true`.
|
|
|
|
|
var currentState = stateManager.state.clone();
|
|
|
|
|
var xObjStateManager = new StateManager(currentState);
|
|
|
|
|
|
2016-05-06 02:16:35 +09:00
|
|
|
|
var matrix = xobj.dict.getArray('Matrix');
|
2014-05-10 10:21:15 +09:00
|
|
|
|
if (isArray(matrix) && matrix.length === 6) {
|
[api-minor] Always allow e.g. rendering to continue even if there are errors, and add a `stopAtErrors` parameter to `getDocument` to opt-out of this behaviour (issue 6342, issue 3795, bug 1130815)
Other PDF readers, e.g. Adobe Reader and PDFium (in Chrome), will attempt to render as much of a page as possible even if there are errors present.
Currently we just bail as soon the first error is hit, which means that we'll usually not render anything in these cases and just display a blank page instead.
NOTE: This patch changes the default behaviour of the PDF.js API to always attempt to recover as much data as possible, even when encountering errors during e.g. `getOperatorList`/`getTextContent`, which thus improve our handling of corrupt PDF files and allow the default viewer to handle errors slightly more gracefully.
In the event that an API consumer wishes to use the old behaviour, where we stop parsing as soon as an error is encountered, the `stopAtErrors` parameter can be set at `getDocument`.
Fixes, inasmuch it's possible since the PDF files are corrupt, e.g. issue 6342, issue 3795, and [bug 1130815](https://bugzilla.mozilla.org/show_bug.cgi?id=1130815) (and probably others too).
2017-02-19 22:03:08 +09:00
|
|
|
|
xObjStateManager.transform(matrix);
|
2014-05-10 10:21:15 +09:00
|
|
|
|
}
|
2014-04-10 08:44:07 +09:00
|
|
|
|
|
Change the signatures of the `PartialEvaluator` "constructor" and its `getOperatorList`/`getTextContent` methods to take parameter objects
Currently these methods accept a large number of parameters, which creates quite unwieldy call-sites. When invoking them, you have to remember not only what arguments to supply, but also the correct order, to avoid runtime errors.
Furthermore, since some of the parameters are optional, you also have to remember to pass e.g. `null` or `undefined` for those ones.
Also, adding new parameters to these methods (which happens occasionally), often becomes unnecessarily tedious (based on personal experience).
Please note that I do *not* think that we need/should convert *every* single method in `evaluator.js` (or elsewhere in `/core` files) to take parameter objects. However, in my opinion, once a method starts relying on approximately five parameter (or even more), passing them in individually becomes quite cumbersome.
With these changes, I obviously needed to update the `evaluator_spec.js` unit-tests. The main change there, except the new method signatures[1], is that it's now re-using *one* `PartialEvalutor` instance, since I couldn't see any compelling reason for creating a new one in every single test.
*Note:* If this patch is accepted, my intention is to (time permitting) see if it makes sense to convert additional methods in `evaluator.js` (and other `/core` files) in a similar fashion, but I figured that it'd be a good idea to limit the initial scope somewhat.
---
[1] A fun fact here, note how the `PartialEvaluator` signature used in `evaluator_spec.js` wasn't even correct in the current `master`.
2017-04-30 06:13:51 +09:00
|
|
|
|
next(self.getTextContent({
|
|
|
|
|
stream: xobj,
|
|
|
|
|
task,
|
|
|
|
|
resources: xobj.dict.get('Resources') || resources,
|
|
|
|
|
stateManager: xObjStateManager,
|
|
|
|
|
normalizeWhitespace,
|
|
|
|
|
combineTextItems,
|
|
|
|
|
}).then(function (formTextContent) {
|
|
|
|
|
Util.appendToArray(textContent.items, formTextContent.items);
|
|
|
|
|
Util.extendObj(textContent.styles, formTextContent.styles);
|
2013-06-05 09:57:52 +09:00
|
|
|
|
|
Change the signatures of the `PartialEvaluator` "constructor" and its `getOperatorList`/`getTextContent` methods to take parameter objects
Currently these methods accept a large number of parameters, which creates quite unwieldy call-sites. When invoking them, you have to remember not only what arguments to supply, but also the correct order, to avoid runtime errors.
Furthermore, since some of the parameters are optional, you also have to remember to pass e.g. `null` or `undefined` for those ones.
Also, adding new parameters to these methods (which happens occasionally), often becomes unnecessarily tedious (based on personal experience).
Please note that I do *not* think that we need/should convert *every* single method in `evaluator.js` (or elsewhere in `/core` files) to take parameter objects. However, in my opinion, once a method starts relying on approximately five parameter (or even more), passing them in individually becomes quite cumbersome.
With these changes, I obviously needed to update the `evaluator_spec.js` unit-tests. The main change there, except the new method signatures[1], is that it's now re-using *one* `PartialEvalutor` instance, since I couldn't see any compelling reason for creating a new one in every single test.
*Note:* If this patch is accepted, my intention is to (time permitting) see if it makes sense to convert additional methods in `evaluator.js` (and other `/core` files) in a similar fashion, but I figured that it'd be a good idea to limit the initial scope somewhat.
---
[1] A fun fact here, note how the `PartialEvaluator` signature used in `evaluator_spec.js` wasn't even correct in the current `master`.
2017-04-30 06:13:51 +09:00
|
|
|
|
xobjsCache.key = name;
|
|
|
|
|
xobjsCache.texts = formTextContent;
|
|
|
|
|
}));
|
2016-03-11 22:59:09 +09:00
|
|
|
|
return;
|
2014-05-10 10:21:15 +09:00
|
|
|
|
case OPS.setGState:
|
2015-11-04 01:12:41 +09:00
|
|
|
|
flushTextContentItem();
|
2014-05-10 10:21:15 +09:00
|
|
|
|
var dictName = args[0];
|
|
|
|
|
var extGState = resources.get('ExtGState');
|
2014-03-23 03:15:51 +09:00
|
|
|
|
|
2016-06-01 06:40:19 +09:00
|
|
|
|
if (!isDict(extGState) || !isName(dictName)) {
|
2014-05-10 10:21:15 +09:00
|
|
|
|
break;
|
2012-09-15 11:52:37 +09:00
|
|
|
|
}
|
2016-06-01 06:40:19 +09:00
|
|
|
|
var gState = extGState.get(dictName.name);
|
|
|
|
|
if (!isDict(gState)) {
|
|
|
|
|
break;
|
2014-05-10 10:21:15 +09:00
|
|
|
|
}
|
2016-06-01 06:40:19 +09:00
|
|
|
|
var gStateFont = gState.get('Font');
|
|
|
|
|
if (gStateFont) {
|
2016-06-01 06:01:35 +09:00
|
|
|
|
textState.fontName = null;
|
2016-06-01 06:40:19 +09:00
|
|
|
|
textState.fontSize = gStateFont[1];
|
|
|
|
|
next(handleSetFont(null, gStateFont[0]));
|
2016-03-11 22:59:09 +09:00
|
|
|
|
return;
|
2014-05-10 10:21:15 +09:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
} // switch
|
|
|
|
|
} // while
|
2014-05-10 10:41:03 +09:00
|
|
|
|
if (stop) {
|
2016-03-11 22:59:09 +09:00
|
|
|
|
next(deferred);
|
2014-05-10 10:41:03 +09:00
|
|
|
|
return;
|
|
|
|
|
}
|
2015-11-04 01:12:41 +09:00
|
|
|
|
flushTextContentItem();
|
2014-05-10 10:21:15 +09:00
|
|
|
|
resolve(textContent);
|
2017-04-30 06:36:43 +09:00
|
|
|
|
}).catch((reason) => {
|
[api-minor] Always allow e.g. rendering to continue even if there are errors, and add a `stopAtErrors` parameter to `getDocument` to opt-out of this behaviour (issue 6342, issue 3795, bug 1130815)
Other PDF readers, e.g. Adobe Reader and PDFium (in Chrome), will attempt to render as much of a page as possible even if there are errors present.
Currently we just bail as soon the first error is hit, which means that we'll usually not render anything in these cases and just display a blank page instead.
NOTE: This patch changes the default behaviour of the PDF.js API to always attempt to recover as much data as possible, even when encountering errors during e.g. `getOperatorList`/`getTextContent`, which thus improve our handling of corrupt PDF files and allow the default viewer to handle errors slightly more gracefully.
In the event that an API consumer wishes to use the old behaviour, where we stop parsing as soon as an error is encountered, the `stopAtErrors` parameter can be set at `getDocument`.
Fixes, inasmuch it's possible since the PDF files are corrupt, e.g. issue 6342, issue 3795, and [bug 1130815](https://bugzilla.mozilla.org/show_bug.cgi?id=1130815) (and probably others too).
2017-02-19 22:03:08 +09:00
|
|
|
|
if (this.options.ignoreErrors) {
|
|
|
|
|
// Error(s) in the TextContent -- allow text-extraction to continue.
|
|
|
|
|
warn('getTextContent - ignoring errors during task: ' + task.name);
|
|
|
|
|
|
|
|
|
|
flushTextContentItem();
|
|
|
|
|
return textContent;
|
|
|
|
|
}
|
|
|
|
|
throw reason;
|
2017-04-30 06:36:43 +09:00
|
|
|
|
});
|
2011-12-11 08:24:54 +09:00
|
|
|
|
},
|
|
|
|
|
|
2016-04-08 19:14:05 +09:00
|
|
|
|
extractDataStructures:
|
|
|
|
|
function PartialEvaluator_extractDataStructures(dict, baseDict,
|
2017-03-26 21:12:53 +09:00
|
|
|
|
properties) {
|
|
|
|
|
var xref = this.xref;
|
2011-10-29 10:38:31 +09:00
|
|
|
|
// 9.10.2
|
2014-03-23 03:15:51 +09:00
|
|
|
|
var toUnicode = (dict.get('ToUnicode') || baseDict.get('ToUnicode'));
|
2016-02-29 01:20:29 +09:00
|
|
|
|
var toUnicodePromise = toUnicode ?
|
2016-04-08 19:14:05 +09:00
|
|
|
|
this.readToUnicode(toUnicode) : Promise.resolve(undefined);
|
2016-02-29 01:20:29 +09:00
|
|
|
|
|
2011-10-29 10:38:31 +09:00
|
|
|
|
if (properties.composite) {
|
|
|
|
|
// CIDSystemInfo helps to match CID to glyphs
|
2012-04-05 03:43:04 +09:00
|
|
|
|
var cidSystemInfo = dict.get('CIDSystemInfo');
|
2011-10-25 08:55:23 +09:00
|
|
|
|
if (isDict(cidSystemInfo)) {
|
|
|
|
|
properties.cidSystemInfo = {
|
|
|
|
|
registry: cidSystemInfo.get('Registry'),
|
|
|
|
|
ordering: cidSystemInfo.get('Ordering'),
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
supplement: cidSystemInfo.get('Supplement'),
|
2011-10-25 08:55:23 +09:00
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2012-04-05 03:43:04 +09:00
|
|
|
|
var cidToGidMap = dict.get('CIDToGIDMap');
|
2014-03-23 03:15:51 +09:00
|
|
|
|
if (isStream(cidToGidMap)) {
|
2011-10-29 10:38:31 +09:00
|
|
|
|
properties.cidToGidMap = this.readCidToGidMap(cidToGidMap);
|
2014-03-23 03:15:51 +09:00
|
|
|
|
}
|
2011-10-25 08:55:23 +09:00
|
|
|
|
}
|
|
|
|
|
|
2013-04-11 01:51:06 +09:00
|
|
|
|
// Based on 9.6.6 of the spec the encoding can come from multiple places
|
2014-02-12 03:27:09 +09:00
|
|
|
|
// and depends on the font type. The base encoding and differences are
|
|
|
|
|
// read here, but the encoding that is actually used is chosen during
|
|
|
|
|
// glyph mapping in the font.
|
|
|
|
|
// TODO: Loading the built in encoding in the font would allow the
|
|
|
|
|
// differences to be merged in here not require us to hold on to it.
|
2011-10-29 10:38:31 +09:00
|
|
|
|
var differences = [];
|
2014-02-12 03:27:09 +09:00
|
|
|
|
var baseEncodingName = null;
|
2014-04-08 06:42:54 +09:00
|
|
|
|
var encoding;
|
2013-04-11 01:51:06 +09:00
|
|
|
|
if (dict.has('Encoding')) {
|
2014-04-08 06:42:54 +09:00
|
|
|
|
encoding = dict.get('Encoding');
|
2011-10-25 08:55:23 +09:00
|
|
|
|
if (isDict(encoding)) {
|
2014-02-12 03:27:09 +09:00
|
|
|
|
baseEncodingName = encoding.get('BaseEncoding');
|
2014-03-23 03:15:51 +09:00
|
|
|
|
baseEncodingName = (isName(baseEncodingName) ?
|
|
|
|
|
baseEncodingName.name : null);
|
2011-10-25 08:55:23 +09:00
|
|
|
|
// Load the differences between the base and original
|
|
|
|
|
if (encoding.has('Differences')) {
|
|
|
|
|
var diffEncoding = encoding.get('Differences');
|
|
|
|
|
var index = 0;
|
2011-11-03 04:08:19 +09:00
|
|
|
|
for (var j = 0, jj = diffEncoding.length; j < jj; j++) {
|
2016-01-30 02:22:25 +09:00
|
|
|
|
var data = xref.fetchIfRef(diffEncoding[j]);
|
2014-03-23 03:15:51 +09:00
|
|
|
|
if (isNum(data)) {
|
2011-10-25 08:55:23 +09:00
|
|
|
|
index = data;
|
2015-03-09 22:36:45 +09:00
|
|
|
|
} else if (isName(data)) {
|
2011-10-25 08:55:23 +09:00
|
|
|
|
differences[index++] = data.name;
|
2015-03-09 22:36:45 +09:00
|
|
|
|
} else {
|
|
|
|
|
error('Invalid entry in \'Differences\' array: ' + data);
|
2014-03-23 03:15:51 +09:00
|
|
|
|
}
|
2011-10-25 08:55:23 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else if (isName(encoding)) {
|
2014-02-12 03:27:09 +09:00
|
|
|
|
baseEncodingName = encoding.name;
|
2011-10-25 08:55:23 +09:00
|
|
|
|
} else {
|
|
|
|
|
error('Encoding is not a Name nor a Dict');
|
|
|
|
|
}
|
2014-02-12 03:27:09 +09:00
|
|
|
|
// According to table 114 if the encoding is a named encoding it must be
|
|
|
|
|
// one of these predefined encodings.
|
|
|
|
|
if ((baseEncodingName !== 'MacRomanEncoding' &&
|
|
|
|
|
baseEncodingName !== 'MacExpertEncoding' &&
|
|
|
|
|
baseEncodingName !== 'WinAnsiEncoding')) {
|
|
|
|
|
baseEncodingName = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (baseEncodingName) {
|
2016-01-22 06:18:46 +09:00
|
|
|
|
properties.defaultEncoding = getEncoding(baseEncodingName).slice();
|
2014-02-12 03:27:09 +09:00
|
|
|
|
} else {
|
Fallback to the `StandardEncoding` for Nonsymbolic fonts without `/Encoding` entry (issue 7580)
Even though this patch passes all tests (unit/font/reference) locally, including the new ones that I added in PR 7621, I'm still a bit nervous about modifying the code that choose the fallback encoding for fonts without an `/Encoding` entry.
Note that over the years this code has been changed on a number of occasions, see a possibly incomplete [list here], to deal with various cases of incorrect font data.
According to the PDF specification, see http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf#G8.1904184, it seems that we should fallback to the `StandardEncoding` for Nonsymbolic fonts.
There's obviously a risk that fixing this particular issue *could* break other PDF files for which we don't have tests. However I've tried to change the logic as little as possible in this patch, to hopefully reduce possible breakage.
Based on debugging numerous font issue, it seems that a lot of fonts actually set the Symbolic flag, even when they are in fact *not* Symbolic. Fonts actually marked as Nonsymbolic seem to be somewhat less common, which I hope should reduce the risk of the patch somewhat.
Fixes 7580.
2016-09-13 20:43:23 +09:00
|
|
|
|
var isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
|
|
|
|
|
var isNonsymbolicFont = !!(properties.flags & FontFlags.Nonsymbolic);
|
|
|
|
|
// According to "Table 114" in section "9.6.6.1 General" (under
|
|
|
|
|
// "9.6.6 Character Encoding") of the PDF specification, a Nonsymbolic
|
|
|
|
|
// font should use the `StandardEncoding` if no encoding is specified.
|
|
|
|
|
encoding = StandardEncoding;
|
|
|
|
|
if (properties.type === 'TrueType' && !isNonsymbolicFont) {
|
|
|
|
|
encoding = WinAnsiEncoding;
|
|
|
|
|
}
|
2014-02-12 03:27:09 +09:00
|
|
|
|
// The Symbolic attribute can be misused for regular fonts
|
|
|
|
|
// Heuristic: we have to check if the font is a standard one also
|
Fallback to the `StandardEncoding` for Nonsymbolic fonts without `/Encoding` entry (issue 7580)
Even though this patch passes all tests (unit/font/reference) locally, including the new ones that I added in PR 7621, I'm still a bit nervous about modifying the code that choose the fallback encoding for fonts without an `/Encoding` entry.
Note that over the years this code has been changed on a number of occasions, see a possibly incomplete [list here], to deal with various cases of incorrect font data.
According to the PDF specification, see http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf#G8.1904184, it seems that we should fallback to the `StandardEncoding` for Nonsymbolic fonts.
There's obviously a risk that fixing this particular issue *could* break other PDF files for which we don't have tests. However I've tried to change the logic as little as possible in this patch, to hopefully reduce possible breakage.
Based on debugging numerous font issue, it seems that a lot of fonts actually set the Symbolic flag, even when they are in fact *not* Symbolic. Fonts actually marked as Nonsymbolic seem to be somewhat less common, which I hope should reduce the risk of the patch somewhat.
Fixes 7580.
2016-09-13 20:43:23 +09:00
|
|
|
|
if (isSymbolicFont) {
|
2016-01-22 06:18:46 +09:00
|
|
|
|
encoding = MacRomanEncoding;
|
2014-09-01 10:22:24 +09:00
|
|
|
|
if (!properties.file) {
|
|
|
|
|
if (/Symbol/i.test(properties.name)) {
|
2016-01-22 06:18:46 +09:00
|
|
|
|
encoding = SymbolSetEncoding;
|
2014-09-01 10:22:24 +09:00
|
|
|
|
} else if (/Dingbats/i.test(properties.name)) {
|
2016-01-22 06:18:46 +09:00
|
|
|
|
encoding = ZapfDingbatsEncoding;
|
2014-09-01 10:22:24 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
2014-02-12 03:27:09 +09:00
|
|
|
|
}
|
|
|
|
|
properties.defaultEncoding = encoding;
|
2011-10-25 08:55:23 +09:00
|
|
|
|
}
|
2011-11-25 00:38:09 +09:00
|
|
|
|
|
2011-10-29 10:38:31 +09:00
|
|
|
|
properties.differences = differences;
|
2014-02-12 03:27:09 +09:00
|
|
|
|
properties.baseEncodingName = baseEncodingName;
|
For embedded Type1 fonts without included `ToUnicode`/`Encoding` data, attempt to improve text selection by using the `builtInEncoding` to amend the `toUnicode` map (issue 6901, issue 7182, issue 7217, bug 917796, bug 1242142)
Note that in order to prevent any possible issues, this patch does *not* try to amend the `toUnicode` data for Type1 fonts that contain either `ToUnicode` or `Encoding` entries in the font dictionary.
Fixes, or at least improves, issues/bugs such as e.g. 6658, 6901, 7182, 7217, bug 917796, bug 1242142.
2016-08-18 01:33:06 +09:00
|
|
|
|
properties.hasEncoding = !!baseEncodingName || differences.length > 0;
|
2014-02-12 03:27:09 +09:00
|
|
|
|
properties.dict = dict;
|
2017-04-30 06:36:43 +09:00
|
|
|
|
return toUnicodePromise.then((toUnicode) => {
|
2016-02-29 01:20:29 +09:00
|
|
|
|
properties.toUnicode = toUnicode;
|
|
|
|
|
return this.buildToUnicode(properties);
|
2017-04-30 06:36:43 +09:00
|
|
|
|
}).then(function (toUnicode) {
|
2016-02-29 01:20:29 +09:00
|
|
|
|
properties.toUnicode = toUnicode;
|
|
|
|
|
return properties;
|
|
|
|
|
});
|
2011-10-29 10:38:31 +09:00
|
|
|
|
},
|
2011-10-25 08:55:23 +09:00
|
|
|
|
|
2016-02-29 01:20:29 +09:00
|
|
|
|
/**
|
|
|
|
|
* Builds a char code to unicode map based on section 9.10 of the spec.
|
|
|
|
|
* @param {Object} properties Font properties object.
|
2016-04-08 19:14:05 +09:00
|
|
|
|
* @return {Promise} A Promise that is resolved with a
|
|
|
|
|
* {ToUnicodeMap|IdentityToUnicodeMap} object.
|
2016-02-29 01:20:29 +09:00
|
|
|
|
*/
|
2016-04-08 19:14:05 +09:00
|
|
|
|
buildToUnicode: function PartialEvaluator_buildToUnicode(properties) {
|
For embedded Type1 fonts without included `ToUnicode`/`Encoding` data, attempt to improve text selection by using the `builtInEncoding` to amend the `toUnicode` map (issue 6901, issue 7182, issue 7217, bug 917796, bug 1242142)
Note that in order to prevent any possible issues, this patch does *not* try to amend the `toUnicode` data for Type1 fonts that contain either `ToUnicode` or `Encoding` entries in the font dictionary.
Fixes, or at least improves, issues/bugs such as e.g. 6658, 6901, 7182, 7217, bug 917796, bug 1242142.
2016-08-18 01:33:06 +09:00
|
|
|
|
properties.hasIncludedToUnicodeMap =
|
|
|
|
|
!!properties.toUnicode && properties.toUnicode.length > 0;
|
2016-02-29 01:20:29 +09:00
|
|
|
|
// Section 9.10.2 Mapping Character Codes to Unicode Values
|
For embedded Type1 fonts without included `ToUnicode`/`Encoding` data, attempt to improve text selection by using the `builtInEncoding` to amend the `toUnicode` map (issue 6901, issue 7182, issue 7217, bug 917796, bug 1242142)
Note that in order to prevent any possible issues, this patch does *not* try to amend the `toUnicode` data for Type1 fonts that contain either `ToUnicode` or `Encoding` entries in the font dictionary.
Fixes, or at least improves, issues/bugs such as e.g. 6658, 6901, 7182, 7217, bug 917796, bug 1242142.
2016-08-18 01:33:06 +09:00
|
|
|
|
if (properties.hasIncludedToUnicodeMap) {
|
2016-02-29 01:20:29 +09:00
|
|
|
|
return Promise.resolve(properties.toUnicode);
|
|
|
|
|
}
|
|
|
|
|
// According to the spec if the font is a simple font we should only map
|
|
|
|
|
// to unicode if the base encoding is MacRoman, MacExpert, or WinAnsi or
|
|
|
|
|
// the differences array only contains adobe standard or symbol set names,
|
|
|
|
|
// in pratice it seems better to always try to create a toUnicode
|
|
|
|
|
// map based of the default encoding.
|
2016-06-27 20:51:11 +09:00
|
|
|
|
var toUnicode, charcode, glyphName;
|
2016-02-29 01:20:29 +09:00
|
|
|
|
if (!properties.composite /* is simple font */) {
|
|
|
|
|
toUnicode = [];
|
|
|
|
|
var encoding = properties.defaultEncoding.slice();
|
|
|
|
|
var baseEncodingName = properties.baseEncodingName;
|
|
|
|
|
// Merge in the differences array.
|
|
|
|
|
var differences = properties.differences;
|
|
|
|
|
for (charcode in differences) {
|
2016-06-27 20:51:11 +09:00
|
|
|
|
glyphName = differences[charcode];
|
|
|
|
|
if (glyphName === '.notdef') {
|
|
|
|
|
// Skip .notdef to prevent rendering errors, e.g. boxes appearing
|
|
|
|
|
// where there should be spaces (fixes issue5256.pdf).
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
encoding[charcode] = glyphName;
|
2015-02-09 18:05:55 +09:00
|
|
|
|
}
|
2016-02-29 01:20:29 +09:00
|
|
|
|
var glyphsUnicodeMap = getGlyphsUnicode();
|
|
|
|
|
for (charcode in encoding) {
|
|
|
|
|
// a) Map the character code to a character name.
|
2016-06-27 20:51:11 +09:00
|
|
|
|
glyphName = encoding[charcode];
|
2016-02-29 01:20:29 +09:00
|
|
|
|
// b) Look up the character name in the Adobe Glyph List (see the
|
|
|
|
|
// Bibliography) to obtain the corresponding Unicode value.
|
|
|
|
|
if (glyphName === '') {
|
|
|
|
|
continue;
|
|
|
|
|
} else if (glyphsUnicodeMap[glyphName] === undefined) {
|
|
|
|
|
// (undocumented) c) Few heuristics to recognize unknown glyphs
|
|
|
|
|
// NOTE: Adobe Reader does not do this step, but OSX Preview does
|
|
|
|
|
var code = 0;
|
|
|
|
|
switch (glyphName[0]) {
|
|
|
|
|
case 'G': // Gxx glyph
|
|
|
|
|
if (glyphName.length === 3) {
|
|
|
|
|
code = parseInt(glyphName.substr(1), 16);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'g': // g00xx glyph
|
|
|
|
|
if (glyphName.length === 5) {
|
|
|
|
|
code = parseInt(glyphName.substr(1), 16);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'C': // Cddd glyph
|
|
|
|
|
case 'c': // cddd glyph
|
|
|
|
|
if (glyphName.length >= 3) {
|
|
|
|
|
code = +glyphName.substr(1);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
// 'uniXXXX'/'uXXXX{XX}' glyphs
|
|
|
|
|
var unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap);
|
|
|
|
|
if (unicode !== -1) {
|
|
|
|
|
code = unicode;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (code) {
|
|
|
|
|
// If |baseEncodingName| is one the predefined encodings,
|
|
|
|
|
// and |code| equals |charcode|, using the glyph defined in the
|
|
|
|
|
// baseEncoding seems to yield a better |toUnicode| mapping
|
|
|
|
|
// (fixes issue 5070).
|
|
|
|
|
if (baseEncodingName && code === +charcode) {
|
|
|
|
|
var baseEncoding = getEncoding(baseEncodingName);
|
|
|
|
|
if (baseEncoding && (glyphName = baseEncoding[charcode])) {
|
|
|
|
|
toUnicode[charcode] =
|
|
|
|
|
String.fromCharCode(glyphsUnicodeMap[glyphName]);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
toUnicode[charcode] = String.fromCharCode(code);
|
|
|
|
|
}
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
toUnicode[charcode] =
|
|
|
|
|
String.fromCharCode(glyphsUnicodeMap[glyphName]);
|
2015-03-06 23:01:26 +09:00
|
|
|
|
}
|
2016-02-29 01:20:29 +09:00
|
|
|
|
return Promise.resolve(new ToUnicodeMap(toUnicode));
|
|
|
|
|
}
|
|
|
|
|
// If the font is a composite font that uses one of the predefined CMaps
|
|
|
|
|
// listed in Table 118 (except Identity–H and Identity–V) or whose
|
|
|
|
|
// descendant CIDFont uses the Adobe-GB1, Adobe-CNS1, Adobe-Japan1, or
|
|
|
|
|
// Adobe-Korea1 character collection:
|
|
|
|
|
if (properties.composite && (
|
|
|
|
|
(properties.cMap.builtInCMap &&
|
|
|
|
|
!(properties.cMap instanceof IdentityCMap)) ||
|
|
|
|
|
(properties.cidSystemInfo.registry === 'Adobe' &&
|
|
|
|
|
(properties.cidSystemInfo.ordering === 'GB1' ||
|
|
|
|
|
properties.cidSystemInfo.ordering === 'CNS1' ||
|
|
|
|
|
properties.cidSystemInfo.ordering === 'Japan1' ||
|
|
|
|
|
properties.cidSystemInfo.ordering === 'Korea1')))) {
|
|
|
|
|
// Then:
|
|
|
|
|
// a) Map the character code to a character identifier (CID) according
|
|
|
|
|
// to the font’s CMap.
|
|
|
|
|
// b) Obtain the registry and ordering of the character collection used
|
|
|
|
|
// by the font’s CMap (for example, Adobe and Japan1) from its
|
|
|
|
|
// CIDSystemInfo dictionary.
|
|
|
|
|
var registry = properties.cidSystemInfo.registry;
|
|
|
|
|
var ordering = properties.cidSystemInfo.ordering;
|
|
|
|
|
// c) Construct a second CMap name by concatenating the registry and
|
|
|
|
|
// ordering obtained in step (b) in the format registry–ordering–UCS2
|
|
|
|
|
// (for example, Adobe–Japan1–UCS2).
|
2016-04-08 19:14:05 +09:00
|
|
|
|
var ucs2CMapName = Name.get(registry + '-' + ordering + '-UCS2');
|
2016-02-29 01:20:29 +09:00
|
|
|
|
// d) Obtain the CMap with the name constructed in step (c) (available
|
|
|
|
|
// from the ASN Web site; see the Bibliography).
|
2017-02-12 23:54:41 +09:00
|
|
|
|
return CMapFactory.create({
|
|
|
|
|
encoding: ucs2CMapName,
|
|
|
|
|
fetchBuiltInCMap: this.fetchBuiltInCMap,
|
|
|
|
|
useCMap: null,
|
|
|
|
|
}).then(function (ucs2CMap) {
|
2016-02-29 01:20:29 +09:00
|
|
|
|
var cMap = properties.cMap;
|
|
|
|
|
toUnicode = [];
|
|
|
|
|
cMap.forEach(function(charcode, cid) {
|
|
|
|
|
assert(cid <= 0xffff, 'Max size of CID is 65,535');
|
|
|
|
|
// e) Map the CID obtained in step (a) according to the CMap
|
|
|
|
|
// obtained in step (d), producing a Unicode value.
|
|
|
|
|
var ucs2 = ucs2CMap.lookup(cid);
|
|
|
|
|
if (ucs2) {
|
|
|
|
|
toUnicode[charcode] =
|
|
|
|
|
String.fromCharCode((ucs2.charCodeAt(0) << 8) +
|
|
|
|
|
ucs2.charCodeAt(1));
|
2011-10-29 10:38:31 +09:00
|
|
|
|
}
|
2016-02-29 01:20:29 +09:00
|
|
|
|
});
|
|
|
|
|
return new ToUnicodeMap(toUnicode);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// The viewer's choice, just use an identity map.
|
|
|
|
|
return Promise.resolve(new IdentityToUnicodeMap(properties.firstChar,
|
|
|
|
|
properties.lastChar));
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
readToUnicode: function PartialEvaluator_readToUnicode(toUnicode) {
|
|
|
|
|
var cmapObj = toUnicode;
|
|
|
|
|
if (isName(cmapObj)) {
|
2017-02-12 23:54:41 +09:00
|
|
|
|
return CMapFactory.create({
|
|
|
|
|
encoding: cmapObj,
|
|
|
|
|
fetchBuiltInCMap: this.fetchBuiltInCMap,
|
|
|
|
|
useCMap: null,
|
|
|
|
|
}).then(function (cmap) {
|
2016-02-29 01:20:29 +09:00
|
|
|
|
if (cmap instanceof IdentityCMap) {
|
|
|
|
|
return new IdentityToUnicodeMap(0, 0xFFFF);
|
|
|
|
|
}
|
|
|
|
|
return new ToUnicodeMap(cmap.getMap());
|
|
|
|
|
});
|
|
|
|
|
} else if (isStream(cmapObj)) {
|
2017-02-12 23:54:41 +09:00
|
|
|
|
return CMapFactory.create({
|
|
|
|
|
encoding: cmapObj,
|
|
|
|
|
fetchBuiltInCMap: this.fetchBuiltInCMap,
|
|
|
|
|
useCMap: null,
|
|
|
|
|
}).then(function (cmap) {
|
2016-02-29 01:20:29 +09:00
|
|
|
|
if (cmap instanceof IdentityCMap) {
|
|
|
|
|
return new IdentityToUnicodeMap(0, 0xFFFF);
|
2011-10-25 08:55:23 +09:00
|
|
|
|
}
|
2016-02-29 01:20:29 +09:00
|
|
|
|
var map = new Array(cmap.length);
|
|
|
|
|
// Convert UTF-16BE
|
|
|
|
|
// NOTE: cmap can be a sparse array, so use forEach instead of for(;;)
|
|
|
|
|
// to iterate over all keys.
|
|
|
|
|
cmap.forEach(function(charCode, token) {
|
|
|
|
|
var str = [];
|
|
|
|
|
for (var k = 0; k < token.length; k += 2) {
|
|
|
|
|
var w1 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1);
|
|
|
|
|
if ((w1 & 0xF800) !== 0xD800) { // w1 < 0xD800 || w1 > 0xDFFF
|
|
|
|
|
str.push(w1);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
k += 2;
|
|
|
|
|
var w2 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1);
|
|
|
|
|
str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000);
|
|
|
|
|
}
|
|
|
|
|
map[charCode] = String.fromCharCode.apply(String, str);
|
|
|
|
|
});
|
|
|
|
|
return new ToUnicodeMap(map);
|
2014-01-26 02:04:33 +09:00
|
|
|
|
});
|
2011-10-25 08:55:23 +09:00
|
|
|
|
}
|
2016-02-29 01:20:29 +09:00
|
|
|
|
return Promise.resolve(null);
|
2011-10-25 08:55:23 +09:00
|
|
|
|
},
|
2014-03-23 03:15:51 +09:00
|
|
|
|
|
2012-04-05 05:43:26 +09:00
|
|
|
|
readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) {
|
2011-10-29 10:38:31 +09:00
|
|
|
|
// Extract the encoding from the CIDToGIDMap
|
|
|
|
|
var glyphsData = cidToGidStream.getBytes();
|
|
|
|
|
|
|
|
|
|
// Set encoding 0 to later verify the font has an encoding
|
|
|
|
|
var result = [];
|
2011-11-13 02:09:19 +09:00
|
|
|
|
for (var j = 0, jj = glyphsData.length; j < jj; j++) {
|
2011-10-29 10:38:31 +09:00
|
|
|
|
var glyphID = (glyphsData[j++] << 8) | glyphsData[j];
|
2014-03-23 03:15:51 +09:00
|
|
|
|
if (glyphID === 0) {
|
2011-10-29 10:38:31 +09:00
|
|
|
|
continue;
|
2014-03-23 03:15:51 +09:00
|
|
|
|
}
|
2011-10-29 10:38:31 +09:00
|
|
|
|
var code = j >> 1;
|
|
|
|
|
result[code] = glyphID;
|
2011-10-25 08:55:23 +09:00
|
|
|
|
}
|
2011-10-29 10:38:31 +09:00
|
|
|
|
return result;
|
|
|
|
|
},
|
2011-10-25 08:55:23 +09:00
|
|
|
|
|
2017-03-26 21:12:53 +09:00
|
|
|
|
extractWidths: function PartialEvaluator_extractWidths(dict, descriptor,
|
2014-03-23 03:15:51 +09:00
|
|
|
|
properties) {
|
2017-03-26 21:12:53 +09:00
|
|
|
|
var xref = this.xref;
|
2011-10-29 10:38:31 +09:00
|
|
|
|
var glyphsWidths = [];
|
2011-10-25 08:55:23 +09:00
|
|
|
|
var defaultWidth = 0;
|
2013-02-08 21:29:22 +09:00
|
|
|
|
var glyphsVMetrics = [];
|
|
|
|
|
var defaultVMetrics;
|
2014-04-08 06:42:54 +09:00
|
|
|
|
var i, ii, j, jj, start, code, widths;
|
2011-10-29 10:38:31 +09:00
|
|
|
|
if (properties.composite) {
|
2012-04-05 03:43:04 +09:00
|
|
|
|
defaultWidth = dict.get('DW') || 1000;
|
2011-10-29 10:38:31 +09:00
|
|
|
|
|
2014-04-08 06:42:54 +09:00
|
|
|
|
widths = dict.get('W');
|
2011-10-29 10:38:31 +09:00
|
|
|
|
if (widths) {
|
2014-04-08 06:42:54 +09:00
|
|
|
|
for (i = 0, ii = widths.length; i < ii; i++) {
|
2016-11-30 02:28:32 +09:00
|
|
|
|
start = xref.fetchIfRef(widths[i++]);
|
2014-04-08 06:42:54 +09:00
|
|
|
|
code = xref.fetchIfRef(widths[i]);
|
2011-10-29 10:38:31 +09:00
|
|
|
|
if (isArray(code)) {
|
2014-04-08 06:42:54 +09:00
|
|
|
|
for (j = 0, jj = code.length; j < jj; j++) {
|
2016-11-30 02:28:32 +09:00
|
|
|
|
glyphsWidths[start++] = xref.fetchIfRef(code[j]);
|
2014-03-23 03:15:51 +09:00
|
|
|
|
}
|
2013-01-30 07:19:08 +09:00
|
|
|
|
} else {
|
2016-11-30 02:28:32 +09:00
|
|
|
|
var width = xref.fetchIfRef(widths[++i]);
|
2014-04-08 06:42:54 +09:00
|
|
|
|
for (j = start; j <= code; j++) {
|
2011-10-29 10:38:31 +09:00
|
|
|
|
glyphsWidths[j] = width;
|
2014-03-23 03:15:51 +09:00
|
|
|
|
}
|
2011-10-29 10:38:31 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2013-02-08 21:29:22 +09:00
|
|
|
|
|
|
|
|
|
if (properties.vertical) {
|
2016-11-30 02:28:32 +09:00
|
|
|
|
var vmetrics = dict.getArray('DW2') || [880, -1000];
|
2013-03-13 01:27:45 +09:00
|
|
|
|
defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]];
|
2013-02-08 21:29:22 +09:00
|
|
|
|
vmetrics = dict.get('W2');
|
|
|
|
|
if (vmetrics) {
|
2014-04-08 06:42:54 +09:00
|
|
|
|
for (i = 0, ii = vmetrics.length; i < ii; i++) {
|
2016-11-30 02:28:32 +09:00
|
|
|
|
start = xref.fetchIfRef(vmetrics[i++]);
|
2014-04-08 06:42:54 +09:00
|
|
|
|
code = xref.fetchIfRef(vmetrics[i]);
|
2013-02-08 21:29:22 +09:00
|
|
|
|
if (isArray(code)) {
|
2014-04-08 06:42:54 +09:00
|
|
|
|
for (j = 0, jj = code.length; j < jj; j++) {
|
2016-11-30 02:28:32 +09:00
|
|
|
|
glyphsVMetrics[start++] = [
|
|
|
|
|
xref.fetchIfRef(code[j++]),
|
|
|
|
|
xref.fetchIfRef(code[j++]),
|
|
|
|
|
xref.fetchIfRef(code[j])
|
|
|
|
|
];
|
2014-03-23 03:15:51 +09:00
|
|
|
|
}
|
2013-02-08 21:29:22 +09:00
|
|
|
|
} else {
|
2016-11-30 02:28:32 +09:00
|
|
|
|
var vmetric = [
|
|
|
|
|
xref.fetchIfRef(vmetrics[++i]),
|
|
|
|
|
xref.fetchIfRef(vmetrics[++i]),
|
|
|
|
|
xref.fetchIfRef(vmetrics[++i])
|
|
|
|
|
];
|
2014-04-08 06:42:54 +09:00
|
|
|
|
for (j = start; j <= code; j++) {
|
2013-02-08 21:29:22 +09:00
|
|
|
|
glyphsVMetrics[j] = vmetric;
|
2014-03-23 03:15:51 +09:00
|
|
|
|
}
|
2013-02-08 21:29:22 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-10-29 10:38:31 +09:00
|
|
|
|
} else {
|
|
|
|
|
var firstChar = properties.firstChar;
|
2014-04-08 06:42:54 +09:00
|
|
|
|
widths = dict.get('Widths');
|
2011-10-29 10:38:31 +09:00
|
|
|
|
if (widths) {
|
2014-04-08 06:42:54 +09:00
|
|
|
|
j = firstChar;
|
|
|
|
|
for (i = 0, ii = widths.length; i < ii; i++) {
|
2016-11-30 02:28:32 +09:00
|
|
|
|
glyphsWidths[j++] = xref.fetchIfRef(widths[i]);
|
2014-03-23 03:15:51 +09:00
|
|
|
|
}
|
|
|
|
|
defaultWidth = (parseFloat(descriptor.get('MissingWidth')) || 0);
|
2011-10-29 10:38:31 +09:00
|
|
|
|
} else {
|
|
|
|
|
// Trying get the BaseFont metrics (see comment above).
|
|
|
|
|
var baseFontName = dict.get('BaseFont');
|
|
|
|
|
if (isName(baseFontName)) {
|
|
|
|
|
var metrics = this.getBaseFontMetrics(baseFontName.name);
|
|
|
|
|
|
2014-02-12 03:27:09 +09:00
|
|
|
|
glyphsWidths = this.buildCharCodeToWidth(metrics.widths,
|
|
|
|
|
properties);
|
2011-10-29 10:38:31 +09:00
|
|
|
|
defaultWidth = metrics.defaultWidth;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2012-09-17 04:38:30 +09:00
|
|
|
|
// Heuristic: detection of monospace font by checking all non-zero widths
|
2014-03-23 03:15:51 +09:00
|
|
|
|
var isMonospace = true;
|
|
|
|
|
var firstWidth = defaultWidth;
|
2012-09-17 04:38:30 +09:00
|
|
|
|
for (var glyph in glyphsWidths) {
|
|
|
|
|
var glyphWidth = glyphsWidths[glyph];
|
2014-03-23 03:15:51 +09:00
|
|
|
|
if (!glyphWidth) {
|
2012-09-17 04:38:30 +09:00
|
|
|
|
continue;
|
2014-03-23 03:15:51 +09:00
|
|
|
|
}
|
2012-09-17 04:38:30 +09:00
|
|
|
|
if (!firstWidth) {
|
|
|
|
|
firstWidth = glyphWidth;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2014-08-02 01:25:21 +09:00
|
|
|
|
if (firstWidth !== glyphWidth) {
|
2012-09-17 04:38:30 +09:00
|
|
|
|
isMonospace = false;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-03-23 03:15:51 +09:00
|
|
|
|
if (isMonospace) {
|
2012-09-17 04:38:30 +09:00
|
|
|
|
properties.flags |= FontFlags.FixedPitch;
|
2014-03-23 03:15:51 +09:00
|
|
|
|
}
|
2012-09-17 04:38:30 +09:00
|
|
|
|
|
2011-10-29 10:38:31 +09:00
|
|
|
|
properties.defaultWidth = defaultWidth;
|
|
|
|
|
properties.widths = glyphsWidths;
|
2013-02-08 21:29:22 +09:00
|
|
|
|
properties.defaultVMetrics = defaultVMetrics;
|
|
|
|
|
properties.vmetrics = glyphsVMetrics;
|
2011-10-29 10:38:31 +09:00
|
|
|
|
},
|
|
|
|
|
|
2013-01-12 04:04:56 +09:00
|
|
|
|
isSerifFont: function PartialEvaluator_isSerifFont(baseFontName) {
|
|
|
|
|
// Simulating descriptor flags attribute
|
|
|
|
|
var fontNameWoStyle = baseFontName.split('-')[0];
|
2016-01-22 06:52:24 +09:00
|
|
|
|
return (fontNameWoStyle in getSerifFonts()) ||
|
2014-03-23 03:15:51 +09:00
|
|
|
|
(fontNameWoStyle.search(/serif/gi) !== -1);
|
2013-01-12 04:04:56 +09:00
|
|
|
|
},
|
|
|
|
|
|
2012-04-05 05:43:26 +09:00
|
|
|
|
getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) {
|
2014-03-23 03:15:51 +09:00
|
|
|
|
var defaultWidth = 0;
|
|
|
|
|
var widths = [];
|
|
|
|
|
var monospace = false;
|
2016-01-22 06:52:24 +09:00
|
|
|
|
var stdFontMap = getStdFontMap();
|
2014-03-23 03:15:51 +09:00
|
|
|
|
var lookupName = (stdFontMap[name] || name);
|
2016-01-22 07:29:05 +09:00
|
|
|
|
var Metrics = getMetrics();
|
2013-01-12 04:04:56 +09:00
|
|
|
|
|
|
|
|
|
if (!(lookupName in Metrics)) {
|
|
|
|
|
// Use default fonts for looking up font metrics if the passed
|
|
|
|
|
// font is not a base font
|
|
|
|
|
if (this.isSerifFont(name)) {
|
|
|
|
|
lookupName = 'Times-Roman';
|
|
|
|
|
} else {
|
|
|
|
|
lookupName = 'Helvetica';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var glyphWidths = Metrics[lookupName];
|
|
|
|
|
|
2011-10-29 10:38:31 +09:00
|
|
|
|
if (isNum(glyphWidths)) {
|
|
|
|
|
defaultWidth = glyphWidths;
|
2012-09-17 04:38:30 +09:00
|
|
|
|
monospace = true;
|
2011-10-29 10:38:31 +09:00
|
|
|
|
} else {
|
2016-01-22 07:29:05 +09:00
|
|
|
|
widths = glyphWidths(); // expand lazy widths array
|
2011-10-25 08:55:23 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
2017-04-27 19:58:44 +09:00
|
|
|
|
defaultWidth,
|
|
|
|
|
monospace,
|
|
|
|
|
widths,
|
2011-10-25 08:55:23 +09:00
|
|
|
|
};
|
|
|
|
|
},
|
|
|
|
|
|
2014-03-23 03:15:51 +09:00
|
|
|
|
buildCharCodeToWidth:
|
|
|
|
|
function PartialEvaluator_bulildCharCodeToWidth(widthsByGlyphName,
|
|
|
|
|
properties) {
|
2014-02-12 03:27:09 +09:00
|
|
|
|
var widths = Object.create(null);
|
|
|
|
|
var differences = properties.differences;
|
|
|
|
|
var encoding = properties.defaultEncoding;
|
|
|
|
|
for (var charCode = 0; charCode < 256; charCode++) {
|
|
|
|
|
if (charCode in differences &&
|
|
|
|
|
widthsByGlyphName[differences[charCode]]) {
|
|
|
|
|
widths[charCode] = widthsByGlyphName[differences[charCode]];
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) {
|
|
|
|
|
widths[charCode] = widthsByGlyphName[encoding[charCode]];
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return widths;
|
|
|
|
|
},
|
|
|
|
|
|
2017-03-26 21:12:53 +09:00
|
|
|
|
preEvaluateFont: function PartialEvaluator_preEvaluateFont(dict) {
|
2011-10-25 08:55:23 +09:00
|
|
|
|
var baseDict = dict;
|
|
|
|
|
var type = dict.get('Subtype');
|
2014-04-13 23:02:56 +09:00
|
|
|
|
assert(isName(type), 'invalid font Subtype');
|
2011-10-25 08:55:23 +09:00
|
|
|
|
|
|
|
|
|
var composite = false;
|
2014-04-10 02:47:42 +09:00
|
|
|
|
var uint8array;
|
2014-06-02 19:43:20 +09:00
|
|
|
|
if (type.name === 'Type0') {
|
2011-10-25 08:55:23 +09:00
|
|
|
|
// If font is a composite
|
|
|
|
|
// - get the descendant font
|
|
|
|
|
// - set the type according to the descendant font
|
|
|
|
|
// - get the FontDescriptor from the descendant font
|
|
|
|
|
var df = dict.get('DescendantFonts');
|
2017-03-26 20:53:13 +09:00
|
|
|
|
assert(df, 'Descendant fonts are not specified');
|
2017-03-26 21:12:53 +09:00
|
|
|
|
dict = (isArray(df) ? this.xref.fetchIfRef(df[0]) : df);
|
2011-10-25 08:55:23 +09:00
|
|
|
|
|
|
|
|
|
type = dict.get('Subtype');
|
2014-04-13 23:02:56 +09:00
|
|
|
|
assert(isName(type), 'invalid font Subtype');
|
2011-10-25 08:55:23 +09:00
|
|
|
|
composite = true;
|
|
|
|
|
}
|
|
|
|
|
|
2012-04-05 03:43:04 +09:00
|
|
|
|
var descriptor = dict.get('FontDescriptor');
|
2014-03-04 02:44:45 +09:00
|
|
|
|
if (descriptor) {
|
|
|
|
|
var hash = new MurmurHash3_64();
|
|
|
|
|
var encoding = baseDict.getRaw('Encoding');
|
|
|
|
|
if (isName(encoding)) {
|
|
|
|
|
hash.update(encoding.name);
|
|
|
|
|
} else if (isRef(encoding)) {
|
Slightly refactor the `fontRef` handling in `PartialEvaluator_loadFont` (issue 7403 and issue 7402)
Originally, I was just going to change this code to use `Ref_toString` in a couple more places. When I started reading the code, I figured that it wouldn't hurt to clean up a couple of comments. While doing this, I noticed that the logic for the (rare) `isDict(fontRef)` case could do with a few improvements.
There should be no functional changes with this patch, but given the added reference checks, we will now avoid bogus `Ref`s when resolving font aliases. In practice, as issue 7403 shows, the current code can break certain PDF files even if it's very rare.
Note that the only thing that this patch will change, is the `font.loadedName` in the case where a `fontRef` is a reference *and* the font doesn't have a descriptor. Previously for `fontRef = Ref(4, 0)` we'd get `font.loadedName = 'g_d0_f4_0'`, and with this patch `font.loadedName = g_d0_f4R`, which is actually one character shorted in most cases. (Given that `Ref_toString` contains an optimization for the `gen === 0` case, which is by far the most common `gen` value.)
In the already existing fallback case, where the `fontName` is used to when creating the `font.loadedName`, we allow any alphanumeric character. Hence I don't see how (as mentioned above) e.g. `font.loadedName = g_d0_f4R` would be an issue here.
2016-05-23 22:32:04 +09:00
|
|
|
|
hash.update(encoding.toString());
|
2015-04-25 20:27:10 +09:00
|
|
|
|
} else if (isDict(encoding)) {
|
|
|
|
|
var keys = encoding.getKeys();
|
|
|
|
|
for (var i = 0, ii = keys.length; i < ii; i++) {
|
|
|
|
|
var entry = encoding.getRaw(keys[i]);
|
|
|
|
|
if (isName(entry)) {
|
|
|
|
|
hash.update(entry.name);
|
|
|
|
|
} else if (isRef(entry)) {
|
Slightly refactor the `fontRef` handling in `PartialEvaluator_loadFont` (issue 7403 and issue 7402)
Originally, I was just going to change this code to use `Ref_toString` in a couple more places. When I started reading the code, I figured that it wouldn't hurt to clean up a couple of comments. While doing this, I noticed that the logic for the (rare) `isDict(fontRef)` case could do with a few improvements.
There should be no functional changes with this patch, but given the added reference checks, we will now avoid bogus `Ref`s when resolving font aliases. In practice, as issue 7403 shows, the current code can break certain PDF files even if it's very rare.
Note that the only thing that this patch will change, is the `font.loadedName` in the case where a `fontRef` is a reference *and* the font doesn't have a descriptor. Previously for `fontRef = Ref(4, 0)` we'd get `font.loadedName = 'g_d0_f4_0'`, and with this patch `font.loadedName = g_d0_f4R`, which is actually one character shorted in most cases. (Given that `Ref_toString` contains an optimization for the `gen === 0` case, which is by far the most common `gen` value.)
In the already existing fallback case, where the `fontName` is used to when creating the `font.loadedName`, we allow any alphanumeric character. Hence I don't see how (as mentioned above) e.g. `font.loadedName = g_d0_f4R` would be an issue here.
2016-05-23 22:32:04 +09:00
|
|
|
|
hash.update(entry.toString());
|
2016-12-28 08:06:54 +09:00
|
|
|
|
} else if (isArray(entry)) {
|
|
|
|
|
// 'Differences' array (fixes bug1157493.pdf).
|
|
|
|
|
var diffLength = entry.length, diffBuf = new Array(diffLength);
|
|
|
|
|
|
|
|
|
|
for (var j = 0; j < diffLength; j++) {
|
|
|
|
|
var diffEntry = entry[j];
|
|
|
|
|
if (isName(diffEntry)) {
|
|
|
|
|
diffBuf[j] = diffEntry.name;
|
|
|
|
|
} else if (isNum(diffEntry) || isRef(diffEntry)) {
|
|
|
|
|
diffBuf[j] = diffEntry.toString();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
hash.update(diffBuf.join());
|
2015-04-25 20:27:10 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
2014-03-04 02:44:45 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode');
|
|
|
|
|
if (isStream(toUnicode)) {
|
|
|
|
|
var stream = toUnicode.str || toUnicode;
|
2014-04-10 02:47:42 +09:00
|
|
|
|
uint8array = stream.buffer ?
|
2014-03-04 02:44:45 +09:00
|
|
|
|
new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) :
|
|
|
|
|
new Uint8Array(stream.bytes.buffer,
|
|
|
|
|
stream.start, stream.end - stream.start);
|
|
|
|
|
hash.update(uint8array);
|
|
|
|
|
|
|
|
|
|
} else if (isName(toUnicode)) {
|
|
|
|
|
hash.update(toUnicode.name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var widths = dict.get('Widths') || baseDict.get('Widths');
|
|
|
|
|
if (widths) {
|
2014-04-10 02:47:42 +09:00
|
|
|
|
uint8array = new Uint8Array(new Uint32Array(widths).buffer);
|
2014-03-04 02:44:45 +09:00
|
|
|
|
hash.update(uint8array);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
2017-04-27 19:58:44 +09:00
|
|
|
|
descriptor,
|
|
|
|
|
dict,
|
|
|
|
|
baseDict,
|
|
|
|
|
composite,
|
2014-06-16 23:52:04 +09:00
|
|
|
|
type: type.name,
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
hash: hash ? hash.hexdigest() : '',
|
2014-03-04 02:44:45 +09:00
|
|
|
|
};
|
|
|
|
|
},
|
|
|
|
|
|
2017-03-26 21:12:53 +09:00
|
|
|
|
translateFont: function PartialEvaluator_translateFont(preEvaluatedFont) {
|
2014-03-04 02:44:45 +09:00
|
|
|
|
var baseDict = preEvaluatedFont.baseDict;
|
|
|
|
|
var dict = preEvaluatedFont.dict;
|
|
|
|
|
var composite = preEvaluatedFont.composite;
|
|
|
|
|
var descriptor = preEvaluatedFont.descriptor;
|
2014-06-16 23:52:04 +09:00
|
|
|
|
var type = preEvaluatedFont.type;
|
2014-03-04 02:44:45 +09:00
|
|
|
|
var maxCharIndex = (composite ? 0xFFFF : 0xFF);
|
2014-04-10 02:47:42 +09:00
|
|
|
|
var properties;
|
2014-03-04 02:44:45 +09:00
|
|
|
|
|
2011-10-25 08:55:23 +09:00
|
|
|
|
if (!descriptor) {
|
2014-06-16 23:52:04 +09:00
|
|
|
|
if (type === 'Type3') {
|
2011-10-25 08:55:23 +09:00
|
|
|
|
// FontDescriptor is only required for Type3 fonts when the document
|
|
|
|
|
// is a tagged pdf. Create a barbebones one to get by.
|
2014-03-26 23:07:38 +09:00
|
|
|
|
descriptor = new Dict(null);
|
2014-06-16 23:52:04 +09:00
|
|
|
|
descriptor.set('FontName', Name.get(type));
|
2016-05-06 02:16:35 +09:00
|
|
|
|
descriptor.set('FontBBox', dict.getArray('FontBBox'));
|
2011-10-25 08:55:23 +09:00
|
|
|
|
} else {
|
|
|
|
|
// Before PDF 1.5 if the font was one of the base 14 fonts, having a
|
|
|
|
|
// FontDescriptor was not required.
|
|
|
|
|
// This case is here for compatibility.
|
|
|
|
|
var baseFontName = dict.get('BaseFont');
|
2017-03-26 20:53:13 +09:00
|
|
|
|
assert(isName(baseFontName), 'Base font is not specified');
|
2011-10-25 08:55:23 +09:00
|
|
|
|
|
|
|
|
|
// Using base font name as a font name.
|
|
|
|
|
baseFontName = baseFontName.name.replace(/[,_]/g, '-');
|
2011-10-29 10:38:31 +09:00
|
|
|
|
var metrics = this.getBaseFontMetrics(baseFontName);
|
2011-10-25 08:55:23 +09:00
|
|
|
|
|
2012-01-10 12:15:18 +09:00
|
|
|
|
// Simulating descriptor flags attribute
|
|
|
|
|
var fontNameWoStyle = baseFontName.split('-')[0];
|
2014-03-23 03:15:51 +09:00
|
|
|
|
var flags =
|
|
|
|
|
(this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) |
|
2012-09-17 04:38:30 +09:00
|
|
|
|
(metrics.monospace ? FontFlags.FixedPitch : 0) |
|
2016-01-22 06:52:24 +09:00
|
|
|
|
(getSymbolsFonts()[fontNameWoStyle] ? FontFlags.Symbolic :
|
|
|
|
|
FontFlags.Nonsymbolic);
|
2012-01-10 12:15:18 +09:00
|
|
|
|
|
2014-04-08 06:42:54 +09:00
|
|
|
|
properties = {
|
2017-04-27 19:58:44 +09:00
|
|
|
|
type,
|
2014-01-09 07:33:22 +09:00
|
|
|
|
name: baseFontName,
|
2011-10-29 10:38:31 +09:00
|
|
|
|
widths: metrics.widths,
|
|
|
|
|
defaultWidth: metrics.defaultWidth,
|
2017-04-27 19:58:44 +09:00
|
|
|
|
flags,
|
2011-10-25 08:55:23 +09:00
|
|
|
|
firstChar: 0,
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
lastChar: maxCharIndex,
|
2011-10-25 08:55:23 +09:00
|
|
|
|
};
|
2017-04-30 06:36:43 +09:00
|
|
|
|
return this.extractDataStructures(dict, dict, properties).
|
|
|
|
|
then((properties) => {
|
|
|
|
|
properties.widths = this.buildCharCodeToWidth(metrics.widths,
|
|
|
|
|
properties);
|
|
|
|
|
return new Font(baseFontName, null, properties);
|
|
|
|
|
});
|
2011-10-25 08:55:23 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// According to the spec if 'FontDescriptor' is declared, 'FirstChar',
|
2012-01-20 04:19:19 +09:00
|
|
|
|
// 'LastChar' and 'Widths' should exist too, but some PDF encoders seem
|
2016-07-17 21:33:41 +09:00
|
|
|
|
// to ignore this rule when a variant of a standard font is used.
|
2011-10-25 08:55:23 +09:00
|
|
|
|
// TODO Fill the width array depending on which of the base font this is
|
|
|
|
|
// a variant.
|
2014-03-23 03:15:51 +09:00
|
|
|
|
var firstChar = (dict.get('FirstChar') || 0);
|
|
|
|
|
var lastChar = (dict.get('LastChar') || maxCharIndex);
|
2013-01-12 10:10:09 +09:00
|
|
|
|
|
2012-04-05 03:43:04 +09:00
|
|
|
|
var fontName = descriptor.get('FontName');
|
2013-02-06 06:47:41 +09:00
|
|
|
|
var baseFont = dict.get('BaseFont');
|
2014-03-23 03:15:51 +09:00
|
|
|
|
// Some bad PDFs have a string as the font name.
|
2013-01-12 10:10:09 +09:00
|
|
|
|
if (isString(fontName)) {
|
2014-02-28 13:41:03 +09:00
|
|
|
|
fontName = Name.get(fontName);
|
2013-01-12 10:10:09 +09:00
|
|
|
|
}
|
|
|
|
|
if (isString(baseFont)) {
|
2014-02-28 13:41:03 +09:00
|
|
|
|
baseFont = Name.get(baseFont);
|
2013-01-12 10:10:09 +09:00
|
|
|
|
}
|
|
|
|
|
|
2014-06-16 23:52:04 +09:00
|
|
|
|
if (type !== 'Type3') {
|
2013-03-03 21:30:08 +09:00
|
|
|
|
var fontNameStr = fontName && fontName.name;
|
|
|
|
|
var baseFontStr = baseFont && baseFont.name;
|
|
|
|
|
if (fontNameStr !== baseFontStr) {
|
2013-04-17 07:45:29 +09:00
|
|
|
|
info('The FontDescriptor\'s FontName is "' + fontNameStr +
|
2013-03-03 21:30:08 +09:00
|
|
|
|
'" but should be the same as the Font\'s BaseFont "' +
|
|
|
|
|
baseFontStr + '"');
|
2014-04-09 05:49:51 +09:00
|
|
|
|
// Workaround for cases where e.g. fontNameStr = 'Arial' and
|
|
|
|
|
// baseFontStr = 'Arial,Bold' (needed when no font file is embedded).
|
|
|
|
|
if (fontNameStr && baseFontStr &&
|
2014-06-11 00:25:49 +09:00
|
|
|
|
baseFontStr.indexOf(fontNameStr) === 0) {
|
2014-04-09 05:49:51 +09:00
|
|
|
|
fontName = baseFont;
|
|
|
|
|
}
|
2013-03-03 21:30:08 +09:00
|
|
|
|
}
|
2013-01-12 10:10:09 +09:00
|
|
|
|
}
|
2014-03-23 03:15:51 +09:00
|
|
|
|
fontName = (fontName || baseFont);
|
2013-01-12 10:10:09 +09:00
|
|
|
|
|
2014-04-13 23:02:56 +09:00
|
|
|
|
assert(isName(fontName), 'invalid font name');
|
2011-10-25 08:55:23 +09:00
|
|
|
|
|
|
|
|
|
var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3');
|
|
|
|
|
if (fontFile) {
|
|
|
|
|
if (fontFile.dict) {
|
|
|
|
|
var subtype = fontFile.dict.get('Subtype');
|
2014-03-23 03:15:51 +09:00
|
|
|
|
if (subtype) {
|
2011-10-25 08:55:23 +09:00
|
|
|
|
subtype = subtype.name;
|
2014-03-23 03:15:51 +09:00
|
|
|
|
}
|
2011-10-25 08:55:23 +09:00
|
|
|
|
var length1 = fontFile.dict.get('Length1');
|
|
|
|
|
var length2 = fontFile.dict.get('Length2');
|
2016-03-06 06:32:54 +09:00
|
|
|
|
var length3 = fontFile.dict.get('Length3');
|
2011-10-25 08:55:23 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-04-08 06:42:54 +09:00
|
|
|
|
properties = {
|
2017-04-27 19:58:44 +09:00
|
|
|
|
type,
|
2014-01-09 07:33:22 +09:00
|
|
|
|
name: fontName.name,
|
2017-04-27 19:58:44 +09:00
|
|
|
|
subtype,
|
2011-10-25 08:55:23 +09:00
|
|
|
|
file: fontFile,
|
2017-04-27 19:58:44 +09:00
|
|
|
|
length1,
|
|
|
|
|
length2,
|
|
|
|
|
length3,
|
2012-09-14 00:09:46 +09:00
|
|
|
|
loadedName: baseDict.loadedName,
|
2017-04-27 19:58:44 +09:00
|
|
|
|
composite,
|
2012-04-24 07:44:51 +09:00
|
|
|
|
wideChars: composite,
|
2011-10-25 08:55:23 +09:00
|
|
|
|
fixedPitch: false,
|
2016-05-06 02:16:35 +09:00
|
|
|
|
fontMatrix: (dict.getArray('FontMatrix') || FONT_IDENTITY_MATRIX),
|
2011-10-25 08:55:23 +09:00
|
|
|
|
firstChar: firstChar || 0,
|
2014-03-23 03:15:51 +09:00
|
|
|
|
lastChar: (lastChar || maxCharIndex),
|
2016-05-06 02:16:35 +09:00
|
|
|
|
bbox: descriptor.getArray('FontBBox'),
|
2011-10-25 08:55:23 +09:00
|
|
|
|
ascent: descriptor.get('Ascent'),
|
|
|
|
|
descent: descriptor.get('Descent'),
|
|
|
|
|
xHeight: descriptor.get('XHeight'),
|
|
|
|
|
capHeight: descriptor.get('CapHeight'),
|
|
|
|
|
flags: descriptor.get('Flags'),
|
|
|
|
|
italicAngle: descriptor.get('ItalicAngle'),
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
coded: false,
|
2011-10-25 08:55:23 +09:00
|
|
|
|
};
|
2013-02-08 21:29:22 +09:00
|
|
|
|
|
2016-02-29 01:20:29 +09:00
|
|
|
|
var cMapPromise;
|
2013-02-08 21:29:22 +09:00
|
|
|
|
if (composite) {
|
|
|
|
|
var cidEncoding = baseDict.get('Encoding');
|
|
|
|
|
if (isName(cidEncoding)) {
|
|
|
|
|
properties.cidEncoding = cidEncoding.name;
|
|
|
|
|
}
|
2017-02-12 23:54:41 +09:00
|
|
|
|
cMapPromise = CMapFactory.create({
|
|
|
|
|
encoding: cidEncoding,
|
|
|
|
|
fetchBuiltInCMap: this.fetchBuiltInCMap,
|
|
|
|
|
useCMap: null,
|
|
|
|
|
}).then(function (cMap) {
|
2016-02-29 01:20:29 +09:00
|
|
|
|
properties.cMap = cMap;
|
|
|
|
|
properties.vertical = properties.cMap.vertical;
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
cMapPromise = Promise.resolve(undefined);
|
2013-02-08 21:29:22 +09:00
|
|
|
|
}
|
2011-10-25 08:55:23 +09:00
|
|
|
|
|
2017-04-30 06:36:43 +09:00
|
|
|
|
return cMapPromise.then(() => {
|
2017-03-26 21:12:53 +09:00
|
|
|
|
return this.extractDataStructures(dict, baseDict, properties);
|
2017-04-30 06:36:43 +09:00
|
|
|
|
}).then((properties) => {
|
2017-03-26 21:12:53 +09:00
|
|
|
|
this.extractWidths(dict, descriptor, properties);
|
2016-02-29 01:20:29 +09:00
|
|
|
|
|
|
|
|
|
if (type === 'Type3') {
|
|
|
|
|
properties.isType3Font = true;
|
|
|
|
|
}
|
|
|
|
|
return new Font(fontName.name, fontFile, properties);
|
2017-04-30 06:36:43 +09:00
|
|
|
|
});
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
},
|
2011-10-25 08:55:23 +09:00
|
|
|
|
};
|
|
|
|
|
|
2011-12-09 07:18:43 +09:00
|
|
|
|
return PartialEvaluator;
|
2011-10-25 08:55:23 +09:00
|
|
|
|
})();
|
|
|
|
|
|
2014-05-20 06:27:54 +09:00
|
|
|
|
var TranslatedFont = (function TranslatedFontClosure() {
|
|
|
|
|
function TranslatedFont(loadedName, font, dict) {
|
|
|
|
|
this.loadedName = loadedName;
|
|
|
|
|
this.font = font;
|
|
|
|
|
this.dict = dict;
|
|
|
|
|
this.type3Loaded = null;
|
|
|
|
|
this.sent = false;
|
|
|
|
|
}
|
|
|
|
|
TranslatedFont.prototype = {
|
2017-04-27 19:58:44 +09:00
|
|
|
|
send(handler) {
|
2014-05-20 06:27:54 +09:00
|
|
|
|
if (this.sent) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var fontData = this.font.exportData();
|
|
|
|
|
handler.send('commonobj', [
|
|
|
|
|
this.loadedName,
|
|
|
|
|
'Font',
|
|
|
|
|
fontData
|
|
|
|
|
]);
|
|
|
|
|
this.sent = true;
|
|
|
|
|
},
|
2017-04-27 19:58:44 +09:00
|
|
|
|
loadType3Data(evaluator, resources, parentOperatorList, task) {
|
2014-05-20 06:27:54 +09:00
|
|
|
|
assert(this.font.isType3Font);
|
|
|
|
|
|
|
|
|
|
if (this.type3Loaded) {
|
|
|
|
|
return this.type3Loaded;
|
|
|
|
|
}
|
2017-04-05 20:32:36 +09:00
|
|
|
|
// When parsing Type3 glyphs, always ignore them if there are errors.
|
|
|
|
|
// Compared to the parsing of e.g. an entire page, it doesn't really
|
|
|
|
|
// make sense to only be able to render a Type3 glyph partially.
|
|
|
|
|
var type3Options = Object.create(evaluator.options);
|
|
|
|
|
type3Options.ignoreErrors = false;
|
|
|
|
|
var type3Evaluator = evaluator.clone(type3Options);
|
2014-05-20 06:27:54 +09:00
|
|
|
|
|
|
|
|
|
var translatedFont = this.font;
|
|
|
|
|
var loadCharProcsPromise = Promise.resolve();
|
2016-02-11 04:19:14 +09:00
|
|
|
|
var charProcs = this.dict.get('CharProcs');
|
2014-05-20 06:27:54 +09:00
|
|
|
|
var fontResources = this.dict.get('Resources') || resources;
|
2016-02-11 04:19:14 +09:00
|
|
|
|
var charProcKeys = charProcs.getKeys();
|
2016-01-28 02:04:13 +09:00
|
|
|
|
var charProcOperatorList = Object.create(null);
|
2017-04-05 20:32:36 +09:00
|
|
|
|
|
2014-05-20 06:27:54 +09:00
|
|
|
|
for (var i = 0, n = charProcKeys.length; i < n; ++i) {
|
2017-04-30 06:36:43 +09:00
|
|
|
|
let key = charProcKeys[i];
|
|
|
|
|
loadCharProcsPromise = loadCharProcsPromise.then(function () {
|
2016-02-11 04:19:14 +09:00
|
|
|
|
var glyphStream = charProcs.get(key);
|
2014-05-20 06:27:54 +09:00
|
|
|
|
var operatorList = new OperatorList();
|
Change the signatures of the `PartialEvaluator` "constructor" and its `getOperatorList`/`getTextContent` methods to take parameter objects
Currently these methods accept a large number of parameters, which creates quite unwieldy call-sites. When invoking them, you have to remember not only what arguments to supply, but also the correct order, to avoid runtime errors.
Furthermore, since some of the parameters are optional, you also have to remember to pass e.g. `null` or `undefined` for those ones.
Also, adding new parameters to these methods (which happens occasionally), often becomes unnecessarily tedious (based on personal experience).
Please note that I do *not* think that we need/should convert *every* single method in `evaluator.js` (or elsewhere in `/core` files) to take parameter objects. However, in my opinion, once a method starts relying on approximately five parameter (or even more), passing them in individually becomes quite cumbersome.
With these changes, I obviously needed to update the `evaluator_spec.js` unit-tests. The main change there, except the new method signatures[1], is that it's now re-using *one* `PartialEvalutor` instance, since I couldn't see any compelling reason for creating a new one in every single test.
*Note:* If this patch is accepted, my intention is to (time permitting) see if it makes sense to convert additional methods in `evaluator.js` (and other `/core` files) in a similar fashion, but I figured that it'd be a good idea to limit the initial scope somewhat.
---
[1] A fun fact here, note how the `PartialEvaluator` signature used in `evaluator_spec.js` wasn't even correct in the current `master`.
2017-04-30 06:13:51 +09:00
|
|
|
|
return type3Evaluator.getOperatorList({
|
|
|
|
|
stream: glyphStream,
|
|
|
|
|
task,
|
|
|
|
|
resources: fontResources,
|
|
|
|
|
operatorList,
|
|
|
|
|
}).then(function () {
|
2014-07-24 21:59:21 +09:00
|
|
|
|
charProcOperatorList[key] = operatorList.getIR();
|
|
|
|
|
|
|
|
|
|
// Add the dependencies to the parent operator list so they are
|
|
|
|
|
// resolved before sub operator list is executed synchronously.
|
|
|
|
|
parentOperatorList.addDependencies(operatorList.dependencies);
|
2017-04-30 06:36:43 +09:00
|
|
|
|
}).catch(function(reason) {
|
|
|
|
|
warn(`Type3 font resource "${key}" is not available.`);
|
2014-07-24 21:59:21 +09:00
|
|
|
|
var operatorList = new OperatorList();
|
|
|
|
|
charProcOperatorList[key] = operatorList.getIR();
|
|
|
|
|
});
|
2017-04-30 06:36:43 +09:00
|
|
|
|
});
|
2014-05-20 06:27:54 +09:00
|
|
|
|
}
|
|
|
|
|
this.type3Loaded = loadCharProcsPromise.then(function () {
|
|
|
|
|
translatedFont.charProcOperatorList = charProcOperatorList;
|
|
|
|
|
});
|
|
|
|
|
return this.type3Loaded;
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
},
|
2014-05-20 06:27:54 +09:00
|
|
|
|
};
|
|
|
|
|
return TranslatedFont;
|
|
|
|
|
})();
|
|
|
|
|
|
2013-08-01 03:17:36 +09:00
|
|
|
|
var OperatorList = (function OperatorListClosure() {
|
2014-02-24 23:00:08 +09:00
|
|
|
|
var CHUNK_SIZE = 1000;
|
2014-02-25 01:07:36 +09:00
|
|
|
|
var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5; // close to chunk size
|
2013-08-01 03:17:36 +09:00
|
|
|
|
|
2014-03-15 22:01:07 +09:00
|
|
|
|
function getTransfers(queue) {
|
|
|
|
|
var transfers = [];
|
|
|
|
|
var fnArray = queue.fnArray, argsArray = queue.argsArray;
|
|
|
|
|
for (var i = 0, ii = queue.length; i < ii; i++) {
|
|
|
|
|
switch (fnArray[i]) {
|
|
|
|
|
case OPS.paintInlineImageXObject:
|
|
|
|
|
case OPS.paintInlineImageXObjectGroup:
|
|
|
|
|
case OPS.paintImageMaskXObject:
|
|
|
|
|
var arg = argsArray[i][0]; // first param in imgData
|
|
|
|
|
if (!arg.cached) {
|
|
|
|
|
transfers.push(arg.data.buffer);
|
|
|
|
|
}
|
|
|
|
|
break;
|
2013-11-12 12:30:26 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
2014-03-15 22:01:07 +09:00
|
|
|
|
return transfers;
|
|
|
|
|
}
|
2013-11-12 12:30:26 +09:00
|
|
|
|
|
2014-03-15 22:01:07 +09:00
|
|
|
|
function OperatorList(intent, messageHandler, pageIndex) {
|
2013-08-01 03:17:36 +09:00
|
|
|
|
this.messageHandler = messageHandler;
|
2014-03-15 22:04:13 +09:00
|
|
|
|
this.fnArray = [];
|
2013-08-01 03:17:36 +09:00
|
|
|
|
this.argsArray = [];
|
2016-01-28 02:04:13 +09:00
|
|
|
|
this.dependencies = Object.create(null);
|
2015-10-27 00:38:06 +09:00
|
|
|
|
this._totalLength = 0;
|
2013-08-01 03:17:36 +09:00
|
|
|
|
this.pageIndex = pageIndex;
|
2014-03-07 23:48:42 +09:00
|
|
|
|
this.intent = intent;
|
2013-08-01 03:17:36 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
OperatorList.prototype = {
|
2013-11-14 04:43:38 +09:00
|
|
|
|
get length() {
|
|
|
|
|
return this.argsArray.length;
|
|
|
|
|
},
|
|
|
|
|
|
2015-10-27 00:38:06 +09:00
|
|
|
|
/**
|
|
|
|
|
* @returns {number} The total length of the entire operator list,
|
|
|
|
|
* since `this.length === 0` after flushing.
|
|
|
|
|
*/
|
|
|
|
|
get totalLength() {
|
|
|
|
|
return (this._totalLength + this.length);
|
|
|
|
|
},
|
|
|
|
|
|
2017-04-27 19:58:44 +09:00
|
|
|
|
addOp(fn, args) {
|
2014-03-15 22:04:13 +09:00
|
|
|
|
this.fnArray.push(fn);
|
|
|
|
|
this.argsArray.push(args);
|
2013-11-14 04:43:38 +09:00
|
|
|
|
if (this.messageHandler) {
|
2014-03-15 22:04:13 +09:00
|
|
|
|
if (this.fnArray.length >= CHUNK_SIZE) {
|
2013-11-14 04:43:38 +09:00
|
|
|
|
this.flush();
|
2014-03-15 22:04:13 +09:00
|
|
|
|
} else if (this.fnArray.length >= CHUNK_SIZE_ABOUT &&
|
2014-03-23 03:15:51 +09:00
|
|
|
|
(fn === OPS.restore || fn === OPS.endText)) {
|
2014-02-25 01:07:36 +09:00
|
|
|
|
// heuristic to flush on boundary of restore or endText
|
|
|
|
|
this.flush();
|
2013-11-14 04:43:38 +09:00
|
|
|
|
}
|
2013-08-01 03:17:36 +09:00
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
2017-04-27 19:58:44 +09:00
|
|
|
|
addDependency(dependency) {
|
2013-08-01 03:17:36 +09:00
|
|
|
|
if (dependency in this.dependencies) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
this.dependencies[dependency] = true;
|
2013-11-14 04:43:38 +09:00
|
|
|
|
this.addOp(OPS.dependency, [dependency]);
|
2013-08-01 03:17:36 +09:00
|
|
|
|
},
|
|
|
|
|
|
2017-04-27 19:58:44 +09:00
|
|
|
|
addDependencies(dependencies) {
|
2013-08-01 03:17:36 +09:00
|
|
|
|
for (var key in dependencies) {
|
|
|
|
|
this.addDependency(key);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
2017-04-27 19:58:44 +09:00
|
|
|
|
addOpList(opList) {
|
2013-08-01 03:17:36 +09:00
|
|
|
|
Util.extendObj(this.dependencies, opList.dependencies);
|
2013-11-14 04:43:38 +09:00
|
|
|
|
for (var i = 0, ii = opList.length; i < ii; i++) {
|
|
|
|
|
this.addOp(opList.fnArray[i], opList.argsArray[i]);
|
|
|
|
|
}
|
2013-08-01 03:17:36 +09:00
|
|
|
|
},
|
|
|
|
|
|
2017-04-27 19:58:44 +09:00
|
|
|
|
getIR() {
|
2013-08-01 03:17:36 +09:00
|
|
|
|
return {
|
|
|
|
|
fnArray: this.fnArray,
|
2013-11-14 04:43:38 +09:00
|
|
|
|
argsArray: this.argsArray,
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
length: this.length,
|
2013-08-01 03:17:36 +09:00
|
|
|
|
};
|
|
|
|
|
},
|
|
|
|
|
|
2017-04-27 19:58:44 +09:00
|
|
|
|
flush(lastChunk) {
|
2014-08-08 01:30:48 +09:00
|
|
|
|
if (this.intent !== 'oplist') {
|
|
|
|
|
new QueueOptimizer().optimize(this);
|
|
|
|
|
}
|
2013-11-12 12:30:26 +09:00
|
|
|
|
var transfers = getTransfers(this);
|
2015-10-27 00:38:06 +09:00
|
|
|
|
var length = this.length;
|
|
|
|
|
this._totalLength += length;
|
|
|
|
|
|
2013-08-01 03:17:36 +09:00
|
|
|
|
this.messageHandler.send('RenderPageChunk', {
|
|
|
|
|
operatorList: {
|
|
|
|
|
fnArray: this.fnArray,
|
|
|
|
|
argsArray: this.argsArray,
|
2017-04-27 19:58:44 +09:00
|
|
|
|
lastChunk,
|
|
|
|
|
length,
|
2013-08-01 03:17:36 +09:00
|
|
|
|
},
|
2014-03-07 23:48:42 +09:00
|
|
|
|
pageIndex: this.pageIndex,
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
intent: this.intent,
|
2014-05-08 08:15:25 +09:00
|
|
|
|
}, transfers);
|
2016-01-28 02:04:13 +09:00
|
|
|
|
this.dependencies = Object.create(null);
|
2014-03-15 22:04:13 +09:00
|
|
|
|
this.fnArray.length = 0;
|
|
|
|
|
this.argsArray.length = 0;
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
},
|
2013-08-01 03:17:36 +09:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return OperatorList;
|
|
|
|
|
})();
|
2013-11-12 12:30:26 +09:00
|
|
|
|
|
2014-04-10 08:44:07 +09:00
|
|
|
|
var StateManager = (function StateManagerClosure() {
|
|
|
|
|
function StateManager(initialState) {
|
|
|
|
|
this.state = initialState;
|
|
|
|
|
this.stateStack = [];
|
|
|
|
|
}
|
|
|
|
|
StateManager.prototype = {
|
2017-04-27 19:58:44 +09:00
|
|
|
|
save() {
|
2014-04-10 08:44:07 +09:00
|
|
|
|
var old = this.state;
|
|
|
|
|
this.stateStack.push(this.state);
|
|
|
|
|
this.state = old.clone();
|
|
|
|
|
},
|
2017-04-27 19:58:44 +09:00
|
|
|
|
restore() {
|
2014-04-10 08:44:07 +09:00
|
|
|
|
var prev = this.stateStack.pop();
|
|
|
|
|
if (prev) {
|
|
|
|
|
this.state = prev;
|
|
|
|
|
}
|
|
|
|
|
},
|
2017-04-27 19:58:44 +09:00
|
|
|
|
transform(args) {
|
2014-04-10 08:44:07 +09:00
|
|
|
|
this.state.ctm = Util.transform(this.state.ctm, args);
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
},
|
2014-04-10 08:44:07 +09:00
|
|
|
|
};
|
|
|
|
|
return StateManager;
|
|
|
|
|
})();
|
|
|
|
|
|
2013-09-15 02:58:58 +09:00
|
|
|
|
var TextState = (function TextStateClosure() {
|
|
|
|
|
function TextState() {
|
2014-04-10 08:44:07 +09:00
|
|
|
|
this.ctm = new Float32Array(IDENTITY_MATRIX);
|
2016-06-01 06:01:35 +09:00
|
|
|
|
this.fontName = null;
|
2013-09-15 02:58:58 +09:00
|
|
|
|
this.fontSize = 0;
|
2014-04-10 08:44:07 +09:00
|
|
|
|
this.font = null;
|
|
|
|
|
this.fontMatrix = FONT_IDENTITY_MATRIX;
|
|
|
|
|
this.textMatrix = IDENTITY_MATRIX.slice();
|
|
|
|
|
this.textLineMatrix = IDENTITY_MATRIX.slice();
|
|
|
|
|
this.charSpacing = 0;
|
|
|
|
|
this.wordSpacing = 0;
|
2013-09-15 02:58:58 +09:00
|
|
|
|
this.leading = 0;
|
|
|
|
|
this.textHScale = 1;
|
|
|
|
|
this.textRise = 0;
|
|
|
|
|
}
|
2014-03-23 03:15:51 +09:00
|
|
|
|
|
2013-09-15 02:58:58 +09:00
|
|
|
|
TextState.prototype = {
|
|
|
|
|
setTextMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) {
|
|
|
|
|
var m = this.textMatrix;
|
2014-02-10 16:30:39 +09:00
|
|
|
|
m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f;
|
2013-09-15 02:58:58 +09:00
|
|
|
|
},
|
2014-04-10 08:44:07 +09:00
|
|
|
|
setTextLineMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) {
|
|
|
|
|
var m = this.textLineMatrix;
|
|
|
|
|
m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f;
|
|
|
|
|
},
|
2013-09-15 02:58:58 +09:00
|
|
|
|
translateTextMatrix: function TextState_translateTextMatrix(x, y) {
|
|
|
|
|
var m = this.textMatrix;
|
|
|
|
|
m[4] = m[0] * x + m[2] * y + m[4];
|
|
|
|
|
m[5] = m[1] * x + m[3] * y + m[5];
|
|
|
|
|
},
|
2014-04-10 08:44:07 +09:00
|
|
|
|
translateTextLineMatrix: function TextState_translateTextMatrix(x, y) {
|
|
|
|
|
var m = this.textLineMatrix;
|
|
|
|
|
m[4] = m[0] * x + m[2] * y + m[4];
|
|
|
|
|
m[5] = m[1] * x + m[3] * y + m[5];
|
2013-09-15 02:58:58 +09:00
|
|
|
|
},
|
2016-05-15 05:13:12 +09:00
|
|
|
|
calcTextLineMatrixAdvance:
|
|
|
|
|
function TextState_calcTextLineMatrixAdvance(a, b, c, d, e, f) {
|
|
|
|
|
var font = this.font;
|
|
|
|
|
if (!font) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
var m = this.textLineMatrix;
|
|
|
|
|
if (!(a === m[0] && b === m[1] && c === m[2] && d === m[3])) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
var txDiff = e - m[4], tyDiff = f - m[5];
|
|
|
|
|
if ((font.vertical && txDiff !== 0) || (!font.vertical && tyDiff !== 0)) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
var tx, ty, denominator = a * d - b * c;
|
|
|
|
|
if (font.vertical) {
|
|
|
|
|
tx = -tyDiff * c / denominator;
|
|
|
|
|
ty = tyDiff * a / denominator;
|
|
|
|
|
} else {
|
|
|
|
|
tx = txDiff * d / denominator;
|
|
|
|
|
ty = -txDiff * b / denominator;
|
|
|
|
|
}
|
|
|
|
|
return { width: tx, height: ty, value: (font.vertical ? ty : tx), };
|
|
|
|
|
},
|
2014-04-10 08:44:07 +09:00
|
|
|
|
calcRenderMatrix: function TextState_calcRendeMatrix(ctm) {
|
|
|
|
|
// 9.4.4 Text Space Details
|
|
|
|
|
var tsm = [this.fontSize * this.textHScale, 0,
|
|
|
|
|
0, this.fontSize,
|
|
|
|
|
0, this.textRise];
|
|
|
|
|
return Util.transform(ctm, Util.transform(this.textMatrix, tsm));
|
|
|
|
|
},
|
|
|
|
|
carriageReturn: function TextState_carriageReturn() {
|
|
|
|
|
this.translateTextLineMatrix(0, -this.leading);
|
|
|
|
|
this.textMatrix = this.textLineMatrix.slice();
|
|
|
|
|
},
|
|
|
|
|
clone: function TextState_clone() {
|
|
|
|
|
var clone = Object.create(this);
|
|
|
|
|
clone.textMatrix = this.textMatrix.slice();
|
|
|
|
|
clone.textLineMatrix = this.textLineMatrix.slice();
|
|
|
|
|
clone.fontMatrix = this.fontMatrix.slice();
|
|
|
|
|
return clone;
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
},
|
2013-09-15 02:58:58 +09:00
|
|
|
|
};
|
|
|
|
|
return TextState;
|
|
|
|
|
})();
|
2013-08-01 03:17:36 +09:00
|
|
|
|
|
2011-12-09 07:18:43 +09:00
|
|
|
|
var EvalState = (function EvalStateClosure() {
|
|
|
|
|
function EvalState() {
|
2014-04-10 08:44:07 +09:00
|
|
|
|
this.ctm = new Float32Array(IDENTITY_MATRIX);
|
2013-08-01 06:01:55 +09:00
|
|
|
|
this.font = null;
|
2013-08-20 08:33:20 +09:00
|
|
|
|
this.textRenderingMode = TextRenderingMode.FILL;
|
2014-05-22 02:47:42 +09:00
|
|
|
|
this.fillColorSpace = ColorSpace.singletons.gray;
|
|
|
|
|
this.strokeColorSpace = ColorSpace.singletons.gray;
|
2011-10-25 08:55:23 +09:00
|
|
|
|
}
|
2011-12-09 07:18:43 +09:00
|
|
|
|
EvalState.prototype = {
|
2013-08-01 06:01:55 +09:00
|
|
|
|
clone: function CanvasExtraState_clone() {
|
|
|
|
|
return Object.create(this);
|
|
|
|
|
},
|
2011-10-25 08:55:23 +09:00
|
|
|
|
};
|
2011-12-09 07:18:43 +09:00
|
|
|
|
return EvalState;
|
2011-10-25 08:55:23 +09:00
|
|
|
|
})();
|
2011-10-28 03:51:10 +09:00
|
|
|
|
|
2014-04-08 06:42:54 +09:00
|
|
|
|
var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
|
2014-01-17 22:16:52 +09:00
|
|
|
|
// Specifies properties for each command
|
|
|
|
|
//
|
|
|
|
|
// If variableArgs === true: [0, `numArgs`] expected
|
|
|
|
|
// If variableArgs === false: exactly `numArgs` expected
|
2016-01-22 07:43:27 +09:00
|
|
|
|
var getOPMap = getLookupTableFactory(function (t) {
|
2014-01-17 22:16:52 +09:00
|
|
|
|
// Graphic state
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
t['w'] = { id: OPS.setLineWidth, numArgs: 1, variableArgs: false, };
|
|
|
|
|
t['J'] = { id: OPS.setLineCap, numArgs: 1, variableArgs: false, };
|
|
|
|
|
t['j'] = { id: OPS.setLineJoin, numArgs: 1, variableArgs: false, };
|
|
|
|
|
t['M'] = { id: OPS.setMiterLimit, numArgs: 1, variableArgs: false, };
|
|
|
|
|
t['d'] = { id: OPS.setDash, numArgs: 2, variableArgs: false, };
|
|
|
|
|
t['ri'] = { id: OPS.setRenderingIntent, numArgs: 1, variableArgs: false, };
|
|
|
|
|
t['i'] = { id: OPS.setFlatness, numArgs: 1, variableArgs: false, };
|
|
|
|
|
t['gs'] = { id: OPS.setGState, numArgs: 1, variableArgs: false, };
|
|
|
|
|
t['q'] = { id: OPS.save, numArgs: 0, variableArgs: false, };
|
|
|
|
|
t['Q'] = { id: OPS.restore, numArgs: 0, variableArgs: false, };
|
|
|
|
|
t['cm'] = { id: OPS.transform, numArgs: 6, variableArgs: false, };
|
2014-01-17 22:16:52 +09:00
|
|
|
|
|
|
|
|
|
// Path
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
t['m'] = { id: OPS.moveTo, numArgs: 2, variableArgs: false, };
|
|
|
|
|
t['l'] = { id: OPS.lineTo, numArgs: 2, variableArgs: false, };
|
|
|
|
|
t['c'] = { id: OPS.curveTo, numArgs: 6, variableArgs: false, };
|
|
|
|
|
t['v'] = { id: OPS.curveTo2, numArgs: 4, variableArgs: false, };
|
|
|
|
|
t['y'] = { id: OPS.curveTo3, numArgs: 4, variableArgs: false, };
|
|
|
|
|
t['h'] = { id: OPS.closePath, numArgs: 0, variableArgs: false, };
|
|
|
|
|
t['re'] = { id: OPS.rectangle, numArgs: 4, variableArgs: false, };
|
|
|
|
|
t['S'] = { id: OPS.stroke, numArgs: 0, variableArgs: false, };
|
|
|
|
|
t['s'] = { id: OPS.closeStroke, numArgs: 0, variableArgs: false, };
|
|
|
|
|
t['f'] = { id: OPS.fill, numArgs: 0, variableArgs: false, };
|
|
|
|
|
t['F'] = { id: OPS.fill, numArgs: 0, variableArgs: false, };
|
|
|
|
|
t['f*'] = { id: OPS.eoFill, numArgs: 0, variableArgs: false, };
|
|
|
|
|
t['B'] = { id: OPS.fillStroke, numArgs: 0, variableArgs: false, };
|
|
|
|
|
t['B*'] = { id: OPS.eoFillStroke, numArgs: 0, variableArgs: false, };
|
|
|
|
|
t['b'] = { id: OPS.closeFillStroke, numArgs: 0, variableArgs: false, };
|
|
|
|
|
t['b*'] = { id: OPS.closeEOFillStroke, numArgs: 0, variableArgs: false, };
|
|
|
|
|
t['n'] = { id: OPS.endPath, numArgs: 0, variableArgs: false, };
|
2014-01-17 22:16:52 +09:00
|
|
|
|
|
|
|
|
|
// Clipping
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
t['W'] = { id: OPS.clip, numArgs: 0, variableArgs: false, };
|
|
|
|
|
t['W*'] = { id: OPS.eoClip, numArgs: 0, variableArgs: false, };
|
2014-01-17 22:16:52 +09:00
|
|
|
|
|
|
|
|
|
// Text
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
t['BT'] = { id: OPS.beginText, numArgs: 0, variableArgs: false, };
|
|
|
|
|
t['ET'] = { id: OPS.endText, numArgs: 0, variableArgs: false, };
|
|
|
|
|
t['Tc'] = { id: OPS.setCharSpacing, numArgs: 1, variableArgs: false, };
|
|
|
|
|
t['Tw'] = { id: OPS.setWordSpacing, numArgs: 1, variableArgs: false, };
|
|
|
|
|
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
|
|
|
|
|
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
|
|
|
|
|
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
|
|
|
|
|
t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
|
|
|
|
|
variableArgs: false, };
|
|
|
|
|
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
|
|
|
|
|
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
|
|
|
|
|
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
|
|
|
|
|
t['Tm'] = { id: OPS.setTextMatrix, numArgs: 6, variableArgs: false, };
|
|
|
|
|
t['T*'] = { id: OPS.nextLine, numArgs: 0, variableArgs: false, };
|
|
|
|
|
t['Tj'] = { id: OPS.showText, numArgs: 1, variableArgs: false, };
|
|
|
|
|
t['TJ'] = { id: OPS.showSpacedText, numArgs: 1, variableArgs: false, };
|
|
|
|
|
t['\''] = { id: OPS.nextLineShowText, numArgs: 1, variableArgs: false, };
|
2016-01-22 07:43:27 +09:00
|
|
|
|
t['"'] = { id: OPS.nextLineSetSpacingShowText, numArgs: 3,
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
variableArgs: false, };
|
2014-01-17 22:16:52 +09:00
|
|
|
|
|
|
|
|
|
// Type3 fonts
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
t['d0'] = { id: OPS.setCharWidth, numArgs: 2, variableArgs: false, };
|
2016-01-22 07:43:27 +09:00
|
|
|
|
t['d1'] = { id: OPS.setCharWidthAndBounds, numArgs: 6,
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
variableArgs: false, };
|
2014-01-17 22:16:52 +09:00
|
|
|
|
|
|
|
|
|
// Color
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
t['CS'] = { id: OPS.setStrokeColorSpace, numArgs: 1, variableArgs: false, };
|
|
|
|
|
t['cs'] = { id: OPS.setFillColorSpace, numArgs: 1, variableArgs: false, };
|
|
|
|
|
t['SC'] = { id: OPS.setStrokeColor, numArgs: 4, variableArgs: true, };
|
|
|
|
|
t['SCN'] = { id: OPS.setStrokeColorN, numArgs: 33, variableArgs: true, };
|
|
|
|
|
t['sc'] = { id: OPS.setFillColor, numArgs: 4, variableArgs: true, };
|
|
|
|
|
t['scn'] = { id: OPS.setFillColorN, numArgs: 33, variableArgs: true, };
|
|
|
|
|
t['G'] = { id: OPS.setStrokeGray, numArgs: 1, variableArgs: false, };
|
|
|
|
|
t['g'] = { id: OPS.setFillGray, numArgs: 1, variableArgs: false, };
|
|
|
|
|
t['RG'] = { id: OPS.setStrokeRGBColor, numArgs: 3, variableArgs: false, };
|
|
|
|
|
t['rg'] = { id: OPS.setFillRGBColor, numArgs: 3, variableArgs: false, };
|
|
|
|
|
t['K'] = { id: OPS.setStrokeCMYKColor, numArgs: 4, variableArgs: false, };
|
|
|
|
|
t['k'] = { id: OPS.setFillCMYKColor, numArgs: 4, variableArgs: false, };
|
2014-01-17 22:16:52 +09:00
|
|
|
|
|
|
|
|
|
// Shading
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
t['sh'] = { id: OPS.shadingFill, numArgs: 1, variableArgs: false, };
|
2014-01-17 22:16:52 +09:00
|
|
|
|
|
|
|
|
|
// Images
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
t['BI'] = { id: OPS.beginInlineImage, numArgs: 0, variableArgs: false, };
|
|
|
|
|
t['ID'] = { id: OPS.beginImageData, numArgs: 0, variableArgs: false, };
|
|
|
|
|
t['EI'] = { id: OPS.endInlineImage, numArgs: 1, variableArgs: false, };
|
2014-01-17 22:16:52 +09:00
|
|
|
|
|
|
|
|
|
// XObjects
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
t['Do'] = { id: OPS.paintXObject, numArgs: 1, variableArgs: false, };
|
|
|
|
|
t['MP'] = { id: OPS.markPoint, numArgs: 1, variableArgs: false, };
|
|
|
|
|
t['DP'] = { id: OPS.markPointProps, numArgs: 2, variableArgs: false, };
|
|
|
|
|
t['BMC'] = { id: OPS.beginMarkedContent, numArgs: 1, variableArgs: false, };
|
2016-01-22 07:43:27 +09:00
|
|
|
|
t['BDC'] = { id: OPS.beginMarkedContentProps, numArgs: 2,
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
variableArgs: false, };
|
|
|
|
|
t['EMC'] = { id: OPS.endMarkedContent, numArgs: 0, variableArgs: false, };
|
2014-01-17 22:16:52 +09:00
|
|
|
|
|
|
|
|
|
// Compatibility
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
t['BX'] = { id: OPS.beginCompat, numArgs: 0, variableArgs: false, };
|
|
|
|
|
t['EX'] = { id: OPS.endCompat, numArgs: 0, variableArgs: false, };
|
2014-01-17 22:16:52 +09:00
|
|
|
|
|
|
|
|
|
// (reserved partial commands for the lexer)
|
2016-01-22 07:43:27 +09:00
|
|
|
|
t['BM'] = null;
|
|
|
|
|
t['BD'] = null;
|
|
|
|
|
t['true'] = null;
|
|
|
|
|
t['fa'] = null;
|
|
|
|
|
t['fal'] = null;
|
|
|
|
|
t['fals'] = null;
|
|
|
|
|
t['false'] = null;
|
|
|
|
|
t['nu'] = null;
|
|
|
|
|
t['nul'] = null;
|
|
|
|
|
t['null'] = null;
|
|
|
|
|
});
|
2014-01-17 22:16:52 +09:00
|
|
|
|
|
2014-04-10 08:44:07 +09:00
|
|
|
|
function EvaluatorPreprocessor(stream, xref, stateManager) {
|
2016-01-22 07:43:27 +09:00
|
|
|
|
this.opMap = getOPMap();
|
|
|
|
|
// TODO(mduan): pass array of knownCommands rather than this.opMap
|
2014-01-17 22:16:52 +09:00
|
|
|
|
// dictionary
|
2016-01-22 07:43:27 +09:00
|
|
|
|
this.parser = new Parser(new Lexer(stream, this.opMap), false, xref);
|
2014-04-10 08:44:07 +09:00
|
|
|
|
this.stateManager = stateManager;
|
2014-05-15 15:07:43 +09:00
|
|
|
|
this.nonProcessedArgs = [];
|
2014-01-17 22:16:52 +09:00
|
|
|
|
}
|
2014-03-23 03:15:51 +09:00
|
|
|
|
|
2014-01-17 22:16:52 +09:00
|
|
|
|
EvaluatorPreprocessor.prototype = {
|
|
|
|
|
get savedStatesDepth() {
|
2014-04-10 08:44:07 +09:00
|
|
|
|
return this.stateManager.stateStack.length;
|
2014-01-17 22:16:52 +09:00
|
|
|
|
},
|
2014-03-23 03:15:51 +09:00
|
|
|
|
|
2014-08-11 09:23:23 +09:00
|
|
|
|
// |operation| is an object with two fields:
|
|
|
|
|
//
|
|
|
|
|
// - |fn| is an out param.
|
|
|
|
|
//
|
|
|
|
|
// - |args| is an inout param. On entry, it should have one of two values.
|
|
|
|
|
//
|
|
|
|
|
// - An empty array. This indicates that the caller is providing the
|
|
|
|
|
// array in which the args will be stored in. The caller should use
|
|
|
|
|
// this value if it can reuse a single array for each call to read().
|
|
|
|
|
//
|
|
|
|
|
// - |null|. This indicates that the caller needs this function to create
|
|
|
|
|
// the array in which any args are stored in. If there are zero args,
|
|
|
|
|
// this function will leave |operation.args| as |null| (thus avoiding
|
|
|
|
|
// allocations that would occur if we used an empty array to represent
|
|
|
|
|
// zero arguments). Otherwise, it will replace |null| with a new array
|
|
|
|
|
// containing the arguments. The caller should use this value if it
|
|
|
|
|
// cannot reuse an array for each call to read().
|
|
|
|
|
//
|
|
|
|
|
// These two modes are present because this function is very hot and so
|
|
|
|
|
// avoiding allocations where possible is worthwhile.
|
|
|
|
|
//
|
2014-06-19 00:15:35 +09:00
|
|
|
|
read: function EvaluatorPreprocessor_read(operation) {
|
2014-08-11 09:23:23 +09:00
|
|
|
|
var args = operation.args;
|
2014-01-17 22:16:52 +09:00
|
|
|
|
while (true) {
|
|
|
|
|
var obj = this.parser.getObj();
|
2014-06-19 19:47:00 +09:00
|
|
|
|
if (isCmd(obj)) {
|
|
|
|
|
var cmd = obj.cmd;
|
|
|
|
|
// Check that the command is valid
|
2016-01-22 07:43:27 +09:00
|
|
|
|
var opSpec = this.opMap[cmd];
|
2014-06-19 19:47:00 +09:00
|
|
|
|
if (!opSpec) {
|
|
|
|
|
warn('Unknown command "' + cmd + '"');
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var fn = opSpec.id;
|
|
|
|
|
var numArgs = opSpec.numArgs;
|
2014-08-08 19:50:54 +09:00
|
|
|
|
var argsLength = args !== null ? args.length : 0;
|
2014-06-19 19:47:00 +09:00
|
|
|
|
|
|
|
|
|
if (!opSpec.variableArgs) {
|
|
|
|
|
// Postscript commands can be nested, e.g. /F2 /GS2 gs 5.711 Tf
|
|
|
|
|
if (argsLength !== numArgs) {
|
|
|
|
|
var nonProcessedArgs = this.nonProcessedArgs;
|
|
|
|
|
while (argsLength > numArgs) {
|
|
|
|
|
nonProcessedArgs.push(args.shift());
|
|
|
|
|
argsLength--;
|
|
|
|
|
}
|
|
|
|
|
while (argsLength < numArgs && nonProcessedArgs.length !== 0) {
|
2016-11-15 21:09:41 +09:00
|
|
|
|
if (args === null) {
|
2014-06-19 19:47:00 +09:00
|
|
|
|
args = [];
|
|
|
|
|
}
|
|
|
|
|
args.unshift(nonProcessedArgs.pop());
|
|
|
|
|
argsLength++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (argsLength < numArgs) {
|
2016-11-15 21:09:41 +09:00
|
|
|
|
// If we receive too few arguments, it's not possible to execute
|
|
|
|
|
// the command, hence we skip the command.
|
|
|
|
|
warn('Skipping command ' + fn + ': expected ' + numArgs +
|
|
|
|
|
' args, but received ' + argsLength + ' args.');
|
|
|
|
|
if (args !== null) {
|
|
|
|
|
args.length = 0;
|
|
|
|
|
}
|
2014-06-19 19:47:00 +09:00
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
} else if (argsLength > numArgs) {
|
|
|
|
|
info('Command ' + fn + ': expected [0,' + numArgs +
|
2016-11-15 21:09:41 +09:00
|
|
|
|
'] args, but received ' + argsLength + ' args.');
|
2014-06-19 19:47:00 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO figure out how to type-check vararg functions
|
|
|
|
|
this.preprocessCommand(fn, args);
|
|
|
|
|
|
|
|
|
|
operation.fn = fn;
|
|
|
|
|
operation.args = args;
|
|
|
|
|
return true;
|
2016-12-16 21:05:33 +09:00
|
|
|
|
}
|
|
|
|
|
if (isEOF(obj)) {
|
|
|
|
|
return false; // no more commands
|
|
|
|
|
}
|
|
|
|
|
// argument
|
|
|
|
|
if (obj !== null) {
|
|
|
|
|
if (args === null) {
|
|
|
|
|
args = [];
|
2014-01-17 22:16:52 +09:00
|
|
|
|
}
|
2016-12-16 21:05:33 +09:00
|
|
|
|
args.push(obj);
|
|
|
|
|
assert(args.length <= 33, 'Too many arguments');
|
2014-01-17 22:16:52 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
2014-03-23 03:15:51 +09:00
|
|
|
|
|
|
|
|
|
preprocessCommand:
|
|
|
|
|
function EvaluatorPreprocessor_preprocessCommand(fn, args) {
|
2014-01-17 22:16:52 +09:00
|
|
|
|
switch (fn | 0) {
|
|
|
|
|
case OPS.save:
|
2014-04-10 08:44:07 +09:00
|
|
|
|
this.stateManager.save();
|
2014-01-17 22:16:52 +09:00
|
|
|
|
break;
|
|
|
|
|
case OPS.restore:
|
2014-04-10 08:44:07 +09:00
|
|
|
|
this.stateManager.restore();
|
2014-01-17 22:16:52 +09:00
|
|
|
|
break;
|
|
|
|
|
case OPS.transform:
|
2014-04-10 08:44:07 +09:00
|
|
|
|
this.stateManager.transform(args);
|
2014-01-17 22:16:52 +09:00
|
|
|
|
break;
|
|
|
|
|
}
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
},
|
2014-01-17 22:16:52 +09:00
|
|
|
|
};
|
|
|
|
|
return EvaluatorPreprocessor;
|
|
|
|
|
})();
|
2014-02-24 11:42:54 +09:00
|
|
|
|
|
|
|
|
|
var QueueOptimizer = (function QueueOptimizerClosure() {
|
|
|
|
|
function addState(parentState, pattern, fn) {
|
|
|
|
|
var state = parentState;
|
|
|
|
|
for (var i = 0, ii = pattern.length - 1; i < ii; i++) {
|
|
|
|
|
var item = pattern[i];
|
2014-03-23 03:15:51 +09:00
|
|
|
|
state = (state[item] || (state[item] = []));
|
2014-02-24 11:42:54 +09:00
|
|
|
|
}
|
|
|
|
|
state[pattern[pattern.length - 1]] = fn;
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-24 15:34:54 +09:00
|
|
|
|
function handlePaintSolidColorImageMask(iFirstSave, count, fnArray,
|
|
|
|
|
argsArray) {
|
|
|
|
|
// Handles special case of mainly LaTeX documents which use image masks to
|
|
|
|
|
// draw lines with the current fill style.
|
2014-03-17 00:17:13 +09:00
|
|
|
|
// 'count' groups of (save, transform, paintImageMaskXObject, restore)+
|
2014-06-24 15:34:54 +09:00
|
|
|
|
// have been found at iFirstSave.
|
|
|
|
|
var iFirstPIMXO = iFirstSave + 2;
|
2014-03-17 00:17:13 +09:00
|
|
|
|
for (var i = 0; i < count; i++) {
|
2014-06-24 15:34:54 +09:00
|
|
|
|
var arg = argsArray[iFirstPIMXO + 4 * i];
|
2014-06-02 19:43:20 +09:00
|
|
|
|
var imageMask = arg.length === 1 && arg[0];
|
|
|
|
|
if (imageMask && imageMask.width === 1 && imageMask.height === 1 &&
|
2014-06-24 15:34:54 +09:00
|
|
|
|
(!imageMask.data.length ||
|
|
|
|
|
(imageMask.data.length === 1 && imageMask.data[0] === 0))) {
|
|
|
|
|
fnArray[iFirstPIMXO + 4 * i] = OPS.paintSolidColorImageMask;
|
2014-03-17 00:17:13 +09:00
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return count - i;
|
|
|
|
|
}
|
|
|
|
|
|
2014-02-24 11:42:54 +09:00
|
|
|
|
var InitialState = [];
|
|
|
|
|
|
2014-06-24 15:34:54 +09:00
|
|
|
|
// This replaces (save, transform, paintInlineImageXObject, restore)+
|
|
|
|
|
// sequences with one |paintInlineImageXObjectGroup| operation.
|
2014-02-24 11:42:54 +09:00
|
|
|
|
addState(InitialState,
|
|
|
|
|
[OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore],
|
|
|
|
|
function foundInlineImageGroup(context) {
|
|
|
|
|
var MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10;
|
|
|
|
|
var MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200;
|
|
|
|
|
var MAX_WIDTH = 1000;
|
|
|
|
|
var IMAGE_PADDING = 1;
|
|
|
|
|
|
|
|
|
|
var fnArray = context.fnArray, argsArray = context.argsArray;
|
2014-06-24 15:34:54 +09:00
|
|
|
|
var curr = context.iCurr;
|
|
|
|
|
var iFirstSave = curr - 3;
|
|
|
|
|
var iFirstTransform = curr - 2;
|
|
|
|
|
var iFirstPIIXO = curr - 1;
|
|
|
|
|
|
|
|
|
|
// Look for the quartets.
|
|
|
|
|
var i = iFirstSave + 4;
|
2014-03-15 22:04:13 +09:00
|
|
|
|
var ii = fnArray.length;
|
2014-06-24 15:34:54 +09:00
|
|
|
|
while (i + 3 < ii) {
|
|
|
|
|
if (fnArray[i] !== OPS.save ||
|
|
|
|
|
fnArray[i + 1] !== OPS.transform ||
|
|
|
|
|
fnArray[i + 2] !== OPS.paintInlineImageXObject ||
|
|
|
|
|
fnArray[i + 3] !== OPS.restore) {
|
|
|
|
|
break; // ops don't match
|
|
|
|
|
}
|
|
|
|
|
i += 4;
|
|
|
|
|
}
|
2014-02-24 11:42:54 +09:00
|
|
|
|
|
2014-06-24 15:34:54 +09:00
|
|
|
|
// At this point, i is the index of the first op past the last valid
|
|
|
|
|
// quartet.
|
|
|
|
|
var count = Math.min((i - iFirstSave) / 4,
|
|
|
|
|
MAX_IMAGES_IN_INLINE_IMAGES_BLOCK);
|
2014-02-24 11:42:54 +09:00
|
|
|
|
if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) {
|
2014-06-24 15:34:54 +09:00
|
|
|
|
return i;
|
2014-02-24 11:42:54 +09:00
|
|
|
|
}
|
2014-06-24 15:34:54 +09:00
|
|
|
|
|
2014-02-24 11:42:54 +09:00
|
|
|
|
// assuming that heights of those image is too small (~1 pixel)
|
|
|
|
|
// packing as much as possible by lines
|
|
|
|
|
var maxX = 0;
|
|
|
|
|
var map = [], maxLineHeight = 0;
|
|
|
|
|
var currentX = IMAGE_PADDING, currentY = IMAGE_PADDING;
|
2014-04-08 06:42:54 +09:00
|
|
|
|
var q;
|
|
|
|
|
for (q = 0; q < count; q++) {
|
2014-06-24 15:34:54 +09:00
|
|
|
|
var transform = argsArray[iFirstTransform + (q << 2)];
|
|
|
|
|
var img = argsArray[iFirstPIIXO + (q << 2)][0];
|
2014-02-24 11:42:54 +09:00
|
|
|
|
if (currentX + img.width > MAX_WIDTH) {
|
|
|
|
|
// starting new line
|
|
|
|
|
maxX = Math.max(maxX, currentX);
|
|
|
|
|
currentY += maxLineHeight + 2 * IMAGE_PADDING;
|
|
|
|
|
currentX = 0;
|
|
|
|
|
maxLineHeight = 0;
|
|
|
|
|
}
|
|
|
|
|
map.push({
|
2017-04-27 19:58:44 +09:00
|
|
|
|
transform,
|
2014-02-24 11:42:54 +09:00
|
|
|
|
x: currentX, y: currentY,
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
w: img.width, h: img.height,
|
2014-02-24 11:42:54 +09:00
|
|
|
|
});
|
|
|
|
|
currentX += img.width + 2 * IMAGE_PADDING;
|
|
|
|
|
maxLineHeight = Math.max(maxLineHeight, img.height);
|
|
|
|
|
}
|
|
|
|
|
var imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING;
|
|
|
|
|
var imgHeight = currentY + maxLineHeight + IMAGE_PADDING;
|
|
|
|
|
var imgData = new Uint8Array(imgWidth * imgHeight * 4);
|
|
|
|
|
var imgRowSize = imgWidth << 2;
|
2014-04-08 06:42:54 +09:00
|
|
|
|
for (q = 0; q < count; q++) {
|
2014-06-24 15:34:54 +09:00
|
|
|
|
var data = argsArray[iFirstPIIXO + (q << 2)][0].data;
|
|
|
|
|
// Copy image by lines and extends pixels into padding.
|
2014-02-24 11:42:54 +09:00
|
|
|
|
var rowSize = map[q].w << 2;
|
|
|
|
|
var dataOffset = 0;
|
|
|
|
|
var offset = (map[q].x + map[q].y * imgWidth) << 2;
|
2014-03-23 03:15:51 +09:00
|
|
|
|
imgData.set(data.subarray(0, rowSize), offset - imgRowSize);
|
2014-02-24 11:42:54 +09:00
|
|
|
|
for (var k = 0, kk = map[q].h; k < kk; k++) {
|
2014-03-23 03:15:51 +09:00
|
|
|
|
imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset);
|
2014-02-24 11:42:54 +09:00
|
|
|
|
dataOffset += rowSize;
|
|
|
|
|
offset += imgRowSize;
|
|
|
|
|
}
|
2014-03-23 03:15:51 +09:00
|
|
|
|
imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset);
|
2014-02-24 11:42:54 +09:00
|
|
|
|
while (offset >= 0) {
|
|
|
|
|
data[offset - 4] = data[offset];
|
|
|
|
|
data[offset - 3] = data[offset + 1];
|
|
|
|
|
data[offset - 2] = data[offset + 2];
|
|
|
|
|
data[offset - 1] = data[offset + 3];
|
|
|
|
|
data[offset + rowSize] = data[offset + rowSize - 4];
|
|
|
|
|
data[offset + rowSize + 1] = data[offset + rowSize - 3];
|
|
|
|
|
data[offset + rowSize + 2] = data[offset + rowSize - 2];
|
|
|
|
|
data[offset + rowSize + 3] = data[offset + rowSize - 1];
|
|
|
|
|
offset -= imgRowSize;
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-06-24 15:34:54 +09:00
|
|
|
|
|
|
|
|
|
// Replace queue items.
|
|
|
|
|
fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup);
|
|
|
|
|
argsArray.splice(iFirstSave, count * 4,
|
2014-03-23 03:15:51 +09:00
|
|
|
|
[{ width: imgWidth, height: imgHeight, kind: ImageKind.RGBA_32BPP,
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
data: imgData, }, map]);
|
2014-06-24 15:34:54 +09:00
|
|
|
|
|
|
|
|
|
return iFirstSave + 1;
|
2014-02-24 11:42:54 +09:00
|
|
|
|
});
|
|
|
|
|
|
2014-06-24 15:34:54 +09:00
|
|
|
|
// This replaces (save, transform, paintImageMaskXObject, restore)+
|
|
|
|
|
// sequences with one |paintImageMaskXObjectGroup| or one
|
|
|
|
|
// |paintImageMaskXObjectRepeat| operation.
|
2014-02-24 11:42:54 +09:00
|
|
|
|
addState(InitialState,
|
|
|
|
|
[OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore],
|
|
|
|
|
function foundImageMaskGroup(context) {
|
|
|
|
|
var MIN_IMAGES_IN_MASKS_BLOCK = 10;
|
|
|
|
|
var MAX_IMAGES_IN_MASKS_BLOCK = 100;
|
2014-02-25 00:59:02 +09:00
|
|
|
|
var MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000;
|
2014-02-24 11:42:54 +09:00
|
|
|
|
|
|
|
|
|
var fnArray = context.fnArray, argsArray = context.argsArray;
|
2014-06-24 15:34:54 +09:00
|
|
|
|
var curr = context.iCurr;
|
|
|
|
|
var iFirstSave = curr - 3;
|
|
|
|
|
var iFirstTransform = curr - 2;
|
|
|
|
|
var iFirstPIMXO = curr - 1;
|
2014-02-24 11:42:54 +09:00
|
|
|
|
|
2014-06-24 15:34:54 +09:00
|
|
|
|
// Look for the quartets.
|
|
|
|
|
var i = iFirstSave + 4;
|
|
|
|
|
var ii = fnArray.length;
|
|
|
|
|
while (i + 3 < ii) {
|
|
|
|
|
if (fnArray[i] !== OPS.save ||
|
|
|
|
|
fnArray[i + 1] !== OPS.transform ||
|
|
|
|
|
fnArray[i + 2] !== OPS.paintImageMaskXObject ||
|
|
|
|
|
fnArray[i + 3] !== OPS.restore) {
|
|
|
|
|
break; // ops don't match
|
|
|
|
|
}
|
|
|
|
|
i += 4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// At this point, i is the index of the first op past the last valid
|
|
|
|
|
// quartet.
|
|
|
|
|
var count = (i - iFirstSave) / 4;
|
|
|
|
|
count = handlePaintSolidColorImageMask(iFirstSave, count, fnArray,
|
|
|
|
|
argsArray);
|
2014-02-24 11:42:54 +09:00
|
|
|
|
if (count < MIN_IMAGES_IN_MASKS_BLOCK) {
|
2014-06-24 15:34:54 +09:00
|
|
|
|
return i;
|
2014-02-24 11:42:54 +09:00
|
|
|
|
}
|
2014-02-25 00:59:02 +09:00
|
|
|
|
|
2014-06-24 15:34:54 +09:00
|
|
|
|
var q;
|
2014-02-25 00:59:02 +09:00
|
|
|
|
var isSameImage = false;
|
2014-06-24 15:34:54 +09:00
|
|
|
|
var iTransform, transformArgs;
|
|
|
|
|
var firstPIMXOArg0 = argsArray[iFirstPIMXO][0];
|
|
|
|
|
if (argsArray[iFirstTransform][1] === 0 &&
|
|
|
|
|
argsArray[iFirstTransform][2] === 0) {
|
2014-02-25 00:59:02 +09:00
|
|
|
|
isSameImage = true;
|
2014-06-24 15:34:54 +09:00
|
|
|
|
var firstTransformArg0 = argsArray[iFirstTransform][0];
|
|
|
|
|
var firstTransformArg3 = argsArray[iFirstTransform][3];
|
|
|
|
|
iTransform = iFirstTransform + 4;
|
|
|
|
|
var iPIMXO = iFirstPIMXO + 4;
|
|
|
|
|
for (q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) {
|
|
|
|
|
transformArgs = argsArray[iTransform];
|
|
|
|
|
if (argsArray[iPIMXO][0] !== firstPIMXOArg0 ||
|
|
|
|
|
transformArgs[0] !== firstTransformArg0 ||
|
|
|
|
|
transformArgs[1] !== 0 ||
|
|
|
|
|
transformArgs[2] !== 0 ||
|
|
|
|
|
transformArgs[3] !== firstTransformArg3) {
|
2014-02-25 00:59:02 +09:00
|
|
|
|
if (q < MIN_IMAGES_IN_MASKS_BLOCK) {
|
|
|
|
|
isSameImage = false;
|
|
|
|
|
} else {
|
|
|
|
|
count = q;
|
|
|
|
|
}
|
|
|
|
|
break; // different image or transform
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-02-24 11:42:54 +09:00
|
|
|
|
}
|
|
|
|
|
|
2014-02-25 00:59:02 +09:00
|
|
|
|
if (isSameImage) {
|
|
|
|
|
count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK);
|
|
|
|
|
var positions = new Float32Array(count * 2);
|
2014-06-24 15:34:54 +09:00
|
|
|
|
iTransform = iFirstTransform;
|
|
|
|
|
for (q = 0; q < count; q++, iTransform += 4) {
|
|
|
|
|
transformArgs = argsArray[iTransform];
|
2014-02-25 00:59:02 +09:00
|
|
|
|
positions[(q << 1)] = transformArgs[4];
|
|
|
|
|
positions[(q << 1) + 1] = transformArgs[5];
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-24 15:34:54 +09:00
|
|
|
|
// Replace queue items.
|
|
|
|
|
fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat);
|
|
|
|
|
argsArray.splice(iFirstSave, count * 4,
|
|
|
|
|
[firstPIMXOArg0, firstTransformArg0, firstTransformArg3, positions]);
|
2014-02-25 00:59:02 +09:00
|
|
|
|
} else {
|
|
|
|
|
count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK);
|
|
|
|
|
var images = [];
|
2014-04-08 06:42:54 +09:00
|
|
|
|
for (q = 0; q < count; q++) {
|
2014-06-24 15:34:54 +09:00
|
|
|
|
transformArgs = argsArray[iFirstTransform + (q << 2)];
|
|
|
|
|
var maskParams = argsArray[iFirstPIMXO + (q << 2)][0];
|
2014-03-23 03:15:51 +09:00
|
|
|
|
images.push({ data: maskParams.data, width: maskParams.width,
|
|
|
|
|
height: maskParams.height,
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
transform: transformArgs, });
|
2014-02-25 00:59:02 +09:00
|
|
|
|
}
|
|
|
|
|
|
2014-06-24 15:34:54 +09:00
|
|
|
|
// Replace queue items.
|
|
|
|
|
fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup);
|
|
|
|
|
argsArray.splice(iFirstSave, count * 4, [images]);
|
2014-02-25 00:59:02 +09:00
|
|
|
|
}
|
2014-06-24 15:34:54 +09:00
|
|
|
|
|
|
|
|
|
return iFirstSave + 1;
|
2014-02-24 11:42:54 +09:00
|
|
|
|
});
|
|
|
|
|
|
2014-06-24 15:34:54 +09:00
|
|
|
|
// This replaces (save, transform, paintImageXObject, restore)+ sequences
|
|
|
|
|
// with one paintImageXObjectRepeat operation, if the |transform| and
|
|
|
|
|
// |paintImageXObjectRepeat| ops are appropriate.
|
2014-02-24 23:00:08 +09:00
|
|
|
|
addState(InitialState,
|
|
|
|
|
[OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore],
|
|
|
|
|
function (context) {
|
|
|
|
|
var MIN_IMAGES_IN_BLOCK = 3;
|
|
|
|
|
var MAX_IMAGES_IN_BLOCK = 1000;
|
|
|
|
|
|
|
|
|
|
var fnArray = context.fnArray, argsArray = context.argsArray;
|
2014-06-24 15:34:54 +09:00
|
|
|
|
var curr = context.iCurr;
|
|
|
|
|
var iFirstSave = curr - 3;
|
|
|
|
|
var iFirstTransform = curr - 2;
|
|
|
|
|
var iFirstPIXO = curr - 1;
|
|
|
|
|
var iFirstRestore = curr;
|
|
|
|
|
|
|
|
|
|
if (argsArray[iFirstTransform][1] !== 0 ||
|
|
|
|
|
argsArray[iFirstTransform][2] !== 0) {
|
|
|
|
|
return iFirstRestore + 1; // transform has the wrong form
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Look for the quartets.
|
|
|
|
|
var firstPIXOArg0 = argsArray[iFirstPIXO][0];
|
|
|
|
|
var firstTransformArg0 = argsArray[iFirstTransform][0];
|
|
|
|
|
var firstTransformArg3 = argsArray[iFirstTransform][3];
|
|
|
|
|
var i = iFirstSave + 4;
|
2014-03-15 22:04:13 +09:00
|
|
|
|
var ii = fnArray.length;
|
2014-06-24 15:34:54 +09:00
|
|
|
|
while (i + 3 < ii) {
|
|
|
|
|
if (fnArray[i] !== OPS.save ||
|
|
|
|
|
fnArray[i + 1] !== OPS.transform ||
|
|
|
|
|
fnArray[i + 2] !== OPS.paintImageXObject ||
|
|
|
|
|
fnArray[i + 3] !== OPS.restore) {
|
|
|
|
|
break; // ops don't match
|
2014-02-24 23:00:08 +09:00
|
|
|
|
}
|
2014-06-24 15:34:54 +09:00
|
|
|
|
if (argsArray[i + 1][0] !== firstTransformArg0 ||
|
|
|
|
|
argsArray[i + 1][1] !== 0 ||
|
|
|
|
|
argsArray[i + 1][2] !== 0 ||
|
|
|
|
|
argsArray[i + 1][3] !== firstTransformArg3) {
|
|
|
|
|
break; // transforms don't match
|
2014-02-24 23:00:08 +09:00
|
|
|
|
}
|
2014-06-24 15:34:54 +09:00
|
|
|
|
if (argsArray[i + 2][0] !== firstPIXOArg0) {
|
|
|
|
|
break; // images don't match
|
2014-02-24 23:00:08 +09:00
|
|
|
|
}
|
2014-06-24 15:34:54 +09:00
|
|
|
|
i += 4;
|
2014-02-24 23:00:08 +09:00
|
|
|
|
}
|
2014-06-24 15:34:54 +09:00
|
|
|
|
|
|
|
|
|
// At this point, i is the index of the first op past the last valid
|
|
|
|
|
// quartet.
|
|
|
|
|
var count = Math.min((i - iFirstSave) / 4, MAX_IMAGES_IN_BLOCK);
|
2014-02-24 23:00:08 +09:00
|
|
|
|
if (count < MIN_IMAGES_IN_BLOCK) {
|
2014-06-24 15:34:54 +09:00
|
|
|
|
return i;
|
2014-02-24 23:00:08 +09:00
|
|
|
|
}
|
|
|
|
|
|
2014-06-24 15:34:54 +09:00
|
|
|
|
// Extract the (x,y) positions from all of the matching transforms.
|
2014-02-24 23:00:08 +09:00
|
|
|
|
var positions = new Float32Array(count * 2);
|
2014-06-24 15:34:54 +09:00
|
|
|
|
var iTransform = iFirstTransform;
|
|
|
|
|
for (var q = 0; q < count; q++, iTransform += 4) {
|
|
|
|
|
var transformArgs = argsArray[iTransform];
|
2014-02-24 23:00:08 +09:00
|
|
|
|
positions[(q << 1)] = transformArgs[4];
|
|
|
|
|
positions[(q << 1) + 1] = transformArgs[5];
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-24 15:34:54 +09:00
|
|
|
|
// Replace queue items.
|
|
|
|
|
var args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3,
|
|
|
|
|
positions];
|
|
|
|
|
fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat);
|
|
|
|
|
argsArray.splice(iFirstSave, count * 4, args);
|
|
|
|
|
|
|
|
|
|
return iFirstSave + 1;
|
2014-02-24 23:00:08 +09:00
|
|
|
|
});
|
|
|
|
|
|
2014-06-24 15:34:54 +09:00
|
|
|
|
// This replaces (beginText, setFont, setTextMatrix, showText, endText)+
|
|
|
|
|
// sequences with (beginText, setFont, (setTextMatrix, showText)+, endText)+
|
|
|
|
|
// sequences, if the font for each one is the same.
|
2014-02-24 12:51:14 +09:00
|
|
|
|
addState(InitialState,
|
|
|
|
|
[OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText],
|
|
|
|
|
function (context) {
|
|
|
|
|
var MIN_CHARS_IN_BLOCK = 3;
|
|
|
|
|
var MAX_CHARS_IN_BLOCK = 1000;
|
|
|
|
|
|
|
|
|
|
var fnArray = context.fnArray, argsArray = context.argsArray;
|
2014-06-24 15:34:54 +09:00
|
|
|
|
var curr = context.iCurr;
|
|
|
|
|
var iFirstBeginText = curr - 4;
|
|
|
|
|
var iFirstSetFont = curr - 3;
|
|
|
|
|
var iFirstSetTextMatrix = curr - 2;
|
|
|
|
|
var iFirstShowText = curr - 1;
|
|
|
|
|
var iFirstEndText = curr;
|
|
|
|
|
|
|
|
|
|
// Look for the quintets.
|
|
|
|
|
var firstSetFontArg0 = argsArray[iFirstSetFont][0];
|
|
|
|
|
var firstSetFontArg1 = argsArray[iFirstSetFont][1];
|
|
|
|
|
var i = iFirstBeginText + 5;
|
2014-03-15 22:04:13 +09:00
|
|
|
|
var ii = fnArray.length;
|
2014-06-24 15:34:54 +09:00
|
|
|
|
while (i + 4 < ii) {
|
|
|
|
|
if (fnArray[i] !== OPS.beginText ||
|
|
|
|
|
fnArray[i + 1] !== OPS.setFont ||
|
|
|
|
|
fnArray[i + 2] !== OPS.setTextMatrix ||
|
|
|
|
|
fnArray[i + 3] !== OPS.showText ||
|
|
|
|
|
fnArray[i + 4] !== OPS.endText) {
|
|
|
|
|
break; // ops don't match
|
|
|
|
|
}
|
|
|
|
|
if (argsArray[i + 1][0] !== firstSetFontArg0 ||
|
|
|
|
|
argsArray[i + 1][1] !== firstSetFontArg1) {
|
|
|
|
|
break; // fonts don't match
|
2014-02-24 12:51:14 +09:00
|
|
|
|
}
|
2014-06-24 15:34:54 +09:00
|
|
|
|
i += 5;
|
2014-02-24 12:51:14 +09:00
|
|
|
|
}
|
2014-06-24 15:34:54 +09:00
|
|
|
|
|
|
|
|
|
// At this point, i is the index of the first op past the last valid
|
|
|
|
|
// quintet.
|
|
|
|
|
var count = Math.min(((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK);
|
2014-02-24 12:51:14 +09:00
|
|
|
|
if (count < MIN_CHARS_IN_BLOCK) {
|
2014-06-24 15:34:54 +09:00
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If the preceding quintet is (<something>, setFont, setTextMatrix,
|
|
|
|
|
// showText, endText), include that as well. (E.g. <something> might be
|
|
|
|
|
// |dependency|.)
|
|
|
|
|
var iFirst = iFirstBeginText;
|
|
|
|
|
if (iFirstBeginText >= 4 &&
|
|
|
|
|
fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] &&
|
|
|
|
|
fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] &&
|
|
|
|
|
fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] &&
|
|
|
|
|
fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] &&
|
|
|
|
|
argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 &&
|
|
|
|
|
argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) {
|
2014-02-24 12:51:14 +09:00
|
|
|
|
count++;
|
2014-06-24 15:34:54 +09:00
|
|
|
|
iFirst -= 5;
|
2014-02-24 12:51:14 +09:00
|
|
|
|
}
|
2014-06-24 15:34:54 +09:00
|
|
|
|
|
|
|
|
|
// Remove (endText, beginText, setFont) trios.
|
|
|
|
|
var iEndText = iFirst + 4;
|
2014-02-24 12:51:14 +09:00
|
|
|
|
for (var q = 1; q < count; q++) {
|
2014-06-24 15:34:54 +09:00
|
|
|
|
fnArray.splice(iEndText, 3);
|
|
|
|
|
argsArray.splice(iEndText, 3);
|
|
|
|
|
iEndText += 2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return iEndText + 1;
|
2014-02-24 12:51:14 +09:00
|
|
|
|
});
|
|
|
|
|
|
2014-03-23 03:15:51 +09:00
|
|
|
|
function QueueOptimizer() {}
|
|
|
|
|
|
2014-02-24 11:42:54 +09:00
|
|
|
|
QueueOptimizer.prototype = {
|
|
|
|
|
optimize: function QueueOptimizer_optimize(queue) {
|
|
|
|
|
var fnArray = queue.fnArray, argsArray = queue.argsArray;
|
|
|
|
|
var context = {
|
2014-06-24 15:34:54 +09:00
|
|
|
|
iCurr: 0,
|
2017-04-27 19:58:44 +09:00
|
|
|
|
fnArray,
|
|
|
|
|
argsArray,
|
2014-02-24 11:42:54 +09:00
|
|
|
|
};
|
|
|
|
|
var state;
|
2014-06-24 15:34:54 +09:00
|
|
|
|
var i = 0, ii = fnArray.length;
|
|
|
|
|
while (i < ii) {
|
2014-02-24 11:42:54 +09:00
|
|
|
|
state = (state || InitialState)[fnArray[i]];
|
|
|
|
|
if (typeof state === 'function') { // we found some handler
|
2014-06-24 15:34:54 +09:00
|
|
|
|
context.iCurr = i;
|
|
|
|
|
// state() returns the index of the first non-matching op (if we
|
|
|
|
|
// didn't match) or the first op past the modified ops (if we did
|
|
|
|
|
// match and replace).
|
|
|
|
|
i = state(context);
|
|
|
|
|
state = undefined; // reset the state machine
|
2014-03-15 22:04:13 +09:00
|
|
|
|
ii = context.fnArray.length;
|
2014-06-24 15:34:54 +09:00
|
|
|
|
} else {
|
|
|
|
|
i++;
|
2014-02-24 11:42:54 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
Fix inconsistent spacing and trailing commas in objects in `src/core/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
*Unfortunately this patch is fairly big, even though it only covers the `src/core` folder, but splitting it even further seemed difficult.*
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint --fix command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index abab9027..dcd3594b 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -2785,7 +2785,8 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };
t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };
t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };
- t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false, };
+ t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,
+ variableArgs: false, };
t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };
t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };
t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };
diff --git a/src/core/jbig2.js b/src/core/jbig2.js
index 5a17d482..71671541 100644
--- a/src/core/jbig2.js
+++ b/src/core/jbig2.js
@@ -123,19 +123,22 @@ var Jbig2Image = (function Jbig2ImageClosure() {
{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },
{ x: -1, y: 0, }],
[{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },
- { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }]
+ { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },
+ { x: -1, y: 0, }]
];
var RefinementTemplates = [
{
coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
- { x: 1, y: 0, }, { x: -1, y: 1, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
+ reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },
+ { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },
+ { x: 0, y: 1, }, { x: 1, y: 1, }],
},
{
- coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],
- reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, }, { x: 1, y: 0, },
- { x: 0, y: 1, }, { x: 1, y: 1, }],
+ coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },
+ { x: -1, y: 0, }],
+ reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },
+ { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],
}
];
```
2017-06-02 18:16:24 +09:00
|
|
|
|
},
|
2014-02-24 11:42:54 +09:00
|
|
|
|
};
|
|
|
|
|
return QueueOptimizer;
|
|
|
|
|
})();
|
2015-11-22 01:32:47 +09:00
|
|
|
|
|
2017-04-02 23:14:30 +09:00
|
|
|
|
export {
|
|
|
|
|
OperatorList,
|
|
|
|
|
PartialEvaluator,
|
|
|
|
|
};
|