///|
pub(all) struct TransformMatrix {
a : Double // scale x
b : Double // shear y
c : Double // shear x
d : Double // scale y
e : Double // translate x
f : Double // translate y
}| a b 0 |
| c d 0 |
| e f 1 |///|
test "identity matrix" {
let m = @pdftransform.TransformMatrix::identity()
inspect(m.a, content="1")
inspect(m.d, content="1")
inspect(m.e, content="0")
}///|
test "translate" {
let m = @pdftransform.TransformMatrix::translate(10.0, 20.0)
inspect(m.e, content="10")
inspect(m.f, content="20")
}// Scale by (sx, sy) around center point
///|
let m = @pdftransform.TransformMatrix::scale((0.0, 0.0), 2.0, 2.0)// Rotate by angle (radians) around center point
///|
let m = @pdftransform.TransformMatrix::rotate((0.0, 0.0), 1.5708) // 90 degrees// Horizontal shear
///|
let m = @pdftransform.TransformMatrix::shear_x((0.0, 0.0), 0.5)
// Vertical shear
///|
let m = @pdftransform.TransformMatrix::shear_y((0.0, 0.0), 0.5)///|
pub(all) enum TransformOp {
Scale((Double, Double), Double, Double) // center, sx, sy
Rotate((Double, Double), Double) // center, angle
Translate(Double, Double) // tx, ty
ShearX((Double, Double), Double) // center, factor
ShearY((Double, Double), Double) // center, factor
}// Build transform from operations
///|
let tr = @pdftransform.Transform::identity().compose(
@pdftransform.TransformOp::Translate(100.0, 100.0),
)///|
let combined = tr1.append(tr2)///|
test "matrix compose" {
let t1 = @pdftransform.TransformMatrix::translate(10.0, 0.0)
let t2 = @pdftransform.TransformMatrix::translate(0.0, 20.0)
let combined = t1.compose(t2)
inspect(combined.e, content="10")
inspect(combined.f, content="20")
}try {
let inv = m.invert!()
// Use inverted matrix...
} catch {
@pdftransform.NonInvertable => println("Matrix not invertible")
}///|
let op = @pdftransform.TransformOp::Translate(50.0, 50.0)
///|
let matrix = op.to_matrix()///|
test "matrix applies to point" {
let m = @pdftransform.TransformMatrix::translate(10.0, 20.0)
let (x, y) = m.apply((5.0, 5.0))
inspect(x, content="15")
inspect(y, content="25")
}let (new_x, new_y) = tr.apply((x, y))let (scale, aspect, rotation, shear, tx, ty) = m.decompose()///|
let m = @pdftransform.TransformMatrix::recompose(
scale, aspect, rotation, shear, tx, ty,
)///|
test "matrix to_string" {
let m = @pdftransform.TransformMatrix::identity()
let s = m.to_string()
assert_true(s.contains("1"))
}pub suberror NonInvertable {
NonInvertable
}pub(all) struct TransformMatrix {
a : Double
b : Double
c : Double
d : Double
e : Double
f : Double
}impl Debug for TransformMatrixfn TransformMatrix::decompose(self : TransformMatrix) -> (Double, Double, Double, Double, Double, Double)fn TransformMatrix::recompose(scale : Double, aspect : Double, rotation : Double, shear : Double, tx : Double, ty : Double) -> TransformMatrixpub(all) enum TransformOp {
Scale((Double, Double), Double, Double)
Rotate((Double, Double), Double)
Translate(Double, Double)
ShearX((Double, Double), Double)
ShearY((Double, Double), Double)
}impl Debug for TransformOpDependencies