summaryrefslogtreecommitdiff
path: root/src/layout
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2021-03-19 13:20:58 +0100
committerLaurenz <laurmaedje@gmail.com>2021-03-19 13:20:58 +0100
commit54a9ccb1a5e9f1f1e5d2538d2f4ce3d4f7afc4ae (patch)
tree3a0f45af5d1cd6d65420887f8412a5594b6300bd /src/layout
parentbd12d135cab32d61b32945433e77579d04298d52 (diff)
Configurable font edges ⚙
Adds top-edge and bottom-edge parameters to the font function. These define how the box around a word is computed. The possible values are: - ascender - cap-height (default top edge) - x-height - baseline (default bottom edge) - descender The defaults are chosen so that it's easy to create good-looking designs with vertical alignment. Since they are much tighter than what most other software uses by default, the default leading had to be increased to 50% of the font size and paragraph spacing to 100% of the font size. The values cap-height and x-height fall back to ascender in case they are zero because this value may occur in fonts that don't have glyphs with cap- or x-height (like Twitter Color Emoji). Since cap-height is the default top edge, doing no fallback would break things badly. Removes softness in favor of a simple boolean for pages and a more finegread u8 for spacing. This is needed to make paragraph spacing consume line spacing created by hard line breaks.
Diffstat (limited to 'src/layout')
-rw-r--r--src/layout/spacing.rs18
-rw-r--r--src/layout/text.rs22
2 files changed, 20 insertions, 20 deletions
diff --git a/src/layout/spacing.rs b/src/layout/spacing.rs
index 4b564a2b..2bcb7ac1 100644
--- a/src/layout/spacing.rs
+++ b/src/layout/spacing.rs
@@ -1,7 +1,6 @@
use std::fmt::{self, Debug, Formatter};
use super::*;
-use crate::exec::Softness;
/// A spacing node.
#[derive(Copy, Clone, PartialEq)]
@@ -10,13 +9,11 @@ pub struct NodeSpacing {
pub amount: Length,
/// Defines how spacing interacts with surrounding spacing.
///
- /// Hard spacing assures that a fixed amount of spacing will always be
- /// inserted. Soft spacing will be consumed by previous soft spacing or
- /// neighbouring hard spacing and can be used to insert overridable spacing,
- /// e.g. between words or paragraphs.
- ///
- /// This field is only used in evaluation, not in layouting.
- pub softness: Softness,
+ /// Hard spacing (`softness = 0`) assures that a fixed amount of spacing
+ /// will always be inserted. Soft spacing (`softness >= 1`) will be consumed
+ /// by other spacing with lower softness and can be used to insert
+ /// overridable spacing, e.g. between words or paragraphs.
+ pub softness: u8,
}
impl Layout for NodeSpacing {
@@ -27,10 +24,7 @@ impl Layout for NodeSpacing {
impl Debug for NodeSpacing {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
- match self.softness {
- Softness::Soft => write!(f, "Soft({})", self.amount),
- Softness::Hard => write!(f, "Hard({})", self.amount),
- }
+ write!(f, "Spacing({}, {})", self.amount, self.softness)
}
}
diff --git a/src/layout/text.rs b/src/layout/text.rs
index 256a6e6d..7b4eb08e 100644
--- a/src/layout/text.rs
+++ b/src/layout/text.rs
@@ -4,35 +4,41 @@ use std::rc::Rc;
use fontdock::{FallbackTree, FontVariant};
use super::*;
-use crate::shaping;
+use crate::shaping::{shape, VerticalFontMetric};
/// A text node.
#[derive(Clone, PartialEq)]
pub struct NodeText {
+ /// The text.
+ pub text: String,
/// The text direction.
pub dir: Dir,
/// How to align this text node in its parent.
pub aligns: LayoutAligns,
- /// The text.
- pub text: String,
- /// The font size.
- pub font_size: Length,
/// The families used for font fallback.
pub families: Rc<FallbackTree>,
/// The font variant,
pub variant: FontVariant,
+ /// The font size.
+ pub font_size: Length,
+ /// The top end of the text bounding box.
+ pub top_edge: VerticalFontMetric,
+ /// The bottom end of the text bounding box.
+ pub bottom_edge: VerticalFontMetric,
}
impl Layout for NodeText {
fn layout(&self, ctx: &mut LayoutContext, _: &Areas) -> Layouted {
Layouted::Frame(
- shaping::shape(
+ shape(
&self.text,
self.dir,
- self.font_size,
- &mut ctx.env.fonts,
&self.families,
self.variant,
+ self.font_size,
+ self.top_edge,
+ self.bottom_edge,
+ &mut ctx.env.fonts,
),
self.aligns,
)