-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbbox.go
More file actions
88 lines (78 loc) · 1.39 KB
/
bbox.go
File metadata and controls
88 lines (78 loc) · 1.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package gocropy
import (
"fmt"
"strconv"
"unicode"
)
type Bbox struct {
Left, Top, Right, Bottom int
}
func min(a, b int) int {
if a < b {
return a
} else {
return b
}
}
func max(a, b int) int {
if a > b {
return a
} else {
return b
}
}
func (bbox *Bbox) Add(other Bbox) {
bbox.Left = min(bbox.Left, other.Left)
bbox.Top = min(bbox.Top, other.Top)
bbox.Right = max(bbox.Right, other.Right)
bbox.Bottom = max(bbox.Bottom, other.Bottom)
}
func (bbox *Bbox) AddSlice(bboxes []Bbox) {
for _, b := range bboxes {
bbox.Add(b)
}
}
func (bbox *Bbox) Sanitize(page Bbox) {
h := page.Bottom
bbox.Top = h - bbox.Bottom - 1
bbox.Bottom = h - bbox.Top - 1
}
func (bbox Bbox) String() string {
return fmt.Sprintf(
"%v %v %v %v",
bbox.Left,
bbox.Top,
bbox.Right,
bbox.Bottom,
)
}
func (bbox *Bbox) Scan(state fmt.ScanState, verb rune) error {
var err error
bbox.Left, err = scanInt(state)
if err != nil {
return err
}
bbox.Top, err = scanInt(state)
if err != nil {
return err
}
bbox.Right, err = scanInt(state)
if err != nil {
return err
}
bbox.Bottom, err = scanInt(state)
if err != nil {
return err
}
return nil
}
func scanInt(state fmt.ScanState) (int, error) {
token, err := state.Token(true, func(r rune) bool {
return unicode.IsDigit(r)
})
if err != nil {
return 0, err
}
res, err := strconv.ParseInt(string(token), 0, 64)
return int(res), err
}