mirror of
https://github.com/typst/typst
synced 2025-05-14 17:15:28 +08:00
refactor: avoid storing font size in frame modifiers
This commit is contained in:
parent
0b3df7548e
commit
75841408e7
@ -20,7 +20,7 @@ use unicode_bidi::{BidiInfo, Level as BidiLevel};
|
|||||||
use unicode_script::{Script, UnicodeScript};
|
use unicode_script::{Script, UnicodeScript};
|
||||||
|
|
||||||
use super::{decorate, Item, Range, SpanMapper};
|
use super::{decorate, Item, Range, SpanMapper};
|
||||||
use crate::modifiers::{FrameModifiers, FrameModify};
|
use crate::modifiers::FrameModifyText;
|
||||||
|
|
||||||
/// The result of shaping text.
|
/// The result of shaping text.
|
||||||
///
|
///
|
||||||
@ -327,7 +327,7 @@ impl<'a> ShapedText<'a> {
|
|||||||
offset += width;
|
offset += width;
|
||||||
}
|
}
|
||||||
|
|
||||||
frame.modify(&FrameModifiers::for_text_in(self.styles));
|
frame.modify_text(self.styles);
|
||||||
frame
|
frame
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
use typst_library::foundations::{Resolve, StyleChain};
|
use typst_library::foundations::{Resolve, StyleChain};
|
||||||
use typst_library::layout::{Abs, Em, Fragment, Frame, FrameItem, HideElem, Point};
|
use typst_library::layout::{
|
||||||
|
Abs, Em, Fragment, Frame, FrameItem, HideElem, Point, Sides,
|
||||||
|
};
|
||||||
use typst_library::model::{Destination, LinkElem};
|
use typst_library::model::{Destination, LinkElem};
|
||||||
|
|
||||||
/// Frame-level modifications resulting from styles that do not impose any
|
/// Frame-level modifications resulting from styles that do not impose any
|
||||||
@ -21,8 +23,6 @@ use typst_library::model::{Destination, LinkElem};
|
|||||||
pub struct FrameModifiers {
|
pub struct FrameModifiers {
|
||||||
/// A destination to link to.
|
/// A destination to link to.
|
||||||
dest: Option<Destination>,
|
dest: Option<Destination>,
|
||||||
/// Used to determine if the link box should be expanded.
|
|
||||||
link_kind: LinkKind,
|
|
||||||
/// Whether the contents of the frame should be hidden.
|
/// Whether the contents of the frame should be hidden.
|
||||||
hidden: bool,
|
hidden: bool,
|
||||||
}
|
}
|
||||||
@ -32,27 +32,44 @@ impl FrameModifiers {
|
|||||||
pub fn get_in(styles: StyleChain) -> Self {
|
pub fn get_in(styles: StyleChain) -> Self {
|
||||||
Self {
|
Self {
|
||||||
dest: LinkElem::current_in(styles),
|
dest: LinkElem::current_in(styles),
|
||||||
link_kind: LinkKind::default(),
|
|
||||||
hidden: HideElem::hidden_in(styles),
|
hidden: HideElem::hidden_in(styles),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn for_text_in(styles: StyleChain) -> Self {
|
|
||||||
let mut modifiers = Self::get_in(styles);
|
|
||||||
if modifiers.dest.is_some() {
|
|
||||||
let em = Em::one().resolve(styles);
|
|
||||||
modifiers.link_kind = LinkKind::Text(em);
|
|
||||||
}
|
}
|
||||||
modifiers
|
|
||||||
|
fn modify_frame(
|
||||||
|
frame: &mut Frame,
|
||||||
|
modifiers: &FrameModifiers,
|
||||||
|
link_box_outset: Option<Sides<Abs>>,
|
||||||
|
) {
|
||||||
|
if let Some(dest) = &modifiers.dest {
|
||||||
|
let mut pos = Point::zero();
|
||||||
|
let mut size = frame.size();
|
||||||
|
if let Some(outset) = link_box_outset {
|
||||||
|
pos.y -= outset.top;
|
||||||
|
pos.x -= outset.left;
|
||||||
|
size += outset.sum_by_axis();
|
||||||
|
}
|
||||||
|
frame.push(pos, FrameItem::Link(dest.clone(), size));
|
||||||
|
}
|
||||||
|
|
||||||
|
if modifiers.hidden {
|
||||||
|
frame.hide();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Default)]
|
pub trait FrameModifyText {
|
||||||
enum LinkKind {
|
/// Resolve and apply [`FrameModifiers`] for this text frame.
|
||||||
/// Contains the font size.
|
fn modify_text(&mut self, styles: StyleChain);
|
||||||
Text(Abs),
|
}
|
||||||
#[default]
|
|
||||||
Other,
|
impl FrameModifyText for Frame {
|
||||||
|
fn modify_text(&mut self, styles: StyleChain) {
|
||||||
|
let modifiers = FrameModifiers::get_in(styles);
|
||||||
|
let expand_y = Em::new(0.25).resolve(styles);
|
||||||
|
let outset = Sides::new(Abs::zero(), expand_y, Abs::zero(), expand_y);
|
||||||
|
modify_frame(self, &modifiers, Some(outset));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Applies [`FrameModifiers`].
|
/// Applies [`FrameModifiers`].
|
||||||
@ -72,21 +89,7 @@ pub trait FrameModify {
|
|||||||
|
|
||||||
impl FrameModify for Frame {
|
impl FrameModify for Frame {
|
||||||
fn modify(&mut self, modifiers: &FrameModifiers) {
|
fn modify(&mut self, modifiers: &FrameModifiers) {
|
||||||
if let Some(dest) = &modifiers.dest {
|
modify_frame(self, modifiers, None);
|
||||||
let mut pos = Point::zero();
|
|
||||||
let mut size = self.size();
|
|
||||||
if let LinkKind::Text(em) = modifiers.link_kind {
|
|
||||||
let expand_top = 0.25 * em;
|
|
||||||
let expand_bottom = 0.25 * em;
|
|
||||||
pos.y -= expand_top;
|
|
||||||
size.y += expand_top + expand_bottom;
|
|
||||||
}
|
|
||||||
self.push(pos, FrameItem::Link(dest.clone(), size));
|
|
||||||
}
|
|
||||||
|
|
||||||
if modifiers.hidden {
|
|
||||||
self.hide();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user