var canvas var context var getFromWeb = true var mouseDown = false var scale = .6 var outset = 15 var columnWidth = 256 var maxHeight = 256 var lastLink = null var lastLinkStr = null var labelback = {} var loadedImages = 0 var images = {} var imagesLength = 0; function recContains(rec, value) { if (!value.length) return 0 var lc = value.toLowerCase() if (rec.name.toLowerCase().indexOf(lc) >= 0) return 1 if (rec.code.toLowerCase().indexOf(lc) >= 0) return 2 return 3 } function setLink(recstr) { var under var link = recstr if (!link.startsWith("Sk")) { under = link.indexOf('_') link = link.substring(under + 1) } under = link.lastIndexOf('_') var len = link.length if (under == len - 2) { var letter = link[len - 1] if ('a' <= letter && letter <= 'z') { link = link.substr(0, len - 2) } else if ('0' <= letter && letter <= '9') { link = link.substr(0, len - 2) } } lastLinkStr = link } function showLink() { var link = lastLink.file + '#' + lastLinkStr context.save() context.font = "normal 16px Arial"; labelback.w = Math.max(labelback.w, context.measureText(link).width + 8) context.beginPath() context.rect(labelback.x, labelback.y, labelback.w, labelback.h) context.fillStyle = "rgba(232,180,220, 1)" context.fill() context.fillStyle = "rgba(64,32,48, 1)" context.fillText(link, labelback.x + 4, labelback.y + 16) context.restore() } function imageIterator(callout, state) { var row = outset + 30 var column = outset for (var recstr in pngs) { var rec = pngs[recstr] var contains = recContains(rec, input.value) if (3 == contains) continue; var height = rec.height < maxHeight ? rec.height : maxHeight if (callout(state, column, row, height, contains, recstr)) break; row += height + outset if (row >= canvas.height / scale) { row = 0 column += columnWidth + outset if (column >= canvas.width / scale) { break } } } } function handleMouseOver(event) { var callout = function(state, column, row, height, contains, recstr) { if (state.x >= column && state.x <= column + columnWidth && state.y >= row && state.y <= row + height) { document.body.style.cursor = "pointer" lastLink = pngs[recstr] setLink(recstr) showLink() return true } return false } var state = { x: (event.clientX - 5) / scale, y: (event.clientY - 7) / scale } document.body.style.cursor = "" lastLink = null imageIterator(callout, state) } function handleMouseClick() { if (null != lastLink) { var link = 'https://skia.org/user/api/' + lastLink.file + '#' + lastLinkStr window.location = link } } function doKeyPress(evt) { idiv.style.height = 20 input.focus() } function drawImage(hash, x, y, w, h, contains) { context.save() context.transform(scale, 0, 0, scale, 0, 0) context.save() context.beginPath() context.rect(x, y, w, h) context.clip() context.drawImage(images[hash], x, y) context.restore() context.beginPath() context.rect(x, y, w, h) context.strokeStyle = 1 == contains ? "red" : "black" context.stroke() context.restore() } function draw() { var callout = function(state, column, row, height, contains, recstr) { drawImage(pngs[recstr].hash, column, row, columnWidth, height, contains) return false } imageIterator(callout, null) } function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function redraw() { context.strokeStyle = "white" context.beginPath() context.fillStyle = "white" context.rect(0, 30, canvas.width, canvas.height) context.fill() context.rect((256 + outset) * scale, 0, canvas.width, 30) context.fill() for (var image in images) { image.drawn = false } do { draw(); if (loadedImages >= imagesLength) break; console.debug(" loadedImages:" + loadedImages + " imagesLength:" + imagesLength) await sleep(1000); } while (true) } function resize() { setSize() redraw() } function setSize() { canvas.width = window.innerWidth - 20 canvas.height = window.innerHeight - 20 labelback.x = 0 labelback.y = canvas.height - 20 labelback.w = 0 labelback.h = 20 } function loadImages() { for (var recstr in pngs) { var rec = pngs[recstr] var image = new Image() images[rec.hash] = image if (getFromWeb) image.src = 'https://fiddle.skia.org/i/' image.src += rec.hash + '_raster.png' image.onload = function () { loadedImages += 1 } imagesLength += 1; } } function start() { loadImages() window.addEventListener('keypress', doKeyPress, true); window.addEventListener('keydown', doKeyPress, true); canvas = document.getElementById('canvas') context = canvas.getContext('2d') resize() } </script> </head> <body onLoad="start()" onresize="resize()"> <div style="height:0" id="idiv"> <input type="text" id="input" onkeypress="redraw()" onkeydown="redraw()"/> </div> <canvas id="canvas" width="750" height="500" onmousedown="mouseDown = true" onmouseup="mouseDown = false" onmousemove="handleMouseOver(event)" onclick="handleMouseClick()" ></canvas > </body> </html>