summaryrefslogtreecommitdiff
path: root/script.js
blob: e3bb175b0bc8ba3f6513f92e0998841c84f22fe9 (plain)
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
let g_viewOffset = 100
let g_data = new Uint8Array()
let g_viewWidth = 4
let g_viewHeight = 24

function toHexString(value) {
  let hex = value.toString(16)
  while (hex.length < 8) {
    hex = "0" + hex;
  }
  return hex
}

function updateTextureView(textureView, data, viewOffset) {
  if (viewOffset == undefined) {
    viewOffset = 0
  }
  viewSize = g_viewWidth * g_viewHeight
  endOffset = viewOffset + viewSize
  textureView.textContent = '' // Clear
  let textureViewBody = document.createElement('tbody')
  textureView.appendChild(textureViewBody)
  for (let offset = viewOffset; offset < endOffset; offset += g_viewWidth) {
    let tr = document.createElement('tr')
    let tdOffset = document.createElement('td')
    let offsetText = document.createTextNode(toHexString(offset))
    tdOffset.appendChild(offsetText)
    tr.appendChild(tdOffset)
    for (let i = 0; i < g_viewWidth; i++) {
      if (offset + i >= data.length) {
        break;
      }
      const value = data[offset + i]
      const color1 = ((value & 0xf0) >> 4)
      const color2 = ((value & 0x0f))
      let td1 = document.createElement('td')
      td1.classList.add('c1' + color1.toString(16))
      td1.appendChild(document.createTextNode(color1.toString(16) + '.'))
      tr.appendChild(td1)
      let td2 = document.createElement('td')
      td2.classList.add('c1' + color2.toString(16))
      td2.appendChild(document.createTextNode(color2.toString(16) + '.'))
      tr.appendChild(td2)
    }
    textureViewBody.appendChild(tr)
  }
}

function viewMoveDown(step) {
  g_viewOffset = Math.max(0, Math.min(g_data.length, g_viewOffset + step))
  updateTextureView(document.querySelector('table#texture-view'), g_data, g_viewOffset)
}

function viewGoToOffset() {
  g_viewOffset = parseInt(document.querySelector('input#offset').value, 16)
  updateTextureView(document.querySelector('table#texture-view'), g_data, g_viewOffset)
}

document.querySelector('button#down').addEventListener('click', (event) => {
  viewMoveDown(g_viewWidth)
})

document.querySelector('button#up').addEventListener('click', (event) => {
  viewMoveDown(-g_viewWidth)
})

document.querySelector('button#go').addEventListener('click', (event) => {
  viewGoToOffset()
})

document.querySelector('input#offset').addEventListener('change', (event) => {
  viewGoToOffset()
})

addEventListener("keypress", (event) => {
  if (event.altKey || event.ctrlKey) {
    return
  }
  switch (event.code) {
  case 'KeyJ':
    viewMoveDown(g_viewWidth * (event.shiftKey ? g_viewHeight : 1))
    break
  case 'KeyK':
    viewMoveDown(g_viewWidth * -(event.shiftKey ? g_viewHeight : 1))
    break
  case 'KeyL':
    viewMoveDown((event.shiftKey ? g_viewWidth : 1))
    break
  case 'KeyH':
    viewMoveDown(-(event.shiftKey ? g_viewWidth : 1))
    break
  }
});

document.querySelector('input#file').addEventListener('change', (event) => {
  let files = event.target.files
  if (files.length == 0) {
    return
  }
  const file = files[0]
  let reader = new FileReader()
  reader.onload = (e) => {
    let arrayBuffer = e.target.result
    g_data = new Uint8Array(arrayBuffer)
    updateTextureView(document.querySelector('table#texture-view'), g_data, g_viewOffset)
  }
  reader.onerror = (e) => alert(e.target.error.name)
  reader.readAsArrayBuffer(file)
})