Skip to content

Commit

Permalink
Avoid to have a white line around the canvas
Browse files Browse the repository at this point in the history
The canvas must have the same dims as the page in order to avoid to see the page
background.
  • Loading branch information
calixteman committed Sep 6, 2024
1 parent 4b906ad commit 0c5a919
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 7 deletions.
8 changes: 6 additions & 2 deletions src/display/display_utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -1103,8 +1103,12 @@ function setLayerDimensions(

const w = `var(--scale-factor) * ${pageWidth}px`,
h = `var(--scale-factor) * ${pageHeight}px`;
const widthStr = useRound ? `round(${w}, 1px)` : `calc(${w})`,
heightStr = useRound ? `round(${h}, 1px)` : `calc(${h})`;
const widthStr = useRound
? `round(down, ${w}, var(--scale-round-x))`
: `calc(${w})`,
heightStr = useRound
? `round(down, ${h}, var(--scale-round-y))`
: `calc(${h})`;

if (!mustFlip || viewport.rotation % 180 === 0) {
style.width = widthStr;
Expand Down
14 changes: 14 additions & 0 deletions test/unit/ui_utils_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import {
backtrackBeforeAllVisibleElements,
binarySearchFirstItem,
calcRound,
getPageSizeInches,
getVisibleElements,
isPortraitOrientation,
Expand Down Expand Up @@ -627,4 +628,17 @@ describe("ui_utils", function () {
});
});
});

describe("calcRound", function () {
it("", function () {
if (
typeof window !== "undefined" &&
window.navigator?.userAgent?.includes("Firefox")
) {
expect(calcRound(1.6)).not.toEqual(1.6);
} else {
expect(calcRound(1.6)).toEqual(1.6);
}
});
});
});
31 changes: 26 additions & 5 deletions web/pdf_page_view.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import {
} from "pdfjs-lib";
import {
approximateFraction,
calcRound,
DEFAULT_SCALE,
floorToDivide,
OutputScale,
Expand Down Expand Up @@ -127,6 +128,10 @@ class PDFPageView {

#previousRotation = null;

#scaleRoundX = 1;

#scaleRoundY = 1;

#renderError = null;

#renderingState = RenderingStates.INITIAL;
Expand Down Expand Up @@ -1036,11 +1041,27 @@ class PDFPageView {
const sfx = approximateFraction(outputScale.sx);
const sfy = approximateFraction(outputScale.sy);

canvas.width = floorToDivide(width * outputScale.sx, sfx[0]);
canvas.height = floorToDivide(height * outputScale.sy, sfy[0]);
const { style } = canvas;
style.width = floorToDivide(width, sfx[1]) + "px";
style.height = floorToDivide(height, sfy[1]) + "px";
const canvasWidth = (canvas.width = floorToDivide(
calcRound(width * outputScale.sx),
sfx[0]
));
const canvasHeight = (canvas.height = floorToDivide(
calcRound(height * outputScale.sy),
sfy[0]
));
const pageWidth = floorToDivide(calcRound(width), sfx[1]);
const pageHeight = floorToDivide(calcRound(height), sfy[1]);
outputScale.sx = canvasWidth / pageWidth;
outputScale.sy = canvasHeight / pageHeight;

if (this.#scaleRoundX !== sfx[1]) {
this.div.style.setProperty("--scale-round-x", `${sfx[1]}px`);
this.#scaleRoundX = sfx[1];
}
if (this.#scaleRoundY !== sfy[1]) {
this.div.style.setProperty("--scale-round-y", `${sfy[1]}px`);
this.#scaleRoundY = sfy[1];
}

// Add the viewport so it's known what it was originally drawn with.
this.#viewportMap.set(canvas, viewport);
Expand Down
5 changes: 5 additions & 0 deletions web/pdf_viewer.css
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@
canvas {
margin: 0;
display: block;
width: 100%;
height: 100%;

&[hidden] {
display: none;
Expand All @@ -101,6 +103,9 @@
}

.pdfViewer .page {
--scale-round-x: 1px;
--scale-round-y: 1px;

direction: ltr;
width: 816px;
height: 1056px;
Expand Down
13 changes: 13 additions & 0 deletions web/ui_utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -862,6 +862,18 @@ function toggleExpandedBtn(button, toggle, view = null) {
view?.classList.toggle("hidden", !toggle);
}

// In Firefox, the css calc function uses f32 precision but the Chrome or Safari
// are using f64 one. So in order to have the same rendering in all browsers, we
// need to use the right precision in order to have correct dimensions.
const calcRound = (function () {
if (typeof document === "undefined") {
return x => x;
}
const e = document.createElement("div");
e.style.width = "round(down, calc(1.6666666666666665 * 792px), 1px)";
return e.style.width === "calc(1320px)" ? Math.fround : x => x;
})();

export {
animationStarted,
apiPageLayoutToViewerModes,
Expand All @@ -870,6 +882,7 @@ export {
AutoPrintRegExp,
backtrackBeforeAllVisibleElements, // only exported for testing
binarySearchFirstItem,
calcRound,
CursorTool,
DEFAULT_SCALE,
DEFAULT_SCALE_DELTA,
Expand Down

0 comments on commit 0c5a919

Please sign in to comment.