Skip to content

Commit f898405

Browse files
committed
progress on webcomponent/bare wasm PoC
1 parent d47f2a0 commit f898405

File tree

5 files changed

+56
-24
lines changed

5 files changed

+56
-24
lines changed

src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ impl ImageType {
6262
}
6363

6464
pub fn widths(&self, byte_count: usize) -> Vec<i64> {
65-
Self::factors(self.pixel_count(byte_count), 80)
65+
Self::factors(self.pixel_count(byte_count), 320)
6666
}
6767

6868
pub fn heights(&self, byte_count: usize, width: usize) -> Vec<i64> {

src/png.rs

+7
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,10 @@ pub fn write_to(
5656
) -> Result<(), image::ImageError> {
5757
convert_image(image_data, palette).write_to(&mut Cursor::new(bytes), image::ImageFormat::Png)
5858
}
59+
60+
pub fn write2(image_data: RawGrid, palette: ColorPalette) -> Vec<u8> {
61+
let mut bytes: Vec<u8> = Vec::new();
62+
let _ = convert_image(image_data.clone(), palette)
63+
.write_to(&mut Cursor::new(&mut bytes), image::ImageFormat::Png);
64+
bytes
65+
}

src/webc/index.html

+14-3
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,29 @@
1212
<script>
1313
const fileReader = new FileReader();
1414
fileReader.onloadend = function() {
15-
var array = new Int8Array(fileReader.result);
16-
document.getElementById('preview').src = window.wasmBindings.png(array);
15+
let array = new Int8Array(fileReader.result);
16+
let images = window.wasmBindings.previews(array);
17+
images.forEach(makePreview);
1718
}
1819
document.addEventListener("DOMContentLoaded", () => {
1920
const fileInput = document.getElementById('file-input');
2021
fileInput.addEventListener("change", e => fileReader.readAsArrayBuffer(fileInput.files[0]));
2122
});
23+
24+
function makePreview(src) {
25+
const template = document.querySelector("#preview");
26+
const clone = template.content.cloneNode(true);
27+
const container = document.querySelector(".preview-area");
28+
let img = clone.querySelector("img");
29+
img.src=src;
30+
container.appendChild(img);
31+
}
2232
</script>
2333
</head>
2434
<body>
2535
<h1>Process your CGA/EGAs</h1>
2636
<input id="file-input" multiple="false" type="file" accept=".bin,.cga,.ega,.cega" />
27-
<img id="preview" src="" />
37+
<div class="preview-area"></div>
38+
<template id="preview"><img class="preview" src="" /></template>
2839
</body>
2940
</html>

src/webc/main.rs

+18-3
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,24 @@ pub fn png(data: &[u8]) -> String {
1515
let parser = ParserType::CGA;
1616
let image = file_data.parse(parser, 320);
1717
let palette = palette_from_abbr("cga0");
18-
let mut bytes: Vec<u8> = Vec::new();
19-
let _ = png::write_to(&mut bytes, image.data(), palette.clone());
20-
format!("data:application/png;base64,{}", STANDARD.encode(bytes))
18+
let result = png::write2(image.data(), palette.clone());
19+
format!("data:application/png;base64,{}", STANDARD.encode(result))
20+
}
21+
22+
#[wasm_bindgen]
23+
pub fn previews(data: &[u8]) -> Vec<String> {
24+
let file_data = Raw::new(data);
25+
let palette = palette_from_abbr("cga0");
26+
file_data
27+
.previews()
28+
.iter()
29+
.map(|p| {
30+
format!(
31+
"data:application/png;base64,{}",
32+
STANDARD.encode(png::write2(p.data(), palette.clone()))
33+
)
34+
})
35+
.collect()
2136
}
2237

2338
fn main() {}

src/webc/styles.css

+16-17
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,14 @@
55

66
html,
77
body {
8-
margin: 0;
8+
margins 0;
99
padding: 0;
1010
background: #2d3131;
1111
color: #fcfcfc;
12+
display: flex;
13+
align-items: center;
14+
justify-content: center;
15+
flex-flow: column;
1216
}
1317

1418
p {
@@ -19,18 +23,12 @@ label {
1923
cursor: pointer;
2024
}
2125

22-
23-
#wrapper {
24-
width: 70%;
25-
margin: auto;
26-
}
27-
2826
#h1 {
2927
font-size: 2rem;
3028
text-align: center;
3129
}
3230

33-
.drop-container {
31+
/*.drop-container {
3432
padding: 4rem;
3533
display: flex;
3634
flex-direction: column;
@@ -44,23 +42,24 @@ label {
4442
.drop-container i {
4543
font-size: 4rem;
4644
}
47-
45+
*/
4846
.preview-area {
4947
display: flex;
50-
flex-wrap: wrap;
51-
justify-content: center;
52-
align-items: stretch;
48+
flex-flow: row wrap;
49+
align-items: flex-start;
5350
}
54-
55-
.preview-tile {
51+
.preview-area img{
52+
margin: 1rem;
53+
}
54+
/*.preview-tile {
5655
display: flex;
5756
flex-direction: column;
5857
padding: 2rem;
5958
margin: 1rem;
6059
background: #313737;
6160
border-radius: 1rem;
62-
}
63-
.preview-row {
61+
}*/
62+
/*.preview-row {
6463
display: flex;
6564
flex-direction: row;
6665
padding: 2rem;
@@ -80,4 +79,4 @@ label {
8079
display: flex;
8180
flex-direction: column;
8281
justify-content: center;
83-
}
82+
}*/

0 commit comments

Comments
 (0)