about summary refs log tree commit diff stats
path: root/src/layout/layoutunit.nim
blob: 777e58d7cd80f6980c6429599e67df263d30d699 (plain) (blame)
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