aboutsummaryrefslogtreecommitdiffstats
path: root/src/util.coffee
blob: 9ddff47bda4db78dd3012ae34527318756fc9ffe (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
# "Static" utility functions
class Util
  @pad2: (i) -> Math.floor((i + 1) / 2) * 2
  @pad4: (i) -> i - (i % 4) + 3

  @toUInt16: (b1, b2) -> (b1 << 8) | b2
  @toInt16: (b1, b2) ->
    val = @toUInt16(b1, b2)
    if val >= 0x8000 then val - 0x10000 else val

  # Round a number to a specific number of significant figures.
  @round: (num, sigFig = 2) ->
    return Math.round(num) if sigFig is 0
    mult = Math.pow(10, sigFig)
    Math.round(num * mult) / mult

  # Clamp a number between a maximum and minimum value.
  @clamp: (num, min = Number.MIN_VALUE, max = Number.MAX_VALUE) ->
    if typeof num is "object" and num.length?
      num[i] = Math.max(Math.min(val, max), min) for val, i in num
    else if typeof num is "object"
      num[i] = Math.max( Math.min(val, max), min ) for own i, val of num
    else
      num = Math.max(Math.min(num, max), min)

    num

  # Contributed by https://github.com/jrus
  @decodeMacroman = do ->
    high_chars_unicode = '''
      \u00c4\u00c5\u00c7\u00c9\u00d1\u00d6\u00dc\u00e1
      \u00e0\u00e2\u00e4\u00e3\u00e5\u00e7\u00e9\u00e8
      \u00ea\u00eb\u00ed\u00ec\u00ee\u00ef\u00f1\u00f3
      \u00f2\u00f4\u00f6\u00f5\u00fa\u00f9\u00fb\u00fc
      \u2020\u00b0\u00a2\u00a3\u00a7\u2022\u00b6\u00df
      \u00ae\u00a9\u2122\u00b4\u00a8\u2260\u00c6\u00d8
      \u221e\u00b1\u2264\u2265\u00a5\u00b5\u2202\u2211
      \u220f\u03c0\u222b\u00aa\u00ba\u03a9\u00e6\u00f8
      \u00bf\u00a1\u00ac\u221a\u0192\u2248\u2206\u00ab
      \u00bb\u2026\u00a0\u00c0\u00c3\u00d5\u0152\u0153
      \u2013\u2014\u201c\u201d\u2018\u2019\u00f7\u25ca
      \u00ff\u0178\u2044\u20ac\u2039\u203a\ufb01\ufb02
      \u2021\u00b7\u201a\u201e\u2030\u00c2\u00ca\u00c1
      \u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00d3\u00d4
      \uf8ff\u00d2\u00da\u00db\u00d9\u0131\u02c6\u02dc
      \u00af\u02d8\u02d9\u02da\u00b8\u02dd\u02db\u02c7
      '''.replace /\n/g, ''

    (byte_array) ->
      char_array = for byte, idx in byte_array
        if byte < 0x80 then String.fromCharCode byte
        else high_chars_unicode.charAt byte - 0x80
      char_array.join ''