mirror of
https://github.com/typst/typst
synced 2025-05-22 13:05:29 +08:00
Merge text and shape PDF loops 🎡
This commit is contained in:
parent
6bd1a494e0
commit
bd12d135ca
@ -129,6 +129,11 @@ impl<'a> PdfExporter<'a> {
|
|||||||
fn write_page(&mut self, id: Ref, page: &'a Frame) {
|
fn write_page(&mut self, id: Ref, page: &'a Frame) {
|
||||||
let mut content = Content::new();
|
let mut content = Content::new();
|
||||||
|
|
||||||
|
// We only write font switching actions when the used face changes. To
|
||||||
|
// do that, we need to remember the active face.
|
||||||
|
let mut face = FaceId::MAX;
|
||||||
|
let mut size = Length::ZERO;
|
||||||
|
|
||||||
for (pos, element) in &page.elements {
|
for (pos, element) in &page.elements {
|
||||||
let x = pos.x.to_pt() as f32;
|
let x = pos.x.to_pt() as f32;
|
||||||
match element {
|
match element {
|
||||||
@ -173,36 +178,25 @@ impl<'a> PdfExporter<'a> {
|
|||||||
content.restore_state();
|
content.restore_state();
|
||||||
}
|
}
|
||||||
|
|
||||||
_ => {}
|
Element::Text(shaped) => {
|
||||||
}
|
let mut text = content.text();
|
||||||
}
|
// Check if we need to issue a font switching action.
|
||||||
|
if shaped.face != face || shaped.font_size != size {
|
||||||
|
face = shaped.face;
|
||||||
|
size = shaped.font_size;
|
||||||
|
|
||||||
// We only write font switching actions when the used face changes. To
|
let name = format!("F{}", self.fonts.map(shaped.face));
|
||||||
// do that, we need to remember the active face.
|
text.font(Name(name.as_bytes()), size.to_pt() as f32);
|
||||||
let mut face = FaceId::MAX;
|
}
|
||||||
let mut size = Length::ZERO;
|
|
||||||
|
|
||||||
let mut text = content.text();
|
let x = pos.x.to_pt() as f32;
|
||||||
for (pos, element) in &page.elements {
|
let y = (page.size.height - pos.y).to_pt() as f32;
|
||||||
if let Element::Text(shaped) = element {
|
text.matrix(1.0, 0.0, 0.0, 1.0, x, y);
|
||||||
// Check if we need to issue a font switching action.
|
text.show(&shaped.encode_glyphs_be());
|
||||||
if shaped.face != face || shaped.font_size != size {
|
|
||||||
face = shaped.face;
|
|
||||||
size = shaped.font_size;
|
|
||||||
|
|
||||||
let name = format!("F{}", self.fonts.map(shaped.face));
|
|
||||||
text.font(Name(name.as_bytes()), size.to_pt() as f32);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let x = pos.x.to_pt() as f32;
|
|
||||||
let y = (page.size.height - pos.y).to_pt() as f32;
|
|
||||||
text.matrix(1.0, 0.0, 0.0, 1.0, x, y);
|
|
||||||
text.show(&shaped.encode_glyphs_be());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
drop(text);
|
|
||||||
|
|
||||||
self.writer.stream(id, &content.finish());
|
self.writer.stream(id, &content.finish());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user