|
|
|
|
@ -424,8 +424,8 @@ function triggerPreview() { |
|
|
|
|
|
|
|
|
|
function buildPreview() { |
|
|
|
|
if (!(window as any)._mdDriver) |
|
|
|
|
window._mdDriver = new MonoDisplayDriver("canvas_root", { onColor: "#EC0", offColor: "#000", fps: 25 }); |
|
|
|
|
window._mdDriver.load(() => Promise.resolve(file.toBuffer())); |
|
|
|
|
(window as any)._mdDriver = new MonoDisplayDriver("canvas_root", { onColor: "#EC0", offColor: "#000", fps: 25 }); |
|
|
|
|
(window as any)._mdDriver.load(() => Promise.resolve(file.toBuffer())); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// --- Load / Export -----------------------------------------------------------
|
|
|
|
|
@ -514,9 +514,10 @@ function drawPixelCanvas(canvas: HTMLCanvasElement, img: MonoFormatPixelImage) { |
|
|
|
|
interface PixelCanvasState { drawing: boolean; drawValue: number; } |
|
|
|
|
|
|
|
|
|
const PixelCanvas: m.Component<{ img: MonoFormatPixelImage; onpaint: () => void }, PixelCanvasState> = { |
|
|
|
|
drawing: false, |
|
|
|
|
drawValue: 1, |
|
|
|
|
|
|
|
|
|
oninit(vnode) { |
|
|
|
|
vnode.state.drawing = false; |
|
|
|
|
vnode.state.drawValue = 1; |
|
|
|
|
}, |
|
|
|
|
view({ attrs: { img, onpaint }, state }) { |
|
|
|
|
function pixelFromEvent(e: MouseEvent): { x: number; y: number } | null { |
|
|
|
|
const canvas = e.currentTarget as HTMLCanvasElement; |
|
|
|
|
@ -585,10 +586,10 @@ const PixelCanvas: m.Component<{ img: MonoFormatPixelImage; onpaint: () => void |
|
|
|
|
img.height = h; |
|
|
|
|
// then read imageData from the scaled offscreen canvas as before
|
|
|
|
|
img.pixels = new Uint8Array(w * h).map((_, i) => { |
|
|
|
|
const r = imageData.data[i * 4]; |
|
|
|
|
const g = imageData.data[i * 4 + 1]; |
|
|
|
|
const b = imageData.data[i * 4 + 2]; |
|
|
|
|
const a = imageData.data[i * 4 + 3]; |
|
|
|
|
const r = imageData.data[i * 4] || 0; |
|
|
|
|
const g = imageData.data[i * 4 + 1] || 0; |
|
|
|
|
const b = imageData.data[i * 4 + 2] || 0; |
|
|
|
|
const a = imageData.data[i * 4 + 3] || 0; |
|
|
|
|
// transparent = 0, dark pixels = 1, light pixels = 0
|
|
|
|
|
return a > 128 && (r * 299 + g * 587 + b * 114) < 128_000 ? 0 : 1; |
|
|
|
|
}); |
|
|
|
|
@ -623,8 +624,9 @@ const Image2DEditor: m.Component<{ si: number; ei: number; el: MonoFormatImage2D |
|
|
|
|
interface AnimationEditorState { activeFrame: number; } |
|
|
|
|
|
|
|
|
|
const AnimationEditor: m.Component<{ si: number; ei: number; el: MonoFormatAnimation }, AnimationEditorState> = { |
|
|
|
|
activeFrame: 0, |
|
|
|
|
|
|
|
|
|
oninit(vnode) { |
|
|
|
|
vnode.state.activeFrame = 0; |
|
|
|
|
}, |
|
|
|
|
view({ attrs: { si, ei, el }, state }) { |
|
|
|
|
const w = el.width || W; |
|
|
|
|
const h = el.height || H; |
|
|
|
|
@ -667,7 +669,7 @@ const AnimationEditor: m.Component<{ si: number; ei: number; el: MonoFormatAnima |
|
|
|
|
m("button.add-el", { onclick: addFrame }, "+ frame"), |
|
|
|
|
), |
|
|
|
|
m("div", { key: state.activeFrame }, |
|
|
|
|
m(PixelCanvas, { |
|
|
|
|
m(PixelCanvas as any, { |
|
|
|
|
img: frame, |
|
|
|
|
onpaint: () => { markDirty(); triggerPreview(); }, |
|
|
|
|
}), |
|
|
|
|
|