Skip to content
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

Refactor PDF export #4154

Merged
merged 83 commits into from
May 29, 2024
Merged

Refactor PDF export #4154

merged 83 commits into from
May 29, 2024

Conversation

elegaanz
Copy link
Contributor

@elegaanz elegaanz commented May 16, 2024

The PDF exporter now uses a type state to ensure that it is impossible to access context that is not yet available. It also makes extensive use of the pdf_writer::Chunk::rewrite_into API to have each step being more independent, and thus potentially easier to memoize.

The actual behavior of the crate didn't change a lot, everything is just less entangled and hopefully easier to reason about.

TODO:

  • adapt Add parameter to select pages to be exported by CLI #4039 for this branch. I will wait for a first round of reviews to be ready before doing that, so that I can be sure of the design that will be adopted in the end and work from that.
  • lots of testing, because quite a lot of things have been moved around, and some parts may not work anymore even if what gets written is not supposed to have changed. The test suite passes, but it mostly catches that there are no duplicate object references, I can't really tell if the PDF is valid or not besides that. I've also run qpdf --check on all files generated by the test runner, and no errors were reported.

elegaanz added 30 commits May 6, 2024 16:55
This won't work, because most ID inserted in the
global context are in fact local, and should be
remapped.
Each "write" pass now return the sub-state it
produced instead of mutating a global state.
This may break emojis
TODO: check that it doesn't
Also move some more stuff to the catalog module
Not sure that this is a good idea, but it sort
of makes the design simpler.
Remove parallelism. The previous implementation
was not actually parallel anyways. The only thing
that seems to take time during PDF export is image
encoding, which is already correctly parallelized.
Also move Resources to the dedicated module.
@LaurenzV
Copy link
Sponsor Collaborator

I ran the test suite through my script that renders a PDF using different viewers, and I noticed that the following file doesn't seem to render correctly anymore:

// Test the different radial gradient features.
---

#square(
  size: 100pt,
  fill: gradient.radial(..color.map.rainbow, space: color.hsl),
)
---

#grid(
  columns: 2,
  square(
    size: 50pt,
    fill: gradient.radial(..color.map.rainbow, space: color.hsl, center: (0%, 0%)),
  ),
  square(
    size: 50pt,
    fill: gradient.radial(..color.map.rainbow, space: color.hsl, center: (0%, 100%)),
  ),
  square(
    size: 50pt,
    fill: gradient.radial(..color.map.rainbow, space: color.hsl, center: (100%, 0%)),
  ),
  square(
    size: 50pt,
    fill: gradient.radial(..color.map.rainbow, space: color.hsl, center: (100%, 100%)),
  ),
)

---

#square(
  size: 50pt,
  fill: gradient.radial(..color.map.rainbow, space: color.hsl, radius: 10%),
)
#square(
  size: 50pt,
  fill: gradient.radial(..color.map.rainbow, space: color.hsl, radius: 72%),
)

---
#circle(
  radius: 25pt,
  fill: gradient.radial(white, rgb("#8fbc8f"), focal-center: (35%, 35%), focal-radius: 5%),
)
#circle(
  radius: 25pt,
  fill: gradient.radial(white, rgb("#8fbc8f"), focal-center: (75%, 35%), focal-radius: 5%),
)

Before:
image

After:
image

Other than that everything else seemed fine, although I admittedly only skimmed it. :)

@elegaanz
Copy link
Contributor Author

Thanks, I'll see if I can reproduce and fix. And I will definitely do some more in depth testing before merging.

@laurmaedje laurmaedje added this pull request to the merge queue May 29, 2024
Merged via the queue into main with commit 2946cde May 29, 2024
12 checks passed
@elegaanz elegaanz deleted the refactor-pdf-export branch May 29, 2024 13:16
PgBiel added a commit to tulio240/typst that referenced this pull request May 30, 2024
Refactor frame metadata into tags (typst#4212)


Require `Send` and `Sync` for worlds (typst#4219)


Optimize counters and state (typst#4223)


Add `windows` method to array (typst#4136)

Improve `CITATION.cff` file (typst#4201)


Fix equation resizing when adding the equation number (typst#4179)


`layout` documentation improvements (typst#4196)

Allow somewhat arbitrary characters as `mat`, `vec` and `cases` `delim` (typst#4211)


Do layout short-circuit in flow instead of realization (typst#4231)


Split `BitSet` into two types and make it a bit nicer (typst#4249)


Set default value of `raw.theme` to `auto`, and allow setting `raw.theme` to `auto` (typst#4186)


Extended cargo installation instructions (typst#4168)

Hint for language-region pair on `text.lang` (typst#4183)


Improve macro docs (+ Native*Data docs) (typst#4240)


Rephrase the sentence on variable scope in Scripting documentation (typst#4250)


Refactor `Capable::vtable` to return `Option<NonNull<()>>` (typst#4252)


Nicer test helper CSS (typst#4269)


Trim weak spacing at line start/end in paragraph layout (typst#4087)


Add ability to choose between minified and pretty-printed JSON (typst#4161)


Refactor PDF export (typst#4154)

Reorder syntax kinds (typst#4287)


Fix figure centering (typst#4276)

Fix `Default` impls for AST nodes (typst#4288)


Bump libc to v0.2.155 (typst#4268)


Bump time dependency (typst#4294)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants