You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
218 lines
5.5 KiB
218 lines
5.5 KiB
|
|
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>
|