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
|
# 32-bit fixed-point number, with 6 bits of precision.
type LayoutUnit* = distinct int32
func `==`*(a, b: LayoutUnit): bool {.borrow.}
func `<`*(a, b: LayoutUnit): bool {.borrow.}
func `<=`*(a, b: LayoutUnit): bool {.borrow.}
func `+`*(a, b: LayoutUnit): LayoutUnit {.borrow.}
func `+=`*(a: var LayoutUnit, b: LayoutUnit) {.borrow.}
func `-`*(a, b: LayoutUnit): LayoutUnit {.borrow.}
func `-`*(a: LayoutUnit): LayoutUnit {.borrow.}
func `-=`*(a: var LayoutUnit, b: LayoutUnit) {.borrow.}
func `*`*(a, b: LayoutUnit): LayoutUnit {.inline.} =
LayoutUnit((int32(a) * int32(b)) shr 6)
func `*=`*(a: var LayoutUnit, b: LayoutUnit) {.inline.} =
a = a * b
func `/`*(a, b: LayoutUnit): LayoutUnit {.inline.} =
let a64 = int64(a)
let b64 = int64(b)
LayoutUnit(cast[int32](((a64 shl 12) div b64) shr 6))
func `/=`*(a: var LayoutUnit, b: LayoutUnit) {.inline.} =
a = a / b
func `div`*(a, b: LayoutUnit): LayoutUnit {.inline.} =
a / b
func toInt*(a: LayoutUnit): int =
return int32(a) shr 6
converter toLayoutUnit*(a: int32): LayoutUnit =
return LayoutUnit(a shl 6)
converter toLayoutUnit*(a: int64): LayoutUnit =
return toLayoutUnit(cast[int32](a))
converter toLayoutUnit*(a: int): LayoutUnit =
return toLayoutUnit(cast[int32](a))
converter toLayoutUnit*(a: float64): LayoutUnit =
if unlikely(a == Inf):
return LayoutUnit(high(int32))
elif unlikely(a == -Inf):
return LayoutUnit(low(int32))
return LayoutUnit(int32(a * 64))
func toFloat64*(a: LayoutUnit): float64 =
return float64(int32(a)) / 64
func `$`*(a: LayoutUnit): string =
$toFloat64(a)
func min*(a, b: LayoutUnit): LayoutUnit {.borrow.}
func max*(a, b: LayoutUnit): LayoutUnit {.borrow.}
func clamp*(x, a, b: LayoutUnit): LayoutUnit {.borrow.}
func round*(a: LayoutUnit; prec: int): LayoutUnit =
return (a div prec).toInt * prec
func ceilTo*(a: LayoutUnit; prec: int): LayoutUnit =
return (1 + ((a - 1) div prec).toInt) * prec
|