" + text + ""); + } + + public static void downloadFileWithName(String str, byte[] dat) { + MemoryStack.push(); + try { + downloadFileWithNameTeaVM(BetterJSStringConverter.stringToJS(str), WASMGCDirectArrayConverter.byteArrayToStackU8Array(dat)); + }finally { + MemoryStack.pop(); + } + } + + @Import(module = "platformApplication", name = "downloadFileWithNameU8") + public static native void downloadFileWithNameTeaVM(JSString str, Uint8Array dat); + + @Import(module = "platformApplication", name = "downloadFileWithNameA") + public static native void downloadFileWithNameTeaVM(JSString str, ArrayBuffer dat); + + private static final DateFormat dateFormatSS = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss"); + + @JSBody(params = { }, script = "return { willReadFrequently: true };") + static native JSObject youEagler(); + + public static String saveScreenshot() { + PlatformOpenGL._wglBindFramebuffer(0x8D40, null); + int w = PlatformInput.getWindowWidth(); + int h = PlatformInput.getWindowHeight(); + ByteBuffer buf = PlatformRuntime.allocateByteBuffer(w * h * 4); + PlatformOpenGL._wglReadPixels(0, 0, w, h, 6408, 5121, buf); + for(int i = 3, l = buf.remaining(); i < l; i += 4) { + buf.put(i, (byte)0xFF); + } + String name = "screenshot_" + dateFormatSS.format(new Date()).toString() + ".png"; + HTMLCanvasElement copyCanvas = (HTMLCanvasElement) Window.current().getDocument().createElement("canvas"); + copyCanvas.setWidth(w); + copyCanvas.setHeight(h); + CanvasRenderingContext2D ctx = (CanvasRenderingContext2D) copyCanvas.getContext("2d", youEagler()); + ImageData imgData = ctx.createImageData(w, h); + Uint8ClampedArray dest = imgData.getData(); + int ww = w * 4; + for(int i = 0, j; i < h; ++i) { + j = (h - i - 1) * ww; + buf.limit(j + ww); + buf.position(j); + dest.set(WASMGCBufferAllocator.getUnsignedClampedByteBufferView(buf), i * ww); + } + ctx.putImageData(imgData, 0, 0); + PlatformRuntime.freeByteBuffer(buf); + downloadScreenshotWithNameTeaVM(BetterJSStringConverter.stringToJS(name), copyCanvas); + return name; + } + + @Import(module = "platformApplication", name = "downloadScreenshot") + private static native void downloadScreenshotWithNameTeaVM(JSString str, HTMLCanvasElement cvs); + + @Import(module = "platformApplication", name = "showDebugConsole") + public static native void showDebugConsole(); + + public static void addLogMessage(String text, boolean err) { + } + + @Import(module = "platformApplication", name = "isShowingDebugConsole") + public static native boolean isShowingDebugConsole(); + + @JSBody(params = { "str" }, script = "window.minecraftServer = str;") + public static native void setMCServerWindowGlobal(String str); + +} \ No newline at end of file diff --git a/src/wasm-gc-teavm/java/net/lax1dude/eaglercraft/internal/PlatformAssets.java b/src/wasm-gc-teavm/java/net/lax1dude/eaglercraft/internal/PlatformAssets.java new file mode 100644 index 0000000..42560ad --- /dev/null +++ b/src/wasm-gc-teavm/java/net/lax1dude/eaglercraft/internal/PlatformAssets.java @@ -0,0 +1,226 @@ +/* + * Copyright (c) 2022-2024 lax1dude. All Rights Reserved. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +package net.lax1dude.eaglercraft.internal; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.teavm.interop.Address; +import org.teavm.interop.Import; +import org.teavm.interop.Unmanaged; +import org.teavm.jso.JSObject; +import org.teavm.jso.JSProperty; +import org.teavm.jso.core.JSString; +import org.teavm.jso.typedarrays.Uint8Array; +import org.teavm.jso.typedarrays.Uint8ClampedArray; + +import net.lax1dude.eaglercraft.EaglerInputStream; +import net.lax1dude.eaglercraft.internal.buffer.ByteBuffer; +import net.lax1dude.eaglercraft.internal.buffer.MemoryStack; +import net.lax1dude.eaglercraft.internal.buffer.WASMGCBufferAllocator; +import net.lax1dude.eaglercraft.internal.buffer.WASMGCDirectArrayConverter; +import net.lax1dude.eaglercraft.internal.wasm_gc_teavm.BetterJSStringConverter; +import net.lax1dude.eaglercraft.internal.wasm_gc_teavm.ClientMain; +import net.lax1dude.eaglercraft.internal.wasm_gc_teavm.EPKLoader; +import net.lax1dude.eaglercraft.opengl.ImageData; + +public class PlatformAssets { + + static final Logger logger = LogManager.getLogger("PlatformAssets"); + public static Map