diff --git a/src/display/editor/highlight.js b/src/display/editor/highlight.js index 9887b0778..36ca75cc5 100644 --- a/src/display/editor/highlight.js +++ b/src/display/editor/highlight.js @@ -671,12 +671,13 @@ class HighlightEditor extends AnnotationEditor { return null; } const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; const boxes = this.#boxes; const quadPoints = new Float32Array(boxes.length * 8); let i = 0; for (const { x, y, width, height } of boxes) { - const sx = x * pageWidth; - const sy = (1 - y - height) * pageHeight; + const sx = x * pageWidth + pageX; + const sy = (1 - y - height) * pageHeight + pageY; // The specifications say that the rectangle should start from the bottom // left corner and go counter-clockwise. // But when opening the file in Adobe Acrobat it appears that this isn't diff --git a/test/integration/highlight_editor_spec.mjs b/test/integration/highlight_editor_spec.mjs index a3c6c6d08..6c47bbe7e 100644 --- a/test/integration/highlight_editor_spec.mjs +++ b/test/integration/highlight_editor_spec.mjs @@ -1302,6 +1302,41 @@ describe("Highlight Editor", () => { }); }); + describe("Quadpoints must be correct when they're in a translated page", () => { + let pages; + + beforeAll(async () => { + pages = await loadAndWait("issue18360.pdf", ".annotationEditorLayer"); + }); + + afterAll(async () => { + await closePages(pages); + }); + + it("must check that the quadpoints for an highlight are almost correct", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToHighlight(page); + + const rect = await getSpanRectFromText(page, 1, "Hello World"); + await page.mouse.click( + rect.x + rect.width / 4, + rect.y + rect.height / 2, + { count: 2, delay: 100 } + ); + + await page.waitForSelector(getEditorSelector(0)); + await waitForSerialized(page, 1); + const quadPoints = await getFirstSerialized(page, e => e.quadPoints); + const expected = [148, 624, 176, 624, 148, 637, 176, 637]; + expect(quadPoints.every((x, i) => Math.abs(x - expected[i]) <= 5)) + .withContext(`In ${browserName} (got ${quadPoints})`) + .toBeTrue(); + }) + ); + }); + }); + describe("Editor must be unselected when the color picker is Escaped", () => { let pages; diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index b92b8e391..98c3f4ace 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -652,3 +652,4 @@ !bug1539074.pdf !bug1539074.1.pdf !issue18305.pdf +!issue18360.pdf diff --git a/test/pdfs/issue18360.pdf b/test/pdfs/issue18360.pdf new file mode 100755 index 000000000..43a96575e Binary files /dev/null and b/test/pdfs/issue18360.pdf differ