wip assembling the puzzle pieces
This commit is contained in:
parent
5fc6ce7636
commit
40ebe619f5
10 changed files with 928 additions and 684 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -2,3 +2,4 @@ node_modules/
|
|||
target/
|
||||
pkg/
|
||||
.DS_Store
|
||||
dist/
|
||||
|
|
|
|||
523
dist/bundle.js
vendored
523
dist/bundle.js
vendored
File diff suppressed because one or more lines are too long
29
dist/index.html
vendored
29
dist/index.html
vendored
|
|
@ -1,29 +0,0 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
|
||||
<title>Spiegel</title>
|
||||
<script defer src="bundle.js"></script></head>
|
||||
|
||||
<body>
|
||||
<div class="default">
|
||||
<div class="main">
|
||||
<label>
|
||||
<h2>Blur factor</h2< /label>
|
||||
<div class="slidecontainer">
|
||||
<input type="range" id="slider" value="0" min="0" max="100" class="slider" />
|
||||
</div>
|
||||
</label>
|
||||
<div class="main_content">
|
||||
<div class="content" id="images">
|
||||
<div id="image_container"></div>
|
||||
|
||||
<canvas id="canvas"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
127
package-lock.json
generated
127
package-lock.json
generated
|
|
@ -9,7 +9,7 @@
|
|||
"version": "0.1.0",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@silvia-odwyer/photon": "^0.1.0"
|
||||
"http-proxy-middleware": "^2.0.6"
|
||||
},
|
||||
"bin": {
|
||||
"create-rust-webpack": ".bin/create-rust-webpack.js"
|
||||
|
|
@ -20,7 +20,6 @@
|
|||
"css-loader": "^6.10.0",
|
||||
"file-loader": "^6.2.0",
|
||||
"html-webpack-plugin": "^5.6.0",
|
||||
"js-loader": "^0.1.1",
|
||||
"style-loader": "^3.3.4",
|
||||
"webpack": "^5.91.0",
|
||||
"webpack-cli": "^5.1.4",
|
||||
|
|
@ -154,16 +153,11 @@
|
|||
"node": ">=14"
|
||||
}
|
||||
},
|
||||
"node_modules/@silvia-odwyer/photon": {
|
||||
"version": "0.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@silvia-odwyer/photon/-/photon-0.1.0.tgz",
|
||||
"integrity": "sha512-7dPuzcHvnI7A/6C29xTDxzEhKIQJ0KsjwlPXKKqxs+PJNbqK1gKQj/GMQUbzX3Ec+MB4JBKElsUS920vNL7MAw=="
|
||||
},
|
||||
"node_modules/@types/body-parser": {
|
||||
"version": "1.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
|
||||
"integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"dependencies": {
|
||||
"@types/connect": "*",
|
||||
"@types/node": "*"
|
||||
|
|
@ -182,7 +176,7 @@
|
|||
"version": "3.4.38",
|
||||
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
|
||||
"integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"dependencies": {
|
||||
"@types/node": "*"
|
||||
}
|
||||
|
|
@ -227,7 +221,7 @@
|
|||
"version": "4.17.21",
|
||||
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
|
||||
"integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"dependencies": {
|
||||
"@types/body-parser": "*",
|
||||
"@types/express-serve-static-core": "^4.17.33",
|
||||
|
|
@ -239,7 +233,7 @@
|
|||
"version": "4.17.43",
|
||||
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz",
|
||||
"integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"dependencies": {
|
||||
"@types/node": "*",
|
||||
"@types/qs": "*",
|
||||
|
|
@ -267,13 +261,12 @@
|
|||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
|
||||
"integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
|
||||
"dev": true
|
||||
"devOptional": true
|
||||
},
|
||||
"node_modules/@types/http-proxy": {
|
||||
"version": "1.17.14",
|
||||
"resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz",
|
||||
"integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@types/node": "*"
|
||||
}
|
||||
|
|
@ -288,7 +281,7 @@
|
|||
"version": "1.3.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
|
||||
"integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
|
||||
"dev": true
|
||||
"devOptional": true
|
||||
},
|
||||
"node_modules/@types/minimatch": {
|
||||
"version": "5.1.2",
|
||||
|
|
@ -300,7 +293,6 @@
|
|||
"version": "20.11.30",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz",
|
||||
"integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"undici-types": "~5.26.4"
|
||||
}
|
||||
|
|
@ -318,13 +310,13 @@
|
|||
"version": "6.9.14",
|
||||
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz",
|
||||
"integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==",
|
||||
"dev": true
|
||||
"devOptional": true
|
||||
},
|
||||
"node_modules/@types/range-parser": {
|
||||
"version": "1.2.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
|
||||
"integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
|
||||
"dev": true
|
||||
"devOptional": true
|
||||
},
|
||||
"node_modules/@types/retry": {
|
||||
"version": "0.12.2",
|
||||
|
|
@ -336,7 +328,7 @@
|
|||
"version": "0.17.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
|
||||
"integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"dependencies": {
|
||||
"@types/mime": "^1",
|
||||
"@types/node": "*"
|
||||
|
|
@ -355,7 +347,7 @@
|
|||
"version": "1.15.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz",
|
||||
"integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"dependencies": {
|
||||
"@types/http-errors": "*",
|
||||
"@types/mime": "*",
|
||||
|
|
@ -979,7 +971,6 @@
|
|||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
|
||||
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"fill-range": "^7.0.1"
|
||||
},
|
||||
|
|
@ -1349,19 +1340,6 @@
|
|||
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/connect": {
|
||||
"version": "0.5.8",
|
||||
"resolved": "https://registry.npmjs.org/connect/-/connect-0.5.8.tgz",
|
||||
"integrity": "sha512-N/eXBtibhXlXU/M3mYaIaTAg9OPx0560l48h+kxbuY7FQ4+6ByrJLTZe6q//Kw7wBTy1d4eQGW3fqBDMLoK6/g==",
|
||||
"deprecated": "connect 0.x series is deprecated",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"qs": ">= 0.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.2.5"
|
||||
}
|
||||
},
|
||||
"node_modules/connect-history-api-fallback": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
|
||||
|
|
@ -1925,8 +1903,7 @@
|
|||
"node_modules/eventemitter3": {
|
||||
"version": "4.0.7",
|
||||
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
|
||||
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
|
||||
"dev": true
|
||||
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
|
||||
},
|
||||
"node_modules/events": {
|
||||
"version": "3.3.0",
|
||||
|
|
@ -2141,15 +2118,6 @@
|
|||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/eyes": {
|
||||
"version": "0.1.8",
|
||||
"resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
|
||||
"integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": "> 0.1.90"
|
||||
}
|
||||
},
|
||||
"node_modules/fast-deep-equal": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
||||
|
|
@ -2214,7 +2182,6 @@
|
|||
"version": "7.0.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
|
||||
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"to-regex-range": "^5.0.1"
|
||||
},
|
||||
|
|
@ -2266,7 +2233,6 @@
|
|||
"version": "1.15.6",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
|
||||
"integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
"type": "individual",
|
||||
|
|
@ -2792,7 +2758,6 @@
|
|||
"version": "1.18.1",
|
||||
"resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
|
||||
"integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"eventemitter3": "^4.0.0",
|
||||
"follow-redirects": "^1.0.0",
|
||||
|
|
@ -2806,7 +2771,6 @@
|
|||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
|
||||
"integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@types/http-proxy": "^1.17.8",
|
||||
"http-proxy": "^1.18.1",
|
||||
|
|
@ -2830,7 +2794,6 @@
|
|||
"version": "4.0.5",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
|
||||
"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"braces": "^3.0.2",
|
||||
"picomatch": "^2.3.1"
|
||||
|
|
@ -3028,7 +2991,6 @@
|
|||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
|
||||
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
|
|
@ -3046,7 +3008,6 @@
|
|||
"version": "4.0.3",
|
||||
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
|
||||
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"is-extglob": "^2.1.1"
|
||||
},
|
||||
|
|
@ -3088,7 +3049,6 @@
|
|||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
|
||||
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=0.12.0"
|
||||
}
|
||||
|
|
@ -3130,7 +3090,6 @@
|
|||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
|
||||
"integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
|
|
@ -3258,24 +3217,6 @@
|
|||
"url": "https://github.com/chalk/supports-color?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/js-loader": {
|
||||
"version": "0.1.1",
|
||||
"resolved": "https://registry.npmjs.org/js-loader/-/js-loader-0.1.1.tgz",
|
||||
"integrity": "sha512-3QBYVT2BkoyzBVYjPBiJ1w0Bpclhww+SH9OdObgODb1KxjtYyjb4MH3kwGqZVuGBIQK2lmPJkFL2ohouMQzQUA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"connect": "=0.5.8",
|
||||
"temp": "=0.2.0",
|
||||
"uglify-js": "=0.0.4",
|
||||
"vows": "=0.5.6"
|
||||
},
|
||||
"bin": {
|
||||
"jsloader": "bin/jsloader"
|
||||
},
|
||||
"engines": {
|
||||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/json-parse-even-better-errors": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
|
||||
|
|
@ -4156,7 +4097,6 @@
|
|||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
|
||||
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=8.6"
|
||||
},
|
||||
|
|
@ -4561,8 +4501,7 @@
|
|||
"node_modules/requires-port": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
|
||||
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
|
||||
"dev": true
|
||||
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
|
||||
},
|
||||
"node_modules/resolve": {
|
||||
"version": "1.22.8",
|
||||
|
|
@ -5494,15 +5433,6 @@
|
|||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/temp": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/temp/-/temp-0.2.0.tgz",
|
||||
"integrity": "sha512-YDBo1L4ZLi2+8u7rcY8asynPBwrXuNQ97sdemNwv/v8OJLCj/duAiuGYMtFIMUNKZG4zO1O5oQD7u+Y0c2O6ZA==",
|
||||
"dev": true,
|
||||
"engines": [
|
||||
"node >=0.1.90"
|
||||
]
|
||||
},
|
||||
"node_modules/terser": {
|
||||
"version": "5.29.2",
|
||||
"resolved": "https://registry.npmjs.org/terser/-/terser-5.29.2.tgz",
|
||||
|
|
@ -5617,7 +5547,6 @@
|
|||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
|
||||
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"is-number": "^7.0.0"
|
||||
},
|
||||
|
|
@ -5653,23 +5582,10 @@
|
|||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/uglify-js": {
|
||||
"version": "0.0.4",
|
||||
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-0.0.4.tgz",
|
||||
"integrity": "sha512-cGiAIcNECVjqL3wNiWiBctBJr94T6WS+q0c/H/I+pGsAQ/+8ZKbJxw9GJiaL+ZYbGDU275Shz+h2Gq4S2Oc35Q==",
|
||||
"dev": true,
|
||||
"bin": {
|
||||
"uglifyjs": "bin/uglifyjs"
|
||||
},
|
||||
"engines": {
|
||||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/undici-types": {
|
||||
"version": "5.26.5",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
|
||||
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
|
||||
"dev": true
|
||||
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
|
||||
},
|
||||
"node_modules/union-value": {
|
||||
"version": "1.0.1",
|
||||
|
|
@ -5872,21 +5788,6 @@
|
|||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/vows": {
|
||||
"version": "0.5.6",
|
||||
"resolved": "https://registry.npmjs.org/vows/-/vows-0.5.6.tgz",
|
||||
"integrity": "sha512-IGLEetjz/nPKHYPlA3LTGMxj6nbfsyZ3CwFTR6hzE6zRLLY7yu5ya4v9ymY7cit9wnogDv6Cj12nU/myCeDwgQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"eyes": ">=0.1.6"
|
||||
},
|
||||
"bin": {
|
||||
"vows": "bin/vows"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.2.6"
|
||||
}
|
||||
},
|
||||
"node_modules/watchpack": {
|
||||
"version": "1.7.5",
|
||||
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz",
|
||||
|
|
|
|||
|
|
@ -9,9 +9,10 @@ use spiegel_server::{get_closest_color, init};
|
|||
async fn main() -> anyhow::Result<()> {
|
||||
tracing_subscriber::fmt::init();
|
||||
init();
|
||||
let app = Router::new().route("/color/:rgb_hex", get(fetch_nearest_color));
|
||||
let app = Router::new().route("/api/color/:rgb_hex", get(fetch_nearest_color));
|
||||
|
||||
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
|
||||
println!("started server on http://0.0.0.0:3000");
|
||||
axum::serve(listener, app).await.unwrap();
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,10 +20,13 @@ import("../../webclient/pkg").then((module) => {
|
|||
let sliderValue = parseInt(event.target.value);
|
||||
blur_factor = sliderValue / 5;
|
||||
let rust_image = module.open_image(canvas, ctx);
|
||||
|
||||
// module.gaussian_blur(rust_image, blur_factor);
|
||||
module.median(rust_image, blur_factor, blur_factor);
|
||||
module.putImageData(canvas, ctx, rust_image);
|
||||
document.getElementById("msg").remove();
|
||||
// module.median(rust_image, blur_factor, blur_factor);
|
||||
module.spiegel(rust_image, blur_factor).then((pi) => {
|
||||
module.putImageData(canvas, ctx, pi);
|
||||
document.getElementById("msg").remove();
|
||||
});
|
||||
}
|
||||
|
||||
function setUpCanvas() {
|
||||
|
|
|
|||
863
webclient/Cargo.lock
generated
863
webclient/Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
|
@ -14,6 +14,8 @@ anyhow = "1.0"
|
|||
photon-rs = { version = "0.3.2", default-features = false }
|
||||
console_error_panic_hook = { version = "0.1.7", optional = true }
|
||||
wasm-bindgen = "0.2.78"
|
||||
wasm-bindgen-futures = "0.4"
|
||||
reqwest-wasm = "0.11"
|
||||
|
||||
[lib]
|
||||
crate-type = ["cdylib", "rlib"]
|
||||
|
|
|
|||
|
|
@ -1,8 +1,10 @@
|
|||
use std::{collections::HashSet, time::Instant};
|
||||
use std::collections::HashSet;
|
||||
use std::io::Cursor;
|
||||
|
||||
use anyhow::Error;
|
||||
use image::io::Reader as ImageReader;
|
||||
use image::{GenericImageView, ImageBuffer, Pixel, Rgb, RgbImage, RgbaImage};
|
||||
use photon_rs::PhotonImage;
|
||||
|
||||
mod quantizer;
|
||||
mod samples;
|
||||
|
||||
|
|
@ -48,7 +50,7 @@ pub fn determine_colors(image: &PhotonImage) -> HashSet<String> {
|
|||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
pub fn fofo(photon_image: &mut PhotonImage) {
|
||||
pub async fn spiegel(photon_image: PhotonImage, median_kernelsize: u32) -> PhotonImage {
|
||||
let width = photon_image.get_width();
|
||||
let height = photon_image.get_height();
|
||||
|
||||
|
|
@ -58,23 +60,24 @@ pub fn fofo(photon_image: &mut PhotonImage) {
|
|||
// println!("applying gaussian blur filter");
|
||||
// let gauss = imageproc::filter::gaussian_blur_f32(&src, 4.0);
|
||||
println!("applying median filter");
|
||||
let median = imageproc::filter::median_filter(&rs_image, 20, 20);
|
||||
let median = imageproc::filter::median_filter(&rs_image, median_kernelsize, median_kernelsize);
|
||||
println!("applying color quantization filter");
|
||||
let quantized = quantizer::quantize(&median, 256);
|
||||
|
||||
println!("applying samples");
|
||||
// let out = apply_samples_to_image(quantized, &color_samples);
|
||||
// quantized.save_with_format("output.jpg", image::ImageFormat::Jpeg).unwrap();
|
||||
let out = apply_samples_to_image(quantized).await.into_raw();
|
||||
|
||||
PhotonImage::new(out, width, height)
|
||||
}
|
||||
|
||||
fn apply_samples_to_image(mut src: RgbImage, color_samples: &Vec<ColorSample>) -> RgbImage {
|
||||
async fn apply_samples_to_image(mut src: RgbImage) -> RgbImage {
|
||||
let mut imgbuf = RgbImage::new(src.width(), src.height());
|
||||
unsafe {
|
||||
for y in 0..src.height() {
|
||||
for x in 0..src.width() {
|
||||
let pixel = &src.unsafe_get_pixel(x, y);
|
||||
if imgbuf.unsafe_get_pixel(x, y).channels() == [0, 0, 0] {
|
||||
if let Some(sample) = get_closest(&color_samples, pixel) {
|
||||
if let Ok(sample) = get_image(pixel).await {
|
||||
fill(&mut src, sample, &mut imgbuf, pixel, x, y);
|
||||
}
|
||||
}
|
||||
|
|
@ -84,9 +87,29 @@ fn apply_samples_to_image(mut src: RgbImage, color_samples: &Vec<ColorSample>) -
|
|||
imgbuf
|
||||
}
|
||||
|
||||
async fn get_image(pixel: &Rgb<u8>) -> anyhow::Result<RgbImage, Error> {
|
||||
let rgb = format!("{:02X?}{:02X?}{:02X?}", pixel[0], pixel[1], pixel[2]);
|
||||
|
||||
let bytes = reqwest_wasm::get(format!("/api/color/{}", rgb))
|
||||
.await?
|
||||
.bytes()
|
||||
.await?
|
||||
.to_vec();
|
||||
|
||||
Ok(ImageReader::new(Cursor::new(bytes))
|
||||
.with_guessed_format()
|
||||
.unwrap()
|
||||
.decode()?
|
||||
.as_rgb8()
|
||||
.unwrap()
|
||||
.clone())
|
||||
|
||||
// should probably cache it
|
||||
}
|
||||
|
||||
fn fill(
|
||||
src: &mut ImageBuffer<Rgb<u8>, Vec<u8>>,
|
||||
sample: &ColorSample,
|
||||
sample: RgbImage,
|
||||
dest: &mut ImageBuffer<Rgb<u8>, Vec<u8>>,
|
||||
color: &Rgb<u8>,
|
||||
px: u32,
|
||||
|
|
@ -95,8 +118,8 @@ fn fill(
|
|||
if color.channels() == [0, 0, 0] {
|
||||
return;
|
||||
}
|
||||
let height = sample.image.height();
|
||||
let width = sample.image.width();
|
||||
let height = sample.height();
|
||||
let width = sample.width();
|
||||
let mut points = List::new();
|
||||
if is_same(src.get_pixel(px, py), &color) {
|
||||
points.push(Point { x: px, y: py });
|
||||
|
|
@ -117,7 +140,7 @@ fn fill(
|
|||
while yy >= height {
|
||||
yy -= height;
|
||||
}
|
||||
dest.put_pixel(x, y, *sample.image.get_pixel(xx, yy));
|
||||
dest.put_pixel(x, y, *sample.get_pixel(xx, yy));
|
||||
src.put_pixel(x, y, Rgb([0, 0, 0]));
|
||||
if x > 1 {
|
||||
points.push(Point::new(x - 1, y));
|
||||
|
|
|
|||
|
|
@ -40,6 +40,14 @@ var mainConfig = {
|
|||
experiments: {
|
||||
asyncWebAssembly: true,
|
||||
},
|
||||
devServer: {
|
||||
proxy: [
|
||||
{
|
||||
context: ["/api"],
|
||||
target: "http://localhost:3000",
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = [mainConfig];
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue