[librsvg: 21/43] Convert Matrix to CssParseError
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 21/43] Convert Matrix to CssParseError
- Date: Sat, 21 Dec 2019 02:31:15 +0000 (UTC)
commit fcea36d2dd712f71a02e862e59614e99a4373c0f
Author: Federico Mena Quintero <federico gnome org>
Date: Fri Dec 20 13:11:48 2019 -0600
Convert Matrix to CssParseError
rsvg_internals/src/gradient.rs | 2 +-
rsvg_internals/src/node.rs | 4 +--
rsvg_internals/src/pattern.rs | 2 +-
rsvg_internals/src/transform.rs | 57 +++++++++++++++++------------------------
4 files changed, 28 insertions(+), 37 deletions(-)
---
diff --git a/rsvg_internals/src/gradient.rs b/rsvg_internals/src/gradient.rs
index 97cfcef8..669a97ff 100644
--- a/rsvg_internals/src/gradient.rs
+++ b/rsvg_internals/src/gradient.rs
@@ -549,7 +549,7 @@ impl Common {
for (attr, value) in pbag.iter() {
match attr.expanded() {
expanded_name!(svg "gradientUnits") => self.units = Some(attr.parse(value)?),
- expanded_name!(svg "gradientTransform") => self.affine = Some(attr.parse(value)?),
+ expanded_name!(svg "gradientTransform") => self.affine =
Some(attr.parse_to_parse_error(value)?),
expanded_name!(svg "spreadMethod") => self.spread = Some(attr.parse(value)?),
expanded_name!(xlink "href") => {
self.fallback = Some(Fragment::parse(value).attribute(attr)?)
diff --git a/rsvg_internals/src/node.rs b/rsvg_internals/src/node.rs
index b3dd0130..feb5d5a5 100644
--- a/rsvg_internals/src/node.rs
+++ b/rsvg_internals/src/node.rs
@@ -25,7 +25,7 @@ use crate::css::Declaration;
use crate::drawing_ctx::DrawingCtx;
use crate::error::*;
use crate::filters::FilterEffect;
-use crate::parsers::Parse;
+use crate::parsers::ParseToParseError;
use crate::properties::{ComputedValues, SpecifiedValue, SpecifiedValues};
use crate::property_bag::PropertyBag;
use crate::property_defs::Overflow;
@@ -155,7 +155,7 @@ impl NodeData {
for (attr, value) in pbag.iter() {
match attr.expanded() {
expanded_name!(svg "transform") => {
- return Matrix::parse_str(value).attribute(attr).and_then(|affine| {
+ return Matrix::parse_str_to_parse_error(value).attribute(attr).and_then(|affine| {
self.transform = affine;
Ok(())
});
diff --git a/rsvg_internals/src/pattern.rs b/rsvg_internals/src/pattern.rs
index dac6f94c..d7665d67 100644
--- a/rsvg_internals/src/pattern.rs
+++ b/rsvg_internals/src/pattern.rs
@@ -129,7 +129,7 @@ impl NodeTrait for Pattern {
self.common.preserve_aspect_ratio = Some(attr.parse(value)?)
}
expanded_name!(svg "patternTransform") => {
- self.common.affine = Some(attr.parse(value)?)
+ self.common.affine = Some(attr.parse_to_parse_error(value)?)
}
expanded_name!(xlink "href") => {
self.fallback = Some(Fragment::parse(value).attribute(attr)?);
diff --git a/rsvg_internals/src/transform.rs b/rsvg_internals/src/transform.rs
index 6d67ebd5..5abd9a03 100644
--- a/rsvg_internals/src/transform.rs
+++ b/rsvg_internals/src/transform.rs
@@ -7,17 +7,21 @@ use std::f64::consts::*;
use cssparser::{self, Parser, Token};
use crate::error::*;
-use crate::parsers::{optional_comma, Parse, ParseToParseError};
+use crate::parsers::{optional_comma, ParseToParseError};
-impl Parse for cairo::Matrix {
- fn parse(parser: &mut Parser<'_, '_>) -> Result<cairo::Matrix, ValueErrorKind> {
- let matrix =
- parse_transform_list(parser).map_err(|_| ValueErrorKind::parse_error("parse error"))?;
+impl ParseToParseError for cairo::Matrix {
+ fn parse_to_parse_error<'i>(
+ parser: &mut Parser<'i, '_>,
+ ) -> Result<cairo::Matrix, CssParseError<'i>> {
+ let loc = parser.current_source_location();
- matrix
- .try_invert()
- .map(|_| matrix)
- .map_err(|_| ValueErrorKind::Value("invalid transformation matrix".to_string()))
+ let matrix = parse_transform_list(parser)?;
+
+ matrix.try_invert().map(|_| matrix).map_err(|_| {
+ loc.new_custom_error(ValueErrorKind::Value(
+ "invalid transformation matrix".to_string(),
+ ))
+ })
}
}
@@ -25,7 +29,9 @@ impl Parse for cairo::Matrix {
// Its operataion and grammar are described here:
// https://www.w3.org/TR/SVG/coords.html#TransformAttribute
-fn parse_transform_list<'i>(parser: &mut Parser<'i, '_>) -> Result<cairo::Matrix, CssParseError<'i>> {
+fn parse_transform_list<'i>(
+ parser: &mut Parser<'i, '_>,
+) -> Result<cairo::Matrix, CssParseError<'i>> {
let mut matrix = cairo::Matrix::identity();
loop {
@@ -101,7 +107,9 @@ fn parse_matrix_args<'i>(parser: &mut Parser<'i, '_>) -> Result<cairo::Matrix, C
})
}
-fn parse_translate_args<'i>(parser: &mut Parser<'i, '_>) -> Result<cairo::Matrix, CssParseError<'i>> {
+fn parse_translate_args<'i>(
+ parser: &mut Parser<'i, '_>,
+) -> Result<cairo::Matrix, CssParseError<'i>> {
parser.parse_nested_block(|p| {
let tx = f64::parse_to_parse_error(p)?;
@@ -191,8 +199,8 @@ mod tests {
use float_cmp::ApproxEq;
use std::f64;
- fn parse_transform(s: &str) -> Result<cairo::Matrix, ValueErrorKind> {
- cairo::Matrix::parse_str(s)
+ fn parse_transform(s: &str) -> Result<cairo::Matrix, CssParseError> {
+ cairo::Matrix::parse_str_to_parse_error(s)
}
fn assert_matrix_eq(a: &cairo::Matrix, b: &cairo::Matrix) {
@@ -237,26 +245,9 @@ mod tests {
#[test]
fn invalid_transform_yields_value_error() {
- match parse_transform("matrix (0 0 0 0 0 0)") {
- Err(ValueErrorKind::Value(_)) => {}
- _ => {
- panic!();
- }
- }
-
- match parse_transform("scale (0), translate (10, 10)") {
- Err(ValueErrorKind::Value(_)) => {}
- _ => {
- panic!();
- }
- }
-
- match parse_transform("scale (0), skewX (90)") {
- Err(ValueErrorKind::Value(_)) => {}
- _ => {
- panic!();
- }
- }
+ assert!(parse_transform("matrix (0 0 0 0 0 0)").is_err());
+ assert!(parse_transform("scale (0), translate (10, 10)").is_err());
+ assert!(parse_transform("scale (0), skewX (90)").is_err());
}
#[test]
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]