2015-11-11 00:45:03 +09:00
|
|
|
/* Copyright 2015 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.
|
|
|
|
*/
|
|
|
|
|
2017-04-02 21:25:33 +09:00
|
|
|
import { createPromiseCapability, Util } from '../shared/util';
|
|
|
|
import { CustomStyle, getDefaultSetting } from './dom_utils';
|
2015-11-22 01:32:47 +09:00
|
|
|
|
2015-11-11 00:45:03 +09:00
|
|
|
/**
|
|
|
|
* Text layer render parameters.
|
|
|
|
*
|
|
|
|
* @typedef {Object} TextLayerRenderParameters
|
|
|
|
* @property {TextContent} textContent - Text content to render (the object is
|
|
|
|
* returned by the page's getTextContent() method).
|
|
|
|
* @property {HTMLElement} container - HTML element that will contain text runs.
|
2016-03-29 04:49:22 +09:00
|
|
|
* @property {PageViewport} viewport - The target viewport to properly
|
2015-11-11 00:45:03 +09:00
|
|
|
* layout the text runs.
|
|
|
|
* @property {Array} textDivs - (optional) HTML elements that are correspond
|
|
|
|
* the text items of the textContent input. This is output and shall be
|
|
|
|
* initially be set to empty array.
|
|
|
|
* @property {number} timeout - (optional) Delay in milliseconds before
|
|
|
|
* rendering of the text runs occurs.
|
2016-09-03 00:51:13 +09:00
|
|
|
* @property {boolean} enhanceTextSelection - (optional) Whether to turn on the
|
|
|
|
* text selection enhancement.
|
2015-11-11 00:45:03 +09:00
|
|
|
*/
|
|
|
|
var renderTextLayer = (function renderTextLayerClosure() {
|
|
|
|
var MAX_TEXT_DIVS_TO_RENDER = 100000;
|
|
|
|
|
|
|
|
var NonWhitespaceRegexp = /\S/;
|
|
|
|
|
|
|
|
function isAllWhitespace(str) {
|
|
|
|
return !NonWhitespaceRegexp.test(str);
|
|
|
|
}
|
|
|
|
|
[EnhanceTextSelection] Make `expandTextDivs` more efficient by updating all styles at once instead of piecewise
I intended to provide proper benchmarking results here, as outlined in https://github.com/mozilla/pdf.js/wiki/Benchmarking-your-changes, but after wasting a couple of hours over the weekend getting weird results I gave up.
It appears that there's a lot of, i.e. way too much, variance between subsequent runs of `text` tests for the results to be meaningful.
(Previously I've only benchmarked `eq` tests, so I don't know if the `text` tests has never worked well or if it's a newer problem. For reference, please see the results of back-to-back benchmark runs on the current `master` with a *very* simple manifest file: [link here].)
Instead I used `console.time/timeEnd` in `appendText` and `expandTextDivs` to be able to compare the performance with/without the patch. The entire viewer was (skip-cache) reloaded between measurements, and the result are available here: [link here].
Given the troubles I've had with benchmarking, I've not yet computed any statistics on the results (e.g. mean, variance, confidence intervals, and so on).
However, just by looking at the data I think it's safe to say that this patch first of all doesn't seem to regress the current performance. Secondly it certainly looks *very* likely that this patch actually improves the performance, especially for the one-glyph-per-text-div case (cf. issue 7224).
Re: issue 7584.
2016-09-14 00:04:57 +09:00
|
|
|
// Text layers may contain many thousand div's, and using `styleBuf` avoids
|
|
|
|
// creating many intermediate strings when building their 'style' properties.
|
|
|
|
var styleBuf = ['left: ', 0, 'px; top: ', 0, 'px; font-size: ', 0,
|
|
|
|
'px; font-family: ', '', ';'];
|
|
|
|
|
2016-09-03 01:10:37 +09:00
|
|
|
function appendText(task, geom, styles) {
|
|
|
|
// Initialize all used properties to keep the caches monomorphic.
|
2015-11-11 00:45:03 +09:00
|
|
|
var textDiv = document.createElement('div');
|
2016-09-03 01:10:37 +09:00
|
|
|
var textDivProperties = {
|
[EnhanceTextSelection] Make `expandTextDivs` more efficient by updating all styles at once instead of piecewise
I intended to provide proper benchmarking results here, as outlined in https://github.com/mozilla/pdf.js/wiki/Benchmarking-your-changes, but after wasting a couple of hours over the weekend getting weird results I gave up.
It appears that there's a lot of, i.e. way too much, variance between subsequent runs of `text` tests for the results to be meaningful.
(Previously I've only benchmarked `eq` tests, so I don't know if the `text` tests has never worked well or if it's a newer problem. For reference, please see the results of back-to-back benchmark runs on the current `master` with a *very* simple manifest file: [link here].)
Instead I used `console.time/timeEnd` in `appendText` and `expandTextDivs` to be able to compare the performance with/without the patch. The entire viewer was (skip-cache) reloaded between measurements, and the result are available here: [link here].
Given the troubles I've had with benchmarking, I've not yet computed any statistics on the results (e.g. mean, variance, confidence intervals, and so on).
However, just by looking at the data I think it's safe to say that this patch first of all doesn't seem to regress the current performance. Secondly it certainly looks *very* likely that this patch actually improves the performance, especially for the one-glyph-per-text-div case (cf. issue 7224).
Re: issue 7584.
2016-09-14 00:04:57 +09:00
|
|
|
style: null,
|
2016-09-03 01:10:37 +09:00
|
|
|
angle: 0,
|
|
|
|
canvasWidth: 0,
|
|
|
|
isWhitespace: false,
|
[EnhanceTextSelection] Make `expandTextDivs` more efficient by updating all styles at once instead of piecewise
I intended to provide proper benchmarking results here, as outlined in https://github.com/mozilla/pdf.js/wiki/Benchmarking-your-changes, but after wasting a couple of hours over the weekend getting weird results I gave up.
It appears that there's a lot of, i.e. way too much, variance between subsequent runs of `text` tests for the results to be meaningful.
(Previously I've only benchmarked `eq` tests, so I don't know if the `text` tests has never worked well or if it's a newer problem. For reference, please see the results of back-to-back benchmark runs on the current `master` with a *very* simple manifest file: [link here].)
Instead I used `console.time/timeEnd` in `appendText` and `expandTextDivs` to be able to compare the performance with/without the patch. The entire viewer was (skip-cache) reloaded between measurements, and the result are available here: [link here].
Given the troubles I've had with benchmarking, I've not yet computed any statistics on the results (e.g. mean, variance, confidence intervals, and so on).
However, just by looking at the data I think it's safe to say that this patch first of all doesn't seem to regress the current performance. Secondly it certainly looks *very* likely that this patch actually improves the performance, especially for the one-glyph-per-text-div case (cf. issue 7224).
Re: issue 7584.
2016-09-14 00:04:57 +09:00
|
|
|
originalTransform: null,
|
2016-09-03 01:10:37 +09:00
|
|
|
paddingBottom: 0,
|
|
|
|
paddingLeft: 0,
|
|
|
|
paddingRight: 0,
|
|
|
|
paddingTop: 0,
|
2016-09-05 03:19:31 +09:00
|
|
|
scale: 1,
|
2016-09-03 01:10:37 +09:00
|
|
|
};
|
|
|
|
|
2016-09-03 00:51:13 +09:00
|
|
|
task._textDivs.push(textDiv);
|
2015-11-11 00:45:03 +09:00
|
|
|
if (isAllWhitespace(geom.str)) {
|
2016-09-03 01:10:37 +09:00
|
|
|
textDivProperties.isWhitespace = true;
|
|
|
|
task._textDivProperties.set(textDiv, textDivProperties);
|
2015-11-11 00:45:03 +09:00
|
|
|
return;
|
|
|
|
}
|
2016-09-03 01:10:37 +09:00
|
|
|
|
2016-09-03 00:51:13 +09:00
|
|
|
var tx = Util.transform(task._viewport.transform, geom.transform);
|
2015-11-11 00:45:03 +09:00
|
|
|
var angle = Math.atan2(tx[1], tx[0]);
|
2016-09-03 01:10:37 +09:00
|
|
|
var style = styles[geom.fontName];
|
2015-11-11 00:45:03 +09:00
|
|
|
if (style.vertical) {
|
|
|
|
angle += Math.PI / 2;
|
|
|
|
}
|
|
|
|
var fontHeight = Math.sqrt((tx[2] * tx[2]) + (tx[3] * tx[3]));
|
|
|
|
var fontAscent = fontHeight;
|
|
|
|
if (style.ascent) {
|
|
|
|
fontAscent = style.ascent * fontAscent;
|
|
|
|
} else if (style.descent) {
|
|
|
|
fontAscent = (1 + style.descent) * fontAscent;
|
|
|
|
}
|
|
|
|
|
|
|
|
var left;
|
|
|
|
var top;
|
|
|
|
if (angle === 0) {
|
|
|
|
left = tx[4];
|
|
|
|
top = tx[5] - fontAscent;
|
|
|
|
} else {
|
|
|
|
left = tx[4] + (fontAscent * Math.sin(angle));
|
|
|
|
top = tx[5] - (fontAscent * Math.cos(angle));
|
|
|
|
}
|
[EnhanceTextSelection] Make `expandTextDivs` more efficient by updating all styles at once instead of piecewise
I intended to provide proper benchmarking results here, as outlined in https://github.com/mozilla/pdf.js/wiki/Benchmarking-your-changes, but after wasting a couple of hours over the weekend getting weird results I gave up.
It appears that there's a lot of, i.e. way too much, variance between subsequent runs of `text` tests for the results to be meaningful.
(Previously I've only benchmarked `eq` tests, so I don't know if the `text` tests has never worked well or if it's a newer problem. For reference, please see the results of back-to-back benchmark runs on the current `master` with a *very* simple manifest file: [link here].)
Instead I used `console.time/timeEnd` in `appendText` and `expandTextDivs` to be able to compare the performance with/without the patch. The entire viewer was (skip-cache) reloaded between measurements, and the result are available here: [link here].
Given the troubles I've had with benchmarking, I've not yet computed any statistics on the results (e.g. mean, variance, confidence intervals, and so on).
However, just by looking at the data I think it's safe to say that this patch first of all doesn't seem to regress the current performance. Secondly it certainly looks *very* likely that this patch actually improves the performance, especially for the one-glyph-per-text-div case (cf. issue 7224).
Re: issue 7584.
2016-09-14 00:04:57 +09:00
|
|
|
styleBuf[1] = left;
|
|
|
|
styleBuf[3] = top;
|
|
|
|
styleBuf[5] = fontHeight;
|
|
|
|
styleBuf[7] = style.fontFamily;
|
|
|
|
textDivProperties.style = styleBuf.join('');
|
|
|
|
textDiv.setAttribute('style', textDivProperties.style);
|
2015-11-11 00:45:03 +09:00
|
|
|
|
|
|
|
textDiv.textContent = geom.str;
|
|
|
|
// |fontName| is only used by the Font Inspector. This test will succeed
|
|
|
|
// when e.g. the Font Inspector is off but the Stepper is on, but it's
|
2016-09-03 01:10:37 +09:00
|
|
|
// not worth the effort to do a more accurate test. We only use `dataset`
|
|
|
|
// here to make the font name available for the debugger.
|
2016-03-29 04:49:22 +09:00
|
|
|
if (getDefaultSetting('pdfBug')) {
|
2015-11-11 00:45:03 +09:00
|
|
|
textDiv.dataset.fontName = geom.fontName;
|
|
|
|
}
|
|
|
|
if (angle !== 0) {
|
2016-09-03 01:10:37 +09:00
|
|
|
textDivProperties.angle = angle * (180 / Math.PI);
|
2015-11-11 00:45:03 +09:00
|
|
|
}
|
|
|
|
// We don't bother scaling single-char text divs, because it has very
|
|
|
|
// little effect on text highlighting. This makes scrolling on docs with
|
|
|
|
// lots of such divs a lot faster.
|
|
|
|
if (geom.str.length > 1) {
|
|
|
|
if (style.vertical) {
|
2016-09-03 01:10:37 +09:00
|
|
|
textDivProperties.canvasWidth = geom.height * task._viewport.scale;
|
2015-11-11 00:45:03 +09:00
|
|
|
} else {
|
2016-09-03 01:10:37 +09:00
|
|
|
textDivProperties.canvasWidth = geom.width * task._viewport.scale;
|
2015-11-11 00:45:03 +09:00
|
|
|
}
|
|
|
|
}
|
2016-09-03 01:10:37 +09:00
|
|
|
task._textDivProperties.set(textDiv, textDivProperties);
|
|
|
|
|
2016-09-03 00:51:13 +09:00
|
|
|
if (task._enhanceTextSelection) {
|
2016-08-17 08:06:35 +09:00
|
|
|
var angleCos = 1, angleSin = 0;
|
|
|
|
if (angle !== 0) {
|
|
|
|
angleCos = Math.cos(angle);
|
|
|
|
angleSin = Math.sin(angle);
|
|
|
|
}
|
|
|
|
var divWidth = (style.vertical ? geom.height : geom.width) *
|
2016-09-03 00:51:13 +09:00
|
|
|
task._viewport.scale;
|
2016-08-17 08:06:35 +09:00
|
|
|
var divHeight = fontHeight;
|
|
|
|
|
|
|
|
var m, b;
|
|
|
|
if (angle !== 0) {
|
|
|
|
m = [angleCos, angleSin, -angleSin, angleCos, left, top];
|
|
|
|
b = Util.getAxialAlignedBoundingBox([0, 0, divWidth, divHeight], m);
|
|
|
|
} else {
|
|
|
|
b = [left, top, left + divWidth, top + divHeight];
|
|
|
|
}
|
|
|
|
|
2016-09-03 00:51:13 +09:00
|
|
|
task._bounds.push({
|
2016-08-17 08:06:35 +09:00
|
|
|
left: b[0],
|
|
|
|
top: b[1],
|
|
|
|
right: b[2],
|
|
|
|
bottom: b[3],
|
|
|
|
div: textDiv,
|
|
|
|
size: [divWidth, divHeight],
|
|
|
|
m: m
|
|
|
|
});
|
|
|
|
}
|
2015-11-11 00:45:03 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
function render(task) {
|
|
|
|
if (task._canceled) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
var textLayerFrag = task._container;
|
|
|
|
var textDivs = task._textDivs;
|
|
|
|
var capability = task._capability;
|
|
|
|
var textDivsLength = textDivs.length;
|
|
|
|
|
|
|
|
// No point in rendering many divs as it would make the browser
|
|
|
|
// unusable even after the divs are rendered.
|
|
|
|
if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) {
|
2016-08-17 08:06:35 +09:00
|
|
|
task._renderingDone = true;
|
2015-11-11 00:45:03 +09:00
|
|
|
capability.resolve();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-01-28 02:58:39 +09:00
|
|
|
// The temporary canvas is used to measure text length in the DOM.
|
2015-11-11 00:45:03 +09:00
|
|
|
var canvas = document.createElement('canvas');
|
2016-10-15 00:57:53 +09:00
|
|
|
if (typeof PDFJSDev === 'undefined' ||
|
|
|
|
PDFJSDev.test('FIREFOX || MOZCENTRAL || GENERIC')) {
|
|
|
|
canvas.mozOpaque = true;
|
|
|
|
}
|
2015-11-11 00:45:03 +09:00
|
|
|
var ctx = canvas.getContext('2d', {alpha: false});
|
|
|
|
|
|
|
|
var lastFontSize;
|
|
|
|
var lastFontFamily;
|
|
|
|
for (var i = 0; i < textDivsLength; i++) {
|
|
|
|
var textDiv = textDivs[i];
|
2016-09-03 01:10:37 +09:00
|
|
|
var textDivProperties = task._textDivProperties.get(textDiv);
|
|
|
|
if (textDivProperties.isWhitespace) {
|
2015-11-11 00:45:03 +09:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
var fontSize = textDiv.style.fontSize;
|
|
|
|
var fontFamily = textDiv.style.fontFamily;
|
|
|
|
|
|
|
|
// Only build font string and set to context if different from last.
|
|
|
|
if (fontSize !== lastFontSize || fontFamily !== lastFontFamily) {
|
|
|
|
ctx.font = fontSize + ' ' + fontFamily;
|
|
|
|
lastFontSize = fontSize;
|
|
|
|
lastFontFamily = fontFamily;
|
|
|
|
}
|
|
|
|
|
|
|
|
var width = ctx.measureText(textDiv.textContent).width;
|
2016-03-30 02:32:51 +09:00
|
|
|
textLayerFrag.appendChild(textDiv);
|
2016-09-02 01:07:12 +09:00
|
|
|
|
2016-09-03 01:10:37 +09:00
|
|
|
var transform = '';
|
|
|
|
if (textDivProperties.canvasWidth !== 0 && width > 0) {
|
2016-09-05 03:19:31 +09:00
|
|
|
textDivProperties.scale = textDivProperties.canvasWidth / width;
|
|
|
|
transform = 'scaleX(' + textDivProperties.scale + ')';
|
2016-09-02 01:07:12 +09:00
|
|
|
}
|
2016-09-05 03:19:31 +09:00
|
|
|
if (textDivProperties.angle !== 0) {
|
|
|
|
transform = 'rotate(' + textDivProperties.angle + 'deg) ' + transform;
|
2016-09-02 01:07:12 +09:00
|
|
|
}
|
2016-09-03 01:10:37 +09:00
|
|
|
if (transform !== '') {
|
|
|
|
textDivProperties.originalTransform = transform;
|
|
|
|
CustomStyle.setProp('transform', textDiv, transform);
|
2016-09-02 01:07:12 +09:00
|
|
|
}
|
2016-09-03 01:10:37 +09:00
|
|
|
task._textDivProperties.set(textDiv, textDivProperties);
|
2016-08-17 08:06:35 +09:00
|
|
|
}
|
|
|
|
task._renderingDone = true;
|
|
|
|
capability.resolve();
|
|
|
|
}
|
|
|
|
|
2016-09-03 00:51:13 +09:00
|
|
|
function expand(task) {
|
|
|
|
var bounds = task._bounds;
|
|
|
|
var viewport = task._viewport;
|
|
|
|
|
2016-08-17 08:06:35 +09:00
|
|
|
var expanded = expandBounds(viewport.width, viewport.height, bounds);
|
|
|
|
for (var i = 0; i < expanded.length; i++) {
|
|
|
|
var div = bounds[i].div;
|
2016-09-03 01:10:37 +09:00
|
|
|
var divProperties = task._textDivProperties.get(div);
|
|
|
|
if (divProperties.angle === 0) {
|
|
|
|
divProperties.paddingLeft = bounds[i].left - expanded[i].left;
|
|
|
|
divProperties.paddingTop = bounds[i].top - expanded[i].top;
|
|
|
|
divProperties.paddingRight = expanded[i].right - bounds[i].right;
|
|
|
|
divProperties.paddingBottom = expanded[i].bottom - bounds[i].bottom;
|
|
|
|
task._textDivProperties.set(div, divProperties);
|
2016-08-17 08:06:35 +09:00
|
|
|
continue;
|
2016-03-30 02:32:51 +09:00
|
|
|
}
|
2016-08-17 08:06:35 +09:00
|
|
|
// Box is rotated -- trying to find padding so rotated div will not
|
|
|
|
// exceed its expanded bounds.
|
|
|
|
var e = expanded[i], b = bounds[i];
|
|
|
|
var m = b.m, c = m[0], s = m[1];
|
|
|
|
// Finding intersections with expanded box.
|
|
|
|
var points = [[0, 0], [0, b.size[1]], [b.size[0], 0], b.size];
|
|
|
|
var ts = new Float64Array(64);
|
|
|
|
points.forEach(function (p, i) {
|
|
|
|
var t = Util.applyTransform(p, m);
|
|
|
|
ts[i + 0] = c && (e.left - t[0]) / c;
|
|
|
|
ts[i + 4] = s && (e.top - t[1]) / s;
|
|
|
|
ts[i + 8] = c && (e.right - t[0]) / c;
|
|
|
|
ts[i + 12] = s && (e.bottom - t[1]) / s;
|
|
|
|
|
|
|
|
ts[i + 16] = s && (e.left - t[0]) / -s;
|
|
|
|
ts[i + 20] = c && (e.top - t[1]) / c;
|
|
|
|
ts[i + 24] = s && (e.right - t[0]) / -s;
|
|
|
|
ts[i + 28] = c && (e.bottom - t[1]) / c;
|
|
|
|
|
|
|
|
ts[i + 32] = c && (e.left - t[0]) / -c;
|
|
|
|
ts[i + 36] = s && (e.top - t[1]) / -s;
|
|
|
|
ts[i + 40] = c && (e.right - t[0]) / -c;
|
|
|
|
ts[i + 44] = s && (e.bottom - t[1]) / -s;
|
|
|
|
|
|
|
|
ts[i + 48] = s && (e.left - t[0]) / s;
|
|
|
|
ts[i + 52] = c && (e.top - t[1]) / -c;
|
|
|
|
ts[i + 56] = s && (e.right - t[0]) / s;
|
|
|
|
ts[i + 60] = c && (e.bottom - t[1]) / -c;
|
|
|
|
});
|
|
|
|
var findPositiveMin = function (ts, offset, count) {
|
|
|
|
var result = 0;
|
2016-09-02 01:07:12 +09:00
|
|
|
for (var i = 0; i < count; i++) {
|
|
|
|
var t = ts[offset++];
|
|
|
|
if (t > 0) {
|
|
|
|
result = result ? Math.min(t, result) : t;
|
2016-08-17 08:06:35 +09:00
|
|
|
}
|
2016-09-02 01:07:12 +09:00
|
|
|
}
|
|
|
|
return result;
|
2016-08-17 08:06:35 +09:00
|
|
|
};
|
|
|
|
// Not based on math, but to simplify calculations, using cos and sin
|
|
|
|
// absolute values to not exceed the box (it can but insignificantly).
|
|
|
|
var boxScale = 1 + Math.min(Math.abs(c), Math.abs(s));
|
2016-09-03 01:10:37 +09:00
|
|
|
divProperties.paddingLeft = findPositiveMin(ts, 32, 16) / boxScale;
|
|
|
|
divProperties.paddingTop = findPositiveMin(ts, 48, 16) / boxScale;
|
|
|
|
divProperties.paddingRight = findPositiveMin(ts, 0, 16) / boxScale;
|
|
|
|
divProperties.paddingBottom = findPositiveMin(ts, 16, 16) / boxScale;
|
|
|
|
task._textDivProperties.set(div, divProperties);
|
2016-08-17 08:06:35 +09:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function expandBounds(width, height, boxes) {
|
|
|
|
var bounds = boxes.map(function (box, i) {
|
|
|
|
return {
|
|
|
|
x1: box.left,
|
|
|
|
y1: box.top,
|
|
|
|
x2: box.right,
|
|
|
|
y2: box.bottom,
|
|
|
|
index: i,
|
|
|
|
x1New: undefined,
|
|
|
|
x2New: undefined
|
|
|
|
};
|
|
|
|
});
|
|
|
|
expandBoundsLTR(width, bounds);
|
|
|
|
var expanded = new Array(boxes.length);
|
|
|
|
bounds.forEach(function (b) {
|
|
|
|
var i = b.index;
|
|
|
|
expanded[i] = {
|
|
|
|
left: b.x1New,
|
|
|
|
top: 0,
|
|
|
|
right: b.x2New,
|
|
|
|
bottom: 0
|
|
|
|
};
|
|
|
|
});
|
|
|
|
|
|
|
|
// Rotating on 90 degrees and extending extended boxes. Reusing the bounds
|
|
|
|
// array and objects.
|
|
|
|
boxes.map(function (box, i) {
|
|
|
|
var e = expanded[i], b = bounds[i];
|
|
|
|
b.x1 = box.top;
|
|
|
|
b.y1 = width - e.right;
|
|
|
|
b.x2 = box.bottom;
|
|
|
|
b.y2 = width - e.left;
|
|
|
|
b.index = i;
|
|
|
|
b.x1New = undefined;
|
|
|
|
b.x2New = undefined;
|
|
|
|
});
|
|
|
|
expandBoundsLTR(height, bounds);
|
|
|
|
|
|
|
|
bounds.forEach(function (b) {
|
|
|
|
var i = b.index;
|
|
|
|
expanded[i].top = b.x1New;
|
|
|
|
expanded[i].bottom = b.x2New;
|
|
|
|
});
|
|
|
|
return expanded;
|
|
|
|
}
|
|
|
|
|
|
|
|
function expandBoundsLTR(width, bounds) {
|
|
|
|
// Sorting by x1 coordinate and walk by the bounds in the same order.
|
2017-02-03 20:58:08 +09:00
|
|
|
bounds.sort(function (a, b) {
|
|
|
|
return a.x1 - b.x1 || a.index - b.index;
|
|
|
|
});
|
2016-08-17 08:06:35 +09:00
|
|
|
|
|
|
|
// First we see on the horizon is a fake boundary.
|
|
|
|
var fakeBoundary = {
|
|
|
|
x1: -Infinity,
|
|
|
|
y1: -Infinity,
|
|
|
|
x2: 0,
|
|
|
|
y2: Infinity,
|
|
|
|
index: -1,
|
|
|
|
x1New: 0,
|
|
|
|
x2New: 0
|
|
|
|
};
|
|
|
|
var horizon = [{
|
|
|
|
start: -Infinity,
|
|
|
|
end: Infinity,
|
|
|
|
boundary: fakeBoundary
|
|
|
|
}];
|
|
|
|
|
|
|
|
bounds.forEach(function (boundary) {
|
|
|
|
// Searching for the affected part of horizon.
|
|
|
|
// TODO red-black tree or simple binary search
|
|
|
|
var i = 0;
|
|
|
|
while (i < horizon.length && horizon[i].end <= boundary.y1) {
|
|
|
|
i++;
|
2016-03-30 02:32:51 +09:00
|
|
|
}
|
2016-08-17 08:06:35 +09:00
|
|
|
var j = horizon.length - 1;
|
2016-12-13 04:18:48 +09:00
|
|
|
while (j >= 0 && horizon[j].start >= boundary.y2) {
|
2016-08-17 08:06:35 +09:00
|
|
|
j--;
|
2015-11-11 00:45:03 +09:00
|
|
|
}
|
2016-08-17 08:06:35 +09:00
|
|
|
|
|
|
|
var horizonPart, affectedBoundary;
|
|
|
|
var q, k, maxXNew = -Infinity;
|
|
|
|
for (q = i; q <= j; q++) {
|
|
|
|
horizonPart = horizon[q];
|
|
|
|
affectedBoundary = horizonPart.boundary;
|
|
|
|
var xNew;
|
|
|
|
if (affectedBoundary.x2 > boundary.x1) {
|
|
|
|
// In the middle of the previous element, new x shall be at the
|
|
|
|
// boundary start. Extending if further if the affected bondary
|
|
|
|
// placed on top of the current one.
|
|
|
|
xNew = affectedBoundary.index > boundary.index ?
|
|
|
|
affectedBoundary.x1New : boundary.x1;
|
|
|
|
} else if (affectedBoundary.x2New === undefined) {
|
|
|
|
// We have some space in between, new x in middle will be a fair
|
|
|
|
// choice.
|
|
|
|
xNew = (affectedBoundary.x2 + boundary.x1) / 2;
|
|
|
|
} else {
|
|
|
|
// Affected boundary has x2new set, using it as new x.
|
|
|
|
xNew = affectedBoundary.x2New;
|
|
|
|
}
|
|
|
|
if (xNew > maxXNew) {
|
|
|
|
maxXNew = xNew;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set new x1 for current boundary.
|
|
|
|
boundary.x1New = maxXNew;
|
|
|
|
|
|
|
|
// Adjusts new x2 for the affected boundaries.
|
|
|
|
for (q = i; q <= j; q++) {
|
|
|
|
horizonPart = horizon[q];
|
|
|
|
affectedBoundary = horizonPart.boundary;
|
|
|
|
if (affectedBoundary.x2New === undefined) {
|
|
|
|
// Was not set yet, choosing new x if possible.
|
|
|
|
if (affectedBoundary.x2 > boundary.x1) {
|
|
|
|
// Current and affected boundaries intersect. If affected boundary
|
|
|
|
// is placed on top of the current, shrinking the affected.
|
|
|
|
if (affectedBoundary.index > boundary.index) {
|
|
|
|
affectedBoundary.x2New = affectedBoundary.x2;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
affectedBoundary.x2New = maxXNew;
|
|
|
|
}
|
|
|
|
} else if (affectedBoundary.x2New > maxXNew) {
|
|
|
|
// Affected boundary is touching new x, pushing it back.
|
|
|
|
affectedBoundary.x2New = Math.max(maxXNew, affectedBoundary.x2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Fixing the horizon.
|
|
|
|
var changedHorizon = [], lastBoundary = null;
|
|
|
|
for (q = i; q <= j; q++) {
|
|
|
|
horizonPart = horizon[q];
|
|
|
|
affectedBoundary = horizonPart.boundary;
|
|
|
|
// Checking which boundary will be visible.
|
|
|
|
var useBoundary = affectedBoundary.x2 > boundary.x2 ?
|
|
|
|
affectedBoundary : boundary;
|
|
|
|
if (lastBoundary === useBoundary) {
|
|
|
|
// Merging with previous.
|
|
|
|
changedHorizon[changedHorizon.length - 1].end = horizonPart.end;
|
|
|
|
} else {
|
|
|
|
changedHorizon.push({
|
|
|
|
start: horizonPart.start,
|
|
|
|
end: horizonPart.end,
|
|
|
|
boundary: useBoundary
|
|
|
|
});
|
|
|
|
lastBoundary = useBoundary;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (horizon[i].start < boundary.y1) {
|
|
|
|
changedHorizon[0].start = boundary.y1;
|
|
|
|
changedHorizon.unshift({
|
|
|
|
start: horizon[i].start,
|
|
|
|
end: boundary.y1,
|
|
|
|
boundary: horizon[i].boundary
|
|
|
|
});
|
|
|
|
}
|
|
|
|
if (boundary.y2 < horizon[j].end) {
|
|
|
|
changedHorizon[changedHorizon.length - 1].end = boundary.y2;
|
|
|
|
changedHorizon.push({
|
|
|
|
start: boundary.y2,
|
|
|
|
end: horizon[j].end,
|
|
|
|
boundary: horizon[j].boundary
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set x2 new of boundary that is no longer visible (see overlapping case
|
|
|
|
// above).
|
|
|
|
// TODO more efficient, e.g. via reference counting.
|
|
|
|
for (q = i; q <= j; q++) {
|
|
|
|
horizonPart = horizon[q];
|
|
|
|
affectedBoundary = horizonPart.boundary;
|
|
|
|
if (affectedBoundary.x2New !== undefined) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
var used = false;
|
|
|
|
for (k = i - 1; !used && k >= 0 &&
|
|
|
|
horizon[k].start >= affectedBoundary.y1; k--) {
|
|
|
|
used = horizon[k].boundary === affectedBoundary;
|
|
|
|
}
|
|
|
|
for (k = j + 1; !used && k < horizon.length &&
|
|
|
|
horizon[k].end <= affectedBoundary.y2; k++) {
|
|
|
|
used = horizon[k].boundary === affectedBoundary;
|
|
|
|
}
|
|
|
|
for (k = 0; !used && k < changedHorizon.length; k++) {
|
|
|
|
used = changedHorizon[k].boundary === affectedBoundary;
|
|
|
|
}
|
|
|
|
if (!used) {
|
|
|
|
affectedBoundary.x2New = maxXNew;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Array.prototype.splice.apply(horizon,
|
|
|
|
[i, j - i + 1].concat(changedHorizon));
|
|
|
|
});
|
|
|
|
|
|
|
|
// Set new x2 for all unset boundaries.
|
|
|
|
horizon.forEach(function (horizonPart) {
|
|
|
|
var affectedBoundary = horizonPart.boundary;
|
|
|
|
if (affectedBoundary.x2New === undefined) {
|
|
|
|
affectedBoundary.x2New = Math.max(width, affectedBoundary.x2);
|
|
|
|
}
|
|
|
|
});
|
2015-11-11 00:45:03 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Text layer rendering task.
|
|
|
|
*
|
|
|
|
* @param {TextContent} textContent
|
|
|
|
* @param {HTMLElement} container
|
2016-03-29 04:49:22 +09:00
|
|
|
* @param {PageViewport} viewport
|
2015-11-11 00:45:03 +09:00
|
|
|
* @param {Array} textDivs
|
2016-08-17 08:06:35 +09:00
|
|
|
* @param {boolean} enhanceTextSelection
|
2015-11-11 00:45:03 +09:00
|
|
|
* @private
|
|
|
|
*/
|
2016-08-17 08:06:35 +09:00
|
|
|
function TextLayerRenderTask(textContent, container, viewport, textDivs,
|
|
|
|
enhanceTextSelection) {
|
2015-11-11 00:45:03 +09:00
|
|
|
this._textContent = textContent;
|
|
|
|
this._container = container;
|
|
|
|
this._viewport = viewport;
|
2016-09-03 00:51:13 +09:00
|
|
|
this._textDivs = textDivs || [];
|
2016-09-03 01:10:37 +09:00
|
|
|
this._textDivProperties = new WeakMap();
|
2016-08-17 08:06:35 +09:00
|
|
|
this._renderingDone = false;
|
2015-11-11 00:45:03 +09:00
|
|
|
this._canceled = false;
|
|
|
|
this._capability = createPromiseCapability();
|
|
|
|
this._renderTimer = null;
|
2016-08-17 08:06:35 +09:00
|
|
|
this._bounds = [];
|
|
|
|
this._enhanceTextSelection = !!enhanceTextSelection;
|
2015-11-11 00:45:03 +09:00
|
|
|
}
|
|
|
|
TextLayerRenderTask.prototype = {
|
|
|
|
get promise() {
|
|
|
|
return this._capability.promise;
|
|
|
|
},
|
|
|
|
|
|
|
|
cancel: function TextLayer_cancel() {
|
|
|
|
this._canceled = true;
|
|
|
|
if (this._renderTimer !== null) {
|
|
|
|
clearTimeout(this._renderTimer);
|
|
|
|
this._renderTimer = null;
|
|
|
|
}
|
|
|
|
this._capability.reject('canceled');
|
|
|
|
},
|
|
|
|
|
|
|
|
_render: function TextLayer_render(timeout) {
|
|
|
|
var textItems = this._textContent.items;
|
2016-09-03 01:10:37 +09:00
|
|
|
var textStyles = this._textContent.styles;
|
2015-11-11 00:45:03 +09:00
|
|
|
for (var i = 0, len = textItems.length; i < len; i++) {
|
2016-09-03 01:10:37 +09:00
|
|
|
appendText(this, textItems[i], textStyles);
|
2015-11-11 00:45:03 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!timeout) { // Render right away
|
|
|
|
render(this);
|
|
|
|
} else { // Schedule
|
|
|
|
var self = this;
|
|
|
|
this._renderTimer = setTimeout(function() {
|
|
|
|
render(self);
|
|
|
|
self._renderTimer = null;
|
|
|
|
}, timeout);
|
|
|
|
}
|
2016-08-17 08:06:35 +09:00
|
|
|
},
|
|
|
|
|
|
|
|
expandTextDivs: function TextLayer_expandTextDivs(expandDivs) {
|
|
|
|
if (!this._enhanceTextSelection || !this._renderingDone) {
|
|
|
|
return;
|
|
|
|
}
|
[EnhanceTextSelection] Make `expandTextDivs` more efficient by updating all styles at once instead of piecewise
I intended to provide proper benchmarking results here, as outlined in https://github.com/mozilla/pdf.js/wiki/Benchmarking-your-changes, but after wasting a couple of hours over the weekend getting weird results I gave up.
It appears that there's a lot of, i.e. way too much, variance between subsequent runs of `text` tests for the results to be meaningful.
(Previously I've only benchmarked `eq` tests, so I don't know if the `text` tests has never worked well or if it's a newer problem. For reference, please see the results of back-to-back benchmark runs on the current `master` with a *very* simple manifest file: [link here].)
Instead I used `console.time/timeEnd` in `appendText` and `expandTextDivs` to be able to compare the performance with/without the patch. The entire viewer was (skip-cache) reloaded between measurements, and the result are available here: [link here].
Given the troubles I've had with benchmarking, I've not yet computed any statistics on the results (e.g. mean, variance, confidence intervals, and so on).
However, just by looking at the data I think it's safe to say that this patch first of all doesn't seem to regress the current performance. Secondly it certainly looks *very* likely that this patch actually improves the performance, especially for the one-glyph-per-text-div case (cf. issue 7224).
Re: issue 7584.
2016-09-14 00:04:57 +09:00
|
|
|
if (this._bounds !== null) {
|
2016-09-03 00:51:13 +09:00
|
|
|
expand(this);
|
[EnhanceTextSelection] Make `expandTextDivs` more efficient by updating all styles at once instead of piecewise
I intended to provide proper benchmarking results here, as outlined in https://github.com/mozilla/pdf.js/wiki/Benchmarking-your-changes, but after wasting a couple of hours over the weekend getting weird results I gave up.
It appears that there's a lot of, i.e. way too much, variance between subsequent runs of `text` tests for the results to be meaningful.
(Previously I've only benchmarked `eq` tests, so I don't know if the `text` tests has never worked well or if it's a newer problem. For reference, please see the results of back-to-back benchmark runs on the current `master` with a *very* simple manifest file: [link here].)
Instead I used `console.time/timeEnd` in `appendText` and `expandTextDivs` to be able to compare the performance with/without the patch. The entire viewer was (skip-cache) reloaded between measurements, and the result are available here: [link here].
Given the troubles I've had with benchmarking, I've not yet computed any statistics on the results (e.g. mean, variance, confidence intervals, and so on).
However, just by looking at the data I think it's safe to say that this patch first of all doesn't seem to regress the current performance. Secondly it certainly looks *very* likely that this patch actually improves the performance, especially for the one-glyph-per-text-div case (cf. issue 7224).
Re: issue 7584.
2016-09-14 00:04:57 +09:00
|
|
|
this._bounds = null;
|
2016-08-17 08:06:35 +09:00
|
|
|
}
|
2016-09-03 01:10:37 +09:00
|
|
|
|
|
|
|
for (var i = 0, ii = this._textDivs.length; i < ii; i++) {
|
|
|
|
var div = this._textDivs[i];
|
|
|
|
var divProperties = this._textDivProperties.get(div);
|
|
|
|
|
[EnhanceTextSelection] Make `expandTextDivs` more efficient by updating all styles at once instead of piecewise
I intended to provide proper benchmarking results here, as outlined in https://github.com/mozilla/pdf.js/wiki/Benchmarking-your-changes, but after wasting a couple of hours over the weekend getting weird results I gave up.
It appears that there's a lot of, i.e. way too much, variance between subsequent runs of `text` tests for the results to be meaningful.
(Previously I've only benchmarked `eq` tests, so I don't know if the `text` tests has never worked well or if it's a newer problem. For reference, please see the results of back-to-back benchmark runs on the current `master` with a *very* simple manifest file: [link here].)
Instead I used `console.time/timeEnd` in `appendText` and `expandTextDivs` to be able to compare the performance with/without the patch. The entire viewer was (skip-cache) reloaded between measurements, and the result are available here: [link here].
Given the troubles I've had with benchmarking, I've not yet computed any statistics on the results (e.g. mean, variance, confidence intervals, and so on).
However, just by looking at the data I think it's safe to say that this patch first of all doesn't seem to regress the current performance. Secondly it certainly looks *very* likely that this patch actually improves the performance, especially for the one-glyph-per-text-div case (cf. issue 7224).
Re: issue 7584.
2016-09-14 00:04:57 +09:00
|
|
|
if (divProperties.isWhitespace) {
|
|
|
|
continue;
|
|
|
|
}
|
2016-09-03 01:10:37 +09:00
|
|
|
if (expandDivs) {
|
[EnhanceTextSelection] Make `expandTextDivs` more efficient by updating all styles at once instead of piecewise
I intended to provide proper benchmarking results here, as outlined in https://github.com/mozilla/pdf.js/wiki/Benchmarking-your-changes, but after wasting a couple of hours over the weekend getting weird results I gave up.
It appears that there's a lot of, i.e. way too much, variance between subsequent runs of `text` tests for the results to be meaningful.
(Previously I've only benchmarked `eq` tests, so I don't know if the `text` tests has never worked well or if it's a newer problem. For reference, please see the results of back-to-back benchmark runs on the current `master` with a *very* simple manifest file: [link here].)
Instead I used `console.time/timeEnd` in `appendText` and `expandTextDivs` to be able to compare the performance with/without the patch. The entire viewer was (skip-cache) reloaded between measurements, and the result are available here: [link here].
Given the troubles I've had with benchmarking, I've not yet computed any statistics on the results (e.g. mean, variance, confidence intervals, and so on).
However, just by looking at the data I think it's safe to say that this patch first of all doesn't seem to regress the current performance. Secondly it certainly looks *very* likely that this patch actually improves the performance, especially for the one-glyph-per-text-div case (cf. issue 7224).
Re: issue 7584.
2016-09-14 00:04:57 +09:00
|
|
|
var transform = '', padding = '';
|
2016-09-03 01:10:37 +09:00
|
|
|
|
2016-09-05 03:19:31 +09:00
|
|
|
if (divProperties.scale !== 1) {
|
|
|
|
transform = 'scaleX(' + divProperties.scale + ')';
|
2016-08-17 08:06:35 +09:00
|
|
|
}
|
2016-09-03 01:10:37 +09:00
|
|
|
if (divProperties.angle !== 0) {
|
|
|
|
transform = 'rotate(' + divProperties.angle + 'deg) ' + transform;
|
2016-08-17 08:06:35 +09:00
|
|
|
}
|
2016-09-03 01:10:37 +09:00
|
|
|
if (divProperties.paddingLeft !== 0) {
|
[EnhanceTextSelection] Make `expandTextDivs` more efficient by updating all styles at once instead of piecewise
I intended to provide proper benchmarking results here, as outlined in https://github.com/mozilla/pdf.js/wiki/Benchmarking-your-changes, but after wasting a couple of hours over the weekend getting weird results I gave up.
It appears that there's a lot of, i.e. way too much, variance between subsequent runs of `text` tests for the results to be meaningful.
(Previously I've only benchmarked `eq` tests, so I don't know if the `text` tests has never worked well or if it's a newer problem. For reference, please see the results of back-to-back benchmark runs on the current `master` with a *very* simple manifest file: [link here].)
Instead I used `console.time/timeEnd` in `appendText` and `expandTextDivs` to be able to compare the performance with/without the patch. The entire viewer was (skip-cache) reloaded between measurements, and the result are available here: [link here].
Given the troubles I've had with benchmarking, I've not yet computed any statistics on the results (e.g. mean, variance, confidence intervals, and so on).
However, just by looking at the data I think it's safe to say that this patch first of all doesn't seem to regress the current performance. Secondly it certainly looks *very* likely that this patch actually improves the performance, especially for the one-glyph-per-text-div case (cf. issue 7224).
Re: issue 7584.
2016-09-14 00:04:57 +09:00
|
|
|
padding += ' padding-left: ' +
|
|
|
|
(divProperties.paddingLeft / divProperties.scale) + 'px;';
|
2016-08-17 08:06:35 +09:00
|
|
|
transform += ' translateX(' +
|
2016-09-05 03:19:31 +09:00
|
|
|
(-divProperties.paddingLeft / divProperties.scale) + 'px)';
|
2016-08-17 08:06:35 +09:00
|
|
|
}
|
2016-09-03 01:10:37 +09:00
|
|
|
if (divProperties.paddingTop !== 0) {
|
[EnhanceTextSelection] Make `expandTextDivs` more efficient by updating all styles at once instead of piecewise
I intended to provide proper benchmarking results here, as outlined in https://github.com/mozilla/pdf.js/wiki/Benchmarking-your-changes, but after wasting a couple of hours over the weekend getting weird results I gave up.
It appears that there's a lot of, i.e. way too much, variance between subsequent runs of `text` tests for the results to be meaningful.
(Previously I've only benchmarked `eq` tests, so I don't know if the `text` tests has never worked well or if it's a newer problem. For reference, please see the results of back-to-back benchmark runs on the current `master` with a *very* simple manifest file: [link here].)
Instead I used `console.time/timeEnd` in `appendText` and `expandTextDivs` to be able to compare the performance with/without the patch. The entire viewer was (skip-cache) reloaded between measurements, and the result are available here: [link here].
Given the troubles I've had with benchmarking, I've not yet computed any statistics on the results (e.g. mean, variance, confidence intervals, and so on).
However, just by looking at the data I think it's safe to say that this patch first of all doesn't seem to regress the current performance. Secondly it certainly looks *very* likely that this patch actually improves the performance, especially for the one-glyph-per-text-div case (cf. issue 7224).
Re: issue 7584.
2016-09-14 00:04:57 +09:00
|
|
|
padding += ' padding-top: ' + divProperties.paddingTop + 'px;';
|
2016-09-03 01:10:37 +09:00
|
|
|
transform += ' translateY(' + (-divProperties.paddingTop) + 'px)';
|
2016-08-17 08:06:35 +09:00
|
|
|
}
|
2016-09-03 01:10:37 +09:00
|
|
|
if (divProperties.paddingRight !== 0) {
|
[EnhanceTextSelection] Make `expandTextDivs` more efficient by updating all styles at once instead of piecewise
I intended to provide proper benchmarking results here, as outlined in https://github.com/mozilla/pdf.js/wiki/Benchmarking-your-changes, but after wasting a couple of hours over the weekend getting weird results I gave up.
It appears that there's a lot of, i.e. way too much, variance between subsequent runs of `text` tests for the results to be meaningful.
(Previously I've only benchmarked `eq` tests, so I don't know if the `text` tests has never worked well or if it's a newer problem. For reference, please see the results of back-to-back benchmark runs on the current `master` with a *very* simple manifest file: [link here].)
Instead I used `console.time/timeEnd` in `appendText` and `expandTextDivs` to be able to compare the performance with/without the patch. The entire viewer was (skip-cache) reloaded between measurements, and the result are available here: [link here].
Given the troubles I've had with benchmarking, I've not yet computed any statistics on the results (e.g. mean, variance, confidence intervals, and so on).
However, just by looking at the data I think it's safe to say that this patch first of all doesn't seem to regress the current performance. Secondly it certainly looks *very* likely that this patch actually improves the performance, especially for the one-glyph-per-text-div case (cf. issue 7224).
Re: issue 7584.
2016-09-14 00:04:57 +09:00
|
|
|
padding += ' padding-right: ' +
|
|
|
|
(divProperties.paddingRight / divProperties.scale) + 'px;';
|
2016-08-17 08:06:35 +09:00
|
|
|
}
|
2016-09-03 01:10:37 +09:00
|
|
|
if (divProperties.paddingBottom !== 0) {
|
[EnhanceTextSelection] Make `expandTextDivs` more efficient by updating all styles at once instead of piecewise
I intended to provide proper benchmarking results here, as outlined in https://github.com/mozilla/pdf.js/wiki/Benchmarking-your-changes, but after wasting a couple of hours over the weekend getting weird results I gave up.
It appears that there's a lot of, i.e. way too much, variance between subsequent runs of `text` tests for the results to be meaningful.
(Previously I've only benchmarked `eq` tests, so I don't know if the `text` tests has never worked well or if it's a newer problem. For reference, please see the results of back-to-back benchmark runs on the current `master` with a *very* simple manifest file: [link here].)
Instead I used `console.time/timeEnd` in `appendText` and `expandTextDivs` to be able to compare the performance with/without the patch. The entire viewer was (skip-cache) reloaded between measurements, and the result are available here: [link here].
Given the troubles I've had with benchmarking, I've not yet computed any statistics on the results (e.g. mean, variance, confidence intervals, and so on).
However, just by looking at the data I think it's safe to say that this patch first of all doesn't seem to regress the current performance. Secondly it certainly looks *very* likely that this patch actually improves the performance, especially for the one-glyph-per-text-div case (cf. issue 7224).
Re: issue 7584.
2016-09-14 00:04:57 +09:00
|
|
|
padding += ' padding-bottom: ' +
|
|
|
|
divProperties.paddingBottom + 'px;';
|
|
|
|
}
|
|
|
|
|
|
|
|
if (padding !== '') {
|
|
|
|
div.setAttribute('style', divProperties.style + padding);
|
2016-08-17 08:06:35 +09:00
|
|
|
}
|
2016-09-03 01:10:37 +09:00
|
|
|
if (transform !== '') {
|
|
|
|
CustomStyle.setProp('transform', div, transform);
|
2016-08-17 08:06:35 +09:00
|
|
|
}
|
2016-09-03 01:10:37 +09:00
|
|
|
} else {
|
2016-08-17 08:06:35 +09:00
|
|
|
div.style.padding = 0;
|
2016-09-03 01:10:37 +09:00
|
|
|
CustomStyle.setProp('transform', div,
|
[EnhanceTextSelection] Make `expandTextDivs` more efficient by updating all styles at once instead of piecewise
I intended to provide proper benchmarking results here, as outlined in https://github.com/mozilla/pdf.js/wiki/Benchmarking-your-changes, but after wasting a couple of hours over the weekend getting weird results I gave up.
It appears that there's a lot of, i.e. way too much, variance between subsequent runs of `text` tests for the results to be meaningful.
(Previously I've only benchmarked `eq` tests, so I don't know if the `text` tests has never worked well or if it's a newer problem. For reference, please see the results of back-to-back benchmark runs on the current `master` with a *very* simple manifest file: [link here].)
Instead I used `console.time/timeEnd` in `appendText` and `expandTextDivs` to be able to compare the performance with/without the patch. The entire viewer was (skip-cache) reloaded between measurements, and the result are available here: [link here].
Given the troubles I've had with benchmarking, I've not yet computed any statistics on the results (e.g. mean, variance, confidence intervals, and so on).
However, just by looking at the data I think it's safe to say that this patch first of all doesn't seem to regress the current performance. Secondly it certainly looks *very* likely that this patch actually improves the performance, especially for the one-glyph-per-text-div case (cf. issue 7224).
Re: issue 7584.
2016-09-14 00:04:57 +09:00
|
|
|
divProperties.originalTransform || '');
|
2016-08-17 08:06:35 +09:00
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
2015-11-11 00:45:03 +09:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Starts rendering of the text layer.
|
|
|
|
*
|
|
|
|
* @param {TextLayerRenderParameters} renderParameters
|
|
|
|
* @returns {TextLayerRenderTask}
|
|
|
|
*/
|
|
|
|
function renderTextLayer(renderParameters) {
|
|
|
|
var task = new TextLayerRenderTask(renderParameters.textContent,
|
|
|
|
renderParameters.container,
|
|
|
|
renderParameters.viewport,
|
2016-08-17 08:06:35 +09:00
|
|
|
renderParameters.textDivs,
|
|
|
|
renderParameters.enhanceTextSelection);
|
2015-11-11 00:45:03 +09:00
|
|
|
task._render(renderParameters.timeout);
|
|
|
|
return task;
|
|
|
|
}
|
|
|
|
|
|
|
|
return renderTextLayer;
|
|
|
|
})();
|
|
|
|
|
2017-04-02 21:25:33 +09:00
|
|
|
export {
|
|
|
|
renderTextLayer,
|
|
|
|
};
|