Skip to content

Commit 2c7cf2a

Browse files
authored
Merge pull request #76 from ondras/master
ondras#149 image backend exposes src
2 parents f21a72f + f0ea827 commit 2c7cf2a

File tree

3 files changed

+42
-26
lines changed

3 files changed

+42
-26
lines changed

my-mind.js

+20-13
Original file line numberDiff line numberDiff line change
@@ -1973,28 +1973,27 @@ ${text}`);
19731973
constructor() {
19741974
super("image");
19751975
}
1976-
save(format) {
1976+
async save(format) {
19771977
const serializer = new XMLSerializer();
19781978
const encoder = new TextEncoder();
19791979
let xmlStr = serializer.serializeToString(currentMap.node);
19801980
let encoded = encoder.encode(xmlStr);
19811981
let byteString = [...encoded].map((byte) => String.fromCharCode(byte)).join("");
19821982
let base64 = btoa(byteString);
19831983
let svgUrl = `data:image/svg+xml;base64,${base64}`;
1984-
if (format == "svg") {
1985-
this.download(svgUrl);
1986-
} else if (format == "png") {
1987-
let img = new Image();
1988-
img.src = svgUrl;
1989-
img.onload = () => {
1984+
switch (format) {
1985+
case "svg":
1986+
return svgUrl;
1987+
case "png":
1988+
let img = await waitForImageLoad(svgUrl);
19901989
let canvas = document.createElement("canvas");
19911990
canvas.width = img.width;
19921991
canvas.height = img.height;
19931992
canvas.getContext("2d").drawImage(img, 0, 0);
1994-
canvas.toBlob((blob) => {
1995-
this.download(URL.createObjectURL(blob));
1996-
}, "image/png");
1997-
};
1993+
return new Promise((resolve) => {
1994+
canvas.toBlob((blob) => resolve(URL.createObjectURL(blob)), "image/png");
1995+
});
1996+
break;
19981997
}
19991998
}
20001999
download(href) {
@@ -2004,6 +2003,13 @@ ${text}`);
20042003
link.click();
20052004
}
20062005
};
2006+
async function waitForImageLoad(src) {
2007+
let img = new Image();
2008+
img.src = src;
2009+
return new Promise((resolve) => {
2010+
img.onload = () => resolve(img);
2011+
});
2012+
}
20072013

20082014
// .js/ui/backend/image.js
20092015
var ImageUI = class extends BackendUI {
@@ -2013,8 +2019,9 @@ ${text}`);
20132019
get format() {
20142020
return this.node.querySelector(".format");
20152021
}
2016-
save() {
2017-
this.backend.save(this.format.value);
2022+
async save() {
2023+
let url = await this.backend.save(this.format.value);
2024+
this.backend.download(url);
20182025
}
20192026
load() {
20202027
}

src/backend/image.ts

+18-12
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export type Format = "svg" | "png";
77
export default class ImageBackend extends Backend {
88
constructor() { super("image"); }
99

10-
save(format: Format) {
10+
async save(format: Format): Promise<string> {
1111
const serializer = new XMLSerializer();
1212
const encoder = new TextEncoder();
1313

@@ -17,29 +17,35 @@ export default class ImageBackend extends Backend {
1717
let base64 = btoa(byteString);
1818
let svgUrl = `data:image/svg+xml;base64,${base64}`;
1919

20-
if (format == "svg") {
21-
this.download(svgUrl);
22-
} else if (format == "png") {
23-
let img = new Image();
24-
img.src = svgUrl;
20+
switch (format) {
21+
case "svg": return svgUrl;
2522

26-
img.onload = () => {
23+
case "png":
24+
let img = await waitForImageLoad(svgUrl);
2725
let canvas = document.createElement("canvas");
2826
canvas.width = img.width;
2927
canvas.height = img.height;
3028
canvas.getContext("2d")!.drawImage(img, 0, 0);
3129

32-
canvas.toBlob(blob => {
33-
this.download(URL.createObjectURL(blob));
34-
}, "image/png");
35-
}
30+
return new Promise(resolve => {
31+
canvas.toBlob(blob => resolve(URL.createObjectURL(blob)), "image/png");
32+
});
33+
break;
3634
}
3735
}
3836

39-
protected download(href: string) {
37+
download(href: string) {
4038
let link = document.createElement("a");
4139
link.download = app.currentMap.name;
4240
link.href = href;
4341
link.click();
4442
}
4543
}
44+
45+
async function waitForImageLoad(src: string): Promise<HTMLImageElement> {
46+
let img = new Image();
47+
img.src = src;
48+
return new Promise(resolve => {
49+
img.onload = () => resolve(img);
50+
});
51+
}

src/ui/backend/image.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ export default class ImageUI extends BackendUI<Image> {
99

1010
protected get format() { return this.node.querySelector<HTMLSelectElement>(".format")!; }
1111

12-
save() { this.backend.save(this.format.value as Format); }
12+
async save() {
13+
let url = await this.backend.save(this.format.value as Format);
14+
this.backend.download(url);
15+
}
1316

1417
load() {}
1518
}

0 commit comments

Comments
 (0)