From 91efde52465da31381bfbbddb1b3f597ab5bc5a7 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Sun, 22 Mar 2020 14:09:08 +0100 Subject: [PATCH] Add a heuristic to scale even single-char text, when the horizontal/vertical scaling differs significantly (issue 11713) At this point in time, compared to when the "ignore single-char" code was added, we *should* generally be doing a much better job of combining text into as few chunks as possible. However, there's still bad cases where we're not able to combine text as much as one would like, which is why I'm *not* proposing to simply measure/scale all text. Instead this patch will to only measure/scale single-char text in cases where the horizontal/vertical scale is off significantly, since that's were you'd expect bad text-selection behaviour otherwise. Note that most of the movement caused by this patch is with Type3 fonts, which is a somewhat special font type and one where our current text-selection behaviour is probably the least good. --- src/display/text_layer.js | 15 +++++++++++++++ test/pdfs/.gitignore | 1 + test/pdfs/issue11713.pdf | Bin 0 -> 6652 bytes test/test_manifest.json | 6 ++++++ 4 files changed, 22 insertions(+) create mode 100644 test/pdfs/issue11713.pdf diff --git a/src/display/text_layer.js b/src/display/text_layer.js index 6db45eac2..f8308a4e3 100644 --- a/src/display/text_layer.js +++ b/src/display/text_layer.js @@ -113,7 +113,22 @@ var renderTextLayer = (function renderTextLayerClosure() { // 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. + let shouldScaleText = false; if (geom.str.length > 1) { + shouldScaleText = true; + } else if (geom.transform[0] !== geom.transform[3]) { + const absScaleX = Math.abs(geom.transform[0]), + absScaleY = Math.abs(geom.transform[3]); + // When the horizontal/vertical scaling differs significantly, also scale + // even single-char text to improve highlighting (fixes issue11713.pdf). + if ( + absScaleX !== absScaleY && + Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5 + ) { + shouldScaleText = true; + } + } + if (shouldScaleText) { if (style.vertical) { textDivProperties.canvasWidth = geom.height * task._viewport.scale; } else { diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index a6ef9da6a..7b61bf6f2 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -143,6 +143,7 @@ !issue6621.pdf !issue6286.pdf !issue1055r.pdf +!issue11713.pdf !issue1293r.pdf !issue1655r.pdf !issue6541.pdf diff --git a/test/pdfs/issue11713.pdf b/test/pdfs/issue11713.pdf new file mode 100644 index 0000000000000000000000000000000000000000..be2057488ee2890c1ff244162722a061eee5b01e GIT binary patch literal 6652 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 literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index 73f94005e..18880029e 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -1107,6 +1107,12 @@ "link": false, "type": "text" }, + { "id": "issue11713", + "file": "pdfs/issue11713.pdf", + "md5": "bafe5801234feeb95969da106f2ce6d8", + "rounds": 1, + "type": "text" + }, { "id": "bug1250079", "file": "pdfs/bug1250079.pdf", "md5": "a1dd21a70ae7097d96273e85a80b26ef",