Mercurial > hg > forks > multipaint-js
diff files.pde @ 195:b36cfb497223
Move file related functions to files.pde
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Thu, 23 Aug 2018 20:23:46 +0300 |
parents | |
children | dffdbdb4ded6 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/files.pde Thu Aug 23 20:23:46 2018 +0300 @@ -0,0 +1,258 @@ +boolean mpHaveLocalStorage() +{ + var test = 'mpLSTest'; + try { + localStorage.setItem(test, test); + if (localStorage.getItem(test) == test) + { + localStorage.removeItem(test); + return true; + } + } + catch (e) { + return false; + } + return false; +} + + +function mpLoadFileSelector(fmtname, fmtexts, fcallback) +{ + var mpUI = stGE("mpUI"); + if (mpUI) + { + stClearChildren(mpUI); + mpUI.style.background = "red"; + mpUI.style.padding = "0.5em"; + + mobj = stCE("input", "mpFileSelector"); + mobj.type = "file"; + mobj.name = "name"; + mobj.multiple = false; + + if (fmtexts != null) + mobj.accept = fmtexts; + + stAddEventOb(mobj.name, mobj, "change", + function(evt) + { + var files = evt.target.files; + if (files.length > 0) + { + var freader = new FileReader(); + + freader.onloadend = (function(theFile) { + fcallback(theFile, new Uint8Array(freader.result)); + }); + + freader.readAsArrayBuffer(files[0]); + } + stClearChildren(mpUI); + mpUI.style.background = null; + }); + + mpUI.appendChild(mobj); + + mobj = stCE("span", "mpFileInfo"); + mobj.innerHTML = "Load / import an '<b>"+ fmtname +"</b>' file."; + mpUI.appendChild(mobj); + } + else + return null; +} + + +// +// Basically the same as Processing loadBytes(), but it seems +// that Processing.JS's loadBytes() is broken at least in v1.4.8 +// and does not return byte-clean data. So roll a replacement of +// our own design. --ccr +// +byte[] mpLoadBinaryFile(String url) +{ + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.overrideMimeType("text/plain; charset=x-user-defined"); + xhr.setRequestHeader("If-Modified-Since", "Fri, 01 Jan 1960 00:00:00 GMT"); + xhr.send(null); + + if (xhr.status !== 200 && xhr.status !== 0) + return null; + + var string = xhr.responseText; + byte[] ret = new byte[string.length]; + + for (var i = 0; i < string.length; i++) + { + ret[i] = string.charCodeAt(i) & 0xff; + } + + return ret; +} + + +Blob mpMakeBinaryBlob(byte[] data) +{ + var blob = null; + if (data == null) + return null; + + if (typeof(data) == "string") + blob = new Blob([data], {type: "application/octet-stream"}); + else + if (typeof(data) == "object") + blob = new Blob([new Uint8Array(data)], {type: "application/octet-stream"}); + + return blob; +} + + +// +// "Save" a byte array to file. Basically creates a blob URI +// and dumps it in the DOM, giving user a download. +// +boolean mpSaveBinaryFile(String name, byte[] data) +{ + var blob = mpMakeBinaryBlob(data); + if (blob == null) + { + console.log("Could not create BLOB from data."); + return false; + } + + var url = window.URL.createObjectURL(blob); + if (url == null) + { + console.log("Could not create URL from BLOB object."); + return false; + } + + var alink = stCE("a"); + var mpUI = stGE("mpUI"); + stClearChildren(mpUI); + mpUI.appendChild(alink); + + alink.style = "display: none"; + alink.href = url; + alink.download = name; + alink.click(); + + window.URL.revokeObjectURL(url); + return true; +} + + +// bordh/v = 64, 32, omag = 1 +void mpSavePNGImage(String name, int fmt, boolean border, int bordh, int bordv, int omag) +{ + PImage simg = mpRenderImage(border, bordh, bordv, omag); +// if (g_data[int('Q')] == 0) + + if (simg !== null) + { + // XXX TODO .. actually save the image, something like .. + //simg.canvas.toBlob(function(idata){ mpSaveBinaryFile(name, idata); }, "image/png", 0.95); + } +} + + +int mpLoadPNGImage(String name) +{ + PImage simg = null; + if (simg == null) + return -1; + + int lefth = g_farge; + int righth = g_backg; + storeparameters(); + + g_data[int('d')] = 0; + g_data[int('t')] = 0; + g_data[int('b')] = 1; //old IQ + + if (!mpImportFromImage(simg)) + return -2; + + restoreparameters(); + refreshpalette(); + refresh(); + g_boxreconstruct = 2; + selectcolor(0, lefth); + selectcolor(1, righth); + return 0; +} + + +byte[] mpGetNativeImage() +{ + //save the picture page g_map[], make sure some essential parameters are correct + g_map[3] = byte(g_machine); + g_map[5] = byte(MX); + g_map[7] = byte(MY); + + return g_map; +} + + +int mpSetNativeImage(byte[] data, boolean noError) +{ + if (data == null) + return -1; + + if (data[3] != g_machine && !noError) + return -2; + + store_undo(); + + g_map = data; + + refreshpalette(); + consistency(); + g_farge = int(g_realfront); + g_ofarge = g_farge; + g_backg = int(g_realback); + sussborder(); + + return 0; +} + + +int mpLoadNativeImage(String name, boolean noError) +{ + return mpSetNativeImage( + mpLoadBinaryFile(name), noError); +} + + +boolean mpLoadPalette(String fname) +{ + if (g_map[13] != C64) + { + return false; + } + + byte fdata[] = mpLoadbinaryFile(fname); + if (fdata == null || + fdata.length != 772 || + fdata[0x301] != byte(0x10) || + fdata[0x302] != byte(0xff) || + fdata[0x303] != byte(0xff)) + { + return false; + } + + for (int n = 0; n < 16; n++) + { + makecolor(n, + int(fdata[n * 3]), + int(fdata[n * 3 + 1]), + int(fdata[n * 3 + 2])); + } + + mpSetUIColors(); + + sussborder(); + refresh_all(); + + return true; +}