summaryrefslogtreecommitdiff
path: root/src/library/graphics
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2022-09-20 19:49:47 +0200
committerLaurenz <laurmaedje@gmail.com>2022-09-20 19:49:47 +0200
commit3760748fddd3b793c79c370398a9d4a3fc5afc04 (patch)
treeb1a615e510aa231cfe9757a9c0a35a375e32e3ba /src/library/graphics
parent757a701c1aa2a6fb80033c7e75666661818da6f9 (diff)
Refactor error handling
Diffstat (limited to 'src/library/graphics')
-rw-r--r--src/library/graphics/hide.rs4
-rw-r--r--src/library/graphics/image.rs21
-rw-r--r--src/library/graphics/line.rs4
-rw-r--r--src/library/graphics/shape.rs4
-rw-r--r--src/library/graphics/transform.rs8
5 files changed, 22 insertions, 19 deletions
diff --git a/src/library/graphics/hide.rs b/src/library/graphics/hide.rs
index f2a423ce..505dd1f6 100644
--- a/src/library/graphics/hide.rs
+++ b/src/library/graphics/hide.rs
@@ -6,7 +6,7 @@ pub struct HideNode(pub LayoutNode);
#[node]
impl HideNode {
- fn construct(_: &mut Vm, args: &mut Args) -> TypResult<Content> {
+ fn construct(_: &mut Vm, args: &mut Args) -> SourceResult<Content> {
Ok(Content::inline(Self(args.expect("body")?)))
}
}
@@ -17,7 +17,7 @@ impl Layout for HideNode {
world: &dyn World,
regions: &Regions,
styles: StyleChain,
- ) -> TypResult<Vec<Frame>> {
+ ) -> SourceResult<Vec<Frame>> {
let mut frames = self.0.layout(world, regions, styles)?;
for frame in &mut frames {
frame.clear();
diff --git a/src/library/graphics/image.rs b/src/library/graphics/image.rs
index 1642c7b0..c0249b3c 100644
--- a/src/library/graphics/image.rs
+++ b/src/library/graphics/image.rs
@@ -1,6 +1,6 @@
use std::ffi::OsStr;
-use crate::image::Image;
+use crate::image::{Image, ImageFormat, RasterFormat, VectorFormat};
use crate::library::prelude::*;
use crate::library::text::TextNode;
@@ -13,19 +13,22 @@ impl ImageNode {
/// How the image should adjust itself to a given area.
pub const FIT: ImageFit = ImageFit::Cover;
- fn construct(vm: &mut Vm, args: &mut Args) -> TypResult<Content> {
+ fn construct(vm: &mut Vm, args: &mut Args) -> SourceResult<Content> {
let Spanned { v: path, span } =
args.expect::<Spanned<EcoString>>("path to image file")?;
let full = vm.locate(&path).at(span)?;
+ let buffer = vm.world.file(&full).at(span)?;
let ext = full.extension().and_then(OsStr::to_str).unwrap_or_default();
- let image = vm
- .world
- .file(&full)
- .and_then(|buffer| Image::new(buffer, ext))
- .map_err(|err| failed_to_load("image", &full, err))
- .at(span)?;
+ let format = match ext.to_lowercase().as_str() {
+ "png" => ImageFormat::Raster(RasterFormat::Png),
+ "jpg" | "jpeg" => ImageFormat::Raster(RasterFormat::Jpg),
+ "gif" => ImageFormat::Raster(RasterFormat::Gif),
+ "svg" | "svgz" => ImageFormat::Vector(VectorFormat::Svg),
+ _ => bail!(span, "unknown image format"),
+ };
+ let image = Image::new(buffer, format).at(span)?;
let width = args.named("width")?;
let height = args.named("height")?;
@@ -41,7 +44,7 @@ impl Layout for ImageNode {
_: &dyn World,
regions: &Regions,
styles: StyleChain,
- ) -> TypResult<Vec<Frame>> {
+ ) -> SourceResult<Vec<Frame>> {
let pxw = self.0.width() as f64;
let pxh = self.0.height() as f64;
let px_ratio = pxw / pxh;
diff --git a/src/library/graphics/line.rs b/src/library/graphics/line.rs
index 95c3a709..ebfec1b2 100644
--- a/src/library/graphics/line.rs
+++ b/src/library/graphics/line.rs
@@ -15,7 +15,7 @@ impl LineNode {
#[property(resolve, fold)]
pub const STROKE: RawStroke = RawStroke::default();
- fn construct(_: &mut Vm, args: &mut Args) -> TypResult<Content> {
+ fn construct(_: &mut Vm, args: &mut Args) -> SourceResult<Content> {
let origin = args.named("origin")?.unwrap_or_default();
let delta = match args.named::<Spec<Relative<RawLength>>>("to")? {
@@ -43,7 +43,7 @@ impl Layout for LineNode {
_: &dyn World,
regions: &Regions,
styles: StyleChain,
- ) -> TypResult<Vec<Frame>> {
+ ) -> SourceResult<Vec<Frame>> {
let stroke = styles.get(Self::STROKE).unwrap_or_default();
let origin = self
diff --git a/src/library/graphics/shape.rs b/src/library/graphics/shape.rs
index ee5e43e8..d9162557 100644
--- a/src/library/graphics/shape.rs
+++ b/src/library/graphics/shape.rs
@@ -39,7 +39,7 @@ impl<const S: ShapeKind> ShapeNode<S> {
pub const RADIUS: Corners<Option<Relative<RawLength>>> =
Corners::splat(Relative::zero());
- fn construct(_: &mut Vm, args: &mut Args) -> TypResult<Content> {
+ fn construct(_: &mut Vm, args: &mut Args) -> SourceResult<Content> {
let size = match S {
SQUARE => args.named::<RawLength>("size")?.map(Relative::from),
CIRCLE => args.named::<RawLength>("radius")?.map(|r| 2.0 * Relative::from(r)),
@@ -81,7 +81,7 @@ impl<const S: ShapeKind> Layout for ShapeNode<S> {
world: &dyn World,
regions: &Regions,
styles: StyleChain,
- ) -> TypResult<Vec<Frame>> {
+ ) -> SourceResult<Vec<Frame>> {
let mut frames;
if let Some(child) = &self.0 {
let mut inset = styles.get(Self::INSET);
diff --git a/src/library/graphics/transform.rs b/src/library/graphics/transform.rs
index 0a4f5b5f..34d45bd0 100644
--- a/src/library/graphics/transform.rs
+++ b/src/library/graphics/transform.rs
@@ -12,7 +12,7 @@ pub struct MoveNode {
#[node]
impl MoveNode {
- fn construct(_: &mut Vm, args: &mut Args) -> TypResult<Content> {
+ fn construct(_: &mut Vm, args: &mut Args) -> SourceResult<Content> {
let dx = args.named("dx")?.unwrap_or_default();
let dy = args.named("dy")?.unwrap_or_default();
Ok(Content::inline(Self {
@@ -28,7 +28,7 @@ impl Layout for MoveNode {
world: &dyn World,
regions: &Regions,
styles: StyleChain,
- ) -> TypResult<Vec<Frame>> {
+ ) -> SourceResult<Vec<Frame>> {
let mut frames = self.child.layout(world, regions, styles)?;
let delta = self.delta.resolve(styles);
@@ -62,7 +62,7 @@ impl<const T: TransformKind> TransformNode<T> {
#[property(resolve)]
pub const ORIGIN: Spec<Option<RawAlign>> = Spec::default();
- fn construct(_: &mut Vm, args: &mut Args) -> TypResult<Content> {
+ fn construct(_: &mut Vm, args: &mut Args) -> SourceResult<Content> {
let transform = match T {
ROTATE => {
let angle = args.named_or_find("angle")?.unwrap_or_default();
@@ -89,7 +89,7 @@ impl<const T: TransformKind> Layout for TransformNode<T> {
world: &dyn World,
regions: &Regions,
styles: StyleChain,
- ) -> TypResult<Vec<Frame>> {
+ ) -> SourceResult<Vec<Frame>> {
let origin = styles.get(Self::ORIGIN).unwrap_or(Align::CENTER_HORIZON);
let mut frames = self.child.layout(world, regions, styles)?;