aboutsummaryrefslogtreecommitdiffstats
path: root/lay/strain/sym.go
diff options
context:
space:
mode:
Diffstat (limited to 'lay/strain/sym.go')
-rw-r--r--lay/strain/sym.go70
1 files changed, 70 insertions, 0 deletions
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
+}