From 8858a54b5ddb3a2d8a42ecb1a837c02800bc934f Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Mon, 2 Mar 2026 17:38:55 -0500 Subject: create lay/strain package The lay/strain package uses the Cassowary algorithm to solve systems of layout constraints. --- lay/strain/sym.go | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 lay/strain/sym.go (limited to 'lay/strain/sym.go') diff --git a/lay/strain/sym.go b/lay/strain/sym.go new file mode 100644 index 0000000..cf8777b --- /dev/null +++ b/lay/strain/sym.go @@ -0,0 +1,70 @@ +package strain + +import ( + "image" + + "github.com/lithdew/casso" +) + +// SymPt is a set of Cassowary symbols representing an image.Point. +type SymPt struct { + X, Y casso.Symbol +} + +// SymRect is a set of Cassowary symbols representing an +// image.Rectangle. +type SymRect struct { + Min, Max SymPt +} + +func NewSymPt() SymPt { + return SymPt{casso.New(), casso.New()} +} + +func NewSymRect() SymRect { + return SymRect{NewSymPt(), NewSymPt()} +} + +// editRect marks all symbols of a rectangle as editable with a +// certain precedence. +func editRect(solver *casso.Solver, sr SymRect, p casso.Priority) error { + if err := editPt(solver, sr.Min, p); err != nil { + return err + } + if err := editPt(solver, sr.Max, p); err != nil { + return err + } + return nil +} + +// editRect marks both symbols of a point as editable with a certain +// precedence. +func editPt(solver *casso.Solver, sp SymPt, p casso.Priority) error { + if err := solver.Edit(sp.X, p); err != nil { + return err + } + if err := solver.Edit(sp.Y, p); err != nil { + return err + } + return nil +} + +func suggestRect(solver *casso.Solver, sr SymRect, r image.Rectangle) error { + if err := suggestPt(solver, sr.Min, r.Min); err != nil { + return err + } + if err := suggestPt(solver, sr.Max, r.Max); err != nil { + return err + } + return nil +} + +func suggestPt(solver *casso.Solver, sp SymPt, p image.Point) error { + if err := solver.Suggest(sp.X, float64(p.X)); err != nil { + return err + } + if err := solver.Suggest(sp.Y, float64(p.Y)); err != nil { + return err + } + return nil +} -- cgit v1.2.3