summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2020-10-03 15:07:57 +0200
committerLaurenz <laurmaedje@gmail.com>2020-10-03 15:07:57 +0200
commit95bae5725cf6495644e2593f8492f1cd0e5bd3c1 (patch)
tree919dd90cac7623bcbbc09d9c92399eaa65e537f2 /src/library
parent0fc25d732d7cbc37cf801645849d1060f2cec4a3 (diff)
Int, Float, Relative and Linear values 🍉
Diffstat (limited to 'src/library')
-rw-r--r--src/library/boxed.rs18
-rw-r--r--src/library/color.rs24
-rw-r--r--src/library/font.rs15
-rw-r--r--src/library/page.rs22
-rw-r--r--src/library/spacing.rs6
5 files changed, 41 insertions, 44 deletions
diff --git a/src/library/boxed.rs b/src/library/boxed.rs
index ac0bc19e..b36a151b 100644
--- a/src/library/boxed.rs
+++ b/src/library/boxed.rs
@@ -1,5 +1,5 @@
use super::*;
-use crate::length::ScaleLength;
+use crate::geom::Linear;
/// `box`: Layouts its contents into a box.
///
@@ -19,17 +19,17 @@ pub async fn boxed(
ctx.spaces.truncate(1);
ctx.repeat = false;
- if let Some(width) = args.take_key::<ScaleLength>("width", &mut f) {
- let length = width.raw_scaled(ctx.base.width);
- ctx.base.width = length;
- ctx.spaces[0].size.width = length;
+ if let Some(width) = args.take_key::<Linear>("width", &mut f) {
+ let abs = width.eval(ctx.base.width);
+ ctx.base.width = abs;
+ ctx.spaces[0].size.width = abs;
ctx.spaces[0].expansion.horizontal = true;
}
- if let Some(height) = args.take_key::<ScaleLength>("height", &mut f) {
- let length = height.raw_scaled(ctx.base.height);
- ctx.base.height = length;
- ctx.spaces[0].size.height = length;
+ if let Some(height) = args.take_key::<Linear>("height", &mut f) {
+ let abs = height.eval(ctx.base.height);
+ ctx.base.height = abs;
+ ctx.spaces[0].size.height = abs;
ctx.spaces[0].expansion.vertical = true;
}
diff --git a/src/library/color.rs b/src/library/color.rs
index 43d9253f..a11966ea 100644
--- a/src/library/color.rs
+++ b/src/library/color.rs
@@ -5,20 +5,18 @@ use crate::color::RgbaColor;
pub async fn rgb(span: Span, mut args: DictValue, _: LayoutContext<'_>) -> Pass<Value> {
let mut f = Feedback::new();
- let r = args.expect::<Spanned<f64>>("red value", span, &mut f);
- let g = args.expect::<Spanned<f64>>("green value", span, &mut f);
- let b = args.expect::<Spanned<f64>>("blue value", span, &mut f);
- let a = args.take::<Spanned<f64>>();
+ let r = args.expect::<Spanned<i64>>("red value", span, &mut f);
+ let g = args.expect::<Spanned<i64>>("green value", span, &mut f);
+ let b = args.expect::<Spanned<i64>>("blue value", span, &mut f);
+ let a = args.take::<Spanned<i64>>();
- let mut clamp = |component: Option<Spanned<f64>>, default| {
- component
- .map(|c| {
- if c.v < 0.0 || c.v > 255.0 {
- error!(@f, c.span, "should be between 0 and 255")
- }
- c.v.min(255.0).max(0.0).round() as u8
- })
- .unwrap_or(default)
+ let mut clamp = |component: Option<Spanned<i64>>, default| {
+ component.map_or(default, |c| {
+ if c.v < 0 || c.v > 255 {
+ error!(@f, c.span, "should be between 0 and 255")
+ }
+ c.v.max(0).min(255) as u8
+ })
};
let color = RgbaColor::new(clamp(r, 0), clamp(g, 0), clamp(b, 0), clamp(a, 255));
diff --git a/src/library/font.rs b/src/library/font.rs
index 1d58c4ce..e12bda2f 100644
--- a/src/library/font.rs
+++ b/src/library/font.rs
@@ -2,7 +2,7 @@ use fontdock::{FontStretch, FontStyle, FontWeight};
use super::*;
use crate::eval::StringLike;
-use crate::length::ScaleLength;
+use crate::geom::Linear;
/// `font`: Configure the font.
///
@@ -56,13 +56,12 @@ pub async fn font(_: Span, mut args: DictValue, ctx: LayoutContext<'_>) -> Pass<
let content = args.take::<SynTree>();
- if let Some(s) = args.take::<ScaleLength>() {
- match s {
- ScaleLength::Absolute(length) => {
- text.base_font_size = length.as_raw();
- text.font_scale = 1.0;
- }
- ScaleLength::Scaled(scale) => text.font_scale = scale,
+ if let Some(linear) = args.take::<Linear>() {
+ if linear.rel == 0.0 {
+ text.font_size.base = linear.abs;
+ text.font_size.scale = Linear::rel(1.0);
+ } else {
+ text.font_size.scale = linear;
}
}
diff --git a/src/library/page.rs b/src/library/page.rs
index 8188bb67..77eb6244 100644
--- a/src/library/page.rs
+++ b/src/library/page.rs
@@ -1,8 +1,8 @@
use std::mem;
use super::*;
-use crate::geom::Sides;
-use crate::length::{Length, ScaleLength};
+use crate::eval::Abs;
+use crate::geom::{Linear, Sides};
use crate::paper::{Paper, PaperClass};
/// `page`: Configure pages.
@@ -28,33 +28,33 @@ pub async fn page(_: Span, mut args: DictValue, ctx: LayoutContext<'_>) -> Pass<
style.size = paper.size();
}
- if let Some(width) = args.take_key::<Length>("width", &mut f) {
+ if let Some(Abs(width)) = args.take_key::<Abs>("width", &mut f) {
style.class = PaperClass::Custom;
- style.size.width = width.as_raw();
+ style.size.width = width;
}
- if let Some(height) = args.take_key::<Length>("height", &mut f) {
+ if let Some(Abs(height)) = args.take_key::<Abs>("height", &mut f) {
style.class = PaperClass::Custom;
- style.size.height = height.as_raw();
+ style.size.height = height;
}
- if let Some(margins) = args.take_key::<ScaleLength>("margins", &mut f) {
+ if let Some(margins) = args.take_key::<Linear>("margins", &mut f) {
style.margins = Sides::uniform(Some(margins));
}
- if let Some(left) = args.take_key::<ScaleLength>("left", &mut f) {
+ if let Some(left) = args.take_key::<Linear>("left", &mut f) {
style.margins.left = Some(left);
}
- if let Some(top) = args.take_key::<ScaleLength>("top", &mut f) {
+ if let Some(top) = args.take_key::<Linear>("top", &mut f) {
style.margins.top = Some(top);
}
- if let Some(right) = args.take_key::<ScaleLength>("right", &mut f) {
+ if let Some(right) = args.take_key::<Linear>("right", &mut f) {
style.margins.right = Some(right);
}
- if let Some(bottom) = args.take_key::<ScaleLength>("bottom", &mut f) {
+ if let Some(bottom) = args.take_key::<Linear>("bottom", &mut f) {
style.margins.bottom = Some(bottom);
}
diff --git a/src/library/spacing.rs b/src/library/spacing.rs
index 6596717b..03f52ba4 100644
--- a/src/library/spacing.rs
+++ b/src/library/spacing.rs
@@ -1,6 +1,6 @@
use super::*;
+use crate::geom::Linear;
use crate::layout::SpacingKind;
-use crate::length::ScaleLength;
/// `h`: Add horizontal spacing.
///
@@ -26,10 +26,10 @@ fn spacing(
) -> Pass<Value> {
let mut f = Feedback::new();
- let spacing = args.expect::<ScaleLength>("spacing", name, &mut f);
+ let spacing = args.expect::<Linear>("spacing", name, &mut f);
let commands = if let Some(spacing) = spacing {
let axis = axis.to_gen(ctx.sys);
- let spacing = spacing.raw_scaled(ctx.style.text.font_size());
+ let spacing = spacing.eval(ctx.style.text.font_size());
vec![AddSpacing(spacing, SpacingKind::Hard, axis)]
} else {
vec![]