-
Notifications
You must be signed in to change notification settings - Fork 10.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add logic to track rendering area of various PDF ops #19043
base: master
Are you sure you want to change the base?
Add logic to track rendering area of various PDF ops #19043
Conversation
2475b16
to
5a6a877
Compare
This commit is a first step towards mozilla#6419, and it can also help with first compute which ops can affect what is visible in that part of the page. This commit adds logic to track "group of ops" with their respective bounding boxes. Each group eather corresponds to a single op or to a range, and it can have dependencies earlier in the ops list that are not contiguous to the range. Consider the following example: ``` 0. setFillRGBColor 1. beginText 2. showText "Hello" 3. endText 4. constructPath [...] 5. eoFill ``` here we have two groups: the text (range 1-3) and the path (range 4-5). Each of them has a corresponding bounding box, and a dependency on the op at index 0. This tracking happens when first rendering a PDF: we wrap the canvas with a "canvas recorder" that has the same API, but with additional methods to mark the start/end of a group.
When using the pdf debugger, when hovering over a step now: - it highlights the steps in the same groups - it highlights the steps that they depend on - it highlights on the PDF itself the bounding box
Fix tracking of clip operations
Track transform dependencies
Track miter limit as stroke dependency
Actually, do not generate a bbox for clipping operations, since they render nothing on the canvas.
Use canvas width/height instead of Infinity for unknown
49c4689
to
eac70e4
Compare
master...nicolo-ribaudo:pdf.js:draw-page-portion-optimized is a branch merging this PR together with #19128. In the video below you can see that it first renders in the background a low-resolution image "the old way" taking 12 seconds, and then it renders the "detail view" on top taking only 1.4 seconds and only running one fifth of the PDF operations :) Screen.Recording.2024-12-17.at.18.10.30.mp4Still keeping this as draft because there are significant bugs (in the PDF I'm using for testing, it often skips rendering some pieces of text even if they are visible on screen, or it renders some paths with the wrong color), but it's nice to see some progress. |
I started working towards #6419. This PR introduces the logic to track where different elements of the PDF are rendered, and hooks it up to the debugger since @calixteman mentioned that it would be useful.
I'm marking this as draft because there are a few changes I need to make:
canvas.js
to receive the index as a param, rather than returning a function that takes the indexCanvasRecorder
, so that when not recording it doesn't have a performance impact.However, I'd love to receive feedback on the direction.
Commit 1:
Commit 2:
This is an example of what the debugger integration looks like (note: I couldn't figure out how to make my cursor show up in the recording 😅 I'm moving it over the steps list):
Screen.Recording.2024-11-14.at.16.35.58.mov
By default it doesn't show all the bounding boxes because on some PDFs it's too much noise, but if you click on the checkbox then it shows the boxes and you can click on a box to scroll into view the corresponding ops.