From 6d11bae649a8891d921ef97a326376a5e70276a2 Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 11 Jan 2024 08:25:06 -0300 Subject: [PATCH 001/114] update action --- .github/workflows/build_and_upload.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_and_upload.yml b/.github/workflows/build_and_upload.yml index 36ee332c..030c4594 100644 --- a/.github/workflows/build_and_upload.yml +++ b/.github/workflows/build_and_upload.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@0.9.1 + uses: styfle/cancel-workflow-action@0.12.0 with: access_token: ${{ github.token }} From cd9988343796791735d3cf3668abde815c143dae Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 11 Jan 2024 08:33:59 -0300 Subject: [PATCH 002/114] update get version code --- buildSrc/src/main/kotlin/Dependencies.kt | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 8498521e..dbd1f4f9 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -19,15 +19,22 @@ object LibExt { } private fun getVersion(): String { - val file = File("gradle.properties") - val properties = Properties() - properties.load(file.inputStream()) - val version = properties.getProperty("version") - - val isRelease = System.getenv("RELEASE") + val isReleaseStr = System.getenv("RELEASE") + val isRelease = isReleaseStr != null && isReleaseStr.toBoolean() var libVersion = "-SNAPSHOT" - if(isRelease != null && isRelease.toBoolean()) { - libVersion = version + val file = File("gradle.properties") + if(file.exists()) { + val properties = Properties() + properties.load(file.inputStream()) + val version = properties.getProperty("version") + if(isRelease) { + libVersion = version + } + } + else { + if(isRelease) { + throw RuntimeException("properties should exist") + } } println("gdx-teavm Version: $libVersion") return libVersion From 522916a75df894a4edc726a36682e5072b5bc228 Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 11 Jan 2024 08:35:07 -0300 Subject: [PATCH 003/114] update get version code --- buildSrc/src/main/kotlin/Dependencies.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index dbd1f4f9..2b146d84 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -36,6 +36,6 @@ private fun getVersion(): String { throw RuntimeException("properties should exist") } } - println("gdx-teavm Version: $libVersion") + println("Lib Version: $libVersion") return libVersion } \ No newline at end of file From 5023d4c3c2050e509ffea32dd027b378e93919ce Mon Sep 17 00:00:00 2001 From: Natan Date: Sun, 3 Mar 2024 21:08:22 -0300 Subject: [PATCH 004/114] wip add resource files --- .../gdx/backends/teavm/config/AssetsCopy.java | 6 +- .../gdx/backends/teavm/config/TeaBuilder.java | 69 ++++++++++--------- 2 files changed, 38 insertions(+), 37 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java index aaefa09e..6841e704 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java @@ -42,10 +42,10 @@ public Asset(FileWrapper file, AssetType type) { } public static void copy(ArrayList assetsPaths, AssetFilter filter, String assetsOutputPath, boolean generateTextFile) { - copy(null, null, assetsPaths, null, assetsOutputPath, generateTextFile); + copy(null, null, assetsPaths, null, assetsOutputPath, generateTextFile, false); } - public static void copy(TeaClassLoader classloader, List classPathAssetsFiles, ArrayList assetsPaths, AssetFilter filter, String assetsOutputPath, boolean generateTextFile) { + public static void copy(TeaClassLoader classloader, List classPathAssetsFiles, ArrayList assetsPaths, AssetFilter filter, String assetsOutputPath, boolean generateTextFile, boolean append) { assetsOutputPath = assetsOutputPath.replace("\\", "/"); FileWrapper target = new FileWrapper(assetsOutputPath); ArrayList assets = new ArrayList(); @@ -132,7 +132,7 @@ public static void copy(TeaClassLoader classloader, List classPathAssets buffer.append(mimetype == null ? "application/unknown" : mimetype); buffer.append("\n"); } - target.child(bundle.getKey() + ".txt").writeString(buffer.toString(), false); + target.child(bundle.getKey() + ".txt").writeString(buffer.toString(), append); } } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java index bff62914..82c758e6 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java @@ -347,37 +347,38 @@ private static void configClasspath(TeaBuildConfiguration configuration, ArrayLi } private static void assetsDefaultClasspath(ArrayList filePath) { - filePath.add("com/badlogic/gdx/graphics/g3d/particles/"); - filePath.add("com/badlogic/gdx/graphics/g3d/shaders/"); - filePath.add("com/badlogic/gdx/utils/arial-15.fnt"); // Cannot be utils folder for now because its trying to copy from emu folder and not core gdx classpath - filePath.add("com/badlogic/gdx/utils/arial-15.png"); - - filePath.add("com/badlogic/gdx/utils/lsans-15.fnt"); - filePath.add("com/badlogic/gdx/utils/lsans-15.png"); - - filePath.add("net/mgsx/gltf/shaders/brdfLUT.png"); - filePath.add("net/mgsx/gltf/shaders/default.fs.glsl"); - filePath.add("net/mgsx/gltf/shaders/default.vs.glsl"); - filePath.add("net/mgsx/gltf/shaders/gdx-pbr.vs.glsl"); - filePath.add("net/mgsx/gltf/shaders/gdx-pbr.fs.glsl"); - filePath.add("net/mgsx/gltf/shaders/depth.fs.glsl"); - filePath.add("net/mgsx/gltf/shaders/depth.vs.glsl"); - filePath.add("net/mgsx/gltf/shaders/emissive-only.fs"); - filePath.add("net/mgsx/gltf/shaders/ibl-sun.fs.glsl"); - filePath.add("net/mgsx/gltf/shaders/ibl-sun.vs.glsl"); - filePath.add("net/mgsx/gltf/shaders/skybox.fs.glsl"); - filePath.add("net/mgsx/gltf/shaders/skybox.vs.glsl"); - filePath.add("net/mgsx/gltf/shaders/pbr/compat.fs.glsl"); - filePath.add("net/mgsx/gltf/shaders/pbr/compat.vs.glsl"); - filePath.add("net/mgsx/gltf/shaders/pbr/env.glsl"); - filePath.add("net/mgsx/gltf/shaders/pbr/functions.glsl"); - filePath.add("net/mgsx/gltf/shaders/pbr/ibl.glsl"); - filePath.add("net/mgsx/gltf/shaders/pbr/iridescence.glsl"); - filePath.add("net/mgsx/gltf/shaders/pbr/lights.glsl"); - filePath.add("net/mgsx/gltf/shaders/pbr/material.glsl"); - filePath.add("net/mgsx/gltf/shaders/pbr/pbr.fs.glsl"); - filePath.add("net/mgsx/gltf/shaders/pbr/pbr.vs.glsl"); - filePath.add("net/mgsx/gltf/shaders/pbr/shadows.glsl"); + //TODO remove if its working correctly without these assets +// filePath.add("com/badlogic/gdx/graphics/g3d/particles/"); +// filePath.add("com/badlogic/gdx/graphics/g3d/shaders/"); +// filePath.add("com/badlogic/gdx/utils/arial-15.fnt"); // Cannot be utils folder for now because its trying to copy from emu folder and not core gdx classpath +// filePath.add("com/badlogic/gdx/utils/arial-15.png"); +// +// filePath.add("com/badlogic/gdx/utils/lsans-15.fnt"); +// filePath.add("com/badlogic/gdx/utils/lsans-15.png"); + +// filePath.add("net/mgsx/gltf/shaders/brdfLUT.png"); +// filePath.add("net/mgsx/gltf/shaders/default.fs.glsl"); +// filePath.add("net/mgsx/gltf/shaders/default.vs.glsl"); +// filePath.add("net/mgsx/gltf/shaders/gdx-pbr.vs.glsl"); +// filePath.add("net/mgsx/gltf/shaders/gdx-pbr.fs.glsl"); +// filePath.add("net/mgsx/gltf/shaders/depth.fs.glsl"); +// filePath.add("net/mgsx/gltf/shaders/depth.vs.glsl"); +// filePath.add("net/mgsx/gltf/shaders/emissive-only.fs"); +// filePath.add("net/mgsx/gltf/shaders/ibl-sun.fs.glsl"); +// filePath.add("net/mgsx/gltf/shaders/ibl-sun.vs.glsl"); +// filePath.add("net/mgsx/gltf/shaders/skybox.fs.glsl"); +// filePath.add("net/mgsx/gltf/shaders/skybox.vs.glsl"); +// filePath.add("net/mgsx/gltf/shaders/pbr/compat.fs.glsl"); +// filePath.add("net/mgsx/gltf/shaders/pbr/compat.vs.glsl"); +// filePath.add("net/mgsx/gltf/shaders/pbr/env.glsl"); +// filePath.add("net/mgsx/gltf/shaders/pbr/functions.glsl"); +// filePath.add("net/mgsx/gltf/shaders/pbr/ibl.glsl"); +// filePath.add("net/mgsx/gltf/shaders/pbr/iridescence.glsl"); +// filePath.add("net/mgsx/gltf/shaders/pbr/lights.glsl"); +// filePath.add("net/mgsx/gltf/shaders/pbr/material.glsl"); +// filePath.add("net/mgsx/gltf/shaders/pbr/pbr.fs.glsl"); +// filePath.add("net/mgsx/gltf/shaders/pbr/pbr.vs.glsl"); +// filePath.add("net/mgsx/gltf/shaders/pbr/shadows.glsl"); } private static ACCEPT_STATE acceptPath(String path) { @@ -529,7 +530,7 @@ public static void configAssets(TeaClassLoader classLoader, TeaBuildConfiguratio boolean shouldUseDefaultHtmlIndex = configuration.shouldUseDefaultHtmlIndex(); if(shouldUseDefaultHtmlIndex) { - AssetsCopy.copy(classLoader, webappAssetsFiles, new ArrayList<>(), null, webappDirectory, false); + AssetsCopy.copy(classLoader, webappAssetsFiles, new ArrayList<>(), null, webappDirectory, false, false); TeaBuilder.log(""); } @@ -567,11 +568,11 @@ public static void configAssets(TeaClassLoader classLoader, TeaBuildConfiguratio ArrayList additionalAssetClasspath = configuration.getAdditionalAssetClasspath(); classPathAssetsFiles.addAll(additionalAssetClasspath); boolean generateAssetPaths = configuration.assetsPath(assetsPaths); - AssetsCopy.copy(classLoader, classPathAssetsFiles, assetsPaths, filter, assetsOutputPath, generateAssetPaths); + AssetsCopy.copy(classLoader, classPathAssetsFiles, assetsPaths, filter, assetsOutputPath, generateAssetPaths, false); // Copy assets from resources List resources = TeaVMResourceProperties.getResources(acceptedURL); - AssetsCopy.copy(classLoader, resources, null, null, assetsOutputPath, false); + AssetsCopy.copy(classLoader, resources, null, null, assetsOutputPath, true, true); TeaBuilder.log(""); } } From f7e04b9fa4b17ee778df224652939f871bd5f9a1 Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 5 Mar 2024 13:10:37 -0300 Subject: [PATCH 005/114] add pixel test --- .../gdx/examples/tests/PixelTest.java | 84 +++++++++++++++++++ .../teavm/launcher/TeaVMTestLauncher.java | 4 +- 2 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/PixelTest.java diff --git a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/PixelTest.java b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/PixelTest.java new file mode 100644 index 00000000..f0587c46 --- /dev/null +++ b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/PixelTest.java @@ -0,0 +1,84 @@ +package com.github.xpenatan.gdx.examples.tests; + +import com.badlogic.gdx.ApplicationListener; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.GL30; +import com.badlogic.gdx.graphics.Mesh; +import com.badlogic.gdx.graphics.OrthographicCamera; +import com.badlogic.gdx.graphics.VertexAttribute; +import com.badlogic.gdx.graphics.VertexAttributes; +import com.badlogic.gdx.graphics.glutils.ShaderProgram; +import com.badlogic.gdx.utils.ScreenUtils; + +public class PixelTest implements ApplicationListener { + + private static final String VERTEX = "" + + "attribute vec4 a_position; \n" + + "uniform mat4 u_projTrans; \n" + + + "void main() { \n" + + " gl_Position = u_projTrans * a_position; \n" + + "} "; + + private static final String FRAGMENT = "" + + "#ifdef GL_ES \n" + + "precision mediump float; \n" + + "#endif \n" + + + "uniform vec4 u_color; \n" + + + "void main() { \n" + + " gl_FragColor = u_color; \n" + + "}"; + + ShaderProgram shader; + Mesh pixelMesh; + + OrthographicCamera camera; + + @Override + public void create() { + camera = new OrthographicCamera(); + camera.setToOrtho(false); + this.shader = new ShaderProgram(VERTEX, FRAGMENT); + if(!shader.isCompiled()) { + System.out.println("ERRORR"); + } + this.pixelMesh = new Mesh(true, 1, 0, + new VertexAttribute(VertexAttributes.Usage.Position, 2, "a_position")); + } + + @Override + public void resize(int width, int height) { + + } + + @Override + public void render() { + int x = 100; + int y = 200; + + ScreenUtils.clear(0, 0, 0, 1); + shader.bind(); + shader.setUniformMatrix("u_projTrans", camera.combined); + Gdx.gl.glEnable(GL30.GL_BLEND); + shader.setUniformf("u_color", 0, 1, 0, 1); + pixelMesh.setVertices(new float[]{x,y}); + pixelMesh.render(shader, GL30.GL_POINTS); + } + + @Override + public void pause() { + + } + + @Override + public void resume() { + + } + + @Override + public void dispose() { + + } +} diff --git a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java index c2b135d6..016a4bd2 100644 --- a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java +++ b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java @@ -2,7 +2,7 @@ import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; -import com.github.xpenatan.gdx.examples.tests.TeaVMInputTest; +import com.github.xpenatan.gdx.examples.tests.PixelTest; public class TeaVMTestLauncher { @@ -12,6 +12,6 @@ public static void main(String[] args) { config.height = 0; // new TeaApplication(new GearsDemo(), config); // new TeaApplication(new ReadPixelsTest(), config); - new TeaApplication(new TeaVMInputTest(), config); + new TeaApplication(new PixelTest(), config); } } \ No newline at end of file From 88b7354fb7cce5fea15be507b0f62435d7aba186 Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 5 Mar 2024 13:11:05 -0300 Subject: [PATCH 006/114] update settings --- .../java/com/github/xpenatan/gdx/examples/desktop/Main.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/core/desktop/src/main/java/com/github/xpenatan/gdx/examples/desktop/Main.java b/examples/core/desktop/src/main/java/com/github/xpenatan/gdx/examples/desktop/Main.java index 0407fc71..f79fad0c 100644 --- a/examples/core/desktop/src/main/java/com/github/xpenatan/gdx/examples/desktop/Main.java +++ b/examples/core/desktop/src/main/java/com/github/xpenatan/gdx/examples/desktop/Main.java @@ -1,11 +1,11 @@ package com.github.xpenatan.gdx.examples.desktop; import com.badlogic.gdx.backends.lwjgl.LwjglApplication; -import com.github.xpenatan.gdx.examples.tests.ReadPixelsTest; +import com.github.xpenatan.gdx.examples.tests.PixelTest; public class Main { public static void main(String[] args) { - new LwjglApplication(new ReadPixelsTest()); + new LwjglApplication(new PixelTest()); } } From acd40fd6b35290ab994d9e33b164e7f52eb9ec0d Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 7 Mar 2024 12:41:00 -0300 Subject: [PATCH 007/114] fix drawing single pixel in angle --- .../java/com/github/xpenatan/gdx/examples/tests/PixelTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/PixelTest.java b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/PixelTest.java index f0587c46..c6bb9266 100644 --- a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/PixelTest.java +++ b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/PixelTest.java @@ -18,6 +18,7 @@ public class PixelTest implements ApplicationListener { "void main() { \n" + " gl_Position = u_projTrans * a_position; \n" + + " gl_PointSize = 1.0; \n" + // This is required to make it work in angle graphics "} "; private static final String FRAGMENT = "" + From e49e4df6deb9361c87d049b0416b5a58e65881b3 Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 13 Apr 2024 10:40:19 -0300 Subject: [PATCH 008/114] update settings includeBuild --- settings.gradle.kts | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index c7758fbf..b53421cd 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -27,29 +27,19 @@ include(":examples:freetype:teavm") // ######### // ######### Replace teavm libs to use teavm sources -// ######### Only use it if you want to test new teavm code. -// ######### Change to your teavm source directory +// ######### Only use it if you want to test teavm source code. +// ######### Change 'teavmPath' to your teavm source directory -//includeBuild("D:\\Dev\\Projects\\java\\teavm") { -// dependencySubstitution { -// substitute module('org.teavm:teavm-tooling') using project(':tools:core') -// substitute module('org.teavm:teavm-core') using project(':core') -// substitute module('org.teavm:teavm-classlib') using project(':classlib') -// substitute module('org.teavm:teavm-jso') using project(':jso:core') -// substitute module('org.teavm:teavm-jso-apis') using project(':jso:apis') -// substitute module('org.teavm:teavm-jso-impl') using project(':jso:impl') -// } -//} +//val teavmPath = "E:\\Dev\\Projects\\java\\teavm"; -//includeBuild("E:\\Dev\\Projects\\java\\gdx-imgui") { +//includeBuild(teavmPath) { // dependencySubstitution { -// substitute(module("com.github.xpenatan.gdx-imgui:core")).using(project(":imgui:core")) -// substitute(module("com.github.xpenatan.gdx-imgui:desktop")).using(project(":imgui:desktop")) -// substitute(module("com.github.xpenatan.gdx-imgui:teavm")).using(project(":imgui:teavm")) -// substitute(module("com.github.xpenatan.gdx-imgui:gdx")).using(project(":extensions:gdx")) -// substitute(module("com.github.xpenatan.gdx-imgui:imlayout-core")).using(project(":extensions:imlayout:imlayout-core")) -// substitute(module("com.github.xpenatan.gdx-imgui:imlayout-desktop")).using(project(":extensions:imlayout:imlayout-desktop")) -// substitute(module("com.github.xpenatan.gdx-imgui:gdx-frame-viewport")).using(project(":extensions:gdx-frame-viewport")) +// substitute(module("org.teavm:teavm-tooling")).using(project(":tools:core")) +// substitute(module("org.teavm:teavm-core")).using(project(":core")) +// substitute(module("org.teavm:teavm-classlib")).using(project(":classlib")) +// substitute(module("org.teavm:teavm-jso")).using(project(":jso:core")) +// substitute(module("org.teavm:teavm-jso-apis")).using(project(":jso:apis")) +// substitute(module("org.teavm:teavm-jso-impl")).using(project(":jso:impl")) // } //} From f68fcb2848f31dea1eb414dfd584f996b31db032 Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 23 Apr 2024 08:10:38 -0300 Subject: [PATCH 009/114] update snapshot to 0.10.0-dev-12 --- build.gradle.kts | 6 +++++- buildSrc/src/main/kotlin/Dependencies.kt | 2 +- .../gdx/examples/teavm/launcher/TeaVMTestLauncher.java | 5 +++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index f358d205..3190f447 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,8 +17,12 @@ subprojects { mavenCentral() maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots/") } maven { url = uri("https://oss.sonatype.org/content/repositories/releases/") } - maven { url = uri("https://oss.sonatype.org/content/repositories/releases/") } maven { url = uri("https://jitpack.io") } + + maven { + url = uri("http://teavm.org/maven/repository/") + setAllowInsecureProtocol(true) + } } configurations.configureEach { diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 2b146d84..6196096b 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -7,7 +7,7 @@ object LibExt { val libVersion: String = getVersion() const val gdxVersion = "1.12.1" - const val teaVMVersion = "0.9.2" + const val teaVMVersion = "0.10.0-dev-12" const val gdxImGuiVersion = "1.0.0-SNAPSHOT" const val gdxMultiViewVersion = "1.0.0-SNAPSHOT" diff --git a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java index 016a4bd2..d7292073 100644 --- a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java +++ b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java @@ -3,6 +3,7 @@ import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; import com.github.xpenatan.gdx.examples.tests.PixelTest; +import com.github.xpenatan.gdx.examples.tests.ReadPixelsTest; public class TeaVMTestLauncher { @@ -11,7 +12,7 @@ public static void main(String[] args) { config.width = 0; config.height = 0; // new TeaApplication(new GearsDemo(), config); -// new TeaApplication(new ReadPixelsTest(), config); - new TeaApplication(new PixelTest(), config); + new TeaApplication(new ReadPixelsTest(), config); +// new TeaApplication(new PixelTest(), config); } } \ No newline at end of file From 1a1235ce56baffa8619b576146c833c00b06720c Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 1 May 2024 17:29:56 -0300 Subject: [PATCH 010/114] update teavm version --- buildSrc/src/main/kotlin/Dependencies.kt | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 6196096b..2a6d3b43 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -7,7 +7,7 @@ object LibExt { val libVersion: String = getVersion() const val gdxVersion = "1.12.1" - const val teaVMVersion = "0.10.0-dev-12" + const val teaVMVersion = "0.10.0" const val gdxImGuiVersion = "1.0.0-SNAPSHOT" const val gdxMultiViewVersion = "1.0.0-SNAPSHOT" diff --git a/gradle.properties b/gradle.properties index 0cb8670e..67ff577c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version=1.0.0-b9 \ No newline at end of file +version=1.0.0-b10 \ No newline at end of file From ff078b6e2c4b4ba2995eec077e3826c2c4be5db3 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 8 May 2024 21:17:58 -0300 Subject: [PATCH 011/114] Breaking stuff. Use native Gdx2DPixmap, Add more gdx tests. update wasm. --- CHANGES.md | 2 + .../com/badlogic/gdx/graphics/PixmapEmu.java | 476 +------- backends/backend-teavm/jni/CMakeLists.txt | 1 + .../gdx/backends/teavm/TeaApplication.java | 4 +- .../teavm/TeaApplicationConfiguration.java | 5 - .../gdx/backends/teavm/TeaCursor.java | 61 +- .../xpenatan/gdx/backends/teavm/TeaGL20.java | 103 +- .../xpenatan/gdx/backends/teavm/TeaGL30.java | 109 +- .../gdx/backends/teavm/TeaGraphics.java | 3 - .../teavm/dom/typedarray/TypedArrays.java | 12 + .../src/main/resources/gdx.wasm.js | 83 +- .../src/main/resources/gdx.wasm.wasm | Bin 131771 -> 0 bytes .../examples/teavm/BuildTeaVMTestDemo.java | 3 +- .../teavm/launcher/TeaVMTestLauncher.java | 1 + .../gdx/examples/teavm/BuildFreetypeTest.java | 2 + .../com/badlogic/gdx/tests/TeaVMGdxTests.java | 1001 +++++------------ .../example/tests/imgui/ImGuiTestsApp.java | 4 +- .../badlogic/gdx/graphics/FreeTypePixmap.java | 49 - .../{FreeType.java => FreeTypeEmu.java} | 159 +-- .../g2d/freetype/FreeTypeFontGenerator.java | 912 --------------- .../freetype/FreeTypeFontGeneratorLoader.java | 63 -- .../g2d/freetype/FreetypeFontLoader.java | 55 - 22 files changed, 607 insertions(+), 2501 deletions(-) delete mode 100644 backends/backend-teavm/src/main/resources/gdx.wasm.wasm delete mode 100644 extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/FreeTypePixmap.java rename extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/{FreeType.java => FreeTypeEmu.java} (87%) delete mode 100644 extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeFontGenerator.java delete mode 100644 extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeFontGeneratorLoader.java delete mode 100644 extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreetypeFontLoader.java diff --git a/CHANGES.md b/CHANGES.md index 2bc3db43..9c4b7ea6 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,6 @@ [1.0.0-SNAPSHOT] +- Update teavm to 0.10.0 +- Pixmap now use Gdx2DPixmap [1.0.0-b9] - add TeaClassFilter printAllowedClasses() and printExcludedClasses() diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java index 34b72912..5de572db 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java @@ -2,6 +2,7 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.g2d.Gdx2DPixmap; import com.badlogic.gdx.graphics.g2d.Gdx2DPixmapEmu; import com.badlogic.gdx.utils.BufferUtils; import com.badlogic.gdx.utils.Disposable; @@ -22,12 +23,14 @@ import com.github.xpenatan.gdx.backends.teavm.dom.impl.TeaWindow; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Uint8ArrayWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Uint8ClampedArrayWrapper; import com.github.xpenatan.gdx.backends.teavm.gen.Emulate; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloader; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetType; import com.github.xpenatan.gdx.backends.teavm.preloader.Blob; +import java.io.IOException; import java.nio.ByteBuffer; import org.teavm.classlib.java.nio.ArrayBufferUtil; import org.teavm.jso.JSBody; @@ -82,19 +85,10 @@ public static int toGlType (FormatEmu format) { int width; int height; - HTMLCanvasElementWrapper canvas; - CanvasRenderingContext2DWrapper context; int id; ByteBuffer buffer; - int r = 255, g = 255, b = 255; - float a; - String colorStr = make(r, g, b, a); - static String clearColor = make(255, 255, 255, 1.0f); BlendingEmu blending = PixmapEmu.BlendingEmu.SourceOver; FilterEmu filter = PixmapEmu.FilterEmu.BiLinear; - public Uint8ClampedArrayWrapper pixels; - private HTMLImageElementWrapper imageElement; - private HTMLVideoElementWrapper videoElement; private int color = 0; private Gdx2DPixmapEmu nativePixmap; @@ -123,91 +117,53 @@ public PixmapEmu(FileHandle file) { String path = webFileHandler.path(); Blob object = webFileHandler.preloader.images.get(path); - TeaApplication app = (TeaApplication)Gdx.app; - TeaApplicationConfiguration config = app.getConfig(); - if(config.useNativePixmap) { - Int8ArrayWrapper response = object.getData(); - byte[] bytes = Gdx2DPixmapEmu.get(response); - nativePixmap = new Gdx2DPixmapEmu(bytes, 0, bytes.length, 0); - initPixmapEmu(-1, -1, null, null); - } - else { - HTMLImageElementWrapper htmlImageElement = object.getImage(); - initPixmapEmu(-1, -1, htmlImageElement, null); - if(imageElement == null) - throw new GdxRuntimeException("Couldn't load image '" + file.path() + "', file does not exist"); - } + Int8ArrayWrapper response = object.getData(); + byte[] bytes = Gdx2DPixmapEmu.get(response); + nativePixmap = new Gdx2DPixmapEmu(bytes, 0, bytes.length, 0); + initPixmapEmu(-1, -1, null, null); } public PixmapEmu(HTMLImageElementWrapper img) { this(-1, -1, img); } - public PixmapEmu(HTMLVideoElementWrapper vid) { - this(-1, -1, vid); + public PixmapEmu(byte[] encodedData, int offset, int len) { + nativePixmap = new Gdx2DPixmapEmu(encodedData, offset, len, 0); + initPixmapEmu(-1, -1, null, null); } - public PixmapEmu(byte[] encodedData, int offset, int len) { - TeaApplication app = (TeaApplication)Gdx.app; - TeaApplicationConfiguration config = app.getConfig(); - if(config.useNativePixmap) { + public PixmapEmu(ByteBuffer encodedData, int offset, int len) { + if (!encodedData.isDirect()) throw new GdxRuntimeException("Couldn't load pixmap from non-direct ByteBuffer"); + try { nativePixmap = new Gdx2DPixmapEmu(encodedData, offset, len, 0); initPixmapEmu(-1, -1, null, null); + } catch (IOException e) { + throw new GdxRuntimeException("Couldn't load pixmap from image data", e); } } public PixmapEmu(int width, int height, FormatEmu format) { + nativePixmap = new Gdx2DPixmapEmu(width, height, PixmapEmu.FormatEmu.toGdx2DPixmapFormat(format)); initPixmapEmu(width, height, null, null); } + //TODO remove private PixmapEmu(int width, int height, HTMLImageElementWrapper imageElement) { initPixmapEmu(width, height, imageElement, null); } - private PixmapEmu(int width, int height, HTMLVideoElementWrapper videoElement) { - initPixmapEmu(width, height, null, videoElement); - } - private void initPixmapEmu(int width, int height, HTMLImageElementWrapper imageElement, HTMLVideoElementWrapper videoElement) { - if(videoElement != null) { - this.videoElement = videoElement; - this.width = videoElement.getWidth(); - this.height = videoElement.getHeight(); - } - else if(imageElement != null) { - this.imageElement = imageElement; - this.width = imageElement.getWidth(); - this.height = imageElement.getHeight(); + this.width = width; + this.height = height; + + if(nativePixmap != null) { + Uint8ArrayWrapper nativePixels = nativePixmap.getPixels(); + byte[] byteArray = TypedArrays.toByteArray(nativePixels); + buffer = ByteBuffer.wrap(byteArray); } else { - this.width = width; - this.height = height; + throw new GdxRuntimeException("NOT SUPPORTED PIXMAP"); } - - buffer = BufferUtils.newByteBuffer(4); - id = TeaGraphics.nextId++; - buffer.putInt(0, id); - TeaGraphics.pixmaps.put(id, this); - } - - private void create() { - TeaWindow window = TeaWindow.get(); - DocumentWrapper document = window.getDocument(); - ElementWrapper createElement = document.createElement("canvas"); - canvas = (HTMLCanvasElementWrapper)createElement; - canvas.setWidth(width); - canvas.setHeight(height); - context = (CanvasRenderingContext2DWrapper)canvas.getContext("2d"); - context.setGlobalCompositeOperation(getComposite().toString()); - } - - public CanvasRenderingContext2DWrapper getContext() { - ensureCanvasExists(); - return context; - } - - private static Composite getComposite() { - return Composite.SOURCE_OVER; } public static String make(int r2, int g2, int b2, float a2) { @@ -215,48 +171,8 @@ public static String make(int r2, int g2, int b2, float a2) { } public HTMLCanvasElementWrapper getCanvasElement() { - ensureCanvasExists(); - return canvas; - } - - private void ensureCanvasExists() { - if(canvas == null) { - create(); - if(imageElement != null) { - context.setGlobalCompositeOperation(Composite.COPY.getValue()); - context.drawImage(imageElement, 0, 0); - context.setGlobalCompositeOperation(getComposite().getValue()); - } - if(videoElement != null) { - context.setGlobalCompositeOperation(Composite.COPY.getValue()); - context.drawImage(videoElement, 0, 0); - context.setGlobalCompositeOperation(getComposite().getValue()); - } - } - } - - public boolean canUsePixmapData() { - return canvas == null && nativePixmap != null; - } - - public Uint8ArrayWrapper getPixmapData() { - return nativePixmap.getPixels(); - } - - public boolean canUseImageElement() { - return canvas == null && imageElement != null; - } - - public HTMLImageElementWrapper getImageElement() { - return imageElement; - } - - public boolean canUseVideoElement() { - return canvas == null && videoElement != null; - } - - public HTMLVideoElementWrapper getVideoElement() { - return videoElement; + //TODO remove + return null; } /** @@ -265,19 +181,7 @@ public HTMLVideoElementWrapper getVideoElement() { * @param color the color, encoded as RGBA8888 */ public void setColor(int color) { - if(nativePixmap != null) { - this.color = color; - } - else { - ensureCanvasExists(); - r = (color >>> 24) & 0xff; - g = (color >>> 16) & 0xff; - b = (color >>> 8) & 0xff; - a = (color & 0xff) / 255f; - this.colorStr = make(r, g, b, a); - context.setFillStyle(this.colorStr); - context.setStrokeStyle(this.colorStr); - } + this.color = color; } /** @@ -289,19 +193,7 @@ public void setColor(int color) { * @param a The alpha component. */ public void setColor(float r, float g, float b, float a) { - if(nativePixmap != null) { - this.color = Color.rgba8888(r, g, b, a); - } - else { - ensureCanvasExists(); - this.r = (int)(r * 255); - this.g = (int)(g * 255); - this.b = (int)(b * 255); - this.a = a; - colorStr = make(this.r, this.g, this.b, this.a); - context.setFillStyle(colorStr); - context.setStrokeStyle(this.colorStr); - } + this.color = Color.rgba8888(r, g, b, a); } /** @@ -317,14 +209,7 @@ public void setColor(Color color) { * Fills the complete bitmap with the currently set color. */ public void fill() { - if(nativePixmap != null) { - nativePixmap.clear(color); - } - else { - ensureCanvasExists(); - context.clearRect(0, 0, getWidth(), getHeight()); - rectangle(0, 0, getWidth(), getHeight(), DrawType.FILL); - } + nativePixmap.clear(color); } // /** @@ -343,12 +228,7 @@ public void fill() { * @param y2 The y-coordinate of the first point */ public void drawLine(int x, int y, int x2, int y2) { - if(nativePixmap != null) { - nativePixmap.drawLine(x, y, x2, y2, color); - } - else { - line(x, y, x2, y2, DrawType.STROKE); - } + nativePixmap.drawLine(x, y, x2, y2, color); } /** @@ -361,12 +241,7 @@ public void drawLine(int x, int y, int x2, int y2) { * @param height The height in pixels */ public void drawRectangle(int x, int y, int width, int height) { - if(nativePixmap != null) { - nativePixmap.drawRect(x, y, width, height, color); - } - else { - rectangle(x, y, width, height, DrawType.STROKE); - } + nativePixmap.drawRect(x, y, width, height, color); } /** @@ -377,111 +252,49 @@ public void drawRectangle(int x, int y, int width, int height) { * @param y The target y-coordinate (top left corner) */ public void drawPixmap(PixmapEmu pixmap, int x, int y) { - if(nativePixmap != null) { - drawPixmap(pixmap, x, y, 0, 0, pixmap.getWidth(), pixmap.getHeight()); - } - else { - HTMLCanvasElementWrapper image = pixmap.getCanvasElement(); - image(image, 0, 0, image.getWidth(), image.getHeight(), x, y, image.getWidth(), image.getHeight()); - } + drawPixmap(pixmap, x, y, 0, 0, pixmap.getWidth(), pixmap.getHeight()); } public void drawPixmap(PixmapEmu pixmap, int x, int y, int srcx, int srcy, int srcWidth, int srcHeight) { - if(nativePixmap != null) { - this.nativePixmap.drawPixmap(pixmap.nativePixmap, srcx, srcy, x, y, srcWidth, srcHeight); - } - else { - HTMLCanvasElementWrapper image = pixmap.getCanvasElement(); - image(image, srcx, srcy, srcWidth, srcHeight, x, y, srcWidth, srcHeight); - } + nativePixmap.drawPixmap(pixmap.nativePixmap, srcx, srcy, x, y, srcWidth, srcHeight); } public void drawPixmap(PixmapEmu pixmap, int srcx, int srcy, int srcWidth, int srcHeight, int dstx, int dsty, int dstWidth, int dstHeight) { - if(nativePixmap != null) { - this.nativePixmap.drawPixmap(pixmap.nativePixmap, srcx, srcy, srcWidth, srcHeight, dstx, dsty, dstWidth, dstHeight); - } - else { - image(pixmap.getCanvasElement(), srcx, srcy, srcWidth, srcHeight, dstx, dsty, dstWidth, dstHeight); - } + nativePixmap.drawPixmap(pixmap.nativePixmap, srcx, srcy, srcWidth, srcHeight, dstx, dsty, dstWidth, dstHeight); } public void fillRectangle(int x, int y, int width, int height) { - if(nativePixmap != null) { - nativePixmap.fillRect(x, y, width, height, color); - } - else { - rectangle(x, y, width, height, DrawType.FILL); - } + nativePixmap.fillRect(x, y, width, height, color); } public void drawCircle(int x, int y, int radius) { - if(nativePixmap != null) { - nativePixmap.drawCircle(x, y, radius, color); - } - else { - circle(x, y, radius, DrawType.STROKE); - } + nativePixmap.drawCircle(x, y, radius, color); } public void fillCircle(int x, int y, int radius) { - if(nativePixmap != null) { - nativePixmap.fillCircle(x, y, radius, color); - } - else { - circle(x, y, radius, DrawType.FILL); - } + nativePixmap.fillCircle(x, y, radius, color); } public void fillTriangle(int x1, int y1, int x2, int y2, int x3, int y3) { - if(nativePixmap != null) { - nativePixmap.fillTriangle(x1, y1, x2, y2, x3, y3, color); - } - else { - triangle(x1, y1, x2, y2, x3, y3, DrawType.FILL); - } + nativePixmap.fillTriangle(x1, y1, x2, y2, x3, y3, color); } public int getPixel(int x, int y) { - if(nativePixmap != null) { - return nativePixmap.getPixel(x, y); - } - else { - ensureCanvasExists(); - if(pixels == null) pixels = context.getImageData(0, 0, width, height).getData(); - int i = x * 4 + y * width * 4; - int r = pixels.get(i + 0) & 0xff; - int g = pixels.get(i + 1) & 0xff; - int b = pixels.get(i + 2) & 0xff; - int a = pixels.get(i + 3) & 0xff; - return (r << 24) | (g << 16) | (b << 8) | (a); - } + return nativePixmap.getPixel(x, y); } public int getWidth() { - if(nativePixmap != null) { - return nativePixmap.getWidth(); - } - else { - return width; - } + return nativePixmap.getWidth(); } public int getHeight() { - if(nativePixmap != null) { - return nativePixmap.getHeight(); - } - else { - return height; - } + return nativePixmap.getHeight(); } @Override public void dispose() { if (disposed) throw new GdxRuntimeException("Pixmap already disposed!"); - TeaGraphics.pixmaps.remove(id); - if(nativePixmap != null) { - nativePixmap.dispose(); - } + nativePixmap.dispose(); disposed = true; } @@ -490,73 +303,37 @@ public boolean isDisposed () { } public void drawPixel(int x, int y) { - if(nativePixmap != null) { - nativePixmap.setPixel(x, y, color); - } - else { - rectangle(x, y, 1, 1, DrawType.FILL); - } + nativePixmap.setPixel(x, y, color); } public void drawPixel(int x, int y, int color) { - if(nativePixmap != null) { - nativePixmap.setPixel(x, y, color); - } - else { - setColor(color); - drawPixel(x, y); - } + nativePixmap.setPixel(x, y, color); } public int getGLFormat () { - if(nativePixmap != null) { - return nativePixmap.getGLFormat(); - } - return GL20.GL_RGBA; + return nativePixmap.getGLFormat(); } public int getGLInternalFormat () { - if(nativePixmap != null) { - return nativePixmap.getGLInternalFormat(); - } - return GL20.GL_RGBA; + return nativePixmap.getGLInternalFormat(); } public int getGLType () { - if(nativePixmap != null) { - return nativePixmap.getGLType(); - } - return GL20.GL_UNSIGNED_BYTE; + return nativePixmap.getGLType(); } public ByteBuffer getPixels() { return buffer; } + public Uint8ArrayWrapper getPixmapData() { + return nativePixmap.getPixels(); + } + public void setPixels(ByteBuffer pixels) { - if(nativePixmap != null) { - if (!pixels.isDirect()) throw new GdxRuntimeException("Couldn't setPixels from non-direct ByteBuffer"); - Uint8ArrayWrapper dst = nativePixmap.getPixels(); - //TODO find a way to use byteBuffer -// BufferUtils.copy(pixels, dst, dst.limit()) - } - else { - if(width == 0 || height == 0) return; - if(TeaTool.useGLArrayBuffer()) { - Int8ArrayWrapper int8Array = ArrayBufferUtil.getInt8Array(pixels); - setImageData(int8Array, width, height, getContext()); - } - else { - CanvasRenderingContext2DWrapper context = getContext(); - ImageDataWrapper imgData = context.createImageData(width, height); - Uint8ClampedArrayWrapper data = imgData.getData(); - byte[] pixelsArray = pixels.array(); - for(int i = 0, len = width * height * 4; i < len; i++) { - data.set(i, (byte)(pixelsArray[i] & 0xff)); - } - context.putImageData(imgData, 0, 0); - } - } + if (!pixels.isDirect()) throw new GdxRuntimeException("Couldn't setPixels from non-direct ByteBuffer"); + //TODO Need testing + BufferUtils.copy(pixels, buffer, buffer.limit()); } @JSBody(params = { "pixels", "width", "height", "ctx" }, script = "" + @@ -569,17 +346,12 @@ public void setPixels(ByteBuffer pixels) { private static native void setImageData(ArrayBufferViewWrapper pixels, int width, int height, CanvasRenderingContext2DWrapper ctx); public FormatEmu getFormat () { - if(nativePixmap != null) { - return FormatEmu.fromGdx2DPixmapFormat(nativePixmap.getFormat()); - } - return FormatEmu.RGBA8888; + return FormatEmu.fromGdx2DPixmapFormat(nativePixmap.getFormat()); } public void setFilter(FilterEmu filter) { this.filter = filter; - if(nativePixmap != null) { - nativePixmap.setScale(filter == PixmapEmu.FilterEmu.NearestNeighbour ? Gdx2DPixmapEmu.GDX2D_SCALE_NEAREST : Gdx2DPixmapEmu.GDX2D_SCALE_LINEAR); - } + nativePixmap.setScale(filter == PixmapEmu.FilterEmu.NearestNeighbour ? Gdx2DPixmapEmu.GDX2D_SCALE_NEAREST : Gdx2DPixmapEmu.GDX2D_SCALE_LINEAR); } public FilterEmu getFilter() { @@ -588,143 +360,13 @@ public FilterEmu getFilter() { public void setBlending(BlendingEmu blending) { this.blending = blending; - if(nativePixmap != null) { - nativePixmap.setBlend(blending == PixmapEmu.BlendingEmu.None ? 0 : 1); - } - else { - this.ensureCanvasExists(); - this.context.setGlobalCompositeOperation(getComposite().toString()); - } + nativePixmap.setBlend(blending == PixmapEmu.BlendingEmu.None ? 0 : 1); } public BlendingEmu getBlending () { return blending; } - private void circle(int x, int y, int radius, DrawType drawType) { - ensureCanvasExists(); - if(blending == PixmapEmu.BlendingEmu.None) { - context.setFillStyle(clearColor); - context.setStrokeStyle(clearColor); - context.setGlobalCompositeOperation("destination-out"); - context.beginPath(); - context.arc(x, y, radius, 0, 2 * Math.PI, false); - fillOrStrokePath(drawType); - context.closePath(); - context.setFillStyle(colorStr); - context.setStrokeStyle(colorStr); - context.setGlobalCompositeOperation(Composite.SOURCE_OVER.getValue()); - } - context.beginPath(); - context.arc(x, y, radius, 0, 2 * Math.PI, false); - fillOrStrokePath(drawType); - context.closePath(); - pixels = null; - } - - private void line(int x, int y, int x2, int y2, DrawType drawType) { - ensureCanvasExists(); - if(blending == PixmapEmu.BlendingEmu.None) { - context.setFillStyle(clearColor); - context.setStrokeStyle(clearColor); - context.setGlobalCompositeOperation("destination-out"); - context.beginPath(); - context.moveTo(x, y); - context.lineTo(x2, y2); - fillOrStrokePath(drawType); - context.closePath(); - context.setFillStyle(colorStr); - context.setStrokeStyle(colorStr); - context.setGlobalCompositeOperation(Composite.SOURCE_OVER.getValue()); - } - context.beginPath(); - context.moveTo(x, y); - context.lineTo(x2, y2); - fillOrStrokePath(drawType); - context.closePath(); - pixels = null; - } - - private void rectangle(int x, int y, int width, int height, DrawType drawType) { - ensureCanvasExists(); - if(blending == PixmapEmu.BlendingEmu.None) { - context.setFillStyle(clearColor); - context.setStrokeStyle(clearColor); - context.setGlobalCompositeOperation("destination-out"); - context.beginPath(); - context.rect(x, y, width, height); - fillOrStrokePath(drawType); - context.closePath(); - context.setFillStyle(colorStr); - context.setStrokeStyle(colorStr); - context.setGlobalCompositeOperation(Composite.SOURCE_OVER.getValue()); - } - context.beginPath(); - context.rect(x, y, width, height); - fillOrStrokePath(drawType); - context.closePath(); - pixels = null; - } - - private void triangle(int x1, int y1, int x2, int y2, int x3, int y3, DrawType drawType) { - ensureCanvasExists(); - if(blending == PixmapEmu.BlendingEmu.None) { - context.setFillStyle(clearColor); - context.setStrokeStyle(clearColor); - context.setGlobalCompositeOperation("destination-out"); - context.beginPath(); - context.moveTo(x1, y1); - context.lineTo(x2, y2); - context.lineTo(x3, y3); - context.lineTo(x1, y1); - fillOrStrokePath(drawType); - context.closePath(); - context.setFillStyle(colorStr); - context.setStrokeStyle(colorStr); - context.setGlobalCompositeOperation(Composite.SOURCE_OVER.getValue()); - } - context.beginPath(); - context.moveTo(x1, y1); - context.lineTo(x2, y2); - context.lineTo(x3, y3); - context.lineTo(x1, y1); - fillOrStrokePath(drawType); - context.closePath(); - pixels = null; - } - - private void image(HTMLCanvasElementWrapper image, int srcX, int srcY, int srcWidth, int srcHeight, int dstX, int dstY, int dstWidth, int dstHeight) { - ensureCanvasExists(); - if(blending == PixmapEmu.BlendingEmu.None) { - context.setFillStyle(clearColor); - context.setStrokeStyle(clearColor); - context.setGlobalCompositeOperation("destination-out"); - context.beginPath(); - context.rect(dstX, dstY, dstWidth, dstHeight); - fillOrStrokePath(DrawType.FILL); - context.closePath(); - context.setFillStyle(colorStr); - context.setStrokeStyle(colorStr); - context.setGlobalCompositeOperation(Composite.SOURCE_OVER.getValue()); - } - if(srcWidth != 0 && srcHeight != 0 && dstWidth != 0 && dstHeight != 0) { - context.drawImage(image, srcX, srcY, srcWidth, srcHeight, dstX, dstY, dstWidth, dstHeight); - } - pixels = null; - } - - private void fillOrStrokePath(DrawType drawType) { - ensureCanvasExists(); - switch(drawType) { - case FILL: - context.fill(); - break; - case STROKE: - context.stroke(); - break; - } - } - private enum DrawType { FILL, STROKE } @@ -738,4 +380,4 @@ public enum BlendingEmu { public enum FilterEmu { NearestNeighbour, BiLinear } -} +} \ No newline at end of file diff --git a/backends/backend-teavm/jni/CMakeLists.txt b/backends/backend-teavm/jni/CMakeLists.txt index d43d2ee9..cfad89ed 100644 --- a/backends/backend-teavm/jni/CMakeLists.txt +++ b/backends/backend-teavm/jni/CMakeLists.txt @@ -58,6 +58,7 @@ set(EMCC_ARGS set(EMCC_WASM_ARGS ${EMCC_ARGS} -s BINARYEN_IGNORE_IMPLICIT_TRAPS=1 -s WASM=1 + -s SINGLE_FILE=1 ) set(EMCC_GLUE_ARGS diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java index 3c8fde12..7d278430 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java @@ -123,9 +123,7 @@ else if(agentInfo.isLinux()) logger = new TeaApplicationLogger(); clipboard = new TeaClipboard(); - if(config.useNativePixmap) { - initGdx(); - } + initGdx(); Gdx.app = this; Gdx.graphics = graphics; diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java index eb69cc54..8fe84fbe 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java @@ -19,11 +19,6 @@ public class TeaApplicationConfiguration { @Deprecated public boolean useGLArrayBuffer = true; - /** - * Experimental webassembly pixmap - */ - public boolean useNativePixmap = false; - /** Sets the {@link TeaWindowListener} which will be informed about teavm events. */ public TeaWindowListener windowListener; diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaCursor.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaCursor.java index 9d07c42d..d9d0ab1c 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaCursor.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaCursor.java @@ -2,13 +2,10 @@ import com.badlogic.gdx.graphics.Cursor; import com.badlogic.gdx.graphics.Pixmap; -import com.badlogic.gdx.graphics.PixmapEmu; import com.badlogic.gdx.utils.Base64Coder; import com.badlogic.gdx.utils.GdxRuntimeException; import com.github.xpenatan.gdx.backends.teavm.utils.PNG; -import java.nio.ByteBuffer; - /** * Cursor functionality ported for libGDX/GWT. This implementation also supports dynamically created cursor * images. @@ -47,43 +44,35 @@ public TeaCursor(Pixmap pixmap, int xHotspot, int yHotspot) { "yHotspot coordinate of " + yHotspot + " is not within image height bounds: [0, " + pixmap.getHeight() + ")."); } - int index = ((ByteBuffer)pixmap.getPixels()).getInt(0); - PixmapEmu pixmapEmu = (PixmapEmu)TeaGraphics.pixmaps.get(index); String url; - if (pixmapEmu != null) { - // referenced cursor image via URL - url = "'" + pixmapEmu.getCanvasElement().toDataURL("image/png") + "'"; - } - else { - // create custom cursor image from raw-data, e.g. when a cursor was created via Pixmap.drawPixels(...) or so - int w = pixmap.getWidth(); - int h = pixmap.getHeight(); - byte[] rawBytes = new byte[4 * w * h]; - for (int y = 0; y < h; y++) { - int offLine = 4 * y * w; - for (int x = 0; x < w; x++) { - int pixel = pixmap.getPixel(x, y); - int off = offLine + (4 * x); - rawBytes[off ] = (byte)((pixel >>> 24) & 0xff); - rawBytes[off + 1] = (byte)((pixel >>> 16) & 0xff); - rawBytes[off + 2] = (byte)((pixel >>> 8) & 0xff); - rawBytes[off + 3] = (byte)((pixel ) & 0xff); - } - } - - // convert to uncompressed PNG byte-array - byte[] pngBytes; - try { - pngBytes = PNG.encode(w, h, rawBytes); - } - catch (Exception e) { - throw new GdxRuntimeException("Error encoding bytes as PNG.", e); + // create custom cursor image from raw-data, e.g. when a cursor was created via Pixmap.drawPixels(...) or so + int w = pixmap.getWidth(); + int h = pixmap.getHeight(); + byte[] rawBytes = new byte[4 * w * h]; + for (int y = 0; y < h; y++) { + int offLine = 4 * y * w; + for (int x = 0; x < w; x++) { + int pixel = pixmap.getPixel(x, y); + int off = offLine + (4 * x); + rawBytes[off ] = (byte)((pixel >>> 24) & 0xff); + rawBytes[off + 1] = (byte)((pixel >>> 16) & 0xff); + rawBytes[off + 2] = (byte)((pixel >>> 8) & 0xff); + rawBytes[off + 3] = (byte)((pixel ) & 0xff); } + } - // we pass the images as base64 via CSS - String base64 = String.valueOf(Base64Coder.encode(pngBytes)); - url = "data:image/png;base64," + base64; + // convert to uncompressed PNG byte-array + byte[] pngBytes; + try { + pngBytes = PNG.encode(w, h, rawBytes); } + catch (Exception e) { + throw new GdxRuntimeException("Error encoding bytes as PNG.", e); + } + + // we pass the images as base64 via CSS + String base64 = String.valueOf(Base64Coder.encode(pngBytes)); + url = "data:image/png;base64," + base64; cssCursorProperty = "url("; cssCursorProperty += url; cssCursorProperty += ")"; diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java index 2ebd349b..981006c6 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java @@ -1030,52 +1030,33 @@ public void glTexImage2D(int target, int level, int internalformat, int width, i gl.texImage2D(target, level, internalformat, width, height, border, format, type, null); } else { - if(pixels.limit() > 4) { - //TODO not fully tested. Some conversion may be wrong. - ArrayBufferViewWrapper buffer; - if(TeaTool.useGLArrayBuffer()) { - Int8ArrayWrapper webGLArray = ArrayBufferUtil.getInt8Array(pixels); - if(pixels instanceof FloatBuffer) { - int remainingBytes = pixels.remaining(); - int byteOffset = webGLArray.getByteOffset() + pixels.position(); - buffer = TypedArrays.createFloat32Array(webGLArray.getBuffer(), byteOffset, remainingBytes); - } - else { - int remainingBytes = pixels.remaining(); - int byteOffset = webGLArray.getByteOffset() + pixels.position(); - buffer = TypedArrays.createUint8Array(webGLArray.getBuffer(), byteOffset, remainingBytes); - } + //TODO not fully tested. Some conversion may be wrong. + ArrayBufferViewWrapper buffer; + if(TeaTool.useGLArrayBuffer()) { + Int8ArrayWrapper webGLArray = ArrayBufferUtil.getInt8Array(pixels); + if(pixels instanceof FloatBuffer) { + int remainingBytes = pixels.remaining(); + int byteOffset = webGLArray.getByteOffset() + pixels.position(); + buffer = TypedArrays.createFloat32Array(webGLArray.getBuffer(), byteOffset, remainingBytes); } else { - if(pixels instanceof FloatBuffer) { - Float32ArrayWrapper arr = copy((FloatBuffer)pixels); - ArrayBufferViewWrapper webGLArray = arr; - buffer = webGLArray; - } - else { - Int8ArrayWrapper copy = copy((ByteBuffer)pixels); - buffer = ArrayBufferUtil.fromUI8(copy); - } + int remainingBytes = pixels.remaining(); + int byteOffset = webGLArray.getByteOffset() + pixels.position(); + buffer = TypedArrays.createUint8Array(webGLArray.getBuffer(), byteOffset, remainingBytes); } - gl.texImage2D(target, level, internalformat, width, height, border, format, type, buffer); } else { - int index = ((ByteBuffer)pixels).getInt(0); - PixmapEmu pixmap = (PixmapEmu)TeaGraphics.pixmaps.get(index); - // Prefer to use the HTMLImageElement when possible, since reading from the CanvasElement can be lossy. - if(pixmap.canUsePixmapData()) { - gl.texImage2D(target, level, internalformat, width, height, border, format, type, pixmap.getPixmapData()); - } - else if(pixmap.canUseImageElement()) { - gl.texImage2D(target, level, internalformat, format, type, pixmap.getImageElement()); - } - else if(pixmap.canUseVideoElement()) { - gl.texImage2D(target, level, internalformat, format, type, pixmap.getVideoElement()); + if(pixels instanceof FloatBuffer) { + Float32ArrayWrapper arr = copy((FloatBuffer)pixels); + ArrayBufferViewWrapper webGLArray = arr; + buffer = webGLArray; } else { - gl.texImage2D(target, level, internalformat, format, type, pixmap.getCanvasElement()); + Int8ArrayWrapper copy = copy((ByteBuffer)pixels); + buffer = ArrayBufferUtil.fromUI8(copy); } } + gl.texImage2D(target, level, internalformat, width, height, border, format, type, buffer); } } @@ -1101,45 +1082,33 @@ public void glTexParameteriv(int target, int pname, IntBuffer params) { @Override public void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, Buffer pixels) { - if(pixels.limit() > 4) { - //TODO not fully tested. Some conversion may be wrong. - ArrayBufferViewWrapper buffer; - if(TeaTool.useGLArrayBuffer()) { - ArrayBufferViewWrapper webGLArray = ArrayBufferUtil.getInt8Array(pixels); - if(pixels instanceof FloatBuffer) { - int remainingBytes = pixels.remaining(); - int byteOffset = webGLArray.getByteOffset() + pixels.position(); - buffer = TypedArrays.createFloat32Array(webGLArray.getBuffer(), byteOffset, remainingBytes); - } - else { - int remainingBytes = pixels.remaining(); - int byteOffset = webGLArray.getByteOffset() + pixels.position(); - buffer = TypedArrays.createUint8Array(webGLArray.getBuffer(), byteOffset, remainingBytes); - } + //TODO not fully tested. Some conversion may be wrong. + ArrayBufferViewWrapper buffer; + if(TeaTool.useGLArrayBuffer()) { + ArrayBufferViewWrapper webGLArray = ArrayBufferUtil.getInt8Array(pixels); + if(pixels instanceof FloatBuffer) { + int remainingBytes = pixels.remaining(); + int byteOffset = webGLArray.getByteOffset() + pixels.position(); + buffer = TypedArrays.createFloat32Array(webGLArray.getBuffer(), byteOffset, remainingBytes); } else { - if(pixels instanceof FloatBuffer) { - Float32ArrayWrapper arr = copy((FloatBuffer)pixels); - ArrayBufferViewWrapper webGLArray = arr; - buffer = webGLArray; - } - else { - Int8ArrayWrapper copy = copy((ByteBuffer)pixels); - buffer = ArrayBufferUtil.fromUI8(copy); - } + int remainingBytes = pixels.remaining(); + int byteOffset = webGLArray.getByteOffset() + pixels.position(); + buffer = TypedArrays.createUint8Array(webGLArray.getBuffer(), byteOffset, remainingBytes); } - gl.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, buffer); } else { - int index = ((ByteBuffer)pixels).getInt(0); - PixmapEmu pixmap = (PixmapEmu)TeaGraphics.pixmaps.get(index); - if(pixmap.canUsePixmapData()) { - gl.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixmap.getPixmapData()); + if(pixels instanceof FloatBuffer) { + Float32ArrayWrapper arr = copy((FloatBuffer)pixels); + ArrayBufferViewWrapper webGLArray = arr; + buffer = webGLArray; } else { - gl.texSubImage2D(target, level, xoffset, yoffset, format, type, pixmap.getCanvasElement()); + Int8ArrayWrapper copy = copy((ByteBuffer)pixels); + buffer = ArrayBufferUtil.fromUI8(copy); } } + gl.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, buffer); } @Override diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL30.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL30.java index 4319feac..c79f2688 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL30.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL30.java @@ -777,53 +777,33 @@ public void glTexImage3D(int target, int level, int internalformat, int width, i return; } - if(pixels.limit() > 4) { - //TODO not fully tested. Some conversion may be wrong. - ArrayBufferViewWrapper buffer; - if(TeaTool.useGLArrayBuffer()) { - ArrayBufferViewWrapper webGLArray = ArrayBufferUtil.getInt8Array(pixels); - if(pixels instanceof FloatBuffer) { - int remainingBytes = pixels.remaining(); - int byteOffset = webGLArray.getByteOffset() + pixels.position(); - buffer = TypedArrays.createFloat32Array(webGLArray.getBuffer(), byteOffset, remainingBytes); - } - else { - int remainingBytes = pixels.remaining(); - int byteOffset = webGLArray.getByteOffset() + pixels.position(); - buffer = TypedArrays.createUint8Array(webGLArray.getBuffer(), byteOffset, remainingBytes); - } + //TODO not fully tested. Some conversion may be wrong. + ArrayBufferViewWrapper buffer; + if(TeaTool.useGLArrayBuffer()) { + ArrayBufferViewWrapper webGLArray = ArrayBufferUtil.getInt8Array(pixels); + if(pixels instanceof FloatBuffer) { + int remainingBytes = pixels.remaining(); + int byteOffset = webGLArray.getByteOffset() + pixels.position(); + buffer = TypedArrays.createFloat32Array(webGLArray.getBuffer(), byteOffset, remainingBytes); } else { - if(pixels instanceof FloatBuffer) { - Float32ArrayWrapper arr = copy((FloatBuffer)pixels); - ArrayBufferViewWrapper webGLArray = arr; - buffer = webGLArray; - } - else { - Int8ArrayWrapper copy = copy((ByteBuffer)pixels); - buffer = ArrayBufferUtil.fromUI8(copy); - } + int remainingBytes = pixels.remaining(); + int byteOffset = webGLArray.getByteOffset() + pixels.position(); + buffer = TypedArrays.createUint8Array(webGLArray.getBuffer(), byteOffset, remainingBytes); } - gl.texImage3D(target, level, internalformat, width, height, depth, border, format, type, buffer); } else { - int index = ((ByteBuffer)pixels).getInt(0); - PixmapEmu pixmap = (PixmapEmu)TeaGraphics.pixmaps.get(index); - // Prefer to use the HTMLImageElement when possible, since reading from the CanvasElement can be lossy. - - if(pixmap.canUsePixmapData()) { - gl.texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixmap.getPixmapData()); - } - else if(pixmap.canUseImageElement()) { - gl.texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixmap.getImageElement()); - } - else if(pixmap.canUseVideoElement()) { - gl.texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixmap.getVideoElement()); + if(pixels instanceof FloatBuffer) { + Float32ArrayWrapper arr = copy((FloatBuffer)pixels); + ArrayBufferViewWrapper webGLArray = arr; + buffer = webGLArray; } else { - gl.texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixmap.getCanvasElement()); + Int8ArrayWrapper copy = copy((ByteBuffer)pixels); + buffer = ArrayBufferUtil.fromUI8(copy); } } + gl.texImage3D(target, level, internalformat, width, height, depth, border, format, type, buffer); } @Override @@ -841,46 +821,33 @@ public void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int @Override public void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, Buffer pixels) { // Taken from glTexSubImage2D - if(pixels.limit() > 4) { - //TODO not fully tested. Some conversion may be wrong. - ArrayBufferViewWrapper buffer; - if(TeaTool.useGLArrayBuffer()) { - ArrayBufferViewWrapper webGLArray = ArrayBufferUtil.getInt8Array(pixels); - if (pixels instanceof FloatBuffer) { - int remainingBytes = pixels.remaining(); - int byteOffset = webGLArray.getByteOffset() + pixels.position(); - buffer = TypedArrays.createFloat32Array(webGLArray.getBuffer(), byteOffset, remainingBytes); - } else { - int remainingBytes = pixels.remaining(); - int byteOffset = webGLArray.getByteOffset() + pixels.position(); - buffer = TypedArrays.createUint8Array(webGLArray.getBuffer(), byteOffset, remainingBytes); - } - } - else { - if(pixels instanceof FloatBuffer) { - Float32ArrayWrapper arr = copy((FloatBuffer)pixels); - ArrayBufferViewWrapper webGLArray = arr; - buffer = webGLArray; - } - else { - Int8ArrayWrapper copy = copy((ByteBuffer)pixels); - buffer = ArrayBufferUtil.fromUI8(copy); -// buffer = copyUI8((ByteBuffer)pixels); - } + //TODO not fully tested. Some conversion may be wrong. + ArrayBufferViewWrapper buffer; + if(TeaTool.useGLArrayBuffer()) { + ArrayBufferViewWrapper webGLArray = ArrayBufferUtil.getInt8Array(pixels); + if (pixels instanceof FloatBuffer) { + int remainingBytes = pixels.remaining(); + int byteOffset = webGLArray.getByteOffset() + pixels.position(); + buffer = TypedArrays.createFloat32Array(webGLArray.getBuffer(), byteOffset, remainingBytes); + } else { + int remainingBytes = pixels.remaining(); + int byteOffset = webGLArray.getByteOffset() + pixels.position(); + buffer = TypedArrays.createUint8Array(webGLArray.getBuffer(), byteOffset, remainingBytes); } - gl.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, buffer); } else { - int index = ((ByteBuffer)pixels).getInt(0); - PixmapEmu pixmap = (PixmapEmu)TeaGraphics.pixmaps.get(index); - - if(pixmap.canUsePixmapData()) { - gl.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixmap.getPixmapData()); + if(pixels instanceof FloatBuffer) { + Float32ArrayWrapper arr = copy((FloatBuffer)pixels); + ArrayBufferViewWrapper webGLArray = arr; + buffer = webGLArray; } else { - gl.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixmap.getCanvasElement()); + Int8ArrayWrapper copy = copy((ByteBuffer)pixels); + buffer = ArrayBufferUtil.fromUI8(copy); +// buffer = copyUI8((ByteBuffer)pixels); } } + gl.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, buffer); } @Override diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGraphics.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGraphics.java index 1c3fc4c8..17ef3754 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGraphics.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGraphics.java @@ -29,9 +29,6 @@ * @author xpenatan */ public class TeaGraphics implements Graphics { - public static int nextId = 0; - public static IntMap pixmaps = new IntMap<>(); - private WebGLRenderingContextWrapper context; protected HTMLCanvasElementWrapper canvas; protected TeaApplicationConfiguration config; diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/typedarray/TypedArrays.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/typedarray/TypedArrays.java index 1ab07dd9..4808fd57 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/typedarray/TypedArrays.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/typedarray/TypedArrays.java @@ -1,6 +1,8 @@ package com.github.xpenatan.gdx.backends.teavm.dom.typedarray; +import org.teavm.jso.JSBody; import org.teavm.jso.typedarrays.ArrayBuffer; +import org.teavm.jso.typedarrays.ArrayBufferView; import org.teavm.jso.typedarrays.Float32Array; import org.teavm.jso.typedarrays.Float64Array; import org.teavm.jso.typedarrays.Int16Array; @@ -144,4 +146,14 @@ public static Uint32ArrayWrapper createUint32Array(ArrayBufferWrapper buffer, in ArrayBuffer arrayBuffer = (ArrayBuffer)buffer; return Uint32ArrayWrapper.create(arrayBuffer, offset, length); } + + @JSBody(params = { "array" }, script = "return new $rt_byteArrayCls(array);") + private static native Object toByteArrayInternal(ArrayBufferViewWrapper array); + + // Obtain the array reference from ArrayBufferView + public static byte[] toByteArray(ArrayBufferViewWrapper array) { + Object arrayObj = TypedArrays.toByteArrayInternal(array); + byte[] byteArray = (byte[])arrayObj; + return byteArray; + } } diff --git a/backends/backend-teavm/src/main/resources/gdx.wasm.js b/backends/backend-teavm/src/main/resources/gdx.wasm.js index 5a204a72..eabc84f2 100644 --- a/backends/backend-teavm/src/main/resources/gdx.wasm.js +++ b/backends/backend-teavm/src/main/resources/gdx.wasm.js @@ -3,58 +3,55 @@ var Gdx = (() => { var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; return ( -function(Gdx = {}) { +function(moduleArg = {}) { -var b;b||(b=typeof Gdx !== 'undefined' ? Gdx : {});var h,k;b.ready=new Promise(function(a,c){h=a;k=c});var n=Object.assign({},b),p="object"==typeof window,q="function"==typeof importScripts,t="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,u="",v,w,x; -if(t){var fs=require("fs"),y=require("path");u=q?y.dirname(u)+"/":__dirname+"/";v=(a,c)=>{a=a.startsWith("file://")?new URL(a):y.normalize(a);return fs.readFileSync(a,c?void 0:"utf8")};x=a=>{a=v(a,!0);a.buffer||(a=new Uint8Array(a));return a};w=(a,c,d)=>{a=a.startsWith("file://")?new URL(a):y.normalize(a);fs.readFile(a,function(e,f){e?d(e):c(f.buffer)})};1process.version.match(/^v(\d+)\./)[1])process.on("unhandledRejection", -function(a){throw a;});b.inspect=function(){return"[Emscripten Module object]"}}else if(p||q)q?u=self.location.href:"undefined"!=typeof document&&document.currentScript&&(u=document.currentScript.src),_scriptDir&&(u=_scriptDir),0!==u.indexOf("blob:")?u=u.substr(0,u.replace(/[?#].*/,"").lastIndexOf("/")+1):u="",v=a=>{var c=new XMLHttpRequest;c.open("GET",a,!1);c.send(null);return c.responseText},q&&(x=a=>{var c=new XMLHttpRequest;c.open("GET",a,!1);c.responseType="arraybuffer";c.send(null);return new Uint8Array(c.response)}), -w=(a,c,d)=>{var e=new XMLHttpRequest;e.open("GET",a,!0);e.responseType="arraybuffer";e.onload=()=>{200==e.status||0==e.status&&e.response?c(e.response):d()};e.onerror=d;e.send(null)};b.print||console.log.bind(console);var z=b.printErr||console.warn.bind(console);Object.assign(b,n);n=null;var B;b.wasmBinary&&(B=b.wasmBinary);var noExitRuntime=b.noExitRuntime||!0;"object"!=typeof WebAssembly&&C("no native wasm support detected");var D,E=!1,F="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0; -function G(a,c){if(a){var d=H,e=a+c;for(c=a;d[c]&&!(c>=e);)++c;if(16f?e+=String.fromCharCode(f):(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else e+=String.fromCharCode(f)}a=e}}else a="";return a}var I,H; -function J(){var a=D.buffer;b.HEAP8=I=new Int8Array(a);b.HEAP16=new Int16Array(a);b.HEAP32=new Int32Array(a);b.HEAPU8=H=new Uint8Array(a);b.HEAPU16=new Uint16Array(a);b.HEAPU32=new Uint32Array(a);b.HEAPF32=new Float32Array(a);b.HEAPF64=new Float64Array(a)}var K=[],L=[],M=[];function aa(){var a=b.preRun.shift();K.unshift(a)}var N=0,O=null,P=null; -function C(a){if(b.onAbort)b.onAbort(a);a="Aborted("+a+")";z(a);E=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");k(a);throw a;}function Q(){return R.startsWith("data:application/octet-stream;base64,")}var R;R="gdx.wasm.wasm";if(!Q()){var ba=R;R=b.locateFile?b.locateFile(ba,u):u+ba}function ca(){var a=R;try{if(a==R&&B)return new Uint8Array(B);if(x)return x(a);throw"both async and sync fetching of the wasm failed";}catch(c){C(c)}} -function da(){if(!B&&(p||q)){if("function"==typeof fetch&&!R.startsWith("file://"))return fetch(R,{credentials:"same-origin"}).then(function(a){if(!a.ok)throw"failed to load wasm binary file at '"+R+"'";return a.arrayBuffer()}).catch(function(){return ca()});if(w)return new Promise(function(a,c){w(R,function(d){a(new Uint8Array(d))},c)})}return Promise.resolve().then(function(){return ca()})}function S(a){for(;0>>=0;if(2147483648=d;d*=2){var e=c*(1+.2/d);e=Math.min(e,a+100663296);var f=Math,g=f.min;e=Math.max(a,e);e+=(65536-e%65536)%65536;a:{var l=D.buffer;try{D.grow(g.call(f,2147483648,e)-l.byteLength+65535>>>16);J();var m=1;break a}catch(r){}m=void 0}if(m)return!0}return!1}}; -(function(){function a(f){b.asm=f.exports;D=b.asm.c;J();L.unshift(b.asm.d);N--;b.monitorRunDependencies&&b.monitorRunDependencies(N);0==N&&(null!==O&&(clearInterval(O),O=null),P&&(f=P,P=null,f()))}function c(f){a(f.instance)}function d(f){return da().then(function(g){return WebAssembly.instantiate(g,e)}).then(function(g){return g}).then(f,function(g){z("failed to asynchronously prepare wasm: "+g);C(g)})}var e={a:ea};N++;b.monitorRunDependencies&&b.monitorRunDependencies(N);if(b.instantiateWasm)try{return b.instantiateWasm(e, -a)}catch(f){z("Module.instantiateWasm callback failed with error: "+f),k(f)}(function(){return B||"function"!=typeof WebAssembly.instantiateStreaming||Q()||R.startsWith("file://")||t||"function"!=typeof fetch?d(c):fetch(R,{credentials:"same-origin"}).then(function(f){return WebAssembly.instantiateStreaming(f,e).then(c,function(g){z("wasm streaming compile failed: "+g);z("falling back to ArrayBuffer instantiation");return d(c)})})})().catch(k);return{}})(); -var fa=b._emscripten_bind_VoidPtr___destroy___0=function(){return(fa=b._emscripten_bind_VoidPtr___destroy___0=b.asm.e).apply(null,arguments)},ha=b._emscripten_bind_gdx2d_pixmap_get_width_0=function(){return(ha=b._emscripten_bind_gdx2d_pixmap_get_width_0=b.asm.f).apply(null,arguments)},ia=b._emscripten_bind_gdx2d_pixmap_set_width_1=function(){return(ia=b._emscripten_bind_gdx2d_pixmap_set_width_1=b.asm.g).apply(null,arguments)},ja=b._emscripten_bind_gdx2d_pixmap_get_height_0=function(){return(ja=b._emscripten_bind_gdx2d_pixmap_get_height_0= -b.asm.h).apply(null,arguments)},ka=b._emscripten_bind_gdx2d_pixmap_set_height_1=function(){return(ka=b._emscripten_bind_gdx2d_pixmap_set_height_1=b.asm.i).apply(null,arguments)},la=b._emscripten_bind_gdx2d_pixmap_get_format_0=function(){return(la=b._emscripten_bind_gdx2d_pixmap_get_format_0=b.asm.j).apply(null,arguments)},ma=b._emscripten_bind_gdx2d_pixmap_set_format_1=function(){return(ma=b._emscripten_bind_gdx2d_pixmap_set_format_1=b.asm.k).apply(null,arguments)},na=b._emscripten_bind_gdx2d_pixmap_get_blend_0= -function(){return(na=b._emscripten_bind_gdx2d_pixmap_get_blend_0=b.asm.l).apply(null,arguments)},oa=b._emscripten_bind_gdx2d_pixmap_set_blend_1=function(){return(oa=b._emscripten_bind_gdx2d_pixmap_set_blend_1=b.asm.m).apply(null,arguments)},pa=b._emscripten_bind_gdx2d_pixmap_get_scale_0=function(){return(pa=b._emscripten_bind_gdx2d_pixmap_get_scale_0=b.asm.n).apply(null,arguments)},qa=b._emscripten_bind_gdx2d_pixmap_set_scale_1=function(){return(qa=b._emscripten_bind_gdx2d_pixmap_set_scale_1=b.asm.o).apply(null, -arguments)},ra=b._emscripten_bind_gdx2d_pixmap___destroy___0=function(){return(ra=b._emscripten_bind_gdx2d_pixmap___destroy___0=b.asm.p).apply(null,arguments)},sa=b._emscripten_bind_Gdx_g2d_get_pixels_1=function(){return(sa=b._emscripten_bind_Gdx_g2d_get_pixels_1=b.asm.q).apply(null,arguments)},ta=b._emscripten_bind_Gdx_g2d_load_3=function(){return(ta=b._emscripten_bind_Gdx_g2d_load_3=b.asm.r).apply(null,arguments)},ua=b._emscripten_bind_Gdx_g2d_new_3=function(){return(ua=b._emscripten_bind_Gdx_g2d_new_3= -b.asm.s).apply(null,arguments)},va=b._emscripten_bind_Gdx_g2d_free_1=function(){return(va=b._emscripten_bind_Gdx_g2d_free_1=b.asm.t).apply(null,arguments)},wa=b._emscripten_bind_Gdx_g2d_set_blend_2=function(){return(wa=b._emscripten_bind_Gdx_g2d_set_blend_2=b.asm.u).apply(null,arguments)},xa=b._emscripten_bind_Gdx_g2d_set_scale_2=function(){return(xa=b._emscripten_bind_Gdx_g2d_set_scale_2=b.asm.v).apply(null,arguments)},ya=b._emscripten_bind_Gdx_g2d_get_failure_reason_0=function(){return(ya=b._emscripten_bind_Gdx_g2d_get_failure_reason_0= -b.asm.w).apply(null,arguments)},za=b._emscripten_bind_Gdx_g2d_clear_2=function(){return(za=b._emscripten_bind_Gdx_g2d_clear_2=b.asm.x).apply(null,arguments)},Aa=b._emscripten_bind_Gdx_g2d_set_pixel_4=function(){return(Aa=b._emscripten_bind_Gdx_g2d_set_pixel_4=b.asm.y).apply(null,arguments)},Ba=b._emscripten_bind_Gdx_g2d_get_pixel_3=function(){return(Ba=b._emscripten_bind_Gdx_g2d_get_pixel_3=b.asm.z).apply(null,arguments)},Ca=b._emscripten_bind_Gdx_g2d_draw_line_6=function(){return(Ca=b._emscripten_bind_Gdx_g2d_draw_line_6= -b.asm.A).apply(null,arguments)},Da=b._emscripten_bind_Gdx_g2d_draw_rect_6=function(){return(Da=b._emscripten_bind_Gdx_g2d_draw_rect_6=b.asm.B).apply(null,arguments)},Ea=b._emscripten_bind_Gdx_g2d_draw_circle_5=function(){return(Ea=b._emscripten_bind_Gdx_g2d_draw_circle_5=b.asm.C).apply(null,arguments)},Fa=b._emscripten_bind_Gdx_g2d_fill_rect_6=function(){return(Fa=b._emscripten_bind_Gdx_g2d_fill_rect_6=b.asm.D).apply(null,arguments)},Ga=b._emscripten_bind_Gdx_g2d_fill_circle_5=function(){return(Ga= -b._emscripten_bind_Gdx_g2d_fill_circle_5=b.asm.E).apply(null,arguments)},Ha=b._emscripten_bind_Gdx_g2d_fill_triangle_8=function(){return(Ha=b._emscripten_bind_Gdx_g2d_fill_triangle_8=b.asm.F).apply(null,arguments)},Ia=b._emscripten_bind_Gdx_g2d_draw_pixmap_10=function(){return(Ia=b._emscripten_bind_Gdx_g2d_draw_pixmap_10=b.asm.G).apply(null,arguments)},Ja=b._emscripten_bind_Gdx_g2d_bytes_per_pixel_1=function(){return(Ja=b._emscripten_bind_Gdx_g2d_bytes_per_pixel_1=b.asm.H).apply(null,arguments)}, -Ka=b._emscripten_bind_Gdx___destroy___0=function(){return(Ka=b._emscripten_bind_Gdx___destroy___0=b.asm.I).apply(null,arguments)};b._free=function(){return(b._free=b.asm.K).apply(null,arguments)};b._malloc=function(){return(b._malloc=b.asm.L).apply(null,arguments)};b.___start_em_js=9976;b.___stop_em_js=10074;b.UTF8ToString=G;b.writeArrayToMemory=function(a,c){I.set(a,c)};var T;P=function La(){T||Ma();T||(P=La)}; -function Ma(){function a(){if(!T&&(T=!0,b.calledRun=!0,!E)){S(L);h(b);if(b.onRuntimeInitialized)b.onRuntimeInitialized();if(b.postRun)for("function"==typeof b.postRun&&(b.postRun=[b.postRun]);b.postRun.length;){var c=b.postRun.shift();M.unshift(c)}S(M)}}if(!(0{h=a;k=b});var m=Object.assign({},d),aa="object"==typeof window,p="function"==typeof importScripts,q="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,t="",u,w; +if(q){var fs=require("fs"),x=require("path");t=p?x.dirname(t)+"/":__dirname+"/";u=(a,b)=>{a=a.startsWith("file://")?new URL(a):x.normalize(a);return fs.readFileSync(a,b?void 0:"utf8")};w=a=>{a=u(a,!0);a.buffer||(a=new Uint8Array(a));return a};process.argv.slice(2);d.inspect=()=>"[Emscripten Module object]"}else if(aa||p)p?t=self.location.href:"undefined"!=typeof document&&document.currentScript&&(t=document.currentScript.src),_scriptDir&&(t=_scriptDir),0!==t.indexOf("blob:")?t=t.substr(0,t.replace(/[?#].*/, +"").lastIndexOf("/")+1):t="",u=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.send(null);return b.responseText},p&&(w=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)});d.print||console.log.bind(console);var y=d.printErr||console.error.bind(console);Object.assign(d,m);m=null;var z;d.wasmBinary&&(z=d.wasmBinary);var noExitRuntime=d.noExitRuntime||!0;"object"!=typeof WebAssembly&&A("no native wasm support detected"); +var B,C=!1,D,E;function F(){var a=B.buffer;d.HEAP8=D=new Int8Array(a);d.HEAP16=new Int16Array(a);d.HEAPU8=E=new Uint8Array(a);d.HEAPU16=new Uint16Array(a);d.HEAP32=new Int32Array(a);d.HEAPU32=new Uint32Array(a);d.HEAPF32=new Float32Array(a);d.HEAPF64=new Float64Array(a)}var G=[],H=[],I=[];function ba(){var a=d.preRun.shift();G.unshift(a)}var J=0,K=null,M=null; +function A(a){if(d.onAbort)d.onAbort(a);a="Aborted("+a+")";y(a);C=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");k(a);throw a;}function N(a){return a.startsWith("data:application/octet-stream;base64,")}var O;O="data:application/octet-stream;base64,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IARBA3EhHyAGQRBHISAgBEEESSElIAQhGANAIAkgCUH/AXFBjBRqLQAAIBMbIQkgAUEBaiEKIAAoAgwgF2ogIWoiDSAjaiEMQQAhAkEBIAsgGxsiC0EATCIPRQRAA0ACQCACIA1qAn8CQAJAAkACQAJAAkACQCAJQf8BcQ4HAAECAwQFBggLIAIgCmotAAAMBgsgAiAKai0AAAwFCyACIAxqLQAAIAIgCmotAABqDAQLIAIgCmotAAAgAiAMai0AAEEBdmoMAwsgAiAMai0AACACIApqLQAAagwCCyACIApqLQAADAELIAIgCmotAAALOgAACyACQQFqIgIgC0cNAAsLAn8gBkEIRgRAIBxFBEAgDSASakH/AToAAAsgAyECIAogEmoMAQsgIEUEQCAcRQRAIAsgDWpB//8DOwAACyAOIQIgCiALagwBC0EBIQIgAUECagshASAaIBggGxshGCACIAxqIQwgAiANaiECAkACQAJAAkAgIgRAIBhBAWsgC2whCgJAAkACQAJAAkACQAJAIAlB/wFxDgcIBAMCBQEABgsgCkEATA0FQQAhCCAKQQFHBEAgCkF+cSEPQQAhCQNAIAIgCGogAiAIIAtrai0AACABIAhqLQAAajoAACACIAhBAXIiDGogAiAMIAtrai0AACABIAxqLQAAajoAACAIQQJqIQggCUECaiIJIA9HDQALCyAKQQFxRQ0FIAIgCGogAiAIIAtrai0AACABIAhqLQAAajoAACABIApqIQEMCAsgCkEATA0EQQAhCCAKQQFHBEAgCkF+cSEPQQAhCQNAIAIgCGogASAIai0AACACIAggC2tqLQAAQQF2ajoAACACIAhBAXIiDGogASAMai0AACACIAwgC2tqLQAAQQF2ajoAACAIQQJqIQggCUECaiIJIA9HDQALCyAKQQFxRQ0EIAIgCGogASAIai0AACACIAggC2tqLQAAQQF2ajoAACABIApqIQEMBwsgCkEATA0DQQAhCCAKQQFHBEAgCkF+cSENQQAhCQNAIAIgCGogASAIai0AACACIAggC2tqLQAAIAggDGotAABqQQF2ajoAACACIAhBAXIiD2ogASAPai0AACACIA8gC2tqLQAAIAwgD2otAABqQQF2ajoAACAIQQJqIQggCUECaiIJIA1HDQALCyAKQQFxRQ0DIAIgCGogASAIai0AACACIAggC2tqLQAAIAggDGotAABqQQF2ajoAACABIApqIQEMBgsgCkEATA0CQQAhCCAKQQFHBEAgCkF+cSENQQAhCQNAIAIgCGogCCAMai0AACABIAhqLQAAajoAACACIAhBAXIiD2ogDCAPai0AACABIA9qLQAAajoAACAIQQJqIQggCUECaiIJIA1HDQALCyAKQQFxRQ0CIAIgCGogCCAMai0AACABIAhqLQAAajoAACABIApqIQEMBQsgCkEATA0BQQAhCCAKQQFHBEAgCkF+cSEPQQAhCQNAIAIgCGogAiAIIAtrai0AACABIAhqLQAAajoAACACIAhBAXIiDGogAiAMIAtrai0AACABIAxqLQAAajoAACAIQQJqIQggCUECaiIJIA9HDQALCyAKQQFxRQ0BIAIgCGogAiAIIAtrai0AACABIAhqLQAAajoAACABIApqIQEMBAtBACEIIApBAEwNAANAIAIgCGogASAIai0AACAMIAggC2siDWotAAAiCSAIIAxqLQAAIg8gDyACIA1qLQAAIg1qIAlrIhcgD2siDyAPQR91Ig9zIA9rIg8gFyAJayIJIAlBH3UiCXMgCWsiCUsbIhEgESANIAkgFyANayIJIAlBH3UiCXMgCWsiCUkbIAkgD0sbajoAACAIQQFqIgggCkcNAAsLIAEgCmohAQwCCwJAAkACQAJAAkACQAJAAkAgCUH/AXEOBwUEAwIGAQAHCyAQRQ0GIAtBfnEhDSALQQFxIREgECEKA0ACQCAPDQBBACEIQQAhCSALQQFHBEADQCACIAhqIAIgCCAOa2otAAAgASAIai0AAGo6AAAgAiAIQQFyIgxqIAIgDCAOa2otAAAgASAMai0AAGo6AAAgCEECaiEIIAlBAmoiCSANRw0ACwsgEUUNACACIAhqIAIgCCAOa2otAAAgASAIai0AAGo6AAALIAIgC2pB/wE6AAAgAiAOaiECIAEgC2ohASAKQQFrIgoNAAsMBgsgEEUNBSALQX5xIQ0gC0EBcSERIBAhCgNAAkAgDw0AQQAhCEEAIQkgC0EBRwRAA0AgAiAIaiABIAhqLQAAIAIgCCAOa2otAABBAXZqOgAAIAIgCEEBciIMaiABIAxqLQAAIAIgDCAOa2otAABBAXZqOgAAIAhBAmohCCAJQQJqIgkgDUcNAAsLIBFFDQAgAiAIaiABIAhqLQAAIAIgCCAOa2otAABBAXZqOgAACyACIAtqQf8BOgAAIAIgDmohAiABIAtqIQEgCkEBayIKDQALDAULIBBFDQQgC0F+cSERIAtBAXEhFCAQIQoDQAJAIA8NAEEAIQhBACEJIAtBAUcEQANAIAIgCGogASAIai0AACACIAggDmtqLQAAIAggDGotAABqQQF2ajoAACACIAhBAXIiDWogASANai0AACACIA0gDmtqLQAAIAwgDWotAABqQQF2ajoAACAIQQJqIQggCUECaiIJIBFHDQALCyAURQ0AIAIgCGogASAIai0AACACIAggDmtqLQAAIAggDGotAABqQQF2ajoAAAsgAiALakH/AToAACAMIA5qIQwgAiAOaiECIAEgC2ohASAKQQFrIgoNAAsMBAsgEEUNAyALQX5xIREgC0EBcSEUIBAhCgNAAkAgDw0AQQAhCEEAIQkgC0EBRwRAA0AgAiAIaiAIIAxqLQAAIAEgCGotAABqOgAAIAIgCEEBciINaiAMIA1qLQAAIAEgDWotAABqOgAAIAhBAmohCCAJQQJqIgkgEUcNAAsLIBRFDQAgAiAIaiAIIAxqLQAAIAEgCGotAABqOgAACyACIAtqQf8BOgAAIAwgDmohDCACIA5qIQIgASALaiEBIApBAWsiCg0ACwwDCyAQRQ0CIAtBfnEhDSALQQFxIREgECEKA0ACQCAPDQBBACEIQQAhCSALQQFHBEADQCACIAhqIAIgCCAOa2otAAAgASAIai0AAGo6AAAgAiAIQQFyIgxqIAIgDCAOa2otAAAgASAMai0AAGo6AAAgCEECaiEIIAlBAmoiCSANRw0ACwsgEUUNACACIAhqIAIgCCAOa2otAAAgASAIai0AAGo6AAALIAIgC2pB/wE6AAAgAiAOaiECIAEgC2ohASAKQQFrIgoNAAsMAgsgEEUNASALQXxxIREgC0EDcSENIAtBAWshFCAQIQoDQAJAIA8NAEEAIQxBACEIQQAhCSAUQQNPBEADQCACIAhqIAEgCGotAAA6AAAgAiAIQQFyIhVqIAEgFWotAAA6AAAgAiAIQQJyIhVqIAEgFWotAAA6AAAgAiAIQQNyIhVqIAEgFWotAAA6AAAgCEEEaiEIIAlBBGoiCSARRw0ACwsgDUUNAANAIAIgCGogASAIai0AADoAACAI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DQALC0EBDwtBgAghHQtB8M4AIB02AgBBAAuECQEEfyABKAIAQQBKBEADQCAAIAJqQYAKakEBOgAAIAJBAWoiAiABKAIASA0ACwsgASgCBEEASgRAA0AgACACakGACmpBAjoAACACQQFqIQIgA0EBaiIDIAEoAgRIDQALCyABKAIIQQBKBEBBACEDA0AgACACakGACmpBAzoAACACQQFqIQIgA0EBaiIDIAEoAghIDQALCyABKAIMQQBKBEBBACEDA0AgACACakGACmpBBDoAACACQQFqIQIgA0EBaiIDIAEoAgxIDQALCyABKAIQQQBKBEBBACEDA0AgACACakGACmpBBToAACACQQFqIQIgA0EBaiIDIAEoAhBIDQALCyABKAIUQQBKBEBBACEDA0AgACACakGACmpBBjoAACACQQFqIQIgA0EBaiIDIAEoAhRIDQALCyABKAIYQQBKBEBBACEDA0AgACACakGACmpBBzoAACACQQFqIQIgA0EBaiIDIAEoAhhIDQALCyABKAIcQQBKBEBBACEDA0AgACACakGACmpBCDoAACACQQFqIQIgA0EBaiIDIAEoAhxIDQALCyABKAIgQQBKBEBBACEDA0AgACACakGACmpBCToAACACQQFqIQIgA0EBaiIDIAEoAiBIDQALCyABKAIkQQBKBEBBACEDA0AgACACakGACmpBCjoAACACQQFqIQIgA0EBaiIDIAEoAiRIDQALCyABKAIoQQBKBEBBACEDA0AgACACakGACmpBCzoAACACQQFqIQIgA0EBaiIDIAEoAihIDQALCyABKAIsQQBKBEBBACEDA0AgACACakGACmpBDDoAACACQQFqIQIgA0EBaiIDIAEoAixIDQALCyABKAIwQQBKBEBBACEDA0AgACACakGACmpBDToAACACQQFqIQIgA0EBaiIDIAEoAjBIDQALCyABKAI0QQBKBEBBACEDA0AgACACakGACmpBDjoAACACQQFqIQIgA0EBaiIDIAEoAjRIDQALCyABKAI4QQBKBEBBACEDA0AgACACakGACmpBDzoAACACQQFqIQIgA0EBaiIDIAEoAjhIDQALCyABKAI8QQBKBEBBACEDA0AgACACakGACmpBEDoAACACQQFqIQIgA0EBaiIDIAEoAjxIDQALC0EAIQEgACACakGACmpBADoAAEEB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BQwCCyAFQQR2QQ9xIAVBCHZB8AFxIAVBEHZBgOADcSAFQQx2QYAecXJyciEFDAELQQAhBQsgBCAFIAgRAQAgBCALaiEEIAFBAWohAiABIA1HDQALCwsHACAALwEACyQBAX8jAEEQayICIAA2AgwgAiABNgIIIAIoAgwgAigCCDYCCAsYAQF/IwBBEGsiASAANgIMIAEoAgwoAggLJAEBfyMAQRBrIgIgADYCDCACIAE2AgggAigCDCACKAIINgIECxgBAX8jAEEQayIBIAA2AgwgASgCDCgCBAusAQEDfwJAIANBAEwNAEEAIQQgA0EBRwRAIANBfnEhBwNAIAAgBGogAiAEai0AACABIARqLQAAQQNsakECakECdjoAACAAIARBAXIiBmogAiAGai0AACABIAZqLQAAQQNsakECakECdjoAACAEQQJqIQQgBUECaiIFIAdHDQALCyADQQFxRQ0AIAAgBGogAiAEai0AACABIARqLQAAQQNsakECakECdjoAAAsgAAsEACABC+UBAQd/AkAgA0EATA0AIARBAEwNACAEQXxxIQogBEEDcSEJIARBBEkhCwNAIAQgCGwhBSABIAhqIQZBACECQQAhByALRQRAA0AgACACIAVqaiAGLQAAOgAAIAAgAkEBciAFamogBi0AADoAACAAIAJBAnIgBWpqIAYtAAA6AAAgACACQQNyIAVqaiAGLQAAOgAAIAJBBGohAiAHQQRqIgcgCkcNAAsLQQAhByAJBEADQCAAIAIgBWpqIAYtAAA6AAAgAkEBaiECIAdBAWoiByAJRw0ACwsgCEEBaiIIIANHDQALCyAAC+gBAQN/QQEhAiABLQAAIQQgA0EBRgRAIAAgBDoAACAAIAQ6AAEgAA8LIAAgBDoAACAAIAEtAAEgAS0AAEEDbGpBAmpBAnY6AAEgA0EBayEEQQIhBSADQQNOBEADQCAAIAJBAXRqIgUgASACaiIGLQAAQQNsQQJqIgcgBkEBay0AAGpBAnY6AAAgBSAHIAEgAkEBaiICai0AAGpBAnY6AAEgAiAERw0ACyAEQQF0IQULIAAgBWogASAEaiICLQAAIAEgA2pBAmstAABBA2xqQQJqQQJ2OgAAIAAgBUEBcmogAi0AADoAACAACyQBAX8jAEEQayICIAA2AgwgAiABNgIIIAIoAgwgAigCCDYCAAuU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dEGA/gNxIAJB/wFxcgwECyACQQh2IQJBESEEDAQLQRIhBCACQQt2QR9xIAJBEHZBgPADcSACQQ12QeAPcXJyDAILQRMhBCACQQR2QQ9xIAJBCHZB8AFxIAJBEHZBgOADcSACQQx2QYAecXJycgwBC0EPIQRBAAshAgsCQCADIApMIgcNACAJIAtqIgEgCnJBAEgNACABIA9ODQAgCCAAIAEgA2wgCmpsaiACIAQRAQALAkAgBw0AIAsgCWsiASAKckEASA0AIAEgD04NACAIIAAgASADbCAKamxqIAIgBBEBAAsCQCALIA9OIgcNACAJIApqIgEgC3JBAEgNACABIANODQAgCCAAIAMgC2wgAWpsaiACIAQRAQALAkAgBw0AIAogCWsiASALckEASA0AIAEgA04NACAIIAAgAyALbCABamxqIAIgBBEBAAsgCUEASgRAQQAhBwNAIAUgB0EBaiIHQQAgCUEBayIBIAVBAEgiBhtrQQF0aiESAkACQCAJIAEgBhsiCSAHRgRAIAcgCmohBgJAIAcgC2oiASAPTiIODQAgAyAGTA0AIAEgBnJBAEgNACAIIAEgA2wgBmogAGxqIAIgBBEBAAsgCiAHayEFAkAgDg0AIAMgBUwNACABIAVyQQBIDQAgCCABIANsIAVqIABsaiACIAQRAQALAkAgCyAHayIBIA9OIg4NACADIAZMDQAgASAGckEASA0AIAggASADbCAGaiAAbGogAiAEEQEACyAODQIgAyAFTA0CIAEgBXJBAE4NAQwCCyAHIAlODQEgByAKaiEBAkAgCSALaiIGIA9OIg4NACABIANODQAgASAGckEASA0AIAggAyAGbCABaiAAbGogAiAEEQEACyAKIAdrIQUCQCAODQAgAyAFTA0AIAUgBnJBAEgNACAIIAMgBmwgBWogAGxqIAIgBBEBAAsCQCALIAlrIgYgD04iDg0AIAEgA04NACABIAZyQQBIDQAgCCADIAZsIAFqIABsaiACIAQRAQALAkAgDg0AIAMgBUwNACAFIAZyQQBIDQAgCCADIAZsIAVqIABsaiACIAQRAQALIAkgCmohBgJAIAcgC2oiASAPTiIODQAgAyAGTA0AIAEgBnJBAEgNACAIIAEgA2wgBmogAGxqIAIgBBEBAAsgCiAJayEFAkAgDg0AIAMgBUwNACABIAVyQQBI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IAIgAzsBDCACIAM7AQogAiADOwEIIAIgAzsBBiACIAM7AQQgAiADOwECIAIgAzsBACACQRBqIQIgAEEJayEPIABBCGshACAPQX5JDQALCyAHQRBqJAAgBkEQaiQACyIBAX8jAEEQayIBJAAgASAANgIMIAFBEGokAEHwzgAoAgALJgECfyMAQRBrIgEkACABIAA2AgwgASgCDBAEIQIgAUEQaiQAIAILXgEBfyMAQRBrIgMkACADIAA2AgwgAyABNgIIIAMgAjYCBCADKAIEIQEjAEEQayIAJAAgACADKAIINgIMIAAgATYCCCAAKAIMIAAoAgg2AhAgAEEQaiQAIANBEGokAAteAQF/IwBBEGsiAyQAIAMgADYCDCADIAE2AgggAyACNgIEIAMoAgQhASMAQRBrIgAkACAAIAMoAgg2AgwgACABNgIIIAAoAgwgACgCCDYCDCAAQRBqJAAgA0EQaiQAC0wBAX8jAEEQayICJAAgAiAANgIMIAIgATYCCCMAQRBrIgAkACAAIAIoAgg2AgwgACgCDCIBKAIUEAIgARACIABBEGokACACQRBqJAAL5wEBA38jAEEQayIEJAAgBCAANgIMIAQgATYCCCAEIAI2AgQgBCADNgIAIAQoAgQhASAEKAIAIQIjAEEQayIAJAAgACAEKAIINgIMIAAgATYCCCAAIAI2AgQCfyAAKAIMIQIgACgCCCEDIAAoAgQhBUEYEAQiAQRAIAFCgYCAgBA3AgwgASAFNgIIIAEgAzYCBCABIAI2AgAgAiADbCECIAEgBUEBayIDQQVNBH8gA0ECdEGIHGooAgAFQQQLIAJsEAQiAjYCFCABIAINARogARACC0EACyEGIABBEGokACAEQRBqJAAgBgu1qwQEa38IfAN9A34jAEEQayIkJAAgJCAANgIMICQgATYCCCAkIAI2AgQgJCADNgIAICQoAgQhACAkKAIAIQEjAEEQayIiJAAgIiAkKAIINgIMICIgADYCCCAiIAE2AgQgIiAiKAIMNgIAICIoAgQhAUEAIQJBACEDIwBB0AFrIhwkACAcICIoAgAgIigCCGoiADYCyAEgHEEANgI4IBxBADYCKCAcIAAgAWoiATYCzAEgHCAANgLAASAcIAE2AsQBQQAhACMAQZAQayIjJAAjAEGAkQJrIhkkACAjQQA2AgwgI0IINwIE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IAdBPzYC1I8BCyAHQQA2AsiPASAHQgA3AryPASAHQQA2AoyPASAHQQA2AsSOASAHQQA2AvyNASAHQf8BOgDEjwEgB0EANgK0jQEgB0EANgLgjwEgByAHKAKEkAEiAUH/////ByABGyIONgKIkAEgBygC8I8BIQEgBUUEQCABQQFGBEAgByAHKAL0jwEiBkHIAGxqIgFBvI0BaigCACIIQQBMDQcgAUG4jQFqKAIAIgVBAEwNByABQcCNAWohCSABQciNAWohBCABQaiNAWohCiABQayNAWohDiABQbCNAWohEEEBIAhBB2pBA3UiASABQQFMGyEIQQEgBUEHakEDdSIBIAFBAUwbIQVBACELA0AgC0EDdCEPQQAhAQNAIAcgGUEgaiIRIBggDigCAEGQDWxqIBcgECgCACIVQZANbGogByAVQQp0akGE7QBqIAYgByAKKAIAQQd0akGE6QBqECZFDQ0gBCgCACAPIAkoAgAiFWxqIAFBA3RqIBUgESAHKAKMkAERBAAgByAHKAKIkAEiEUEBazYCiJABIBFBAUwEQCAHKALAjwFBF0wEQCAHEAULIActAMSPAUH4AXFB0AFHDQogB0EANgLIjwEgB0IANwK8jwEgB0EANgKMjwEgB0EANgLEjgEgB0EANgL8jQEgB0H/AToAxI8BIAdBADYCtI0BIAdBADYC4I8BIAcgBygChJABIhFB/////wcgERs2AoiQAQsgAUEBaiIBIAVHDQALIAtBAWoiCyAIRw0ACwwHCyAHKAKQjQEiBUEATA0GQQAhECAHKAKMjQEiAUEATA0GA0BBACEJIAFBAEoEQANAQQAhCCAHKALwjwEiBkEASgRAA0ACQCAHIAcgCEECdGpB9I8BaigCACILQcgAbGoiAUGkjQFqIgQoAgAiBUEATA0AIAFBoI0BaiIPKAIAIg5BAEwNACABQcCNAWohBiABQciNAWohESABQaiNAWohFSABQayNAWohEyABQbCNAWohEkEAIQoDQEEAIQEgDkEASgRAA0AgBCgCACEFIAcgGUEgaiIUIBggEygCAEGQDWxqIBcgEigCACIWQZANbGogByAWQQp0akGE7QBqIAsgByAVKAIAQQd0akGE6QBqECZFDRMgESgCACAGKAIAIhYgBSAQbCAKamxBA3RqIAkgDmwgAWpBA3RqIBYgFCAHKAKM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IG9mIG1lbW9yeQBKUEVHIGZvcm1hdCBub3Qgc3VwcG9ydGVkOiA4LWJpdCBvbmx5AFBORyBub3Qgc3VwcG9ydGVkOiAxLzIvNC84LzE2LWJpdCBvbmx5AFBJQyBmaWxlIHRvbyBzaG9ydABJbWFnZSBub3Qgb2YgYW55IGtub3duIHR5cGUsIG9yIGNvcnJ1cHQAUFBNIGltYWdlIG5vdCA4LWJpdABQU0QgYml0IGRlcHRoIGlzIG5vdCA4IG9yIDE2IGJpdABKUEVHIGZvcm1hdCBub3Qgc3VwcG9ydGVkOiBkZWxheWVkIGhlaWdodABDYW4ndCBmaW5kIG91dCBUR0EgcGl4ZWxmb3JtYXQAUFNEIGlzIG5vdCBpbiBSR0IgY29sb3IgZm9ybWF0AFBTRCBoYXMgYW4gdW5rbm93biBjb21wcmVzc2lvbiBmb3JtYXQAVW5zdXBwb3J0ZWQgSERSIGZvcm1hdAB0b28gbWFueSBwYWNrZXRzAEludGVybmFsIGVycm9yAHBhY2tldCBpc24ndCA4YnBwAEJNUCB0eXBlIG5vdCBzdXBwb3J0ZWQ6IHVua25vd24Ac2NhbmxpbmUgb3ZlcnJ1bgBwYWNrZXQgaGFzIGJhZCBjb21wcmVzc2lvbiB0eXBlAFBORyBub3Qgc3VwcG9ydGVkOiB1bmtub3duIFBORyBjaHVuayB0eXBlAEhEUiBpbWFnZSBpcyB0b28gbGFyZ2UAR0lGIGltYWdlIGlzIHRvbyBsYXJnZQBQTk0gdG9vIGxhcmdlAENvcnJ1cHQgSERSIGltYWdlAENvcnJ1cHQgUFNEIGltYWdlAFVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscyBpbiBQU0QgaW1hZ2UAVW5zdXBwb3J0ZWQgdmVyc2lvbiBvZiBQU0QgaW1hZ2UAUElDIGltYWdlIHRvbyBsYXJnZSB0byBkZWNvZGUASW1hZ2UgdG9vIGxhcmdlIHRvIGRlY29kZQBGT1JNQVQ9MzItYml0X3JsZV9yZ2JlAGJhZCBSTEUgZGF0YQBQSUNUAGNvcnJ1cHQgSERSAGJhZCBSTEUgZGF0YSBpbiBIRFIAQ29ycnVwdCBCTVAAYmFkIEJNUABDb3JydXB0IFBORwBOb3QgYSBQTkcAQ29ycnVwdCBKUEVHAENvcnJ1cHQgR0lGAEJNUCB0eXBlIG5vdCBzdXBwb3J0ZWQ6IFJMRQAjP1JBRElBTkNFACM/UkdCRQBDb3JydXB0IFBTRABDb3JydXB0IFRHQQBTgPY0AGZpbGUgdG9vIHNob3J0IChwdXJlIHJlYWQgY291bnQpAGZpbGUgdG9vIHNob3J0IChtaXhlZCByZWFkIGNvdW50KQBmaWxlIHRvbyBzaG9ydCAocmVhZGluZyBwYWNrZXRzKQBmaWxlIHRvbyBzaG9ydCAocGljIGhlYWRlcikAVmVyeSBsYXJnZSBpbWFnZSAoY29ycnVwdD8pAC1ZIAArWCAAIz9SQURJQU5DRQoAQZERC1EBCBAJAgMKERggGRILBAUMExohKDApIhsUDQYHDhUcIyoxODkyKyQdFg8XHiUsMzo7NC0mHycuNTw9Ni83Pj8/Pz8/Pz8/Pz8/Pz8/Pz9SR0IAQfQRCz4BAAAAAwAAAAcAAAAPAAAAHwAAAD8AAAB/AAAA/wAAAP8BAAD/AwAA/wcAAP8PAAD/HwAA/z8AAP9/AAD//wBBxBILRf/////9////+f////H////h////wf///4H///8B////Af7//wH8//8B+P//AfD//wHg//8BwP//AYD//wD/VQARAAAAAQBBlBMLEQQAAAAAAAAAAgAAAAAAAAABAEG4EwtZBAAAAAAAAAACAAAAAAAAAAEAAAAAAAAACAAAAAgAAAAEAAAABAAAAAIAAAACAAAAAQAAAAAAAAAIAAAACAAAAAgAAAAEAAAABAAAAAIAAAACAAAAAAEABQYAQaQUCx3/AAAAVQAAAEkAAAARAAAAIQAAAEEAAACBAAAAAQBB3BQLEQEAAAAAAAAAAgAAAAQAAAAGAEGAFQvTAggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJ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";if(!N(O)){var P=O;O=d.locateFile?d.locateFile(P,t):t+P} +function ca(){var a=O;return Promise.resolve().then(()=>{if(a==O&&z)var b=new Uint8Array(z);else{if(N(a)){var c=a.slice(37);if("undefined"!=typeof q&&q)b=Buffer.from(c,"base64"),b=new Uint8Array(b.buffer,b.byteOffset,b.length);else try{var e=atob(c),f=new Uint8Array(e.length);for(c=0;cWebAssembly.instantiate(c,a)).then(c=>c).then(b,c=>{y(`failed to asynchronously prepare wasm: ${c}`);A(c)})}function ea(a,b){return da(a,b)} +var Q=a=>{for(;0{if(a){var c=E,e=a+b;for(b=a;c[b]&&!(b>=e);)++b;if(16f?e+=String.fromCharCode(f):(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else e+= +String.fromCharCode(f)}a=e}}else a="";return a},ha={b:(a,b,c)=>E.copyWithin(a,b,b+c),a:a=>{var b=E.length;a>>>=0;if(2147483648=c;c*=2){var e=b*(1+.2/c);e=Math.min(e,a+100663296);var f=Math;e=Math.max(a,e);a:{f=(f.min.call(f,2147483648,e+(65536-e%65536)%65536)-B.buffer.byteLength+65535)/65536;try{B.grow(f);F();var g=1;break a}catch(l){}g=void 0}if(g)return!0}return!1}},S=function(){function a(c){S=c=c.exports;B=S.c;F();H.unshift(S.d);J--;d.monitorRunDependencies&&d.monitorRunDependencies(J); +if(0==J&&(null!==K&&(clearInterval(K),K=null),M)){var e=M;M=null;e()}return c}var b={a:ha};J++;d.monitorRunDependencies&&d.monitorRunDependencies(J);if(d.instantiateWasm)try{return d.instantiateWasm(b,a)}catch(c){y(`Module.instantiateWasm callback failed with error: ${c}`),k(c)}ea(b,function(c){a(c.instance)}).catch(k);return{}}();d._webidl_free=a=>(d._webidl_free=S.e)(a);d._free=a=>(d._free=S.f)(a);d._webidl_malloc=a=>(d._webidl_malloc=S.g)(a);d._malloc=a=>(d._malloc=S.h)(a); +var ia=d._emscripten_bind_VoidPtr___destroy___0=a=>(ia=d._emscripten_bind_VoidPtr___destroy___0=S.i)(a),ja=d._emscripten_bind_gdx2d_pixmap_get_width_0=a=>(ja=d._emscripten_bind_gdx2d_pixmap_get_width_0=S.j)(a),ka=d._emscripten_bind_gdx2d_pixmap_set_width_1=(a,b)=>(ka=d._emscripten_bind_gdx2d_pixmap_set_width_1=S.k)(a,b),la=d._emscripten_bind_gdx2d_pixmap_get_height_0=a=>(la=d._emscripten_bind_gdx2d_pixmap_get_height_0=S.l)(a),ma=d._emscripten_bind_gdx2d_pixmap_set_height_1=(a,b)=>(ma=d._emscripten_bind_gdx2d_pixmap_set_height_1= +S.m)(a,b),na=d._emscripten_bind_gdx2d_pixmap_get_format_0=a=>(na=d._emscripten_bind_gdx2d_pixmap_get_format_0=S.n)(a),oa=d._emscripten_bind_gdx2d_pixmap_set_format_1=(a,b)=>(oa=d._emscripten_bind_gdx2d_pixmap_set_format_1=S.o)(a,b),pa=d._emscripten_bind_gdx2d_pixmap_get_blend_0=a=>(pa=d._emscripten_bind_gdx2d_pixmap_get_blend_0=S.p)(a),qa=d._emscripten_bind_gdx2d_pixmap_set_blend_1=(a,b)=>(qa=d._emscripten_bind_gdx2d_pixmap_set_blend_1=S.q)(a,b),ra=d._emscripten_bind_gdx2d_pixmap_get_scale_0=a=>(ra= +d._emscripten_bind_gdx2d_pixmap_get_scale_0=S.r)(a),sa=d._emscripten_bind_gdx2d_pixmap_set_scale_1=(a,b)=>(sa=d._emscripten_bind_gdx2d_pixmap_set_scale_1=S.s)(a,b),ta=d._emscripten_bind_gdx2d_pixmap___destroy___0=a=>(ta=d._emscripten_bind_gdx2d_pixmap___destroy___0=S.t)(a),ua=d._emscripten_bind_Gdx_g2d_get_pixels_1=(a,b)=>(ua=d._emscripten_bind_Gdx_g2d_get_pixels_1=S.u)(a,b),va=d._emscripten_bind_Gdx_g2d_load_3=(a,b,c,e)=>(va=d._emscripten_bind_Gdx_g2d_load_3=S.v)(a,b,c,e),wa=d._emscripten_bind_Gdx_g2d_new_3= +(a,b,c,e)=>(wa=d._emscripten_bind_Gdx_g2d_new_3=S.w)(a,b,c,e),xa=d._emscripten_bind_Gdx_g2d_free_1=(a,b)=>(xa=d._emscripten_bind_Gdx_g2d_free_1=S.x)(a,b),ya=d._emscripten_bind_Gdx_g2d_set_blend_2=(a,b,c)=>(ya=d._emscripten_bind_Gdx_g2d_set_blend_2=S.y)(a,b,c),za=d._emscripten_bind_Gdx_g2d_set_scale_2=(a,b,c)=>(za=d._emscripten_bind_Gdx_g2d_set_scale_2=S.z)(a,b,c),Aa=d._emscripten_bind_Gdx_g2d_get_failure_reason_0=a=>(Aa=d._emscripten_bind_Gdx_g2d_get_failure_reason_0=S.A)(a),Ba=d._emscripten_bind_Gdx_g2d_clear_2= +(a,b,c)=>(Ba=d._emscripten_bind_Gdx_g2d_clear_2=S.B)(a,b,c),Ca=d._emscripten_bind_Gdx_g2d_set_pixel_4=(a,b,c,e,f)=>(Ca=d._emscripten_bind_Gdx_g2d_set_pixel_4=S.C)(a,b,c,e,f),Da=d._emscripten_bind_Gdx_g2d_get_pixel_3=(a,b,c,e)=>(Da=d._emscripten_bind_Gdx_g2d_get_pixel_3=S.D)(a,b,c,e),Ea=d._emscripten_bind_Gdx_g2d_draw_line_6=(a,b,c,e,f,g,l)=>(Ea=d._emscripten_bind_Gdx_g2d_draw_line_6=S.E)(a,b,c,e,f,g,l),Fa=d._emscripten_bind_Gdx_g2d_draw_rect_6=(a,b,c,e,f,g,l)=>(Fa=d._emscripten_bind_Gdx_g2d_draw_rect_6= +S.F)(a,b,c,e,f,g,l),Ga=d._emscripten_bind_Gdx_g2d_draw_circle_5=(a,b,c,e,f,g)=>(Ga=d._emscripten_bind_Gdx_g2d_draw_circle_5=S.G)(a,b,c,e,f,g),Ha=d._emscripten_bind_Gdx_g2d_fill_rect_6=(a,b,c,e,f,g,l)=>(Ha=d._emscripten_bind_Gdx_g2d_fill_rect_6=S.H)(a,b,c,e,f,g,l),Ia=d._emscripten_bind_Gdx_g2d_fill_circle_5=(a,b,c,e,f,g)=>(Ia=d._emscripten_bind_Gdx_g2d_fill_circle_5=S.I)(a,b,c,e,f,g),Ja=d._emscripten_bind_Gdx_g2d_fill_triangle_8=(a,b,c,e,f,g,l,n,r)=>(Ja=d._emscripten_bind_Gdx_g2d_fill_triangle_8=S.J)(a, +b,c,e,f,g,l,n,r),Ka=d._emscripten_bind_Gdx_g2d_draw_pixmap_10=(a,b,c,e,f,g,l,n,r,v,L)=>(Ka=d._emscripten_bind_Gdx_g2d_draw_pixmap_10=S.K)(a,b,c,e,f,g,l,n,r,v,L),La=d._emscripten_bind_Gdx_g2d_bytes_per_pixel_1=(a,b)=>(La=d._emscripten_bind_Gdx_g2d_bytes_per_pixel_1=S.L)(a,b),Ma=d._emscripten_bind_Gdx___destroy___0=a=>(Ma=d._emscripten_bind_Gdx___destroy___0=S.M)(a);d.___start_em_js=9990;d.___stop_em_js=10088;d.UTF8ToString=fa;d.writeArrayToMemory=(a,b)=>{D.set(a,b)};var T; +M=function Na(){T||Oa();T||(M=Na)}; +function Oa(){function a(){if(!T&&(T=!0,d.calledRun=!0,!C)){Q(H);h(d);if(d.onRuntimeInitialized)d.onRuntimeInitialized();if(d.postRun)for("function"==typeof d.postRun&&(d.postRun=[d.postRun]);d.postRun.length;){var b=d.postRun.shift();I.unshift(b)}Q(I)}}if(!(0 Gdx); async function asyncCall() { window.Gdx = await Gdx(); } diff --git a/backends/backend-teavm/src/main/resources/gdx.wasm.wasm b/backends/backend-teavm/src/main/resources/gdx.wasm.wasm deleted file mode 100644 index e388ed6bfd3fcfebef624942c22f54aec825e74c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131771 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 W#FR|BtZeItJ{%E?HTWY3=KVkBp+89g diff --git a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildTeaVMTestDemo.java b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildTeaVMTestDemo.java index 7bf076e0..ec63eb4d 100644 --- a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildTeaVMTestDemo.java +++ b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildTeaVMTestDemo.java @@ -17,9 +17,10 @@ public static void main(String[] args) throws IOException { teaBuildConfiguration.webappPath = new File("build/dist").getCanonicalPath(); teaBuildConfiguration.logoPath = "logo.png"; + TeaVMTool tool = TeaBuilder.config(teaBuildConfiguration); tool.setMainClass(TeaVMTestLauncher.class.getName()); - tool.setObfuscated(true); + tool.setObfuscated(false); TeaBuilder.build(tool); } } diff --git a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java index d7292073..cf83cff1 100644 --- a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java +++ b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java @@ -11,6 +11,7 @@ public static void main(String[] args) { TeaApplicationConfiguration config = new TeaApplicationConfiguration("canvas"); config.width = 0; config.height = 0; + config.showDownloadLogs = true; // new TeaApplication(new GearsDemo(), config); new TeaApplication(new ReadPixelsTest(), config); // new TeaApplication(new PixelTest(), config); diff --git a/examples/freetype/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java b/examples/freetype/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java index b87a47b5..0f3632f5 100644 --- a/examples/freetype/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java +++ b/examples/freetype/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java @@ -7,6 +7,7 @@ import java.io.File; import java.io.IOException; import org.teavm.tooling.TeaVMTool; +import org.teavm.vm.TeaVMOptimizationLevel; @SkipClass public class BuildFreetypeTest { @@ -17,6 +18,7 @@ public static void main(String[] args) throws IOException { teaBuildConfiguration.webappPath = new File("build/dist").getCanonicalPath(); TeaVMTool tool = TeaBuilder.config(teaBuildConfiguration); + tool.setOptimizationLevel(TeaVMOptimizationLevel.FULL); tool.setMainClass(FreetypeTestLauncher.class.getName()); tool.setObfuscated(false); TeaBuilder.build(tool); diff --git a/examples/gdx-tests/core/src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java b/examples/gdx-tests/core/src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java index b63668a2..8fa409f9 100644 --- a/examples/gdx-tests/core/src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java +++ b/examples/gdx-tests/core/src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java @@ -1,728 +1,337 @@ package com.badlogic.gdx.tests; +import com.badlogic.gdx.tests.bench.TiledMapBench; +import com.badlogic.gdx.tests.conformance.AudioSoundAndMusicIsolationTest; import com.badlogic.gdx.tests.conformance.DisplayModeTest; +import com.badlogic.gdx.tests.examples.MoveSpriteExample; +import com.badlogic.gdx.tests.extensions.FreeTypeAtlasTest; +import com.badlogic.gdx.tests.extensions.FreeTypeDisposeTest; +import com.badlogic.gdx.tests.extensions.FreeTypeFontLoaderTest; +import com.badlogic.gdx.tests.extensions.FreeTypeIncrementalTest; +import com.badlogic.gdx.tests.extensions.FreeTypeMetricsTest; +import com.badlogic.gdx.tests.extensions.FreeTypePackTest; +import com.badlogic.gdx.tests.extensions.FreeTypeTest; +import com.badlogic.gdx.tests.extensions.InternationalFontsTest; +import com.badlogic.gdx.tests.g3d.Animation3DTest; +import com.badlogic.gdx.tests.g3d.AnisotropyTest; +import com.badlogic.gdx.tests.g3d.Basic3DSceneTest; +import com.badlogic.gdx.tests.g3d.Basic3DTest; +import com.badlogic.gdx.tests.g3d.Benchmark3DTest; +import com.badlogic.gdx.tests.g3d.FogTest; +import com.badlogic.gdx.tests.g3d.FrameBufferCubemapTest; +import com.badlogic.gdx.tests.g3d.HeightMapTest; +import com.badlogic.gdx.tests.g3d.LightsTest; +import com.badlogic.gdx.tests.g3d.MaterialEmissiveTest; +import com.badlogic.gdx.tests.g3d.MaterialTest; +import com.badlogic.gdx.tests.g3d.MeshBuilderTest; import com.badlogic.gdx.tests.g3d.ModelCacheTest; +import com.badlogic.gdx.tests.g3d.ModelTest; import com.badlogic.gdx.tests.g3d.MultipleRenderTargetTest; +import com.badlogic.gdx.tests.g3d.ParticleControllerInfluencerSingleTest; +import com.badlogic.gdx.tests.g3d.ParticleControllerTest; +import com.badlogic.gdx.tests.g3d.PolarAccelerationTest; +import com.badlogic.gdx.tests.g3d.ShaderCollectionTest; +import com.badlogic.gdx.tests.g3d.ShaderTest; import com.badlogic.gdx.tests.g3d.ShadowMappingTest; +import com.badlogic.gdx.tests.g3d.SkeletonTest; +import com.badlogic.gdx.tests.g3d.TangentialAccelerationTest; import com.badlogic.gdx.tests.g3d.TextureArrayTest; import com.badlogic.gdx.tests.g3d.TextureRegion3DTest; +import com.badlogic.gdx.tests.g3d.utils.DefaultTextureBinderTest; +import com.badlogic.gdx.tests.gles2.HelloTriangle; +import com.badlogic.gdx.tests.gles2.SimpleVertexShader; import com.badlogic.gdx.tests.gles2.VertexArrayTest; import com.badlogic.gdx.tests.gles3.GL30Texture3DTest; import com.badlogic.gdx.tests.gles3.InstancedRenderingTest; +import com.badlogic.gdx.tests.gles3.ModelInstancedRenderingTest; +import com.badlogic.gdx.tests.gles3.NonPowerOfTwoTest; +import com.badlogic.gdx.tests.gles3.PixelBufferObjectTest; +import com.badlogic.gdx.tests.gles3.UniformBufferObjectsTest; +import com.badlogic.gdx.tests.gles31.GL31FrameBufferMultisampleTest; +import com.badlogic.gdx.tests.gles31.GL31IndirectDrawingIndexedTest; +import com.badlogic.gdx.tests.gles31.GL31IndirectDrawingNonIndexedTest; +import com.badlogic.gdx.tests.gles31.GL31ProgramIntrospectionTest; +import com.badlogic.gdx.tests.gles32.GL32AdvancedBlendingTest; +import com.badlogic.gdx.tests.gles32.GL32DebugControlTest; +import com.badlogic.gdx.tests.gles32.GL32MultipleRenderTargetsBlendingTest; +import com.badlogic.gdx.tests.gles32.GL32OffsetElementsTest; import com.badlogic.gdx.tests.gwt.GwtInputTest; import com.badlogic.gdx.tests.gwt.GwtWindowModeTest; +import com.badlogic.gdx.tests.math.CollisionPlaygroundTest; import com.badlogic.gdx.tests.math.OctreeTest; +import com.badlogic.gdx.tests.math.collision.OrientedBoundingBoxTest; +import com.badlogic.gdx.tests.net.NetAPITest; import com.badlogic.gdx.tests.net.OpenBrowserExample; import com.badlogic.gdx.tests.superkoalio.SuperKoalio; import com.badlogic.gdx.tests.utils.GdxTest; +import com.badlogic.gdx.tests.utils.IssueTest; import java.util.ArrayList; public class TeaVMGdxTests { public static TeaVMInstancer[] getTestList() { - ArrayList test = new ArrayList<>(); + ArrayList tests = new ArrayList<>(); // QUICK TEST ################################### - test.add( - new TeaVMInstancer() { - public GdxTest instance() { - return new SoundTest(); - } - } - ); - test.add( - new TeaVMInstancer() { - public GdxTest instance() { - return new MusicTest(); - } - } - ); - test.add( - new TeaVMInstancer() { - public GdxTest instance() { - return new TextureDataTest(); - } - } - ); - test.add( - new TeaVMInstancer() { - public GdxTest instance() { - return new FloatTextureTest(); - } - } - ); - test.add( - new TeaVMInstancer() { - public GdxTest instance() { - return new TextureRegion3DTest(); - } - } - ); - test.add( - new TeaVMInstancer() { - public GdxTest instance() { - return new GL30Texture3DTest(); - } - } - ); - test.add( - new TeaVMInstancer() { - public GdxTest instance() { - return new InstancedRenderingTest(); - } - } - ); - test.add( - new TeaVMInstancer() { - public GdxTest instance() { - return new TextureArrayTest(); - } - } - ); - test.add( - new TeaVMInstancer() { - public GdxTest instance() { - return new MultipleRenderTargetTest(); - } - } - ); + add(tests, SoundTest::new); + add(tests, MusicTest::new); + add(tests, TextureDataTest::new); + add(tests, FloatTextureTest::new); + add(tests, TextureRegion3DTest::new); + add(tests, GL30Texture3DTest::new); + add(tests, InstancedRenderingTest::new); + add(tests, TextureArrayTest::new); + add(tests, MultipleRenderTargetTest::new); // ################################### + add(tests, GwtInputTest::new); + add(tests, GwtWindowModeTest::new); + add(tests, OpenBrowserExample::new); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new AccelerometerTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new ActionTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new ActionSequenceTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new AlphaTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new AnimationTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new AnnotationTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new AssetManagerTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new AtlasIssueTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new BigMeshTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new BitmapFontAlignmentTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new BitmapFontFlipTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new BitmapFontTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new BitmapFontMetricsTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new BlitTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new BufferUtilsTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new ClipboardTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new ColorTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new ComplexActionTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new CustomShaderSpriteBatchTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new DecalTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new DisplayModeTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new LabelScaleTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new EdgeDetectionTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new FilesTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new FilterPerformanceTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new FrameBufferTest(); -// } -// } -// ); - test.add( - new TeaVMInstancer() { - public GdxTest instance() { - return new DownloadTest(); - } - } - ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new FramebufferToTextureTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new GestureDetectorTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new GLProfilerErrorTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new GroupCullingTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new GroupFadeTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new GwtInputTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new GwtWindowModeTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new I18NSimpleMessageTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new ImageScaleTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new IndexBufferObjectShaderTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new IntegerBitmapFontTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new InterpolationTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new InverseKinematicsTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new IsometricTileTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new KinematicBodyTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new LifeCycleTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new LabelTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new MeshShaderTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new MeshWithCustomAttributesTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new MipMapTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new ModelCacheTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new MultitouchTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new OctreeTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new OpenBrowserExample(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new ParallaxTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new ParticleEmitterTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new PixelsPerInchTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new PixmapPackerTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new PixmapTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new PreferencesTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new ProjectiveTextureTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new RotationTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new ReflectionCorrectnessTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new Scene2dTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new ShadowMappingTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new ShapeRendererTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new SimpleAnimationTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new SimpleDecalTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new SimpleStageCullingTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new SortedSpriteTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new SpriteBatchShaderTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new SpriteCacheOffsetTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new SpriteCacheTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new StageTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new SystemCursorTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new TableTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new TextButtonTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new TextureAtlasTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new TiledMapObjectLoadingTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new UITest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new VertexBufferObjectShaderTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new YDownTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new SuperKoalio(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new ReflectionTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new TiledMapAtlasAssetManagerTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new TimeUtilsTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new GWTLossyPremultipliedAlphaTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new QuadTreeFloatTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new QuadTreeFloatNearestTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new TextAreaTest(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new TextAreaTest2(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new TextAreaTest3(); -// } -// } -// ); -// test.add( -// new TeaVMInstancer() { -// public GdxTest instance() { -// return new VertexArrayTest(); -// } -// } -// ); + // #### START BUILD ERRORS #### +// add(tests, Box2DTest::new); - TeaVMInstancer[] t = new TeaVMInstancer[test.size()]; - return test.toArray(t); +// add(tests, Box2DTestCollection::new); +// add(tests, KinematicBodyTest::new); +// add(tests, BulletTestCollection::new); +// add(tests, PixelBufferObjectTest::new); +// add(tests, ETC1Test::new); +// add(tests, Gdx2DTest::new); +// add(tests, MatrixJNITest::new); +// add(tests, KTXTest::new); +// add(tests, VBOWithVAOPerformanceTest::new); +// add(tests, FreeTypeIncrementalTest::new); + + // #### END BUILD ERRORS #### + + add(tests, IssueTest::new); + add(tests, AccelerometerTest::new); + add(tests, ActionSequenceTest::new); + add(tests, ActionTest::new); + add(tests, Affine2Test::new); + add(tests, AlphaTest::new); + add(tests, Animation3DTest::new); + add(tests, AnimationTest::new); + add(tests, AnisotropyTest::new); + add(tests, AnnotationTest::new); + add(tests, AssetManagerTest::new); + add(tests, AtlasIssueTest::new); + add(tests, AudioChangeDeviceTest::new); + add(tests, AudioDeviceTest::new); + add(tests, AudioRecorderTest::new); + add(tests, AudioSoundAndMusicIsolationTest::new); + add(tests, Basic3DSceneTest::new); + add(tests, Basic3DTest::new); + add(tests, Benchmark3DTest::new); + add(tests, BigMeshTest::new); + add(tests, BitmapFontAlignmentTest::new); + add(tests, BitmapFontDistanceFieldTest::new); + add(tests, BitmapFontFlipTest::new); + add(tests, BitmapFontMetricsTest::new); + add(tests, BitmapFontTest::new); + add(tests, BitmapFontAtlasRegionTest::new); + add(tests, BlitTest::new); + add(tests, Bresenham2Test::new); + add(tests, BufferUtilsTest::new); + add(tests, ClipboardTest::new); + add(tests, CollectionsTest::new); + add(tests, CollisionPlaygroundTest::new); + add(tests, ColorTest::new); + add(tests, ContainerTest::new); + add(tests, CoordinatesTest::new); + add(tests, CpuSpriteBatchTest::new); + add(tests, CullTest::new); + add(tests, CursorTest::new); + add(tests, DecalTest::new); + add(tests, DefaultTextureBinderTest::new); + add(tests, DelaunayTriangulatorTest::new); + add(tests, DeltaTimeTest::new); + add(tests, DirtyRenderingTest::new); + add(tests, DisplayModeTest::new); + add(tests, DownloadTest::new); + add(tests, DragAndDropTest::new); + add(tests, EdgeDetectionTest::new); + add(tests, ExitTest::new); + add(tests, ExternalMusicTest::new); + add(tests, FilesTest::new); + add(tests, FilterPerformanceTest::new); + add(tests, FogTest::new); + add(tests, FrameBufferCubemapTest::new); + add(tests, FrameBufferTest::new); + add(tests, FramebufferToTextureTest::new); + add(tests, FullscreenTest::new); + add(tests, GestureDetectorTest::new); + add(tests, GLES30Test::new); + add(tests, GL31IndirectDrawingIndexedTest::new); + add(tests, GL31IndirectDrawingNonIndexedTest::new); + add(tests, GL31FrameBufferMultisampleTest::new); + add(tests, GL31ProgramIntrospectionTest::new); + add(tests, GL32AdvancedBlendingTest::new); + add(tests, GL32DebugControlTest::new); + add(tests, GL32MultipleRenderTargetsBlendingTest::new); + add(tests, GL32OffsetElementsTest::new); + add(tests, GLProfilerErrorTest::new); + add(tests, GroupCullingTest::new); + add(tests, GroupFadeTest::new); + add(tests, GroupTest::new); + add(tests, HeightMapTest::new); + add(tests, HelloTriangle::new); + add(tests, HexagonalTiledMapTest::new); + add(tests, I18NMessageTest::new); + add(tests, I18NSimpleMessageTest::new); + add(tests, ImageScaleTest::new); + add(tests, ImageTest::new); + add(tests, ImmediateModeRendererTest::new); + add(tests, IndexBufferObjectShaderTest::new); + add(tests, InputTest::new); + add(tests, IntegerBitmapFontTest::new); + add(tests, InterpolationTest::new); + add(tests, IntersectorOverlapConvexPolygonsTest::new); + add(tests, InverseKinematicsTest::new); + add(tests, IsometricTileTest::new); + add(tests, LabelScaleTest::new); + add(tests, LabelTest::new); + add(tests, LifeCycleTest::new); + add(tests, LightsTest::new); + add(tests, MaterialTest::new); + add(tests, MaterialEmissiveTest::new); + add(tests, MeshBuilderTest::new); + add(tests, MeshShaderTest::new); + add(tests, MeshWithCustomAttributesTest::new); + add(tests, MipMapTest::new); + add(tests, ModelTest::new); + add(tests, ModelCacheTest::new); + add(tests, ModelInstancedRenderingTest::new); + add(tests, MoveSpriteExample::new); + add(tests, MultitouchTest::new); + add(tests, NetAPITest::new); + add(tests, NinePatchTest::new); + add(tests, NoncontinuousRenderingTest::new); + add(tests, NonPowerOfTwoTest::new); + add(tests, OctreeTest::new); + add(tests, OnscreenKeyboardTest::new); + add(tests, OrientedBoundingBoxTest::new); + add(tests, PathTest::new); + add(tests, ParallaxTest::new); + add(tests, ParticleControllerInfluencerSingleTest::new); + add(tests, ParticleControllerTest::new); + add(tests, ParticleEmitterTest::new); + add(tests, ParticleEmittersTest::new); + add(tests, ParticleEmitterChangeSpriteTest::new); + add(tests, PixelsPerInchTest::new); + add(tests, PixmapBlendingTest::new); + add(tests, PixmapPackerTest::new); + add(tests, PixmapPackerIOTest::new); + add(tests, PixmapTest::new); + add(tests, PolarAccelerationTest::new); + add(tests, PolygonRegionTest::new); + add(tests, PolygonSpriteTest::new); + add(tests, PreferencesTest::new); + add(tests, ProjectTest::new); + add(tests, ProjectiveTextureTest::new); + add(tests, ReflectionTest::new); + add(tests, ReflectionCorrectnessTest::new); + add(tests, RotationTest::new); + add(tests, RunnablePostTest::new); + add(tests, Scene2dTest::new); + add(tests, ScrollPane2Test::new); + add(tests, ScrollPaneScrollBarsTest::new); + add(tests, ScrollPaneTest::new); + add(tests, ScrollPaneTextAreaTest::new); + add(tests, ScrollPaneWithDynamicScrolling::new); + add(tests, SelectTest::new); + add(tests, SensorTest::new); + add(tests, ShaderCollectionTest::new); + add(tests, ShaderMultitextureTest::new); + add(tests, ShaderTest::new); + add(tests, ShadowMappingTest::new); + add(tests, ShapeRendererTest::new); + add(tests, ShapeRendererAlphaTest::new); + add(tests, SimpleAnimationTest::new); + add(tests, SimpleDecalTest::new); + add(tests, SimpleStageCullingTest::new); + add(tests, SimpleVertexShader::new); + add(tests, SkeletonTest::new); + add(tests, SoftKeyboardTest::new); + add(tests, SortedSpriteTest::new); + add(tests, SpriteBatchRotationTest::new); + add(tests, SpriteBatchShaderTest::new); + add(tests, SpriteBatchTest::new); + add(tests, SpriteCacheOffsetTest::new); + add(tests, SpriteCacheTest::new); + add(tests, StageDebugTest::new); + add(tests, StagePerformanceTest::new); + add(tests, StageTest::new); + add(tests, SuperKoalio::new); + add(tests, SystemCursorTest::new); + add(tests, TableLayoutTest::new); + add(tests, TableTest::new); + add(tests, TangentialAccelerationTest::new); + add(tests, TextAreaTest::new); + add(tests, TextAreaTest2::new); + add(tests, TextAreaTest3::new); + add(tests, TextButtonTest::new); + add(tests, TextInputDialogTest::new); + add(tests, TextureAtlasTest::new); + add(tests, TextureDownloadTest::new); + add(tests, TextureFormatTest::new); + add(tests, TideMapAssetManagerTest::new); + add(tests, TideMapDirectLoaderTest::new); + add(tests, TiledDrawableTest::new); + add(tests, TileTest::new); + add(tests, TiledMapAnimationLoadingTest::new); + add(tests, TiledMapAssetManagerTest::new); + add(tests, TiledMapGroupLayerTest::new); + add(tests, TiledMapAtlasAssetManagerTest::new); + add(tests, TiledMapDirectLoaderTest::new); + add(tests, TiledMapModifiedExternalTilesetTest::new); + add(tests, TiledMapObjectLoadingTest::new); + add(tests, TiledMapObjectPropertyTest::new); + add(tests, TiledMapBench::new); + add(tests, TiledMapLayerOffsetTest::new); + add(tests, TimerTest::new); + add(tests, TimeUtilsTest::new); + add(tests, TouchpadTest::new); + add(tests, TreeTest::new); + add(tests, UISimpleTest::new); + add(tests, UITest::new); + add(tests, UniformBufferObjectsTest::new); + add(tests, UtfFontTest::new); + add(tests, Vector2dTest::new); + add(tests, VertexArrayTest::new); + add(tests, VertexBufferObjectShaderTest::new); + add(tests, VibratorTest::new); + add(tests, ViewportTest1::new); + add(tests, ViewportTest2::new); + add(tests, ViewportTest3::new); + add(tests, YDownTest::new); + add(tests, FreeTypeFontLoaderTest::new); + add(tests, FreeTypeDisposeTest::new); + add(tests, FreeTypeMetricsTest::new); + add(tests, FreeTypePackTest::new); + add(tests, FreeTypeAtlasTest::new); + add(tests, FreeTypeTest::new); + add(tests, InternationalFontsTest::new); + add(tests, PngTest::new); + add(tests, JsonTest::new); + add(tests, QuadTreeFloatTest::new); + add(tests, QuadTreeFloatNearestTest::new); + + TeaVMInstancer[] t = new TeaVMInstancer[tests.size()]; + return tests.toArray(t); + } + + private static void add(ArrayList tests, GdxRunnable instance) { + tests.add(new TeaVMInstancer() { + public GdxTest instance() { + return instance.run(); + } + }); + } + + public interface GdxRunnable { + GdxTest run(); } public abstract static class TeaVMInstancer implements AbstractTestWrapper.Instancer { diff --git a/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java b/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java index 290e33d6..41a6746d 100644 --- a/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java +++ b/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java @@ -10,12 +10,12 @@ import com.badlogic.gdx.tests.TeaVMGdxTests; import com.github.xpenatan.gdx.multiview.EmuFrameBuffer; import com.github.xpenatan.imgui.example.tests.frame.GameFrame; -import com.github.xpenatan.imgui.gdx.ImGuiGdxImpl; -import com.github.xpenatan.imgui.gdx.ImGuiGdxInputMultiplexer; import imgui.ImDrawData; import imgui.ImGui; import imgui.ImGuiIO; import imgui.ImVec2; +import imgui.gdx.ImGuiGdxImpl; +import imgui.gdx.ImGuiGdxInputMultiplexer; /** * Requires Gdx-test diff --git a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/FreeTypePixmap.java b/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/FreeTypePixmap.java deleted file mode 100644 index d10b9e4d..00000000 --- a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/FreeTypePixmap.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.badlogic.gdx.graphics; - -import com.github.xpenatan.gdx.backends.teavm.dom.CanvasRenderingContext2DWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; -import java.nio.ByteBuffer; -import org.teavm.jso.JSBody; - -/** - * @author Simon Gerst - */ -public class FreeTypePixmap extends PixmapEmu { - - ByteBuffer buffer; - - public FreeTypePixmap(int width, int height, PixmapEmu.FormatEmu format) { - super(width, height, format); - } - - public void setPixelsNull() { - pixels = null; - } - - public static ByteBuffer getRealPixels(PixmapEmu pixmap) { - if(pixmap.getWidth() == 0 || pixmap.getHeight() == 0) { - return FreeTypeUtil.newDirectReadWriteByteBuffer(); - } - if(pixmap.pixels == null) { - pixmap.pixels = pixmap.getContext().getImageData(0, 0, pixmap.getWidth(), pixmap.getHeight()).getData(); - pixmap.buffer = FreeTypeUtil.newDirectReadWriteByteBuffer(pixmap.pixels); - return pixmap.buffer; - } - return pixmap.buffer; - } - - public static void putPixelsBack(PixmapEmu pixmap, ByteBuffer pixels) { - if(pixmap.getWidth() == 0 || pixmap.getHeight() == 0) return; - ArrayBufferViewWrapper typedArray = FreeTypeUtil.getTypedArray(pixels); - putPixelsBack(typedArray, pixmap.getWidth(), pixmap.getHeight(), pixmap.getContext()); - } - - @JSBody(params = {"pixels", "width", "height", "ctx"}, script = "" + - "var imgData = ctx.createImageData(width, height);" + - "var data = imgData.data;" + - "for (var i = 0, len = width * height * 4; i < len; i++) {" + - "data[i] = pixels[i] & 0xff;" + - "}" + - "ctx.putImageData(imgData, 0, 0);") - private static native void putPixelsBack(ArrayBufferViewWrapper pixels, int width, int height, CanvasRenderingContext2DWrapper ctx); -} \ No newline at end of file diff --git a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeType.java b/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java similarity index 87% rename from extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeType.java rename to extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java index cdb232a7..4ec86fa6 100644 --- a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeType.java +++ b/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java @@ -19,9 +19,8 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.graphics.FreeTypePixmap; import com.badlogic.gdx.graphics.FreeTypeUtil; -import com.badlogic.gdx.graphics.PixmapEmu; +import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.utils.BufferUtils; import com.badlogic.gdx.utils.Disposable; import com.badlogic.gdx.utils.GdxRuntimeException; @@ -31,6 +30,7 @@ import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; +import com.github.xpenatan.gdx.backends.teavm.gen.Emulate; import com.github.xpenatan.gdx.backends.teavm.preloader.Preloader; import java.io.IOException; import java.io.InputStream; @@ -38,7 +38,8 @@ import java.nio.IntBuffer; import org.teavm.jso.JSBody; -public class FreeType { +@Emulate(valueStr = "com.badlogic.gdx.graphics.g2d.freetype.FreeType") +public class FreeTypeEmu { // @off /*JNI #include @@ -57,18 +58,20 @@ public class FreeType { @JSBody(script = "return Module._c_FreeType_getLastErrorCode();") static native int getLastErrorCode(); - private static class Pointer { + @Emulate(valueStr = "com.badlogic.gdx.graphics.g2d.freetype.FreeType$Pointer") + private static class PointerEmu { int address; - Pointer(int address) { + PointerEmu(int address) { this.address = address; } } - public static class Library extends Pointer implements Disposable { + @Emulate(valueStr = "com.badlogic.gdx.graphics.g2d.freetype.FreeType$Library") + public static class LibraryEmu extends PointerEmu implements Disposable { LongMap fontData = new LongMap(); - Library(int address) { + LibraryEmu(int address) { super(address); } @@ -83,7 +86,7 @@ public void dispose() { @JSBody(params = {"library"}, script = "Module._c_Library_doneFreeType(library);") private static native void doneFreeType(int library); - public Face newFace(FileHandle fontFile, int faceIndex) { + public FaceEmu newFace(FileHandle fontFile, int faceIndex) { ByteBuffer buffer = null; try { //buffer = fontFile.map(); //method missing in gwt emulation @@ -117,13 +120,13 @@ public Face newFace(FileHandle fontFile, int faceIndex) { return newMemoryFace(buffer, faceIndex); } - public Face newMemoryFace(byte[] data, int dataSize, int faceIndex) { + public FaceEmu newMemoryFace(byte[] data, int dataSize, int faceIndex) { ByteBuffer buffer = BufferUtils.newByteBuffer(data.length); BufferUtils.copy(data, 0, buffer, data.length); return newMemoryFace(buffer, faceIndex); } - public Face newMemoryFace(ByteBuffer buffer, int faceIndex) { + public FaceEmu newMemoryFace(ByteBuffer buffer, int faceIndex) { ArrayBufferViewWrapper buf = FreeTypeUtil.getTypedArray(buffer); int[] addressToFree = new int[]{0}; // Hacky way to get two return values @@ -136,7 +139,7 @@ public Face newMemoryFace(ByteBuffer buffer, int faceIndex) { } else { fontData.put(face, addressToFree[0]); - return new Face(face, this); + return new FaceEmu(face, this); } } @@ -148,21 +151,22 @@ public Face newMemoryFace(ByteBuffer buffer, int faceIndex) { "return ret") private static native int newMemoryFace(int library, ArrayBufferViewWrapper data, int dataSize, int faceIndex, int[] outAddressToFree); - public Stroker createStroker() { + public StrokerEmu createStroker() { int stroker = strokerNew(address); if(stroker == 0) throw new GdxRuntimeException("Couldn't create FreeType stroker, FreeType error code: " + getLastErrorCode()); - return new Stroker(stroker); + return new StrokerEmu(stroker); } @JSBody(params = {"library"}, script = "return Module._c_Library_strokerNew(library);") private static native int strokerNew(int library); } - public static class Face extends Pointer implements Disposable { - Library library; + @Emulate(valueStr = "com.badlogic.gdx.graphics.g2d.freetype.FreeType$Face") + public static class FaceEmu extends PointerEmu implements Disposable { + LibraryEmu library; - public Face(int address, Library library) { + public FaceEmu(int address, LibraryEmu library) { super(address); this.library = library; } @@ -285,15 +289,15 @@ public boolean loadChar(int charCode, int loadFlags) { @JSBody(params = {"face", "charCode", "loadFlags"}, script = "return !!Module._c_Face_loadChar(face, charCode, loadFlags);") private static native boolean loadChar(int face, int charCode, int loadFlags); - public GlyphSlot getGlyph() { - return new GlyphSlot(getGlyph(address)); + public GlyphSlotEmu getGlyph() { + return new GlyphSlotEmu(getGlyph(address)); } @JSBody(params = {"face"}, script = "return Module._c_Face_getGlyph(face);") private static native int getGlyph(int face); - public Size getSize() { - return new Size(getSize(address)); + public SizeEmu getSize() { + return new SizeEmu(getSize(address)); } @JSBody(params = {"face"}, script = "return Module._c_Face_getSize(face);") @@ -321,21 +325,23 @@ public int getCharIndex(int charCode) { private static native int getCharIndex(int face, int charCode); } - public static class Size extends Pointer { - Size(int address) { + @Emulate(valueStr = "com.badlogic.gdx.graphics.g2d.freetype.FreeType$Size") + public static class SizeEmu extends PointerEmu { + SizeEmu(int address) { super(address); } - public SizeMetrics getMetrics() { - return new SizeMetrics(getMetrics(address)); + public SizeMetricsEmu getMetrics() { + return new SizeMetricsEmu(getMetrics(address)); } @JSBody(params = {"address"}, script = "return Module._c_Size_getMetrics(address);") private static native int getMetrics(int address); } - public static class SizeMetrics extends Pointer { - SizeMetrics(int address) { + @Emulate(valueStr = "com.badlogic.gdx.graphics.g2d.freetype.FreeType$SizeMetrics") + public static class SizeMetricsEmu extends PointerEmu { + SizeMetricsEmu(int address) { super(address); } @@ -396,13 +402,14 @@ public int getMaxAdvance() { private static native int getMaxAdvance(int metrics); } - public static class GlyphSlot extends Pointer { - GlyphSlot(int address) { + @Emulate(valueStr = "com.badlogic.gdx.graphics.g2d.freetype.FreeType$GlyphSlot") + public static class GlyphSlotEmu extends PointerEmu { + GlyphSlotEmu(int address) { super(address); } - public GlyphMetrics getMetrics() { - return new GlyphMetrics(getMetrics(address)); + public GlyphMetricsEmu getMetrics() { + return new GlyphMetricsEmu(getMetrics(address)); } @JSBody(params = {"slot"}, script = "return Module._c_GlyphSlot_getMetrics(slot);") @@ -443,8 +450,8 @@ public int getFormat() { @JSBody(params = {"slot"}, script = "return Module._c_GlyphSlot_getFormat(slot);") private static native int getFormat(int slot); - public Bitmap getBitmap() { - return new Bitmap(getBitmap(address)); + public BitmapEmu getBitmap() { + return new BitmapEmu(getBitmap(address)); } @JSBody(params = {"slot"}, script = "return Module._c_GlyphSlot_getBitmap(slot);") @@ -471,21 +478,22 @@ public boolean renderGlyph(int renderMode) { @JSBody(params = {"slot", "renderMode"}, script = "return !!Module._c_GlyphSlot_renderGlyph(slot, renderMode);") private static native boolean renderGlyph(int slot, int renderMode); - public Glyph getGlyph() { + public GlyphEmu getGlyph() { int glyph = getGlyph(address); if(glyph == 0) throw new GdxRuntimeException("Couldn't get glyph, FreeType error code: " + getLastErrorCode()); - return new Glyph(glyph); + return new GlyphEmu(glyph); } @JSBody(params = {"glyphSlot"}, script = "return Module._c_GlyphSlot_getGlyph(glyphSlot);") private static native int getGlyph(int glyphSlot); } - public static class Glyph extends Pointer implements Disposable { + @Emulate(valueStr = "com.badlogic.gdx.graphics.g2d.freetype.FreeType$Glyph") + public static class GlyphEmu extends PointerEmu implements Disposable { private boolean rendered; - Glyph(int address) { + GlyphEmu(int address) { super(address); } @@ -501,7 +509,7 @@ private int bTI(boolean bool) { return bool == true ? 1 : 0; } - public void strokeBorder(Stroker stroker, boolean inside) { + public void strokeBorder(StrokerEmu stroker, boolean inside) { address = strokeBorder(address, stroker.address, bTI(inside)); } @@ -519,11 +527,11 @@ public void toBitmap(int renderMode) { @JSBody(params = {"glyph", "renderMode"}, script = "return Module._c_Glyph_toBitmap(glyph, renderMode);") private static native int toBitmap(int glyph, int renderMode); - public Bitmap getBitmap() { + public BitmapEmu getBitmap() { if(!rendered) { throw new GdxRuntimeException("Glyph is not yet rendered"); } - return new Bitmap(getBitmap(address)); + return new BitmapEmu(getBitmap(address)); } @JSBody(params = {"glyph"}, script = "return Module._c_Glyph_getBitmap(glyph);") @@ -550,8 +558,9 @@ public int getTop() { private static native int getTop(int glyph); } - public static class Bitmap extends Pointer { - Bitmap(int address) { + @Emulate(valueStr = "com.badlogic.gdx.graphics.g2d.freetype.FreeType$Bitmap") + public static class BitmapEmu extends PointerEmu { + BitmapEmu(int address) { super(address); } @@ -603,33 +612,29 @@ public ByteBuffer getBuffer() { private static native Int8ArrayWrapper getBuffer(int bitmap, int offset, int length); // @on - public PixmapEmu getPixmap(PixmapEmu.FormatEmu format, Color color, float gamma) { + public Pixmap getPixmap (Pixmap.Format format, Color color, float gamma) { int width = getWidth(), rows = getRows(); ByteBuffer src = getBuffer(); - FreeTypePixmap pixmap; - ByteBuffer changedPixels; + Pixmap pixmap; int pixelMode = getPixelMode(); int rowBytes = Math.abs(getPitch()); // We currently ignore negative pitch. - if(color == Color.WHITE && pixelMode == FT_PIXEL_MODE_GRAY && rowBytes == width && gamma == 1) { - pixmap = new FreeTypePixmap(width, rows, PixmapEmu.FormatEmu.Alpha); - changedPixels = FreeTypePixmap.getRealPixels(pixmap); - BufferUtils.copy(src, changedPixels, changedPixels.capacity()); - } - else { - pixmap = new FreeTypePixmap(width, rows, PixmapEmu.FormatEmu.RGBA8888); + if (color == Color.WHITE && pixelMode == FT_PIXEL_MODE_GRAY && rowBytes == width && gamma == 1) { + pixmap = new Pixmap(width, rows, Pixmap.Format.Alpha); + BufferUtils.copy(src, pixmap.getPixels(), pixmap.getPixels().capacity()); + } else { + pixmap = new Pixmap(width, rows, Pixmap.Format.RGBA8888); int rgba = Color.rgba8888(color); byte[] srcRow = new byte[rowBytes]; int[] dstRow = new int[width]; - changedPixels = FreeTypePixmap.getRealPixels(pixmap); - IntBuffer dst = changedPixels.asIntBuffer(); - if(pixelMode == FT_PIXEL_MODE_MONO) { + IntBuffer dst = pixmap.getPixels().asIntBuffer(); + if (pixelMode == FT_PIXEL_MODE_MONO) { // Use the specified color for each set bit. - for(int y = 0; y < rows; y++) { + for (int y = 0; y < rows; y++) { src.get(srcRow); - for(int i = 0, x = 0; x < width; i++, x += 8) { + for (int i = 0, x = 0; x < width; i++, x += 8) { byte b = srcRow[i]; - for(int ii = 0, n = Math.min(8, width - x); ii < n; ii++) { - if((b & (1 << (7 - ii))) != 0) + for (int ii = 0, n = Math.min(8, width - x); ii < n; ii++) { + if ((b & (1 << (7 - ii))) != 0) dstRow[x + ii] = rgba; else dstRow[x + ii] = 0; @@ -637,21 +642,20 @@ public PixmapEmu getPixmap(PixmapEmu.FormatEmu format, Color color, float gamma) } dst.put(dstRow); } - } - else { + } else { // Use the specified color for RGB, blend the FreeType bitmap with alpha. int rgb = rgba & 0xffffff00; int a = rgba & 0xff; - for(int y = 0; y < rows; y++) { + for (int y = 0; y < rows; y++) { src.get(srcRow); - for(int x = 0; x < width; x++) { + for (int x = 0; x < width; x++) { // Zero raised to any power is always zero. // 255 (=one) raised to any power is always one. // We only need Math.pow() when alpha is NOT zero and NOT one. int alpha = srcRow[x] & 0xff; - if(alpha == 0) + if (alpha == 0) dstRow[x] = rgb; - else if(alpha == 255) + else if (alpha == 255) dstRow[x] = rgb | a; else dstRow[x] = rgb | (int)(a * (float)Math.pow(alpha / 255f, gamma)); // Inverse gamma. @@ -661,15 +665,12 @@ else if(alpha == 255) } } - FreeTypePixmap.putPixelsBack(pixmap, changedPixels); - pixmap.setPixelsNull(); - - PixmapEmu converted = pixmap; - if(format != pixmap.getFormat()) { - converted = new PixmapEmu(pixmap.getWidth(), pixmap.getHeight(), format); - converted.setBlending(PixmapEmu.BlendingEmu.None); + Pixmap converted = pixmap; + if (format != pixmap.getFormat()) { + converted = new Pixmap(pixmap.getWidth(), pixmap.getHeight(), format); + converted.setBlending(Pixmap.Blending.None); converted.drawPixmap(pixmap, 0, 0); - converted.setBlending(PixmapEmu.BlendingEmu.SourceOver); + converted.setBlending(Pixmap.Blending.SourceOver); pixmap.dispose(); } return converted; @@ -691,8 +692,9 @@ public int getPixelMode() { private static native int getPixelMode(int bitmap); } - public static class GlyphMetrics extends Pointer { - GlyphMetrics(int address) { + @Emulate(valueStr = "com.badlogic.gdx.graphics.g2d.freetype.FreeType$GlyphMetrics") + public static class GlyphMetricsEmu extends PointerEmu { + GlyphMetricsEmu(int address) { super(address); } @@ -753,8 +755,9 @@ public int getVertAdvance() { private static native int getVertAdvance(int metrics); } - public static class Stroker extends Pointer implements Disposable { - Stroker(int address) { + @Emulate(valueStr = "com.badlogic.gdx.graphics.g2d.freetype.FreeType$Stroker") + public static class StrokerEmu extends PointerEmu implements Disposable { + StrokerEmu(int address) { super(address); } @@ -864,7 +867,7 @@ private static int encode(char a, char b, char c, char d) { private static boolean freeTypeInit; - public static Library initFreeType() { + public static LibraryEmu initFreeType() { if(!freeTypeInit) { TeaApplication app = (TeaApplication)Gdx.app; Preloader preloader = app.getPreloader(); @@ -886,7 +889,7 @@ public void onFailure(String url) { if(address == 0) throw new GdxRuntimeException("Couldn't initialize FreeType library"); else - return new Library(address); + return new LibraryEmu(address); } @JSBody(script = "return Module._c_FreeType_initFreeTypeJni();") diff --git a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeFontGenerator.java b/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeFontGenerator.java deleted file mode 100644 index 29e9a333..00000000 --- a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeFontGenerator.java +++ /dev/null @@ -1,912 +0,0 @@ -/******************************************************************************* - * Copyright 2011 See AUTHORS file. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ - -package com.badlogic.gdx.graphics.g2d.freetype; - -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.files.FileHandle; -import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.graphics.FreeTypePixmap; -import com.badlogic.gdx.graphics.PixmapEmu; -import com.badlogic.gdx.graphics.Texture.TextureFilter; -import com.badlogic.gdx.graphics.g2d.BitmapFont; -import com.badlogic.gdx.graphics.g2d.BitmapFont.BitmapFontData; -import com.badlogic.gdx.graphics.g2d.BitmapFont.Glyph; -import com.badlogic.gdx.graphics.g2d.GlyphLayout.GlyphRun; -import com.badlogic.gdx.graphics.g2d.PixmapPacker; -import com.badlogic.gdx.graphics.g2d.PixmapPacker.GuillotineStrategy; -import com.badlogic.gdx.graphics.g2d.PixmapPacker.PackStrategy; -import com.badlogic.gdx.graphics.g2d.PixmapPacker.SkylineStrategy; -import com.badlogic.gdx.graphics.g2d.TextureRegion; -import com.badlogic.gdx.graphics.g2d.freetype.FreeType.Bitmap; -import com.badlogic.gdx.graphics.g2d.freetype.FreeType.Face; -import com.badlogic.gdx.graphics.g2d.freetype.FreeType.GlyphMetrics; -import com.badlogic.gdx.graphics.g2d.freetype.FreeType.GlyphSlot; -import com.badlogic.gdx.graphics.g2d.freetype.FreeType.Library; -import com.badlogic.gdx.graphics.g2d.freetype.FreeType.SizeMetrics; -import com.badlogic.gdx.graphics.g2d.freetype.FreeType.Stroker; -import com.badlogic.gdx.math.MathUtils; -import com.badlogic.gdx.math.Rectangle; -import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.Disposable; -import com.badlogic.gdx.utils.GdxRuntimeException; -import com.badlogic.gdx.graphics.Pixmap; -import java.nio.ByteBuffer; - -/** - * Generates {@link BitmapFont} and {@link BitmapFontData} instances from TrueType, OTF, and other FreeType supported fonts. - *

- *

- * Usage example: - * - *

- * FreeTypeFontGenerator gen = new FreeTypeFontGenerator(Gdx.files.internal("myfont.ttf"));
- * BitmapFont font = gen.generateFont(16);
- * gen.dispose(); // Don't dispose if doing incremental glyph generation.
- * 
- *

- * The generator has to be disposed once it is no longer used. The returned {@link BitmapFont} instances are managed by the user - * and have to be disposed as usual. - * - * @author mzechner - * @author Nathan Sweet - * @author Rob Rendell - */ -public class FreeTypeFontGenerator implements Disposable { - static public final String DEFAULT_CHARS = "\u0000ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890\"!`?'.,;:()[]{}<>|/@\\^$€-%+=#_&~*\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u00A1\u00A2\u00A3\u00A4\u00A5\u00A6\u00A7\u00A8\u00A9\u00AA\u00AB\u00AC\u00AD\u00AE\u00AF\u00B0\u00B1\u00B2\u00B3\u00B4\u00B5\u00B6\u00B7\u00B8\u00B9\u00BA\u00BB\u00BC\u00BD\u00BE\u00BF\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5\u00C6\u00C7\u00C8\u00C9\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF\u00D0\u00D1\u00D2\u00D3\u00D4\u00D5\u00D6\u00D7\u00D8\u00D9\u00DA\u00DB\u00DC\u00DD\u00DE\u00DF\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u00E7\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF\u00F0\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u00F7\u00F8\u00F9\u00FA\u00FB\u00FC\u00FD\u00FE\u00FF"; - - /** - * A hint to scale the texture as needed, without capping it at any maximum size - */ - static public final int NO_MAXIMUM = -1; - - /** - * The maximum texture size allowed by generateData, when storing in a texture atlas. Multiple texture pages will be created - * if necessary. Default is 1024. - * - * @see #setMaxTextureSize(int) - */ - static private int maxTextureSize = 1024; - - final Library library; - final Face face; - final String name; - boolean bitmapped = false; - private int pixelWidth, pixelHeight; - - /** - * {@link #FreeTypeFontGenerator(FileHandle, int)} - */ - public FreeTypeFontGenerator(FileHandle fontFile) { - this(fontFile, 0); - } - - /** - * Creates a new generator from the given font file. Uses {@link FileHandle#length()} to determine the file size. If the file - * length could not be determined (it was 0), an extra copy of the font bytes is performed. Throws a - * {@link GdxRuntimeException} if loading did not succeed. - */ - public FreeTypeFontGenerator(FileHandle fontFile, int faceIndex) { - name = fontFile.nameWithoutExtension(); - library = FreeType.initFreeType(); - face = library.newFace(fontFile, faceIndex); - if(checkForBitmapFont()) return; - setPixelSizes(0, 15); - } - - private int getLoadingFlags(FreeTypeFontParameter parameter) { - int loadingFlags = FreeType.FT_LOAD_DEFAULT; - switch(parameter.hinting) { - case None: - loadingFlags |= FreeType.FT_LOAD_NO_HINTING; - break; - case Slight: - loadingFlags |= FreeType.FT_LOAD_TARGET_LIGHT; - break; - case Medium: - loadingFlags |= FreeType.FT_LOAD_TARGET_NORMAL; - break; - case Full: - loadingFlags |= FreeType.FT_LOAD_TARGET_MONO; - break; - case AutoSlight: - loadingFlags |= FreeType.FT_LOAD_FORCE_AUTOHINT | FreeType.FT_LOAD_TARGET_LIGHT; - break; - case AutoMedium: - loadingFlags |= FreeType.FT_LOAD_FORCE_AUTOHINT | FreeType.FT_LOAD_TARGET_NORMAL; - break; - case AutoFull: - loadingFlags |= FreeType.FT_LOAD_FORCE_AUTOHINT | FreeType.FT_LOAD_TARGET_MONO; - break; - } - return loadingFlags; - } - - private boolean loadChar(int c) { - return loadChar(c, FreeType.FT_LOAD_DEFAULT | FreeType.FT_LOAD_FORCE_AUTOHINT); - } - - private boolean loadChar(int c, int flags) { - return face.loadChar(c, flags); - } - - private boolean checkForBitmapFont() { - int faceFlags = face.getFaceFlags(); - if(((faceFlags & FreeType.FT_FACE_FLAG_FIXED_SIZES) == FreeType.FT_FACE_FLAG_FIXED_SIZES) - && ((faceFlags & FreeType.FT_FACE_FLAG_HORIZONTAL) == FreeType.FT_FACE_FLAG_HORIZONTAL)) { - if(loadChar(32)) { - GlyphSlot slot = face.getGlyph(); - if(slot.getFormat() == 1651078259) { - bitmapped = true; - } - } - } - return bitmapped; - } - - public BitmapFont generateFont(FreeTypeFontParameter parameter) { - return generateFont(parameter, new FreeTypeBitmapFontData()); - } - - /** - * Generates a new {@link BitmapFont}. The size is expressed in pixels. Throws a GdxRuntimeException if the font could not be - * generated. Using big sizes might cause such an exception. - * - * @param parameter configures how the font is generated - */ - public BitmapFont generateFont(FreeTypeFontParameter parameter, FreeTypeBitmapFontData data) { - boolean updateTextureRegions = data.regions == null && parameter.packer != null; - if(updateTextureRegions) data.regions = new Array(); - generateData(parameter, data); - if(updateTextureRegions) - parameter.packer.updateTextureRegions(data.regions, parameter.minFilter, parameter.magFilter, parameter.genMipMaps); - if(data.regions.isEmpty()) throw new GdxRuntimeException("Unable to create a font with no texture regions."); - BitmapFont font = new BitmapFont(data, data.regions, true); - font.setOwnsTexture(parameter.packer == null); - return font; - } - - /** - * Uses ascender and descender of font to calculate real height that makes all glyphs to fit in given pixel size. Source: - * http://nothings.org/stb/stb_truetype.h / stbtt_ScaleForPixelHeight - */ - public int scaleForPixelHeight(int height) { - setPixelSizes(0, height); - SizeMetrics fontMetrics = face.getSize().getMetrics(); - int ascent = FreeType.toInt(fontMetrics.getAscender()); - int descent = FreeType.toInt(fontMetrics.getDescender()); - return height * height / (ascent - descent); - } - - /** - * Uses max advance, ascender and descender of font to calculate real height that makes any n glyphs to fit in given pixel - * width. - * - * @param width the max width to fit (in pixels) - * @param numChars max number of characters that to fill width - */ - public int scaleForPixelWidth(int width, int numChars) { - SizeMetrics fontMetrics = face.getSize().getMetrics(); - int advance = FreeType.toInt(fontMetrics.getMaxAdvance()); - int ascent = FreeType.toInt(fontMetrics.getAscender()); - int descent = FreeType.toInt(fontMetrics.getDescender()); - int unscaledHeight = ascent - descent; - int height = unscaledHeight * width / (advance * numChars); - setPixelSizes(0, height); - return height; - } - - /** - * Uses max advance, ascender and descender of font to calculate real height that makes any n glyphs to fit in given pixel - * width and height. - * - * @param width the max width to fit (in pixels) - * @param height the max height to fit (in pixels) - * @param numChars max number of characters that to fill width - */ - public int scaleToFitSquare(int width, int height, int numChars) { - return Math.min(scaleForPixelHeight(height), scaleForPixelWidth(width, numChars)); - } - - public class GlyphAndBitmap { - public Glyph glyph; - public Bitmap bitmap; - } - - /** - * Returns null if glyph was not found. If there is nothing to render, for example with various space characters, then bitmap - * is null. - */ - public GlyphAndBitmap generateGlyphAndBitmap(int c, int size, boolean flip) { - setPixelSizes(0, size); - - SizeMetrics fontMetrics = face.getSize().getMetrics(); - int baseline = FreeType.toInt(fontMetrics.getAscender()); - - // Check if character exists in this font. - // 0 means 'undefined character code' - if(face.getCharIndex(c) == 0) { - return null; - } - - // Try to load character - if(!loadChar(c)) { - throw new GdxRuntimeException("Unable to load character!"); - } - - GlyphSlot slot = face.getGlyph(); - - // Try to render to bitmap - Bitmap bitmap; - if(bitmapped) { - bitmap = slot.getBitmap(); - } - else if(!slot.renderGlyph(FreeType.FT_RENDER_MODE_NORMAL)) { - bitmap = null; - } - else { - bitmap = slot.getBitmap(); - } - - GlyphMetrics metrics = slot.getMetrics(); - - Glyph glyph = new Glyph(); - if(bitmap != null) { - glyph.width = bitmap.getWidth(); - glyph.height = bitmap.getRows(); - } - else { - glyph.width = 0; - glyph.height = 0; - } - glyph.xoffset = slot.getBitmapLeft(); - glyph.yoffset = flip ? -slot.getBitmapTop() + baseline : -(glyph.height - slot.getBitmapTop()) - baseline; - glyph.xadvance = FreeType.toInt(metrics.getHoriAdvance()); - glyph.srcX = 0; - glyph.srcY = 0; - glyph.id = c; - - GlyphAndBitmap result = new GlyphAndBitmap(); - result.glyph = glyph; - result.bitmap = bitmap; - return result; - } - - /** - * Generates a new {@link BitmapFontData} instance, expert usage only. Throws a GdxRuntimeException if something went wrong. - * - * @param size the size in pixels - */ - public FreeTypeBitmapFontData generateData(int size) { - FreeTypeFontParameter parameter = new FreeTypeFontParameter(); - parameter.size = size; - return generateData(parameter); - } - - public FreeTypeBitmapFontData generateData(FreeTypeFontParameter parameter) { - return generateData(parameter, new FreeTypeBitmapFontData()); - } - - void setPixelSizes(int pixelWidth, int pixelHeight) { - this.pixelWidth = pixelWidth; - this.pixelHeight = pixelHeight; - if(!bitmapped && !face.setPixelSizes(pixelWidth, pixelHeight)) - throw new GdxRuntimeException("Couldn't set size for font"); - } - - /** - * Generates a new {@link BitmapFontData} instance, expert usage only. Throws a GdxRuntimeException if something went wrong. - * - * @param parameter configures how the font is generated - */ - public FreeTypeBitmapFontData generateData(FreeTypeFontParameter parameter, FreeTypeBitmapFontData data) { - data.name = name + "-" + parameter.size; - parameter = parameter == null ? new FreeTypeFontParameter() : parameter; - char[] characters = parameter.characters.toCharArray(); - int charactersLength = characters.length; - boolean incremental = parameter.incremental; - int flags = getLoadingFlags(parameter); - - setPixelSizes(0, parameter.size); - - // set general font data - SizeMetrics fontMetrics = face.getSize().getMetrics(); - data.flipped = parameter.flip; - data.ascent = FreeType.toInt(fontMetrics.getAscender()); - data.descent = FreeType.toInt(fontMetrics.getDescender()); - data.lineHeight = FreeType.toInt(fontMetrics.getHeight()); - float baseLine = data.ascent; - - // if bitmapped - if(bitmapped && (data.lineHeight == 0)) { - for(int c = 32; c < (32 + face.getNumGlyphs()); c++) { - if(loadChar(c, flags)) { - int lh = FreeType.toInt(face.getGlyph().getMetrics().getHeight()); - data.lineHeight = (lh > data.lineHeight) ? lh : data.lineHeight; - } - } - } - data.lineHeight += parameter.spaceY; - - // determine space width - if(loadChar(' ', flags) || loadChar('l', flags)) { - data.spaceXadvance = FreeType.toInt(face.getGlyph().getMetrics().getHoriAdvance()); - } - else { - data.spaceXadvance = face.getMaxAdvanceWidth(); // Possibly very wrong. - } - - // determine x-height - for(char xChar : data.xChars) { - if(!loadChar(xChar, flags)) continue; - data.xHeight = FreeType.toInt(face.getGlyph().getMetrics().getHeight()); - break; - } - if(data.xHeight == 0) throw new GdxRuntimeException("No x-height character found in font"); - - // determine cap height - for(char capChar : data.capChars) { - if(!loadChar(capChar, flags)) continue; - data.capHeight = FreeType.toInt(face.getGlyph().getMetrics().getHeight()) + Math.abs(parameter.shadowOffsetY); - break; - } - if(!bitmapped && data.capHeight == 1) throw new GdxRuntimeException("No cap character found in font"); - - data.ascent -= data.capHeight; - data.down = -data.lineHeight; - if(parameter.flip) { - data.ascent = -data.ascent; - data.down = -data.down; - } - - boolean ownsAtlas = false; - - PixmapPacker packer = parameter.packer; - - if(packer == null) { - // Create a packer. - int size; - PackStrategy packStrategy; - if(incremental) { - size = maxTextureSize; - packStrategy = new GuillotineStrategy(); - } - else { - int maxGlyphHeight = (int)Math.ceil(data.lineHeight); - size = MathUtils.nextPowerOfTwo((int)Math.sqrt(maxGlyphHeight * maxGlyphHeight * charactersLength)); - if(maxTextureSize > 0) size = Math.min(size, maxTextureSize); - packStrategy = new SkylineStrategy(); - } - ownsAtlas = true; - packer = new PixmapPacker(size, size, com.badlogic.gdx.graphics.Pixmap.Format.RGBA8888, 1, false, packStrategy); - packer.setTransparentColor(parameter.color); - packer.getTransparentColor().a = 0; - if(parameter.borderWidth > 0) { - packer.setTransparentColor(parameter.borderColor); - packer.getTransparentColor().a = 0; - } - } - - if(incremental) data.glyphs = new Array(charactersLength + 32); - - Stroker stroker = null; - if(parameter.borderWidth > 0) { - stroker = library.createStroker(); - stroker.set((int)(parameter.borderWidth * 64f), - parameter.borderStraight ? FreeType.FT_STROKER_LINECAP_BUTT : FreeType.FT_STROKER_LINECAP_ROUND, - parameter.borderStraight ? FreeType.FT_STROKER_LINEJOIN_MITER_FIXED : FreeType.FT_STROKER_LINEJOIN_ROUND, 0); - } - - // Create glyphs largest height first for best packing. - int[] heights = new int[charactersLength]; - for(int i = 0; i < charactersLength; i++) { - char c = characters[i]; - - int height = loadChar(c, flags) ? FreeType.toInt(face.getGlyph().getMetrics().getHeight()) : 0; - heights[i] = height; - - if(c == '\0') { - Glyph missingGlyph = createGlyph('\0', data, parameter, stroker, baseLine, packer); - if(missingGlyph != null && missingGlyph.width != 0 && missingGlyph.height != 0) { - data.setGlyph('\0', missingGlyph); - data.missingGlyph = missingGlyph; - if(incremental) data.glyphs.add(missingGlyph); - } - } - } - int heightsCount = heights.length; - while(heightsCount > 0) { - int best = 0, maxHeight = heights[0]; - for(int i = 1; i < heightsCount; i++) { - int height = heights[i]; - if(height > maxHeight) { - maxHeight = height; - best = i; - } - } - - char c = characters[best]; - if(data.getGlyph(c) == null) { - Glyph glyph = createGlyph(c, data, parameter, stroker, baseLine, packer); - if(glyph != null) { - data.setGlyph(c, glyph); - if(incremental) data.glyphs.add(glyph); - } - } - - heightsCount--; - heights[best] = heights[heightsCount]; - char tmpChar = characters[best]; - characters[best] = characters[heightsCount]; - characters[heightsCount] = tmpChar; - } - - if(stroker != null && !incremental) stroker.dispose(); - - if(incremental) { - data.generator = this; - data.parameter = parameter; - data.stroker = stroker; - data.packer = packer; - } - - // Generate kerning. - parameter.kerning &= face.hasKerning(); - if(parameter.kerning) { - for(int i = 0; i < charactersLength; i++) { - char firstChar = characters[i]; - Glyph first = data.getGlyph(firstChar); - if(first == null) continue; - int firstIndex = face.getCharIndex(firstChar); - for(int ii = i; ii < charactersLength; ii++) { - char secondChar = characters[ii]; - Glyph second = data.getGlyph(secondChar); - if(second == null) continue; - int secondIndex = face.getCharIndex(secondChar); - - int kerning = face.getKerning(firstIndex, secondIndex, 0); // FT_KERNING_DEFAULT (scaled then rounded). - if(kerning != 0) first.setKerning(secondChar, FreeType.toInt(kerning)); - - kerning = face.getKerning(secondIndex, firstIndex, 0); // FT_KERNING_DEFAULT (scaled then rounded). - if(kerning != 0) second.setKerning(firstChar, FreeType.toInt(kerning)); - } - } - } - - // Generate texture regions. - if(ownsAtlas) { - data.regions = new Array(); - packer.updateTextureRegions(data.regions, parameter.minFilter, parameter.magFilter, parameter.genMipMaps); - } - - // Set space glyph. - Glyph spaceGlyph = data.getGlyph(' '); - if(spaceGlyph == null) { - spaceGlyph = new Glyph(); - spaceGlyph.xadvance = (int)data.spaceXadvance + parameter.spaceX; - spaceGlyph.id = (int)' '; - data.setGlyph(' ', spaceGlyph); - } - if(spaceGlyph.width == 0) spaceGlyph.width = (int)(spaceGlyph.xadvance + data.padRight); - - return data; - } - - /** - * @return null if glyph was not found. - */ - Glyph createGlyph(char c, FreeTypeBitmapFontData data, FreeTypeFontParameter parameter, Stroker stroker, float baseLine, PixmapPacker packer) { - - boolean missing = face.getCharIndex(c) == 0 && c != 0; - if(missing) return null; - - if(!loadChar(c, getLoadingFlags(parameter))) return null; - - GlyphSlot slot = face.getGlyph(); - FreeType.Glyph mainGlyph = slot.getGlyph(); - try { - mainGlyph.toBitmap(parameter.mono ? FreeType.FT_RENDER_MODE_MONO : FreeType.FT_RENDER_MODE_NORMAL); - } - catch(GdxRuntimeException e) { - mainGlyph.dispose(); - Gdx.app.log("FreeTypeFontGenerator", "Couldn't render char: " + c); - return null; - } - Bitmap mainBitmap = mainGlyph.getBitmap(); - PixmapEmu mainPixmap = mainBitmap.getPixmap(PixmapEmu.FormatEmu.RGBA8888, parameter.color, parameter.gamma); - - if(mainBitmap.getWidth() != 0 && mainBitmap.getRows() != 0) { - int offsetX = 0, offsetY = 0; - if(parameter.borderWidth > 0) { - // execute stroker; this generates a glyph "extended" along the outline - int top = mainGlyph.getTop(), left = mainGlyph.getLeft(); - FreeType.Glyph borderGlyph = slot.getGlyph(); - borderGlyph.strokeBorder(stroker, false); - borderGlyph.toBitmap(parameter.mono ? FreeType.FT_RENDER_MODE_MONO : FreeType.FT_RENDER_MODE_NORMAL); - offsetX = left - borderGlyph.getLeft(); - offsetY = -(top - borderGlyph.getTop()); - - // Render border (pixmap is bigger than main). - Bitmap borderBitmap = borderGlyph.getBitmap(); - PixmapEmu borderPixmap = borderBitmap.getPixmap(PixmapEmu.FormatEmu.RGBA8888, parameter.borderColor, parameter.borderGamma); - - // Draw main glyph on top of border. - for(int i = 0, n = parameter.renderCount; i < n; i++) - borderPixmap.drawPixmap(mainPixmap, offsetX, offsetY); - - mainPixmap.dispose(); - mainGlyph.dispose(); - mainPixmap = borderPixmap; - mainGlyph = borderGlyph; - } - - if(parameter.shadowOffsetX != 0 || parameter.shadowOffsetY != 0) { - int mainW = mainPixmap.getWidth(), mainH = mainPixmap.getHeight(); - int shadowOffsetX = Math.max(parameter.shadowOffsetX, 0), shadowOffsetY = Math.max(parameter.shadowOffsetY, 0); - int shadowW = mainW + Math.abs(parameter.shadowOffsetX), shadowH = mainH + Math.abs(parameter.shadowOffsetY); - PixmapEmu shadowPixmap = new PixmapEmu(shadowW, shadowH, mainPixmap.getFormat()); - - Color shadowColor = parameter.shadowColor; - float a = shadowColor.a; - if(a != 0) { - byte r = (byte)(shadowColor.r * 255), g = (byte)(shadowColor.g * 255), b = (byte)(shadowColor.b * 255); - ByteBuffer mainPixels = FreeTypePixmap.getRealPixels(mainPixmap); - ByteBuffer shadowPixels = FreeTypePixmap.getRealPixels(shadowPixmap); - for(int y = 0; y < mainH; y++) { - int shadowRow = shadowW * (y + shadowOffsetY) + shadowOffsetX; - for(int x = 0; x < mainW; x++) { - int mainPixel = (mainW * y + x) * 4; - byte mainA = mainPixels.get(mainPixel + 3); - if(mainA == 0) continue; - int shadowPixel = (shadowRow + x) * 4; - shadowPixels.put(shadowPixel, r); - shadowPixels.put(shadowPixel + 1, g); - shadowPixels.put(shadowPixel + 2, b); - shadowPixels.put(shadowPixel + 3, (byte)((mainA & 0xff) * a)); - } - } - FreeTypePixmap.putPixelsBack(shadowPixmap, shadowPixels); - } - - // Draw main glyph (with any border) on top of shadow. - for(int i = 0, n = parameter.renderCount; i < n; i++) - shadowPixmap.drawPixmap(mainPixmap, Math.max(-parameter.shadowOffsetX, 0), Math.max(-parameter.shadowOffsetY, 0)); - mainPixmap.dispose(); - mainPixmap = shadowPixmap; - } - else if(parameter.borderWidth == 0) { - // No shadow and no border, draw glyph additional times. - for(int i = 0, n = parameter.renderCount - 1; i < n; i++) - mainPixmap.drawPixmap(mainPixmap, 0, 0); - } - - if(parameter.padTop > 0 || parameter.padLeft > 0 || parameter.padBottom > 0 || parameter.padRight > 0) { - PixmapEmu padPixmap = new PixmapEmu(mainPixmap.getWidth() + parameter.padLeft + parameter.padRight, - mainPixmap.getHeight() + parameter.padTop + parameter.padBottom, mainPixmap.getFormat()); - padPixmap.setBlending(PixmapEmu.BlendingEmu.None); - padPixmap.drawPixmap(mainPixmap, parameter.padLeft, parameter.padTop); - mainPixmap.dispose(); - mainPixmap = padPixmap; - } - } - - GlyphMetrics metrics = slot.getMetrics(); - Glyph glyph = new Glyph(); - glyph.id = c; - glyph.width = mainPixmap.getWidth(); - glyph.height = mainPixmap.getHeight(); - glyph.xoffset = mainGlyph.getLeft(); - if(parameter.flip) - glyph.yoffset = -mainGlyph.getTop() + (int)baseLine; - else - glyph.yoffset = -(glyph.height - mainGlyph.getTop()) - (int)baseLine; - glyph.xadvance = FreeType.toInt(metrics.getHoriAdvance()) + (int)parameter.borderWidth + parameter.spaceX; - - if(bitmapped) { - mainPixmap.setColor(Color.CLEAR); - mainPixmap.fill(); - ByteBuffer buf = mainBitmap.getBuffer(); - int whiteIntBits = Color.WHITE.toIntBits(); - int clearIntBits = Color.CLEAR.toIntBits(); - for(int h = 0; h < glyph.height; h++) { - int idx = h * mainBitmap.getPitch(); - for(int w = 0; w < (glyph.width + glyph.xoffset); w++) { - int bit = (buf.get(idx + (w / 8)) >>> (7 - (w % 8))) & 1; - mainPixmap.drawPixel(w, h, ((bit == 1) ? whiteIntBits : clearIntBits)); - } - } - } - - Object obj = mainPixmap; - Pixmap pixmap = (Pixmap)obj; - Rectangle rect = packer.pack(pixmap); - glyph.page = packer.getPages().size - 1; // Glyph is always packed into the last page for now. - glyph.srcX = (int)rect.x; - glyph.srcY = (int)rect.y; - - // If a page was added, create a new texture region for the incrementally added glyph. - if(parameter.incremental && data.regions != null && data.regions.size <= glyph.page) - packer.updateTextureRegions(data.regions, parameter.minFilter, parameter.magFilter, parameter.genMipMaps); - - mainPixmap.dispose(); - mainGlyph.dispose(); - - return glyph; - } - - /** - * check the font glyph exists for single UTF-32 code point - */ - public boolean hasGlyph(int charCode) { - // 0 stand for undefined character code - return face.getCharIndex(charCode) != 0; - } - - public String toString() { - return name; - } - - /** - * Cleans up all resources of the generator. Call this if you no longer use the generator. - */ - @Override - public void dispose() { - face.dispose(); - library.dispose(); - } - - /** - * Sets the maximum size that will be used when generating texture atlases for glyphs with generateData(). The - * default is 1024. By specifying {@link #NO_MAXIMUM}, the texture atlas will scale as needed. - *

- * The power-of-two square texture size will be capped to the given texSize. It's recommended that a power-of-two - * value be used here. - *

- * Multiple pages may be used to fit all the generated glyphs. You can query the resulting number of pages by calling - * bitmapFont.getRegions().length or freeTypeBitmapFontData.getTextureRegions().length. - *

- * If PixmapPacker is specified when calling generateData, this parameter is ignored. - * - * @param texSize the maximum texture size for one page of glyphs - */ - public static void setMaxTextureSize(int texSize) { - maxTextureSize = texSize; - } - - /** - * Returns the maximum texture size that will be used by generateData() when creating a texture atlas for the glyphs. - * - * @return the power-of-two max texture size - */ - public static int getMaxTextureSize() { - return maxTextureSize; - } - - /** - * {@link BitmapFontData} used for fonts generated via the {@link FreeTypeFontGenerator}. The texture storing the glyphs is - * held in memory, thus the {@link #getImagePaths()} and {@link #getFontFile()} methods will return null. - * - * @author mzechner - * @author Nathan Sweet - */ - static public class FreeTypeBitmapFontData extends BitmapFontData implements Disposable { - public Array regions; - - // Fields for incremental glyph generation. - FreeTypeFontGenerator generator; - FreeTypeFontParameter parameter; - Stroker stroker; - PixmapPacker packer; - Array glyphs; - private boolean dirty; - - @Override - public Glyph getGlyph(char ch) { - Glyph glyph = super.getGlyph(ch); - if(glyph == null && generator != null) { - generator.setPixelSizes(0, parameter.size); - float baseline = ((flipped ? -ascent : ascent) + capHeight) / scaleY; - glyph = generator.createGlyph(ch, this, parameter, stroker, baseline, packer); - if(glyph == null) return missingGlyph; - - setGlyphRegion(glyph, regions.get(glyph.page)); - setGlyph(ch, glyph); - glyphs.add(glyph); - dirty = true; - - Face face = generator.face; - if(parameter.kerning) { - int glyphIndex = face.getCharIndex(ch); - for(int i = 0, n = glyphs.size; i < n; i++) { - Glyph other = glyphs.get(i); - int otherIndex = face.getCharIndex(other.id); - - int kerning = face.getKerning(glyphIndex, otherIndex, 0); - if(kerning != 0) glyph.setKerning(other.id, FreeType.toInt(kerning)); - - kerning = face.getKerning(otherIndex, glyphIndex, 0); - if(kerning != 0) other.setKerning(ch, FreeType.toInt(kerning)); - } - } - } - return glyph; - } - - public void getGlyphs(GlyphRun run, CharSequence str, int start, int end, Glyph lastGlyph) { - if(packer != null) - packer.setPackToTexture(true); // All glyphs added after this are packed directly to the texture. - super.getGlyphs(run, str, start, end, lastGlyph); - if(dirty) { - dirty = false; - packer.updateTextureRegions(regions, parameter.minFilter, parameter.magFilter, parameter.genMipMaps); - } - } - - @Override - public void dispose() { - if(stroker != null) stroker.dispose(); - if(packer != null) packer.dispose(); - } - } - - /** - * Font smoothing algorithm. - */ - public static enum Hinting { - /** - * Disable hinting. Generated glyphs will look blurry. - */ - None, - /** - * Light hinting with fuzzy edges, but close to the original shape - */ - Slight, - /** - * Average hinting - */ - Medium, - /** - * Strong hinting with crisp edges at the expense of shape fidelity - */ - Full, - /** - * Light hinting with fuzzy edges, but close to the original shape. Uses the FreeType auto-hinter. - */ - AutoSlight, - /** - * Average hinting. Uses the FreeType auto-hinter. - */ - AutoMedium, - /** - * Strong hinting with crisp edges at the expense of shape fidelity. Uses the FreeType auto-hinter. - */ - AutoFull, - } - - /** - * Parameter container class that helps configure how {@link FreeTypeBitmapFontData} and {@link BitmapFont} instances are - * generated. - *

- * The packer field is for advanced usage, where it is necessary to pack multiple BitmapFonts (i.e. styles, sizes, families) - * into a single Texture atlas. If no packer is specified, the generator will use its own PixmapPacker to pack the glyphs into - * a power-of-two sized texture, and the resulting {@link FreeTypeBitmapFontData} will have a valid {@link TextureRegion} which - * can be used to construct a new {@link BitmapFont}. - * - * @author siondream - * @author Nathan Sweet - */ - public static class FreeTypeFontParameter { - /** - * The size in pixels - */ - public int size = 16; - /** - * If true, font smoothing is disabled. - */ - public boolean mono; - /** - * Strength of hinting - */ - public Hinting hinting = Hinting.AutoMedium; - /** - * Foreground color (required for non-black borders) - */ - public Color color = Color.WHITE; - /** - * Glyph gamma. Values > 1 reduce antialiasing. - */ - public float gamma = 1.8f; - /** - * Number of times to render the glyph. Useful with a shadow or border, so it doesn't show through the glyph. - */ - public int renderCount = 2; - /** - * Border width in pixels, 0 to disable - */ - public float borderWidth = 0; - /** - * Border color; only used if borderWidth > 0 - */ - public Color borderColor = Color.BLACK; - /** - * true for straight (mitered), false for rounded borders - */ - public boolean borderStraight = false; - /** - * Values < 1 increase the border size. - */ - public float borderGamma = 1.8f; - /** - * Offset of text shadow on X axis in pixels, 0 to disable - */ - public int shadowOffsetX = 0; - /** - * Offset of text shadow on Y axis in pixels, 0 to disable - */ - public int shadowOffsetY = 0; - /** - * Shadow color; only used if shadowOffset > 0. If alpha component is 0, no shadow is drawn but characters are still offset - * by shadowOffset. - */ - public Color shadowColor = new Color(0, 0, 0, 0.75f); - /** - * Pixels to add to glyph spacing when text is rendered. Can be negative. - */ - public int spaceX, spaceY; - /** - * Pixels to add to the glyph in the texture. Cannot be negative. - */ - public int padTop, padLeft, padBottom, padRight; - /** - * The characters the font should contain. If '\0' is not included then {@link BitmapFontData#missingGlyph} is not set. - */ - public String characters = DEFAULT_CHARS; - /** - * Whether the font should include kerning - */ - public boolean kerning = true; - /** - * The optional PixmapPacker to use for packing multiple fonts into a single texture. - * - * @see FreeTypeFontParameter - */ - public PixmapPacker packer = null; - /** - * Whether to flip the font vertically - */ - public boolean flip = false; - /** - * Whether to generate mip maps for the resulting texture - */ - public boolean genMipMaps = false; - /** - * Minification filter - */ - public TextureFilter minFilter = TextureFilter.Nearest; - /** - * Magnification filter - */ - public TextureFilter magFilter = TextureFilter.Nearest; - /** - * When true, glyphs are rendered on the fly to the font's glyph page textures as they are needed. The - * FreeTypeFontGenerator must not be disposed until the font is no longer needed. The FreeTypeBitmapFontData must be - * disposed (separately from the generator) when the font is no longer needed. The FreeTypeFontParameter should not be - * modified after creating a font. If a PixmapPacker is not specified, the font glyph page textures will use - * {@link FreeTypeFontGenerator#getMaxTextureSize()}. - */ - public boolean incremental; - } -} \ No newline at end of file diff --git a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeFontGeneratorLoader.java b/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeFontGeneratorLoader.java deleted file mode 100644 index 1c32f756..00000000 --- a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeFontGeneratorLoader.java +++ /dev/null @@ -1,63 +0,0 @@ -/******************************************************************************* - * Copyright 2011 See AUTHORS file. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ - -package com.badlogic.gdx.graphics.g2d.freetype; - -import com.badlogic.gdx.assets.AssetDescriptor; -import com.badlogic.gdx.assets.AssetLoaderParameters; -import com.badlogic.gdx.assets.AssetManager; -import com.badlogic.gdx.assets.loaders.FileHandleResolver; -import com.badlogic.gdx.assets.loaders.SynchronousAssetLoader; -import com.badlogic.gdx.files.FileHandle; -import com.badlogic.gdx.utils.Array; - -/** - * Makes {@link FreeTypeFontGenerator} managable via {@link AssetManager}. - *

- * Do - * {@code assetManager.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(new InternalFileHandleResolver()))} - * to register it. - *

- * - * @author Daniel Holderbaum - */ -public class FreeTypeFontGeneratorLoader extends SynchronousAssetLoader { - - public FreeTypeFontGeneratorLoader(FileHandleResolver resolver) { - super(resolver); - } - - @Override - public FreeTypeFontGenerator load(AssetManager assetManager, String fileName, FileHandle file, - FreeTypeFontGeneratorParameters parameter) { - FreeTypeFontGenerator generator = null; - if(file.extension().equals("gen")) { - generator = new FreeTypeFontGenerator(file.sibling(file.nameWithoutExtension())); - } - else { - generator = new FreeTypeFontGenerator(file); - } - return generator; - } - - @Override - public Array getDependencies(String fileName, FileHandle file, FreeTypeFontGeneratorParameters parameter) { - return null; - } - - static public class FreeTypeFontGeneratorParameters extends AssetLoaderParameters { - } -} \ No newline at end of file diff --git a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreetypeFontLoader.java b/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreetypeFontLoader.java deleted file mode 100644 index 77e57b90..00000000 --- a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreetypeFontLoader.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.badlogic.gdx.graphics.g2d.freetype; - -import com.badlogic.gdx.assets.AssetDescriptor; -import com.badlogic.gdx.assets.AssetLoaderParameters; -import com.badlogic.gdx.assets.AssetManager; -import com.badlogic.gdx.assets.loaders.AsynchronousAssetLoader; -import com.badlogic.gdx.assets.loaders.FileHandleResolver; -import com.badlogic.gdx.files.FileHandle; -import com.badlogic.gdx.graphics.g2d.BitmapFont; -import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeFontParameter; -import com.badlogic.gdx.utils.Array; - -/** - * Creates {@link BitmapFont} instances from FreeType font files. Requires a {@link FreeTypeFontLoaderParameter} to be passed to - * {@link AssetManager#load(String, Class, AssetLoaderParameters)} which specifies the name of the TTF file as well the parameters - * used to generate the BitmapFont (size, characters, etc.) - */ -public class FreetypeFontLoader extends AsynchronousAssetLoader { - public FreetypeFontLoader(FileHandleResolver resolver) { - super(resolver); - } - - public static class FreeTypeFontLoaderParameter extends AssetLoaderParameters { - /** - * the name of the TTF file to be used to load the font - **/ - public String fontFileName; - /** - * the parameters used to generate the font, e.g. size, characters, etc. - **/ - public FreeTypeFontParameter fontParameters = new FreeTypeFontParameter(); - } - - @Override - public void loadAsync(AssetManager manager, String fileName, FileHandle file, FreeTypeFontLoaderParameter parameter) { - if(parameter == null) - throw new RuntimeException("FreetypeFontParameter must be set in AssetManager#load to point at a TTF file!"); - } - - @Override - public BitmapFont loadSync(AssetManager manager, String fileName, FileHandle file, FreeTypeFontLoaderParameter parameter) { - if(parameter == null) - throw new RuntimeException("FreetypeFontParameter must be set in AssetManager#load to point at a TTF file!"); - FreeTypeFontGenerator generator = manager.get(parameter.fontFileName + ".gen", FreeTypeFontGenerator.class); - BitmapFont font = generator.generateFont(parameter.fontParameters); - return font; - } - - @Override - public Array getDependencies(String fileName, FileHandle file, FreeTypeFontLoaderParameter parameter) { - Array deps = new Array(); - deps.add(new AssetDescriptor(parameter.fontFileName + ".gen", FreeTypeFontGenerator.class)); - return deps; - } -} \ No newline at end of file From 88a3d1029a685cb96ef3ac079c6d7af55d380642 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 8 May 2024 21:21:54 -0300 Subject: [PATCH 012/114] fix line --- .../src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/gdx-tests/core/src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java b/examples/gdx-tests/core/src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java index 8fa409f9..b9deb870 100644 --- a/examples/gdx-tests/core/src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java +++ b/examples/gdx-tests/core/src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java @@ -90,8 +90,8 @@ public static TeaVMInstancer[] getTestList() { add(tests, OpenBrowserExample::new); // #### START BUILD ERRORS #### -// add(tests, Box2DTest::new); +// add(tests, Box2DTest::new); // add(tests, Box2DTestCollection::new); // add(tests, KinematicBodyTest::new); // add(tests, BulletTestCollection::new); From aaf2a6ef9ca2307c9357020fdb2c6fa5bba1c741 Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 9 May 2024 11:57:32 -0300 Subject: [PATCH 013/114] update imgui gdx tests --- buildSrc/src/main/kotlin/Dependencies.kt | 4 +- .../example/tests/imgui/ImGuiTestsApp.java | 146 +++++---- .../tests/imgui/TeaVMInputWrapper.java | 276 ++++++++++++++++++ .../xpenatan/imgui/example/tests/Main.java | 5 +- .../teavm/launcher/GdxTestLauncher.java | 12 +- 5 files changed, 375 insertions(+), 68 deletions(-) create mode 100644 examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/TeaVMInputWrapper.java diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 2a6d3b43..8503961c 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -9,8 +9,8 @@ object LibExt { const val gdxVersion = "1.12.1" const val teaVMVersion = "0.10.0" - const val gdxImGuiVersion = "1.0.0-SNAPSHOT" - const val gdxMultiViewVersion = "1.0.0-SNAPSHOT" + const val gdxImGuiVersion = "-SNAPSHOT" + const val gdxMultiViewVersion = "-SNAPSHOT" const val reflectionVersion = "0.10.2" const val jettyVersion = "11.0.13" diff --git a/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java b/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java index 41a6746d..14208b24 100644 --- a/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java +++ b/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java @@ -1,17 +1,22 @@ package com.github.xpenatan.imgui.example.tests.imgui; +import com.badlogic.gdx.Application; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Screen; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.glutils.HdpiUtils; +import com.badlogic.gdx.tests.AbstractTestWrapper; import com.badlogic.gdx.tests.InputTest; import com.badlogic.gdx.tests.utils.GdxTest; import com.badlogic.gdx.tests.TeaVMGdxTests; +import com.badlogic.gdx.utils.ScreenUtils; import com.github.xpenatan.gdx.multiview.EmuFrameBuffer; import com.github.xpenatan.imgui.example.tests.frame.GameFrame; import imgui.ImDrawData; import imgui.ImGui; +import imgui.ImGuiConfigFlags; import imgui.ImGuiIO; import imgui.ImVec2; import imgui.gdx.ImGuiGdxImpl; @@ -22,97 +27,132 @@ */ public class ImGuiTestsApp implements Screen { - ImGuiGdxImpl impl; + private GdxTest test; - boolean gdxTestInit = false; + private ImGuiGdxImpl impl; + private ImGuiGdxInputMultiplexer input; - int selected = -1; + private boolean gdxTestInit = false; - private GameFrame gameFrame; + private int selected = -1; - SpriteBatch batch; - private OrthographicCamera camera; + private TeaVMGdxTests.TeaVMInstancer[] testList; - TeaVMGdxTests.TeaVMInstancer[] testList; + private boolean dispose = false; @Override public void show() { - ImGui.CreateContext(true); - - camera = new OrthographicCamera(); - camera.setToOrtho(true); - batch = new SpriteBatch(); + testList = TeaVMGdxTests.getTestList(); + if(Gdx.app.getType() == Application.ApplicationType.WebGL) { + // Not possible to have ini filename with webgl + ImGui.CreateContext(false); + } + else { + ImGui.CreateContext(true); + } ImGuiIO io = ImGui.GetIO(); + io.ConfigFlags(ImGuiConfigFlags.ImGuiConfigFlags_DockingEnable); -// io.setIniFilename(null); -// io.SetConfigFlags(ImGuiConfigFlags.DockingEnable); - io.SetDockingFlags(false, false, false, false); - + input = new ImGuiGdxInputMultiplexer(); impl = new ImGuiGdxImpl(); - EmuFrameBuffer.setDefaultFramebufferHandleInitialized(false); - - gameFrame = new GameFrame(20, 20, 800, 400); - - testList = TeaVMGdxTests.getTestList(); - - gameFrame.emuWindow.setApplicationListener(new InputTest()); + Gdx.input = new TeaVMInputWrapper(Gdx.input) { + @Override + public boolean keyUp (int keycode) { + if (keycode == Keys.ESCAPE) { + if (test != null) { + Gdx.app.log("GdxTest", "Exiting current test."); + dispose = true; + } + } + return false; + } - ImGuiGdxInputMultiplexer multiplexer = new ImGuiGdxInputMultiplexer(); - multiplexer.addProcessor(gameFrame.emuWindow.getEmuInput()); - Gdx.input.setInputProcessor(multiplexer); + @Override + public boolean touchDown (int screenX, int screenY, int pointer, int button) { + if (screenX < Gdx.graphics.getWidth() / 10.0 && screenY < Gdx.graphics.getHeight() / 10.0) { + if (test != null) { + dispose = true; + } + } + return false; + } + }; + ((TeaVMInputWrapper)Gdx.input).multiplexer.addProcessor(input); } private void drawTestListWindow() { if(!gdxTestInit) { gdxTestInit = true; - ImGui.SetNextWindowSize(ImVec2.TMP_1.set(200, 500)); - ImGui.SetNextWindowPos(ImVec2.TMP_1.set(900, 20)); + ImGui.SetNextWindowSize(ImVec2.TMP_1.set(250, 500)); + ImGui.SetNextWindowPos(ImVec2.TMP_1.set(20, 20)); } ImGui.Begin("GdxTests"); - ImGui.BeginChildFrame(313, ImVec2.TMP_1.set(0f, 0f)); + if(ImGui.Button("Start Test")) { + if(selected >= 0 && selected < testList.length) { + ((TeaVMInputWrapper)Gdx.input).multiplexer.removeProcessor(input); + test = testList[selected].instance(); + Gdx.app.log("GdxTest", "Clicked on " + test.getClass().getName()); + test.create(); + test.resize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); + } + } + ImGui.Separator(); + ImGui.BeginChild("List", ImVec2.TMP_1.set(0, 0)); for(int i = 0; i < testList.length; i++) { String testName = testList[i].getSimpleName(); boolean isSelected = selected == i; if(ImGui.Selectable(testName, isSelected)) { if(selected != i) { selected = i; - GdxTest newTest = testList[i].instance(); - gameFrame.emuWindow.setApplicationListener(newTest); } } } - ImGui.EndChildFrame(); + ImGui.EndChild(); ImGui.End(); } @Override public void render(float delta) { - Gdx.gl.glClearColor(0.1f, 0.1f, 0.1f, 1); - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); - - camera.update(); - gameFrame.update(); - - impl.update(); - drawTestListWindow(); - ImGui.Render(); - ImDrawData drawData = ImGui.GetDrawData(); - impl.render(drawData); - - batch.setProjectionMatrix(camera.combined); - batch.begin(); - gameFrame.draw(batch); - batch.end(); + if (test == null) { + Gdx.gl.glClearColor(0.5f, 0.5f, 0.5f, 1); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + + impl.update(); + + drawTestListWindow(); + + ImGui.Render(); + ImDrawData drawData = ImGui.GetDrawData(); + impl.render(drawData); + } + else { + if (dispose) { + test.pause(); + test.dispose(); + test = null; + Gdx.graphics.setVSync(true); + TeaVMInputWrapper wrapper = ((TeaVMInputWrapper)Gdx.input); + wrapper.multiplexer.addProcessor(input); + wrapper.multiplexer.removeProcessor(wrapper.lastProcessor); + wrapper.lastProcessor = null; + dispose = false; + HdpiUtils.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); + } else { + test.render(); + } + } } @Override public void resize(int width, int height) { -// gameFrame.windowX = 0; -// gameFrame.windowY = 0; -// gameFrame.windowWidth = width; -// gameFrame.windowHeight = height; + if (test != null) { + test.resize(width, height); + } + else { + HdpiUtils.glViewport(0, 0, width, height); + } } @Override @@ -132,6 +172,6 @@ public void hide() { public void dispose() { impl.dispose(); ImGui.disposeStatic(); - batch.dispose(); + ImGui.DestroyContext(); } } diff --git a/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/TeaVMInputWrapper.java b/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/TeaVMInputWrapper.java new file mode 100644 index 00000000..8ea7af73 --- /dev/null +++ b/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/TeaVMInputWrapper.java @@ -0,0 +1,276 @@ +package com.github.xpenatan.imgui.example.tests.imgui; + +import com.badlogic.gdx.Input; +import com.badlogic.gdx.InputAdapter; +import com.badlogic.gdx.InputMultiplexer; +import com.badlogic.gdx.InputProcessor; + +public class TeaVMInputWrapper extends InputAdapter implements Input { + Input input; + InputProcessor lastProcessor; + public InputMultiplexer multiplexer; + + public TeaVMInputWrapper(Input input) { + this.input = input; + this.multiplexer = new InputMultiplexer(); + this.multiplexer.addProcessor(this); + input.setInputProcessor(multiplexer); + } + + @Override + public float getAccelerometerX() { + return input.getAccelerometerX(); + } + + @Override + public float getAccelerometerY() { + return input.getAccelerometerY(); + } + + @Override + public float getAccelerometerZ() { + return input.getAccelerometerZ(); + } + + @Override + public float getGyroscopeX() { + return input.getGyroscopeX(); + } + + @Override + public float getGyroscopeY() { + return input.getGyroscopeY(); + } + + @Override + public float getGyroscopeZ() { + return input.getGyroscopeZ(); + } + + @Override + public int getMaxPointers() { + return input.getMaxPointers(); + } + + @Override + public int getX() { + return input.getX(); + } + + @Override + public int getX(int pointer) { + return input.getX(pointer); + } + + @Override + public int getDeltaX() { + return input.getDeltaX(); + } + + @Override + public int getDeltaX(int pointer) { + return input.getDeltaX(pointer); + } + + @Override + public int getY() { + return input.getY(); + } + + @Override + public int getY(int pointer) { + return input.getY(pointer); + } + + @Override + public int getDeltaY() { + return input.getDeltaY(); + } + + @Override + public int getDeltaY(int pointer) { + return input.getDeltaY(pointer); + } + + @Override + public boolean isTouched() { + return input.isTouched(); + } + + @Override + public boolean justTouched() { + return input.justTouched(); + } + + @Override + public boolean isTouched(int pointer) { + return input.isTouched(pointer); + } + + @Override + public float getPressure() { + return input.getPressure(); + } + + @Override + public float getPressure(int pointer) { + return input.getPressure(pointer); + } + + @Override + public boolean isButtonPressed(int button) { + return input.isButtonPressed(button); + } + + @Override + public boolean isKeyPressed(int key) { + return input.isKeyPressed(key); + } + + @Override + public boolean isKeyJustPressed(int key) { + return input.isKeyJustPressed(key); + } + + @Override + public boolean isButtonJustPressed(int button) { + return input.isButtonJustPressed(button); + } + + @Override + public void getTextInput(TextInputListener listener, String title, String text, String hint) { + input.getTextInput(listener, title, text, hint); + } + + @Override + public void getTextInput(TextInputListener listener, String title, String text, String hint, OnscreenKeyboardType type) { + input.getTextInput(listener, title, text, hint, type); + } + + @Override + public void setOnscreenKeyboardVisible(boolean visible) { + input.setOnscreenKeyboardVisible(visible); + } + + @Override + public void setOnscreenKeyboardVisible(boolean visible, OnscreenKeyboardType type) { + input.setOnscreenKeyboardVisible(visible, type); + } + + @Override + public void vibrate(int milliseconds) { + input.vibrate(milliseconds); + } + + @Override + public void vibrate(int milliseconds, boolean fallback) { + input.vibrate(milliseconds, fallback); + } + + @Override + public void vibrate(int milliseconds, int amplitude, boolean fallback) { + input.vibrate(milliseconds, amplitude, fallback); + } + + @Override + public void vibrate(VibrationType vibrationType) { + input.vibrate(vibrationType); + } + + @Override + public float getAzimuth() { + return input.getAzimuth(); + } + + @Override + public float getPitch() { + return input.getPitch(); + } + + @Override + public float getRoll() { + return input.getRoll(); + } + + @Override + public void getRotationMatrix(float[] matrix) { + input.getRotationMatrix(matrix); + } + + @Override + public long getCurrentEventTime() { + return input.getCurrentEventTime(); + } + + @Override + public void setCatchBackKey(boolean catchBack) { + input.setCatchBackKey(catchBack); + } + + @Override + public boolean isCatchBackKey() { + return input.isCatchBackKey(); + } + + @Override + public void setCatchMenuKey(boolean catchMenu) { + input.setCatchMenuKey(catchMenu); + } + + @Override + public boolean isCatchMenuKey() { + return input.isCatchMenuKey(); + } + + @Override + public void setCatchKey(int keycode, boolean catchKey) { + input.setCatchKey(keycode, catchKey); + } + + @Override + public boolean isCatchKey(int keycode) { + return input.isCatchKey(keycode); + } + + @Override + public void setInputProcessor(InputProcessor processor) { + multiplexer.removeProcessor(lastProcessor); + multiplexer.addProcessor(processor); + lastProcessor = processor; + } + + @Override + public InputProcessor getInputProcessor() { + return input.getInputProcessor(); + } + + @Override + public boolean isPeripheralAvailable(Peripheral peripheral) { + return input.isPeripheralAvailable(peripheral); + } + + @Override + public int getRotation() { + return input.getRotation(); + } + + @Override + public Orientation getNativeOrientation() { + return input.getNativeOrientation(); + } + + @Override + public void setCursorCatched(boolean catched) { + input.setCursorCatched(catched); + } + + @Override + public boolean isCursorCatched() { + return input.isCursorCatched(); + } + + @Override + public void setCursorPosition(int x, int y) { + input.setCursorPosition(x, y); + } +} \ No newline at end of file diff --git a/examples/gdx-tests/desktop/src/main/java/com/github/xpenatan/imgui/example/tests/Main.java b/examples/gdx-tests/desktop/src/main/java/com/github/xpenatan/imgui/example/tests/Main.java index 5d459e79..9b8c2392 100644 --- a/examples/gdx-tests/desktop/src/main/java/com/github/xpenatan/imgui/example/tests/Main.java +++ b/examples/gdx-tests/desktop/src/main/java/com/github/xpenatan/imgui/example/tests/Main.java @@ -21,8 +21,7 @@ public static void main(String[] args) { config.gles30ContextMajorVersion = 4; config.gles30ContextMinorVersion = 3; config.useGL30 = true; -// new Lwjgl3Application(new MultipleRenderTargetTest(), config); -// new Lwjgl3Application(new FloatTextureTest(), config); - new LwjglApplication(new TeaVMTestWrapper(), config); +// new LwjglApplication(new TeaVMTestWrapper(), config); + new LwjglApplication(new ImGuiGame(), config); } } \ No newline at end of file diff --git a/examples/gdx-tests/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/GdxTestLauncher.java b/examples/gdx-tests/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/GdxTestLauncher.java index d4aca851..897ce88d 100644 --- a/examples/gdx-tests/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/GdxTestLauncher.java +++ b/examples/gdx-tests/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/GdxTestLauncher.java @@ -1,13 +1,5 @@ package com.github.xpenatan.gdx.examples.teavm.launcher; -import com.badlogic.gdx.tests.FloatTextureTest; -import com.badlogic.gdx.tests.SoundTest; -import com.badlogic.gdx.tests.TextureDataTest; -import com.badlogic.gdx.tests.g3d.MultipleRenderTargetTest; -import com.badlogic.gdx.tests.g3d.TextureArrayTest; -import com.badlogic.gdx.tests.g3d.TextureRegion3DTest; -import com.badlogic.gdx.tests.gles3.GL30Texture3DTest; -import com.badlogic.gdx.tests.gles3.InstancedRenderingTest; import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.imgui.example.tests.imgui.ImGuiGame; @@ -22,7 +14,7 @@ public static void main(String[] args) { config.showDownloadLogs = true; config.useGL30 = true; config.useGLArrayBuffer = true; -// new TeaApplication(new ImGuiGame(), config); - new TeaApplication(new TeaVMTestWrapper(), config); + new TeaApplication(new ImGuiGame(), config); +// new TeaApplication(new TeaVMTestWrapper(), config); } } From 0a0554def8987654a8c94cedf00f4d4e1f0ece71 Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 9 May 2024 12:56:16 -0300 Subject: [PATCH 014/114] add default gradle runs --- .run/core-run-desktop.run.xml | 24 ++++++++++++++++++++++++ .run/core-run-teavm.run.xml | 24 ++++++++++++++++++++++++ .run/gdx-tests-run-desktop.run.xml | 24 ++++++++++++++++++++++++ .run/gdx-tests-run-teavm.run.xml | 24 ++++++++++++++++++++++++ 4 files changed, 96 insertions(+) create mode 100644 .run/core-run-desktop.run.xml create mode 100644 .run/core-run-teavm.run.xml create mode 100644 .run/gdx-tests-run-desktop.run.xml create mode 100644 .run/gdx-tests-run-teavm.run.xml diff --git a/.run/core-run-desktop.run.xml b/.run/core-run-desktop.run.xml new file mode 100644 index 00000000..a8dc4c4b --- /dev/null +++ b/.run/core-run-desktop.run.xml @@ -0,0 +1,24 @@ + + + + + + + true + true + false + false + + + \ No newline at end of file diff --git a/.run/core-run-teavm.run.xml b/.run/core-run-teavm.run.xml new file mode 100644 index 00000000..bf09821c --- /dev/null +++ b/.run/core-run-teavm.run.xml @@ -0,0 +1,24 @@ + + + + + + + true + true + false + false + + + \ No newline at end of file diff --git a/.run/gdx-tests-run-desktop.run.xml b/.run/gdx-tests-run-desktop.run.xml new file mode 100644 index 00000000..227728bb --- /dev/null +++ b/.run/gdx-tests-run-desktop.run.xml @@ -0,0 +1,24 @@ + + + + + + + true + true + false + false + + + \ No newline at end of file diff --git a/.run/gdx-tests-run-teavm.run.xml b/.run/gdx-tests-run-teavm.run.xml new file mode 100644 index 00000000..2be92acd --- /dev/null +++ b/.run/gdx-tests-run-teavm.run.xml @@ -0,0 +1,24 @@ + + + + + + + true + true + false + false + + + \ No newline at end of file From d80d6e3f6ae6811079efccc2ac40b53bfd43f38a Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 9 May 2024 22:09:24 -0300 Subject: [PATCH 015/114] add desktop freetype --- examples/gdx-tests/desktop/build.gradle.kts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/examples/gdx-tests/desktop/build.gradle.kts b/examples/gdx-tests/desktop/build.gradle.kts index a5250eb5..d4484644 100644 --- a/examples/gdx-tests/desktop/build.gradle.kts +++ b/examples/gdx-tests/desktop/build.gradle.kts @@ -5,9 +5,7 @@ dependencies { implementation("com.badlogicgames.gdx:gdx-platform:${LibExt.gdxVersion}:natives-desktop") implementation("com.github.xpenatan.gdx-imgui:imgui-desktop:${LibExt.gdxImGuiVersion}") - - implementation("com.badlogicgames.gdx:gdx-bullet-platform:${LibExt.gdxVersion}:natives-desktop") - implementation("com.badlogicgames.gdx:gdx-box2d-platform:${LibExt.gdxVersion}:natives-desktop") + implementation("com.badlogicgames.gdx:gdx-freetype-platform:${LibExt.gdxVersion}:natives-desktop") } val mainClassName = "com.github.xpenatan.imgui.example.tests.Main" From 4fe367edde204b744635a925d1d8ba59700f6942 Mon Sep 17 00:00:00 2001 From: Natan Date: Fri, 10 May 2024 08:51:55 -0300 Subject: [PATCH 016/114] Few changes --- .../com/badlogic/gdx/graphics/PixmapEmu.java | 50 ++--- .../gdx/graphics/g2d/Gdx2DPixmapEmu.java | 186 +++++++----------- .../teavm/dom/typedarray/TypedArrays.java | 12 +- 3 files changed, 100 insertions(+), 148 deletions(-) diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java index 5de572db..5d29245a 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java @@ -2,37 +2,24 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; -import com.badlogic.gdx.graphics.g2d.Gdx2DPixmap; import com.badlogic.gdx.graphics.g2d.Gdx2DPixmapEmu; import com.badlogic.gdx.utils.BufferUtils; import com.badlogic.gdx.utils.Disposable; import com.badlogic.gdx.utils.GdxRuntimeException; import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; -import com.github.xpenatan.gdx.backends.teavm.TeaApplication; -import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; -import com.github.xpenatan.gdx.backends.teavm.TeaGraphics; -import com.github.xpenatan.gdx.backends.teavm.TeaTool; import com.github.xpenatan.gdx.backends.teavm.dom.CanvasRenderingContext2DWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.DocumentWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.ElementWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.HTMLCanvasElementWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.HTMLImageElementWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.HTMLVideoElementWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.ImageDataWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.impl.TeaWindow; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Uint8ArrayWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Uint8ClampedArrayWrapper; import com.github.xpenatan.gdx.backends.teavm.gen.Emulate; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloader; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetType; import com.github.xpenatan.gdx.backends.teavm.preloader.Blob; -import java.io.IOException; import java.nio.ByteBuffer; -import org.teavm.classlib.java.nio.ArrayBufferUtil; import org.teavm.jso.JSBody; @Emulate(Pixmap.class) @@ -83,9 +70,6 @@ public static int toGlType (FormatEmu format) { } } - int width; - int height; - int id; ByteBuffer buffer; BlendingEmu blending = PixmapEmu.BlendingEmu.SourceOver; FilterEmu filter = PixmapEmu.FilterEmu.BiLinear; @@ -118,44 +102,44 @@ public PixmapEmu(FileHandle file) { Blob object = webFileHandler.preloader.images.get(path); Int8ArrayWrapper response = object.getData(); - byte[] bytes = Gdx2DPixmapEmu.get(response); + byte[] bytes = TypedArrays.toByteArray(response); nativePixmap = new Gdx2DPixmapEmu(bytes, 0, bytes.length, 0); - initPixmapEmu(-1, -1, null, null); + initPixmapEmu(); } public PixmapEmu(HTMLImageElementWrapper img) { - this(-1, -1, img); +// this(-1, -1, img); + + throw new GdxRuntimeException("Pixmap img constructor not supported"); } public PixmapEmu(byte[] encodedData, int offset, int len) { nativePixmap = new Gdx2DPixmapEmu(encodedData, offset, len, 0); - initPixmapEmu(-1, -1, null, null); + initPixmapEmu(); } public PixmapEmu(ByteBuffer encodedData, int offset, int len) { - if (!encodedData.isDirect()) throw new GdxRuntimeException("Couldn't load pixmap from non-direct ByteBuffer"); - try { - nativePixmap = new Gdx2DPixmapEmu(encodedData, offset, len, 0); - initPixmapEmu(-1, -1, null, null); - } catch (IOException e) { - throw new GdxRuntimeException("Couldn't load pixmap from image data", e); - } + throw new GdxRuntimeException("Pixmap constructor not supported"); +// if (!encodedData.isDirect()) throw new GdxRuntimeException("Couldn't load pixmap from non-direct ByteBuffer"); +// try { +// nativePixmap = new Gdx2DPixmapEmu(encodedData, offset, len, 0); +// initPixmapEmu(-1, -1, null, null); +// } catch (IOException e) { +// throw new GdxRuntimeException("Couldn't load pixmap from image data", e); +// } } public PixmapEmu(int width, int height, FormatEmu format) { nativePixmap = new Gdx2DPixmapEmu(width, height, PixmapEmu.FormatEmu.toGdx2DPixmapFormat(format)); - initPixmapEmu(width, height, null, null); + initPixmapEmu(); } //TODO remove private PixmapEmu(int width, int height, HTMLImageElementWrapper imageElement) { - initPixmapEmu(width, height, imageElement, null); + initPixmapEmu(); } - private void initPixmapEmu(int width, int height, HTMLImageElementWrapper imageElement, HTMLVideoElementWrapper videoElement) { - this.width = width; - this.height = height; - + private void initPixmapEmu() { if(nativePixmap != null) { Uint8ArrayWrapper nativePixels = nativePixmap.getPixels(); byte[] byteArray = TypedArrays.toByteArray(nativePixels); diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/g2d/Gdx2DPixmapEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/g2d/Gdx2DPixmapEmu.java index e869c495..972f8076 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/g2d/Gdx2DPixmapEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/g2d/Gdx2DPixmapEmu.java @@ -77,45 +77,6 @@ public Gdx2DPixmapEmu(byte[] encodedData, int offset, int len, int requestedForm } } - public Gdx2DPixmapEmu(ByteBuffer encodedData, int offset, int len, int requestedFormat) throws IOException { -// if(!encodedData.isDirect()) throw new IOException("Couldn't load pixmap from non-direct ByteBuffer"); -// pixelPtr = loadByteBuffer(nativeData, encodedData, offset, len); -// if(pixelPtr == null) throw new IOException("Error loading pixmap: " + getFailureReason()); -// -// basePtr = nativeData[0]; -// width = (int)nativeData[1]; -// height = (int)nativeData[2]; -// format = (int)nativeData[3]; -// -// if(requestedFormat != 0 && requestedFormat != format) { -// convert(requestedFormat); -// } - } - - public Gdx2DPixmapEmu(InputStream in, int requestedFormat) throws IOException { -// ByteArrayOutputStream bytes = new ByteArrayOutputStream(1024); -// byte[] buffer = new byte[1024]; -// int readBytes = 0; -// -// while((readBytes = in.read(buffer)) != -1) { -// bytes.write(buffer, 0, readBytes); -// } -// -// buffer = bytes.toByteArray(); -// pixelPtr = load(nativeData, buffer, 0, buffer.length); -// load(nativeData, buffer, 0, buffer.length); -// if(pixelPtr == null) throw new IOException("Error loading pixmap: " + getFailureReason()); -// -// basePtr = nativeData[0]; -// width = (int)nativeData[1]; -// height = (int)nativeData[2]; -// format = (int)nativeData[3]; -// -// if(requestedFormat != 0 && requestedFormat != format) { -// convert(requestedFormat); -// } - } - /** * @throws GdxRuntimeException if allocation failed. */ @@ -127,13 +88,52 @@ public Gdx2DPixmapEmu(int width, int height, int format) throws GdxRuntimeExcept this.format = nativeData[3]; } - public Gdx2DPixmapEmu(ByteBuffer pixelPtr, int[] nativeData) { -// this.pixelPtr = pixelPtr; -// this.basePtr = nativeData[0]; -// this.width = (int)nativeData[1]; -// this.height = (int)nativeData[2]; -// this.format = (int)nativeData[3]; - } +// public Gdx2DPixmapEmu(ByteBuffer encodedData, int offset, int len, int requestedFormat) throws IOException { +//// if(!encodedData.isDirect()) throw new IOException("Couldn't load pixmap from non-direct ByteBuffer"); +//// pixelPtr = loadByteBuffer(nativeData, encodedData, offset, len); +//// if(pixelPtr == null) throw new IOException("Error loading pixmap: " + getFailureReason()); +//// +//// basePtr = nativeData[0]; +//// width = (int)nativeData[1]; +//// height = (int)nativeData[2]; +//// format = (int)nativeData[3]; +//// +//// if(requestedFormat != 0 && requestedFormat != format) { +//// convert(requestedFormat); +//// } +// } +// +// public Gdx2DPixmapEmu(InputStream in, int requestedFormat) throws IOException { +//// ByteArrayOutputStream bytes = new ByteArrayOutputStream(1024); +//// byte[] buffer = new byte[1024]; +//// int readBytes = 0; +//// +//// while((readBytes = in.read(buffer)) != -1) { +//// bytes.write(buffer, 0, readBytes); +//// } +//// +//// buffer = bytes.toByteArray(); +//// pixelPtr = load(nativeData, buffer, 0, buffer.length); +//// load(nativeData, buffer, 0, buffer.length); +//// if(pixelPtr == null) throw new IOException("Error loading pixmap: " + getFailureReason()); +//// +//// basePtr = nativeData[0]; +//// width = (int)nativeData[1]; +//// height = (int)nativeData[2]; +//// format = (int)nativeData[3]; +//// +//// if(requestedFormat != 0 && requestedFormat != format) { +//// convert(requestedFormat); +//// } +// } +// +// public Gdx2DPixmapEmu(ByteBuffer pixelPtr, int[] nativeData) { +//// this.pixelPtr = pixelPtr; +//// this.basePtr = nativeData[0]; +//// this.width = (int)nativeData[1]; +//// this.height = (int)nativeData[2]; +//// this.format = (int)nativeData[3]; +// } private void convert(int requestedFormat) { Gdx2DPixmapEmu pixmap = new Gdx2DPixmapEmu(width, height, requestedFormat); @@ -193,8 +193,7 @@ public void drawPixmap(Gdx2DPixmapEmu src, int srcX, int srcY, int dstX, int dst drawPixmap(src.basePtr, basePtr, srcX, srcY, width, height, dstX, dstY, width, height); } - public void drawPixmap(Gdx2DPixmapEmu src, int srcX, int srcY, int srcWidth, int srcHeight, int dstX, int dstY, int dstWidth, - int dstHeight) { + public void drawPixmap(Gdx2DPixmapEmu src, int srcX, int srcY, int srcWidth, int srcHeight, int dstX, int dstY, int dstWidth, int dstHeight) { drawPixmap(src.basePtr, basePtr, srcX, srcY, srcWidth, srcHeight, dstX, dstY, dstWidth, dstHeight); } @@ -207,11 +206,12 @@ public void setScale(int scale) { } public static Gdx2DPixmapEmu newPixmap(InputStream in, int requestedFormat) { - try { - return new Gdx2DPixmapEmu(in, requestedFormat); - } catch(IOException e) { - return null; - } + throw new GdxRuntimeException("newPixmap not supported 1"); + // try { +// return new Gdx2DPixmapEmu(in, requestedFormat); +// } catch(IOException e) { +// return null; +// } } public static Gdx2DPixmapEmu newPixmap(int width, int height, int format) { @@ -301,7 +301,7 @@ static private String getFormatString(int format) { "var newArray = Gdx.HEAPU8.slice(startIndex, endIndex);" + "return newArray;" ) - private static native Uint8ArrayWrapper load(@JSByRef() int[] nativeData, byte[] buffer, int offset, int len); /*MANUAL + private static native Uint8ArrayWrapper load(@JSByRef() int[] nativeData, @JSByRef() byte[] buffer, int offset, int len); /*MANUAL const unsigned char* p_buffer = (const unsigned char*)env->GetPrimitiveArrayCritical(buffer, 0); gdx2d_pixmap* pixmap = gdx2d_load(p_buffer + offset, len); env->ReleasePrimitiveArrayCritical(buffer, (char*)p_buffer, 0); @@ -320,27 +320,6 @@ static private String getFormatString(int format) { return pixel_buffer; */ - private static native ByteBuffer loadByteBuffer(int[] nativeData, ByteBuffer buffer, int offset, int len); /*MANUAL - if(buffer==0) - return 0; - - const unsigned char* p_buffer = (const unsigned char*)env->GetDirectBufferAddress(buffer); - gdx2d_pixmap* pixmap = gdx2d_load(p_buffer + offset, len); - - if(pixmap==0) - return 0; - - jobject pixel_buffer = env->NewDirectByteBuffer((void*)pixmap->pixels, pixmap->width * pixmap->height * gdx2d_bytes_per_pixel(pixmap->format)); - jlong* p_native_data = (jlong*)env->GetPrimitiveArrayCritical(nativeData, 0); - p_native_data[0] = (jlong)pixmap; - p_native_data[1] = pixmap->width; - p_native_data[2] = pixmap->height; - p_native_data[3] = pixmap->format; - env->ReleasePrimitiveArrayCritical(nativeData, p_native_data, 0); - - return pixel_buffer; - */ - @JSBody(params = {"nativeData", "width", "height", "format"}, script = "" + "var pixmap = Gdx.Gdx.prototype.g2d_new(width, height, format);" + "var pixels = Gdx.Gdx.prototype.g2d_get_pixels(pixmap);" + @@ -376,95 +355,80 @@ static private String getFormatString(int format) { */ @JSBody(params = { "pixmap" }, script = "" + - "var nativeObject = Gdx.wrapPointer(pixmap, Gdx.gdx2d_pixmap);" + - "Gdx.Gdx.prototype.g2d_free(nativeObject);") + "Gdx.Gdx.prototype.g2d_free(pixmap);") private static native void free(int pixmap); /* gdx2d_free((gdx2d_pixmap*)pixmap); */ @JSBody(params = { "pixmap", "color" }, script = "" + - "var nativeObject = Gdx.wrapPointer(pixmap, Gdx.gdx2d_pixmap);" + - "Gdx.Gdx.prototype.g2d_clear(nativeObject, color);") + "Gdx.Gdx.prototype.g2d_clear(pixmap, color);") private static native void clear(int pixmap, int color); /* gdx2d_clear((gdx2d_pixmap*)pixmap, color); */ @JSBody(params = { "pixmap", "x", "y", "color" }, script = "" + - "var nativeObject = Gdx.wrapPointer(pixmap, Gdx.gdx2d_pixmap);" + - "Gdx.Gdx.prototype.g2d_set_pixel(nativeObject, x, y, color);") + "Gdx.Gdx.prototype.g2d_set_pixel(pixmap, x, y, color);") private static native void setPixel(int pixmap, int x, int y, int color); /* gdx2d_set_pixel((gdx2d_pixmap*)pixmap, x, y, color); */ @JSBody(params = { "pixmap", "x", "y" }, script = "" + - "var nativeObject = Gdx.wrapPointer(pixmap, Gdx.gdx2d_pixmap);" + - "return Gdx.Gdx.prototype.g2d_get_pixel(nativeObject, x, y);") + "return Gdx.Gdx.prototype.g2d_get_pixel(pixmap, x, y);") private static native int getPixel(int pixmap, int x, int y); /* return gdx2d_get_pixel((gdx2d_pixmap*)pixmap, x, y); */ @JSBody(params = { "pixmap", "x", "y", "x2", "y2", "color" }, script = "" + - "var nativeObject = Gdx.wrapPointer(pixmap, Gdx.gdx2d_pixmap);" + - "Gdx.Gdx.prototype.g2d_draw_line(nativeObject, x, y, x2, y2, color);") + "Gdx.Gdx.prototype.g2d_draw_line(pixmap, x, y, x2, y2, color);") private static native void drawLine(int pixmap, int x, int y, int x2, int y2, int color); /* gdx2d_draw_line((gdx2d_pixmap*)pixmap, x, y, x2, y2, color); */ @JSBody(params = { "pixmap", "x", "y", "width", "height", "color" }, script = "" + - "var nativeObject = Gdx.wrapPointer(pixmap, Gdx.gdx2d_pixmap);" + - "Gdx.Gdx.prototype.g2d_draw_rect(nativeObject, x, y, width, height, color);") + "Gdx.Gdx.prototype.g2d_draw_rect(pixmap, x, y, width, height, color);") private static native void drawRect(int pixmap, int x, int y, int width, int height, int color); /* gdx2d_draw_rect((gdx2d_pixmap*)pixmap, x, y, width, height, color); */ @JSBody(params = { "pixmap", "x", "y", "radius", "color" }, script = "" + - "var nativeObject = Gdx.wrapPointer(pixmap, Gdx.gdx2d_pixmap);" + - "Gdx.Gdx.prototype.g2d_draw_circle(nativeObject, x, y, radius, color);") + "Gdx.Gdx.prototype.g2d_draw_circle(pixmap, x, y, radius, color);") private static native void drawCircle(int pixmap, int x, int y, int radius, int color); /* gdx2d_draw_circle((gdx2d_pixmap*)pixmap, x, y, radius, color); */ @JSBody(params = { "pixmap", "x", "y", "width", "height", "color" }, script = "" + - "var nativeObject = Gdx.wrapPointer(pixmap, Gdx.gdx2d_pixmap);" + - "Gdx.Gdx.prototype.g2d_fill_rect(nativeObject, x, y, width, height, color);") + "Gdx.Gdx.prototype.g2d_fill_rect(pixmap, x, y, width, height, color);") private static native void fillRect(int pixmap, int x, int y, int width, int height, int color); /* gdx2d_fill_rect((gdx2d_pixmap*)pixmap, x, y, width, height, color); */ @JSBody(params = { "pixmap", "x", "y", "radius", "color" }, script = "" + - "var nativeObject = Gdx.wrapPointer(pixmap, Gdx.gdx2d_pixmap);" + - "Gdx.Gdx.prototype.g2d_fill_circle(nativeObject, x, y, radius, color);") + "Gdx.Gdx.prototype.g2d_fill_circle(pixmap, x, y, radius, color);") private static native void fillCircle(int pixmap, int x, int y, int radius, int color); /* gdx2d_fill_circle((gdx2d_pixmap*)pixmap, x, y, radius, color); */ @JSBody(params = { "pixmap", "x1", "y1", "x2", "y2", "x3", "y3", "color" }, script = "" + - "var nativeObject = Gdx.wrapPointer(src, Gdx.gdx2d_pixmap);" + - "Gdx.Gdx.prototype.g2d_fill_triangle(nativeObject, x1, y1, x2, y2, x3, y3, color);") + "Gdx.Gdx.prototype.g2d_fill_triangle(pixmap, x1, y1, x2, y2, x3, y3, color);") private static native void fillTriangle(int pixmap, int x1, int y1, int x2, int y2, int x3, int y3, int color); /* gdx2d_fill_triangle((gdx2d_pixmap*)pixmap, x1, y1, x2, y2, x3, y3, color); */ @JSBody(params = { "src", "dst", "srcX", "srcY", "srcWidth", "srcHeight", "dstX", "dstY", "dstWidth", "dstHeight" }, script = "" + - "var nativeObjectSrc = Gdx.wrapPointer(src, Gdx.gdx2d_pixmap);" + - "var nativeObjectDst = Gdx.wrapPointer(dst, Gdx.gdx2d_pixmap);" + - "Gdx.Gdx.prototype.g2d_draw_pixmap(nativeObjectSrc, nativeObjectDst, srcX, srcY, srcWidth, srcHeight, dstX, dstY, dstWidth, dstHeight);") - private static native void drawPixmap(int src, int dst, int srcX, int srcY, int srcWidth, int srcHeight, int dstX, - int dstY, int dstWidth, int dstHeight); /* + "Gdx.Gdx.prototype.g2d_draw_pixmap(src, dst, srcX, srcY, srcWidth, srcHeight, dstX, dstY, dstWidth, dstHeight);") + private static native void drawPixmap(int src, int dst, int srcX, int srcY, int srcWidth, int srcHeight, int dstX, int dstY, int dstWidth, int dstHeight); /* gdx2d_draw_pixmap((gdx2d_pixmap*)src, (gdx2d_pixmap*)dst, srcX, srcY, srcWidth, srcHeight, dstX, dstY, dstWidth, dstHeight); */ - @JSBody(params = { "pixmap", "blend" }, script = "" + - "var nativeObject = Gdx.wrapPointer(pixmap, Gdx.gdx2d_pixmap);" + - "Gdx.Gdx.prototype.g2d_set_blend(nativeObject, blend);") - private static native void setBlend(int pixmap, int blend); /* + @JSBody(params = { "src", "blend" }, script = "" + + "Gdx.Gdx.prototype.g2d_set_blend(src, blend);") + private static native void setBlend(int src, int blend); /* gdx2d_set_blend((gdx2d_pixmap*)src, blend); */ - @JSBody(params = { "pixmap", "scale" }, script = "" + - "var nativeObject = Gdx.wrapPointer(src, Gdx.gdx2d_pixmap);" + - "Gdx.Gdx.prototype.g2d_set_scale(nativeObject, scale);") - private static native void setScale(int pixmap, int scale); /* + @JSBody(params = { "src", "scale" }, script = "" + + "Gdx.Gdx.prototype.g2d_set_scale(src, scale);") + private static native void setScale(int src, int scale); /* gdx2d_set_scale((gdx2d_pixmap*)src, scale); */ @@ -475,8 +439,4 @@ private static native void drawPixmap(int src, int dst, int srcX, int srcY, int @JSBody(params = { "msg" }, script = "" + "console.log(msg);") public static native void print(String msg); - - @JSBody(params = { "arrayBuffer" }, script = "" + - "return arrayBuffer;") - public static native byte[] get(Int8ArrayWrapper arrayBuffer); -} +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/typedarray/TypedArrays.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/typedarray/TypedArrays.java index 4808fd57..763aeaf9 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/typedarray/TypedArrays.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/typedarray/TypedArrays.java @@ -1,10 +1,9 @@ package com.github.xpenatan.gdx.backends.teavm.dom.typedarray; +import java.nio.ByteBuffer; import org.teavm.jso.JSBody; import org.teavm.jso.typedarrays.ArrayBuffer; -import org.teavm.jso.typedarrays.ArrayBufferView; import org.teavm.jso.typedarrays.Float32Array; -import org.teavm.jso.typedarrays.Float64Array; import org.teavm.jso.typedarrays.Int16Array; import org.teavm.jso.typedarrays.Int32Array; import org.teavm.jso.typedarrays.Int8Array; @@ -156,4 +155,13 @@ public static byte[] toByteArray(ArrayBufferViewWrapper array) { byte[] byteArray = (byte[])arrayObj; return byteArray; } + + public static ArrayBufferViewWrapper getTypedArray(ByteBuffer buffer) { + byte[] array = buffer.array(); + return getTypedArray(array); + } + + @JSBody(params = {"buffer"}, script = "" + + "return buffer;") + private static native ArrayBufferViewWrapper getTypedArray(byte[] buffer); } From b32c0313af0ff86d7e1b47a9c4ff6278352e6642 Mon Sep 17 00:00:00 2001 From: Natan Date: Fri, 10 May 2024 08:53:07 -0300 Subject: [PATCH 017/114] disable generator --- settings.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index b53421cd..10981b2a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,9 +2,9 @@ include(":backends:backend-teavm") include(":extensions:gdx-freetype-teavm") -include(":tools:generator:core") -include(":tools:generator:ui") -include(":tools:generator:desktop") +//include(":tools:generator:core") +//include(":tools:generator:ui") +//include(":tools:generator:desktop") include(":examples:core:core") include(":examples:core:desktop") From d277168d22a8cd03503fe072f7df3790ae9f5384 Mon Sep 17 00:00:00 2001 From: Natan Date: Sun, 12 May 2024 21:48:23 -0300 Subject: [PATCH 018/114] Fix pixmap and freetype. Improve getting js buffers --- .run/gdx-tests-build.run.xml | 24 + .../com/badlogic/gdx/graphics/PixmapEmu.java | 133 +- .../gdx/graphics/g2d/Gdx2DPixmapEmu.java | 6 +- .../classlib/java/nio/ArrayBufferUtil.java | 43 - .../classlib/java/nio/ByteBufferImplEmu.java | 4 +- .../jni/gdx/src/GDX/gdx2d/gdx2d.c | 1379 +++++++++-------- .../gdx/backends/teavm/TeaApplication.java | 1 - .../teavm/TeaApplicationConfiguration.java | 7 - .../xpenatan/gdx/backends/teavm/TeaGL20.java | 152 +- .../xpenatan/gdx/backends/teavm/TeaGL30.java | 105 +- .../xpenatan/gdx/backends/teavm/TeaTool.java | 9 - .../teavm/dom/typedarray/TypedArrays.java | 73 +- .../src/main/resources/gdx.wasm.js | 2 +- .../gdx/examples/tests/FreetypeDemo.java | 6 +- .../com/badlogic/gdx/tests/TeaVMGdxTests.java | 8 +- .../teavm/launcher/GdxTestLauncher.java | 1 - .../badlogic/gdx/graphics/FreeTypeUtil.java | 43 - .../graphics/g2d/freetype/FreeTypeEmu.java | 63 +- 18 files changed, 906 insertions(+), 1153 deletions(-) create mode 100644 .run/gdx-tests-build.run.xml delete mode 100644 backends/backend-teavm/emu/org/teavm/classlib/java/nio/ArrayBufferUtil.java delete mode 100644 extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/FreeTypeUtil.java diff --git a/.run/gdx-tests-build.run.xml b/.run/gdx-tests-build.run.xml new file mode 100644 index 00000000..ae3248eb --- /dev/null +++ b/.run/gdx-tests-build.run.xml @@ -0,0 +1,24 @@ + + + + + + + true + true + false + false + + + \ No newline at end of file diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java index 5d29245a..895c431b 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java @@ -8,10 +8,6 @@ import com.badlogic.gdx.utils.GdxRuntimeException; import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; -import com.github.xpenatan.gdx.backends.teavm.dom.CanvasRenderingContext2DWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.HTMLCanvasElementWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.HTMLImageElementWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Uint8ArrayWrapper; @@ -20,19 +16,17 @@ import com.github.xpenatan.gdx.backends.teavm.preloader.AssetType; import com.github.xpenatan.gdx.backends.teavm.preloader.Blob; import java.nio.ByteBuffer; -import org.teavm.jso.JSBody; @Emulate(Pixmap.class) public class PixmapEmu implements Disposable { - public static PixmapEmu createFromFrameBuffer(int x, int y, int w, int h) { Gdx.gl.glPixelStorei(GL20.GL_PACK_ALIGNMENT, 1); - final PixmapEmu pixmap = new PixmapEmu(w, h, FormatEmu.RGBA8888); - ByteBuffer pixels = BufferUtils.newByteBuffer(h * w * 4); + final PixmapEmu pixmap = new PixmapEmu(w, h, PixmapEmu.FormatEmu.RGBA8888); + ByteBuffer pixels = pixmap.getPixels(); Gdx.gl.glReadPixels(x, y, w, h, GL20.GL_RGBA, GL20.GL_UNSIGNED_BYTE, pixels); - pixmap.setPixels(pixels); + return pixmap; } @@ -88,8 +82,10 @@ public void onFailure(String url) { @Override public boolean onSuccess(String url, Blob result) { - Object obj = new PixmapEmu(result.getImage()); - responseListener.downloadComplete((Pixmap)obj); + Int8ArrayWrapper data = result.getData(); + byte[] byteArray = TypedArrays.toByteArray(data); + Pixmap pixmapEmu = new Pixmap(byteArray, 0, byteArray.length); + responseListener.downloadComplete(pixmapEmu); return false; } }; @@ -107,12 +103,6 @@ public PixmapEmu(FileHandle file) { initPixmapEmu(); } - public PixmapEmu(HTMLImageElementWrapper img) { -// this(-1, -1, img); - - throw new GdxRuntimeException("Pixmap img constructor not supported"); - } - public PixmapEmu(byte[] encodedData, int offset, int len) { nativePixmap = new Gdx2DPixmapEmu(encodedData, offset, len, 0); initPixmapEmu(); @@ -134,11 +124,6 @@ public PixmapEmu(int width, int height, FormatEmu format) { initPixmapEmu(); } - //TODO remove - private PixmapEmu(int width, int height, HTMLImageElementWrapper imageElement) { - initPixmapEmu(); - } - private void initPixmapEmu() { if(nativePixmap != null) { Uint8ArrayWrapper nativePixels = nativePixmap.getPixels(); @@ -150,91 +135,30 @@ private void initPixmapEmu() { } } - public static String make(int r2, int g2, int b2, float a2) { - return "rgba(" + r2 + "," + g2 + "," + b2 + "," + a2 + ")"; - } - - public HTMLCanvasElementWrapper getCanvasElement() { - //TODO remove - return null; - } - - /** - * Sets the color for the following drawing operations - * - * @param color the color, encoded as RGBA8888 - */ public void setColor(int color) { this.color = color; } - /** - * Sets the color for the following drawing operations. - * - * @param r The red component. - * @param g The green component. - * @param b The blue component. - * @param a The alpha component. - */ public void setColor(float r, float g, float b, float a) { this.color = Color.rgba8888(r, g, b, a); } - /** - * Sets the color for the following drawing operations. - * - * @param color The color. - */ public void setColor(Color color) { setColor(color.r, color.g, color.b, color.a); } - /** - * Fills the complete bitmap with the currently set color. - */ public void fill() { nativePixmap.clear(color); } -// /** -// * Sets the width in pixels of strokes. -// * -// * @param width The stroke width in pixels. -// */ -// public void setStrokeWidth (int width); - - /** - * Draws a line between the given coordinates using the currently set color. - * - * @param x The x-coodinate of the first point - * @param y The y-coordinate of the first point - * @param x2 The x-coordinate of the first point - * @param y2 The y-coordinate of the first point - */ public void drawLine(int x, int y, int x2, int y2) { nativePixmap.drawLine(x, y, x2, y2, color); } - /** - * Draws a rectangle outline starting at x, y extending by width to the right and by height downwards (y-axis points downwards) - * using the current color. - * - * @param x The x coordinate - * @param y The y coordinate - * @param width The width in pixels - * @param height The height in pixels - */ public void drawRectangle(int x, int y, int width, int height) { nativePixmap.drawRect(x, y, width, height, color); } - /** - * Draws an area form another Pixmap to this Pixmap. - * - * @param pixmap The other Pixmap - * @param x The target x-coordinate (top left corner) - * @param y The target y-coordinate (top left corner) - */ public void drawPixmap(PixmapEmu pixmap, int x, int y) { drawPixmap(pixmap, x, y, 0, 0, pixmap.getWidth(), pixmap.getHeight()); } @@ -263,10 +187,6 @@ public void fillTriangle(int x1, int y1, int x2, int y2, int x3, int y3) { nativePixmap.fillTriangle(x1, y1, x2, y2, x3, y3, color); } - public int getPixel(int x, int y) { - return nativePixmap.getPixel(x, y); - } - public int getWidth() { return nativePixmap.getWidth(); } @@ -286,14 +206,6 @@ public boolean isDisposed () { return disposed; } - public void drawPixel(int x, int y) { - nativePixmap.setPixel(x, y, color); - } - - public void drawPixel(int x, int y, int color) { - nativePixmap.setPixel(x, y, color); - } - public int getGLFormat () { return nativePixmap.getGLFormat(); } @@ -310,24 +222,23 @@ public ByteBuffer getPixels() { return buffer; } - public Uint8ArrayWrapper getPixmapData() { - return nativePixmap.getPixels(); - } - public void setPixels(ByteBuffer pixels) { - if (!pixels.isDirect()) throw new GdxRuntimeException("Couldn't setPixels from non-direct ByteBuffer"); - //TODO Need testing + if (!pixels.isDirect()) + throw new GdxRuntimeException("Couldn't setPixels from non-direct ByteBuffer"); BufferUtils.copy(pixels, buffer, buffer.limit()); } - @JSBody(params = { "pixels", "width", "height", "ctx" }, script = "" + - "var imgData = ctx.createImageData(width, height);" + - "var data = imgData.data;" + - "for (var i = 0, len = width * height * 4; i < len; i++) {" + - " data[i] = pixels[i] & 0xff;" + - "}" + - "ctx.putImageData(imgData, 0, 0);") - private static native void setImageData(ArrayBufferViewWrapper pixels, int width, int height, CanvasRenderingContext2DWrapper ctx); + public int getPixel(int x, int y) { + return nativePixmap.getPixel(x, y); + } + + public void drawPixel(int x, int y) { + nativePixmap.setPixel(x, y, color); + } + + public void drawPixel(int x, int y, int color) { + nativePixmap.setPixel(x, y, color); + } public FormatEmu getFormat () { return FormatEmu.fromGdx2DPixmapFormat(nativePixmap.getFormat()); @@ -351,10 +262,6 @@ public BlendingEmu getBlending () { return blending; } - private enum DrawType { - FILL, STROKE - } - @Emulate(Pixmap.Blending.class) public enum BlendingEmu { None, SourceOver diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/g2d/Gdx2DPixmapEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/g2d/Gdx2DPixmapEmu.java index 972f8076..8314156a 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/g2d/Gdx2DPixmapEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/g2d/Gdx2DPixmapEmu.java @@ -142,10 +142,10 @@ private void convert(int requestedFormat) { dispose(); this.basePtr = pixmap.basePtr; this.format = pixmap.format; + this.width = pixmap.width; this.height = pixmap.height; this.nativeData = pixmap.nativeData; this.pixelPtr = pixmap.pixelPtr; - this.width = pixmap.width; } @Override @@ -298,7 +298,7 @@ static private String getFormatString(int format) { "var bytesSize = width * height * bytesPerPixel;" + "var startIndex = pixels;" + "var endIndex = startIndex + bytesSize;" + - "var newArray = Gdx.HEAPU8.slice(startIndex, endIndex);" + + "var newArray = Gdx.HEAPU8.subarray(startIndex, endIndex);" + "return newArray;" ) private static native Uint8ArrayWrapper load(@JSByRef() int[] nativeData, @JSByRef() byte[] buffer, int offset, int len); /*MANUAL @@ -335,7 +335,7 @@ static private String getFormatString(int format) { "var bytesSize = width * height * bytesPerPixel;" + "var startIndex = pixels;" + "var endIndex = startIndex + bytesSize;" + - "var newArray = Gdx.HEAPU8.slice(startIndex, endIndex);" + + "var newArray = Gdx.HEAPU8.subarray(startIndex, endIndex);" + "return newArray;" ) private static native Uint8ArrayWrapper newPixmap(@JSByRef() int[] nativeData, int width, int height, int format); /*MANUAL diff --git a/backends/backend-teavm/emu/org/teavm/classlib/java/nio/ArrayBufferUtil.java b/backends/backend-teavm/emu/org/teavm/classlib/java/nio/ArrayBufferUtil.java deleted file mode 100644 index aedbf840..00000000 --- a/backends/backend-teavm/emu/org/teavm/classlib/java/nio/ArrayBufferUtil.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.teavm.classlib.java.nio; - -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Float32ArrayWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int16ArrayWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int32ArrayWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Uint8ArrayWrapper; -import java.nio.Buffer; -import org.teavm.jso.JSBody; -import org.teavm.jso.JSObject; - -public class ArrayBufferUtil { - @org.teavm.jso.JSBody(params = {"array"}, script = "" + - "return array.data;") - static native Int8ArrayWrapper getArrayBufferView(JSObject array); - - public static Int8ArrayWrapper getInt8Array(Buffer buffer) { - if(buffer instanceof HasArrayBufferView) { - return ((HasArrayBufferView)buffer).getTypedArray(); - } - return null; - } - - public static int getElementSize(Buffer buffer) { - if(buffer instanceof HasArrayBufferView) { - return ((HasArrayBufferView)buffer).getElementSize(); - } - return 1; - } - - @JSBody(params = { "array" }, script = "return Float32Array.from(array);") - public static native Float32ArrayWrapper fromF32(ArrayBufferViewWrapper array); - - @JSBody(params = { "array" }, script = "return Int32Array.from(array);") - public static native Int32ArrayWrapper fromI32(ArrayBufferViewWrapper array); - - @JSBody(params = { "array" }, script = "return Int16Array.from(array);") - public static native Int16ArrayWrapper fromI16(ArrayBufferViewWrapper arra); - - @JSBody(params = { "array" }, script = "return Uint8Array.from(array);") - public static native Uint8ArrayWrapper fromUI8(ArrayBufferViewWrapper array); -} \ No newline at end of file diff --git a/backends/backend-teavm/emu/org/teavm/classlib/java/nio/ByteBufferImplEmu.java b/backends/backend-teavm/emu/org/teavm/classlib/java/nio/ByteBufferImplEmu.java index 87a27400..1c19dfce 100644 --- a/backends/backend-teavm/emu/org/teavm/classlib/java/nio/ByteBufferImplEmu.java +++ b/backends/backend-teavm/emu/org/teavm/classlib/java/nio/ByteBufferImplEmu.java @@ -1,7 +1,7 @@ package org.teavm.classlib.java.nio; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; import com.github.xpenatan.gdx.backends.teavm.gen.Emulate; import org.teavm.jso.JSObject; @@ -20,7 +20,7 @@ public ByteBufferImplEmu(int start, int capacity, byte[] array, int position, in @Emulate public Int8ArrayWrapper getTypedArray() { Object array = array(); - return ArrayBufferUtil.getArrayBufferView((JSObject)array); + return TypedArrays.getArrayBufferView((JSObject)array); } @Override diff --git a/backends/backend-teavm/jni/gdx/src/GDX/gdx2d/gdx2d.c b/backends/backend-teavm/jni/gdx/src/GDX/gdx2d/gdx2d.c index 978e16a9..64c573cb 100644 --- a/backends/backend-teavm/jni/gdx/src/GDX/gdx2d/gdx2d.c +++ b/backends/backend-teavm/jni/gdx/src/GDX/gdx2d/gdx2d.c @@ -26,253 +26,256 @@ typedef void(*set_pixel_func)(unsigned char* pixel_addr, uint32_t color); typedef uint32_t(*get_pixel_func)(unsigned char* pixel_addr); static inline void generate_look_ups() { - uint32_t i = 0; - lu4 = malloc(sizeof(uint32_t) * 16); - lu5 = malloc(sizeof(uint32_t) * 32); - lu6 = malloc(sizeof(uint32_t) * 64); - - for(i = 0; i < 16; i++) { - lu4[i] = (uint32_t) i / 15.0f * 255; - lu5[i] = (uint32_t) i / 31.0f * 255; - lu6[i] = (uint32_t) i / 63.0f * 255; - } + uint32_t i = 0; + lu4 = malloc(sizeof(uint32_t) * 16); + lu5 = malloc(sizeof(uint32_t) * 32); + lu6 = malloc(sizeof(uint32_t) * 64); + + for(i = 0; i < 16; i++) { + lu4[i] = (uint32_t) i / 15.0f * 255; + lu5[i] = (uint32_t) i / 31.0f * 255; + lu6[i] = (uint32_t) i / 63.0f * 255; + } - for(i = 16; i < 32; i++) { - lu5[i] = (uint32_t) i / 31.0f * 255; - lu6[i] = (uint32_t) i / 63.0f * 255; - } + for(i = 16; i < 32; i++) { + lu5[i] = (uint32_t) i / 31.0f * 255; + lu6[i] = (uint32_t) i / 63.0f * 255; + } - for(i = 32; i < 64; i++) { - lu6[i] = (uint32_t) i / 63.0f * 255; - } + for(i = 32; i < 64; i++) { + lu6[i] = (uint32_t) i / 63.0f * 255; + } } static inline uint32_t to_format(uint32_t format, uint32_t color) { - uint32_t r, g, b, a, l; - - switch(format) { - case GDX2D_FORMAT_ALPHA: - return color & 0xff; - case GDX2D_FORMAT_LUMINANCE_ALPHA: - r = (color & 0xff000000) >> 24; - g = (color & 0xff0000) >> 16; - b = (color & 0xff00) >> 8; - a = (color & 0xff); - l = ((uint32_t)(0.2126f * r + 0.7152 * g + 0.0722 * b) & 0xff) << 8; - return (l & 0xffffff00) | a; - case GDX2D_FORMAT_RGB888: - return color >> 8; - case GDX2D_FORMAT_RGBA8888: - return color; - case GDX2D_FORMAT_RGB565: - r = (((color & 0xff000000) >> 27) << 11) & 0xf800; - g = (((color & 0xff0000) >> 18) << 5) & 0x7e0; - b = ((color & 0xff00) >> 11) & 0x1f; - return r | g | b; - case GDX2D_FORMAT_RGBA4444: - r = (((color & 0xff000000) >> 28) << 12) & 0xf000; - g = (((color & 0xff0000) >> 20) << 8) & 0xf00; - b = (((color & 0xff00) >> 12) << 4) & 0xf0; - a = ((color & 0xff) >> 4) & 0xf; - return r | g | b | a; - default: - return 0; - } + uint32_t r, g, b, a, l; + + switch(format) { + case GDX2D_FORMAT_ALPHA: + return color & 0xff; + case GDX2D_FORMAT_LUMINANCE_ALPHA: + r = (color & 0xff000000) >> 24; + g = (color & 0xff0000) >> 16; + b = (color & 0xff00) >> 8; + a = (color & 0xff); + l = ((uint32_t)(0.2126f * r + 0.7152 * g + 0.0722 * b) & 0xff) << 8; + return (l & 0xffffff00) | a; + case GDX2D_FORMAT_RGB888: + return color >> 8; + case GDX2D_FORMAT_RGBA8888: + return color; + case GDX2D_FORMAT_RGB565: + r = (((color & 0xff000000) >> 27) << 11) & 0xf800; + g = (((color & 0xff0000) >> 18) << 5) & 0x7e0; + b = ((color & 0xff00) >> 11) & 0x1f; + return r | g | b; + case GDX2D_FORMAT_RGBA4444: + r = (((color & 0xff000000) >> 28) << 12) & 0xf000; + g = (((color & 0xff0000) >> 20) << 8) & 0xf00; + b = (((color & 0xff00) >> 12) << 4) & 0xf0; + a = ((color & 0xff) >> 4) & 0xf; + return r | g | b | a; + default: + return 0; + } } #define min(a, b) (a > b?b:a) static inline uint32_t weight_RGBA8888(uint32_t color, float weight) { - uint32_t r, g, b, a; - r = min((uint32_t)(((color & 0xff000000) >> 24) * weight), 255); - g = min((uint32_t)(((color & 0xff0000) >> 16) * weight), 255); - b = min((uint32_t)(((color & 0xff00) >> 8) * weight), 255); - a = min((uint32_t)(((color & 0xff)) * weight), 255); + uint32_t r, g, b, a; + r = min((uint32_t)(((color & 0xff000000) >> 24) * weight), 255); + g = min((uint32_t)(((color & 0xff0000) >> 16) * weight), 255); + b = min((uint32_t)(((color & 0xff00) >> 8) * weight), 255); + a = min((uint32_t)(((color & 0xff)) * weight), 255); - return (r << 24) | (g << 16) | (b << 8) | a; + return (r << 24) | (g << 16) | (b << 8) | a; } static inline uint32_t to_RGBA8888(uint32_t format, uint32_t color) { - uint32_t r, g, b, a; - - if(!lu5) generate_look_ups(); - - switch(format) { - case GDX2D_FORMAT_ALPHA: - return (color & 0xff) | 0xffffff00; - case GDX2D_FORMAT_LUMINANCE_ALPHA: - return ((color & 0xff00) << 16) | ((color & 0xff00) << 8) | (color & 0xffff); - case GDX2D_FORMAT_RGB888: - return (color << 8) | 0x000000ff; - case GDX2D_FORMAT_RGBA8888: - return color; - case GDX2D_FORMAT_RGB565: - r = lu5[(color & 0xf800) >> 11] << 24; - g = lu6[(color & 0x7e0) >> 5] << 16; - b = lu5[(color & 0x1f)] << 8; - return r | g | b | 0xff; - case GDX2D_FORMAT_RGBA4444: - r = lu4[(color & 0xf000) >> 12] << 24; - g = lu4[(color & 0xf00) >> 8] << 16; - b = lu4[(color & 0xf0) >> 4] << 8; - a = lu4[(color & 0xf)]; - return r | g | b | a; - default: - return 0; - } + uint32_t r, g, b, a; + + if(!lu5) generate_look_ups(); + + switch(format) { + case GDX2D_FORMAT_ALPHA: + return (color & 0xff) | 0xffffff00; + case GDX2D_FORMAT_LUMINANCE_ALPHA: + return ((color & 0xff00) << 16) | ((color & 0xff00) << 8) | (color & 0xffff); + case GDX2D_FORMAT_RGB888: + return (color << 8) | 0x000000ff; + case GDX2D_FORMAT_RGBA8888: + return color; + case GDX2D_FORMAT_RGB565: + r = lu5[(color & 0xf800) >> 11] << 24; + g = lu6[(color & 0x7e0) >> 5] << 16; + b = lu5[(color & 0x1f)] << 8; + return r | g | b | 0xff; + case GDX2D_FORMAT_RGBA4444: + r = lu4[(color & 0xf000) >> 12] << 24; + g = lu4[(color & 0xf00) >> 8] << 16; + b = lu4[(color & 0xf0) >> 4] << 8; + a = lu4[(color & 0xf)]; + return r | g | b | a; + default: + return 0; + } } static inline void set_pixel_alpha(unsigned char *pixel_addr, uint32_t color) { - *pixel_addr = (unsigned char)(color & 0xff); + *pixel_addr = (unsigned char)(color & 0xff); } static inline void set_pixel_luminance_alpha(unsigned char *pixel_addr, uint32_t color) { - *(unsigned short*)pixel_addr = (unsigned short)color; + *(unsigned short*)pixel_addr = (unsigned short)color; } static inline void set_pixel_RGB888(unsigned char *pixel_addr, uint32_t color) { - //*(unsigned short*)pixel_addr = (unsigned short)(((color & 0xff0000) >> 16) | (color & 0xff00)); - pixel_addr[0] = (color & 0xff0000) >> 16; - pixel_addr[1] = (color & 0xff00) >> 8; - pixel_addr[2] = (color & 0xff); + //*(unsigned short*)pixel_addr = (unsigned short)(((color & 0xff0000) >> 16) | (color & 0xff00)); + pixel_addr[0] = (color & 0xff0000) >> 16; + pixel_addr[1] = (color & 0xff00) >> 8; + pixel_addr[2] = (color & 0xff); } static inline void set_pixel_RGBA8888(unsigned char *pixel_addr, uint32_t color) { - *(uint32_t*)pixel_addr = ((color & 0xff000000) >> 24) | - ((color & 0xff0000) >> 8) | - ((color & 0xff00) << 8) | - ((color & 0xff) << 24); + *(uint32_t*)pixel_addr = ((color & 0xff000000) >> 24) | + ((color & 0xff0000) >> 8) | + ((color & 0xff00) << 8) | + ((color & 0xff) << 24); } static inline void set_pixel_RGB565(unsigned char *pixel_addr, uint32_t color) { - *(uint16_t*)pixel_addr = (uint16_t)(color); + *(uint16_t*)pixel_addr = (uint16_t)(color); } static inline void set_pixel_RGBA4444(unsigned char *pixel_addr, uint32_t color) { - *(uint16_t*)pixel_addr = (uint16_t)(color); + *(uint16_t*)pixel_addr = (uint16_t)(color); } static inline set_pixel_func set_pixel_func_ptr(uint32_t format) { - switch(format) { - case GDX2D_FORMAT_ALPHA: return &set_pixel_alpha; - case GDX2D_FORMAT_LUMINANCE_ALPHA: return &set_pixel_luminance_alpha; - case GDX2D_FORMAT_RGB888: return &set_pixel_RGB888; - case GDX2D_FORMAT_RGBA8888: return &set_pixel_RGBA8888; - case GDX2D_FORMAT_RGB565: return &set_pixel_RGB565; - case GDX2D_FORMAT_RGBA4444: return &set_pixel_RGBA4444; - default: return &set_pixel_alpha; // better idea for a default? - } + switch(format) { + case GDX2D_FORMAT_ALPHA: return &set_pixel_alpha; + case GDX2D_FORMAT_LUMINANCE_ALPHA: return &set_pixel_luminance_alpha; + case GDX2D_FORMAT_RGB888: return &set_pixel_RGB888; + case GDX2D_FORMAT_RGBA8888: return &set_pixel_RGBA8888; + case GDX2D_FORMAT_RGB565: return &set_pixel_RGB565; + case GDX2D_FORMAT_RGBA4444: return &set_pixel_RGBA4444; + default: return &set_pixel_alpha; // better idea for a default? + } } static inline uint32_t blend(uint32_t src, uint32_t dst) { - uint32_t src_a = src & 0xff; - if (src_a == 0) return dst; - uint32_t src_b = (src >> 8) & 0xff; - uint32_t src_g = (src >> 16) & 0xff; - uint32_t src_r = (src >> 24) & 0xff; + uint32_t src_a = src & 0xff; + if (src_a == 0) return dst; + uint32_t src_b = (src >> 8) & 0xff; + uint32_t src_g = (src >> 16) & 0xff; + uint32_t src_r = (src >> 24) & 0xff; - uint32_t dst_a = dst & 0xff; - uint32_t dst_b = (dst >> 8) & 0xff; - uint32_t dst_g = (dst >> 16) & 0xff; - uint32_t dst_r = (dst >> 24) & 0xff; + uint32_t dst_a = dst & 0xff; + uint32_t dst_b = (dst >> 8) & 0xff; + uint32_t dst_g = (dst >> 16) & 0xff; + uint32_t dst_r = (dst >> 24) & 0xff; - dst_a -= (dst_a * src_a) / 255; - uint32_t a = dst_a + src_a; - dst_r = (dst_r * dst_a + src_r * src_a) / a; - dst_g = (dst_g * dst_a + src_g * src_a) / a; - dst_b = (dst_b * dst_a + src_b * src_a) / a; - return (uint32_t)((dst_r << 24) | (dst_g << 16) | (dst_b << 8) | a); + dst_a -= (dst_a * src_a) / 255; + uint32_t a = dst_a + src_a; + dst_r = (dst_r * dst_a + src_r * src_a) / a; + dst_g = (dst_g * dst_a + src_g * src_a) / a; + dst_b = (dst_b * dst_a + src_b * src_a) / a; + return (uint32_t)((dst_r << 24) | (dst_g << 16) | (dst_b << 8) | a); } static inline uint32_t get_pixel_alpha(unsigned char *pixel_addr) { - return *pixel_addr; + return *pixel_addr; } static inline uint32_t get_pixel_luminance_alpha(unsigned char *pixel_addr) { - return (((uint32_t)pixel_addr[0]) << 8) | pixel_addr[1]; + return (((uint32_t)pixel_addr[0]) << 8) | pixel_addr[1]; } static inline uint32_t get_pixel_RGB888(unsigned char *pixel_addr) { - return (((uint32_t)pixel_addr[0]) << 16) | (((uint32_t)pixel_addr[1]) << 8) | (pixel_addr[2]); + return (((uint32_t)pixel_addr[0]) << 16) | (((uint32_t)pixel_addr[1]) << 8) | (pixel_addr[2]); } static inline uint32_t get_pixel_RGBA8888(unsigned char *pixel_addr) { - return (((uint32_t)pixel_addr[0]) << 24) | (((uint32_t)pixel_addr[1]) << 16) | (((uint32_t)pixel_addr[2]) << 8) | pixel_addr[3]; + return (((uint32_t)pixel_addr[0]) << 24) | (((uint32_t)pixel_addr[1]) << 16) | (((uint32_t)pixel_addr[2]) << 8) | pixel_addr[3]; } static inline uint32_t get_pixel_RGB565(unsigned char *pixel_addr) { - return *(uint16_t*)pixel_addr; + return *(uint16_t*)pixel_addr; } static inline uint32_t get_pixel_RGBA4444(unsigned char *pixel_addr) { - return *(uint16_t*)pixel_addr; + return *(uint16_t*)pixel_addr; } static inline get_pixel_func get_pixel_func_ptr(uint32_t format) { - switch(format) { - case GDX2D_FORMAT_ALPHA: return &get_pixel_alpha; - case GDX2D_FORMAT_LUMINANCE_ALPHA: return &get_pixel_luminance_alpha; - case GDX2D_FORMAT_RGB888: return &get_pixel_RGB888; - case GDX2D_FORMAT_RGBA8888: return &get_pixel_RGBA8888; - case GDX2D_FORMAT_RGB565: return &get_pixel_RGB565; - case GDX2D_FORMAT_RGBA4444: return &get_pixel_RGBA4444; - default: return &get_pixel_alpha; // better idea for a default? - } + switch(format) { + case GDX2D_FORMAT_ALPHA: return &get_pixel_alpha; + case GDX2D_FORMAT_LUMINANCE_ALPHA: return &get_pixel_luminance_alpha; + case GDX2D_FORMAT_RGB888: return &get_pixel_RGB888; + case GDX2D_FORMAT_RGBA8888: return &get_pixel_RGBA8888; + case GDX2D_FORMAT_RGB565: return &get_pixel_RGB565; + case GDX2D_FORMAT_RGBA4444: return &get_pixel_RGBA4444; + default: return &get_pixel_alpha; // better idea for a default? + } } gdx2d_pixmap* gdx2d_load(const unsigned char *buffer, uint32_t len) { - int32_t width, height, format; + int32_t width, height, format; - const unsigned char* pixels = stbi_load_from_memory(buffer, len, &width, &height, &format, 0); - if (pixels == NULL) - return NULL; + unsigned char* pixels = stbi_load_from_memory(buffer, len, &width, &height, &format, 0); + if (pixels == NULL) + return NULL; - gdx2d_pixmap* pixmap = (gdx2d_pixmap*)malloc(sizeof(gdx2d_pixmap)); - if (!pixmap) return 0; - pixmap->width = (uint32_t)width; - pixmap->height = (uint32_t)height; - pixmap->format = (uint32_t)format; - pixmap->blend = GDX2D_BLEND_SRC_OVER; - pixmap->scale = GDX2D_SCALE_BILINEAR; - pixmap->pixels = pixels; - return pixmap; + gdx2d_pixmap* pixmap = (gdx2d_pixmap*)malloc(sizeof(gdx2d_pixmap)); + if (!pixmap) return 0; + pixmap->width = (uint32_t)width; + pixmap->height = (uint32_t)height; + pixmap->format = (uint32_t)format; + pixmap->blend = GDX2D_BLEND_SRC_OVER; + pixmap->scale = GDX2D_SCALE_BILINEAR; + pixmap->pixels = pixels; + return pixmap; } uint32_t gdx2d_bytes_per_pixel(uint32_t format) { - switch(format) { - case GDX2D_FORMAT_ALPHA: - return 1; - case GDX2D_FORMAT_LUMINANCE_ALPHA: - case GDX2D_FORMAT_RGB565: - case GDX2D_FORMAT_RGBA4444: - return 2; - case GDX2D_FORMAT_RGB888: - return 3; - case GDX2D_FORMAT_RGBA8888: - return 4; - default: - return 4; - } + switch(format) { + case GDX2D_FORMAT_ALPHA: + return 1; + case GDX2D_FORMAT_LUMINANCE_ALPHA: + case GDX2D_FORMAT_RGB565: + case GDX2D_FORMAT_RGBA4444: + return 2; + case GDX2D_FORMAT_RGB888: + return 3; + case GDX2D_FORMAT_RGBA8888: + return 4; + default: + return 4; + } } gdx2d_pixmap* gdx2d_new(uint32_t width, uint32_t height, uint32_t format) { - gdx2d_pixmap* pixmap = (gdx2d_pixmap*)malloc(sizeof(gdx2d_pixmap)); - if (!pixmap) return 0; - pixmap->width = width; - pixmap->height = height; - pixmap->format = format; - pixmap->blend = GDX2D_BLEND_SRC_OVER; - pixmap->scale = GDX2D_SCALE_BILINEAR; - pixmap->pixels = (unsigned char*)malloc(width * height * gdx2d_bytes_per_pixel(format)); - if (!pixmap->pixels) { - free((void*)pixmap); - return 0; - } - return pixmap; + gdx2d_pixmap* pixmap = (gdx2d_pixmap*)malloc(sizeof(gdx2d_pixmap)); + if (!pixmap) return 0; + pixmap->width = width; + pixmap->height = height; + pixmap->format = format; + pixmap->blend = GDX2D_BLEND_SRC_OVER; + pixmap->scale = GDX2D_SCALE_BILINEAR; + uint32_t size = width * height * gdx2d_bytes_per_pixel(format); + unsigned char* pixels = (unsigned char*)malloc(size); + pixmap->pixels = pixels; + if (!pixmap->pixels) { + free((void*)pixmap); + return 0; + } + memset(pixels, 0, size); + return pixmap; } void gdx2d_free(const gdx2d_pixmap* pixmap) { - free((void*)pixmap->pixels); - free((void*)pixmap); + free((void*)pixmap->pixels); + free((void*)pixmap); } void gdx2d_set_blend (gdx2d_pixmap* pixmap, uint32_t blend) { @@ -280,155 +283,155 @@ void gdx2d_set_blend (gdx2d_pixmap* pixmap, uint32_t blend) { } void gdx2d_set_scale (gdx2d_pixmap* pixmap, uint32_t scale) { - pixmap->scale = scale; + pixmap->scale = scale; } const char *gdx2d_get_failure_reason(void) { - return stbi_failure_reason(); + return stbi_failure_reason(); } static inline void clear_alpha(const gdx2d_pixmap* pixmap, uint32_t col) { - int pixels = pixmap->width * pixmap->height; - memset((void*)pixmap->pixels, col, pixels); + int pixels = pixmap->width * pixmap->height; + memset((void*)pixmap->pixels, col, pixels); } static inline void clear_luminance_alpha(const gdx2d_pixmap* pixmap, uint32_t col) { - int pixels = pixmap->width * pixmap->height; - unsigned short* ptr = (unsigned short*)pixmap->pixels; - unsigned short l = (col & 0xff) << 8 | (col >> 8); + int pixels = pixmap->width * pixmap->height; + unsigned short* ptr = (unsigned short*)pixmap->pixels; + unsigned short l = (col & 0xff) << 8 | (col >> 8); - for(; pixels > 0; pixels--) { - *ptr = l; - ptr++; - } + for(; pixels > 0; pixels--) { + *ptr = l; + ptr++; + } } static inline void clear_RGB888(const gdx2d_pixmap* pixmap, uint32_t col) { - int pixels = pixmap->width * pixmap->height; - unsigned char* ptr = (unsigned char*)pixmap->pixels; - unsigned char r = (col & 0xff0000) >> 16; - unsigned char g = (col & 0xff00) >> 8; - unsigned char b = (col & 0xff); - - for(; pixels > 0; pixels--) { - *ptr = r; - ptr++; - *ptr = g; - ptr++; - *ptr = b; - ptr++; - } + int pixels = pixmap->width * pixmap->height; + unsigned char* ptr = (unsigned char*)pixmap->pixels; + unsigned char r = (col & 0xff0000) >> 16; + unsigned char g = (col & 0xff00) >> 8; + unsigned char b = (col & 0xff); + + for(; pixels > 0; pixels--) { + *ptr = r; + ptr++; + *ptr = g; + ptr++; + *ptr = b; + ptr++; + } } static inline void clear_RGBA8888(const gdx2d_pixmap* pixmap, uint32_t col) { - int pixels = pixmap->width * pixmap->height; - uint32_t* ptr = (uint32_t*)pixmap->pixels; - unsigned char r = (col & 0xff000000) >> 24; - unsigned char g = (col & 0xff0000) >> 16; - unsigned char b = (col & 0xff00) >> 8; - unsigned char a = (col & 0xff); - col = (a << 24) | (b << 16) | (g << 8) | r; - - for(; pixels > 0; pixels--) { - *ptr = col; - ptr++; - } + int pixels = pixmap->width * pixmap->height; + uint32_t* ptr = (uint32_t*)pixmap->pixels; + unsigned char r = (col & 0xff000000) >> 24; + unsigned char g = (col & 0xff0000) >> 16; + unsigned char b = (col & 0xff00) >> 8; + unsigned char a = (col & 0xff); + col = (a << 24) | (b << 16) | (g << 8) | r; + + for(; pixels > 0; pixels--) { + *ptr = col; + ptr++; + } } static inline void clear_RGB565(const gdx2d_pixmap* pixmap, uint32_t col) { - int pixels = pixmap->width * pixmap->height; - unsigned short* ptr = (unsigned short*)pixmap->pixels; - unsigned short l = col & 0xffff; + int pixels = pixmap->width * pixmap->height; + unsigned short* ptr = (unsigned short*)pixmap->pixels; + unsigned short l = col & 0xffff; - for(; pixels > 0; pixels--) { - *ptr = l; - ptr++; - } + for(; pixels > 0; pixels--) { + *ptr = l; + ptr++; + } } static inline void clear_RGBA4444(const gdx2d_pixmap* pixmap, uint32_t col) { - int pixels = pixmap->width * pixmap->height; - unsigned short* ptr = (unsigned short*)pixmap->pixels; - unsigned short l = col & 0xffff; + int pixels = pixmap->width * pixmap->height; + unsigned short* ptr = (unsigned short*)pixmap->pixels; + unsigned short l = col & 0xffff; - for(; pixels > 0; pixels--) { - *ptr = l; - ptr++; - } + for(; pixels > 0; pixels--) { + *ptr = l; + ptr++; + } } void gdx2d_clear(const gdx2d_pixmap* pixmap, uint32_t col) { - col = to_format(pixmap->format, col); - - switch(pixmap->format) { - case GDX2D_FORMAT_ALPHA: - clear_alpha(pixmap, col); - break; - case GDX2D_FORMAT_LUMINANCE_ALPHA: - clear_luminance_alpha(pixmap, col); - break; - case GDX2D_FORMAT_RGB888: - clear_RGB888(pixmap, col); - break; - case GDX2D_FORMAT_RGBA8888: - clear_RGBA8888(pixmap, col); - break; - case GDX2D_FORMAT_RGB565: - clear_RGB565(pixmap, col); - break; - case GDX2D_FORMAT_RGBA4444: - clear_RGBA4444(pixmap, col); - break; - default: - break; - } + col = to_format(pixmap->format, col); + + switch(pixmap->format) { + case GDX2D_FORMAT_ALPHA: + clear_alpha(pixmap, col); + break; + case GDX2D_FORMAT_LUMINANCE_ALPHA: + clear_luminance_alpha(pixmap, col); + break; + case GDX2D_FORMAT_RGB888: + clear_RGB888(pixmap, col); + break; + case GDX2D_FORMAT_RGBA8888: + clear_RGBA8888(pixmap, col); + break; + case GDX2D_FORMAT_RGB565: + clear_RGB565(pixmap, col); + break; + case GDX2D_FORMAT_RGBA4444: + clear_RGBA4444(pixmap, col); + break; + default: + break; + } } static inline int32_t in_pixmap(const gdx2d_pixmap* pixmap, int32_t x, int32_t y) { - if(x < 0 || y < 0) - return 0; - if(x >= pixmap->width || y >= pixmap->height) - return 0; - return -1; + if(x < 0 || y < 0) + return 0; + if(x >= pixmap->width || y >= pixmap->height) + return 0; + return -1; } static inline void set_pixel(unsigned char* pixels, uint32_t width, uint32_t height, uint32_t bpp, set_pixel_func pixel_func, int32_t x, int32_t y, uint32_t col) { - if(x < 0 || y < 0) return; - if(x >= (int32_t)width || y >= (int32_t)height) return; - pixels = pixels + (x + width * y) * bpp; - pixel_func(pixels, col); + if(x < 0 || y < 0) return; + if(x >= (int32_t)width || y >= (int32_t)height) return; + pixels = pixels + (x + width * y) * bpp; + pixel_func(pixels, col); } uint32_t gdx2d_get_pixel(const gdx2d_pixmap* pixmap, int32_t x, int32_t y) { - if(!in_pixmap(pixmap, x, y)) - return 0; - unsigned char* ptr = (unsigned char*)pixmap->pixels + (x + pixmap->width * y) * gdx2d_bytes_per_pixel(pixmap->format); - return to_RGBA8888(pixmap->format, get_pixel_func_ptr(pixmap->format)(ptr)); + if(!in_pixmap(pixmap, x, y)) + return 0; + unsigned char* ptr = (unsigned char*)pixmap->pixels + (x + pixmap->width * y) * gdx2d_bytes_per_pixel(pixmap->format); + return to_RGBA8888(pixmap->format, get_pixel_func_ptr(pixmap->format)(ptr)); } void gdx2d_set_pixel(const gdx2d_pixmap* pixmap, int32_t x, int32_t y, uint32_t col) { - if(pixmap->blend) { - uint32_t dst = gdx2d_get_pixel(pixmap, x, y); - col = blend(col, dst); - col = to_format(pixmap->format, col); - set_pixel((unsigned char*)pixmap->pixels, pixmap->width, pixmap->height, gdx2d_bytes_per_pixel(pixmap->format), set_pixel_func_ptr(pixmap->format), x, y, col); - } else { - col = to_format(pixmap->format, col); - set_pixel((unsigned char*)pixmap->pixels, pixmap->width, pixmap->height, gdx2d_bytes_per_pixel(pixmap->format), set_pixel_func_ptr(pixmap->format), x, y, col); - } + if(pixmap->blend) { + uint32_t dst = gdx2d_get_pixel(pixmap, x, y); + col = blend(col, dst); + col = to_format(pixmap->format, col); + set_pixel((unsigned char*)pixmap->pixels, pixmap->width, pixmap->height, gdx2d_bytes_per_pixel(pixmap->format), set_pixel_func_ptr(pixmap->format), x, y, col); + } else { + col = to_format(pixmap->format, col); + set_pixel((unsigned char*)pixmap->pixels, pixmap->width, pixmap->height, gdx2d_bytes_per_pixel(pixmap->format), set_pixel_func_ptr(pixmap->format), x, y, col); + } } void gdx2d_draw_line(const gdx2d_pixmap* pixmap, int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t col) { int32_t dy = y1 - y0; int32_t dx = x1 - x0; - int32_t fraction = 0; + int32_t fraction = 0; int32_t stepx, stepy; - unsigned char* ptr = (unsigned char*)pixmap->pixels; - uint32_t bpp = gdx2d_bytes_per_pixel(pixmap->format); - set_pixel_func pset = set_pixel_func_ptr(pixmap->format); - get_pixel_func pget = get_pixel_func_ptr(pixmap->format); - uint32_t col_format = to_format(pixmap->format, col); - void* addr = ptr + (x0 + y0 * pixmap->width) * bpp; + unsigned char* ptr = (unsigned char*)pixmap->pixels; + uint32_t bpp = gdx2d_bytes_per_pixel(pixmap->format); + set_pixel_func pset = set_pixel_func_ptr(pixmap->format); + get_pixel_func pget = get_pixel_func_ptr(pixmap->format); + uint32_t col_format = to_format(pixmap->format, col); + void* addr = ptr + (x0 + y0 * pixmap->width) * bpp; if (dy < 0) { dy = -dy; stepy = -1; } else { stepy = 1; } if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; } @@ -436,10 +439,10 @@ void gdx2d_draw_line(const gdx2d_pixmap* pixmap, int32_t x0, int32_t y0, int32_t dx <<= 1; if(in_pixmap(pixmap, x0, y0)) { - if(pixmap->blend) { - col_format = to_format(pixmap->format, blend(col, to_RGBA8888(pixmap->format, pget(addr)))); - } - pset(addr, col_format); + if(pixmap->blend) { + col_format = to_format(pixmap->format, blend(col, to_RGBA8888(pixmap->format, pget(addr)))); + } + pset(addr, col_format); } if (dx > dy) { fraction = dy - (dx >> 1); @@ -450,110 +453,110 @@ void gdx2d_draw_line(const gdx2d_pixmap* pixmap, int32_t x0, int32_t y0, int32_t } x0 += stepx; fraction += dy; - if(in_pixmap(pixmap, x0, y0)) { - addr = ptr + (x0 + y0 * pixmap->width) * bpp; - if(pixmap->blend) { - col_format = to_format(pixmap->format, blend(col, to_RGBA8888(pixmap->format, pget(addr)))); - } - pset(addr, col_format); - } + if(in_pixmap(pixmap, x0, y0)) { + addr = ptr + (x0 + y0 * pixmap->width) * bpp; + if(pixmap->blend) { + col_format = to_format(pixmap->format, blend(col, to_RGBA8888(pixmap->format, pget(addr)))); + } + pset(addr, col_format); + } } } else { - fraction = dx - (dy >> 1); - while (y0 != y1) { - if (fraction >= 0) { - x0 += stepx; - fraction -= dy; - } - y0 += stepy; - fraction += dx; - if(in_pixmap(pixmap, x0, y0)) { - addr = ptr + (x0 + y0 * pixmap->width) * bpp; - if(pixmap->blend) { - col_format = to_format(pixmap->format, blend(col, to_RGBA8888(pixmap->format, pget(addr)))); - } - pset(addr, col_format); - } - } - } + fraction = dx - (dy >> 1); + while (y0 != y1) { + if (fraction >= 0) { + x0 += stepx; + fraction -= dy; + } + y0 += stepy; + fraction += dx; + if(in_pixmap(pixmap, x0, y0)) { + addr = ptr + (x0 + y0 * pixmap->width) * bpp; + if(pixmap->blend) { + col_format = to_format(pixmap->format, blend(col, to_RGBA8888(pixmap->format, pget(addr)))); + } + pset(addr, col_format); + } + } + } } static inline void hline(const gdx2d_pixmap* pixmap, int32_t x1, int32_t x2, int32_t y, uint32_t col) { - int32_t tmp = 0; - set_pixel_func pset = set_pixel_func_ptr(pixmap->format); - get_pixel_func pget = get_pixel_func_ptr(pixmap->format); - unsigned char* ptr = (unsigned char*)pixmap->pixels; - uint32_t bpp = gdx2d_bytes_per_pixel(pixmap->format); - uint32_t col_format = to_format(pixmap->format, col); - - if(y < 0 || y >= (int32_t)pixmap->height) return; - - if(x1 > x2) { - tmp = x1; - x1 = x2; - x2 = tmp; - } + int32_t tmp = 0; + set_pixel_func pset = set_pixel_func_ptr(pixmap->format); + get_pixel_func pget = get_pixel_func_ptr(pixmap->format); + unsigned char* ptr = (unsigned char*)pixmap->pixels; + uint32_t bpp = gdx2d_bytes_per_pixel(pixmap->format); + uint32_t col_format = to_format(pixmap->format, col); + + if(y < 0 || y >= (int32_t)pixmap->height) return; + + if(x1 > x2) { + tmp = x1; + x1 = x2; + x2 = tmp; + } - if(x1 >= (int32_t)pixmap->width) return; - if(x2 < 0) return; + if(x1 >= (int32_t)pixmap->width) return; + if(x2 < 0) return; - if(x1 < 0) x1 = 0; - if(x2 >= (int32_t)pixmap->width) x2 = pixmap->width - 1; - x2 += 1; + if(x1 < 0) x1 = 0; + if(x2 >= (int32_t)pixmap->width) x2 = pixmap->width - 1; + x2 += 1; - ptr += (x1 + y * pixmap->width) * bpp; + ptr += (x1 + y * pixmap->width) * bpp; - while(x1 != x2) { - if(pixmap->blend) { - col_format = to_format(pixmap->format, blend(col, to_RGBA8888(pixmap->format, pget(ptr)))); - } - pset(ptr, col_format); - x1++; - ptr += bpp; - } + while(x1 != x2) { + if(pixmap->blend) { + col_format = to_format(pixmap->format, blend(col, to_RGBA8888(pixmap->format, pget(ptr)))); + } + pset(ptr, col_format); + x1++; + ptr += bpp; + } } static inline void vline(const gdx2d_pixmap* pixmap, int32_t y1, int32_t y2, int32_t x, uint32_t col) { - int32_t tmp = 0; - set_pixel_func pset = set_pixel_func_ptr(pixmap->format); - get_pixel_func pget = get_pixel_func_ptr(pixmap->format); - unsigned char* ptr = (unsigned char*)pixmap->pixels; - uint32_t bpp = gdx2d_bytes_per_pixel(pixmap->format); - uint32_t stride = bpp * pixmap->width; - uint32_t col_format = to_format(pixmap->format, col); - - if(x < 0 || x >= pixmap->width) return; - - if(y1 > y2) { - tmp = y1; - y1 = y2; - y2 = tmp; - } + int32_t tmp = 0; + set_pixel_func pset = set_pixel_func_ptr(pixmap->format); + get_pixel_func pget = get_pixel_func_ptr(pixmap->format); + unsigned char* ptr = (unsigned char*)pixmap->pixels; + uint32_t bpp = gdx2d_bytes_per_pixel(pixmap->format); + uint32_t stride = bpp * pixmap->width; + uint32_t col_format = to_format(pixmap->format, col); + + if(x < 0 || x >= pixmap->width) return; + + if(y1 > y2) { + tmp = y1; + y1 = y2; + y2 = tmp; + } - if(y1 >= (int32_t)pixmap->height) return; - if(y2 < 0) return; + if(y1 >= (int32_t)pixmap->height) return; + if(y2 < 0) return; - if(y1 < 0) y1 = 0; - if(y2 >= (int32_t)pixmap->height) y2 = pixmap->height - 1; - y2 += 1; + if(y1 < 0) y1 = 0; + if(y2 >= (int32_t)pixmap->height) y2 = pixmap->height - 1; + y2 += 1; - ptr += (x + y1 * pixmap->width) * bpp; + ptr += (x + y1 * pixmap->width) * bpp; - while(y1 != y2) { - if(pixmap->blend) { - col_format = to_format(pixmap->format, blend(col, to_RGBA8888(pixmap->format, pget(ptr)))); - } - pset(ptr, col_format); - y1++; - ptr += stride; - } + while(y1 != y2) { + if(pixmap->blend) { + col_format = to_format(pixmap->format, blend(col, to_RGBA8888(pixmap->format, pget(ptr)))); + } + pset(ptr, col_format); + y1++; + ptr += stride; + } } void gdx2d_draw_rect(const gdx2d_pixmap* pixmap, int32_t x, int32_t y, uint32_t width, uint32_t height, uint32_t col) { - hline(pixmap, x, x + width - 1, y, col); - hline(pixmap, x, x + width - 1, y + height - 1, col); - vline(pixmap, y, y + height - 1, x, col); - vline(pixmap, y, y + height - 1, x + width - 1, col); + hline(pixmap, x, x + width - 1, y, col); + hline(pixmap, x, x + width - 1, y + height - 1, col); + vline(pixmap, y, y + height - 1, x, col); +vline(pixmap, y, y + height - 1, x + width - 1, col); } static inline void circle_points(unsigned char* pixels, uint32_t width, uint32_t height, uint32_t bpp, set_pixel_func pixel_func, int32_t cx, int32_t cy, int32_t x, int32_t y, uint32_t col) { @@ -585,12 +588,12 @@ void gdx2d_draw_circle(const gdx2d_pixmap* pixmap, int32_t x, int32_t y, uint32_ int32_t px = 0; int32_t py = radius; int32_t p = (5 - (int32_t)radius*4)/4; - unsigned char* pixels = (unsigned char*)pixmap->pixels; - uint32_t width = pixmap->width; - uint32_t height = pixmap->height; - uint32_t bpp = gdx2d_bytes_per_pixel(pixmap->format); - set_pixel_func pixel_func = set_pixel_func_ptr(pixmap->format); - col = to_format(pixmap->format, col); + unsigned char* pixels = (unsigned char*)pixmap->pixels; + uint32_t width = pixmap->width; + uint32_t height = pixmap->height; + uint32_t bpp = gdx2d_bytes_per_pixel(pixmap->format); + set_pixel_func pixel_func = set_pixel_func_ptr(pixmap->format); + col = to_format(pixmap->format, col); circle_points(pixels, width, height, bpp, pixel_func, x, y, px, py, col); while (px < py) { @@ -606,54 +609,54 @@ void gdx2d_draw_circle(const gdx2d_pixmap* pixmap, int32_t x, int32_t y, uint32_ } void gdx2d_fill_rect(const gdx2d_pixmap* pixmap, int32_t x, int32_t y, uint32_t width, uint32_t height, uint32_t col) { - int32_t x2 = x + width - 1; - int32_t y2 = y + height - 1; + int32_t x2 = x + width - 1; + int32_t y2 = y + height - 1; + + if(x >= (int32_t)pixmap->width) return; + if(y >= (int32_t)pixmap->height) return; + if(x2 < 0) return; + if(y2 < 0) return; + + if(x < 0) x = 0; + if(y < 0) y = 0; + if(x2 >= (int32_t)pixmap->width) x2 = pixmap->width - 1; + if(y2 >= (int32_t)pixmap->height) y2 = pixmap->height - 1; + + y2++; + while(y!=y2) { + hline(pixmap, x, x2, y, col); + y++; + } +} - if(x >= (int32_t)pixmap->width) return; - if(y >= (int32_t)pixmap->height) return; - if(x2 < 0) return; - if(y2 < 0) return; +void gdx2d_fill_circle(const gdx2d_pixmap* pixmap, int32_t x0, int32_t y0, uint32_t radius, uint32_t col) { + int32_t f = 1 - (int32_t)radius; + int32_t ddF_x = 1; + int32_t ddF_y = -2 * (int32_t)radius; + int32_t px = 0; + int32_t py = (int32_t)radius; - if(x < 0) x = 0; - if(y < 0) y = 0; - if(x2 >= (int32_t)pixmap->width) x2 = pixmap->width - 1; - if(y2 >= (int32_t)pixmap->height) y2 = pixmap->height - 1; + hline(pixmap, x0, x0, y0 + (int32_t)radius, col); + hline(pixmap, x0, x0, y0 - (int32_t)radius, col); + hline(pixmap, x0 - (int32_t)radius, x0 + (int32_t)radius, y0, col); - y2++; - while(y!=y2) { - hline(pixmap, x, x2, y, col); - y++; - } -} -void gdx2d_fill_circle(const gdx2d_pixmap* pixmap, int32_t x0, int32_t y0, uint32_t radius, uint32_t col) { - int32_t f = 1 - (int32_t)radius; - int32_t ddF_x = 1; - int32_t ddF_y = -2 * (int32_t)radius; - int32_t px = 0; - int32_t py = (int32_t)radius; - - hline(pixmap, x0, x0, y0 + (int32_t)radius, col); - hline(pixmap, x0, x0, y0 - (int32_t)radius, col); - hline(pixmap, x0 - (int32_t)radius, x0 + (int32_t)radius, y0, col); - - - while(px < py) - { - if(f >= 0) - { - py--; - ddF_y += 2; - f += ddF_y; - } - px++; - ddF_x += 2; - f += ddF_x; - hline(pixmap, x0 - px, x0 + px, y0 + py, col); - hline(pixmap, x0 - px, x0 + px, y0 - py, col); - hline(pixmap, x0 - py, x0 + py, y0 + px, col); - hline(pixmap, x0 - py, x0 + py, y0 - px, col); - } + while(px < py) + { + if(f >= 0) + { + py--; + ddF_y += 2; + f += ddF_y; + } + px++; + ddF_x += 2; + f += ddF_x; + hline(pixmap, x0 - px, x0 + px, y0 + py, col); + hline(pixmap, x0 - px, x0 + px, y0 - py, col); + hline(pixmap, x0 - py, x0 + py, y0 + px, col); + hline(pixmap, x0 - py, x0 + py, y0 - px, col); + } } #define max(a, b) (a < b?b:a) @@ -664,291 +667,291 @@ void gdx2d_fill_circle(const gdx2d_pixmap* pixmap, int32_t x0, int32_t y0, uint3 void gdx2d_fill_triangle(const gdx2d_pixmap* pixmap, int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t x3, int32_t y3, uint32_t col) { - // this structure is used to sort edges according to y-component. - struct edge { - int32_t x1; - int32_t y1; - int32_t x2; - int32_t y2; - }; - struct edge edges[3], edge_tmp; - float slope0, slope1, slope2; - int32_t edge0_len, edge1_len, edge2_len, edge_len_tmp; - int32_t y, bound_y1, bound_y2, calc_x1, calc_x2; - - // do nothing when points are colinear -- we draw the fill not the line. - if ((x2 - x1) * (y3 - y1) == (x3 - x1) * (y2 - y1)) { - return; - } - - // asign input vertices into internally-sorted edge structures. - EDGE_ASSIGN(edges[0], x1, y1, x2, y2); - EDGE_ASSIGN(edges[1], x1, y1, x3, y3); - EDGE_ASSIGN(edges[2], x2, y2, x3, y3); - - // order edges according to descending length. - edge0_len = edges[0].y2 - edges[0].y1; - edge1_len = edges[1].y2 - edges[1].y1; - edge2_len = edges[2].y2 - edges[2].y1; - - if (edge1_len >= edge0_len && edge1_len >= edge2_len) { - // swap edge0 and edge1 with respective lengths. - edge_tmp = edges[0]; - edges[0] = edges[1]; - edges[1] = edge_tmp; - edge_len_tmp = edge0_len; - edge0_len = edge1_len; - edge1_len = edge_len_tmp; - } else if (edge2_len >= edge0_len && edge2_len >= edge1_len) { - // swap edge0 and edge2 with respective lengths. - edge_tmp = edges[0]; - edges[0] = edges[2]; - edges[2] = edge_tmp; - edge_len_tmp = edge0_len; - edge0_len = edge2_len; - edge2_len = edge_len_tmp; - } - - if (edge2_len > edge1_len) { - // swap edge1 and edge2 - edge len no longer necessary. - edge_tmp = edges[1]; - edges[1] = edges[2]; - edges[2] = edge_tmp; - } - - // y-component of the two longest y-component edges is provably > 0. - - slope0 = ((float) (edges[0].x1 - edges[0].x2)) / - ((float) (edges[0].y2 - edges[0].y1)); - slope1 = ((float) (edges[1].x1 - edges[1].x2)) / - ((float) (edges[1].y2 - edges[1].y1)); - - // avoid iterating on y values out of bounds. - bound_y1 = max(edges[1].y1, 0); - bound_y2 = min(edges[1].y2, pixmap->height-1); - - for ( y=bound_y1; y <= bound_y2; y++ ) { - - // calculate the x values for this y value. - calc_x1 = (int32_t) ((float) edges[0].x2 + - slope0 * (float) (edges[0].y2 - y) + 0.5); - calc_x2 = (int32_t) ((float) edges[1].x2 + - slope1 * (float) (edges[1].y2 - y) + 0.5); - - // do not duplicate hline() swap and boundary checking. - hline(pixmap, calc_x1, calc_x2, y, col); - } - - // if there are still values of y which remain, keep calculating. - - if (edges[2].y2 - edges[2].y1 > 0) { - - slope2 = ((float) (edges[2].x1 - edges[2].x2)) / - ((float) (edges[2].y2 - edges[2].y1)); - - bound_y1 = max(edges[2].y1, 0); - bound_y2 = min(edges[2].y2, pixmap->height-1); - - for ( y=bound_y1; y <= bound_y2; y++ ) { - - calc_x1 = (int32_t) ((float) edges[0].x2 + - slope0 * (float) (edges[0].y2 - y) + 0.5); - calc_x2 = (int32_t) ((float) edges[2].x2 + - slope2 * (float) (edges[2].y2 - y) + 0.5); - - hline(pixmap, calc_x1, calc_x2, y, col); - } - } - - return; + // this structure is used to sort edges according to y-component. + struct edge { + int32_t x1; + int32_t y1; + int32_t x2; + int32_t y2; + }; + struct edge edges[3], edge_tmp; + float slope0, slope1, slope2; + int32_t edge0_len, edge1_len, edge2_len, edge_len_tmp; + int32_t y, bound_y1, bound_y2, calc_x1, calc_x2; + + // do nothing when points are colinear -- we draw the fill not the line. + if ((x2 - x1) * (y3 - y1) == (x3 - x1) * (y2 - y1)) { + return; + } + + // asign input vertices into internally-sorted edge structures. + EDGE_ASSIGN(edges[0], x1, y1, x2, y2); + EDGE_ASSIGN(edges[1], x1, y1, x3, y3); + EDGE_ASSIGN(edges[2], x2, y2, x3, y3); + + // order edges according to descending length. + edge0_len = edges[0].y2 - edges[0].y1; + edge1_len = edges[1].y2 - edges[1].y1; + edge2_len = edges[2].y2 - edges[2].y1; + + if (edge1_len >= edge0_len && edge1_len >= edge2_len) { + // swap edge0 and edge1 with respective lengths. + edge_tmp = edges[0]; + edges[0] = edges[1]; + edges[1] = edge_tmp; + edge_len_tmp = edge0_len; + edge0_len = edge1_len; + edge1_len = edge_len_tmp; + } else if (edge2_len >= edge0_len && edge2_len >= edge1_len) { + // swap edge0 and edge2 with respective lengths. + edge_tmp = edges[0]; + edges[0] = edges[2]; + edges[2] = edge_tmp; + edge_len_tmp = edge0_len; + edge0_len = edge2_len; + edge2_len = edge_len_tmp; + } + + if (edge2_len > edge1_len) { + // swap edge1 and edge2 - edge len no longer necessary. + edge_tmp = edges[1]; + edges[1] = edges[2]; + edges[2] = edge_tmp; + } + + // y-component of the two longest y-component edges is provably > 0. + + slope0 = ((float) (edges[0].x1 - edges[0].x2)) / + ((float) (edges[0].y2 - edges[0].y1)); + slope1 = ((float) (edges[1].x1 - edges[1].x2)) / + ((float) (edges[1].y2 - edges[1].y1)); + + // avoid iterating on y values out of bounds. + bound_y1 = max(edges[1].y1, 0); + bound_y2 = min(edges[1].y2, pixmap->height-1); + + for ( y=bound_y1; y <= bound_y2; y++ ) { + + // calculate the x values for this y value. + calc_x1 = (int32_t) ((float) edges[0].x2 + + slope0 * (float) (edges[0].y2 - y) + 0.5); + calc_x2 = (int32_t) ((float) edges[1].x2 + + slope1 * (float) (edges[1].y2 - y) + 0.5); + + // do not duplicate hline() swap and boundary checking. + hline(pixmap, calc_x1, calc_x2, y, col); + } + + // if there are still values of y which remain, keep calculating. + + if (edges[2].y2 - edges[2].y1 > 0) { + + slope2 = ((float) (edges[2].x1 - edges[2].x2)) / + ((float) (edges[2].y2 - edges[2].y1)); + + bound_y1 = max(edges[2].y1, 0); + bound_y2 = min(edges[2].y2, pixmap->height-1); + + for ( y=bound_y1; y <= bound_y2; y++ ) { + + calc_x1 = (int32_t) ((float) edges[0].x2 + + slope0 * (float) (edges[0].y2 - y) + 0.5); + calc_x2 = (int32_t) ((float) edges[2].x2 + + slope2 * (float) (edges[2].y2 - y) + 0.5); + + hline(pixmap, calc_x1, calc_x2, y, col); + } + } + + return; } static inline void blit_same_size(const gdx2d_pixmap* src_pixmap, const gdx2d_pixmap* dst_pixmap, - int32_t src_x, int32_t src_y, - int32_t dst_x, int32_t dst_y, - uint32_t width, uint32_t height) { - set_pixel_func pset = set_pixel_func_ptr(dst_pixmap->format); - get_pixel_func pget = get_pixel_func_ptr(src_pixmap->format); - get_pixel_func dpget = get_pixel_func_ptr(dst_pixmap->format); - uint32_t sbpp = gdx2d_bytes_per_pixel(src_pixmap->format); - uint32_t dbpp = gdx2d_bytes_per_pixel(dst_pixmap->format); - uint32_t spitch = sbpp * src_pixmap->width; - uint32_t dpitch = dbpp * dst_pixmap->width; - - int sx = src_x; - int sy = src_y; - int dx = dst_x; - int dy = dst_y; - - for(;sy < src_y + height; sy++, dy++) { - if(sy < 0 || dy < 0) continue; - if(sy >= src_pixmap->height || dy >= dst_pixmap->height) break; - - for(sx = src_x, dx = dst_x; sx < src_x + width; sx++, dx++) { - if(sx < 0 || dx < 0) continue; - if(sx >= src_pixmap->width || dx >= dst_pixmap->width) break; - - const void* src_ptr = src_pixmap->pixels + sx * sbpp + sy * spitch; - const void* dst_ptr = dst_pixmap->pixels + dx * dbpp + dy * dpitch; - uint32_t src_col = to_RGBA8888(src_pixmap->format, pget((void*)src_ptr)); - - if(dst_pixmap->blend) { - uint32_t dst_col = to_RGBA8888(dst_pixmap->format, dpget((void*)dst_ptr)); - src_col = to_format(dst_pixmap->format, blend(src_col, dst_col)); - } else { - src_col = to_format(dst_pixmap->format, src_col); - } - - pset((void*)dst_ptr, src_col); - } - } + int32_t src_x, int32_t src_y, + int32_t dst_x, int32_t dst_y, + uint32_t width, uint32_t height) { + set_pixel_func pset = set_pixel_func_ptr(dst_pixmap->format); + get_pixel_func pget = get_pixel_func_ptr(src_pixmap->format); + get_pixel_func dpget = get_pixel_func_ptr(dst_pixmap->format); + uint32_t sbpp = gdx2d_bytes_per_pixel(src_pixmap->format); + uint32_t dbpp = gdx2d_bytes_per_pixel(dst_pixmap->format); + uint32_t spitch = sbpp * src_pixmap->width; + uint32_t dpitch = dbpp * dst_pixmap->width; + + int sx = src_x; + int sy = src_y; + int dx = dst_x; + int dy = dst_y; + + for(;sy < src_y + height; sy++, dy++) { + if(sy < 0 || dy < 0) continue; + if(sy >= src_pixmap->height || dy >= dst_pixmap->height) break; + + for(sx = src_x, dx = dst_x; sx < src_x + width; sx++, dx++) { + if(sx < 0 || dx < 0) continue; + if(sx >= src_pixmap->width || dx >= dst_pixmap->width) break; + + const void* src_ptr = src_pixmap->pixels + sx * sbpp + sy * spitch; + const void* dst_ptr = dst_pixmap->pixels + dx * dbpp + dy * dpitch; + uint32_t src_col = to_RGBA8888(src_pixmap->format, pget((void*)src_ptr)); + + if(dst_pixmap->blend) { + uint32_t dst_col = to_RGBA8888(dst_pixmap->format, dpget((void*)dst_ptr)); + src_col = to_format(dst_pixmap->format, blend(src_col, dst_col)); + } else { + src_col = to_format(dst_pixmap->format, src_col); + } + + pset((void*)dst_ptr, src_col); + } + } } static inline void blit_bilinear(const gdx2d_pixmap* src_pixmap, const gdx2d_pixmap* dst_pixmap, - int32_t src_x, int32_t src_y, uint32_t src_width, uint32_t src_height, - int32_t dst_x, int32_t dst_y, uint32_t dst_width, uint32_t dst_height) { - set_pixel_func pset = set_pixel_func_ptr(dst_pixmap->format); - get_pixel_func pget = get_pixel_func_ptr(src_pixmap->format); - get_pixel_func dpget = get_pixel_func_ptr(dst_pixmap->format); - uint32_t sbpp = gdx2d_bytes_per_pixel(src_pixmap->format); - uint32_t dbpp = gdx2d_bytes_per_pixel(dst_pixmap->format); - uint32_t spitch = sbpp * src_pixmap->width; - uint32_t dpitch = dbpp * dst_pixmap->width; - - float x_ratio = ((float)src_width - 1)/ dst_width; - float y_ratio = ((float)src_height - 1) / dst_height; - float x_diff = 0; - float y_diff = 0; - - int dx = dst_x; - int dy = dst_y; - int sx = src_x; - int sy = src_y; - int i = 0; - int j = 0; - - for(;i < dst_height; i++) { - sy = (int)(i * y_ratio) + src_y; - dy = i + dst_y; - y_diff = (y_ratio * i + src_y) - sy; - if(sy < 0 || dy < 0) continue; - if(sy >= src_pixmap->height || dy >= dst_pixmap->height) break; - - for(j = 0 ;j < dst_width; j++) { - sx = (int)(j * x_ratio) + src_x; - dx = j + dst_x; - x_diff = (x_ratio * j + src_x) - sx; - if(sx < 0 || dx < 0) continue; - if(sx >= src_pixmap->width || dx >= dst_pixmap->width) break; - - const void* dst_ptr = dst_pixmap->pixels + dx * dbpp + dy * dpitch; - const void* src_ptr = src_pixmap->pixels + sx * sbpp + sy * spitch; - uint32_t c1 = 0, c2 = 0, c3 = 0, c4 = 0; - c1 = to_RGBA8888(src_pixmap->format, pget((void*)src_ptr)); - if(sx + 1 < src_width) c2 = to_RGBA8888(src_pixmap->format, pget((void*)((char*)src_ptr + sbpp))); else c2 = c1; - if(sy + 1< src_height) c3 = to_RGBA8888(src_pixmap->format, pget((void*)((char*)src_ptr + spitch))); else c3 = c1; - if(sx + 1< src_width && sy + 1 < src_height) c4 = to_RGBA8888(src_pixmap->format, pget((void*)((char*)src_ptr + spitch + sbpp))); else c4 = c1; - - float ta = (1 - x_diff) * (1 - y_diff); - float tb = (x_diff) * (1 - y_diff); - float tc = (1 - x_diff) * (y_diff); - float td = (x_diff) * (y_diff); - - uint32_t r = (uint32_t)(((c1 & 0xff000000) >> 24) * ta + - ((c2 & 0xff000000) >> 24) * tb + - ((c3 & 0xff000000) >> 24) * tc + - ((c4 & 0xff000000) >> 24) * td) & 0xff; - uint32_t g = (uint32_t)(((c1 & 0xff0000) >> 16) * ta + - ((c2 & 0xff0000) >> 16) * tb + - ((c3 & 0xff0000) >> 16) * tc + - ((c4 & 0xff0000) >> 16) * td) & 0xff; - uint32_t b = (uint32_t)(((c1 & 0xff00) >> 8) * ta + - ((c2 & 0xff00) >> 8) * tb + - ((c3 & 0xff00) >> 8) * tc + - ((c4 & 0xff00) >> 8) * td) & 0xff; - uint32_t a = (uint32_t)((c1 & 0xff) * ta + - (c2 & 0xff) * tb + - (c3 & 0xff) * tc + - (c4 & 0xff) * td) & 0xff; - - uint32_t src_col = (r << 24) | (g << 16) | (b << 8) | a; - - if(dst_pixmap->blend) { - uint32_t dst_col = to_RGBA8888(dst_pixmap->format, dpget((void*)dst_ptr)); - src_col = to_format(dst_pixmap->format, blend(src_col, dst_col)); - } else { - src_col = to_format(dst_pixmap->format, src_col); - } - - pset((void*)dst_ptr, src_col); - } - } + int32_t src_x, int32_t src_y, uint32_t src_width, uint32_t src_height, + int32_t dst_x, int32_t dst_y, uint32_t dst_width, uint32_t dst_height) { + set_pixel_func pset = set_pixel_func_ptr(dst_pixmap->format); + get_pixel_func pget = get_pixel_func_ptr(src_pixmap->format); + get_pixel_func dpget = get_pixel_func_ptr(dst_pixmap->format); + uint32_t sbpp = gdx2d_bytes_per_pixel(src_pixmap->format); + uint32_t dbpp = gdx2d_bytes_per_pixel(dst_pixmap->format); + uint32_t spitch = sbpp * src_pixmap->width; + uint32_t dpitch = dbpp * dst_pixmap->width; + + float x_ratio = ((float)src_width - 1)/ dst_width; + float y_ratio = ((float)src_height - 1) / dst_height; + float x_diff = 0; + float y_diff = 0; + + int dx = dst_x; + int dy = dst_y; + int sx = src_x; + int sy = src_y; + int i = 0; + int j = 0; + + for(;i < dst_height; i++) { + sy = (int)(i * y_ratio) + src_y; + dy = i + dst_y; + y_diff = (y_ratio * i + src_y) - sy; + if(sy < 0 || dy < 0) continue; + if(sy >= src_pixmap->height || dy >= dst_pixmap->height) break; + + for(j = 0 ;j < dst_width; j++) { + sx = (int)(j * x_ratio) + src_x; + dx = j + dst_x; + x_diff = (x_ratio * j + src_x) - sx; + if(sx < 0 || dx < 0) continue; + if(sx >= src_pixmap->width || dx >= dst_pixmap->width) break; + + const void* dst_ptr = dst_pixmap->pixels + dx * dbpp + dy * dpitch; + const void* src_ptr = src_pixmap->pixels + sx * sbpp + sy * spitch; + uint32_t c1 = 0, c2 = 0, c3 = 0, c4 = 0; + c1 = to_RGBA8888(src_pixmap->format, pget((void*)src_ptr)); + if(sx + 1 < src_width) c2 = to_RGBA8888(src_pixmap->format, pget((void*)((char*)src_ptr + sbpp))); else c2 = c1; + if(sy + 1< src_height) c3 = to_RGBA8888(src_pixmap->format, pget((void*)((char*)src_ptr + spitch))); else c3 = c1; + if(sx + 1< src_width && sy + 1 < src_height) c4 = to_RGBA8888(src_pixmap->format, pget((void*)((char*)src_ptr + spitch + sbpp))); else c4 = c1; + + float ta = (1 - x_diff) * (1 - y_diff); + float tb = (x_diff) * (1 - y_diff); + float tc = (1 - x_diff) * (y_diff); + float td = (x_diff) * (y_diff); + + uint32_t r = (uint32_t)(((c1 & 0xff000000) >> 24) * ta + + ((c2 & 0xff000000) >> 24) * tb + + ((c3 & 0xff000000) >> 24) * tc + + ((c4 & 0xff000000) >> 24) * td) & 0xff; + uint32_t g = (uint32_t)(((c1 & 0xff0000) >> 16) * ta + + ((c2 & 0xff0000) >> 16) * tb + + ((c3 & 0xff0000) >> 16) * tc + + ((c4 & 0xff0000) >> 16) * td) & 0xff; + uint32_t b = (uint32_t)(((c1 & 0xff00) >> 8) * ta + + ((c2 & 0xff00) >> 8) * tb + + ((c3 & 0xff00) >> 8) * tc + + ((c4 & 0xff00) >> 8) * td) & 0xff; + uint32_t a = (uint32_t)((c1 & 0xff) * ta + + (c2 & 0xff) * tb + + (c3 & 0xff) * tc + + (c4 & 0xff) * td) & 0xff; + + uint32_t src_col = (r << 24) | (g << 16) | (b << 8) | a; + + if(dst_pixmap->blend) { + uint32_t dst_col = to_RGBA8888(dst_pixmap->format, dpget((void*)dst_ptr)); + src_col = to_format(dst_pixmap->format, blend(src_col, dst_col)); + } else { + src_col = to_format(dst_pixmap->format, src_col); + } + + pset((void*)dst_ptr, src_col); + } + } } static inline void blit_linear(const gdx2d_pixmap* src_pixmap, const gdx2d_pixmap* dst_pixmap, - int32_t src_x, int32_t src_y, uint32_t src_width, uint32_t src_height, - int32_t dst_x, int32_t dst_y, uint32_t dst_width, uint32_t dst_height) { - set_pixel_func pset = set_pixel_func_ptr(dst_pixmap->format); - get_pixel_func pget = get_pixel_func_ptr(src_pixmap->format); - get_pixel_func dpget = get_pixel_func_ptr(dst_pixmap->format); - uint32_t sbpp = gdx2d_bytes_per_pixel(src_pixmap->format); - uint32_t dbpp = gdx2d_bytes_per_pixel(dst_pixmap->format); - uint32_t spitch = sbpp * src_pixmap->width; - uint32_t dpitch = dbpp * dst_pixmap->width; - - uint32_t x_ratio = (src_width << 16) / dst_width + 1; - uint32_t y_ratio = (src_height << 16) / dst_height + 1; - - int dx = dst_x; - int dy = dst_y; - int sx = src_x; - int sy = src_y; - int i = 0; - int j = 0; - - for(;i < dst_height; i++) { - sy = ((i * y_ratio) >> 16) + src_y; - dy = i + dst_y; - if(sy < 0 || dy < 0) continue; - if(sy >= src_pixmap->height || dy >= dst_pixmap->height) break; - - for(j = 0 ;j < dst_width; j++) { - sx = ((j * x_ratio) >> 16) + src_x; - dx = j + dst_x; - if(sx < 0 || dx < 0) continue; - if(sx >= src_pixmap->width || dx >= dst_pixmap->width) break; - - const void* src_ptr = src_pixmap->pixels + sx * sbpp + sy * spitch; - const void* dst_ptr = dst_pixmap->pixels + dx * dbpp + dy * dpitch; - uint32_t src_col = to_RGBA8888(src_pixmap->format, pget((void*)src_ptr)); - - if(dst_pixmap->blend) { - uint32_t dst_col = to_RGBA8888(dst_pixmap->format, dpget((void*)dst_ptr)); - src_col = to_format(dst_pixmap->format, blend(src_col, dst_col)); - } else { - src_col = to_format(dst_pixmap->format, src_col); - } - - pset((void*)dst_ptr, src_col); - } - } + int32_t src_x, int32_t src_y, uint32_t src_width, uint32_t src_height, + int32_t dst_x, int32_t dst_y, uint32_t dst_width, uint32_t dst_height) { + set_pixel_func pset = set_pixel_func_ptr(dst_pixmap->format); + get_pixel_func pget = get_pixel_func_ptr(src_pixmap->format); + get_pixel_func dpget = get_pixel_func_ptr(dst_pixmap->format); + uint32_t sbpp = gdx2d_bytes_per_pixel(src_pixmap->format); + uint32_t dbpp = gdx2d_bytes_per_pixel(dst_pixmap->format); + uint32_t spitch = sbpp * src_pixmap->width; + uint32_t dpitch = dbpp * dst_pixmap->width; + + uint32_t x_ratio = (src_width << 16) / dst_width + 1; + uint32_t y_ratio = (src_height << 16) / dst_height + 1; + + int dx = dst_x; + int dy = dst_y; + int sx = src_x; + int sy = src_y; + int i = 0; + int j = 0; + + for(;i < dst_height; i++) { + sy = ((i * y_ratio) >> 16) + src_y; + dy = i + dst_y; + if(sy < 0 || dy < 0) continue; + if(sy >= src_pixmap->height || dy >= dst_pixmap->height) break; + + for(j = 0 ;j < dst_width; j++) { + sx = ((j * x_ratio) >> 16) + src_x; + dx = j + dst_x; + if(sx < 0 || dx < 0) continue; + if(sx >= src_pixmap->width || dx >= dst_pixmap->width) break; + + const void* src_ptr = src_pixmap->pixels + sx * sbpp + sy * spitch; + const void* dst_ptr = dst_pixmap->pixels + dx * dbpp + dy * dpitch; + uint32_t src_col = to_RGBA8888(src_pixmap->format, pget((void*)src_ptr)); + + if(dst_pixmap->blend) { + uint32_t dst_col = to_RGBA8888(dst_pixmap->format, dpget((void*)dst_ptr)); + src_col = to_format(dst_pixmap->format, blend(src_col, dst_col)); + } else { + src_col = to_format(dst_pixmap->format, src_col); + } + + pset((void*)dst_ptr, src_col); + } + } } static inline void blit(const gdx2d_pixmap* src_pixmap, const gdx2d_pixmap* dst_pixmap, - int32_t src_x, int32_t src_y, uint32_t src_width, uint32_t src_height, - int32_t dst_x, int32_t dst_y, uint32_t dst_width, uint32_t dst_height) { - if(dst_pixmap->scale == GDX2D_SCALE_NEAREST) - blit_linear(src_pixmap, dst_pixmap, src_x, src_y, src_width, src_height, dst_x, dst_y, dst_width, dst_height); - if(dst_pixmap->scale == GDX2D_SCALE_BILINEAR) - blit_bilinear(src_pixmap, dst_pixmap, src_x, src_y, src_width, src_height, dst_x, dst_y, dst_width, dst_height); + int32_t src_x, int32_t src_y, uint32_t src_width, uint32_t src_height, + int32_t dst_x, int32_t dst_y, uint32_t dst_width, uint32_t dst_height) { + if(dst_pixmap->scale == GDX2D_SCALE_NEAREST) + blit_linear(src_pixmap, dst_pixmap, src_x, src_y, src_width, src_height, dst_x, dst_y, dst_width, dst_height); + if(dst_pixmap->scale == GDX2D_SCALE_BILINEAR) + blit_bilinear(src_pixmap, dst_pixmap, src_x, src_y, src_width, src_height, dst_x, dst_y, dst_width, dst_height); } void gdx2d_draw_pixmap(const gdx2d_pixmap* src_pixmap, const gdx2d_pixmap* dst_pixmap, - int32_t src_x, int32_t src_y, uint32_t src_width, uint32_t src_height, - int32_t dst_x, int32_t dst_y, uint32_t dst_width, uint32_t dst_height) { - if(src_width == dst_width && src_height == dst_height) { - blit_same_size(src_pixmap, dst_pixmap, src_x, src_y, dst_x, dst_y, src_width, src_height); - } else { - blit(src_pixmap, dst_pixmap, src_x, src_y, src_width, src_height, dst_x, dst_y, dst_width, dst_height); - } + int32_t src_x, int32_t src_y, uint32_t src_width, uint32_t src_height, + int32_t dst_x, int32_t dst_y, uint32_t dst_width, uint32_t dst_height) { + if(src_width == dst_width && src_height == dst_height) { + blit_same_size(src_pixmap, dst_pixmap, src_x, src_y, dst_x, dst_y, src_width, src_height); + } else { + blit(src_pixmap, dst_pixmap, src_x, src_y, src_width, src_height, dst_x, dst_y, dst_width, dst_height); + } } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java index 7d278430..859e1046 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java @@ -110,7 +110,6 @@ else if(agentInfo.isLinux()) hostPageBaseURL = hostPageBaseURL.substring(0, indexQM); } - TeaTool.setGLArrayBuffer(config.useGLArrayBuffer); graphics = new TeaGraphics(config); preloader = new Preloader(hostPageBaseURL, graphics.canvas, this); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java index 8fe84fbe..8daf185b 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java @@ -12,13 +12,6 @@ public class TeaApplicationConfiguration { @Deprecated public boolean useGL30 = false; - /** - * Speed up rendering when copying java Buffers to javascript ArrayBuffer. - * This option will be removed when it's stable and tested. - */ - @Deprecated - public boolean useGLArrayBuffer = true; - /** Sets the {@link TeaWindowListener} which will be informed about teavm events. */ public TeaWindowListener windowListener; diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java index 981006c6..cb0b8f5a 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java @@ -1,7 +1,7 @@ package com.github.xpenatan.gdx.backends.teavm; import com.badlogic.gdx.graphics.GL20; -import com.badlogic.gdx.graphics.PixmapEmu; +import com.badlogic.gdx.graphics.g2d.Gdx2DPixmapEmu; import com.badlogic.gdx.utils.GdxRuntimeException; import com.badlogic.gdx.utils.IntMap; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; @@ -22,15 +22,12 @@ import com.github.xpenatan.gdx.backends.teavm.gl.WebGLTextureWrapper; import com.github.xpenatan.gdx.backends.teavm.gl.WebGLUniformLocationWrapper; import com.github.xpenatan.gdx.backends.teavm.utils.TeaNativeHelper; -import org.teavm.classlib.java.nio.ArrayBufferUtil; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.nio.ShortBuffer; import java.util.Iterator; -import org.teavm.jso.JSBody; -import org.teavm.jso.JSObject; import org.teavm.jso.typedarrays.Float32Array; import org.teavm.jso.typedarrays.Int16Array; import org.teavm.jso.typedarrays.Int32Array; @@ -146,58 +143,22 @@ protected int getKey(WebGLTextureWrapper value) { } public Float32ArrayWrapper copy(FloatBuffer buffer) { - if(TeaTool.useGLArrayBuffer()) { - Int8ArrayWrapper int8Array = ArrayBufferUtil.getInt8Array(buffer); - return TypedArrays.createFloat32Array(int8Array.getBuffer(), buffer.position(), buffer.remaining()); - } - else { - ensureCapacity(buffer); - for(int i = buffer.position(), j = 0; i < buffer.limit(); i++, j++) { - floatBuffer.set(j, buffer.get(i)); - } - return floatBuffer.subarray(0, buffer.remaining()); - } + ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray(buffer); + return TypedArrays.createFloat32Array(typedArray.getBuffer(), buffer.position(), buffer.remaining()); } public Int16ArrayWrapper copy(ShortBuffer buffer) { - if(TeaTool.useGLArrayBuffer()) { - Int8ArrayWrapper int8Array = ArrayBufferUtil.getInt8Array(buffer); - return TypedArrays.createInt16Array(int8Array.getBuffer(), buffer.position(), buffer.remaining()); - } - else { - ensureCapacity(buffer); - for(int i = buffer.position(), j = 0; i < buffer.limit(); i++, j++) { - shortBuffer.set(j, (buffer.get(i))); - } - return shortBuffer.subarray(0, buffer.remaining()); - } + ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray(buffer); + return TypedArrays.createInt16Array(typedArray.getBuffer(), buffer.position(), buffer.remaining()); } public Int32ArrayWrapper copy(IntBuffer buffer) { - if(TeaTool.useGLArrayBuffer()) { - Int8ArrayWrapper int8Array = ArrayBufferUtil.getInt8Array(buffer); - return TypedArrays.createInt32Array(int8Array.getBuffer(), buffer.position(), buffer.remaining()); - } - else { - ensureCapacity(buffer); - for(int i = buffer.position(), j = 0; i < buffer.limit(); i++, j++) { - intBuffer.set(j, buffer.get(i)); - } - return intBuffer.subarray(0, buffer.remaining()); - } + ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray(buffer); + return TypedArrays.createInt32Array(typedArray.getBuffer(), buffer.position(), buffer.remaining()); } public Int8ArrayWrapper copy(ByteBuffer buffer) { - if(TeaTool.useGLArrayBuffer()) { - return ArrayBufferUtil.getInt8Array(buffer); - } - else { - ensureCapacity(buffer); - for(int i = buffer.position(), j = 0; i < buffer.limit(); i++, j++) { - byteBuffer.set(j, buffer.get(i)); - } - return byteBuffer.subarray(0, buffer.remaining()); - } + return (Int8ArrayWrapper)TypedArrays.getTypedArray(buffer); } private void ensureCapacity(FloatBuffer buffer) { @@ -1023,41 +984,53 @@ private void ensureCapacityU(ByteBuffer buffer) { byteBufferU = (Uint8ArrayWrapper)Uint8Array.create(buffer.remaining()); } } + int pass = 0; @Override public void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, Buffer pixels) { if(pixels == null) { gl.texImage2D(target, level, internalformat, width, height, border, format, type, null); + return; + } + + ArrayBufferViewWrapper buffer; + if(pixels instanceof ByteBuffer) { + ArrayBufferViewWrapper typedArrayBuffer = TypedArrays.getTypedArray((ByteBuffer)pixels); + int remainingBytes = pixels.remaining(); + int byteOffset = typedArrayBuffer.getByteOffset() + pixels.position(); + buffer = TypedArrays.createUint8Array(typedArrayBuffer.getBuffer(), byteOffset, remainingBytes); + } + else if(pixels instanceof FloatBuffer) { + ArrayBufferViewWrapper typedArrayBuffer = TypedArrays.getTypedArray((FloatBuffer)pixels); + int remainingBytes = pixels.remaining(); + int byteOffset = typedArrayBuffer.getByteOffset() + pixels.position(); + buffer = TypedArrays.createFloat32Array(typedArrayBuffer.getBuffer(), byteOffset, remainingBytes); } else { - //TODO not fully tested. Some conversion may be wrong. - ArrayBufferViewWrapper buffer; - if(TeaTool.useGLArrayBuffer()) { - Int8ArrayWrapper webGLArray = ArrayBufferUtil.getInt8Array(pixels); - if(pixels instanceof FloatBuffer) { - int remainingBytes = pixels.remaining(); - int byteOffset = webGLArray.getByteOffset() + pixels.position(); - buffer = TypedArrays.createFloat32Array(webGLArray.getBuffer(), byteOffset, remainingBytes); - } - else { - int remainingBytes = pixels.remaining(); - int byteOffset = webGLArray.getByteOffset() + pixels.position(); - buffer = TypedArrays.createUint8Array(webGLArray.getBuffer(), byteOffset, remainingBytes); - } - } - else { - if(pixels instanceof FloatBuffer) { - Float32ArrayWrapper arr = copy((FloatBuffer)pixels); - ArrayBufferViewWrapper webGLArray = arr; - buffer = webGLArray; - } - else { - Int8ArrayWrapper copy = copy((ByteBuffer)pixels); - buffer = ArrayBufferUtil.fromUI8(copy); - } - } - gl.texImage2D(target, level, internalformat, width, height, border, format, type, buffer); + throw new GdxRuntimeException("Not supported buffer"); + } + gl.texImage2D(target, level, internalformat, width, height, border, format, type, buffer); + } + + @Override + public void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, Buffer pixels) { + ArrayBufferViewWrapper buffer; + if(pixels instanceof ByteBuffer) { + ArrayBufferViewWrapper typedArrayBuffer = TypedArrays.getTypedArray((ByteBuffer)pixels); + int remainingBytes = pixels.remaining(); + int byteOffset = typedArrayBuffer.getByteOffset() + pixels.position(); + buffer = TypedArrays.createUint8Array(typedArrayBuffer.getBuffer(), byteOffset, remainingBytes); + } + else if(pixels instanceof FloatBuffer) { + ArrayBufferViewWrapper typedArrayBuffer = TypedArrays.getTypedArray((FloatBuffer)pixels); + int remainingBytes = pixels.remaining(); + int byteOffset = typedArrayBuffer.getByteOffset() + pixels.position(); + buffer = TypedArrays.createFloat32Array(typedArrayBuffer.getBuffer(), byteOffset, remainingBytes); + } + else { + throw new GdxRuntimeException("Not supported buffer"); } + gl.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, buffer); } @Override @@ -1080,37 +1053,6 @@ public void glTexParameteriv(int target, int pname, IntBuffer params) { gl.texParameterf(target, pname, params.get()); } - @Override - public void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, Buffer pixels) { - //TODO not fully tested. Some conversion may be wrong. - ArrayBufferViewWrapper buffer; - if(TeaTool.useGLArrayBuffer()) { - ArrayBufferViewWrapper webGLArray = ArrayBufferUtil.getInt8Array(pixels); - if(pixels instanceof FloatBuffer) { - int remainingBytes = pixels.remaining(); - int byteOffset = webGLArray.getByteOffset() + pixels.position(); - buffer = TypedArrays.createFloat32Array(webGLArray.getBuffer(), byteOffset, remainingBytes); - } - else { - int remainingBytes = pixels.remaining(); - int byteOffset = webGLArray.getByteOffset() + pixels.position(); - buffer = TypedArrays.createUint8Array(webGLArray.getBuffer(), byteOffset, remainingBytes); - } - } - else { - if(pixels instanceof FloatBuffer) { - Float32ArrayWrapper arr = copy((FloatBuffer)pixels); - ArrayBufferViewWrapper webGLArray = arr; - buffer = webGLArray; - } - else { - Int8ArrayWrapper copy = copy((ByteBuffer)pixels); - buffer = ArrayBufferUtil.fromUI8(copy); - } - } - gl.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, buffer); - } - @Override public void glUniform1f(int location, float x) { WebGLUniformLocationWrapper loc = getUniformLocation(location); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL30.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL30.java index c79f2688..7e24e8c6 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL30.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL30.java @@ -2,12 +2,9 @@ import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.GL30; -import com.badlogic.gdx.graphics.PixmapEmu; import com.badlogic.gdx.utils.GdxRuntimeException; import com.badlogic.gdx.utils.IntMap; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Float32ArrayWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Uint32ArrayWrapper; import com.github.xpenatan.gdx.backends.teavm.gen.Emulate; @@ -20,7 +17,6 @@ import com.github.xpenatan.gdx.backends.teavm.gl.WebGLUniformLocationWrapper; import com.github.xpenatan.gdx.backends.teavm.gl.WebGLVertexArrayObjectWrapper; import com.github.xpenatan.gdx.backends.teavm.utils.TeaNativeHelper; -import org.teavm.classlib.java.nio.ArrayBufferUtil; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.FloatBuffer; @@ -79,17 +75,8 @@ protected int getKey(WebGLQueryWrapper value) { } private Uint32ArrayWrapper copyUnsigned(IntBuffer buffer) { - if(TeaTool.useGLArrayBuffer()) { - Int8ArrayWrapper int8Array = ArrayBufferUtil.getInt8Array(buffer); - return TypedArrays.createUint32Array(int8Array.getBuffer(), buffer.position(), buffer.remaining()); - } - else { - ensureCapacity(buffer); - for(int i = buffer.position(), j = 0; i < buffer.limit(); i++, j++) { - uIntBuffer.set(j, buffer.get(i)); - } - return uIntBuffer.subarray(0, buffer.remaining()); - } + ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray(buffer); + return TypedArrays.createUint32Array(typedArray.getBuffer(), buffer.position(), buffer.remaining()); } private int allocateQueryId(WebGLQueryWrapper query) { @@ -771,41 +758,51 @@ public void glSamplerParameteriv(int sampler, int pname, IntBuffer param) { @Override public void glTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, Buffer pixels) { - // Taken from glTexImage2D if(pixels == null) { gl.texImage3D(target, level, internalformat, width, height, depth, border, format, type, (ArrayBufferViewWrapper)null); return; } - //TODO not fully tested. Some conversion may be wrong. ArrayBufferViewWrapper buffer; - if(TeaTool.useGLArrayBuffer()) { - ArrayBufferViewWrapper webGLArray = ArrayBufferUtil.getInt8Array(pixels); - if(pixels instanceof FloatBuffer) { - int remainingBytes = pixels.remaining(); - int byteOffset = webGLArray.getByteOffset() + pixels.position(); - buffer = TypedArrays.createFloat32Array(webGLArray.getBuffer(), byteOffset, remainingBytes); - } - else { - int remainingBytes = pixels.remaining(); - int byteOffset = webGLArray.getByteOffset() + pixels.position(); - buffer = TypedArrays.createUint8Array(webGLArray.getBuffer(), byteOffset, remainingBytes); - } + if(pixels instanceof ByteBuffer) { + ArrayBufferViewWrapper typedArrayBuffer = TypedArrays.getTypedArray((ByteBuffer)pixels); + int remainingBytes = pixels.remaining(); + int byteOffset = typedArrayBuffer.getByteOffset() + pixels.position(); + buffer = TypedArrays.createUint8Array(typedArrayBuffer.getBuffer(), byteOffset, remainingBytes); + } + else if(pixels instanceof FloatBuffer) { + ArrayBufferViewWrapper typedArrayBuffer = TypedArrays.getTypedArray((FloatBuffer)pixels); + int remainingBytes = pixels.remaining(); + int byteOffset = typedArrayBuffer.getByteOffset() + pixels.position(); + buffer = TypedArrays.createFloat32Array(typedArrayBuffer.getBuffer(), byteOffset, remainingBytes); } else { - if(pixels instanceof FloatBuffer) { - Float32ArrayWrapper arr = copy((FloatBuffer)pixels); - ArrayBufferViewWrapper webGLArray = arr; - buffer = webGLArray; - } - else { - Int8ArrayWrapper copy = copy((ByteBuffer)pixels); - buffer = ArrayBufferUtil.fromUI8(copy); - } + throw new GdxRuntimeException("Not supported buffer"); } gl.texImage3D(target, level, internalformat, width, height, depth, border, format, type, buffer); } + @Override + public void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, Buffer pixels) { + ArrayBufferViewWrapper buffer; + if(pixels instanceof ByteBuffer) { + ArrayBufferViewWrapper typedArrayBuffer = TypedArrays.getTypedArray((ByteBuffer)pixels); + int remainingBytes = pixels.remaining(); + int byteOffset = typedArrayBuffer.getByteOffset() + pixels.position(); + buffer = TypedArrays.createUint8Array(typedArrayBuffer.getBuffer(), byteOffset, remainingBytes); + } + else if(pixels instanceof FloatBuffer) { + ArrayBufferViewWrapper typedArrayBuffer = TypedArrays.getTypedArray((FloatBuffer)pixels); + int remainingBytes = pixels.remaining(); + int byteOffset = typedArrayBuffer.getByteOffset() + pixels.position(); + buffer = TypedArrays.createFloat32Array(typedArrayBuffer.getBuffer(), byteOffset, remainingBytes); + } + else { + throw new GdxRuntimeException("Not supported buffer"); + } + gl.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, buffer); + } + @Override public void glTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, int offset) { @@ -818,38 +815,6 @@ public void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int gl.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, offset); } - @Override - public void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, Buffer pixels) { - // Taken from glTexSubImage2D - //TODO not fully tested. Some conversion may be wrong. - ArrayBufferViewWrapper buffer; - if(TeaTool.useGLArrayBuffer()) { - ArrayBufferViewWrapper webGLArray = ArrayBufferUtil.getInt8Array(pixels); - if (pixels instanceof FloatBuffer) { - int remainingBytes = pixels.remaining(); - int byteOffset = webGLArray.getByteOffset() + pixels.position(); - buffer = TypedArrays.createFloat32Array(webGLArray.getBuffer(), byteOffset, remainingBytes); - } else { - int remainingBytes = pixels.remaining(); - int byteOffset = webGLArray.getByteOffset() + pixels.position(); - buffer = TypedArrays.createUint8Array(webGLArray.getBuffer(), byteOffset, remainingBytes); - } - } - else { - if(pixels instanceof FloatBuffer) { - Float32ArrayWrapper arr = copy((FloatBuffer)pixels); - ArrayBufferViewWrapper webGLArray = arr; - buffer = webGLArray; - } - else { - Int8ArrayWrapper copy = copy((ByteBuffer)pixels); - buffer = ArrayBufferUtil.fromUI8(copy); -// buffer = copyUI8((ByteBuffer)pixels); - } - } - gl.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, buffer); - } - @Override public void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, int offset) { gl.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, offset); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaTool.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaTool.java index 9d0f5dde..3e3f23b4 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaTool.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaTool.java @@ -5,7 +5,6 @@ */ public class TeaTool { private static boolean isProd = true; - private static boolean useGLArrayBuffer; public static boolean isProdMode() { return isProd; } @@ -13,12 +12,4 @@ public static boolean isProdMode() { public static void setIsProd(boolean flag) { isProd = flag; } - - public static boolean useGLArrayBuffer() { - return useGLArrayBuffer; - } - - public static void setGLArrayBuffer(boolean flag) { - useGLArrayBuffer = flag; - } } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/typedarray/TypedArrays.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/typedarray/TypedArrays.java index 763aeaf9..1611c58b 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/typedarray/TypedArrays.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/typedarray/TypedArrays.java @@ -1,7 +1,14 @@ package com.github.xpenatan.gdx.backends.teavm.dom.typedarray; +import java.nio.Buffer; import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.ShortBuffer; +import org.teavm.classlib.java.nio.HasArrayBufferView; import org.teavm.jso.JSBody; +import org.teavm.jso.JSByRef; +import org.teavm.jso.JSObject; import org.teavm.jso.typedarrays.ArrayBuffer; import org.teavm.jso.typedarrays.Float32Array; import org.teavm.jso.typedarrays.Int16Array; @@ -157,11 +164,73 @@ public static byte[] toByteArray(ArrayBufferViewWrapper array) { } public static ArrayBufferViewWrapper getTypedArray(ByteBuffer buffer) { + ArrayBufferViewWrapper bufferView = getInt8Array(buffer); + if(bufferView != null) { +// return (ArrayBufferViewWrapper)Int8Array.create((ArrayBuffer)bufferView.getBuffer()); + return bufferView; + } byte[] array = buffer.array(); - return getTypedArray(array); + ArrayBufferViewWrapper arrayBuffer = getTypedArray(array); + return arrayBuffer; + } + + public static ArrayBufferViewWrapper getTypedArray(ShortBuffer buffer) { + ArrayBufferViewWrapper bufferView = getInt8Array(buffer); + if(bufferView != null) { +// return (ArrayBufferViewWrapper)Int16Array.create((ArrayBuffer)bufferView.getBuffer()); + return bufferView; + } + short[] array = buffer.array(); + ArrayBufferViewWrapper arrayBuffer = getTypedArray(array); + return arrayBuffer; + } + + public static ArrayBufferViewWrapper getTypedArray(IntBuffer buffer) { + ArrayBufferViewWrapper bufferView = getInt8Array(buffer); + if(bufferView != null) { +// return (ArrayBufferViewWrapper)Int32Array.create((ArrayBuffer)bufferView.getBuffer()); + return bufferView; + } + int[] array = buffer.array(); + ArrayBufferViewWrapper arrayBuffer = getTypedArray(array); + return arrayBuffer; + } + + public static ArrayBufferViewWrapper getTypedArray(FloatBuffer buffer) { + ArrayBufferViewWrapper bufferView = getInt8Array(buffer); + if(bufferView != null) { +// return (ArrayBufferViewWrapper)Float32Array.create((ArrayBuffer)bufferView.getBuffer()); + return bufferView; + } + float[] array = buffer.array(); + ArrayBufferViewWrapper arrayBuffer = getTypedArray(array); + return arrayBuffer; } @JSBody(params = {"buffer"}, script = "" + "return buffer;") - private static native ArrayBufferViewWrapper getTypedArray(byte[] buffer); + private static native ArrayBufferViewWrapper getTypedArray(@JSByRef() byte[] buffer); + + @JSBody(params = {"buffer"}, script = "" + + "return buffer;") + private static native ArrayBufferViewWrapper getTypedArray(@JSByRef() int[] buffer); + + @JSBody(params = {"buffer"}, script = "" + + "return buffer;") + private static native ArrayBufferViewWrapper getTypedArray(@JSByRef() float[] buffer); + + @JSBody(params = {"buffer"}, script = "" + + "return buffer;") + private static native ArrayBufferViewWrapper getTypedArray(@JSByRef() short[] buffer); + + @org.teavm.jso.JSBody(params = {"array"}, script = "" + + "return array.data;") + public static native Int8ArrayWrapper getArrayBufferView(JSObject array); + + public static Int8ArrayWrapper getInt8Array(Buffer buffer) { + if(buffer instanceof HasArrayBufferView) { + return ((HasArrayBufferView)buffer).getTypedArray(); + } + return null; + } } diff --git a/backends/backend-teavm/src/main/resources/gdx.wasm.js b/backends/backend-teavm/src/main/resources/gdx.wasm.js index eabc84f2..ea31cfcf 100644 --- a/backends/backend-teavm/src/main/resources/gdx.wasm.js +++ b/backends/backend-teavm/src/main/resources/gdx.wasm.js @@ -9,7 +9,7 @@ var d=moduleArg,h,k;d.ready=new Promise((a,b)=>{h=a;k=b});var m=Object.assign({} if(q){var fs=require("fs"),x=require("path");t=p?x.dirname(t)+"/":__dirname+"/";u=(a,b)=>{a=a.startsWith("file://")?new URL(a):x.normalize(a);return fs.readFileSync(a,b?void 0:"utf8")};w=a=>{a=u(a,!0);a.buffer||(a=new Uint8Array(a));return a};process.argv.slice(2);d.inspect=()=>"[Emscripten Module object]"}else if(aa||p)p?t=self.location.href:"undefined"!=typeof document&&document.currentScript&&(t=document.currentScript.src),_scriptDir&&(t=_scriptDir),0!==t.indexOf("blob:")?t=t.substr(0,t.replace(/[?#].*/, "").lastIndexOf("/")+1):t="",u=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.send(null);return b.responseText},p&&(w=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)});d.print||console.log.bind(console);var y=d.printErr||console.error.bind(console);Object.assign(d,m);m=null;var z;d.wasmBinary&&(z=d.wasmBinary);var noExitRuntime=d.noExitRuntime||!0;"object"!=typeof WebAssembly&&A("no native wasm support detected"); var B,C=!1,D,E;function F(){var a=B.buffer;d.HEAP8=D=new Int8Array(a);d.HEAP16=new Int16Array(a);d.HEAPU8=E=new Uint8Array(a);d.HEAPU16=new Uint16Array(a);d.HEAP32=new Int32Array(a);d.HEAPU32=new Uint32Array(a);d.HEAPF32=new Float32Array(a);d.HEAPF64=new Float64Array(a)}var G=[],H=[],I=[];function ba(){var a=d.preRun.shift();G.unshift(a)}var J=0,K=null,M=null; -function A(a){if(d.onAbort)d.onAbort(a);a="Aborted("+a+")";y(a);C=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");k(a);throw a;}function N(a){return a.startsWith("data:application/octet-stream;base64,")}var O;O="data:application/octet-stream;base64,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IARBA3EhHyAGQRBHISAgBEEESSElIAQhGANAIAkgCUH/AXFBjBRqLQAAIBMbIQkgAUEBaiEKIAAoAgwgF2ogIWoiDSAjaiEMQQAhAkEBIAsgGxsiC0EATCIPRQRAA0ACQCACIA1qAn8CQAJAAkACQAJAAkACQCAJQf8BcQ4HAAECAwQFBggLIAIgCmotAAAMBgsgAiAKai0AAAwFCyACIAxqLQAAIAIgCmotAABqDAQLIAIgCmotAAAgAiAMai0AAEEBdmoMAwsgAiAMai0AACACIApqLQAAagwCCyACIApqLQAADAELIAIgCmotAAALOgAACyACQQFqIgIgC0cNAAsLAn8gBkEIRgRAIBxFBEAgDSASakH/AToAAAsgAyECIAogEmoMAQsgIEUEQCAcRQRAIAsgDWpB//8DOwAACyAOIQIgCiALagwBC0EBIQIgAUECagshASAaIBggGxshGCACIAxqIQwgAiANaiECAkACQAJAAkAgIgRAIBhBAWsgC2whCgJAAkACQAJAAkACQAJAIAlB/wFxDgcIBAMCBQEABgsgCkEATA0FQQAhCCAKQQFHBEAgCkF+cSEPQQAhCQNAIAIgCGogAiAIIAtrai0AACABIAhqLQAAajoAACACIAhBAXIiDGogAiAMIAtrai0AACABIAxqLQAAajoAACAIQQJqIQggCUECaiIJIA9HDQALCyAKQQFxRQ0FIAIgCGogAiAIIAtrai0AACABIAhqLQAAajoAACABIApqIQEMCAsgCkEATA0EQQAhCCAKQQFHBEAgCkF+cSEPQQAhCQNAIAIgCGogASAIai0AACACIAggC2tqLQAAQQF2ajoAACACIAhBAXIiDGogASAMai0AACACIAwgC2tqLQAAQQF2ajoAACAIQQJqIQggCUECaiIJIA9HDQALCyAKQQFxRQ0EIAIgCGogASAIai0AACACIAggC2tqLQAAQQF2ajoAACABIApqIQEMBwsgCkEATA0DQQAhCCAKQQFHBEAgCkF+cSENQQAhCQNAIAIgCGogASAIai0AACACIAggC2tqLQAAIAggDGotAABqQQF2ajoAACACIAhBAXIiD2ogASAPai0AACACIA8gC2tqLQAAIAwgD2otAABqQQF2ajoAACAIQQJqIQggCUECaiIJIA1HDQALCyAKQQFxRQ0DIAIgCGogASAIai0AACACIAggC2tqLQAAIAggDGotAABqQQF2ajoAACABIApqIQEMBgsgCkEATA0CQQAhCCAKQQFHBEAgCkF+cSENQQAhCQNAIAIgCGogCCAMai0AACABIAhqLQAAajoAACACIAhBAXIiD2ogDCAPai0AACABIA9qLQAAajoAACAIQQJqIQggCUECaiIJIA1HDQALCyAKQQFxRQ0CIAIgCGogCCAMai0AACABIAhqLQAAajoAACABIApqIQEMBQsgCkEATA0BQQAhCCAKQQFHBEAgCkF+cSEPQQAhCQNAIAIgCGogAiAIIAtrai0AACABIAhqLQAAajoAACACIAhBAXIiDGogAiAMIAtrai0AACABIAxqLQAAajoAACAIQQJqIQggCUECaiIJIA9HDQALCyAKQQFxRQ0BIAIgCGogAiAIIAtrai0AACABIAhqLQAAajoAACABIApqIQEMBAtBACEIIApBAEwNAANAIAIgCGogASAIai0AACAMIAggC2siDWotAAAiCSAIIAxqLQAAIg8gDyACIA1qLQAAIg1qIAlrIhcgD2siDyAPQR91Ig9zIA9rIg8gFyAJayIJIAlBH3UiCXMgCWsiCUsbIhEgESANIAkgFyANayIJIAlBH3UiCXMgCWsiCUkbIAkgD0sbajoAACAIQQFqIgggCkcNAAsLIAEgCmohAQwCCwJAAkACQAJAAkACQAJAAkAgCUH/AXEOBwUEAwIGAQAHCyAQRQ0GIAtBfnEhDSALQQFxIREgECEKA0ACQCAPDQBBACEIQQAhCSALQQFHBEADQCACIAhqIAIgCCAOa2otAAAgASAIai0AAGo6AAAgAiAIQQFyIgxqIAIgDCAOa2otAAAgASAMai0AAGo6AAAgCEECaiEIIAlBAmoiCSANRw0ACwsgEUUNACACIAhqIAIgCCAOa2otAAAgASAIai0AAGo6AAALIAIgC2pB/wE6AAAgAiAOaiECIAEgC2ohASAKQQFrIgoNAAsMBgsgEEUNBSALQX5xIQ0gC0EBcSERIBAhCgNAAkAgDw0AQQAhCEEAIQkgC0EBRwRAA0AgAiAIaiABIAhqLQAAIAIgCCAOa2otAABBAXZqOgAAIAIgCEEBciIMaiABIAxqLQAAIAIgDCAOa2otAABBAXZqOgAAIAhBAmohCCAJQQJqIgkgDUcNAAsLIBFFDQAgAiAIaiABIAhqLQAAIAIgCCAOa2otAABBAXZqOgAACyACIAtqQf8BOgAAIAIgDmohAiABIAtqIQEgCkEBayIKDQALDAULIBBFDQQgC0F+cSERIAtBAXEhFCAQIQoDQAJAIA8NAEEAIQhBACEJIAtBAUcEQANAIAIgCGogASAIai0AACACIAggDmtqLQAAIAggDGotAABqQQF2ajoAACACIAhBAXIiDWogASANai0AACACIA0gDmtqLQAAIAwgDWotAABqQQF2ajoAACAIQQJqIQggCUECaiIJIBFHDQALCyAURQ0AIAIgCGogASAIai0AACACIAggDmtqLQAAIAggDGotAABqQQF2ajoAAAsgAiALakH/AToAACAMIA5qIQwgAiAOaiECIAEgC2ohASAKQQFrIgoNAAsMBAsgEEUNAyALQX5xIREgC0EBcSEUIBAhCgNAAkAgDw0AQQAhCEEAIQkgC0EBRwRAA0AgAiAIaiAIIAxqLQAAIAEgCGotAABqOgAAIAIgCEEBciINaiAMIA1qLQAAIAEgDWotAABqOgAAIAhBAmohCCAJQQJqIgkgEUcNAAsLIBRFDQAgAiAIaiAIIAxqLQAAIAEgCGotAABqOgAACyACIAtqQf8BOgAAIAwgDmohDCACIA5qIQIgASALaiEBIApBAWsiCg0ACwwDCyAQRQ0CIAtBfnEhDSALQQFxIREgECEKA0ACQCAPDQBBACEIQQAhCSALQQFHBEADQCACIAhqIAIgCCAOa2otAAAgASAIai0AAGo6AAAgAiAIQQFyIgxqIAIgDCAOa2otAAAgASAMai0AAGo6AAAgCEECaiEIIAlBAmoiCSANRw0ACwsgEUUNACACIAhqIAIgCCAOa2otAAAgASAIai0AAGo6AAALIAIgC2pB/wE6AAAgAiAOaiECIAEgC2ohASAKQQFrIgoNAAsMAgsgEEUNASALQXxxIREgC0EDcSENIAtBAWshFCAQIQoDQAJAIA8NAEEAIQxBACEIQQAhCSAUQQNPBEADQCACIAhqIAEgCGotAAA6AAAgAiAIQQFyIhVqIAEgFWotAAA6AAAgAiAIQQJyIhVqIAEgFWotAAA6AAAgAiAIQQNyIhVqIAEgFWotAAA6AAAgCEEEaiEIIAlBBGoiCSARRw0ACwsgDUUNAANAIAIgCGogASAIai0AADoAACAI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DQALC0EBDwtBgAghHQtB8M4AIB02AgBBAAuECQEEfyABKAIAQQBKBEADQCAAIAJqQYAKakEBOgAAIAJBAWoiAiABKAIASA0ACwsgASgCBEEASgRAA0AgACACakGACmpBAjoAACACQQFqIQIgA0EBaiIDIAEoAgRIDQALCyABKAIIQQBKBEBBACEDA0AgACACakGACmpBAzoAACACQQFqIQIgA0EBaiIDIAEoAghIDQALCyABKAIMQQBKBEBBACEDA0AgACACakGACmpBBDoAACACQQFqIQIgA0EBaiIDIAEoAgxIDQALCyABKAIQQQBKBEBBACEDA0AgACACakGACmpBBToAACACQQFqIQIgA0EBaiIDIAEoAhBIDQALCyABKAIUQQBKBEBBACEDA0AgACACakGACmpBBjoAACACQQFqIQIgA0EBaiIDIAEoAhRIDQALCyABKAIYQQBKBEBBACEDA0AgACACakGACmpBBzoAACACQQFqIQIgA0EBaiIDIAEoAhhIDQALCyABKAIcQQBKBEBBACEDA0AgACACakGACmpBCDoAACACQQFqIQIgA0EBaiIDIAEoAhxIDQALCyABKAIgQQBKBEBBACEDA0AgACACakGACmpBCToAACACQQFqIQIgA0EBaiIDIAEoAiBIDQALCyABKAIkQQBKBEBBACEDA0AgACACakGACmpBCjoAACACQQFqIQIgA0EBaiIDIAEoAiRIDQALCyABKAIoQQBKBEBBACEDA0AgACACakGACmpBCzoAACACQQFqIQIgA0EBaiIDIAEoAihIDQALCyABKAIsQQBKBEBBACEDA0AgACACakGACmpBDDoAACACQQFqIQIgA0EBaiIDIAEoAixIDQALCyABKAIwQQBKBEBBACEDA0AgACACakGACmpBDToAACACQQFqIQIgA0EBaiIDIAEoAjBIDQALCyABKAI0QQBKBEBBACEDA0AgACACakGACmpBDjoAACACQQFqIQIgA0EBaiIDIAEoAjRIDQALCyABKAI4QQBKBEBBACEDA0AgACACakGACmpBDzoAACACQQFqIQIgA0EBaiIDIAEoAjhIDQALCyABKAI8QQBKBEBBACEDA0AgACACakGACmpBEDoAACACQQFqIQIgA0EBaiIDIAEoAjxIDQALC0EAIQEgACACakGACmpBADoAAEEB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BQwCCyAFQQR2QQ9xIAVBCHZB8AFxIAVBEHZBgOADcSAFQQx2QYAecXJyciEFDAELQQAhBQsgBCAFIAgRAQAgBCALaiEEIAFBAWohAiABIA1HDQALCwsHACAALwEACyQBAX8jAEEQayICIAA2AgwgAiABNgIIIAIoAgwgAigCCDYCCAsYAQF/IwBBEGsiASAANgIMIAEoAgwoAggLJAEBfyMAQRBrIgIgADYCDCACIAE2AgggAigCDCACKAIINgIECxgBAX8jAEEQayIBIAA2AgwgASgCDCgCBAusAQEDfwJAIANBAEwNAEEAIQQgA0EBRwRAIANBfnEhBwNAIAAgBGogAiAEai0AACABIARqLQAAQQNsakECakECdjoAACAAIARBAXIiBmogAiAGai0AACABIAZqLQAAQQNsakECakECdjoAACAEQQJqIQQgBUECaiIFIAdHDQALCyADQQFxRQ0AIAAgBGogAiAEai0AACABIARqLQAAQQNsakECakECdjoAAAsgAAsEACABC+UBAQd/AkAgA0EATA0AIARBAEwNACAEQXxxIQogBEEDcSEJIARBBEkhCwNAIAQgCGwhBSABIAhqIQZBACECQQAhByALRQRAA0AgACACIAVqaiAGLQAAOgAAIAAgAkEBciAFamogBi0AADoAACAAIAJBAnIgBWpqIAYtAAA6AAAgACACQQNyIAVqaiAGLQAAOgAAIAJBBGohAiAHQQRqIgcgCkcNAAsLQQAhByAJBEADQCAAIAIgBWpqIAYtAAA6AAAgAkEBaiECIAdBAWoiByAJRw0ACwsgCEEBaiIIIANHDQALCyAAC+gBAQN/QQEhAiABLQAAIQQgA0EBRgRAIAAgBDoAACAAIAQ6AAEgAA8LIAAgBDoAACAAIAEtAAEgAS0AAEEDbGpBAmpBAnY6AAEgA0EBayEEQQIhBSADQQNOBEADQCAAIAJBAXRqIgUgASACaiIGLQAAQQNsQQJqIgcgBkEBay0AAGpBAnY6AAAgBSAHIAEgAkEBaiICai0AAGpBAnY6AAEgAiAERw0ACyAEQQF0IQULIAAgBWogASAEaiICLQAAIAEgA2pBAmstAABBA2xqQQJqQQJ2OgAAIAAgBUEBcmogAi0AADoAACAACyQBAX8jAEEQayICIAA2AgwgAiABNgIIIAIoAgwgAigCCDYCAAuUCAESfyMAQYACayIQJAAgECEEA0ACQAJAIAIuARAiAyACLwEgIgVyQf//A3ENAEEAIQUgAi8BMA0AIAIvAUANACACLwFQDQAgAi8BYA0AIAIvAXANACAEIAIuAQBBAnQiAzYCwAEgBCADNgLgASAEIAM2AqABIAQgAzYCgAEgBCADNgJgIAQgAzYCQCAEIAM2AiAgBCADNgIADAELIAQgAi4BYCIIIAXBIgVqQakRbCIMIAVBvxhsaiINIAIuAUAiCSACLgEAIg5qQQx0Ig9qQYAEaiIKIAIuAVAiBSADaiIGQcNzbCIRIANBhTBsaiAGIAIuATAiBiACLgFwIgtqIhJqQdAlbCITIAMgC2pBm2NsaiIDaiIUa0EKdTYC4AEgBCAKIBRqQQp1NgIAIAQgDCAIQfFEbGoiCCAOIAlrQQx0IgxqQYAEaiIJIBMgBSAGakH/rX9saiIOIBJBnkFsIgogBkGq4gBsamoiBmtBCnU2AsABIAQgBiAJakEKdTYCICAEIAwgCGtBgARqIgYgESAFQdrBAGxqIA5qIgVrQQp1NgKgASAEIAUgBmpBCnU2AkAgBCAPIA1rQYAEaiIFIAogC0HHCWxqIANqIgNrQQp1NgKAASAEIAMgBWpBCnU2AmALIARBBGohBCACQQJqIQIgB0EBaiIHQQhHDQALIBAhAkEAIQQDQCAAIAIoAhgiCyACKAIIIgNqQakRbCIIIANBvxhsaiIMIAIoAhAiDSACKAIAIglqQQx0Ig5qQYCAhAhqIg8gAigCBCIDIAIoAhQiB2oiCkHDc2wiESADQYUwbGogCiACKAIMIgUgAigCHCIGaiISakHQJWwiCiADIAZqQZtjbGoiE2oiFGsiA0EfdUF/cyADQRF2IANB////D0sbOgAHIAAgDyAUaiIDQR91QX9zIANBEXYgA0H///8PSxs6AAAgACAIIAtB8URsaiILIAkgDWtBDHQiCGpBgICECGoiDSAKIAUgB2pB/61/bGoiCSASQZ5BbCIPIAVBquIAbGpqIgVrIgNBH3VBf3MgA0ERdiADQf///w9LGzoABiAAIAUgDWoiA0EfdUF/cyADQRF2IANB////D0sbOgABIAAgCCALa0GAgIQIaiIFIBEgB0HawQBsaiAJaiIHayIDQR91QX9zIANBEXYgA0H///8PSxs6AAUgACAFIAdqIgNBH3VBf3MgA0ERdiADQf///w9LGzoAAiAAIA4gDGtBgICECGoiByAPIAZBxwlsaiATaiIFayIDQR91QX9zIANBEXYgA0H///8PSxs6AAQgACAFIAdqIgNBH3VBf3MgA0ERdiADQf///w9LGzoAAyAAIAFqIQAgAkEgaiECIARBAWoiBEEIRw0ACyAQQYACaiQAC+gBAQV/IARBAEoEQANAIAMgCGotAAAhCSACIAhqLQAAIQYgASAIai0AACEHIABB/wE6AAMgAEH/AUEAIAdBFHRBgIAgciIHIAZBgAFrIgpBgLTxAGxqIgZBAE4bIAZBFHYgBkH/////AEsbOgACIABB/wFBACAJQYABayIJQYDe2QBsIAdqIgZBAE4bIAZBFHYgBkH/////AEsbOgAAIABB/wFBACAJQYCmUmwgB2ogCkGA/GlsQYCAfHFqIgdBAE4bIAdBFHYgB0H/////AEsbOgABIAAgBWohACAIQQFqIgggBEcNAAsLC88BAQN/QQEhBiACLQAAIQQgAS0AACEFIANBAUYEQCAAIAQgBUEDbGpBAmpBAnYiAToAACAAIAE6AAEgAA8LIAAgBUEDbCAEaiIEQQJqQQJ2IgU6AAAgA0EBdCAAakEBayADQQJOBH8DQCAAIAZBAXRqIgdBAWsgAiAGai0AACABIAZqLQAAQQNsaiIFIARBA2xqQQhqQQR2OgAAIAcgBCAFQQNsakEIakEEdjoAACAFIQQgBkEBaiIGIANHDQALIAVBAmpBAnYFIAULOgAAIAALHQAgACABOgACIAAgAUEIdjoAASAAIAFBEHY6AAALCQAgACABOgAACygAIAAgAUEYdCABQYD+A3FBCHRyIAFBCHZBgP4DcSABQRh2cnI2AgALGAEBfyMAQRBrIgEgADYCDCABKAIMKAIACygAIAAoAAAiAEEYdCAAQYD+A3FBCHRyIABBCHZBgP4DcSAAQRh2cnILGQAgAC0AAiAALQABQQh0IAAtAABBEHRycgsQACAALQABIAAtAABBCHRyCwcAIAAtAAALWwEBfyMAQRBrIgIkACACIAA2AgwgAiABNgIIIwBBEGsiACQAIAAgAigCCDYCDCAAQRBqJAAgAkEQaiQAIAAoAgxBAWsiAEEFTQR/IABBAnRBiBxqKAIABUEECwurIAMbfwF8C30jAEEwayIMJAAgDCAANgIsIAwgATYCKCAMIAI2AiQgDCADNgIgIAwgBDYCHCAMIAU2AhggDCAGNgIUIAwgBzYCECAMIAg2AgwgDCAJNgIIIAwgCjYCBCAMKAIkIQAgDCgCICEBIAwoAhwhAiAMKAIYIQMgDCgCFCEEIAwoAhAhBSAMKAIMIQYgDCgCCCEIIAwoAgQhCSMAQTBrIgckACAHIAwoAig2AiwgByAANgIoIAcgATYCJCAHIAI2AiAgByADNgIcIAcgBDYCGCAHIAU2AhQgByAGNgIQIAcgCDYCDCAHIAk2AgggBygCLCEIIAcoAighBiAHKAIkIQMgBygCICEWIAcoAhghEiAHKAIUIQUgBygCECEYIAcoAgghBEEAIQoCQAJAIAcoAhwiGiAHKAIMIhFHDQAgBCASRw0AQQ8hDyAGKAIIIgBBAmsiAUEETQRAIAFBAnRB4BtqKAIAIQ8LQQghCkEIIQ0gCCgCCCIBQQJrIgJBBE0EQCACQQJ0QfQbaigCACENC0EEIQsgAEECayICQQRNBEAgAkECdEH0G2ooAgAhCgsgAUEBayIBQQVNBEAgAUECdEGIHGooAgAhCwtBBCEJIABBAWsiAEEFTQRAIABBAnRBiBxqKAIAIQkLIBIgFmoiDiAWTQ0BIAMgGmoiGiADTQ0BIAYoAgAgCWwhEyAIKAIAIAtsIRQDQAJAIBZBAEgNACAYQQBIDQAgFiAIKAIETw0DIBggBigCBE8NAyATIBhsIRkgFCAWbCEbIAMhAiAFIQADQAJAIAJBAEgNACAAQQBIDQAgAiAIKAIATw0CIAAgBigCAE8NAiAGKAIUIAAgCWxqIBlqIRAgCCgCCCAIKAIUIAIgC2xqIBtqIA0RAgAQCCEBIAYoAgghBAJAAkAgBigCDARAIAQgECAKEQIAEAghBCAGKAIIIRcgAUH/AXEiEQR/IARB/wFxIhIgESASbEH/AW5rIhIgBEEYdmwgAUEYdiARbGogESASaiIVbkEYdCASIARBEHZB/wFxbCABQRB2Qf8BcSARbGogFW5BEHRyIBIgBEEIdkH/AXFsIAFBCHZB/wFxIBFsaiAVbkEIdHIgFXIFIAQLIQECQAJAAkACQAJAIBdBAWsOBgQDAgcBAAYLIAFBBHZBD3EgAUEIdkHwAXEgAUEQdkGA4ANxIAFBDHZBgB5xcnJyIQEMBgsgAUELdkEfcSABQRB2QYDwA3EgAUENdkHgD3FyciEBDAULIAFBCHYhAQwECwJ/IAFBCHZB/wFxuERdbcX+snuyP6IgAUEQdkH/AXG4RKUsQxzr4uY/oiABQRh2s0PQs1k+lLugoCImRAAAAAAAAPBBYyAmRAAAAAAAAAAAZnEEQCAmqwwBC0EAC0EIdEGA/gNxIAFB/wFxciEBDAMLIAFB/wFxIQEMAgsCQAJAAkACQAJAIARBAWsOBgQDAgYBAAULIAFBBHZBD3EgAUEIdkHwAXEgAUEQdkGA4ANxIAFBDHZBgB5xcnJyIQEMBQsgAUELdkEfcSABQRB2QYDwA3EgAUENdkHgD3FyciEBDAQLIAFBCHYhAQwDCwJ/IAFBCHZB/wFxuERdbcX+snuyP6IgAUEQdkH/AXG4RKUsQxzr4uY/oiABQRh2s0PQs1k+lLugoCImRAAAAAAAAPBBYyAmRAAAAAAAAAAAZnEEQCAmqwwBC0EAC0EIdEGA/gNxIAFB/wFxciEBDAILIAFB/wFxIQEMAQtBACEBCyAQIAEgDxEBAAsgAEEBaiEAIAJBAWoiAiAaRw0ACwsgGEEBaiEYIBZBAWoiFiAORw0ACwwBCyAGKAIQIgAEfyAABUEPIQ8gBigCCCIAQQJrIgFBBE0EQCABQQJ0QeAbaigCACEPC0EIIRVBCCENIAgoAggiAUECayICQQRNBEAgAkECdEH0G2ooAgAhDQtBBCELIABBAmsiAkEETQRAIAJBAnRB9BtqKAIAIRULIAFBAWsiAUEFTQRAIAFBAnRBiBxqKAIAIQsLQQQhCSAAQQFrIgBBBU0EQCAAQQJ0QYgcaigCACEJCyAERQ0BIBFFDQEgBigCACAJbCEZIAgoAgAgC2whGyASQRB0IARuQQFqIRcgGkEQdCARbkEBaiEcA0ACQAJAIAogF2xBEHYgFmoiAEEASA0AIAogGGoiAUEASA0AIAAgCCgCBE8NASABIAYoAgRPDQEgASAZbCEdIAAgG2whHkEAIQIDQAJAIAIgHGxBEHYgA2oiAEEASA0AIAIgBWoiAUEASA0AIAAgCCgCAE8NAiABIAYoAgBPDQIgBigCFCABIAlsaiAdaiEUIAgoAgggCCgCFCAAIAtsaiAeaiANEQIAEAghACAGKAIIIQECQAJAIAYoAgwEQCABIBQgFRECABAIIQEgBigCCCEfIABB/wFxIhAEfyABQf8BcSIOIA4gEGxB/wFuayIOIAFBGHZsIABBGHYgEGxqIA4gEGoiE25BGHQgDiABQRB2Qf8BcWwgAEEQdkH/AXEgEGxqIBNuQRB0ciAOIAFBCHZB/wFxbCAAQQh2Qf8BcSAQbGogE25BCHRyIBNyBSABCyEAAkACQAJAAkACQCAfQQFrDgYEAwIHAQAGCyAAQQR2QQ9xIABBCHZB8AFxIABBEHZBgOADcSAAQQx2QYAecXJyciEADAYLIABBC3ZBH3EgAEEQdkGA8ANxIABBDXZB4A9xcnIhAAwFCyAAQQh2IQAMBAsCfyAAQQh2Qf8BcbhEXW3F/rJ7sj+iIABBEHZB/wFxuESlLEMc6+LmP6IgAEEYdrND0LNZPpS7oKAiJkQAAAAAAADwQWMgJkQAAAAAAAAAAGZxBEAgJqsMAQtBAAtBCHRBgP4DcSAAQf8BcXIhAAwDCyAAQf8BcSEADAILAkACQAJAAkACQCABQQFrDgYEAwIGAQAFCyAAQQR2QQ9xIABBCHZB8AFxIABBEHZBgOADcSAAQQx2QYAecXJyciEADAULIABBC3ZBH3EgAEEQdkGA8ANxIABBDXZB4A9xcnIhAAwECyAAQQh2IQAMAwsCfyAAQQh2Qf8BcbhEXW3F/rJ7sj+iIABBEHZB/wFxuESlLEMc6+LmP6IgAEEYdrND0LNZPpS7oKAiJkQAAAAAAADwQWMgJkQAAAAAAAAAAGZxBEAgJqsMAQtBAAtBCHRBgP4DcSAAQf8BcXIhAAwCCyAAQf8BcSEADAELQQAhAAsgFCAAIA8RAQALIAJBAWoiAiARRw0ACwsgCkEBaiIKIARHDQELCyAGKAIQC0EBRw0AQQ8hFSAGKAIIIgBBAmsiAUEETQRAIAFBAnRB4BtqKAIAIRULQQghGUEIIQkgCCgCCCIBQQJrIgJBBE0EQCACQQJ0QfQbaigCACEJC0EEIQ8gAEECayICQQRNBEAgAkECdEH0G2ooAgAhGQsgAUEBayIBQQVNBEAgAUECdEGIHGooAgAhDwtBBCEKIABBAWsiAEEFTQRAIABBAnRBiBxqKAIAIQoLIARFDQAgEUUNACAGKAIAIApsIRwgCCgCACAPbCEbIBKzQwAAgL+SIASzlSEuIBqzQwAAgL+SIBGzlSEvIAOyITAgFrIhMUEAIRADQAJAAn8gLiAQspQiJ4tDAAAAT10EQCAnqAwBC0GAgICAeAsgFmoiAEEASA0AIBAgGGoiAUEASA0AIAAgCCgCBE8NAiABIAYoAgRPDQJDAACAPyAnIDGSIACykyIskyEtIABBAWohHSAAIBtsIR4gASAcbCEfQQAhAgNAAkACfyAvIAKylCIni0MAAABPXQRAICeoDAELQYCAgIB4CyADaiIBQQBIDQAgAiAFaiIUQQBIDQAgASAIKAIATw0CIBQgBigCAE8NAiAGKAIUISQgCCgCCCAIKAIUIAEgD2xqIB5qIg4gCRECABAIIgAhCyABQQFqIBpPIhNFBEAgCCgCCCAOIA9qIAkRAgAQCCELCyAnIDCSIAGykyEnIAAiASENAkAgEiAdTQ0AIAgoAgggDiAbaiIOIAkRAgAQCCEBIBMNACAIKAIIIA4gD2ogCRECABAIIQ0LAn8gDUEIdkH/AXGzICwgJ5QiKpQgAUEIdkH/AXGzICxDAACAPyAnkyIplCIrlCAAQQh2Qf8BcbMgLSAplCIplCAtICeUIicgC0EIdkH/AXGzlJKSkiIoQwAAgE9dIChDAAAAAGBxBEAgKKkMAQtBAAshDgJ/IA1BEHZB/wFxsyAqlCABQRB2Qf8BcbMgK5QgAEEQdkH/AXGzICmUICcgC0EQdkH/AXGzlJKSkiIoQwAAgE9dIChDAAAAAGBxBEAgKKkMAQtBAAshEyAkISUgCiAUbCEjAn8gDUEYdrMgKpQgAUEYdrMgK5QgAEEYdrMgKZQgJyALQRh2s5SSkpIiKEMAAIBPXSAoQwAAAABgcQRAICipDAELQQALIRQgJSAjaiAfaiEXAn8gDUH/AXGzICqUIAFB/wFxsyArlCAAQf8BcbMgKZQgJyALQf8BcbOUkpKSIidDAACAT10gJ0MAAAAAYHEEQCAnqQwBC0EACyIgQf8BcSEBAkACQCAGKAIMBEAgBigCCCAXIBkRAgAQCCEAIAEEQCAAQf8BcSILIAEgC2xB/wFuayILIABBGHZsIBRB/wFxIAFsaiABIAtqIg1uQRh0IAsgAEEQdkH/AXFsIBNB/wFxIAFsaiANbkEQdHIgCyAAQQh2Qf8BcWwgDkH/AXEgAWxqIA1uQQh0ciANciEACwJAAkACQAJAAkAgBigCCEEBaw4GBAMCBwEABgsgAEEEdkEPcSAAQQh2QfABcSAAQRB2QYDgA3EgAEEMdkGAHnFycnIhAAwGCyAAQQt2QR9xIABBEHZBgPADcSAAQQ12QeAPcXJyIQAMBQsgAEEIdiEADAQLAn8gAEEIdkH/AXG4RF1txf6ye7I/oiAAQRB2Qf8BcbhEpSxDHOvi5j+iIABBGHazQ9CzWT6Uu6CgIiZEAAAAAAAA8EFjICZEAAAAAAAAAABmcQRAICarDAELQQALQQh0QYD+A3EgAEH/AXFyIQAMAwsgAEH/AXEhAAwCCyAUQRh0IgsgE0EQdCINQYCA/AdxIA5BCHQiIUGA/gNxcnIiIiABciEAAkACQAJAAkACQCAGKAIIQQFrDgYEAwIGAQAFCyANQQx2QYAecSALQRB2QYDgA3EgIEEEdkEPcSAOQfABcXJyciEADAULICFBC3ZBH3EgDUENdkHgD3EgC0EQdkGA8ANxcnIhAAwECyAiQQh2IQAMAwsCfyAOQf8BcbhEXW3F/rJ7sj+iIBNB/wFxuESlLEMc6+LmP6IgFEH/AXGzQ9CzWT6Uu6CgIiZEAAAAAAAA8EFjICZEAAAAAAAAAABmcQRAICarDAELQQALQQh0QYD+A3EgAXIhAAwCCyABIQAMAQtBACEACyAXIAAgFREBAAsgAkEBaiICIBFHDQALCyAQQQFqIhAgBEcNAAsLIAdBMGokACAMQTBqJAALoAgDEH8BfAR9IwBBMGsiCSQAIAkgADYCLCAJIAE2AiggCSACNgIkIAkgAzYCICAJIAQ2AhwgCSAFNgIYIAkgBjYCFCAJIAc2AhAgCSAINgIMIAkoAiQhACAJKAIgIQEgCSgCHCECIAkoAhghAyAJKAIUIQQgCSgCECEFIAkoAgwhBiMAQSBrIgokACAKIAkoAig2AhwgCiAANgIYIAogATYCFCAKIAI2AhAgCiADNgIMIAogBDYCCCAKIAU2AgQgCiAGNgIAIAooAhwhEyAKKAIAIRYCQCAKKAIEIgggCigCFCIAayAKKAIQIg4gCigCGCIGa2wgCigCCCILIAZrIAooAgwiDCAAa2xGDQAgDCAAIAAgDEobIQIgDCAAIAAgDEgiDRshAwJ/IAAgCEgEQCAIIQEgCyEEIAYMAQsgACEBIAYhBCAIIQAgCwshByAGIA4gDRshBSAOIAYgDRshBiAIIAwgCCAMSiIQGyINIAggDCAIIAxIGyIPayESIA4gCyAQGyERIAsgDiAQGyEQAkACQCABIABrIgsgAyACayIISA0AIAsgEkgNACABIQwgBCEOIAAhFCAHIRUgAyEBIAYhBCACIQAgBSEHIA0hAyAQIQYgDyECIBEhBSAIIQsgEiEIDAELAkAgCCASSg0AIAsgEkoNACANIQwgECEOIA8hFCARIRUMAQsgAyEMIAYhDiACIRQgBSEVIA0hAyAQIQYgDyECIBEhBSASIQgLAkAgCCALTARAIAEhDSAEIQ8gACELIAchESADIQEgBiEEIAIhACAFIQcMAQsgAyENIAYhDyACIQsgBSERCyAVIA5rsiAMIBRrspUhHSALQQAgC0EAShsiCCANIBMoAgRBAWsiAiACIA1LGyICTARAIBEgD2uyIA0gC2uylSEaIA+yIRsgDrIhHANAAn8gGiANIAhrspQgG5K7RAAAAAAAAOA/oCIZmUQAAAAAAADgQWMEQCAZqgwBC0GAgICAeAshAyATAn8gHSAMIAhrspQgHJK7RAAAAAAAAOA/oCIZmUQAAAAAAADgQWMEQCAZqgwBC0GAgICAeAsgAyAIIBYQCiACIAhHIRcgCEEBaiEIIBcNAAsLIAEgAGsiAkEATA0AIABBACAAQQBKGyIIIAEgEygCBEEBayIAIAAgAUsbIgBKDQAgByAEa7IgArKVIRogBLIhGyAOsiEcA0ACfyAaIAEgCGuylCAbkrtEAAAAAAAA4D+gIhmZRAAAAAAAAOBBYwRAIBmqDAELQYCAgIB4CyECIBMCfyAdIAwgCGuylCAckrtEAAAAAAAA4D+gIhmZRAAAAAAAAOBBYwRAIBmqDAELQYCAgIB4CyACIAggFhAKIAAgCEchGCAIQQFqIQggGA0ACwsgCkEgaiQAIAlBMGokAAuFAwEIfyMAQSBrIgYkACAGIAA2AhwgBiABNgIYIAYgAjYCFCAGIAM2AhAgBiAENgIMIAYgBTYCCCAGKAIUIQAgBigCECECIAYoAgwhAyAGKAIIIQQjAEEgayIBJAAgASAGKAIYNgIcIAEgADYCGCABIAI2AhQgASADNgIQIAEgBDYCDEEAIQMgASgCHCIEIAEoAhgiAiACIAEoAhQiBSABKAIQIgBqIAEoAgwiBxAKIAQgAiACIAUgAGsgBxAKIAQgAiAAayAAIAJqIAUgBxAKIABBAEoEQEEBIABrIQlBACAAQQF0ayEKQQEhDANAIAQgAiADQQFqIgNrIgggAiADaiILIAAgCUEATiINayIAIAVqIAcQCiAEIAggCyAFIABrIAcQCiAEIAIgAGsiCCAAIAJqIgsgAyAFaiAHEAogBCAIIAsgBSADayAHEAogCkECaiIIIAogDRshCiAMQQJqIgwgCWogCEEAIA0baiEJIAAgA0oNAAsLIAFBIGokACAGQSBqJAAL0wIBBH8jAEEgayIHJAAgByAANgIcIAcgATYCGCAHIAI2AhQgByADNgIQIAcgBDYCDCAHIAU2AgggByAGNgIEIAcoAhQhASAHKAIQIQIgBygCDCEDIAcoAgghBCAHKAIEIQUjAEEgayIAJAAgACAHKAIYNgIcIAAgATYCGCAAIAI2AhQgACADNgIQIAAgBDYCDCAAIAU2AgggACgCFCEBIAAoAhAhBSAAKAIMIQYgACgCCCEIAkAgACgCGCICIAAoAhwiAygCACIETg0AIAEgBmoiCUEBayIKIAIgBWpBAWsiBXJBAEgNACADKAIEIgYgAUwNACABQQAgAUEAShsiASAJIAYgBiAKShsiBkYNACAFIARBAWsgBCAFShshBCACQQAgAkEAShshAgNAIAMgAiAEIAEgCBAKIAFBAWoiASAGRw0ACwsgAEEgaiQAIAdBIGokAAujCwINfwF8IwBBIGsiDCQAIAwgADYCHCAMIAE2AhggDCACNgIUIAwgAzYCECAMIAQ2AgwgDCAFNgIIIAwoAhQhACAMKAIQIQEgDCgCDCECIAwoAgghAyMAQSBrIg0kACANIAwoAhg2AhwgDSAANgIYIA0gATYCFCANIAI2AhAgDSADNgIMIA0oAhghCiANKAIUIQsgDSgCDCECQQIhAUEFIA0oAhAiCUECdGtBBG0hBSANKAIcIgAoAgQhDyAAKAIAIQMgACgCFCEIQQ4hBAJAAn8CQAJAAkACQAJAAkACQAJAIAAoAggiAEEBaw4GAgEECQEBAAtBBCEBCyAAQQJrIREgASEAIBEOBQECBwMEBQsgAkH/AXEhAkEBIQBBDyEEDAYLQRAhBAJ/IAJBCHZB/wFxuERdbcX+snuyP6IgAkEQdkH/AXG4RKUsQxzr4uY/oiACQRh2s0PQs1k+lLugoCITRAAAAAAAAPBBYyATRAAAAAAAAAAAZnEEQCATqwwBC0EAC0EIdEGA/gNxIAJB/wFxcgwECyACQQh2IQJBESEEDAQLQRIhBCACQQt2QR9xIAJBEHZBgPADcSACQQ12QeAPcXJyDAILQRMhBCACQQR2QQ9xIAJBCHZB8AFxIAJBEHZBgOADcSACQQx2QYAecXJycgwBC0EPIQRBAAshAgsCQCADIApMIgcNACAJIAtqIgEgCnJBAEgNACABIA9ODQAgCCAAIAEgA2wgCmpsaiACIAQRAQALAkAgBw0AIAsgCWsiASAKckEASA0AIAEgD04NACAIIAAgASADbCAKamxqIAIgBBEBAAsCQCALIA9OIgcNACAJIApqIgEgC3JBAEgNACABIANODQAgCCAAIAMgC2wgAWpsaiACIAQRAQALAkAgBw0AIAogCWsiASALckEASA0AIAEgA04NACAIIAAgAyALbCABamxqIAIgBBEBAAsgCUEASgRAQQAhBwNAIAUgB0EBaiIHQQAgCUEBayIBIAVBAEgiBhtrQQF0aiESAkACQCAJIAEgBhsiCSAHRgRAIAcgCmohBgJAIAcgC2oiASAPTiIODQAgAyAGTA0AIAEgBnJBAEgNACAIIAEgA2wgBmogAGxqIAIgBBEBAAsgCiAHayEFAkAgDg0AIAMgBUwNACABIAVyQQBIDQAgCCABIANsIAVqIABsaiACIAQRAQALAkAgCyAHayIBIA9OIg4NACADIAZMDQAgASAGckEASA0AIAggASADbCAGaiAAbGogAiAEEQEACyAODQIgAyAFTA0CIAEgBXJBAE4NAQwCCyAHIAlODQEgByAKaiEBAkAgCSALaiIGIA9OIg4NACABIANODQAgASAGckEASA0AIAggAyAGbCABaiAAbGogAiAEEQEACyAKIAdrIQUCQCAODQAgAyAFTA0AIAUgBnJBAEgNACAIIAMgBmwgBWogAGxqIAIgBBEBAAsCQCALIAlrIgYgD04iDg0AIAEgA04NACABIAZyQQBIDQAgCCADIAZsIAFqIABsaiACIAQRAQALAkAgDg0AIAMgBUwNACAFIAZyQQBIDQAgCCADIAZsIAVqIABsaiACIAQRAQALIAkgCmohBgJAIAcgC2oiASAPTiIODQAgAyAGTA0AIAEgBnJBAEgNACAIIAEgA2wgBmogAGxqIAIgBBEBAAsgCiAJayEFAkAgDg0AIAMgBUwNACABIAVyQQBI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IAIgAzsBDCACIAM7AQogAiADOwEIIAIgAzsBBiACIAM7AQQgAiADOwECIAIgAzsBACACQRBqIQIgAEEJayEPIABBCGshACAPQX5JDQALCyAHQRBqJAAgBkEQaiQACyIBAX8jAEEQayIBJAAgASAANgIMIAFBEGokAEHwzgAoAgALJgECfyMAQRBrIgEkACABIAA2AgwgASgCDBAEIQIgAUEQaiQAIAILXgEBfyMAQRBrIgMkACADIAA2AgwgAyABNgIIIAMgAjYCBCADKAIEIQEjAEEQayIAJAAgACADKAIINgIMIAAgATYCCCAAKAIMIAAoAgg2AhAgAEEQaiQAIANBEGokAAteAQF/IwBBEGsiAyQAIAMgADYCDCADIAE2AgggAyACNgIEIAMoAgQhASMAQRBrIgAkACAAIAMoAgg2AgwgACABNgIIIAAoAgwgACgCCDYCDCAAQRBqJAAgA0EQaiQAC0wBAX8jAEEQayICJAAgAiAANgIMIAIgATYCCCMAQRBrIgAkACAAIAIoAgg2AgwgACgCDCIBKAIUEAIgARACIABBEGokACACQRBqJAAL5wEBA38jAEEQayIEJAAgBCAANgIMIAQgATYCCCAEIAI2AgQgBCADNgIAIAQoAgQhASAEKAIAIQIjAEEQayIAJAAgACAEKAIINgIMIAAgATYCCCAAIAI2AgQCfyAAKAIMIQIgACgCCCEDIAAoAgQhBUEYEAQiAQRAIAFCgYCAgBA3AgwgASAFNgIIIAEgAzYCBCABIAI2AgAgAiADbCECIAEgBUEBayIDQQVNBH8gA0ECdEGIHGooAgAFQQQLIAJsEAQiAjYCFCABIAINARogARACC0EACyEGIABBEGokACAEQRBqJAAgBgu1qwQEa38IfAN9A34jAEEQayIkJAAgJCAANgIMICQgATYCCCAkIAI2AgQgJCADNgIAICQoAgQhACAkKAIAIQEjAEEQayIiJAAgIiAkKAIINgIMICIgADYCCCAiIAE2AgQgIiAiKAIMNgIAICIoAgQhAUEAIQJBACEDIwBB0AFrIhwkACAcICIoAgAgIigCCGoiADYCyAEgHEEANgI4IBxBADYCKCAcIAAgAWoiATYCzAEgHCAANgLAASAcIAE2AsQBQQAhACMAQZAQayIjJAAjAEGAkQJrIhkkACAjQQA2AgwgI0IINwIE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IAdBPzYC1I8BCyAHQQA2AsiPASAHQgA3AryPASAHQQA2AoyPASAHQQA2AsSOASAHQQA2AvyNASAHQf8BOgDEjwEgB0EANgK0jQEgB0EANgLgjwEgByAHKAKEkAEiAUH/////ByABGyIONgKIkAEgBygC8I8BIQEgBUUEQCABQQFGBEAgByAHKAL0jwEiBkHIAGxqIgFBvI0BaigCACIIQQBMDQcgAUG4jQFqKAIAIgVBAEwNByABQcCNAWohCSABQciNAWohBCABQaiNAWohCiABQayNAWohDiABQbCNAWohEEEBIAhBB2pBA3UiASABQQFMGyEIQQEgBUEHakEDdSIBIAFBAUwbIQVBACELA0AgC0EDdCEPQQAhAQNAIAcgGUEgaiIRIBggDigCAEGQDWxqIBcgECgCACIVQZANbGogByAVQQp0akGE7QBqIAYgByAKKAIAQQd0akGE6QBqECZFDQ0gBCgCACAPIAkoAgAiFWxqIAFBA3RqIBUgESAHKAKMkAERBAAgByAHKAKIkAEiEUEBazYCiJABIBFBAUwEQCAHKALAjwFBF0wEQCAHEAULIActAMSPAUH4AXFB0AFHDQogB0EANgLIjwEgB0IANwK8jwEgB0EANgKMjwEgB0EANgLEjgEgB0EANgL8jQEgB0H/AToAxI8BIAdBADYCtI0BIAdBADYC4I8BIAcgBygChJABIhFB/////wcgERs2AoiQAQsgAUEBaiIBIAVHDQALIAtBAWoiCyAIRw0ACwwHCyAHKAKQjQEiBUEATA0GQQAhECAHKAKMjQEiAUEATA0GA0BBACEJIAFBAEoEQANAQQAhCCAHKALwjwEiBkEASgRAA0ACQCAHIAcgCEECdGpB9I8BaigCACILQcgAbGoiAUGkjQFqIgQoAgAiBUEATA0AIAFBoI0BaiIPKAIAIg5BAEwNACABQcCNAWohBiABQciNAWohESABQaiNAWohFSABQayNAWohEyABQbCNAWohEkEAIQoDQEEAIQEgDkEASgRAA0AgBCgCACEFIAcgGUEgaiIUIBggEygCAEGQDWxqIBcgEigCACIWQZANbGogByAWQQp0akGE7QBqIAsgByAVKAIAQQd0akGE6QBqECZFDRMgESgCACAGKAIAIhYgBSAQbCAKamxBA3RqIAkgDmwgAWpBA3RqIBYgFCAHKAKM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IG9mIG1lbW9yeQBKUEVHIGZvcm1hdCBub3Qgc3VwcG9ydGVkOiA4LWJpdCBvbmx5AFBORyBub3Qgc3VwcG9ydGVkOiAxLzIvNC84LzE2LWJpdCBvbmx5AFBJQyBmaWxlIHRvbyBzaG9ydABJbWFnZSBub3Qgb2YgYW55IGtub3duIHR5cGUsIG9yIGNvcnJ1cHQAUFBNIGltYWdlIG5vdCA4LWJpdABQU0QgYml0IGRlcHRoIGlzIG5vdCA4IG9yIDE2IGJpdABKUEVHIGZvcm1hdCBub3Qgc3VwcG9ydGVkOiBkZWxheWVkIGhlaWdodABDYW4ndCBmaW5kIG91dCBUR0EgcGl4ZWxmb3JtYXQAUFNEIGlzIG5vdCBpbiBSR0IgY29sb3IgZm9ybWF0AFBTRCBoYXMgYW4gdW5rbm93biBjb21wcmVzc2lvbiBmb3JtYXQAVW5zdXBwb3J0ZWQgSERSIGZvcm1hdAB0b28gbWFueSBwYWNrZXRzAEludGVybmFsIGVycm9yAHBhY2tldCBpc24ndCA4YnBwAEJNUCB0eXBlIG5vdCBzdXBwb3J0ZWQ6IHVua25vd24Ac2NhbmxpbmUgb3ZlcnJ1bgBwYWNrZXQgaGFzIGJhZCBjb21wcmVzc2lvbiB0eXBlAFBORyBub3Qgc3VwcG9ydGVkOiB1bmtub3duIFBORyBjaHVuayB0eXBlAEhEUiBpbWFnZSBpcyB0b28gbGFyZ2UAR0lGIGltYWdlIGlzIHRvbyBsYXJnZQBQTk0gdG9vIGxhcmdlAENvcnJ1cHQgSERSIGltYWdlAENvcnJ1cHQgUFNEIGltYWdlAFVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscyBpbiBQU0QgaW1hZ2UAVW5zdXBwb3J0ZWQgdmVyc2lvbiBvZiBQU0QgaW1hZ2UAUElDIGltYWdlIHRvbyBsYXJnZSB0byBkZWNvZGUASW1hZ2UgdG9vIGxhcmdlIHRvIGRlY29kZQBGT1JNQVQ9MzItYml0X3JsZV9yZ2JlAGJhZCBSTEUgZGF0YQBQSUNUAGNvcnJ1cHQgSERSAGJhZCBSTEUgZGF0YSBpbiBIRFIAQ29ycnVwdCBCTVAAYmFkIEJNUABDb3JydXB0IFBORwBOb3QgYSBQTkcAQ29ycnVwdCBKUEVHAENvcnJ1cHQgR0lGAEJNUCB0eXBlIG5vdCBzdXBwb3J0ZWQ6IFJMRQAjP1JBRElBTkNFACM/UkdCRQBDb3JydXB0IFBTRABDb3JydXB0IFRHQQBTgPY0AGZpbGUgdG9vIHNob3J0IChwdXJlIHJlYWQgY291bnQpAGZpbGUgdG9vIHNob3J0IChtaXhlZCByZWFkIGNvdW50KQBmaWxlIHRvbyBzaG9ydCAocmVhZGluZyBwYWNrZXRzKQBmaWxlIHRvbyBzaG9ydCAocGljIGhlYWRlcikAVmVyeSBsYXJnZSBpbWFnZSAoY29ycnVwdD8pAC1ZIAArWCAAIz9SQURJQU5DRQoAQZERC1EBCBAJAgMKERggGRILBAUMExohKDApIhsUDQYHDhUcIyoxODkyKyQdFg8XHiUsMzo7NC0mHycuNTw9Ni83Pj8/Pz8/Pz8/Pz8/Pz8/Pz9SR0IAQfQRCz4BAAAAAwAAAAcAAAAPAAAAHwAAAD8AAAB/AAAA/wAAAP8BAAD/AwAA/wcAAP8PAAD/HwAA/z8AAP9/AAD//wBBxBILRf/////9////+f////H////h////wf///4H///8B////Af7//wH8//8B+P//AfD//wHg//8BwP//AYD//wD/VQARAAAAAQBBlBMLEQQAAAAAAAAAAgAAAAAAAAABAEG4EwtZBAAAAAAAAAACAAAAAAAAAAEAAAAAAAAACAAAAAgAAAAEAAAABAAAAAIAAAACAAAAAQAAAAAAAAAIAAAACAAAAAgAAAAEAAAABAAAAAIAAAACAAAAAAEABQYAQaQUCx3/AAAAVQAAAEkAAAARAAAAIQAAAEEAAACBAAAAAQBB3BQLEQEAAAAAAAAAAgAAAAQAAAAGAEGAFQvTAggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJ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";if(!N(O)){var P=O;O=d.locateFile?d.locateFile(P,t):t+P} +function A(a){if(d.onAbort)d.onAbort(a);a="Aborted("+a+")";y(a);C=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");k(a);throw a;}function N(a){return a.startsWith("data:application/octet-stream;base64,")}var O;O="data:application/octet-stream;base64,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IARBA3EhHyAGQRBHISAgBEEESSElIAQhGANAIAkgCUH/AXFBjBRqLQAAIBMbIQkgAUEBaiEKIAAoAgwgF2ogIWoiDSAjaiEMQQAhAkEBIAsgGxsiC0EATCIPRQRAA0ACQCACIA1qAn8CQAJAAkACQAJAAkACQCAJQf8BcQ4HAAECAwQFBggLIAIgCmotAAAMBgsgAiAKai0AAAwFCyACIAxqLQAAIAIgCmotAABqDAQLIAIgCmotAAAgAiAMai0AAEEBdmoMAwsgAiAMai0AACACIApqLQAAagwCCyACIApqLQAADAELIAIgCmotAAALOgAACyACQQFqIgIgC0cNAAsLAn8gBkEIRgRAIBxFBEAgDSASakH/AToAAAsgAyECIAogEmoMAQsgIEUEQCAcRQRAIAsgDWpB//8DOwAACyAOIQIgCiALagwBC0EBIQIgAUECagshASAaIBggGxshGCACIAxqIQwgAiANaiECAkACQAJAAkAgIgRAIBhBAWsgC2whCgJAAkACQAJAAkACQAJAIAlB/wFxDgcIBAMCBQEABgsgCkEATA0FQQAhCCAKQQFHBEAgCkF+cSEPQQAhCQNAIAIgCGogAiAIIAtrai0AACABIAhqLQAAajoAACACIAhBAXIiDGogAiAMIAtrai0AACABIAxqLQAAajoAACAIQQJqIQggCUECaiIJIA9HDQALCyAKQQFxRQ0FIAIgCGogAiAIIAtrai0AACABIAhqLQAAajoAACABIApqIQEMCAsgCkEATA0EQQAhCCAKQQFHBEAgCkF+cSEPQQAhCQNAIAIgCGogASAIai0AACACIAggC2tqLQAAQQF2ajoAACACIAhBAXIiDGogASAMai0AACACIAwgC2tqLQAAQQF2ajoAACAIQQJqIQggCUECaiIJIA9HDQALCyAKQQFxRQ0EIAIgCGogASAIai0AACACIAggC2tqLQAAQQF2ajoAACABIApqIQEMBwsgCkEATA0DQQAhCCAKQQFHBEAgCkF+cSENQQAhCQNAIAIgCGogASAIai0AACACIAggC2tqLQAAIAggDGotAABqQQF2ajoAACACIAhBAXIiD2ogASAPai0AACACIA8gC2tqLQAAIAwgD2otAABqQQF2ajoAACAIQQJqIQggCUECaiIJIA1HDQALCyAKQQFxRQ0DIAIgCGogASAIai0AACACIAggC2tqLQAAIAggDGotAABqQQF2ajoAACABIApqIQEMBgsgCkEATA0CQQAhCCAKQQFHBEAgCkF+cSENQQAhCQNAIAIgCGogCCAMai0AACABIAhqLQAAajoAACACIAhBAXIiD2ogDCAPai0AACABIA9qLQAAajoAACAIQQJqIQggCUECaiIJIA1HDQALCyAKQQFxRQ0CIAIgCGogCCAMai0AACABIAhqLQAAajoAACABIApqIQEMBQsgCkEATA0BQQAhCCAKQQFHBEAgCkF+cSEPQQAhCQNAIAIgCGogAiAIIAtrai0AACABIAhqLQAAajoAACACIAhBAXIiDGogAiAMIAtrai0AACABIAxqLQAAajoAACAIQQJqIQggCUECaiIJIA9HDQALCyAKQQFxRQ0BIAIgCGogAiAIIAtrai0AACABIAhqLQAAajoAACABIApqIQEMBAtBACEIIApBAEwNAANAIAIgCGogASAIai0AACAMIAggC2siDWotAAAiCSAIIAxqLQAAIg8gDyACIA1qLQAAIg1qIAlrIhcgD2siDyAPQR91Ig9zIA9rIg8gFyAJayIJIAlBH3UiCXMgCWsiCUsbIhEgESANIAkgFyANayIJIAlBH3UiCXMgCWsiCUkbIAkgD0sbajoAACAIQQFqIgggCkcNAAsLIAEgCmohAQwCCwJAAkACQAJAAkACQAJAAkAgCUH/AXEOBwUEAwIGAQAHCyAQRQ0GIAtBfnEhDSALQQFxIREgECEKA0ACQCAPDQBBACEIQQAhCSALQQFHBEADQCACIAhqIAIgCCAOa2otAAAgASAIai0AAGo6AAAgAiAIQQFyIgxqIAIgDCAOa2otAAAgASAMai0AAGo6AAAgCEECaiEIIAlBAmoiCSANRw0ACwsgEUUNACACIAhqIAIgCCAOa2otAAAgASAIai0AAGo6AAALIAIgC2pB/wE6AAAgAiAOaiECIAEgC2ohASAKQQFrIgoNAAsMBgsgEEUNBSALQX5xIQ0gC0EBcSERIBAhCgNAAkAgDw0AQQAhCEEAIQkgC0EBRwRAA0AgAiAIaiABIAhqLQAAIAIgCCAOa2otAABBAXZqOgAAIAIgCEEBciIMaiABIAxqLQAAIAIgDCAOa2otAABBAXZqOgAAIAhBAmohCCAJQQJqIgkgDUcNAAsLIBFFDQAgAiAIaiABIAhqLQAAIAIgCCAOa2otAABBAXZqOgAACyACIAtqQf8BOgAAIAIgDmohAiABIAtqIQEgCkEBayIKDQALDAULIBBFDQQgC0F+cSERIAtBAXEhFCAQIQoDQAJAIA8NAEEAIQhBACEJIAtBAUcEQANAIAIgCGogASAIai0AACACIAggDmtqLQAAIAggDGotAABqQQF2ajoAACACIAhBAXIiDWogASANai0AACACIA0gDmtqLQAAIAwgDWotAABqQQF2ajoAACAIQQJqIQggCUECaiIJIBFHDQALCyAURQ0AIAIgCGogASAIai0AACACIAggDmtqLQAAIAggDGotAABqQQF2ajoAAAsgAiALakH/AToAACAMIA5qIQwgAiAOaiECIAEgC2ohASAKQQFrIgoNAAsMBAsgEEUNAyALQX5xIREgC0EBcSEUIBAhCgNAAkAgDw0AQQAhCEEAIQkgC0EBRwRAA0AgAiAIaiAIIAxqLQAAIAEgCGotAABqOgAAIAIgCEEBciINaiAMIA1qLQAAIAEgDWotAABqOgAAIAhBAmohCCAJQQJqIgkgEUcNAAsLIBRFDQAgAiAIaiAIIAxqLQAAIAEgCGotAABqOgAACyACIAtqQf8BOgAAIAwgDmohDCACIA5qIQIgASALaiEBIApBAWsiCg0ACwwDCyAQRQ0CIAtBfnEhDSALQQFxIREgECEKA0ACQCAPDQBBACEIQQAhCSALQQFHBEADQCACIAhqIAIgCCAOa2otAAAgASAIai0AAGo6AAAgAiAIQQFyIgxqIAIgDCAOa2otAAAgASAMai0AAGo6AAAgCEECaiEIIAlBAmoiCSANRw0ACwsgEUUNACACIAhqIAIgCCAOa2otAAAgASAIai0AAGo6AAALIAIgC2pB/wE6AAAgAiAOaiECIAEgC2ohASAKQQFrIgoNAAsMAgsgEEUNASALQXxxIREgC0EDcSENIAtBAWshFCAQIQoDQAJAIA8NAEEAIQxBACEIQQAhCSAUQQNPBEADQCACIAhqIAEgCGotAAA6AAAgAiAIQQFyIhVqIAEgFWotAAA6AAAgAiAIQQJyIhVqIAEgFWotAAA6AAAgAiAIQQNyIhVqIAEgFWotAAA6AAAgCEEEaiEIIAlBBGoiCSARRw0ACwsgDUUNAANAIAIgCGogASAIai0AADoAACAI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DQALC0EBDwtBgAghHQtB8M4AIB02AgBBAAuECQEEfyABKAIAQQBKBEADQCAAIAJqQYAKakEBOgAAIAJBAWoiAiABKAIASA0ACwsgASgCBEEASgRAA0AgACACakGACmpBAjoAACACQQFqIQIgA0EBaiIDIAEoAgRIDQALCyABKAIIQQBKBEBBACEDA0AgACACakGACmpBAzoAACACQQFqIQIgA0EBaiIDIAEoAghIDQALCyABKAIMQQBKBEBBACEDA0AgACACakGACmpBBDoAACACQQFqIQIgA0EBaiIDIAEoAgxIDQALCyABKAIQQQBKBEBBACEDA0AgACACakGACmpBBToAACACQQFqIQIgA0EBaiIDIAEoAhBIDQALCyABKAIUQQBKBEBBACEDA0AgACACakGACmpBBjoAACACQQFqIQIgA0EBaiIDIAEoAhRIDQALCyABKAIYQQBKBEBBACEDA0AgACACakGACmpBBzoAACACQQFqIQIgA0EBaiIDIAEoAhhIDQALCyABKAIcQQBKBEBBACEDA0AgACACakGACmpBCDoAACACQQFqIQIgA0EBaiIDIAEoAhxIDQALCyABKAIgQQBKBEBBACEDA0AgACACakGACmpBCToAACACQQFqIQIgA0EBaiIDIAEoAiBIDQALCyABKAIkQQBKBEBBACEDA0AgACACakGACmpBCjoAACACQQFqIQIgA0EBaiIDIAEoAiRIDQALCyABKAIoQQBKBEBBACEDA0AgACACakGACmpBCzoAACACQQFqIQIgA0EBaiIDIAEoAihIDQALCyABKAIsQQBKBEBBACEDA0AgACACakGACmpBDDoAACACQQFqIQIgA0EBaiIDIAEoAixIDQALCyABKAIwQQBKBEBBACEDA0AgACACakGACmpBDToAACACQQFqIQIgA0EBaiIDIAEoAjBIDQALCyABKAI0QQBKBEBBACEDA0AgACACakGACmpBDjoAACACQQFqIQIgA0EBaiIDIAEoAjRIDQALCyABKAI4QQBKBEBBACEDA0AgACACakGACmpBDzoAACACQQFqIQIgA0EBaiIDIAEoAjhIDQALCyABKAI8QQBKBEBBACEDA0AgACACakGACmpBEDoAACACQQFqIQIgA0EBaiIDIAEoAjxIDQALC0EAIQEgACACakGACmpBADoAAEEBIQRBACECA0AgACAEQQJ0aiIFQcwMaiACIAFrNgIAAkAgBCAAIAJqQYAKai0AAEcNAANAIAAgAkEBdGogASIDOwGABCABQQFqIQEgBCAAIAJBAWoiAmpBgApqLQAARg0ACyADIAR2RQ0AQfDOAEH1DjYCAEEADwsgBUGEDGogAUEQIARrdDYCACABQQF0IQEgBEEBaiIEQRFHDQALIABByAxqQX82AgAgAEH/AUGABBAJIQMgAkEASgRAQQAhAQNAIAEgA2pBgApqLQAAIgBBCU0EQCADIAFBAXRqLwGABEEJIABrIgR0IQVBACEAA0AgAyAAIAVqaiABOgAAIABBAWoiACAEdkUNAAsLIAFBAWoiASACRw0ACwtBAQvkAQECfwJAIAACfyAAKAKoASIBIAAoAqwBIgJJBEAgAUEBagwBCyAAKAIgRQ0BIAACfyAAKAIcIABBKGoiASAAKAIkIAAoAhARAAAiAkUEQCAAQQA6ACggAEEANgIgIABBKWoMAQsgASACagsiAjYCrAEgAEEpagsiATYCqAELAkAgACABIAJJBH8gAUEBagUgACgCIEUNASAAAn8gACgCHCAAQShqIgEgACgCJCAAKAIQEQAAIgJFBEAgAEEAOgAoIABBADYCICAAQSlqDAELIAEgAmoLNgKsASAAQSlqCzYCqAELC+sCAQR/AkAgACgCqAEiAyAAKAKsASIESQRAIAAgA0EBaiICNgKoASADLQAAIQUMAQsgACgCIEUEQCADIQIMAQsCfyAAKAIcIABBKGoiAiAAKAIkIAAoAhARAAAiA0UEQCAAQQA6ACggAEEANgIgIABBKWohBEEADAELIAIgA2ohBCACLQAACyEFIAAgBDYCrAEgACAAQSlqIgI2AqgBCwJAIAIgBEkEQCAAIAJBAWo2AqgBIAItAAAhAgwBCyAAKAIgRQRAQQAhAgwBCwJ/IAAoAhwgAEEoaiICIAAoAiQgACgCEBEAACIDRQRAIABBADoAKCAAQQA2AiAgAEEpaiEEQQAMAQsgAiADaiEEIAItAAALIQIgACAENgKsASAAIABBKWo2AqgBCyABIAVBH3FB/wFsQR9uOgACIAEgAkECdkEfcUH/AWxBH246AAAgASAFQeABcSACQQh0ckEFdkEfcUH/AWxBH246AAELVgIBfQF/AkAgAS0AAyIDBEAgACADQYgBaxAZtiICIAEtAACzlDgCACAAIAIgAS0AAbOUOAIEIAAgAiABLQACs5Q4AggMAQsgAEEANgIIIABCADcCAAsL3QQBBn8gAEEpaiEGIABBKGohBAJAIAAoAqgBIgcgACgCrAEiBUkEQCAAIAdBAWoiAjYCqAEgBy0AACEDDAELIAAoAiBFBEAgByECDAELAn8gACgCHCAEIAAoAiQgACgCEBEAACICRQRAIABBADoAKCAAQQA2AiAgBgwBCyAELQAAIQMgAiAEagshBSAAIAY2AqgBIAAgBTYCrAEgBiECCwJAIAMgAS0AAEcNAAJAIAIgBU8EQCAAKAIgRQRAQQAhAwwCCwJ/IAAoAhwgBCAAKAIkIAAoAhARAAAiAgRAIAQtAAAhAyACIARqDAELQQAhAyAAQQA6ACggAEEANgIgIAYLIQUgACAGNgKoASAAIAU2AqwBIAYhAgwBCyAAIAJBAWoiBzYCqAEgAi0AACEDIAchAgsgAyABLQABRw0AAkAgAiAFTwRAIAAoAiBFBEBBACEDDAILAn8gACgCHCAEIAAoAiQgACgCEBEAACICBEAgBC0AACEDIAIgBGoMAQtBACEDIABBADoAKCAAQQA2AiAgBgshBSAAIAY2AqgBIAAgBTYCrAEgBiECDAELIAAgAkEBaiIHNgKoASACLQAAIQMgByECCyADIAEtAAJHDQACQCACIAVPBEAgACgCIEUEQEEAIQIMAgsCfyAAKAIcIAQgACgCJCAAKAIQEQAAIgIEQCACIARqIQUgBC0AAAwBCyAAQQA6ACggAEEANgIgIAYhBUEACyECIAAgBjYCqAEgACAFNgKsAQwBCyAAIAJBAWo2AqgBIAItAAAhAgsgAS0AAyACQf8BcUYPC0EAC/IIAQZ/IABBKWohBCAAQShqIQMCfwJAAkAgACgCqAEiAiAAKAKsASIBSQRAIAAgAkEBaiIFNgKoASACLQAAIQIMAQsgACgCIEUNAQJ/IAAoAhwgAyAAKAIkIAAoAhARAAAiAUUEQEEAIQIgAEEAOgAoIABBADYCICAEDAELIAMtAAAhAiABIANqCyEBIAAgBDYCqAEgACABNgKsASAEIQULIAJB/wFxQYkBRw0AAkAgASAFTQRAIAAoAiBFDQICfyAAKAIcIAMgACgCJCAAKAIQEQAAIgEEQCADLQAAIQIgASADagwBC0EAIQIgAEEAOgAoIABBADYCICAECyEBIAAgBDYCqAEgACABNgKsASAEIQYMAQsgACAFQQFqIgY2AqgBIAUtAAAhAgsgAkH/AXFB0ABHDQACQCABIAZNBEAgACgCIEUNAgJ/IAAoAhwgAyAAKAIkIAAoAhARAAAiAQRAIAMtAAAhBSABIANqDAELQQAhBSAAQQA6ACggAEEANgIgIAQLIQEgACAENgKoASAAIAE2AqwBIAQhAgwBCyAAIAZBAWoiAjYCqAEgBi0AACEFCyAFQf8BcUHOAEcNAAJAIAEgAk0EQCAAKAIgRQ0CAn8gACgCHCADIAAoAiQgACgCEBEAACIBBEAgAy0AACECIAEgA2oMAQtBACECIABBADoAKCAAQQA2AiAgBAshASAAIAQ2AqgBIAAgATYCrAEgBCEFDAELIAAgAkEBaiIFNgKoASACLQAAIQILIAJB/wFxQccARw0AAkAgASAFTQRAIAAoAiBFDQICfyAAKAIcIAMgACgCJCAAKAIQEQAAIgEEQCADLQAAIQIgASADagwBC0EAIQIgAEEAOgAoIABBADYCICAECyEBIAAgBDYCqAEgACABNgKsASAEIQYMAQsgACAFQQFqIgY2AqgBIAUtAAAhAgsgAkH/AXFBDUcNAAJAIAEgBk0EQCAAKAIgRQ0CAn8gACgCHCADIAAoAiQgACgCEBEAACIBBEAgAy0AACEFIAEgA2oMAQtBACEFIABBADoAKCAAQQA2AiAgBAshASAAIAQ2AqgBIAAgATYCrAEgBCECDAELIAAgBkEBaiICNgKoASAGLQAAIQULIAVB/wFxQQpHDQACQCABIAJNBEAgACgCIEUNAgJ/IAAoAhwgAyAAKAIkIAAoAhARAAAiAQRAIAMtAAAhAiABIANqDAELQQAhAiAAQQA6ACggAEEANgIgIAQLIQEgACAENgKoASAAIAE2AqwBIAQhBQwBCyAAIAJBAWoiBTYCqAEgAi0AACECCyACQf8BcUEaRw0AAkAgASAFTQRAIAAoAiBFDQICfyAAKAIcIAMgACgCJCAAKAIQEQAAIgEEQCABIANqIQIgAy0AAAwBCyAAQQA6ACggAEEANgIgIAQhAkEACyEBIAAgBDYCqAEgACACNgKsAQwBCyAAIAVBAWo2AqgBIAUtAAAhAQtBASABQf8BcUEKRg0BGgtB8M4AQesONgIAQQALC4krAQ1/IwBBQGoiDCQAAn8CQAJAAkACQAJAIAFBxAFrDhoEAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAQALIAFB/wFHDQJB8M4AQfUONgIAQQAMBAsCQCAAKAIAIgMoAqgBIgEgAygCrAEiBEkEQCADIAFBAWoiAjYCqAEgAS0AACEFDAELIAMoAiBFBEAgASECDAELIAMCfyADKAIcIANBKGoiASADKAIkIAMoAhARAAAiAkUEQCADQQA6ACggA0EANgIgIANBKWoMAQsgAS0AACEFIAEgAmoLIgQ2AqwBIAMgA0EpaiICNgKoAQsCQCACIARJBEAgAyACQQFqNgKoASACLQAAIQIMAQsgAygCIEUEQEEAIQIMAQsCfyADKAIcIANBKGoiASADKAIkIAMoAhARAAAiAkUEQCADQQA6ACggA0EANgIgIANBKWohBEEADAELIAEgAmohBCABLQAACyECIAMgBDYCrAEgAyADQSlqNgKoAQsgAkH/AXEgBUH/AXFBCHRyQQRHBEBB8M4AQfUONgIAQQAMBAsCQCAAKAIAIgMoAqgBIgEgAygCrAEiBEkEQCADIAFBAWoiAjYCqAEgAS0AACEFDAELIAMoAiBFBEBBACEFIAEhAgwBCyADAn8gAygCHCADQShqIgEgAygCJCADKAIQEQAAIgJFBEBBACEFIANBADoAKCADQQA2AiAgA0EpagwBCyABLQAAIQUgASACagsiBDYCrAEgAyADQSlqIgI2AqgBCwJAIAIgBEkEQCADIAJBAWo2AqgBIAItAAAhAgwBCyADKAIgRQRAQQAhAgwBCwJ/IAMoAhwgA0EoaiIBIAMoAiQgAygCEBEAACICRQRAIANBADoAKCADQQA2AiAgA0EpaiEEQQAMAQsgASACaiEEIAEtAAALIQIgAyAENgKsASADIANBKWo2AqgBCyAAIAJB/wFxIAVB/wFxQQh0cjYChJABQQEMAwsCQCAAKAIAIgMoAqgBIgEgAygCrAEiBEkEQCADIAFBAWoiAjYCqAEgAS0AACEFDAELIAMoAiBFBEAgASECDAELIAMCfyADKAIcIANBKGoiASADKAIkIAMoAhARAAAiAkUEQCADQQA6ACggA0EANgIgIANBKWoMAQsgAS0AACEFIAEgAmoLIgQ2AqwBIAMgA0EpaiICNgKoAQsCQCACIARJBEAgAyACQQFqNgKoASACLQAAIQIMAQsgAygCIEUEQEEAIQIMAQsCfyADKAIcIANBKGoiASADKAIkIAMoAhARAAAiAkUEQCADQQA6ACggA0EANgIgIANBKWohBEEADAELIAEgAmohBCABLQAACyECIAMgBDYCrAEgAyADQSlqNgKoAQsgAkH/AXEgBUH/AXFBCHRyQQJrIghBAEoEQANAAn8CQAJAAkACQCAAKAIAIgEoAqgBIgIgASgCrAFJBEAgASACQQFqNgKoASACLQAAIQIMAQsgASgCIEUEQEEAIQUMAgsCfyABKAIcIAFBKGoiAiABKAIkIAEoAhARAAAiBEUEQCABQQA6ACggAUEANgIgIAFBKWohBEEADAELIAIgBGohBCACLQAACyECIAEgBDYCrAEgASABQSlqNgKoAQsCQCACQf8BcSIBQRBJDQAgAkHwAXFBEEYNAEHwzgBB9Q42AgBBAAwJCyACQQ9xIgVBA0sNAUEAIQQgAUEPSw0CC0EAIQIDQAJAIAAoAgAiASgCqAEiBCABKAKsAUkEQCABIARBAWo2AqgBIAQtAAAhBAwBCyABKAIgRQRAQQAhBAwBCwJ/IAEoAhwgAUEoaiIEIAEoAiQgASgCEBEAACIDRQRAIAFBADoAKCABQQA2AiAgAUEpaiEDQQAMAQsgAyAEaiEDIAQtAAALIQQgASADNgKsASABIAFBKWo2AqgBCyAAIAVBB3RqIAJBkBFqLQAAQQF0akGE6QBqIARB/wFxOwEAIAJBAWoiAkHAAEcNAAtBv38MAgtB8M4AQfUONgIAQQAMBgsDQAJAIAAoAgAiBigCqAEiAiAGKAKsASIDTwRAIAYoAiBFBEBBACEHDAILIAYCfyAGKAIcIAZBKGoiASAGKAIkIAYoAhARAAAiAgRAIAEtAAAhByABIAJqDAELQQAhByAGQQA6ACggBkEANgIgIAZBKWoLIgM2AqwBIAYgBkEpaiICNgKoAQwBCyAGIAJBAWoiATYCqAEgAi0AACEHIAEhAgsCQCACIANPBEAgBigCIEUEQEEAIQIMAgsCfyAGKAIcIAZBKGoiASAGKAIkIAYoAhARAAAiAgRAIAEgAmohAyABLQAADAELIAZBADoAKCAGQQA2AiAgBkEpaiEDQQALIQIgBiADNgKsASAGIAZBKWo2AqgBDAELIAYgAkEBajYCqAEgAi0AACECCyAAIAVBB3RqIARBkBFqLQAAQQF0akGE6QBqIAJB/wFxIAdBCHRyOwEAIARBAWoiBEHAAEcNAAtB/34LIAhqIghBAEoNAAsLIAhFDAILAkACQCABQf4BRyABQXBxQeABR3FFBEACQCAAKAIAIgUoAqgBIgIgBSgCrAEiA0kEQCAFIAJBAWoiBDYCqAEgAi0AACEHDAELIAUoAiBFBEAgAiEEDAELIAUCfyAFKAIcIAVBKGoiAiAFKAIkIAUoAhARAAAiBEUEQCAFQQA6ACggBUEANgIgIAVBKWoMAQsgAi0AACEHIAIgBGoLIgM2AqwBIAUgBUEpaiIENgKoAQsCQCADIARLBEAgBSAEQQFqNgKoASAELQAAIQQMAQsgBSgCIEUEQEEAIQQMAQsCfyAFKAIcIAVBKGoiAiAFKAIkIAUoAhARAAAiBEUEQCAFQQA6ACggBUEANgIgIAVBKWohA0EADAELIAIgBGohAyACLQAACyEEIAUgAzYCrAEgBSAFQSlqNgKoAQsgBEH/AXEgB0H/AXFBCHRyIgpBAU0EQEHwzgBB9Q42AgBBAAwFCwJAIAFB4AFHDQAgCkEHSQ0AAkAgACgCACIBKAKoASIEIAEoAqwBIgNJBEAgASAEQQFqIgI2AqgBIAQtAAAhCAwBCyABKAIgRQRAIAQhAgwBCyABAn8gASgCHCABQShqIgIgASgCJCABKAIQEQAAIgRFBEAgAUEAOgAoIAFBADYCICABQSlqDAELIAItAAAhCCACIARqCzYCrAEgASABQSlqNgKoASAAKAIAIgEoAqwBIQMgASgCqAEhAgsCQCACIANPBEAgASgCIEUEQAwCCyABAn8gASgCHCABQShqIgIgASgCJCABKAIQEQAAIgQEQCACLQAAIQYgAiAEagwBCyABQQA6ACggAUEANgIgIAFBKWoLNgKsASABIAFBKWo2AqgBIAAoAgAiASgCrAEhAyABKAKoASECDAELIAEgAkEBaiIENgKoASACLQAAIQYgBCECCwJAIAIgA08EQCABKAIgRQRAQQAhBwwCCyABAn8gASgCHCABQShqIgIgASgCJCABKAIQEQAAIgQEQCACLQAAIQcgAiAEagwBC0EAIQcgAUEAOgAoIAFBADYCICABQSlqCzYCrAEgASABQSlqNgKoASAAKAIAIgEoAqwBIQMgASgCqAEhAgwBCyABIAJBAWoiBDYCqAEgAi0AACEHIAQhAgsCQCACIANPBEAgASgCIEUEQEEAIQUMAgsgAQJ/IAEoAhwgAUEoaiICIAEoAiQgASgCEBEAACIEBEAgAi0AACEFIAIgBGoMAQtBACEFIAFBADoAKCABQQA2AiAgAUEpags2AqwBIAEgAUEpajYCqAEgACgCACIBKAKsASEDIAEoAqgBIQIMAQsgASACQQFqIgQ2AqgBIAItAAAhBSAEIQILAkAgAiADTwRAIAEoAiBFBEBBACEDDAILAn8gASgCHCABQShqIgIgASgCJCABKAIQEQAAIgQEQCACIARqIQkgAi0AAAwBCyABQQA6ACggAUEANgIgIAFBKWohCUEACyEDIAEgCTYCrAEgASABQSlqNgKoAQwBCyABIAJBAWo2AqgBIAItAAAhAwsgCkEHayECIANB/wFxDQMgBUH/AXFBxgBHDQMgB0H/AXFByQBHDQMgBkHGAEcNAyAIQf8BcUHKAEcNAyAAQQE2AuSPAQwDCyABQe4BRw0BIApBDkkNAQJAIAAoAgAiASgCqAEiBCABKAKsASIDSQRAIAEgBEEBaiICNgKoASAELQAAIQkMAQsgASgCIEUEQCAEIQIMAQsgAQJ/IAEoAhwgAUEoaiICIAEoAiQgASgCEBEAACIERQRAIAFBADoAKCABQQA2AiAgAUEpagwBCyACLQAAIQkgAiAEags2AqwBIAEgAUEpajYCqAEgACgCACIBKAKsASEDIAEoAqgBIQILAkAgAiADTwRAIAEoAiBFBEAMAgsgAQJ/IAEoAhwgAUEoaiICIAEoAiQgASgCEBEAACIEBEAgAi0AACEIIAIgBGoMAQsgAUEAOgAoIAFBADYCICABQSlqCzYCrAEgASABQSlqNgKoASAAKAIAIgEoAqwBIQMgASgCqAEhAgwBCyABIAJBAWoiBDYCqAEgAi0AACEIIAQhAgsCQCACIANPBEAgASgCIEUEQAwCCyABAn8gASgCHCABQShqIgIgASgCJCABKAIQEQAAIgQEQCACLQAAIQYgAiAEagwBCyABQQA6ACggAUEANgIgIAFBKWoLNgKsASABIAFBKWo2AqgBIAAoAgAiASgCrAEhAyABKAKoASECDAELIAEgAkEBaiIENgKoASACLQAAIQYgBCECCwJAIAIgA08EQCABKAIgRQRAQQAhBwwCCyABAn8gASgCHCABQShqIgIgASgCJCABKAIQEQAAIgQEQCACLQAAIQcgAiAEagwBC0EAIQcgAUEAOgAoIAFBADYCICABQSlqCzYCrAEgASABQSlqNgKoASAAKAIAIgEoAqwBIQMgASgCqAEhAgwBCyABIAJBAWoiBDYCqAEgAi0AACEHIAQhAgsCQCACIANPBEAgASgCIEUEQEEAIQUMAgsgAQJ/IAEoAhwgAUEoaiICIAEoAiQgASgCEBEAACIEBEAgAi0AACEFIAIgBGoMAQtBACEFIAFBADoAKCABQQA2AiAgAUEpags2AqwBIAEgAUEpajYCqAEgACgCACIBKAKsASEDIAEoAqgBIQIMAQsgASACQQFqIgQ2AqgBIAItAAAhBSAEIQILAkAgAiADTwRAIAEoAiBFBEBBACEDDAILAn8gASgCHCABQShqIgIgASgCJCABKAIQEQAAIgQEQCACIARqIQsgAi0AAAwBCyABQQA6ACggAUEANgIgIAFBKWohC0EACyEDIAEgCzYCrAEgASABQSlqNgKoAQwBCyABIAJBAWo2AqgBIAItAAAhAwsgCkEIayECIANB/wFxDQIgBUH/AXFB5QBHDQIgB0H/AXFB4gBHDQIgBkHvAEcNAiAIQf8BcUHkAEcNAiAJQf8BcUHBAEcNAiAAKAIAEA0aIAAoAgAQHyAAKAIAEB8gACAAKAIAEA02AuiPASAKQQ5rIQIMAgtB8M4AQfUONgIAQQAMAwsgCkECayECCwJAIAAoAgAiASgCEEUEQCABKAKoASEADAELIAIgASgCrAEiBCABKAKoASIAayIDTA0AIAEgBDYCqAEgASgCHCACIANrIAEoAhQRAQBBAQwCCyABIAAgAmo2AqgBQQEMAQsCQCAAKAIAIgMoAqgBIgEgAygCrAEiBEkEQCADIAFBAWoiAjYCqAEgAS0AACEFDAELIAMoAiBFBEAgASECDAELIAMCfyADKAIcIANBKGoiASADKAIkIAMoAhARAAAiAkUEQCADQQA6ACggA0EANgIgIANBKWoMAQsgAS0AACEFIAEgAmoLIgQ2AqwBIAMgA0EpaiICNgKoAQsCQCACIARJBEAgAyACQQFqNgKoASACLQAAIQIMAQsgAygCIEUEQEEAIQIMAQsCfyADKAIcIANBKGoiASADKAIkIAMoAhARAAAiAkUEQCADQQA6ACggA0EANgIgIANBKWohBEEADAELIAEgAmohBCABLQAACyECIAMgBDYCrAEgAyADQSlqNgKoAQsCQCACQf8BcSAFQf8BcUEIdHJBAmsiC0EASgRAIABBBGohCiAAQcQ0aiEIA0ACQCAAKAIAIgEoAqgBIgIgASgCrAFJBEAgASACQQFqNgKoASACLQAAIQMMAQsgASgCIEUEQEEAIQMMAQsgAQJ/IAEoAhwgAUEoaiICIAEoAiQgASgCEBEAACIERQRAQQAhAyABQQA6ACggAUEANgIgIAFBKWoMAQsgAi0AACEDIAIgBGoLNgKsASABIAFBKWo2AqgBCwJAIANB/wFxIglBH00EQEEAIQRBACECIANBD3EiBkEESQ0BC0HwzgBB9Q42AgAMAwsDQAJAIAAoAgAiASgCqAEiAyABKAKsAUkEQCABIANBAWo2AqgBIAMtAAAhAwwBCyABKAIgRQRAQQAhAwwBCwJ/IAEoAhwgAUEoaiIDIAEoAiQgASgCEBEAACIFRQRAIAFBADoAKCABQQA2AiAgAUEpaiEFQQAMAQsgAyAFaiEFIAMtAAALIQMgASAFNgKsASABIAFBKWo2AqgBCyAMIAJBAnRqIANB/wFxIgE2AgAgASAEaiEEIAJBAWoiAkEQRw0ACwJ/IAlBD00EQCAKIAZBkA1sIgFqIAwQHkUNBCAAIAFqQYQIagwBCyAIIAZBkA1sIgFqIAwQHkUNAyAAIAFqQcQ8agshBUEAIQIgBARAA0ACQCAAKAIAIgEoAqgBIgMgASgCrAFJBEAgASADQQFqNgKoASADLQAAIQMMAQsgASgCIEUEQEEAIQMMAQsCfyABKAIcIAFBKGoiAyABKAIkIAEoAhARAAAiB0UEQCABQQA6ACggAUEANgIgIAFBKWohB0EADAELIAMgB2ohByADLQAACyEDIAEgBzYCrAEgASABQSlqNgKoAQsgAiAFaiADOgAAIAJBAWoiAiAERw0ACwsgCUEQTwRAIAggBkGQDWxqIQMgACAGQQp0akGE7QBqIQVBACEBA0AgASADai0AACECIAUgAUEBdGoiBkEAOwEAAkAgAkH/AUYNACACIANqIgdBgAhqLQAAIglBD3EiAkUNACACIAdBgApqLQAAIgdqIg1BCUsNAEF/IAJ0QQFyQQAgASAHdEH/A3EiB0GAAkkbIAdBCSACa3ZqIgJBgAFqQf8BSw0AIAYgDSAJQfABcWogAkEIdGo7AQALIAFBAWoiAUGABEcNAAsLIAtBEWsgBGsiC0EASg0ACwsgC0UMAQtBAAshDiAMQUBrJAAgDgvZBAEHfyAAKALUjwEEQEHwzgBB9Q42AgBBAA8LIAAoAsCPAUEPTARAIAAQBQsCfwJAIAAoAtiPAUUEQCABQQBBgAEQCSEIIAAoAsCPAUEPTARAIAAQBQsCQCACIAAoAryPASIGQRd2ai0AACIBQf8BRwRAQX8hBCAAKALAjwEiBSABIAJqQYAKai0AACIHSA0DIAAgBSAHayIFNgLAjwEgACAGIAd0IgY2AryPAQwBCyAGQRB2IQVBCiEEA0AgBCIBQQFqIQQgBSACIAFBAnRqQYQMaigCAE8NAAsgACgCwI8BIQUgAUERRgRAIAAgBUEQayIFNgLAjwFBfyEEDAMLQX8hBCABIAVKDQIgAiABQQJ0IgdqQcwMaigCACEKIAAgBiABdCIENgK8jwEgACAFIAFrIgU2AsCPASAKIAdB8BFqKAIAIAZBICABa3ZxaiEBIAQhBgsgASACakGACGotAAAiBA0BQQAMAgsgACAAKALAjwEiBEEATAR/IAAQBSAAKALAjwEFIAQLQQFrNgLAjwEgACAAKAK8jwEiAkEBdDYCvI8BIAJBAEgEQCABIAEvAQBBASAAKALcjwF0ajsBAAtBAQ8LIAQgBUoEQCAAEAUgACgCwI8BIQUgACgCvI8BIQYLIAAgBSAEazYCwI8BIAAgBiAEdyIBIARBAnQiAkHwEWooAgAiBEF/c3E2AryPASABIARxIAJBwBJqKAIAQQAgBkEAThtqCyEEIAAgA0HIAGxqQbSNAWoiASABKAIAIARqIgE2AgAgCCABIAAoAtyPAXQ7AQBBAQuTCAEHfwJAIAAoAsCPAUEPSg0AIAAQBSAAKALAjwFBD0oNACAAEAULAkACQAJAIAIgACgCvI8BIgtBF3ZqLQAAIgdB/wFHBEAgACgCwI8BIgkgAiAHakGACmotAAAiCEgNAyAAIAkgCGs2AsCPASAAIAsgCHQ2AryPAQwBCyALQRB2IQlBCiEIA0AgCCIHQQFqIQggCSACIAdBAnQiCmpBhAxqKAIATw0ACyAAKALAjwEhCCAHQRFGDQEgByAISg0CIAIgCiIJakHMDGooAgAhDCAAIAsgB3Q2AryPASAAIAggB2s2AsCPASAMIAlB8BFqKAIAIAtBICAHa3ZxaiEHCyACIAdqQYAIai0AACECIAFBAEGAARAJIQsgACgCwI8BIQggAgR/IAAgAiAISgR/IAAQBSAAKALAjwEFIAgLIAJrIgg2AsCPASAAIAAoAryPASIBIAJ3IgcgAkECdCICQfARaigCACIJQX9zcTYCvI8BIAcgCXEgAkHAEmooAgBBACABQQBOG2oFQQALIQcgACAFQcgAbGpBtI0BaiIBIAEoAgAgB2oiATYCACALIAYvAQAgAWw7AQBBASEFA0AgCEEPTARAIAAQBQsCfyAEIAAoAryPASIBQRd2IghBAXRqLwEAIgIEQCAAIAEgAkEPcSIBdDYCvI8BIAAgACgCwI8BIAFrIgg2AsCPASALIAJBBHZBD3EgBWoiAUGQEWotAABBAXQiBWogBSAGai8BACACwUEIdmw7AQAgAUEBagwBCwJAIAAoAsCPAUEPTAR/IAAQBSAAKAK8jwEiAUEXdgUgCAsgA2otAAAiB0H/AUcEQCAAKALAjwEiCCADIAdqQYAKai0AACICSA0FIAAgCCACayIINgLAjwEgACABIAJ0IgI2AryPAQwBCyABQRB2IQJBCiEIA0AgCCIHQQFqIQggAiADIAdBAnQiCWoiCkGEDGooAgBPDQALIAAoAsCPASEIIAdBEUYNAyAHIAhKDQQgCkHMDGooAgAhDSAAIAEgB3QiAjYCvI8BIAAgCCAHayIINgLAjwEgDSAJQfARaigCACABQSAgB2t2cWohBwsgAyAHakGACGotAAAiB0EPcSIBRQRAIAdB8AFHBEBBAQ8LIAVBEGoMAQsgB0EEdiAFaiIFQZARai0AACEHIAEgCEoEQCAAEAUgACgCwI8BIQggACgCvI8BIQILIAAgCCABayIINgLAjwEgACACIAF3IgkgAUECdCIBQfARaigCACIKQX9zcTYCvI8BIAsgB0EBdCIHaiAGIAdqLwEAIAkgCnEgAUHAEmooAgBBACACQQBOG2psOwEAIAVBAWoLIgVBwABIDQALQQEPCyAAIAhBEGs2AsCPAQtB8M4AQfUONgIAQQAL8AcCDH8BfEEJIQdBECEIAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkAgACgCCCIGQQJrDgUDBgABAgQLIAAoAgAiCkECdCELIAAoAhQhDEELIQdBDiEIQQQhCSAEIQUMCwtBDCEHQRIhCAwBC0ENIQdBEyEICyAAKAIUIQxBAgwBC0EBIQkgACgCFCEMIAZBAUYNBkEPIQhBCCEHQQQLIgkgACgCACIKbCELIAQhBQJAIAZBAmsOBQACBwMEBQsCfyAEQQh2Qf8BcbhEXW3F/rJ7sj+iIARBEHZB/wFxuESlLEMc6+LmP6IgBEEYdrND0LNZPpS7oKAiEUQAAAAAAADwQWMgEUQAAAAAAAAAAGZxBEAgEasMAQtBAAtBCHRBgP4DcSAEQf8BcXIhBQwGC0EDIQkgACgCACIKQQNsIQsgACgCFCEMQQohB0ERIQgLIARBCHYhBQwECyAEQQt2QR9xIARBEHZBgPADcSAEQQ12QeAPcXJyIQUMAwsgBEEEdkEPcSAEQQh2QfABcSAEQRB2QYDgA3EgBEEMdkGAHnFycnIhBQwCC0EAIQUMAQsgBEH/AXEhBUEIIQdBDyEIIAAoAgAiCyEKCwJAIANBAEgNACADIApPDQAgASACIAEgAkobIgZBAEgNACABIAIgASACSBsiASAAKAIEIg1ODQAgAUEAIAFBAEobIgIgBiANQQFrIAYgDUgbIg1BAWpGDQAgBEH/AXEiBiAEQRh2bCEOIARBCHZB/wFxIAZsIQ8gBEEQdkH/AXEgBmwhECAMIAIgCmwgA2ogCWxqIQQDQCACIQECQCAAKAIMRQ0AIAAoAggiCSAEIAcRAgAQCCEFIAYEQCAFQf8BcSICIAIgBmxB/wFuayICIAVBGHZsIA5qIAIgBmoiA25BGHQgAiAFQRB2Qf8BcWwgEGogA25BEHRyIAIgBUEIdkH/AXFsIA9qIANuQQh0ciADciEFCwJAAkACQAJAAkACQCAJQQFrDgYAAQIGAwQFCyAFQf8BcSEFDAULAn8gBUEIdkH/AXG4RF1txf6ye7I/oiAFQRB2Qf8BcbhEpSxDHOvi5j+iIAVBGHazQ9CzWT6Uu6CgIhFEAAAAAAAA8EFjIBFEAAAAAAAAAABmcQRAIBGrDAELQQALQQh0QYD+A3EgBUH/AXFyIQUMBAsgBUEIdiEFDAMLIAVBC3ZBH3EgBUEQdkGA8ANxIAVBDXZB4A9xcnIhBQwCCyAFQQR2QQ9xIAVBCHZB8AFxIAVBEHZBgOADcSAFQQx2QYAecXJyciEFDAELQQAhBQsgBCAFIAgRAQAgBCALaiEEIAFBAWohAiABIA1HDQALCwsHACAALwEACyQBAX8jAEEQayICIAA2AgwgAiABNgIIIAIoAgwgAigCCDYCCAsYAQF/IwBBEGsiASAANgIMIAEoAgwoAggLJAEBfyMAQRBrIgIgADYCDCACIAE2AgggAigCDCACKAIINgIECxgBAX8jAEEQayIBIAA2AgwgASgCDCgCBAusAQEDfwJAIANBAEwNAEEAIQQgA0EBRwRAIANBfnEhBwNAIAAgBGogAiAEai0AACABIARqLQAAQQNsakECakECdjoAACAAIARBAXIiBmogAiAGai0AACABIAZqLQAAQQNsakECakECdjoAACAEQQJqIQQgBUECaiIFIAdHDQALCyADQQFxRQ0AIAAgBGogAiAEai0AACABIARqLQAAQQNsakECakECdjoAAAsgAAsEACABC+UBAQd/AkAgA0EATA0AIARBAEwNACAEQXxxIQogBEEDcSEJIARBBEkhCwNAIAQgCGwhBSABIAhqIQZBACECQQAhByALRQRAA0AgACACIAVqaiAGLQAAOgAAIAAgAkEBciAFamogBi0AADoAACAAIAJBAnIgBWpqIAYtAAA6AAAgACACQQNyIAVqaiAGLQAAOgAAIAJBBGohAiAHQQRqIgcgCkcNAAsLQQAhByAJBEADQCAAIAIgBWpqIAYtAAA6AAAgAkEBaiECIAdBAWoiByAJRw0ACwsgCEEBaiIIIANHDQALCyAAC+gBAQN/QQEhAiABLQAAIQQgA0EBRgRAIAAgBDoAACAAIAQ6AAEgAA8LIAAgBDoAACAAIAEtAAEgAS0AAEEDbGpBAmpBAnY6AAEgA0EBayEEQQIhBSADQQNOBEADQCAAIAJBAXRqIgUgASACaiIGLQAAQQNsQQJqIgcgBkEBay0AAGpBAnY6AAAgBSAHIAEgAkEBaiICai0AAGpBAnY6AAEgAiAERw0ACyAEQQF0IQULIAAgBWogASAEaiICLQAAIAEgA2pBAmstAABBA2xqQQJqQQJ2OgAAIAAgBUEBcmogAi0AADoAACAACyQBAX8jAEEQayICIAA2AgwgAiABNgIIIAIoAgwgAigCCDYCAAuU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dEGA/gNxIAJB/wFxcgwECyACQQh2IQJBESEEDAQLQRIhBCACQQt2QR9xIAJBEHZBgPADcSACQQ12QeAPcXJyDAILQRMhBCACQQR2QQ9xIAJBCHZB8AFxIAJBEHZBgOADcSACQQx2QYAecXJycgwBC0EPIQRBAAshAgsCQCADIApMIgcNACAJIAtqIgEgCnJBAEgNACABIA9ODQAgCCAAIAEgA2wgCmpsaiACIAQRAQALAkAgBw0AIAsgCWsiASAKckEASA0AIAEgD04NACAIIAAgASADbCAKamxqIAIgBBEBAAsCQCALIA9OIgcNACAJIApqIgEgC3JBAEgNACABIANODQAgCCAAIAMgC2wgAWpsaiACIAQRAQALAkAgBw0AIAogCWsiASALckEASA0AIAEgA04NACAIIAAgAyALbCABamxqIAIgBBEBAAsgCUEASgRAQQAhBwNAIAUgB0EBaiIHQQAgCUEBayIBIAVBAEgiBhtrQQF0aiESAkACQCAJIAEgBhsiCSAHRgRAIAcgCmohBgJAIAcgC2oiASAPTiIODQAgAyAGTA0AIAEgBnJBAEgNACAIIAEgA2wgBmogAGxqIAIgBBEBAAsgCiAHayEFAkAgDg0AIAMgBUwNACABIAVyQQBIDQAgCCABIANsIAVqIABsaiACIAQRAQALAkAgCyAHayIBIA9OIg4NACADIAZMDQAgASAGckEASA0AIAggASADbCAGaiAAbGogAiAEEQEACyAODQIgAyAFTA0CIAEgBXJBAE4NAQwCCyAHIAlODQEgByAKaiEBAkAgCSALaiIGIA9OIg4NACABIANODQAgASAGckEASA0AIAggAyAGbCABaiAAbGogAiAEEQEACyAKIAdrIQUCQCAODQAgAyAFTA0AIAUgBnJBAEgNACAIIAMgBmwgBWogAGxqIAIgBBEBAAsCQCALIAlrIgYgD04iDg0AIAEgA04NACABIAZyQQBIDQAgCCADIAZsIAFqIABsaiACIAQRAQALAkAgDg0AIAMgBUwNACAFIAZyQQBIDQAgCCADIAZsIAVqIABsaiACIAQRAQALIAkgCmohBgJAIAcgC2oiASAPTiIODQAgAyAGTA0AIAEgBnJBAEgNACAIIAEgA2wgBmogAGxqIAIgBBEBAAsgCiAJayEFAkAgDg0AIAMgBUwNACABIAVyQQBI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ASAANgIMIAEoAgwoAgwLIgEBfyMAQRBrIgEkACABIAA2AgwgASgCDBACIAFBEGokAAsLvUGQAQBBgAgLiAlPdXQgb2YgbWVtb3J5AEpQRUcgZm9ybWF0IG5vdCBzdXBwb3J0ZWQ6IDgtYml0IG9ubHkAUE5HIG5vdCBzdXBwb3J0ZWQ6IDEvMi80LzgvMTYtYml0IG9ubHkAUElDIGZpbGUgdG9vIHNob3J0AEltYWdlIG5vdCBvZiBhbnkga25vd24gdHlwZSwgb3IgY29ycnVwdABQUE0gaW1hZ2Ugbm90IDgtYml0AFBTRCBiaXQgZGVwdGggaXMgbm90IDggb3IgMTYgYml0AEpQRUcgZm9ybWF0IG5vdCBzdXBwb3J0ZWQ6IGRlbGF5ZWQgaGVpZ2h0AENhbid0IGZpbmQgb3V0IFRHQSBwaXhlbGZvcm1hdABQU0QgaXMgbm90IGluIFJHQiBjb2xvciBmb3JtYXQAUFNEIGhhcyBhbiB1bmtub3duIGNvbXByZXNzaW9uIGZvcm1hdABVbnN1cHBvcnRlZCBIRFIgZm9ybWF0AHRvbyBtYW55IHBhY2tldHMASW50ZXJuYWwgZXJyb3IAcGFja2V0IGlzbid0IDhicHAAQk1QIHR5cGUgbm90IHN1cHBvcnRlZDogdW5rbm93bgBzY2FubGluZSBvdmVycnVuAHBhY2tldCBoYXMgYmFkIGNvbXByZXNzaW9uIHR5cGUAUE5HIG5vdCBzdXBwb3J0ZWQ6IHVua25vd24gUE5HIGNodW5rIHR5cGUASERSIGltYWdlIGlzIHRvbyBsYXJnZQBHSUYgaW1hZ2UgaXMgdG9vIGxhcmdlAFBOTSB0b28gbGFyZ2UAQ29ycnVwdCBIRFIgaW1hZ2UAQ29ycnVwdCBQU0QgaW1hZ2UAVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzIGluIFBTRCBpbWFnZQBVbnN1cHBvcnRlZCB2ZXJzaW9uIG9mIFBTRCBpbWFnZQBQSUMgaW1hZ2UgdG9vIGxhcmdlIHRvIGRlY29kZQBJbWFnZSB0b28gbGFyZ2UgdG8gZGVjb2RlAEZPUk1BVD0zMi1iaXRfcmxlX3JnYmUAYmFkIFJMRSBkYXRhAFBJQ1QAY29ycnVwdCBIRFIAYmFkIFJMRSBkYXRhIGluIEhEUgBDb3JydXB0IEJNUABiYWQgQk1QAENvcnJ1cHQgUE5HAE5vdCBhIFBORwBDb3JydXB0IEpQRUcAQ29ycnVwdCBHSUYAQk1QIHR5cGUgbm90IHN1cHBvcnRlZDogUkxFACM/UkFESUFOQ0UAIz9SR0JFAENvcnJ1cHQgUFNEAENvcnJ1cHQgVEdBAFOA9jQAZmlsZSB0b28gc2hvcnQgKHB1cmUgcmVhZCBjb3VudCkAZmlsZSB0b28gc2hvcnQgKG1peGVkIHJlYWQgY291bnQpAGZpbGUgdG9vIHNob3J0IChyZWFkaW5nIHBhY2tldHMpAGZpbGUgdG9vIHNob3J0IChwaWMgaGVhZGVyKQBWZXJ5IGxhcmdlIGltYWdlIChjb3JydXB0PykALVkgACtYIAAjP1JBRElBTkNFCgBBkRELUQEIEAkCAwoRGCAZEgsEBQwTGiEoMCkiGxQNBgcOFRwjKjE4OTIrJB0WDxceJSwzOjs0LSYfJy41PD02Lzc+Pz8/Pz8/Pz8/Pz8/Pz8/P1JHQgBB9BELPgEAAAADAAAABwAAAA8AAAAfAAAAPwAAAH8AAAD/AAAA/wEAAP8DAAD/BwAA/w8AAP8fAAD/PwAA/38AAP//AEHEEgtF//////3////5////8f///+H////B////gf///wH///8B/v//Afz//wH4//8B8P//AeD//wHA//8BgP//AP9VABEAAAABAEGUEwsRBAAAAAAAAAACAAAAAAAAAAEAQbgTC1kEAAAAAAAAAAIAAAAAAAAAAQAAAAAAAAAIAAAACAAAAAQAAAAEAAAAAgAAAAIAAAABAAAAAAAAAAgAAAAIAAAACAAAAAQAAAAEAAAAAgAAAAIAAAAAAQAFBgBBpBQLHf8AAABVAAAASQAAABEAAAAhAAAAQQAAAIEAAAABAEHcFAsRAQAAAAAAAAACAAAABAAAAAYAQYAVC9MCCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQkJCQkJCQkJCQkJCQkJCQkJCQkJ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";if(!N(O)){var P=O;O=d.locateFile?d.locateFile(P,t):t+P} function ca(){var a=O;return Promise.resolve().then(()=>{if(a==O&&z)var b=new Uint8Array(z);else{if(N(a)){var c=a.slice(37);if("undefined"!=typeof q&&q)b=Buffer.from(c,"base64"),b=new Uint8Array(b.buffer,b.byteOffset,b.length);else try{var e=atob(c),f=new Uint8Array(e.length);for(c=0;cWebAssembly.instantiate(c,a)).then(c=>c).then(b,c=>{y(`failed to asynchronously prepare wasm: ${c}`);A(c)})}function ea(a,b){return da(a,b)} var Q=a=>{for(;0{if(a){var c=E,e=a+b;for(b=a;c[b]&&!(b>=e);)++b;if(16f?e+=String.fromCharCode(f):(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else e+= diff --git a/examples/freetype/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FreetypeDemo.java b/examples/freetype/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FreetypeDemo.java index 5cb2e7d2..93768134 100644 --- a/examples/freetype/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FreetypeDemo.java +++ b/examples/freetype/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FreetypeDemo.java @@ -59,10 +59,10 @@ public void render() { batch.begin(); font.setColor(Color.RED); - font.draw(batch, "This is a test\nAnd another line\n()����$%&/!12390#", 100, 112); - ftFont.draw(batch, "This is a test\nAnd another line\n()����$%&/!12390#", 100, 112); + font.draw(batch, "This is a test\nAnd another line\n()����$%&/!12390#", 100, 172); + ftFont.draw(batch, "This is a test\nAnd another line\n()����$%&/!12390#", 100, 102); // batch.disableBlending(); - batch.draw(ftFont.getRegion(), 300, 0); + batch.draw(ftFont.getRegion(), 350, 0); // batch.enableBlending(); batch.end(); } diff --git a/examples/gdx-tests/core/src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java b/examples/gdx-tests/core/src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java index b9deb870..9ff85778 100644 --- a/examples/gdx-tests/core/src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java +++ b/examples/gdx-tests/core/src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java @@ -74,6 +74,10 @@ public static TeaVMInstancer[] getTestList() { ArrayList tests = new ArrayList<>(); // QUICK TEST ################################### + add(tests, PixmapBlendingTest::new); + add(tests, PixmapPackerTest::new); + add(tests, PixmapPackerIOTest::new); + add(tests, PixmapTest::new); add(tests, SoundTest::new); add(tests, MusicTest::new); add(tests, TextureDataTest::new); @@ -220,10 +224,6 @@ public static TeaVMInstancer[] getTestList() { add(tests, ParticleEmittersTest::new); add(tests, ParticleEmitterChangeSpriteTest::new); add(tests, PixelsPerInchTest::new); - add(tests, PixmapBlendingTest::new); - add(tests, PixmapPackerTest::new); - add(tests, PixmapPackerIOTest::new); - add(tests, PixmapTest::new); add(tests, PolarAccelerationTest::new); add(tests, PolygonRegionTest::new); add(tests, PolygonSpriteTest::new); diff --git a/examples/gdx-tests/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/GdxTestLauncher.java b/examples/gdx-tests/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/GdxTestLauncher.java index 897ce88d..e92a4d57 100644 --- a/examples/gdx-tests/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/GdxTestLauncher.java +++ b/examples/gdx-tests/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/GdxTestLauncher.java @@ -13,7 +13,6 @@ public static void main(String[] args) { config.height = 0; config.showDownloadLogs = true; config.useGL30 = true; - config.useGLArrayBuffer = true; new TeaApplication(new ImGuiGame(), config); // new TeaApplication(new TeaVMTestWrapper(), config); } diff --git a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/FreeTypeUtil.java b/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/FreeTypeUtil.java deleted file mode 100644 index 01eac64b..00000000 --- a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/FreeTypeUtil.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.badlogic.gdx.graphics; - -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Uint8ClampedArrayWrapper; -import java.nio.ByteBuffer; -import org.teavm.jso.JSBody; - -public class FreeTypeUtil { - - public static ByteBuffer newDirectReadWriteByteBuffer() { - return ByteBuffer.allocate(0); - } - - public static ByteBuffer newDirectReadWriteByteBuffer(Uint8ClampedArrayWrapper int8ArrayWrapper) { - int byteLength = int8ArrayWrapper.getByteLength(); - byte[] copyBytes = new byte[byteLength]; - for(int i = 0; i < byteLength; i++) { - byte b = int8ArrayWrapper.get(i); - copyBytes[i] = b; - } - return ByteBuffer.wrap(copyBytes); - } - - public static ByteBuffer newDirectReadWriteByteBuffer(Int8ArrayWrapper int8ArrayWrapper, int capacity, int arrayOffset) { - int byteLength = int8ArrayWrapper.getByteLength(); - byte[] copyBytes = new byte[byteLength]; - for(int i = 0; i < byteLength; i++) { - byte b = int8ArrayWrapper.get(i); - copyBytes[i] = b; - } - return ByteBuffer.wrap(copyBytes, arrayOffset, capacity); - } - - public static ArrayBufferViewWrapper getTypedArray(ByteBuffer buffer) { - byte[] array = buffer.array(); - return getTypedArray(array); - } - - @JSBody(params = {"buffer"}, script = "" + - "return buffer;") - public static native ArrayBufferViewWrapper getTypedArray(byte[] buffer); -} \ No newline at end of file diff --git a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java b/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java index 4ec86fa6..dbb1c5d5 100644 --- a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java +++ b/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java @@ -1,25 +1,8 @@ -/******************************************************************************* - * Copyright 2011 See AUTHORS file. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ - package com.badlogic.gdx.graphics.g2d.freetype; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.graphics.FreeTypeUtil; import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.utils.BufferUtils; import com.badlogic.gdx.utils.Disposable; @@ -30,6 +13,7 @@ import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; import com.github.xpenatan.gdx.backends.teavm.gen.Emulate; import com.github.xpenatan.gdx.backends.teavm.preloader.Preloader; import java.io.IOException; @@ -40,15 +24,6 @@ @Emulate(valueStr = "com.badlogic.gdx.graphics.g2d.freetype.FreeType") public class FreeTypeEmu { - // @off - /*JNI - #include - #include FT_FREETYPE_H - #include FT_STROKER_H - - static jint lastError = 0; - */ - @JSBody(params = {"address"}, script = "Module._free(address);") private static native void nativeFree(int address); @@ -127,7 +102,7 @@ public FaceEmu newMemoryFace(byte[] data, int dataSize, int faceIndex) { } public FaceEmu newMemoryFace(ByteBuffer buffer, int faceIndex) { - ArrayBufferViewWrapper buf = FreeTypeUtil.getTypedArray(buffer); + ArrayBufferViewWrapper buf = TypedArrays.getTypedArray(buffer); int[] addressToFree = new int[]{0}; // Hacky way to get two return values int face = newMemoryFace(address, buf, buffer.remaining(), faceIndex, addressToFree); @@ -596,7 +571,9 @@ public ByteBuffer getBuffer() { int offset = getBufferAddress(address); int length = getBufferSize(address); Int8ArrayWrapper int8ArrayWrapper = getBuffer(address, offset, length); - ByteBuffer buf = FreeTypeUtil.newDirectReadWriteByteBuffer(int8ArrayWrapper, length, 0); + + byte[] byteArray = TypedArrays.toByteArray(int8ArrayWrapper); + ByteBuffer buf = ByteBuffer.wrap(byteArray, 0, length); return buf; } @@ -899,34 +876,4 @@ public static int toInt(int value) { return ((value + 63) & -64) >> 6; } -// public static void main (String[] args) throws Exception { -// FreetypeBuild.main(args); -// new SharedLibraryLoader("libs/gdx-freetype-natives.jar").load("gdx-freetype"); -// String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890\"!`?'.,;:()[]{}<>|/@\\^$-%+=#_&~*€�?‚ƒ„…†‡ˆ‰Š‹Œ�?Ž�?�?‘’“”•–—˜™š›œ�?žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿À�?ÂÃÄÅÆÇÈÉÊËÌ�?Î�?�?ÑÒÓÔÕÖ×ØÙÚÛÜ�?Þßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"; -// -// Library library = FreeType.initFreeType(); -// Face face = library.newFace(new FileHandle("arial.ttf"), 0); -// face.setPixelSizes(0, 15); -// SizeMetrics faceMetrics = face.getSize().getMetrics(); -// System.out.println(toInt(faceMetrics.getAscender()) + ", " + toInt(faceMetrics.getDescender()) + ", " + toInt(faceMetrics.getHeight())); -// -// for(int i = 0; i < chars.length(); i++) { -// if(!FreeType.loadGlyph(face, FreeType.getCharIndex(face, chars.charAt(i)), 0)) continue; -// if(!FreeType.renderGlyph(face.getGlyph(), FT_RENDER_MODE_NORMAL)) continue; -// Bitmap bitmap = face.getGlyph().getBitmap(); -// GlyphMetrics glyphMetrics = face.getGlyph().getMetrics(); -// System.out.println(toInt(glyphMetrics.getHoriBearingX()) + ", " + toInt(glyphMetrics.getHoriBearingY())); -// System.out.println(toInt(glyphMetrics.getWidth()) + ", " + toInt(glyphMetrics.getHeight()) + ", " + toInt(glyphMetrics.getHoriAdvance())); -// System.out.println(bitmap.getWidth() + ", " + bitmap.getRows() + ", " + bitmap.getPitch() + ", " + bitmap.getNumGray()); -// for(int y = 0; y < bitmap.getRows(); y++) { -// for(int x = 0; x < bitmap.getWidth(); x++) { -// System.out.print(bitmap.getBuffer().get(x + bitmap.getPitch() * y) != 0? "X": " "); -// } -// System.out.println(); -// } -// } -// -// face.dispose(); -// library.dispose(); -// } } \ No newline at end of file From 04957f21539f8868d2bb18fd242b3e16f73aa69e Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 14 May 2024 22:17:32 -0300 Subject: [PATCH 019/114] improvements --- .../com/badlogic/gdx/graphics/PixmapEmu.java | 10 +- .../gdx/graphics/g2d/Gdx2DPixmapEmu.java | 5 +- .../jni/gdx/src/GDX/gdx2d/gdx2d.c | 1 - .../xpenatan/gdx/backends/teavm/TeaGL20.java | 313 ++++++------------ .../xpenatan/gdx/backends/teavm/TeaGL30.java | 142 +++----- .../teavm/dom/typedarray/TypedArrays.java | 4 - .../com/badlogic/gdx/utils/lsans-15.fnt | 246 -------------- .../com/badlogic/gdx/utils/lsans-15.png | Bin 14652 -> 0 bytes .../src/main/resources/gdx.wasm.js | 2 +- 9 files changed, 170 insertions(+), 553 deletions(-) delete mode 100644 backends/backend-teavm/src/main/resources/com/badlogic/gdx/utils/lsans-15.fnt delete mode 100644 backends/backend-teavm/src/main/resources/com/badlogic/gdx/utils/lsans-15.png diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java index 895c431b..9330c14f 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java @@ -22,11 +22,9 @@ public class PixmapEmu implements Disposable { public static PixmapEmu createFromFrameBuffer(int x, int y, int w, int h) { Gdx.gl.glPixelStorei(GL20.GL_PACK_ALIGNMENT, 1); - - final PixmapEmu pixmap = new PixmapEmu(w, h, PixmapEmu.FormatEmu.RGBA8888); + final PixmapEmu pixmap = new PixmapEmu(w, h, FormatEmu.RGBA8888); ByteBuffer pixels = pixmap.getPixels(); Gdx.gl.glReadPixels(x, y, w, h, GL20.GL_RGBA, GL20.GL_UNSIGNED_BYTE, pixels); - return pixmap; } @@ -63,7 +61,7 @@ public static int toGlType (FormatEmu format) { return Gdx2DPixmapEmu.toGlType(toGdx2DPixmapFormat(format)); } } - + Uint8ArrayWrapper nativePixels; ByteBuffer buffer; BlendingEmu blending = PixmapEmu.BlendingEmu.SourceOver; FilterEmu filter = PixmapEmu.FilterEmu.BiLinear; @@ -121,12 +119,14 @@ public PixmapEmu(ByteBuffer encodedData, int offset, int len) { public PixmapEmu(int width, int height, FormatEmu format) { nativePixmap = new Gdx2DPixmapEmu(width, height, PixmapEmu.FormatEmu.toGdx2DPixmapFormat(format)); + setColor(0, 0, 0, 0); + fill(); initPixmapEmu(); } private void initPixmapEmu() { if(nativePixmap != null) { - Uint8ArrayWrapper nativePixels = nativePixmap.getPixels(); + nativePixels = nativePixmap.getPixels(); byte[] byteArray = TypedArrays.toByteArray(nativePixels); buffer = ByteBuffer.wrap(byteArray); } diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/g2d/Gdx2DPixmapEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/g2d/Gdx2DPixmapEmu.java index 8314156a..656ae2f1 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/g2d/Gdx2DPixmapEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/g2d/Gdx2DPixmapEmu.java @@ -3,14 +3,13 @@ import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.utils.Disposable; import com.badlogic.gdx.utils.GdxRuntimeException; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Uint8ArrayWrapper; -import java.io.IOException; +import com.github.xpenatan.gdx.backends.teavm.gen.Emulate; import java.io.InputStream; -import java.nio.ByteBuffer; import org.teavm.jso.JSBody; import org.teavm.jso.JSByRef; +@Emulate(Gdx2DPixmap.class) public class Gdx2DPixmapEmu implements Disposable { public static final int GDX2D_FORMAT_ALPHA = 1; public static final int GDX2D_FORMAT_LUMINANCE_ALPHA = 2; diff --git a/backends/backend-teavm/jni/gdx/src/GDX/gdx2d/gdx2d.c b/backends/backend-teavm/jni/gdx/src/GDX/gdx2d/gdx2d.c index 64c573cb..f37a3f4d 100644 --- a/backends/backend-teavm/jni/gdx/src/GDX/gdx2d/gdx2d.c +++ b/backends/backend-teavm/jni/gdx/src/GDX/gdx2d/gdx2d.c @@ -270,7 +270,6 @@ gdx2d_pixmap* gdx2d_new(uint32_t width, uint32_t height, uint32_t format) { free((void*)pixmap); return 0; } - memset(pixels, 0, size); return pixmap; } void gdx2d_free(const gdx2d_pixmap* pixmap) { diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java index cb0b8f5a..066afb37 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java @@ -1,9 +1,7 @@ package com.github.xpenatan.gdx.backends.teavm; import com.badlogic.gdx.graphics.GL20; -import com.badlogic.gdx.graphics.g2d.Gdx2DPixmapEmu; import com.badlogic.gdx.utils.GdxRuntimeException; -import com.badlogic.gdx.utils.IntMap; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Float32ArrayWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int16ArrayWrapper; @@ -21,17 +19,14 @@ import com.github.xpenatan.gdx.backends.teavm.gl.WebGLShaderWrapper; import com.github.xpenatan.gdx.backends.teavm.gl.WebGLTextureWrapper; import com.github.xpenatan.gdx.backends.teavm.gl.WebGLUniformLocationWrapper; -import com.github.xpenatan.gdx.backends.teavm.utils.TeaNativeHelper; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.nio.ShortBuffer; -import java.util.Iterator; -import org.teavm.jso.typedarrays.Float32Array; -import org.teavm.jso.typedarrays.Int16Array; -import org.teavm.jso.typedarrays.Int32Array; -import org.teavm.jso.typedarrays.Int8Array; +import org.teavm.jso.JSBody; +import org.teavm.jso.JSClass; +import org.teavm.jso.JSObject; import org.teavm.jso.typedarrays.Uint8Array; /** @@ -42,159 +37,66 @@ @Emulate(TeaGL20.class) public class TeaGL20 implements GL20 { - protected WebGLRenderingContextWrapper gl; - - private int nextProgramId = 1; - private int nextShaderId = 1; - private int nextBufferId = 1; - private int nextFrameBufferId = 1; - private int nextRenderBufferId = 1; - private int nextTextureId = 1; - private int nextUniformId = 1; - - protected final IntMap programs = new IntMap<>(); - private final IntMap shaders = new IntMap<>(); - protected final IntMap buffers = new IntMap<>(); - protected final IntMap frameBuffers = new IntMap<>(); - private final IntMap renderBuffers = new IntMap<>(); - protected final IntMap textures = new IntMap<>(); - private final IntMap> uniforms = new IntMap<>(); - private int currProgram = 0; + @JSClass + static class CustomIntMap implements JSObject { + @JSBody(script = "return [undefined];") + public static native CustomIntMap create(); - private Float32ArrayWrapper floatBuffer = (Float32ArrayWrapper)Float32Array.create(2000 * 20); - private Int32ArrayWrapper intBuffer = (Int32ArrayWrapper)Int32Array.create(2000 * 6); - private Int16ArrayWrapper shortBuffer = (Int16ArrayWrapper)Int16Array.create(2000 * 6); - protected Int8ArrayWrapper byteBuffer = (Int8ArrayWrapper)Int8Array.create(2000 * 6); + @JSBody(params = { "key" }, script = "if(this[key] === undefined) return null; return this[key];") + public native T get (int key); - public TeaGL20(WebGLRenderingContextWrapper gl) { - this.gl = gl; - this.gl.pixelStorei(WebGLRenderingContextWrapper.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0); - } + @JSBody(params = { "key", "value" }, script = "this[key] = value;") + public native void put (int key, T value); - private int allocateProgramId(WebGLProgramWrapper program) { - int id = nextProgramId++; - programs.put(id, program); - return id; - } + @JSBody(params = { "value" }, script = "this.push(value); return this.length - 1") + public native int add (T value); - private int allocateShaderId(WebGLShaderWrapper shader) { - int id = nextShaderId++; - shaders.put(id, shader); - return id; - } - - private int allocateBufferId(WebGLBufferWrapper buffer) { - int id = nextBufferId++; - buffers.put(id, buffer); - return id; - } - - private int allocateTextureId(WebGLTextureWrapper texture) { - int id = nextTextureId++; - textures.put(id, texture); - return id; - } - - private int allocateFrameBufferId(WebGLFramebufferWrapper frameBuffer) { - int id = nextFrameBufferId++; - frameBuffers.put(id, frameBuffer); - return id; - } + @JSBody(params = { "key" }, script = "var value = this[key]; delete this[key]; return value;") + public native T remove (int key); - private int allocateRenderBufferId(WebGLRenderbufferWrapper renderBuffer) { - int id = nextRenderBufferId++; - renderBuffers.put(id, renderBuffer); - return id; + @JSBody(params = { "value" }, script = "for (i = 0; i < this.length; i++) { if (value === this[i]) { return i; } }") + public native int getKey (T value); } - private int allocateUniformLocationId(int program, WebGLUniformLocationWrapper location) { - IntMap progUniforms = uniforms.get(program); - if(progUniforms == null) { - progUniforms = new IntMap<>(); - uniforms.put(program, progUniforms); - } - int id = nextUniformId++; - progUniforms.put(id, location); - return id; - } + protected WebGLRenderingContextWrapper gl; - protected int getKey(WebGLFramebufferWrapper value) { - Iterator> iterator = frameBuffers.iterator(); - while(iterator.hasNext()) { - IntMap.Entry next = iterator.next(); - int key = next.key; - if(TeaNativeHelper.compareObject(value, next.value)) { - return key; - } - } - return -1; - } + final CustomIntMap programs = CustomIntMap.create(); + final CustomIntMap shaders = CustomIntMap.create(); + final CustomIntMap buffers = CustomIntMap.create(); + final CustomIntMap frameBuffers = CustomIntMap.create(); + final CustomIntMap renderBuffers = CustomIntMap.create(); + final CustomIntMap textures = CustomIntMap.create(); + final CustomIntMap> uniforms = CustomIntMap.create(); + private int currProgram = 0; - protected int getKey(WebGLTextureWrapper value) { - Iterator> iterator = textures.iterator(); - while(iterator.hasNext()) { - IntMap.Entry next = iterator.next(); - int key = next.key; - if(TeaNativeHelper.compareObject(value, next.value)) { - return key; - } - } - return -1; + public TeaGL20(WebGLRenderingContextWrapper gl) { + this.gl = gl; + this.gl.pixelStorei(WebGLRenderingContextWrapper.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0); } public Float32ArrayWrapper copy(FloatBuffer buffer) { ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray(buffer); - return TypedArrays.createFloat32Array(typedArray.getBuffer(), buffer.position(), buffer.remaining()); + return TypedArrays.createFloat32Array(typedArray.getBuffer(), 0); } public Int16ArrayWrapper copy(ShortBuffer buffer) { ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray(buffer); - return TypedArrays.createInt16Array(typedArray.getBuffer(), buffer.position(), buffer.remaining()); + return TypedArrays.createInt16Array(typedArray.getBuffer(), 0); } public Int32ArrayWrapper copy(IntBuffer buffer) { ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray(buffer); - return TypedArrays.createInt32Array(typedArray.getBuffer(), buffer.position(), buffer.remaining()); + return TypedArrays.createInt32Array(typedArray.getBuffer(), 0); } public Int8ArrayWrapper copy(ByteBuffer buffer) { return (Int8ArrayWrapper)TypedArrays.getTypedArray(buffer); } - private void ensureCapacity(FloatBuffer buffer) { - if(buffer.remaining() > floatBuffer.getLength()) { - floatBuffer = TypedArrays.createFloat32Array(buffer.remaining()); - } - } - - private void ensureCapacity(ShortBuffer buffer) { - if(buffer.remaining() > shortBuffer.getLength()) { - shortBuffer = TypedArrays.createInt16Array(buffer.remaining()); - } - } - - protected void ensureCapacity(IntBuffer buffer) { - if(buffer.remaining() > intBuffer.getLength()) { - intBuffer = TypedArrays.createInt32Array(buffer.remaining()); - } - } - - private void ensureCapacity(ByteBuffer buffer) { - if(buffer.remaining() > byteBuffer.getLength()) { - byteBuffer = TypedArrays.createInt8Array(buffer.remaining()); - } - } - protected WebGLUniformLocationWrapper getUniformLocation(int location) { return uniforms.get(currProgram).get(location); } - // - // - // Public methods. Please keep ordered ----------------------------------------------------------------------------- - // - // - @Override public void glActiveTexture(int texture) { gl.activeTexture(texture); @@ -261,16 +163,20 @@ public void glBlendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlp @Override public void glBufferData(int target, int size, Buffer data, int usage) { if(data instanceof FloatBuffer) { - gl.bufferData(target, copy((FloatBuffer)data), usage); + ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray((FloatBuffer)data); + gl.bufferData(target, typedArray, usage); } else if(data instanceof IntBuffer) { - gl.bufferData(target, copy((IntBuffer)data), usage); + ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray((IntBuffer)data); + gl.bufferData(target, typedArray, usage); } else if(data instanceof ShortBuffer) { - gl.bufferData(target, copy((ShortBuffer)data), usage); + ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray((ShortBuffer)data); + gl.bufferData(target, typedArray, usage); } else if(data instanceof ByteBuffer) { - gl.bufferData(target, copy((ByteBuffer)data), usage); + ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray((ByteBuffer)data); + gl.bufferData(target, typedArray, usage); } else if(data == null) { gl.bufferData(target, size, usage); @@ -283,16 +189,20 @@ else if(data == null) { @Override public void glBufferSubData(int target, int offset, int size, Buffer data) { if(data instanceof FloatBuffer) { - gl.bufferSubData(target, offset, copy((FloatBuffer)data)); + ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray((FloatBuffer)data); + gl.bufferSubData(target, offset, typedArray); } else if(data instanceof IntBuffer) { - gl.bufferSubData(target, offset, copy((IntBuffer)data)); + ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray((IntBuffer)data); + gl.bufferSubData(target, offset, typedArray); } else if(data instanceof ShortBuffer) { - gl.bufferSubData(target, offset, copy((ShortBuffer)data)); + ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray((ShortBuffer)data); + gl.bufferSubData(target, offset, typedArray); } else if(data instanceof ByteBuffer) { - gl.bufferSubData(target, offset, copy((ByteBuffer)data)); + ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray((ByteBuffer)data); + gl.bufferSubData(target, offset, typedArray); } else { throw new GdxRuntimeException("Can only cope with FloatBuffer and ShortBuffer at the moment"); @@ -360,13 +270,13 @@ public void glCopyTexSubImage2D(int target, int level, int xoffset, int yoffset, @Override public int glCreateProgram() { WebGLProgramWrapper program = gl.createProgram(); - return allocateProgramId(program); + return programs.add(program); } @Override public int glCreateShader(int type) { WebGLShaderWrapper shader = gl.createShader(type); - return allocateShaderId(shader); + return shaders.add(shader); } @Override @@ -531,17 +441,17 @@ public void glFrontFace(int mode) { @Override public int glGenBuffer() { WebGLBufferWrapper buffer = gl.createBuffer(); - return allocateBufferId(buffer); + return buffers.add(buffer); } @Override public void glGenBuffers(int n, IntBuffer buffers) { for(int i = 0; i < n; i++) { WebGLBufferWrapper buffer = gl.createBuffer(); - int id = allocateBufferId(buffer); + int id = this.buffers.add(buffer); buffers.put(id); } - buffers.clear(); + buffers.limit(n); } @Override @@ -552,68 +462,68 @@ public void glGenerateMipmap(int target) { @Override public int glGenFramebuffer() { WebGLFramebufferWrapper fb = gl.createFramebuffer(); - return allocateFrameBufferId(fb); + return frameBuffers.add(fb); } @Override public void glGenFramebuffers(int n, IntBuffer framebuffers) { for(int i = 0; i < n; i++) { WebGLFramebufferWrapper fb = gl.createFramebuffer(); - int id = allocateFrameBufferId(fb); + int id = this.frameBuffers.add(fb); framebuffers.put(id); } - framebuffers.clear(); + framebuffers.limit(n); } @Override public int glGenRenderbuffer() { WebGLRenderbufferWrapper rb = gl.createRenderbuffer(); - return allocateRenderBufferId(rb); + return renderBuffers.add(rb); } @Override public void glGenRenderbuffers(int n, IntBuffer renderbuffers) { for(int i = 0; i < n; i++) { WebGLRenderbufferWrapper rb = gl.createRenderbuffer(); - int id = allocateRenderBufferId(rb); + int id = this.renderBuffers.add(rb); renderbuffers.put(id); } - renderbuffers.clear(); + renderbuffers.limit(n); } @Override public int glGenTexture() { WebGLTextureWrapper texture = gl.createTexture(); - return allocateTextureId(texture); + return textures.add(texture); } @Override public void glGenTextures(int n, IntBuffer textures) { for(int i = 0; i < n; i++) { WebGLTextureWrapper texture = gl.createTexture(); - int id = allocateTextureId(texture); + int id = this.textures.add(texture); textures.put(id); } - textures.clear(); + textures.limit(n); } @Override public String glGetActiveAttrib(int program, int index, IntBuffer size, IntBuffer type) { - WebGLActiveInfoWrapper activeAttrib = gl.getActiveAttrib(programs.get(program), index); - size.put(activeAttrib.getSize()); - type.put(activeAttrib.getType()); - size.clear(); - type.clear(); - return activeAttrib.getName(); + WebGLActiveInfoWrapper activeUniform = gl.getActiveAttrib(programs.get(program), index); + size.put(activeUniform.getSize()); + size.flip(); + type.put(activeUniform.getType()); + type.flip(); + return activeUniform.getName(); } @Override public String glGetActiveUniform(int program, int index, IntBuffer size, IntBuffer type) { WebGLActiveInfoWrapper activeUniform = gl.getActiveUniform(programs.get(program), index); size.put(activeUniform.getSize()); + size.flip(); type.put(activeUniform.getType()); - size.clear(); - type.clear(); + type.flip(); return activeUniform.getName(); } @@ -650,10 +560,10 @@ public void glGetFloatv(int pname, FloatBuffer params) { if(pname == GL20.GL_DEPTH_CLEAR_VALUE || pname == GL20.GL_LINE_WIDTH || pname == GL20.GL_POLYGON_OFFSET_FACTOR || pname == GL20.GL_POLYGON_OFFSET_UNITS || pname == GL20.GL_SAMPLE_COVERAGE_VALUE) { params.put(0, gl.getParameterf(pname)); + params.limit(1); } else throw new GdxRuntimeException("glGetFloat not supported by WebGL backend"); - params.clear(); } @Override @@ -663,6 +573,7 @@ public void glGetFramebufferAttachmentParameteriv(int target, int attachment, in case GL20.GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: case GL20.GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: params.put(0, gl.getFramebufferAttachmentParameteri(target, attachment, pname)); + params.limit(1); break; case GL20.GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: WebGLTextureWrapper tex = (WebGLTextureWrapper)gl.getParametero(pname); @@ -670,13 +581,13 @@ public void glGetFramebufferAttachmentParameteriv(int target, int attachment, in params.put(0); } else { - params.put(getKey(tex)); + params.put(textures.getKey(tex)); } + params.flip(); return; default: throw new GdxRuntimeException("glGetFramebufferAttachmentParameteriv Invalid enum for WebGL backend."); } - params.clear(); } @Override @@ -701,6 +612,7 @@ public void glGetIntegerv(int pname, IntBuffer params) { || pname == GL20.GL_STENCIL_PASS_DEPTH_PASS || pname == GL20.GL_STENCIL_REF || pname == GL20.GL_STENCIL_VALUE_MASK || pname == GL20.GL_STENCIL_WRITEMASK || pname == GL20.GL_SUBPIXEL_BITS || pname == GL20.GL_UNPACK_ALIGNMENT) { params.put(0, gl.getParameteri(pname)); + params.limit(1); } else if(pname == GL20.GL_VIEWPORT) { Int32ArrayWrapper array = (Int32ArrayWrapper)gl.getParameterv(pname); @@ -708,6 +620,7 @@ else if(pname == GL20.GL_VIEWPORT) { params.put(1, array.get(1)); params.put(2, array.get(2)); params.put(3, array.get(3)); + params.limit(4); } else if(pname == GL20.GL_FRAMEBUFFER_BINDING) { WebGLFramebufferWrapper fbo = (WebGLFramebufferWrapper)gl.getParametero(pname); @@ -715,12 +628,12 @@ else if(pname == GL20.GL_FRAMEBUFFER_BINDING) { params.put(0); } else { - params.put(getKey(fbo)); + params.put(frameBuffers.getKey(fbo)); } + params.flip(); } else throw new GdxRuntimeException("glGetInteger not supported by WebGL backend"); - params.clear(); } @Override @@ -737,7 +650,7 @@ public void glGetProgramiv(int program, int pname, IntBuffer params) { else { params.put(gl.getProgramParameteri(programs.get(program), pname)); } - params.clear(); + params.flip(); } @Override @@ -761,7 +674,7 @@ public void glGetShaderiv(int shader, int pname, IntBuffer params) { int result = gl.getShaderParameteri(shaders.get(shader), pname); params.put(result); } - params.clear(); + params.flip(); } @Override @@ -801,7 +714,14 @@ public int glGetUniformLocation(int program, String name) { WebGLUniformLocationWrapper location = gl.getUniformLocation(programs.get(program), name); if(location == null) return -1; - return allocateUniformLocationId(program, location); + + CustomIntMap progUniforms = uniforms.get(program); + if(progUniforms == null) { + progUniforms = CustomIntMap.create(); + uniforms.put(program, progUniforms); + } + int id = progUniforms.add(location); + return id; } @Override @@ -888,25 +808,23 @@ public void glReadPixels(int x, int y, int width, int height, int format, int ty throw new GdxRuntimeException( "Only format RGBA and type UNSIGNED_BYTE are currently supported for glReadPixels(...). Create an issue when you need other formats."); } - if(!(pixels instanceof ByteBuffer)) { - throw new GdxRuntimeException("Inputed pixels buffer needs to be of type ByteBuffer for glReadPixels(...)."); + ArrayBufferViewWrapper typedArray = null; + if(pixels instanceof ByteBuffer) { + typedArray = TypedArrays.getTypedArray((ByteBuffer)pixels); } - ByteBuffer buffer = (ByteBuffer)pixels; - - // create new ArrayBufferView (4 bytes per pixel) - int size = 4 * width * height; - - Uint8ArrayWrapper arrayWrapper = (Uint8ArrayWrapper)Uint8Array.create(size); - - // read bytes to ArrayBufferView - gl.readPixels(x, y, width, height, format, type, arrayWrapper); - - buffer.put(arrayWrapper.get(0)); - buffer.put(arrayWrapper.get(1)); - buffer.put(arrayWrapper.get(2)); - buffer.put(arrayWrapper.get(3)); - - buffer.clear(); + else if(pixels instanceof FloatBuffer) { + typedArray = TypedArrays.getTypedArray((FloatBuffer)pixels); + } + else if(pixels instanceof ShortBuffer) { + typedArray = TypedArrays.getTypedArray((ShortBuffer)pixels); + } + else if(pixels instanceof IntBuffer) { + typedArray = TypedArrays.getTypedArray((IntBuffer)pixels); + } + else { + throw new GdxRuntimeException("Inputed pixels buffer not supported."); + } + gl.readPixels(x, y, width, height, format, type, typedArray); } @Override @@ -969,23 +887,6 @@ public void glStencilOpSeparate(int face, int fail, int zfail, int zpass) { gl.stencilOpSeparate(face, fail, zfail, zpass); } - private Uint8ArrayWrapper byteBufferU = (Uint8ArrayWrapper)Uint8Array.create(2000 * 6 * 20); - - public Uint8ArrayWrapper copyUI8(ByteBuffer buffer) { - ensureCapacityU(buffer); - for(int i = buffer.position(), j = 0; i < buffer.limit(); i++, j++) { - byteBufferU.set(j, buffer.get(i)); - } - return byteBufferU.subarray(0, buffer.remaining()); - } - - private void ensureCapacityU(ByteBuffer buffer) { - if(buffer.remaining() > byteBufferU.getLength()) { - byteBufferU = (Uint8ArrayWrapper)Uint8Array.create(buffer.remaining()); - } - } - int pass = 0; - @Override public void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, Buffer pixels) { if(pixels == null) { @@ -999,17 +900,18 @@ public void glTexImage2D(int target, int level, int internalformat, int width, i int remainingBytes = pixels.remaining(); int byteOffset = typedArrayBuffer.getByteOffset() + pixels.position(); buffer = TypedArrays.createUint8Array(typedArrayBuffer.getBuffer(), byteOffset, remainingBytes); + gl.texImage2D(target, level, internalformat, width, height, border, format, type, buffer); } else if(pixels instanceof FloatBuffer) { ArrayBufferViewWrapper typedArrayBuffer = TypedArrays.getTypedArray((FloatBuffer)pixels); int remainingBytes = pixels.remaining(); int byteOffset = typedArrayBuffer.getByteOffset() + pixels.position(); buffer = TypedArrays.createFloat32Array(typedArrayBuffer.getBuffer(), byteOffset, remainingBytes); + gl.texImage2D(target, level, internalformat, width, height, border, format, type, buffer); } else { throw new GdxRuntimeException("Not supported buffer"); } - gl.texImage2D(target, level, internalformat, width, height, border, format, type, buffer); } @Override @@ -1020,17 +922,18 @@ public void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int int remainingBytes = pixels.remaining(); int byteOffset = typedArrayBuffer.getByteOffset() + pixels.position(); buffer = TypedArrays.createUint8Array(typedArrayBuffer.getBuffer(), byteOffset, remainingBytes); + gl.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, buffer); } else if(pixels instanceof FloatBuffer) { ArrayBufferViewWrapper typedArrayBuffer = TypedArrays.getTypedArray((FloatBuffer)pixels); int remainingBytes = pixels.remaining(); int byteOffset = typedArrayBuffer.getByteOffset() + pixels.position(); buffer = TypedArrays.createFloat32Array(typedArrayBuffer.getBuffer(), byteOffset, remainingBytes); + gl.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, buffer); } else { throw new GdxRuntimeException("Not supported buffer"); } - gl.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, buffer); } @Override diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL30.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL30.java index 7e24e8c6..58cc0061 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL30.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL30.java @@ -3,7 +3,6 @@ import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.GL30; import com.badlogic.gdx.utils.GdxRuntimeException; -import com.badlogic.gdx.utils.IntMap; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Uint32ArrayWrapper; @@ -16,13 +15,11 @@ import com.github.xpenatan.gdx.backends.teavm.gl.WebGLTransformFeedbackWrapper; import com.github.xpenatan.gdx.backends.teavm.gl.WebGLUniformLocationWrapper; import com.github.xpenatan.gdx.backends.teavm.gl.WebGLVertexArrayObjectWrapper; -import com.github.xpenatan.gdx.backends.teavm.utils.TeaNativeHelper; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.nio.LongBuffer; -import java.util.Iterator; import org.teavm.jso.core.JSArray; /** @@ -35,86 +32,33 @@ public class TeaGL30 extends TeaGL20 implements GL30 { protected WebGL2RenderingContextWrapper gl; - private final IntMap queries = new IntMap<>(); - private int nextQueryId = 1; - private final IntMap samplers = new IntMap<>(); - private int nextSamplerId = 1; - private final IntMap feedbacks = new IntMap<>(); - private int nextFeedbackId = 1; - private final IntMap vertexArrays = new IntMap<>(); - private int nextVertexArrayId = 1; - protected Uint32ArrayWrapper uIntBuffer = TypedArrays.createUint32Array(2000 * 6); + final CustomIntMap queries = CustomIntMap.create(); + final CustomIntMap samplers = CustomIntMap.create(); + final CustomIntMap feedbacks = CustomIntMap.create(); + final CustomIntMap vertexArrays = CustomIntMap.create(); public TeaGL30(WebGL2RenderingContextWrapper gl) { super(gl); this.gl = gl; } - protected int getKey(WebGLVertexArrayObjectWrapper value) { - Iterator> iterator = vertexArrays.iterator(); - while(iterator.hasNext()) { - IntMap.Entry next = iterator.next(); - int key = next.key; - if(TeaNativeHelper.compareObject(value, next.value)) { - return key; - } - } - return -1; - } - - protected int getKey(WebGLQueryWrapper value) { - Iterator> iterator = queries.iterator(); - while(iterator.hasNext()) { - IntMap.Entry next = iterator.next(); - int key = next.key; - if(TeaNativeHelper.compareObject(value, next.value)) { - return key; - } - } - return -1; - } - private Uint32ArrayWrapper copyUnsigned(IntBuffer buffer) { ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray(buffer); return TypedArrays.createUint32Array(typedArray.getBuffer(), buffer.position(), buffer.remaining()); } - private int allocateQueryId(WebGLQueryWrapper query) { - int id = nextQueryId++; - queries.put(id, query); - return id; - } - private void deallocateQueryId(int id) { queries.remove(id); } - private int allocateSamplerId(WebGLSamplerWrapper query) { - int id = nextSamplerId++; - samplers.put(id, query); - return id; - } - private void deallocateFeedbackId(int id) { feedbacks.remove(id); } - private int allocateFeedbackId(WebGLTransformFeedbackWrapper feedback) { - int id = nextFeedbackId++; - feedbacks.put(id, feedback); - return id; - } - private void deallocateSamplerId(int id) { samplers.remove(id); } - private int allocateVertexArrayId(WebGLVertexArrayObjectWrapper vArray) { - int id = nextVertexArrayId++; - vertexArrays.put(id, vArray); - return id; - } - private void deallocateVertexArrayId(int id) { vertexArrays.remove(id); } @@ -335,7 +279,7 @@ public void glFramebufferTextureLayer(int target, int attachment, int texture, i public void glGenQueries(int n, int[] ids, int offset) { for(int i = offset; i < offset + n; i++) { WebGLQueryWrapper query = gl.createQuery(); - int id = allocateQueryId(query); + int id = queries.add(query); ids[i] = id; } } @@ -345,18 +289,18 @@ public void glGenQueries(int n, IntBuffer ids) { int startPosition = ids.position(); for(int i = 0; i < n; i++) { WebGLQueryWrapper query = gl.createQuery(); - int id = allocateQueryId(query); + int id = queries.add(query); ids.put(id); } ids.position(startPosition); } @Override - public void glGenSamplers(int count, int[] samplers, int offset) { + public void glGenSamplers(int count, int[] samplerr, int offset) { for(int i = offset; i < offset + count; i++) { WebGLSamplerWrapper sampler = gl.createSampler(); - int id = allocateSamplerId(sampler); - samplers[i] = id; + int id = samplers.add(sampler); + samplerr[i] = id; } } @@ -365,7 +309,7 @@ public void glGenSamplers(int n, IntBuffer ids) { int startPosition = ids.position(); for(int i = 0; i < n; i++) { WebGLSamplerWrapper sampler = gl.createSampler(); - int id = allocateSamplerId(sampler); + int id = samplers.add(sampler); ids.put(id); } ids.position(startPosition); @@ -375,7 +319,7 @@ public void glGenSamplers(int n, IntBuffer ids) { public void glGenTransformFeedbacks(int n, int[] ids, int offset) { for(int i = offset; i < offset + n; i++) { WebGLTransformFeedbackWrapper feedback = gl.createTransformFeedback(); - int id = allocateFeedbackId(feedback); + int id = feedbacks.add(feedback); ids[i] = id; } } @@ -385,7 +329,7 @@ public void glGenTransformFeedbacks(int n, IntBuffer ids) { int startPosition = ids.position(); for(int i = 0; i < n; i++) { WebGLTransformFeedbackWrapper feedback = gl.createTransformFeedback(); - int id = allocateFeedbackId(feedback); + int id = feedbacks.add(feedback); ids.put(id); } ids.position(startPosition); @@ -395,7 +339,7 @@ public void glGenTransformFeedbacks(int n, IntBuffer ids) { public void glGenVertexArrays(int n, int[] arrays, int offset) { for(int i = offset; i < offset + n; i++) { WebGLVertexArrayObjectWrapper vArray = gl.createVertexArray(); - int id = allocateVertexArrayId(vArray); + int id = vertexArrays.add(vArray); arrays[i] = id; } } @@ -405,7 +349,7 @@ public void glGenVertexArrays(int n, IntBuffer ids) { int startPosition = ids.position(); for(int i = 0; i < n; i++) { WebGLVertexArrayObjectWrapper vArray = gl.createVertexArray(); - int id = allocateVertexArrayId(vArray); + int id = vertexArrays.add(vArray); ids.put(id); } ids.position(startPosition); @@ -431,7 +375,7 @@ else if(pname == GL30.GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER else { throw new GdxRuntimeException("Unsupported pname passed to glGetActiveUniformBlockiv"); } - params.clear(); + params.flip(); } @Override @@ -458,7 +402,7 @@ public void glGetActiveUniformsiv(int program, int uniformCount, IntBuffer unifo params.put(i, arr.get(i)); } } - params.clear(); + params.limit(uniformCount); } @Override @@ -476,7 +420,7 @@ public void glGetFloatv(int pname, FloatBuffer params) { // Override GwtGL20 method to check if it's a pname introduced with GL30. if(pname == GL30.GL_MAX_TEXTURE_LOD_BIAS) { params.put(0, gl.getParameterf(pname)); - params.clear(); + params.limit(1); } else { super.glGetFloatv(pname, params); @@ -534,7 +478,7 @@ public void glGetIntegerv(int pname, IntBuffer params) { case GL30.GL_UNPACK_SKIP_PIXELS: case GL30.GL_UNPACK_SKIP_ROWS: params.put(0, gl.getParameteri(pname)); - params.clear(); + params.limit(1); return; case GL30.GL_DRAW_FRAMEBUFFER_BINDING: case GL30.GL_READ_FRAMEBUFFER_BINDING: @@ -543,9 +487,9 @@ public void glGetIntegerv(int pname, IntBuffer params) { params.put(0); } else { - params.put(getKey(fbo)); + params.put(frameBuffers.getKey(fbo)); } - params.clear(); + params.flip(); return; case GL30.GL_TEXTURE_BINDING_2D_ARRAY: case GL30.GL_TEXTURE_BINDING_3D: @@ -554,9 +498,9 @@ public void glGetIntegerv(int pname, IntBuffer params) { params.put(0); } else { - params.put(getKey(tex)); + params.put(textures.getKey(tex)); } - params.clear(); + params.flip(); return; case GL30.GL_VERTEX_ARRAY_BINDING: WebGLVertexArrayObjectWrapper obj = (WebGLVertexArrayObjectWrapper)gl.getParametero(pname); @@ -564,9 +508,9 @@ public void glGetIntegerv(int pname, IntBuffer params) { params.put(0); } else { - params.put(getKey(obj)); + params.put(vertexArrays.getKey(obj)); } - params.clear(); + params.flip(); return; default: // Assume it is a GL20 pname @@ -583,13 +527,34 @@ public void glGetInteger64v(int pname, LongBuffer params) { case GL30.GL_MAX_SERVER_WAIT_TIMEOUT: case GL30.GL_MAX_UNIFORM_BLOCK_SIZE: params.put(gl.getParameteri64(pname)); - params.clear(); + params.flip(); return; default: throw new UnsupportedOperationException("Given glGetInteger64v enum not supported on WebGL2"); } } + @Override + public void glGetFramebufferAttachmentParameteriv (int target, int attachment, int pname, IntBuffer params) { + switch (pname) { + case GL30.GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: + case GL30.GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: + case GL30.GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: + case GL30.GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: + case GL30.GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: + case GL30.GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: + case GL30.GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE: + case GL30.GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: + case GL30.GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: + params.put(0, gl.getFramebufferAttachmentParameteri(target, attachment, pname)); + params.limit(1); + break; + default: + // Assume it is a GL20 pname + super.glGetFramebufferAttachmentParameteriv(target, attachment, pname, params); + } + } + @Override public void glGetQueryiv(int target, int pname, IntBuffer params) { // Not 100% clear on this one. Returning the integer key for the query. @@ -599,9 +564,9 @@ public void glGetQueryiv(int target, int pname, IntBuffer params) { params.put(0); } else { - params.put(getKey(query)); + params.put(queries.getKey(query)); } - params.clear(); + params.flip(); } @Override @@ -617,19 +582,19 @@ else if(pname == GL30.GL_QUERY_RESULT_AVAILABLE) { else { throw new GdxRuntimeException("Unsupported pname passed to glGetQueryObjectuiv"); } - params.clear(); + params.flip(); } @Override public void glGetSamplerParameterfv(int sampler, int pname, FloatBuffer params) { params.put(gl.getSamplerParameterf(samplers.get(sampler), pname)); - params.clear(); + params.flip(); } @Override public void glGetSamplerParameteriv(int sampler, int pname, IntBuffer params) { params.put(gl.getSamplerParameteri(samplers.get(sampler), pname)); - params.clear(); + params.flip(); } @Override @@ -645,10 +610,11 @@ public int glGetUniformBlockIndex(int program, String uniformBlockName) { @Override public void glGetUniformIndices(int program, String[] uniformNames, IntBuffer uniformIndices) { JSArray array = gl.getUniformIndices(programs.get(program), uniformNames); - for(int i = 0; i < array.getLength(); i++) { + int length = array.getLength(); + for(int i = 0; i < length; i++) { uniformIndices.put(i, array.get(i)); } - uniformIndices.clear(); + uniformIndices.limit(length); } @Override diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/typedarray/TypedArrays.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/typedarray/TypedArrays.java index 1611c58b..22ca5044 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/typedarray/TypedArrays.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/typedarray/TypedArrays.java @@ -166,7 +166,6 @@ public static byte[] toByteArray(ArrayBufferViewWrapper array) { public static ArrayBufferViewWrapper getTypedArray(ByteBuffer buffer) { ArrayBufferViewWrapper bufferView = getInt8Array(buffer); if(bufferView != null) { -// return (ArrayBufferViewWrapper)Int8Array.create((ArrayBuffer)bufferView.getBuffer()); return bufferView; } byte[] array = buffer.array(); @@ -177,7 +176,6 @@ public static ArrayBufferViewWrapper getTypedArray(ByteBuffer buffer) { public static ArrayBufferViewWrapper getTypedArray(ShortBuffer buffer) { ArrayBufferViewWrapper bufferView = getInt8Array(buffer); if(bufferView != null) { -// return (ArrayBufferViewWrapper)Int16Array.create((ArrayBuffer)bufferView.getBuffer()); return bufferView; } short[] array = buffer.array(); @@ -188,7 +186,6 @@ public static ArrayBufferViewWrapper getTypedArray(ShortBuffer buffer) { public static ArrayBufferViewWrapper getTypedArray(IntBuffer buffer) { ArrayBufferViewWrapper bufferView = getInt8Array(buffer); if(bufferView != null) { -// return (ArrayBufferViewWrapper)Int32Array.create((ArrayBuffer)bufferView.getBuffer()); return bufferView; } int[] array = buffer.array(); @@ -199,7 +196,6 @@ public static ArrayBufferViewWrapper getTypedArray(IntBuffer buffer) { public static ArrayBufferViewWrapper getTypedArray(FloatBuffer buffer) { ArrayBufferViewWrapper bufferView = getInt8Array(buffer); if(bufferView != null) { -// return (ArrayBufferViewWrapper)Float32Array.create((ArrayBuffer)bufferView.getBuffer()); return bufferView; } float[] array = buffer.array(); diff --git a/backends/backend-teavm/src/main/resources/com/badlogic/gdx/utils/lsans-15.fnt b/backends/backend-teavm/src/main/resources/com/badlogic/gdx/utils/lsans-15.fnt deleted file mode 100644 index 6adbdfdf..00000000 --- a/backends/backend-teavm/src/main/resources/com/badlogic/gdx/utils/lsans-15.fnt +++ /dev/null @@ -1,246 +0,0 @@ -info face="LSans" size=15 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=-2,-2 -common lineHeight=18 base=14 scaleW=256 scaleH=128 pages=1 packed=0 -page id=0 file="lsans-15.png" -chars count=168 -char id=0 x=83 y=85 width=11 height=13 xoffset=0 yoffset=2 xadvance=11 page=0 chnl=0 -char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 -char id=33 x=184 y=17 width=5 height=13 xoffset=0 yoffset=2 xadvance=5 page=0 chnl=0 -char id=34 x=27 y=85 width=7 height=5 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 -char id=35 x=189 y=17 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=36 x=125 y=17 width=10 height=15 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 -char id=37 x=199 y=17 width=15 height=13 xoffset=-1 yoffset=2 xadvance=13 page=0 chnl=0 -char id=38 x=10 y=72 width=12 height=12 xoffset=-1 yoffset=3 xadvance=10 page=0 chnl=0 -char id=39 x=34 y=85 width=5 height=5 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 -char id=40 x=24 y=0 width=7 height=16 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 -char id=41 x=31 y=0 width=7 height=16 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 -char id=42 x=0 y=85 width=8 height=7 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 -char id=43 x=57 y=72 width=11 height=11 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 -char id=44 x=251 y=72 width=4 height=6 xoffset=0 yoffset=11 xadvance=4 page=0 chnl=0 -char id=45 x=50 y=85 width=7 height=4 xoffset=-1 yoffset=8 xadvance=5 page=0 chnl=0 -char id=46 x=57 y=85 width=4 height=4 xoffset=0 yoffset=11 xadvance=4 page=0 chnl=0 -char id=47 x=214 y=17 width=6 height=13 xoffset=-1 yoffset=2 xadvance=4 page=0 chnl=0 -char id=48 x=220 y=17 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=49 x=230 y=17 width=9 height=13 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 -char id=50 x=239 y=17 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=51 x=0 y=33 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=52 x=10 y=33 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=53 x=20 y=33 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=54 x=30 y=33 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=55 x=40 y=33 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=56 x=50 y=33 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=57 x=60 y=33 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=58 x=68 y=72 width=4 height=10 xoffset=0 yoffset=5 xadvance=4 page=0 chnl=0 -char id=59 x=22 y=72 width=4 height=12 xoffset=0 yoffset=5 xadvance=4 page=0 chnl=0 -char id=60 x=229 y=72 width=11 height=9 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 -char id=61 x=8 y=85 width=11 height=7 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=0 -char id=62 x=240 y=72 width=11 height=9 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 -char id=63 x=70 y=33 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=64 x=135 y=17 width=15 height=15 xoffset=0 yoffset=2 xadvance=15 page=0 chnl=0 -char id=65 x=80 y=33 width=11 height=13 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 -char id=66 x=91 y=33 width=11 height=13 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 -char id=67 x=102 y=33 width=13 height=13 xoffset=-1 yoffset=2 xadvance=11 page=0 chnl=0 -char id=68 x=115 y=33 width=12 height=13 xoffset=0 yoffset=2 xadvance=11 page=0 chnl=0 -char id=69 x=127 y=33 width=11 height=13 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 -char id=70 x=138 y=33 width=10 height=13 xoffset=0 yoffset=2 xadvance=9 page=0 chnl=0 -char id=71 x=148 y=33 width=12 height=13 xoffset=-1 yoffset=2 xadvance=11 page=0 chnl=0 -char id=72 x=160 y=33 width=10 height=13 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 -char id=73 x=249 y=17 width=4 height=13 xoffset=0 yoffset=2 xadvance=3 page=0 chnl=0 -char id=74 x=170 y=33 width=8 height=13 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 -char id=75 x=178 y=33 width=11 height=13 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 -char id=76 x=189 y=33 width=9 height=13 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 -char id=77 x=198 y=33 width=11 height=13 xoffset=0 yoffset=2 xadvance=11 page=0 chnl=0 -char id=78 x=209 y=33 width=10 height=13 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 -char id=79 x=219 y=33 width=14 height=13 xoffset=-1 yoffset=2 xadvance=12 page=0 chnl=0 -char id=80 x=233 y=33 width=11 height=13 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 -char id=81 x=38 y=0 width=14 height=16 xoffset=-1 yoffset=2 xadvance=12 page=0 chnl=0 -char id=82 x=0 y=46 width=12 height=13 xoffset=0 yoffset=2 xadvance=11 page=0 chnl=0 -char id=83 x=12 y=46 width=12 height=13 xoffset=-1 yoffset=2 xadvance=10 page=0 chnl=0 -char id=84 x=244 y=33 width=11 height=13 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 -char id=85 x=24 y=46 width=10 height=13 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 -char id=86 x=34 y=46 width=11 height=13 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 -char id=87 x=45 y=46 width=17 height=13 xoffset=-1 yoffset=2 xadvance=15 page=0 chnl=0 -char id=88 x=62 y=46 width=11 height=13 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 -char id=89 x=73 y=46 width=11 height=13 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 -char id=90 x=84 y=46 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=91 x=52 y=0 width=5 height=16 xoffset=0 yoffset=2 xadvance=4 page=0 chnl=0 -char id=92 x=94 y=46 width=6 height=13 xoffset=-1 yoffset=2 xadvance=4 page=0 chnl=0 -char id=93 x=57 y=0 width=5 height=16 xoffset=-1 yoffset=2 xadvance=4 page=0 chnl=0 -char id=94 x=19 y=85 width=8 height=7 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 -char id=95 x=71 y=85 width=12 height=3 xoffset=-2 yoffset=15 xadvance=8 page=0 chnl=0 -char id=96 x=61 y=85 width=6 height=4 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 -char id=97 x=72 y=72 width=10 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 -char id=98 x=100 y=46 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=99 x=82 y=72 width=10 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 -char id=100 x=110 y=46 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=101 x=92 y=72 width=10 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 -char id=102 x=120 y=46 width=7 height=13 xoffset=-1 yoffset=2 xadvance=4 page=0 chnl=0 -char id=103 x=127 y=46 width=10 height=13 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 -char id=104 x=137 y=46 width=9 height=13 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 -char id=105 x=146 y=46 width=5 height=13 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 -char id=106 x=62 y=0 width=6 height=16 xoffset=-2 yoffset=2 xadvance=3 page=0 chnl=0 -char id=107 x=151 y=46 width=10 height=13 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 -char id=108 x=161 y=46 width=5 height=13 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 -char id=109 x=102 y=72 width=13 height=10 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=0 -char id=110 x=115 y=72 width=10 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 -char id=111 x=125 y=72 width=10 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 -char id=112 x=166 y=46 width=10 height=13 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 -char id=113 x=176 y=46 width=10 height=13 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 -char id=114 x=135 y=72 width=6 height=10 xoffset=0 yoffset=5 xadvance=5 page=0 chnl=0 -char id=115 x=141 y=72 width=10 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 -char id=116 x=26 y=72 width=6 height=12 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 -char id=117 x=151 y=72 width=10 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 -char id=118 x=161 y=72 width=9 height=10 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 -char id=119 x=170 y=72 width=15 height=10 xoffset=-2 yoffset=5 xadvance=11 page=0 chnl=0 -char id=120 x=185 y=72 width=9 height=10 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 -char id=121 x=186 y=46 width=9 height=13 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 -char id=122 x=194 y=72 width=10 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 -char id=123 x=68 y=0 width=7 height=16 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 -char id=124 x=75 y=0 width=4 height=16 xoffset=0 yoffset=2 xadvance=3 page=0 chnl=0 -char id=125 x=79 y=0 width=7 height=16 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 -char id=126 x=39 y=85 width=11 height=5 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=0 -char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 -char id=161 x=32 y=72 width=5 height=12 xoffset=0 yoffset=5 xadvance=5 page=0 chnl=0 -char id=162 x=195 y=46 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=163 x=205 y=46 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=164 x=204 y=72 width=10 height=10 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 -char id=165 x=215 y=46 width=12 height=13 xoffset=-2 yoffset=2 xadvance=8 page=0 chnl=0 -char id=166 x=86 y=0 width=4 height=16 xoffset=0 yoffset=2 xadvance=3 page=0 chnl=0 -char id=181 x=227 y=46 width=10 height=13 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 -char id=183 x=67 y=85 width=4 height=4 xoffset=1 yoffset=7 xadvance=5 page=0 chnl=0 -char id=191 x=37 y=72 width=10 height=12 xoffset=-1 yoffset=5 xadvance=9 page=0 chnl=0 -char id=192 x=90 y=0 width=11 height=16 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 -char id=193 x=101 y=0 width=11 height=16 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 -char id=194 x=112 y=0 width=11 height=16 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 -char id=195 x=123 y=0 width=11 height=16 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 -char id=196 x=134 y=0 width=11 height=16 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 -char id=197 x=0 y=0 width=11 height=17 xoffset=-1 yoffset=-2 xadvance=9 page=0 chnl=0 -char id=198 x=237 y=46 width=17 height=13 xoffset=-1 yoffset=2 xadvance=15 page=0 chnl=0 -char id=199 x=11 y=0 width=13 height=17 xoffset=-1 yoffset=2 xadvance=11 page=0 chnl=0 -char id=200 x=145 y=0 width=11 height=16 xoffset=0 yoffset=-1 xadvance=10 page=0 chnl=0 -char id=201 x=156 y=0 width=11 height=16 xoffset=0 yoffset=-1 xadvance=10 page=0 chnl=0 -char id=202 x=167 y=0 width=11 height=16 xoffset=0 yoffset=-1 xadvance=10 page=0 chnl=0 -char id=203 x=178 y=0 width=11 height=16 xoffset=0 yoffset=-1 xadvance=10 page=0 chnl=0 -char id=204 x=189 y=0 width=6 height=16 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 -char id=205 x=195 y=0 width=7 height=16 xoffset=0 yoffset=-1 xadvance=3 page=0 chnl=0 -char id=206 x=202 y=0 width=8 height=16 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 -char id=207 x=210 y=0 width=8 height=16 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 -char id=208 x=0 y=59 width=13 height=13 xoffset=-1 yoffset=2 xadvance=11 page=0 chnl=0 -char id=209 x=218 y=0 width=10 height=16 xoffset=0 yoffset=-1 xadvance=10 page=0 chnl=0 -char id=210 x=228 y=0 width=14 height=16 xoffset=-1 yoffset=-1 xadvance=12 page=0 chnl=0 -char id=211 x=0 y=17 width=14 height=16 xoffset=-1 yoffset=-1 xadvance=12 page=0 chnl=0 -char id=212 x=14 y=17 width=14 height=16 xoffset=-1 yoffset=-1 xadvance=12 page=0 chnl=0 -char id=213 x=28 y=17 width=14 height=16 xoffset=-1 yoffset=-1 xadvance=12 page=0 chnl=0 -char id=214 x=42 y=17 width=14 height=16 xoffset=-1 yoffset=-1 xadvance=12 page=0 chnl=0 -char id=216 x=150 y=17 width=14 height=15 xoffset=-1 yoffset=1 xadvance=12 page=0 chnl=0 -char id=217 x=242 y=0 width=10 height=16 xoffset=0 yoffset=-1 xadvance=10 page=0 chnl=0 -char id=218 x=56 y=17 width=10 height=16 xoffset=0 yoffset=-1 xadvance=10 page=0 chnl=0 -char id=219 x=66 y=17 width=10 height=16 xoffset=0 yoffset=-1 xadvance=10 page=0 chnl=0 -char id=220 x=76 y=17 width=10 height=16 xoffset=0 yoffset=-1 xadvance=10 page=0 chnl=0 -char id=221 x=86 y=17 width=11 height=16 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 -char id=222 x=13 y=59 width=11 height=13 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 -char id=223 x=24 y=59 width=10 height=13 xoffset=0 yoffset=2 xadvance=9 page=0 chnl=0 -char id=224 x=34 y=59 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=225 x=44 y=59 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=226 x=54 y=59 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=227 x=64 y=59 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=228 x=74 y=59 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=229 x=164 y=17 width=10 height=15 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 -char id=230 x=214 y=72 width=15 height=10 xoffset=-1 yoffset=5 xadvance=13 page=0 chnl=0 -char id=231 x=174 y=17 width=10 height=14 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 -char id=232 x=84 y=59 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=233 x=94 y=59 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=234 x=104 y=59 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=235 x=114 y=59 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=236 x=124 y=59 width=6 height=13 xoffset=-2 yoffset=2 xadvance=3 page=0 chnl=0 -char id=237 x=130 y=59 width=7 height=13 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 -char id=238 x=137 y=59 width=8 height=13 xoffset=-2 yoffset=2 xadvance=3 page=0 chnl=0 -char id=239 x=145 y=59 width=8 height=13 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 -char id=240 x=153 y=59 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=241 x=163 y=59 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=242 x=173 y=59 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=243 x=183 y=59 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=244 x=193 y=59 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=245 x=203 y=59 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=246 x=213 y=59 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=248 x=47 y=72 width=10 height=12 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 -char id=249 x=223 y=59 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=250 x=233 y=59 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=251 x=243 y=59 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=252 x=0 y=72 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=253 x=97 y=17 width=9 height=16 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 -char id=254 x=106 y=17 width=10 height=16 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 -char id=255 x=116 y=17 width=9 height=16 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 -kernings count=73 -kerning first=70 second=46 amount=-2 -kerning first=84 second=121 amount=-1 -kerning first=121 second=44 amount=-1 -kerning first=86 second=58 amount=-1 -kerning first=89 second=101 amount=-1 -kerning first=89 second=46 amount=-2 -kerning first=84 second=45 amount=-1 -kerning first=119 second=44 amount=-1 -kerning first=89 second=59 amount=-1 -kerning first=84 second=58 amount=-2 -kerning first=87 second=46 amount=-1 -kerning first=65 second=84 amount=-1 -kerning first=84 second=105 amount=-1 -kerning first=86 second=97 amount=-1 -kerning first=84 second=97 amount=-2 -kerning first=76 second=87 amount=-1 -kerning first=65 second=89 amount=-1 -kerning first=76 second=32 amount=-1 -kerning first=76 second=121 amount=-1 -kerning first=89 second=111 amount=-1 -kerning first=121 second=46 amount=-1 -kerning first=119 second=46 amount=-1 -kerning first=84 second=115 amount=-2 -kerning first=76 second=84 amount=-1 -kerning first=65 second=86 amount=-1 -kerning first=86 second=65 amount=-1 -kerning first=86 second=44 amount=-1 -kerning first=84 second=65 amount=-1 -kerning first=84 second=99 amount=-2 -kerning first=89 second=45 amount=-1 -kerning first=84 second=44 amount=-2 -kerning first=76 second=89 amount=-1 -kerning first=89 second=113 amount=-1 -kerning first=89 second=58 amount=-1 -kerning first=86 second=117 amount=-1 -kerning first=80 second=65 amount=-1 -kerning first=89 second=105 amount=-1 -kerning first=80 second=44 amount=-2 -kerning first=89 second=118 amount=-1 -kerning first=84 second=117 amount=-1 -kerning first=89 second=97 amount=-1 -kerning first=76 second=86 amount=-1 -kerning first=118 second=44 amount=-1 -kerning first=86 second=101 amount=-1 -kerning first=87 second=97 amount=-1 -kerning first=86 second=46 amount=-1 -kerning first=86 second=114 amount=-1 -kerning first=86 second=59 amount=-1 -kerning first=84 second=101 amount=-2 -kerning first=84 second=46 amount=-2 -kerning first=32 second=65 amount=-1 -kerning first=84 second=114 amount=-1 -kerning first=114 second=44 amount=-1 -kerning first=84 second=59 amount=-2 -kerning first=70 second=65 amount=-1 -kerning first=80 second=46 amount=-2 -kerning first=70 second=44 amount=-2 -kerning first=84 second=119 amount=-1 -kerning first=89 second=65 amount=-1 -kerning first=86 second=111 amount=-1 -kerning first=89 second=44 amount=-2 -kerning first=89 second=112 amount=-1 -kerning first=87 second=65 amount=-1 -kerning first=118 second=46 amount=-1 -kerning first=84 second=111 amount=-2 -kerning first=87 second=44 amount=-1 -kerning first=49 second=49 amount=-1 -kerning first=89 second=117 amount=-1 -kerning first=114 second=46 amount=-1 -kerning first=86 second=121 amount=-1 -kerning first=65 second=87 amount=-1 -kerning first=65 second=32 amount=-1 -kerning first=86 second=45 amount=-1 diff --git a/backends/backend-teavm/src/main/resources/com/badlogic/gdx/utils/lsans-15.png b/backends/backend-teavm/src/main/resources/com/badlogic/gdx/utils/lsans-15.png deleted file mode 100644 index dab688a5290fb62cef588630dafd9a976e37ed79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14652 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 y=X467nlD=XX+6pS000000000000000006l41aU)VuE{h=a;k=b});var m=Object.assign({} if(q){var fs=require("fs"),x=require("path");t=p?x.dirname(t)+"/":__dirname+"/";u=(a,b)=>{a=a.startsWith("file://")?new URL(a):x.normalize(a);return fs.readFileSync(a,b?void 0:"utf8")};w=a=>{a=u(a,!0);a.buffer||(a=new Uint8Array(a));return a};process.argv.slice(2);d.inspect=()=>"[Emscripten Module object]"}else if(aa||p)p?t=self.location.href:"undefined"!=typeof document&&document.currentScript&&(t=document.currentScript.src),_scriptDir&&(t=_scriptDir),0!==t.indexOf("blob:")?t=t.substr(0,t.replace(/[?#].*/, "").lastIndexOf("/")+1):t="",u=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.send(null);return b.responseText},p&&(w=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)});d.print||console.log.bind(console);var y=d.printErr||console.error.bind(console);Object.assign(d,m);m=null;var z;d.wasmBinary&&(z=d.wasmBinary);var noExitRuntime=d.noExitRuntime||!0;"object"!=typeof WebAssembly&&A("no native wasm support detected"); var B,C=!1,D,E;function F(){var a=B.buffer;d.HEAP8=D=new Int8Array(a);d.HEAP16=new Int16Array(a);d.HEAPU8=E=new Uint8Array(a);d.HEAPU16=new Uint16Array(a);d.HEAP32=new Int32Array(a);d.HEAPU32=new Uint32Array(a);d.HEAPF32=new Float32Array(a);d.HEAPF64=new Float64Array(a)}var G=[],H=[],I=[];function ba(){var a=d.preRun.shift();G.unshift(a)}var J=0,K=null,M=null; -function A(a){if(d.onAbort)d.onAbort(a);a="Aborted("+a+")";y(a);C=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");k(a);throw a;}function N(a){return a.startsWith("data:application/octet-stream;base64,")}var O;O="data:application/octet-stream;base64,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IARBA3EhHyAGQRBHISAgBEEESSElIAQhGANAIAkgCUH/AXFBjBRqLQAAIBMbIQkgAUEBaiEKIAAoAgwgF2ogIWoiDSAjaiEMQQAhAkEBIAsgGxsiC0EATCIPRQRAA0ACQCACIA1qAn8CQAJAAkACQAJAAkACQCAJQf8BcQ4HAAECAwQFBggLIAIgCmotAAAMBgsgAiAKai0AAAwFCyACIAxqLQAAIAIgCmotAABqDAQLIAIgCmotAAAgAiAMai0AAEEBdmoMAwsgAiAMai0AACACIApqLQAAagwCCyACIApqLQAADAELIAIgCmotAAALOgAACyACQQFqIgIgC0cNAAsLAn8gBkEIRgRAIBxFBEAgDSASakH/AToAAAsgAyECIAogEmoMAQsgIEUEQCAcRQRAIAsgDWpB//8DOwAACyAOIQIgCiALagwBC0EBIQIgAUECagshASAaIBggGxshGCACIAxqIQwgAiANaiECAkACQAJAAkAgIgRAIBhBAWsgC2whCgJAAkACQAJAAkACQAJAIAlB/wFxDgcIBAMCBQEABgsgCkEATA0FQQAhCCAKQQFHBEAgCkF+cSEPQQAhCQNAIAIgCGogAiAIIAtrai0AACABIAhqLQAAajoAACACIAhBAXIiDGogAiAMIAtrai0AACABIAxqLQAAajoAACAIQQJqIQggCUECaiIJIA9HDQALCyAKQQFxRQ0FIAIgCGogAiAIIAtrai0AACABIAhqLQAAajoAACABIApqIQEMCAsgCkEATA0EQQAhCCAKQQFHBEAgCkF+cSEPQQAhCQNAIAIgCGogASAIai0AACACIAggC2tqLQAAQQF2ajoAACACIAhBAXIiDGogASAMai0AACACIAwgC2tqLQAAQQF2ajoAACAIQQJqIQggCUECaiIJIA9HDQALCyAKQQFxRQ0EIAIgCGogASAIai0AACACIAggC2tqLQAAQQF2ajoAACABIApqIQEMBwsgCkEATA0DQQAhCCAKQQFHBEAgCkF+cSENQQAhCQNAIAIgCGogASAIai0AACACIAggC2tqLQAAIAggDGotAABqQQF2ajoAACACIAhBAXIiD2ogASAPai0AACACIA8gC2tqLQAAIAwgD2otAABqQQF2ajoAACAIQQJqIQggCUECaiIJIA1HDQALCyAKQQFxRQ0DIAIgCGogASAIai0AACACIAggC2tqLQAAIAggDGotAABqQQF2ajoAACABIApqIQEMBgsgCkEATA0CQQAhCCAKQQFHBEAgCkF+cSENQQAhCQNAIAIgCGogCCAMai0AACABIAhqLQAAajoAACACIAhBAXIiD2ogDCAPai0AACABIA9qLQAAajoAACAIQQJqIQggCUECaiIJIA1HDQALCyAKQQFxRQ0CIAIgCGogCCAMai0AACABIAhqLQAAajoAACABIApqIQEMBQsgCkEATA0BQQAhCCAKQQFHBEAgCkF+cSEPQQAhCQNAIAIgCGogAiAIIAtrai0AACABIAhqLQAAajoAACACIAhBAXIiDGogAiAMIAtrai0AACABIAxqLQAAajoAACAIQQJqIQggCUECaiIJIA9HDQALCyAKQQFxRQ0BIAIgCGogAiAIIAtrai0AACABIAhqLQAAajoAACABIApqIQEMBAtBACEIIApBAEwNAANAIAIgCGogASAIai0AACAMIAggC2siDWotAAAiCSAIIAxqLQAAIg8gDyACIA1qLQAAIg1qIAlrIhcgD2siDyAPQR91Ig9zIA9rIg8gFyAJayIJIAlBH3UiCXMgCWsiCUsbIhEgESANIAkgFyANayIJIAlBH3UiCXMgCWsiCUkbIAkgD0sbajoAACAIQQFqIgggCkcNAAsLIAEgCmohAQwCCwJAAkACQAJAAkACQAJAAkAgCUH/AXEOBwUEAwIGAQAHCyAQRQ0GIAtBfnEhDSALQQFxIREgECEKA0ACQCAPDQBBACEIQQAhCSALQQFHBEADQCACIAhqIAIgCCAOa2otAAAgASAIai0AAGo6AAAgAiAIQQFyIgxqIAIgDCAOa2otAAAgASAMai0AAGo6AAAgCEECaiEIIAlBAmoiCSANRw0ACwsgEUUNACACIAhqIAIgCCAOa2otAAAgASAIai0AAGo6AAALIAIgC2pB/wE6AAAgAiAOaiECIAEgC2ohASAKQQFrIgoNAAsMBgsgEEUNBSALQX5xIQ0gC0EBcSERIBAhCgNAAkAgDw0AQQAhCEEAIQkgC0EBRwRAA0AgAiAIaiABIAhqLQAAIAIgCCAOa2otAABBAXZqOgAAIAIgCEEBciIMaiABIAxqLQAAIAIgDCAOa2otAABBAXZqOgAAIAhBAmohCCAJQQJqIgkgDUcNAAsLIBFFDQAgAiAIaiABIAhqLQAAIAIgCCAOa2otAABBAXZqOgAACyACIAtqQf8BOgAAIAIgDmohAiABIAtqIQEgCkEBayIKDQALDAULIBBFDQQgC0F+cSERIAtBAXEhFCAQIQoDQAJAIA8NAEEAIQhBACEJIAtBAUcEQANAIAIgCGogASAIai0AACACIAggDmtqLQAAIAggDGotAABqQQF2ajoAACACIAhBAXIiDWogASANai0AACACIA0gDmtqLQAAIAwgDWotAABqQQF2ajoAACAIQQJqIQggCUECaiIJIBFHDQALCyAURQ0AIAIgCGogASAIai0AACACIAggDmtqLQAAIAggDGotAABqQQF2ajoAAAsgAiALakH/AToAACAMIA5qIQwgAiAOaiECIAEgC2ohASAKQQFrIgoNAAsMBAsgEEUNAyALQX5xIREgC0EBcSEUIBAhCgNAAkAgDw0AQQAhCEEAIQkgC0EBRwRAA0AgAiAIaiAIIAxqLQAAIAEgCGotAABqOgAAIAIgCEEBciINaiAMIA1qLQAAIAEgDWotAABqOgAAIAhBAmohCCAJQQJqIgkgEUcNAAsLIBRFDQAgAiAIaiAIIAxqLQAAIAEgCGotAABqOgAACyACIAtqQf8BOgAAIAwgDmohDCACIA5qIQIgASALaiEBIApBAWsiCg0ACwwDCyAQRQ0CIAtBfnEhDSALQQFxIREgECEKA0ACQCAPDQBBACEIQQAhCSALQQFHBEADQCACIAhqIAIgCCAOa2otAAAgASAIai0AAGo6AAAgAiAIQQFyIgxqIAIgDCAOa2otAAAgASAMai0AAGo6AAAgCEECaiEIIAlBAmoiCSANRw0ACwsgEUUNACACIAhqIAIgCCAOa2otAAAgASAIai0AAGo6AAALIAIgC2pB/wE6AAAgAiAOaiECIAEgC2ohASAKQQFrIgoNAAsMAgsgEEUNASALQXxxIREgC0EDcSENIAtBAWshFCAQIQoDQAJAIA8NAEEAIQxBACEIQQAhCSAUQQNPBEADQCACIAhqIAEgCGotAAA6AAAgAiAIQQFyIhVqIAEgFWotAAA6AAAgAiAIQQJyIhVqIAEgFWotAAA6AAAgAiAIQQNyIhVqIAEgFWotAAA6AAAgCEEEaiEIIAlBBGoiCSARRw0ACwsgDUUNAANAIAIgCGogASAIai0AADoAACAI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DQALC0EBDwtBgAghHQtB8M4AIB02AgBBAAuECQEEfyABKAIAQQBKBEADQCAAIAJqQYAKakEBOgAAIAJBAWoiAiABKAIASA0ACwsgASgCBEEASgRAA0AgACACakGACmpBAjoAACACQQFqIQIgA0EBaiIDIAEoAgRIDQALCyABKAIIQQBKBEBBACEDA0AgACACakGACmpBAzoAACACQQFqIQIgA0EBaiIDIAEoAghIDQALCyABKAIMQQBKBEBBACEDA0AgACACakGACmpBBDoAACACQQFqIQIgA0EBaiIDIAEoAgxIDQALCyABKAIQQQBKBEBBACEDA0AgACACakGACmpBBToAACACQQFqIQIgA0EBaiIDIAEoAhBIDQALCyABKAIUQQBKBEBBACEDA0AgACACakGACmpBBjoAACACQQFqIQIgA0EBaiIDIAEoAhRIDQALCyABKAIYQQBKBEBBACEDA0AgACACakGACmpBBzoAACACQQFqIQIgA0EBaiIDIAEoAhhIDQALCyABKAIcQQBKBEBBACEDA0AgACACakGACmpBCDoAACACQQFqIQIgA0EBaiIDIAEoAhxIDQALCyABKAIgQQBKBEBBACEDA0AgACACakGACmpBCToAACACQQFqIQIgA0EBaiIDIAEoAiBIDQALCyABKAIkQQBKBEBBACEDA0AgACACakGACmpBCjoAACACQQFqIQIgA0EBaiIDIAEoAiRIDQALCyABKAIoQQBKBEBBACEDA0AgACACakGACmpBCzoAACACQQFqIQIgA0EBaiIDIAEoAihIDQALCyABKAIsQQBKBEBBACEDA0AgACACakGACmpBDDoAACACQQFqIQIgA0EBaiIDIAEoAixIDQALCyABKAIwQQBKBEBBACEDA0AgACACakGACmpBDToAACACQQFqIQIgA0EBaiIDIAEoAjBIDQALCyABKAI0QQBKBEBBACEDA0AgACACakGACmpBDjoAACACQQFqIQIgA0EBaiIDIAEoAjRIDQALCyABKAI4QQBKBEBBACEDA0AgACACakGACmpBDzoAACACQQFqIQIgA0EBaiIDIAEoAjhIDQALCyABKAI8QQBKBEBBACEDA0AgACACakGACmpBEDoAACACQQFqIQIgA0EBaiIDIAEoAjxIDQALC0EAIQEgACACakGACmpBADoAAEEB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BQwCCyAFQQR2QQ9xIAVBCHZB8AFxIAVBEHZBgOADcSAFQQx2QYAecXJyciEFDAELQQAhBQsgBCAFIAgRAQAgBCALaiEEIAFBAWohAiABIA1HDQALCwsHACAALwEACyQBAX8jAEEQayICIAA2AgwgAiABNgIIIAIoAgwgAigCCDYCCAsYAQF/IwBBEGsiASAANgIMIAEoAgwoAggLJAEBfyMAQRBrIgIgADYCDCACIAE2AgggAigCDCACKAIINgIECxgBAX8jAEEQayIBIAA2AgwgASgCDCgCBAusAQEDfwJAIANBAEwNAEEAIQQgA0EBRwRAIANBfnEhBwNAIAAgBGogAiAEai0AACABIARqLQAAQQNsakECakECdjoAACAAIARBAXIiBmogAiAGai0AACABIAZqLQAAQQNsakECakECdjoAACAEQQJqIQQgBUECaiIFIAdHDQALCyADQQFxRQ0AIAAgBGogAiAEai0AACABIARqLQAAQQNsakECakECdjoAAAsgAAsEACABC+UBAQd/AkAgA0EATA0AIARBAEwNACAEQXxxIQogBEEDcSEJIARBBEkhCwNAIAQgCGwhBSABIAhqIQZBACECQQAhByALRQRAA0AgACACIAVqaiAGLQAAOgAAIAAgAkEBciAFamogBi0AADoAACAAIAJBAnIgBWpqIAYtAAA6AAAgACACQQNyIAVqaiAGLQAAOgAAIAJBBGohAiAHQQRqIgcgCkcNAAsLQQAhByAJBEADQCAAIAIgBWpqIAYtAAA6AAAgAkEBaiECIAdBAWoiByAJRw0ACwsgCEEBaiIIIANHDQALCyAAC+gBAQN/QQEhAiABLQAAIQQgA0EBRgRAIAAgBDoAACAAIAQ6AAEgAA8LIAAgBDoAACAAIAEtAAEgAS0AAEEDbGpBAmpBAnY6AAEgA0EBayEEQQIhBSADQQNOBEADQCAAIAJBAXRqIgUgASACaiIGLQAAQQNsQQJqIgcgBkEBay0AAGpBAnY6AAAgBSAHIAEgAkEBaiICai0AAGpBAnY6AAEgAiAERw0ACyAEQQF0IQULIAAgBWogASAEaiICLQAAIAEgA2pBAmstAABBA2xqQQJqQQJ2OgAAIAAgBUEBcmogAi0AADoAACAACyQBAX8jAEEQayICIAA2AgwgAiABNgIIIAIoAgwgAigCCDYCAAuU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dEGA/gNxIAJB/wFxcgwECyACQQh2IQJBESEEDAQLQRIhBCACQQt2QR9xIAJBEHZBgPADcSACQQ12QeAPcXJyDAILQRMhBCACQQR2QQ9xIAJBCHZB8AFxIAJBEHZBgOADcSACQQx2QYAecXJycgwBC0EPIQRBAAshAgsCQCADIApMIgcNACAJIAtqIgEgCnJBAEgNACABIA9ODQAgCCAAIAEgA2wgCmpsaiACIAQRAQALAkAgBw0AIAsgCWsiASAKckEASA0AIAEgD04NACAIIAAgASADbCAKamxqIAIgBBEBAAsCQCALIA9OIgcNACAJIApqIgEgC3JBAEgNACABIANODQAgCCAAIAMgC2wgAWpsaiACIAQRAQALAkAgBw0AIAogCWsiASALckEASA0AIAEgA04NACAIIAAgAyALbCABamxqIAIgBBEBAAsgCUEASgRAQQAhBwNAIAUgB0EBaiIHQQAgCUEBayIBIAVBAEgiBhtrQQF0aiESAkACQCAJIAEgBhsiCSAHRgRAIAcgCmohBgJAIAcgC2oiASAPTiIODQAgAyAGTA0AIAEgBnJBAEgNACAIIAEgA2wgBmogAGxqIAIgBBEBAAsgCiAHayEFAkAgDg0AIAMgBUwNACABIAVyQQBIDQAgCCABIANsIAVqIABsaiACIAQRAQALAkAgCyAHayIBIA9OIg4NACADIAZMDQAgASAGckEASA0AIAggASADbCAGaiAAbGogAiAEEQEACyAODQIgAyAFTA0CIAEgBXJBAE4NAQwCCyAHIAlODQEgByAKaiEBAkAgCSALaiIGIA9OIg4NACABIANODQAgASAGckEASA0AIAggAyAGbCABaiAAbGogAiAEEQEACyAKIAdrIQUCQCAODQAgAyAFTA0AIAUgBnJBAEgNACAIIAMgBmwgBWogAGxqIAIgBBEBAAsCQCALIAlrIgYgD04iDg0AIAEgA04NACABIAZyQQBIDQAgCCADIAZsIAFqIABsaiACIAQRAQALAkAgDg0AIAMgBUwNACAFIAZyQQBIDQAgCCADIAZsIAVqIABsaiACIAQRAQALIAkgCmohBgJAIAcgC2oiASAPTiIODQAgAyAGTA0AIAEgBnJBAEgNACAIIAEgA2wgBmogAGxqIAIgBBEBAAsgCiAJayEFAkAgDg0AIAMgBUwNACABIAVyQQBI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ASAANgIMIAEoAgwoAgwLIgEBfyMAQRBrIgEkACABIAA2AgwgASgCDBACIAFBEGokAAsLvUGQAQBBgAgLiAlPdXQgb2YgbWVtb3J5AEpQRUcgZm9ybWF0IG5vdCBzdXBwb3J0ZWQ6IDgtYml0IG9ubHkAUE5HIG5vdCBzdXBwb3J0ZWQ6IDEvMi80LzgvMTYtYml0IG9ubHkAUElDIGZpbGUgdG9vIHNob3J0AEltYWdlIG5vdCBvZiBhbnkga25vd24gdHlwZSwgb3IgY29ycnVwdABQUE0gaW1hZ2Ugbm90IDgtYml0AFBTRCBiaXQgZGVwdGggaXMgbm90IDggb3IgMTYgYml0AEpQRUcgZm9ybWF0IG5vdCBzdXBwb3J0ZWQ6IGRlbGF5ZWQgaGVpZ2h0AENhbid0IGZpbmQgb3V0IFRHQSBwaXhlbGZvcm1hdABQU0QgaXMgbm90IGluIFJHQiBjb2xvciBmb3JtYXQAUFNEIGhhcyBhbiB1bmtub3duIGNvbXByZXNzaW9uIGZvcm1hdABVbnN1cHBvcnRlZCBIRFIgZm9ybWF0AHRvbyBtYW55IHBhY2tldHMASW50ZXJuYWwgZXJyb3IAcGFja2V0IGlzbid0IDhicHAAQk1QIHR5cGUgbm90IHN1cHBvcnRlZDogdW5rbm93bgBzY2FubGluZSBvdmVycnVuAHBhY2tldCBoYXMgYmFkIGNvbXByZXNzaW9uIHR5cGUAUE5HIG5vdCBzdXBwb3J0ZWQ6IHVua25vd24gUE5HIGNodW5rIHR5cGUASERSIGltYWdlIGlzIHRvbyBsYXJnZQBHSUYgaW1hZ2UgaXMgdG9vIGxhcmdlAFBOTSB0b28gbGFyZ2UAQ29ycnVwdCBIRFIgaW1hZ2UAQ29ycnVwdCBQU0QgaW1hZ2UAVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzIGluIFBTRCBpbWFnZQBVbnN1cHBvcnRlZCB2ZXJzaW9uIG9mIFBTRCBpbWFnZQBQSUMgaW1hZ2UgdG9vIGxhcmdlIHRvIGRlY29kZQBJbWFnZSB0b28gbGFyZ2UgdG8gZGVjb2RlAEZPUk1BVD0zMi1iaXRfcmxlX3JnYmUAYmFkIFJMRSBkYXRhAFBJQ1QAY29ycnVwdCBIRFIAYmFkIFJMRSBkYXRhIGluIEhEUgBDb3JydXB0IEJNUABiYWQgQk1QAENvcnJ1cHQgUE5HAE5vdCBhIFBORwBDb3JydXB0IEpQRUcAQ29ycnVwdCBHSUYAQk1QIHR5cGUgbm90IHN1cHBvcnRlZDogUkxFACM/UkFESUFOQ0UAIz9SR0JFAENvcnJ1cHQgUFNEAENvcnJ1cHQgVEdBAFOA9jQAZmlsZSB0b28gc2hvcnQgKHB1cmUgcmVhZCBjb3VudCkAZmlsZSB0b28gc2hvcnQgKG1peGVkIHJlYWQgY291bnQpAGZpbGUgdG9vIHNob3J0IChyZWFkaW5nIHBhY2tldHMpAGZpbGUgdG9vIHNob3J0IChwaWMgaGVhZGVyKQBWZXJ5IGxhcmdlIGltYWdlIChjb3JydXB0PykALVkgACtYIAAjP1JBRElBTkNFCgBBkRELUQEIEAkCAwoRGCAZEgsEBQwTGiEoMCkiGxQNBgcOFRwjKjE4OTIrJB0WDxceJSwzOjs0LSYfJy41PD02Lzc+Pz8/Pz8/Pz8/Pz8/Pz8/P1JHQgBB9BELPgEAAAADAAAABwAAAA8AAAAfAAAAPwAAAH8AAAD/AAAA/wEAAP8DAAD/BwAA/w8AAP8fAAD/PwAA/38AAP//AEHEEgtF//////3////5////8f///+H////B////gf///wH///8B/v//Afz//wH4//8B8P//AeD//wHA//8BgP//AP9VABEAAAABAEGUEwsRBAAAAAAAAAACAAAAAAAAAAEAQbgTC1kEAAAAAAAAAAIAAAAAAAAAAQAAAAAAAAAIAAAACAAAAAQAAAAEAAAAAgAAAAIAAAABAAAAAAAAAAgAAAAIAAAACAAAAAQAAAAEAAAAAgAAAAIAAAAAAQAFBgBBpBQLHf8AAABVAAAASQAAABEAAAAhAAAAQQAAAIEAAAABAEHcFAsRAQAAAAAAAAACAAAABAAAAAYAQYAVC9MCCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQkJCQkJCQkJCQkJCQkJCQkJCQkJ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";if(!N(O)){var P=O;O=d.locateFile?d.locateFile(P,t):t+P} +function A(a){if(d.onAbort)d.onAbort(a);a="Aborted("+a+")";y(a);C=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");k(a);throw a;}function N(a){return a.startsWith("data:application/octet-stream;base64,")}var O;O="data:application/octet-stream;base64,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IARBA3EhHyAGQRBHISAgBEEESSElIAQhGANAIAkgCUH/AXFBjBRqLQAAIBMbIQkgAUEBaiEKIAAoAgwgF2ogIWoiDSAjaiEMQQAhAkEBIAsgGxsiC0EATCIPRQRAA0ACQCACIA1qAn8CQAJAAkACQAJAAkACQCAJQf8BcQ4HAAECAwQFBggLIAIgCmotAAAMBgsgAiAKai0AAAwFCyACIAxqLQAAIAIgCmotAABqDAQLIAIgCmotAAAgAiAMai0AAEEBdmoMAwsgAiAMai0AACACIApqLQAAagwCCyACIApqLQAADAELIAIgCmotAAALOgAACyACQQFqIgIgC0cNAAsLAn8gBkEIRgRAIBxFBEAgDSASakH/AToAAAsgAyECIAogEmoMAQsgIEUEQCAcRQRAIAsgDWpB//8DOwAACyAOIQIgCiALagwBC0EBIQIgAUECagshASAaIBggGxshGCACIAxqIQwgAiANaiECAkACQAJAAkAgIgRAIBhBAWsgC2whCgJAAkACQAJAAkACQAJAIAlB/wFxDgcIBAMCBQEABgsgCkEATA0FQQAhCCAKQQFHBEAgCkF+cSEPQQAhCQNAIAIgCGogAiAIIAtrai0AACABIAhqLQAAajoAACACIAhBAXIiDGogAiAMIAtrai0AACABIAxqLQAAajoAACAIQQJqIQggCUECaiIJIA9HDQALCyAKQQFxRQ0FIAIgCGogAiAIIAtrai0AACABIAhqLQAAajoAACABIApqIQEMCAsgCkEATA0EQQAhCCAKQQFHBEAgCkF+cSEPQQAhCQNAIAIgCGogASAIai0AACACIAggC2tqLQAAQQF2ajoAACACIAhBAXIiDGogASAMai0AACACIAwgC2tqLQAAQQF2ajoAACAIQQJqIQggCUECaiIJIA9HDQALCyAKQQFxRQ0EIAIgCGogASAIai0AACACIAggC2tqLQAAQQF2ajoAACABIApqIQEMBwsgCkEATA0DQQAhCCAKQQFHBEAgCkF+cSENQQAhCQNAIAIgCGogASAIai0AACACIAggC2tqLQAAIAggDGotAABqQQF2ajoAACACIAhBAXIiD2ogASAPai0AACACIA8gC2tqLQAAIAwgD2otAABqQQF2ajoAACAIQQJqIQggCUECaiIJIA1HDQALCyAKQQFxRQ0DIAIgCGogASAIai0AACACIAggC2tqLQAAIAggDGotAABqQQF2ajoAACABIApqIQEMBgsgCkEATA0CQQAhCCAKQQFHBEAgCkF+cSENQQAhCQNAIAIgCGogCCAMai0AACABIAhqLQAAajoAACACIAhBAXIiD2ogDCAPai0AACABIA9qLQAAajoAACAIQQJqIQggCUECaiIJIA1HDQALCyAKQQFxRQ0CIAIgCGogCCAMai0AACABIAhqLQAAajoAACABIApqIQEMBQsgCkEATA0BQQAhCCAKQQFHBEAgCkF+cSEPQQAhCQNAIAIgCGogAiAIIAtrai0AACABIAhqLQAAajoAACACIAhBAXIiDGogAiAMIAtrai0AACABIAxqLQAAajoAACAIQQJqIQggCUECaiIJIA9HDQALCyAKQQFxRQ0BIAIgCGogAiAIIAtrai0AACABIAhqLQAAajoAACABIApqIQEMBAtBACEIIApBAEwNAANAIAIgCGogASAIai0AACAMIAggC2siDWotAAAiCSAIIAxqLQAAIg8gDyACIA1qLQAAIg1qIAlrIhcgD2siDyAPQR91Ig9zIA9rIg8gFyAJayIJIAlBH3UiCXMgCWsiCUsbIhEgESANIAkgFyANayIJIAlBH3UiCXMgCWsiCUkbIAkgD0sbajoAACAIQQFqIgggCkcNAAsLIAEgCmohAQwCCwJAAkACQAJAAkACQAJAAkAgCUH/AXEOBwUEAwIGAQAHCyAQRQ0GIAtBfnEhDSALQQFxIREgECEKA0ACQCAPDQBBACEIQQAhCSALQQFHBEADQCACIAhqIAIgCCAOa2otAAAgASAIai0AAGo6AAAgAiAIQQFyIgxqIAIgDCAOa2otAAAgASAMai0AAGo6AAAgCEECaiEIIAlBAmoiCSANRw0ACwsgEUUNACACIAhqIAIgCCAOa2otAAAgASAIai0AAGo6AAALIAIgC2pB/wE6AAAgAiAOaiECIAEgC2ohASAKQQFrIgoNAAsMBgsgEEUNBSALQX5xIQ0gC0EBcSERIBAhCgNAAkAgDw0AQQAhCEEAIQkgC0EBRwRAA0AgAiAIaiABIAhqLQAAIAIgCCAOa2otAABBAXZqOgAAIAIgCEEBciIMaiABIAxqLQAAIAIgDCAOa2otAABBAXZqOgAAIAhBAmohCCAJQQJqIgkgDUcNAAsLIBFFDQAgAiAIaiABIAhqLQAAIAIgCCAOa2otAABBAXZqOgAACyACIAtqQf8BOgAAIAIgDmohAiABIAtqIQEgCkEBayIKDQALDAULIBBFDQQgC0F+cSERIAtBAXEhFCAQIQoDQAJAIA8NAEEAIQhBACEJIAtBAUcEQANAIAIgCGogASAIai0AACACIAggDmtqLQAAIAggDGotAABqQQF2ajoAACACIAhBAXIiDWogASANai0AACACIA0gDmtqLQAAIAwgDWotAABqQQF2ajoAACAIQQJqIQggCUECaiIJIBFHDQALCyAURQ0AIAIgCGogASAIai0AACACIAggDmtqLQAAIAggDGotAABqQQF2ajoAAAsgAiALakH/AToAACAMIA5qIQwgAiAOaiECIAEgC2ohASAKQQFrIgoNAAsMBAsgEEUNAyALQX5xIREgC0EBcSEUIBAhCgNAAkAgDw0AQQAhCEEAIQkgC0EBRwRAA0AgAiAIaiAIIAxqLQAAIAEgCGotAABqOgAAIAIgCEEBciINaiAMIA1qLQAAIAEgDWotAABqOgAAIAhBAmohCCAJQQJqIgkgEUcNAAsLIBRFDQAgAiAIaiAIIAxqLQAAIAEgCGotAABqOgAACyACIAtqQf8BOgAAIAwgDmohDCACIA5qIQIgASALaiEBIApBAWsiCg0ACwwDCyAQRQ0CIAtBfnEhDSALQQFxIREgECEKA0ACQCAPDQBBACEIQQAhCSALQQFHBEADQCACIAhqIAIgCCAOa2otAAAgASAIai0AAGo6AAAgAiAIQQFyIgxqIAIgDCAOa2otAAAgASAMai0AAGo6AAAgCEECaiEIIAlBAmoiCSANRw0ACwsgEUUNACACIAhqIAIgCCAOa2otAAAgASAIai0AAGo6AAALIAIgC2pB/wE6AAAgAiAOaiECIAEgC2ohASAKQQFrIgoNAAsMAgsgEEUNASALQXxxIREgC0EDcSENIAtBAWshFCAQIQoDQAJAIA8NAEEAIQxBACEIQQAhCSAUQQNPBEADQCACIAhqIAEgCGotAAA6AAAgAiAIQQFyIhVqIAEgFWotAAA6AAAgAiAIQQJyIhVqIAEgFWotAAA6AAAgAiAIQQNyIhVqIAEgFWotAAA6AAAgCEEEaiEIIAlBBGoiCSARRw0ACwsgDUUNAANAIAIgCGogASAIai0AADoAACAI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DQALC0EBDwtBgAghHQtB8M4AIB02AgBBAAuECQEEfyABKAIAQQBKBEADQCAAIAJqQYAKakEBOgAAIAJBAWoiAiABKAIASA0ACwsgASgCBEEASgRAA0AgACACakGACmpBAjoAACACQQFqIQIgA0EBaiIDIAEoAgRIDQALCyABKAIIQQBKBEBBACEDA0AgACACakGACmpBAzoAACACQQFqIQIgA0EBaiIDIAEoAghIDQALCyABKAIMQQBKBEBBACEDA0AgACACakGACmpBBDoAACACQQFqIQIgA0EBaiIDIAEoAgxIDQALCyABKAIQQQBKBEBBACEDA0AgACACakGACmpBBToAACACQQFqIQIgA0EBaiIDIAEoAhBIDQALCyABKAIUQQBKBEBBACEDA0AgACACakGACmpBBjoAACACQQFqIQIgA0EBaiIDIAEoAhRIDQALCyABKAIYQQBKBEBBACEDA0AgACACakGACmpBBzoAACACQQFqIQIgA0EBaiIDIAEoAhhIDQALCyABKAIcQQBKBEBBACEDA0AgACACakGACmpBCDoAACACQQFqIQIgA0EBaiIDIAEoAhxIDQALCyABKAIgQQBKBEBBACEDA0AgACACakGACmpBCToAACACQQFqIQIgA0EBaiIDIAEoAiBIDQALCyABKAIkQQBKBEBBACEDA0AgACACakGACmpBCjoAACACQQFqIQIgA0EBaiIDIAEoAiRIDQALCyABKAIoQQBKBEBBACEDA0AgACACakGACmpBCzoAACACQQFqIQIgA0EBaiIDIAEoAihIDQALCyABKAIsQQBKBEBBACEDA0AgACACakGACmpBDDoAACACQQFqIQIgA0EBaiIDIAEoAixIDQALCyABKAIwQQBKBEBBACEDA0AgACACakGACmpBDToAACACQQFqIQIgA0EBaiIDIAEoAjBIDQALCyABKAI0QQBKBEBBACEDA0AgACACakGACmpBDjoAACACQQFqIQIgA0EBaiIDIAEoAjRIDQALCyABKAI4QQBKBEBBACEDA0AgACACakGACmpBDzoAACACQQFqIQIgA0EBaiIDIAEoAjhIDQALCyABKAI8QQBKBEBBACEDA0AgACACakGACmpBEDoAACACQQFqIQIgA0EBaiIDIAEoAjxIDQALC0EAIQEgACACakGACmpBADoAAEEB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BQwCCyAFQQR2QQ9xIAVBCHZB8AFxIAVBEHZBgOADcSAFQQx2QYAecXJyciEFDAELQQAhBQsgBCAFIAgRAQAgBCALaiEEIAFBAWohAiABIA1HDQALCwsHACAALwEACyQBAX8jAEEQayICIAA2AgwgAiABNgIIIAIoAgwgAigCCDYCCAsYAQF/IwBBEGsiASAANgIMIAEoAgwoAggLJAEBfyMAQRBrIgIgADYCDCACIAE2AgggAigCDCACKAIINgIECxgBAX8jAEEQayIBIAA2AgwgASgCDCgCBAusAQEDfwJAIANBAEwNAEEAIQQgA0EBRwRAIANBfnEhBwNAIAAgBGogAiAEai0AACABIARqLQAAQQNsakECakECdjoAACAAIARBAXIiBmogAiAGai0AACABIAZqLQAAQQNsakECakECdjoAACAEQQJqIQQgBUECaiIFIAdHDQALCyADQQFxRQ0AIAAgBGogAiAEai0AACABIARqLQAAQQNsakECakECdjoAAAsgAAsEACABC+UBAQd/AkAgA0EATA0AIARBAEwNACAEQXxxIQogBEEDcSEJIARBBEkhCwNAIAQgCGwhBSABIAhqIQZBACECQQAhByALRQRAA0AgACACIAVqaiAGLQAAOgAAIAAgAkEBciAFamogBi0AADoAACAAIAJBAnIgBWpqIAYtAAA6AAAgACACQQNyIAVqaiAGLQAAOgAAIAJBBGohAiAHQQRqIgcgCkcNAAsLQQAhByAJBEADQCAAIAIgBWpqIAYtAAA6AAAgAkEBaiECIAdBAWoiByAJRw0ACwsgCEEBaiIIIANHDQALCyAAC+gBAQN/QQEhAiABLQAAIQQgA0EBRgRAIAAgBDoAACAAIAQ6AAEgAA8LIAAgBDoAACAAIAEtAAEgAS0AAEEDbGpBAmpBAnY6AAEgA0EBayEEQQIhBSADQQNOBEADQCAAIAJBAXRqIgUgASACaiIGLQAAQQNsQQJqIgcgBkEBay0AAGpBAnY6AAAgBSAHIAEgAkEBaiICai0AAGpBAnY6AAEgAiAERw0ACyAEQQF0IQULIAAgBWogASAEaiICLQAAIAEgA2pBAmstAABBA2xqQQJqQQJ2OgAAIAAgBUEBcmogAi0AADoAACAACyQBAX8jAEEQayICIAA2AgwgAiABNgIIIAIoAgwgAigCCDYCAAuU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dEGA/gNxIAJB/wFxcgwECyACQQh2IQJBESEEDAQLQRIhBCACQQt2QR9xIAJBEHZBgPADcSACQQ12QeAPcXJyDAILQRMhBCACQQR2QQ9xIAJBCHZB8AFxIAJBEHZBgOADcSACQQx2QYAecXJycgwBC0EPIQRBAAshAgsCQCADIApMIgcNACAJIAtqIgEgCnJBAEgNACABIA9ODQAgCCAAIAEgA2wgCmpsaiACIAQRAQALAkAgBw0AIAsgCWsiASAKckEASA0AIAEgD04NACAIIAAgASADbCAKamxqIAIgBBEBAAsCQCALIA9OIgcNACAJIApqIgEgC3JBAEgNACABIANODQAgCCAAIAMgC2wgAWpsaiACIAQRAQALAkAgBw0AIAogCWsiASALckEASA0AIAEgA04NACAIIAAgAyALbCABamxqIAIgBBEBAAsgCUEASgRAQQAhBwNAIAUgB0EBaiIHQQAgCUEBayIBIAVBAEgiBhtrQQF0aiESAkACQCAJIAEgBhsiCSAHRgRAIAcgCmohBgJAIAcgC2oiASAPTiIODQAgAyAGTA0AIAEgBnJBAEgNACAIIAEgA2wgBmogAGxqIAIgBBEBAAsgCiAHayEFAkAgDg0AIAMgBUwNACABIAVyQQBIDQAgCCABIANsIAVqIABsaiACIAQRAQALAkAgCyAHayIBIA9OIg4NACADIAZMDQAgASAGckEASA0AIAggASADbCAGaiAAbGogAiAEEQEACyAODQIgAyAFTA0CIAEgBXJBAE4NAQwCCyAHIAlODQEgByAKaiEBAkAgCSALaiIGIA9OIg4NACABIANODQAgASAGckEASA0AIAggAyAGbCABaiAAbGogAiAEEQEACyAKIAdrIQUCQCAODQAgAyAFTA0AIAUgBnJBAEgNACAIIAMgBmwgBWogAGxqIAIgBBEBAAsCQCALIAlrIgYgD04iDg0AIAEgA04NACABIAZyQQBIDQAgCCADIAZsIAFqIABsaiACIAQRAQALAkAgDg0AIAMgBUwNACAFIAZyQQBIDQAgCCADIAZsIAVqIABsaiACIAQRAQALIAkgCmohBgJAIAcgC2oiASAPTiIODQAgAyAGTA0AIAEgBnJBAEgNACAIIAEgA2wgBmogAGxqIAIgBBEBAAsgCiAJayEFAkAgDg0AIAMgBUwNACABIAVyQQBI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IAIgAzsBDCACIAM7AQogAiADOwEIIAIgAzsBBiACIAM7AQQgAiADOwECIAIgAzsBACACQRBqIQIgAEEJayEPIABBCGshACAPQX5JDQALCyAHQRBqJAAgBkEQaiQACyIBAX8jAEEQayIBJAAgASAANgIMIAFBEGokAEHwzgAoAgALJgECfyMAQRBrIgEkACABIAA2AgwgASgCDBAEIQIgAUEQaiQAIAILXgEBfyMAQRBrIgMkACADIAA2AgwgAyABNgIIIAMgAjYCBCADKAIEIQEjAEEQayIAJAAgACADKAIINgIMIAAgATYCCCAAKAIMIAAoAgg2AhAgAEEQaiQAIANBEGokAAteAQF/IwBBEGsiAyQAIAMgADYCDCADIAE2AgggAyACNgIEIAMoAgQhASMAQRBrIgAkACAAIAMoAgg2AgwgACABNgIIIAAoAgwgACgCCDYCDCAAQRBqJAAgA0EQaiQAC0wBAX8jAEEQayICJAAgAiAANgIMIAIgATYCCCMAQRBrIgAkACAAIAIoAgg2AgwgACgCDCIBKAIUEAIgARACIABBEGokACACQRBqJAAL5wEBA38jAEEQayIEJAAgBCAANgIMIAQgATYCCCAEIAI2AgQgBCADNgIAIAQoAgQhASAEKAIAIQIjAEEQayIAJAAgACAEKAIINgIMIAAgATYCCCAAIAI2AgQCfyAAKAIMIQIgACgCCCEDIAAoAgQhBUEYEAQiAQRAIAFCgYCAgBA3AgwgASAFNgIIIAEgAzYCBCABIAI2AgAgAiADbCECIAEgBUEBayIDQQVNBH8gA0ECdEGIHGooAgAFQQQLIAJsEAQiAjYCFCABIAINARogARACC0EACyEGIABBEGokACAEQRBqJAAgBgu1qwQEa38IfAN9A34jAEEQayIkJAAgJCAANgIMICQgATYCCCAkIAI2AgQgJCADNgIAICQoAgQhACAkKAIAIQEjAEEQayIiJAAgIiAkKAIINgIMICIgADYCCCAiIAE2AgQgIiAiKAIMNgIAICIoAgQhAUEAIQJBACEDIwBB0AFrIhwkACAcICIoAgAgIigCCGoiADYCyAEgHEEANgI4IBxBADYCKCAcIAAgAWoiATYCzAEgHCAANgLAASAcIAE2AsQBQQAhACMAQZAQayIjJAAjAEGAkQJrIhkkACAjQQA2AgwgI0IINwIE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IAdBPzYC1I8BCyAHQQA2AsiPASAHQgA3AryPASAHQQA2AoyPASAHQQA2AsSOASAHQQA2AvyNASAHQf8BOgDEjwEgB0EANgK0jQEgB0EANgLgjwEgByAHKAKEkAEiAUH/////ByABGyIONgKIkAEgBygC8I8BIQEgBUUEQCABQQFGBEAgByAHKAL0jwEiBkHIAGxqIgFBvI0BaigCACIIQQBMDQcgAUG4jQFqKAIAIgVBAEwNByABQcCNAWohCSABQciNAWohBCABQaiNAWohCiABQayNAWohDiABQbCNAWohEEEBIAhBB2pBA3UiASABQQFMGyEIQQEgBUEHakEDdSIBIAFBAUwbIQVBACELA0AgC0EDdCEPQQAhAQNAIAcgGUEgaiIRIBggDigCAEGQDWxqIBcgECgCACIVQZANbGogByAVQQp0akGE7QBqIAYgByAKKAIAQQd0akGE6QBqECZFDQ0gBCgCACAPIAkoAgAiFWxqIAFBA3RqIBUgESAHKAKMkAERBAAgByAHKAKIkAEiEUEBazYCiJABIBFBAUwEQCAHKALAjwFBF0wEQCAHEAULIActAMSPAUH4AXFB0AFHDQogB0EANgLIjwEgB0IANwK8jwEgB0EANgKMjwEgB0EANgLEjgEgB0EANgL8jQEgB0H/AToAxI8BIAdBADYCtI0BIAdBADYC4I8BIAcgBygChJABIhFB/////wcgERs2AoiQAQsgAUEBaiIBIAVHDQALIAtBAWoiCyAIRw0ACwwHCyAHKAKQjQEiBUEATA0GQQAhECAHKAKMjQEiAUEATA0GA0BBACEJIAFBAEoEQANAQQAhCCAHKALwjwEiBkEASgRAA0ACQCAHIAcgCEECdGpB9I8BaigCACILQcgAbGoiAUGkjQFqIgQoAgAiBUEATA0AIAFBoI0BaiIPKAIAIg5BAEwNACABQcCNAWohBiABQciNAWohESABQaiNAWohFSABQayNAWohEyABQbCNAWohEkEAIQoDQEEAIQEgDkEASgRAA0AgBCgCACEFIAcgGUEgaiIUIBggEygCAEGQDWxqIBcgEigCACIWQZANbGogByAWQQp0akGE7QBqIAsgByAVKAIAQQd0akGE6QBqECZFDRMgESgCACAGKAIAIhYgBSAQbCAKamxBA3RqIAkgDmwgAWpBA3RqIBYgFCAHKAKM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IG9mIG1lbW9yeQBKUEVHIGZvcm1hdCBub3Qgc3VwcG9ydGVkOiA4LWJpdCBvbmx5AFBORyBub3Qgc3VwcG9ydGVkOiAxLzIvNC84LzE2LWJpdCBvbmx5AFBJQyBmaWxlIHRvbyBzaG9ydABJbWFnZSBub3Qgb2YgYW55IGtub3duIHR5cGUsIG9yIGNvcnJ1cHQAUFBNIGltYWdlIG5vdCA4LWJpdABQU0QgYml0IGRlcHRoIGlzIG5vdCA4IG9yIDE2IGJpdABKUEVHIGZvcm1hdCBub3Qgc3VwcG9ydGVkOiBkZWxheWVkIGhlaWdodABDYW4ndCBmaW5kIG91dCBUR0EgcGl4ZWxmb3JtYXQAUFNEIGlzIG5vdCBpbiBSR0IgY29sb3IgZm9ybWF0AFBTRCBoYXMgYW4gdW5rbm93biBjb21wcmVzc2lvbiBmb3JtYXQAVW5zdXBwb3J0ZWQgSERSIGZvcm1hdAB0b28gbWFueSBwYWNrZXRzAEludGVybmFsIGVycm9yAHBhY2tldCBpc24ndCA4YnBwAEJNUCB0eXBlIG5vdCBzdXBwb3J0ZWQ6IHVua25vd24Ac2NhbmxpbmUgb3ZlcnJ1bgBwYWNrZXQgaGFzIGJhZCBjb21wcmVzc2lvbiB0eXBlAFBORyBub3Qgc3VwcG9ydGVkOiB1bmtub3duIFBORyBjaHVuayB0eXBlAEhEUiBpbWFnZSBpcyB0b28gbGFyZ2UAR0lGIGltYWdlIGlzIHRvbyBsYXJnZQBQTk0gdG9vIGxhcmdlAENvcnJ1cHQgSERSIGltYWdlAENvcnJ1cHQgUFNEIGltYWdlAFVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscyBpbiBQU0QgaW1hZ2UAVW5zdXBwb3J0ZWQgdmVyc2lvbiBvZiBQU0QgaW1hZ2UAUElDIGltYWdlIHRvbyBsYXJnZSB0byBkZWNvZGUASW1hZ2UgdG9vIGxhcmdlIHRvIGRlY29kZQBGT1JNQVQ9MzItYml0X3JsZV9yZ2JlAGJhZCBSTEUgZGF0YQBQSUNUAGNvcnJ1cHQgSERSAGJhZCBSTEUgZGF0YSBpbiBIRFIAQ29ycnVwdCBCTVAAYmFkIEJNUABDb3JydXB0IFBORwBOb3QgYSBQTkcAQ29ycnVwdCBKUEVHAENvcnJ1cHQgR0lGAEJNUCB0eXBlIG5vdCBzdXBwb3J0ZWQ6IFJMRQAjP1JBRElBTkNFACM/UkdCRQBDb3JydXB0IFBTRABDb3JydXB0IFRHQQBTgPY0AGZpbGUgdG9vIHNob3J0IChwdXJlIHJlYWQgY291bnQpAGZpbGUgdG9vIHNob3J0IChtaXhlZCByZWFkIGNvdW50KQBmaWxlIHRvbyBzaG9ydCAocmVhZGluZyBwYWNrZXRzKQBmaWxlIHRvbyBzaG9ydCAocGljIGhlYWRlcikAVmVyeSBsYXJnZSBpbWFnZSAoY29ycnVwdD8pAC1ZIAArWCAAIz9SQURJQU5DRQoAQZERC1EBCBAJAgMKERggGRILBAUMExohKDApIhsUDQYHDhUcIyoxODkyKyQdFg8XHiUsMzo7NC0mHycuNTw9Ni83Pj8/Pz8/Pz8/Pz8/Pz8/Pz9SR0IAQfQRCz4BAAAAAwAAAAcAAAAPAAAAHwAAAD8AAAB/AAAA/wAAAP8BAAD/AwAA/wcAAP8PAAD/HwAA/z8AAP9/AAD//wBBxBILRf/////9////+f////H////h////wf///4H///8B////Af7//wH8//8B+P//AfD//wHg//8BwP//AYD//wD/VQARAAAAAQBBlBMLEQQAAAAAAAAAAgAAAAAAAAABAEG4EwtZBAAAAAAAAAACAAAAAAAAAAEAAAAAAAAACAAAAAgAAAAEAAAABAAAAAIAAAACAAAAAQAAAAAAAAAIAAAACAAAAAgAAAAEAAAABAAAAAIAAAACAAAAAAEABQYAQaQUCx3/AAAAVQAAAEkAAAARAAAAIQAAAEEAAACBAAAAAQBB3BQLEQEAAAAAAAAAAgAAAAQAAAAGAEGAFQvTAggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJ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";if(!N(O)){var P=O;O=d.locateFile?d.locateFile(P,t):t+P} function ca(){var a=O;return Promise.resolve().then(()=>{if(a==O&&z)var b=new Uint8Array(z);else{if(N(a)){var c=a.slice(37);if("undefined"!=typeof q&&q)b=Buffer.from(c,"base64"),b=new Uint8Array(b.buffer,b.byteOffset,b.length);else try{var e=atob(c),f=new Uint8Array(e.length);for(c=0;cWebAssembly.instantiate(c,a)).then(c=>c).then(b,c=>{y(`failed to asynchronously prepare wasm: ${c}`);A(c)})}function ea(a,b){return da(a,b)} var Q=a=>{for(;0{if(a){var c=E,e=a+b;for(b=a;c[b]&&!(b>=e);)++b;if(16f?e+=String.fromCharCode(f):(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else e+= From 4ef01e710e3f2bcee116e0fd313c3905e68c67ed Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 14 May 2024 22:30:00 -0300 Subject: [PATCH 020/114] fix read pixel --- .../java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java index 066afb37..42d053dd 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java @@ -824,7 +824,8 @@ else if(pixels instanceof IntBuffer) { else { throw new GdxRuntimeException("Inputed pixels buffer not supported."); } - gl.readPixels(x, y, width, height, format, type, typedArray); + Uint8ArrayWrapper uint8Array = TypedArrays.createUint8Array(typedArray.getBuffer(), 0); + gl.readPixels(x, y, width, height, format, type, uint8Array); } @Override From 2e29f856ece8bae59933499e3bc084b7c14b5886 Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 14 May 2024 22:53:20 -0300 Subject: [PATCH 021/114] Fix readpixel --- .../xpenatan/gdx/backends/teavm/TeaGL20.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java index 42d053dd..ba8e736d 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java @@ -76,17 +76,17 @@ public TeaGL20(WebGLRenderingContextWrapper gl) { public Float32ArrayWrapper copy(FloatBuffer buffer) { ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray(buffer); - return TypedArrays.createFloat32Array(typedArray.getBuffer(), 0); + return TypedArrays.createFloat32Array(typedArray.getBuffer(), buffer.position(), buffer.remaining()); } public Int16ArrayWrapper copy(ShortBuffer buffer) { ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray(buffer); - return TypedArrays.createInt16Array(typedArray.getBuffer(), 0); + return TypedArrays.createInt16Array(typedArray.getBuffer(), buffer.position(), buffer.remaining()); } public Int32ArrayWrapper copy(IntBuffer buffer) { ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray(buffer); - return TypedArrays.createInt32Array(typedArray.getBuffer(), 0); + return TypedArrays.createInt32Array(typedArray.getBuffer(), buffer.position(), buffer.remaining()); } public Int8ArrayWrapper copy(ByteBuffer buffer) { @@ -824,8 +824,12 @@ else if(pixels instanceof IntBuffer) { else { throw new GdxRuntimeException("Inputed pixels buffer not supported."); } - Uint8ArrayWrapper uint8Array = TypedArrays.createUint8Array(typedArray.getBuffer(), 0); - gl.readPixels(x, y, width, height, format, type, uint8Array); + + // create new ArrayBufferView (4 bytes per pixel) + int size = 4 * width * height; + Uint8ArrayWrapper buffer = TypedArrays.createUint8Array(typedArray.getBuffer(), typedArray.getByteOffset(), size); + + gl.readPixels(x, y, width, height, format, type, buffer); } @Override From 405b1f1894911bed0cb0d058789d3fc33ffb6b6a Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 15 May 2024 20:52:47 -0300 Subject: [PATCH 022/114] Clean up --- .../github/xpenatan/gdx/backends/teavm/TeaGL20.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java index ba8e736d..552ba756 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaGL20.java @@ -79,20 +79,11 @@ public Float32ArrayWrapper copy(FloatBuffer buffer) { return TypedArrays.createFloat32Array(typedArray.getBuffer(), buffer.position(), buffer.remaining()); } - public Int16ArrayWrapper copy(ShortBuffer buffer) { - ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray(buffer); - return TypedArrays.createInt16Array(typedArray.getBuffer(), buffer.position(), buffer.remaining()); - } - public Int32ArrayWrapper copy(IntBuffer buffer) { ArrayBufferViewWrapper typedArray = TypedArrays.getTypedArray(buffer); return TypedArrays.createInt32Array(typedArray.getBuffer(), buffer.position(), buffer.remaining()); } - public Int8ArrayWrapper copy(ByteBuffer buffer) { - return (Int8ArrayWrapper)TypedArrays.getTypedArray(buffer); - } - protected WebGLUniformLocationWrapper getUniformLocation(int location) { return uniforms.get(currProgram).get(location); } @@ -830,6 +821,8 @@ else if(pixels instanceof IntBuffer) { Uint8ArrayWrapper buffer = TypedArrays.createUint8Array(typedArray.getBuffer(), typedArray.getByteOffset(), size); gl.readPixels(x, y, width, height, format, type, buffer); + + pixels.limit(size); } @Override From 1cb22822a35bb3149cdcf7e2fdb14c1b0f87a11e Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 15 May 2024 21:49:01 -0300 Subject: [PATCH 023/114] Small resource fix --- .../teavm/config/TeaVMResourceProperties.java | 17 +++++++++-------- .../resources/META-INF/gdx-teavm.properties | 1 + 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaVMResourceProperties.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaVMResourceProperties.java index 451a37fb..2f179325 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaVMResourceProperties.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaVMResourceProperties.java @@ -66,21 +66,22 @@ public static List getResources(ArrayList acceptedURL) { boolean accept = false; for(TeaVMResourceProperties properties : propertiesList) { ignoreResources.addAll(properties.ignorePath); + // Accept if properties exist in current path if(path.contains(properties.path)) { accept = true; break; } - if(!accept) { - for(String additionalPath : properties.additionalPath) { - if(path.contains(additionalPath)) { - accept = true; - break; - } - } - if(accept) { + for(String additionalPath : properties.additionalPath) { + // Check if the jar path contains in properties + if(path.contains(additionalPath)) { + accept = true; break; } } + + if(accept) { + break; + } } if(accept) { URI uri = URI.create("jar:file:" + path); diff --git a/backends/backend-teavm/src/main/resources/META-INF/gdx-teavm.properties b/backends/backend-teavm/src/main/resources/META-INF/gdx-teavm.properties index e77e3eb9..8d864f50 100644 --- a/backends/backend-teavm/src/main/resources/META-INF/gdx-teavm.properties +++ b/backends/backend-teavm/src/main/resources/META-INF/gdx-teavm.properties @@ -1,3 +1,4 @@ resources=com.badlogicgames.gdx/gdx/ +resources=build/libs/gdx- resources=com.github.mgsx-dev.gdx-gltf/gltf/ ignore-resources=startup-logo.png \ No newline at end of file From cb5a48d350237e56073c700aed7927c78ca1ae91 Mon Sep 17 00:00:00 2001 From: Natan Date: Fri, 24 May 2024 22:02:42 -0300 Subject: [PATCH 024/114] fix copying gltf resources --- .../src/main/resources/META-INF/gdx-teavm.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/backends/backend-teavm/src/main/resources/META-INF/gdx-teavm.properties b/backends/backend-teavm/src/main/resources/META-INF/gdx-teavm.properties index 8d864f50..18c6b1f6 100644 --- a/backends/backend-teavm/src/main/resources/META-INF/gdx-teavm.properties +++ b/backends/backend-teavm/src/main/resources/META-INF/gdx-teavm.properties @@ -1,4 +1,5 @@ resources=com.badlogicgames.gdx/gdx/ resources=build/libs/gdx- resources=com.github.mgsx-dev.gdx-gltf/gltf/ +resources=build/libs/gltf- ignore-resources=startup-logo.png \ No newline at end of file From 12ee01747802afa302f689cfc1ba400f1b4c9ddc Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 25 May 2024 18:33:28 -0300 Subject: [PATCH 025/114] throw when file is null --- .../emu/com/badlogic/gdx/graphics/PixmapEmu.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java index 9330c14f..c3ec9bf2 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java @@ -94,7 +94,10 @@ public PixmapEmu(FileHandle file) { TeaFileHandle webFileHandler = (TeaFileHandle)file; String path = webFileHandler.path(); Blob object = webFileHandler.preloader.images.get(path); - + if(object == null) { + // Add a way to debug when assets was not loaded in preloader. + throw new GdxRuntimeException("File is null, it does not exist: " + path); + } Int8ArrayWrapper response = object.getData(); byte[] bytes = TypedArrays.toByteArray(response); nativePixmap = new Gdx2DPixmapEmu(bytes, 0, bytes.length, 0); From 2080b91152ecbe6306470e1b5dab1b73d413a21a Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 28 May 2024 20:14:39 -0300 Subject: [PATCH 026/114] remove comment from adding directory asset --- .../github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java index 6841e704..106cb723 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java @@ -245,7 +245,7 @@ private static void copyFile(FileWrapper source, FileWrapper dest, AssetFilter f private static void copyDirectory(FileWrapper sourceDir, FileWrapper destDir, AssetFilter filter, ArrayList assets) { if(!filter.accept(destDir.path(), true)) return; - // assets.add(new Asset(destDir, AssetType.Directory)); + assets.add(new Asset(destDir, AssetType.Directory)); destDir.mkdirs(); FileWrapper[] files = sourceDir.list(); for(int i = 0, n = files.length; i < n; i++) { From b05d185c8ccd3ba39caa0ae29c5ecd4c3fb450b8 Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 28 May 2024 20:26:38 -0300 Subject: [PATCH 027/114] add file test --- .../gdx/examples/tests/FilesTest.java | 478 ++++++++++++++++++ examples/core/desktop/assets/data/cube.mtl | 7 + examples/core/desktop/assets/data/cube.obj | 82 +++ .../core/desktop/assets/data/lsans-15.fnt | 175 +++++++ .../core/desktop/assets/data/lsans-15.png | Bin 0 -> 10373 bytes .../core/desktop/assets/data/lsans-15_00.png | Bin 0 -> 7157 bytes examples/core/desktop/assets/test.txt | 1 - .../xpenatan/gdx/examples/desktop/Main.java | 4 +- .../gdx/examples/teavm/BuildArtemisTest.java | 28 - .../gdx/examples/teavm/BuildLoadingTest.java | 24 - .../examples/teavm/BuildReflectionTest.java | 26 - .../examples/teavm/BuildTeaVMTestDemo.java | 5 +- .../teavm/launcher/TeaVMTestLauncher.java | 3 +- 13 files changed, 750 insertions(+), 83 deletions(-) create mode 100644 examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java create mode 100644 examples/core/desktop/assets/data/cube.mtl create mode 100644 examples/core/desktop/assets/data/cube.obj create mode 100644 examples/core/desktop/assets/data/lsans-15.fnt create mode 100644 examples/core/desktop/assets/data/lsans-15.png create mode 100644 examples/core/desktop/assets/data/lsans-15_00.png delete mode 100644 examples/core/desktop/assets/test.txt delete mode 100644 examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildArtemisTest.java delete mode 100644 examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildLoadingTest.java delete mode 100644 examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildReflectionTest.java diff --git a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java new file mode 100644 index 00000000..1c3317c5 --- /dev/null +++ b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java @@ -0,0 +1,478 @@ +package com.github.xpenatan.gdx.examples.tests; + +import com.badlogic.gdx.ApplicationListener; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.util.Arrays; + +import com.badlogic.gdx.Application.ApplicationType; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.utils.GdxRuntimeException; +import com.badlogic.gdx.utils.StreamUtils; + +public class FilesTest implements ApplicationListener { + String message = ""; + boolean success; + BitmapFont font; + SpriteBatch batch; + + @Override + public void create() { + font = new BitmapFont(Gdx.files.internal("data/lsans-15.fnt"), false); + batch = new SpriteBatch(); + + if(Gdx.files.isExternalStorageAvailable()) { + message += "External storage available\n"; + message += "External storage path: " + Gdx.files.getExternalStoragePath() + "\n"; + + try { + InputStream in = Gdx.files.internal("data/cube.obj").read(); + StreamUtils.closeQuietly(in); + message += "Open internal success\n"; + } catch(Throwable e) { + message += "Couldn't open internal data/cube.obj\n" + e.getMessage() + "\n"; + } + + BufferedWriter out = null; + try { + out = new BufferedWriter(new OutputStreamWriter(Gdx.files.external("test.txt").write(false))); + out.write("test"); + message += "Write external success\n"; + } catch(GdxRuntimeException ex) { + message += "Couldn't open externalstorage/test.txt\n"; + } catch(IOException e) { + message += "Couldn't write externalstorage/test.txt\n"; + } finally { + StreamUtils.closeQuietly(out); + } + + try { + InputStream in = Gdx.files.external("test.txt").read(); + StreamUtils.closeQuietly(in); + message += "Open external success\n"; + } catch(Throwable e) { + message += "Couldn't open internal externalstorage/test.txt\n" + e.getMessage() + "\n"; + } + + BufferedReader in = null; + try { + in = new BufferedReader(new InputStreamReader(Gdx.files.external("test.txt").read())); + if(!in.readLine().equals("test")) + message += "Read result wrong\n"; + else + message += "Read external success\n"; + } catch(GdxRuntimeException ex) { + message += "Couldn't open externalstorage/test.txt\n"; + } catch(IOException e) { + message += "Couldn't read externalstorage/test.txt\n"; + } finally { + StreamUtils.closeQuietly(in); + } + + if(!Gdx.files.external("test.txt").delete()) message += "Couldn't delete externalstorage/test.txt"; + } + else { + message += "External storage not available"; + } + if(Gdx.files.isLocalStorageAvailable()) { + message += "Local storage available\n"; + message += "Local storage path: " + Gdx.files.getLocalStoragePath() + "\n"; + + BufferedWriter out = null; + try { + out = new BufferedWriter(new OutputStreamWriter(Gdx.files.local("test.txt").write(false))); + out.write("test"); + message += "Write local success\n"; + } catch(GdxRuntimeException ex) { + message += "Couldn't open localstorage/test.txt\n"; + } catch(IOException e) { + message += "Couldn't write localstorage/test.txt\n"; + } finally { + StreamUtils.closeQuietly(out); + } + + try { + InputStream in = Gdx.files.local("test.txt").read(); + StreamUtils.closeQuietly(in); + message += "Open local success\n"; + } catch(Throwable e) { + message += "Couldn't open localstorage/test.txt\n" + e.getMessage() + "\n"; + } + + BufferedReader in = null; + try { + in = new BufferedReader(new InputStreamReader(Gdx.files.local("test.txt").read())); + if(!in.readLine().equals("test")) + message += "Read result wrong\n"; + else + message += "Read local success\n"; + } catch(GdxRuntimeException ex) { + message += "Couldn't open localstorage/test.txt\n"; + } catch(IOException e) { + message += "Couldn't read localstorage/test.txt\n"; + } finally { + StreamUtils.closeQuietly(in); + } + + try { + byte[] testBytes = Gdx.files.local("test.txt").readBytes(); + if(Arrays.equals("test".getBytes(), testBytes)) + message += "Read into byte array success\n"; + else + fail(); + } catch(Throwable e) { + message += "Couldn't read localstorage/test.txt\n" + e.getMessage() + "\n"; + } + + if(!Gdx.files.local("test.txt").delete()) message += "Couldn't delete localstorage/test.txt"; + } + try { + testClasspath(); + testInternal(); + if(!(Gdx.app.getType() == ApplicationType.WebGL)) { + testExternal(); + testAbsolute(); + testLocal(); + } + } catch(IOException ex) { + throw new RuntimeException(ex); + } + } + + @Override + public void resize(int width, int height) { + + } + + private void testClasspath() throws IOException { + // no classpath support on ios + if(Gdx.app.getType() == ApplicationType.iOS) return; + FileHandle handle = Gdx.files.classpath("com/badlogic/gdx/utils/lsans-15.png"); + if(!handle.exists()) fail(); + if(handle.isDirectory()) fail(); + try { + handle.delete(); + fail(); + } catch(Exception expected) { + } + try { + handle.list(); + fail(); + } catch(Exception expected) { + } + try { + handle.read().close(); + fail(); + } catch(Exception ignored) { + } + FileHandle dir = Gdx.files.classpath("com/badlogic/gdx/utils"); + if(dir.isDirectory()) fail(); + FileHandle child = dir.child("lsans-15.fnt"); + if(!child.name().equals("lsans-15.fnt")) fail(); + if(!child.nameWithoutExtension().equals("lsans-15")) fail(); + if(!child.extension().equals("fnt")) fail(); + handle.read().close(); + if(handle.readBytes().length != handle.length()) fail(); + } + + private void testInternal() throws IOException { + FileHandle handle = Gdx.files.internal("data/badlogic.jpg"); + if(!handle.exists()) fail("Couldn't find internal file"); + if(handle.isDirectory()) fail("Internal file shouldn't be a directory"); + try { + handle.delete(); + fail("Shouldn't be able to delete internal file"); + } catch(Exception expected) { + } + if(handle.list().length != 0) fail("File length shouldn't be 0"); + if(Gdx.app.getType() != ApplicationType.Android) { + FileHandle parent = handle.parent(); + System.out.println("PATH: " + parent.path()); + boolean exists = parent.exists(); + if(!exists) fail("Parent doesn't exist"); + } + try { + handle.read().close(); + fail(); + } catch(Exception ignored) { + } + FileHandle dir = Gdx.files.internal("data"); + if(Gdx.app.getType() != ApplicationType.Android) { + if(!dir.exists()) fail(); + } + if(!dir.isDirectory()) fail(); + if(dir.list().length == 0) fail(); + Gdx.app.log("FilesTest", "Files in data: " + Arrays.toString(dir.list()) + " (" + dir.list().length + ")"); + FileHandle child = dir.child("badlogic.jpg"); + if(!child.name().equals("badlogic.jpg")) fail(); + if(!child.nameWithoutExtension().equals("badlogic")) fail(); + if(!child.extension().equals("jpg")) fail(); + if(Gdx.app.getType() != ApplicationType.Android) { + if(!child.parent().exists()) fail(); + } + if(!(Gdx.app.getType() == ApplicationType.WebGL)) { + FileHandle copy = Gdx.files.external("badlogic.jpg-copy"); + copy.delete(); + if(copy.exists()) fail(); + handle.copyTo(copy); + if(!copy.exists()) fail(); + if(copy.length() != 68465) fail(); + copy.delete(); + if(copy.exists()) fail(); + } + handle.read().close(); + if(handle.readBytes().length != handle.length()) fail(); + } + + private void testExternal() throws IOException { + String path = "meow"; + FileHandle handle = Gdx.files.external(path); + handle.delete(); + if(handle.exists()) fail(); + if(handle.isDirectory()) fail(); + if(handle.delete()) fail(); + if(handle.list().length != 0) fail(); + if(handle.child("meow").exists()) fail(); + if(!handle.parent().exists()) fail(); + try { + handle.read().close(); + fail(); + } catch(Exception ignored) { + } + handle.mkdirs(); + if(!handle.exists()) fail(); + if(!handle.isDirectory()) fail(); + if(handle.list().length != 0) fail(); + handle.child("meow").mkdirs(); + if(handle.list().length != 1) fail(); + FileHandle child = handle.list()[0]; + if(!child.name().equals("meow")) fail(); + if(!child.parent().exists()) fail(); + if(!handle.deleteDirectory()) fail(); + if(handle.exists()) fail(); + OutputStream output = handle.write(false); + output.write("moo".getBytes()); + output.close(); + if(!handle.exists()) fail(); + if(handle.length() != 3) fail(); + FileHandle copy = Gdx.files.external(path + "-copy"); + copy.delete(); + if(copy.exists()) fail(); + handle.copyTo(copy); + if(!copy.exists()) fail(); + if(copy.length() != 3) fail(); + FileHandle move = Gdx.files.external(path + "-move"); + move.delete(); + if(move.exists()) fail(); + copy.moveTo(move); + if(!move.exists()) fail(); + if(move.length() != 3) fail(); + move.deleteDirectory(); + if(move.exists()) fail(); + InputStream input = handle.read(); + byte[] bytes = new byte[6]; + if(input.read(bytes) != 3) fail(); + input.close(); + if(!new String(bytes, 0, 3).equals("moo")) fail(); + output = handle.write(true); + output.write("cow".getBytes()); + output.close(); + if(handle.length() != 6) fail(); + input = handle.read(); + if(input.read(bytes) != 6) fail(); + input.close(); + if(!new String(bytes, 0, 6).equals("moocow")) fail(); + if(handle.isDirectory()) fail(); + if(handle.list().length != 0) fail(); + if(!handle.name().equals("meow")) fail(); + if(!handle.nameWithoutExtension().equals("meow")) fail(); + if(!handle.extension().equals("")) fail(); + handle.deleteDirectory(); + if(handle.exists()) fail(); + if(handle.isDirectory()) fail(); + handle.delete(); + handle.deleteDirectory(); + } + + private void testAbsolute() throws IOException { + String path = new File(Gdx.files.getExternalStoragePath(), "meow").getAbsolutePath(); + FileHandle handle = Gdx.files.absolute(path); + handle.delete(); + if(handle.exists()) fail(); + if(handle.isDirectory()) fail(); + if(handle.delete()) fail(); + if(handle.list().length != 0) fail(); + if(handle.child("meow").exists()) fail(); + if(!handle.parent().exists()) fail(); + try { + handle.read().close(); + fail(); + } catch(Exception ignored) { + } + handle.mkdirs(); + if(!handle.exists()) fail(); + if(!handle.isDirectory()) fail(); + if(handle.list().length != 0) fail(); + handle.child("meow").mkdirs(); + if(handle.list().length != 1) fail(); + FileHandle child = handle.list()[0]; + if(!child.name().equals("meow")) fail(); + if(!child.parent().exists()) fail(); + if(!handle.deleteDirectory()) fail(); + if(handle.exists()) fail(); + OutputStream output = handle.write(false); + output.write("moo".getBytes()); + output.close(); + if(!handle.exists()) fail(); + if(handle.length() != 3) fail(); + FileHandle copy = Gdx.files.absolute(path + "-copy"); + copy.delete(); + if(copy.exists()) fail(); + handle.copyTo(copy); + if(!copy.exists()) fail(); + if(copy.length() != 3) fail(); + FileHandle move = Gdx.files.absolute(path + "-move"); + move.delete(); + if(move.exists()) fail(); + copy.moveTo(move); + if(!move.exists()) fail(); + if(move.length() != 3) fail(); + move.deleteDirectory(); + if(move.exists()) fail(); + InputStream input = handle.read(); + byte[] bytes = new byte[6]; + if(input.read(bytes) != 3) fail(); + input.close(); + if(!new String(bytes, 0, 3).equals("moo")) fail(); + output = handle.write(true); + output.write("cow".getBytes()); + output.close(); + if(handle.length() != 6) fail(); + input = handle.read(); + if(input.read(bytes) != 6) fail(); + input.close(); + if(!new String(bytes, 0, 6).equals("moocow")) fail(); + if(handle.isDirectory()) fail(); + if(handle.list().length != 0) fail(); + if(!handle.name().equals("meow")) fail(); + if(!handle.nameWithoutExtension().equals("meow")) fail(); + if(!handle.extension().equals("")) fail(); + handle.deleteDirectory(); + if(handle.exists()) fail(); + if(handle.isDirectory()) fail(); + handle.delete(); + handle.deleteDirectory(); + } + + private void testLocal() throws IOException { + String path = "meow"; + FileHandle handle = Gdx.files.local(path); + handle.delete(); + if(handle.exists()) fail(); + if(handle.isDirectory()) fail(); + if(handle.delete()) fail(); + if(handle.list().length != 0) fail(); + if(handle.child("meow").exists()) fail(); + if(!handle.parent().exists()) fail(); + try { + handle.read().close(); + fail(); + } catch(Exception ignored) { + } + handle.mkdirs(); + if(!handle.exists()) fail(); + if(!handle.isDirectory()) fail(); + if(handle.list().length != 0) fail(); + handle.child("meow").mkdirs(); + if(handle.list().length != 1) fail(); + FileHandle child = handle.list()[0]; + if(!child.name().equals("meow")) fail(); + if(!child.parent().exists()) fail(); + if(!handle.deleteDirectory()) fail(); + if(handle.exists()) fail(); + OutputStream output = handle.write(false); + output.write("moo".getBytes()); + output.close(); + if(!handle.exists()) fail(); + if(handle.length() != 3) fail(); + FileHandle copy = Gdx.files.local(path + "-copy"); + copy.delete(); + if(copy.exists()) fail(); + handle.copyTo(copy); + if(!copy.exists()) fail(); + if(copy.length() != 3) fail(); + FileHandle move = Gdx.files.local(path + "-move"); + move.delete(); + if(move.exists()) fail(); + copy.moveTo(move); + if(!move.exists()) fail(); + if(move.length() != 3) fail(); + move.deleteDirectory(); + if(move.exists()) fail(); + InputStream input = handle.read(); + byte[] bytes = new byte[6]; + if(input.read(bytes) != 3) fail(); + input.close(); + if(!new String(bytes, 0, 3).equals("moo")) fail(); + output = handle.write(true); + output.write("cow".getBytes()); + output.close(); + if(handle.length() != 6) fail(); + input = handle.read(); + if(input.read(bytes) != 6) fail(); + input.close(); + if(!new String(bytes, 0, 6).equals("moocow")) fail(); + if(handle.isDirectory()) fail(); + if(handle.list().length != 0) fail(); + if(!handle.name().equals("meow")) fail(); + if(!handle.nameWithoutExtension().equals("meow")) fail(); + if(!handle.extension().equals("")) fail(); + handle.deleteDirectory(); + if(handle.exists()) fail(); + if(handle.isDirectory()) fail(); + handle.delete(); + handle.deleteDirectory(); + } + + private void fail() { + throw new RuntimeException(); + } + + private void fail(String msg) { + throw new RuntimeException(msg); + } + + @Override + public void render() { + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + batch.begin(); + font.draw(batch, message, 20, Gdx.graphics.getHeight() - 20); + batch.end(); + } + + @Override + public void pause() { + + } + + @Override + public void resume() { + + } + + @Override + public void dispose() { + batch.dispose(); + font.dispose(); + } +} diff --git a/examples/core/desktop/assets/data/cube.mtl b/examples/core/desktop/assets/data/cube.mtl new file mode 100644 index 00000000..a88c8ca8 --- /dev/null +++ b/examples/core/desktop/assets/data/cube.mtl @@ -0,0 +1,7 @@ +newmtl cube1_auv +illum 4 +Kd 1.00 1.00 1.00 +Ka 0.00 0.00 0.00 +Tf 1.00 1.00 1.00 +map_Kd badlogic.jpg +Ni 1.00 \ No newline at end of file diff --git a/examples/core/desktop/assets/data/cube.obj b/examples/core/desktop/assets/data/cube.obj new file mode 100644 index 00000000..ce0d25ad --- /dev/null +++ b/examples/core/desktop/assets/data/cube.obj @@ -0,0 +1,82 @@ +# Exported from Wings 3D 1.3.0.1 +mtllib cube.mtl +o cube1 +#8 vertices, 12 faces +v -1.00000000 -1.00000000 1.00000000 +v -1.00000000 1.00000000 1.00000000 +v 1.00000000 1.00000000 1.00000000 +v 1.00000000 -1.00000000 1.00000000 +v -1.00000000 -1.00000000 -1.00000000 +v -1.00000000 1.00000000 -1.00000000 +v 1.00000000 1.00000000 -1.00000000 +v 1.00000000 -1.00000000 -1.00000000 +vt 0.0000000e+0 1.1102230e-16 +vt 0.0000000e+0 2.2204460e-16 +vt 0.0000000e+0 1.00000000 +vt 2.2204460e-16 2.2204460e-16 +vt 2.2204460e-16 4.4408921e-16 +vt 2.2204460e-16 1.00000000 +vt 4.4408921e-16 0.0000000e+0 +vt 4.4408921e-16 2.2204460e-16 +vt 4.4408921e-16 1.00000000 +vt 1.00000000 1.1102230e-16 +vt 1.00000000 1.00000000 +vt 1.00000000 1.00000000 +vt 1.00000000 0.0000000e+0 +vt 1.00000000 2.2204460e-16 +vt 1.00000000 4.4408921e-16 +vt 1.00000000 1.00000000 +vn 0.0000000e+0 -1.00000000 0.0000000e+0 +vn 0.0000000e+0 0.0000000e+0 1.00000000 +vn -1.00000000 0.0000000e+0 0.0000000e+0 +vn 0.0000000e+0 0.0000000e+0 1.00000000 +vn -1.00000000 0.0000000e+0 0.0000000e+0 +vn 0.0000000e+0 0.0000000e+0 1.00000000 +vn -1.00000000 0.0000000e+0 0.0000000e+0 +vn 0.0000000e+0 1.00000000 0.0000000e+0 +vn 0.0000000e+0 1.00000000 0.0000000e+0 +vn 0.0000000e+0 0.0000000e+0 1.00000000 +vn 1.00000000 0.0000000e+0 0.0000000e+0 +vn 0.0000000e+0 1.00000000 0.0000000e+0 +vn 0.0000000e+0 -1.00000000 0.0000000e+0 +vn 0.0000000e+0 0.0000000e+0 1.00000000 +vn 0.0000000e+0 0.0000000e+0 1.00000000 +vn 0.0000000e+0 -1.00000000 0.0000000e+0 +vn 1.00000000 0.0000000e+0 0.0000000e+0 +vn 1.00000000 0.0000000e+0 0.0000000e+0 +vn 0.0000000e+0 -1.00000000 0.0000000e+0 +vn 0.0000000e+0 0.0000000e+0 -1.00000000 +vn -1.00000000 0.0000000e+0 0.0000000e+0 +vn 0.0000000e+0 -1.00000000 0.0000000e+0 +vn 0.0000000e+0 0.0000000e+0 -1.00000000 +vn -1.00000000 0.0000000e+0 0.0000000e+0 +vn -1.00000000 0.0000000e+0 0.0000000e+0 +vn 0.0000000e+0 0.0000000e+0 -1.00000000 +vn 0.0000000e+0 1.00000000 0.0000000e+0 +vn 0.0000000e+0 0.0000000e+0 -1.00000000 +vn 1.00000000 0.0000000e+0 0.0000000e+0 +vn 0.0000000e+0 0.0000000e+0 -1.00000000 +vn 0.0000000e+0 1.00000000 0.0000000e+0 +vn 1.00000000 0.0000000e+0 0.0000000e+0 +vn 0.0000000e+0 1.00000000 0.0000000e+0 +vn 0.0000000e+0 0.0000000e+0 -1.00000000 +vn 0.0000000e+0 -1.00000000 0.0000000e+0 +vn 1.00000000 0.0000000e+0 0.0000000e+0 +g cube1_cube1_auv +usemtl cube1_auv +s 1 +f 1/8/1 5/9/19 4/14/13 +f 2/14/8 7/6/31 6/16/27 +f 4/10/17 7/3/29 3/12/11 +f 7/16/28 8/13/34 5/7/20 +s 2 +f 1/15/2 4/4/15 2/16/6 +f 3/5/12 7/6/33 2/14/9 +f 5/9/22 8/16/35 4/14/16 +f 6/9/26 7/16/30 5/7/23 +s 3 +f 2/16/4 4/4/14 3/6/10 +f 2/3/7 5/10/24 1/1/3 +f 4/10/18 8/2/36 7/3/32 +s 4 +f 2/3/5 6/11/25 5/10/21 diff --git a/examples/core/desktop/assets/data/lsans-15.fnt b/examples/core/desktop/assets/data/lsans-15.fnt new file mode 100644 index 00000000..958d06e3 --- /dev/null +++ b/examples/core/desktop/assets/data/lsans-15.fnt @@ -0,0 +1,175 @@ +info face="Liberation Sans" size=15 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=-2,-2 +common lineHeight=18 base=14 scaleW=1024 scaleH=32 pages=1 packed=0 +page id=0 file="lsans-15_00.png" +chars count=97 +char id=0 x=606 y=0 width=11 height=13 xoffset=0 yoffset=2 xadvance=11 page=0 chnl=0 +char id=10 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=0 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=33 x=554 y=0 width=5 height=13 xoffset=0 yoffset=2 xadvance=5 page=0 chnl=0 +char id=34 x=839 y=0 width=7 height=5 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=35 x=596 y=0 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=36 x=77 y=0 width=10 height=15 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=37 x=581 y=0 width=15 height=13 xoffset=-1 yoffset=2 xadvance=13 page=0 chnl=0 +char id=38 x=627 y=0 width=12 height=12 xoffset=-1 yoffset=3 xadvance=10 page=0 chnl=0 +char id=39 x=846 y=0 width=5 height=5 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 +char id=40 x=20 y=0 width=7 height=16 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=41 x=27 y=0 width=7 height=16 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=42 x=827 y=0 width=8 height=7 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=43 x=639 y=0 width=11 height=11 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=44 x=835 y=0 width=4 height=6 xoffset=0 yoffset=11 xadvance=4 page=0 chnl=0 +char id=45 x=872 y=0 width=7 height=4 xoffset=-1 yoffset=8 xadvance=5 page=0 chnl=0 +char id=46 x=868 y=0 width=4 height=4 xoffset=0 yoffset=11 xadvance=4 page=0 chnl=0 +char id=47 x=569 y=0 width=6 height=13 xoffset=-1 yoffset=2 xadvance=4 page=0 chnl=0 +char id=48 x=544 y=0 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=49 x=455 y=0 width=9 height=13 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=50 x=464 y=0 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=51 x=474 y=0 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=52 x=484 y=0 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=53 x=494 y=0 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=54 x=504 y=0 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=55 x=514 y=0 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=56 x=524 y=0 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=57 x=534 y=0 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=58 x=782 y=0 width=4 height=10 xoffset=0 yoffset=5 xadvance=4 page=0 chnl=0 +char id=59 x=623 y=0 width=4 height=12 xoffset=0 yoffset=5 xadvance=4 page=0 chnl=0 +char id=60 x=786 y=0 width=11 height=9 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=61 x=816 y=0 width=11 height=7 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=0 +char id=62 x=797 y=0 width=11 height=9 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=63 x=559 y=0 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=64 x=62 y=0 width=15 height=15 xoffset=0 yoffset=2 xadvance=15 page=0 chnl=0 +char id=65 x=87 y=0 width=11 height=13 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=66 x=98 y=0 width=11 height=13 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 +char id=67 x=109 y=0 width=13 height=13 xoffset=-1 yoffset=2 xadvance=11 page=0 chnl=0 +char id=68 x=122 y=0 width=12 height=13 xoffset=0 yoffset=2 xadvance=11 page=0 chnl=0 +char id=69 x=134 y=0 width=11 height=13 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 +char id=70 x=145 y=0 width=10 height=13 xoffset=0 yoffset=2 xadvance=9 page=0 chnl=0 +char id=71 x=155 y=0 width=12 height=13 xoffset=-1 yoffset=2 xadvance=11 page=0 chnl=0 +char id=72 x=167 y=0 width=10 height=13 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 +char id=73 x=177 y=0 width=4 height=13 xoffset=0 yoffset=2 xadvance=3 page=0 chnl=0 +char id=74 x=181 y=0 width=8 height=13 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=75 x=189 y=0 width=11 height=13 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 +char id=76 x=200 y=0 width=9 height=13 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=77 x=209 y=0 width=11 height=13 xoffset=0 yoffset=2 xadvance=11 page=0 chnl=0 +char id=78 x=220 y=0 width=10 height=13 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 +char id=79 x=230 y=0 width=14 height=13 xoffset=-1 yoffset=2 xadvance=12 page=0 chnl=0 +char id=80 x=244 y=0 width=11 height=13 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 +char id=81 x=0 y=0 width=14 height=16 xoffset=-1 yoffset=2 xadvance=12 page=0 chnl=0 +char id=82 x=255 y=0 width=12 height=13 xoffset=0 yoffset=2 xadvance=11 page=0 chnl=0 +char id=83 x=267 y=0 width=12 height=13 xoffset=-1 yoffset=2 xadvance=10 page=0 chnl=0 +char id=84 x=279 y=0 width=11 height=13 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=85 x=290 y=0 width=10 height=13 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 +char id=86 x=300 y=0 width=11 height=13 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=87 x=311 y=0 width=17 height=13 xoffset=-1 yoffset=2 xadvance=15 page=0 chnl=0 +char id=88 x=328 y=0 width=11 height=13 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=89 x=339 y=0 width=11 height=13 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=90 x=350 y=0 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=91 x=34 y=0 width=5 height=16 xoffset=0 yoffset=2 xadvance=4 page=0 chnl=0 +char id=92 x=575 y=0 width=6 height=13 xoffset=-1 yoffset=2 xadvance=4 page=0 chnl=0 +char id=93 x=39 y=0 width=5 height=16 xoffset=-1 yoffset=2 xadvance=4 page=0 chnl=0 +char id=94 x=808 y=0 width=8 height=7 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=95 x=879 y=0 width=12 height=3 xoffset=-2 yoffset=15 xadvance=8 page=0 chnl=0 +char id=96 x=862 y=0 width=6 height=4 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=97 x=650 y=0 width=10 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=98 x=360 y=0 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=99 x=660 y=0 width=10 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=100 x=370 y=0 width=10 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=101 x=670 y=0 width=10 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=102 x=380 y=0 width=7 height=13 xoffset=-1 yoffset=2 xadvance=4 page=0 chnl=0 +char id=103 x=387 y=0 width=10 height=13 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=104 x=397 y=0 width=9 height=13 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=105 x=406 y=0 width=5 height=13 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 +char id=106 x=14 y=0 width=6 height=16 xoffset=-2 yoffset=2 xadvance=3 page=0 chnl=0 +char id=107 x=411 y=0 width=10 height=13 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=108 x=421 y=0 width=5 height=13 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 +char id=109 x=680 y=0 width=13 height=10 xoffset=0 yoffset=5 xadvance=13 page=0 chnl=0 +char id=110 x=693 y=0 width=10 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=111 x=703 y=0 width=10 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=112 x=426 y=0 width=10 height=13 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=113 x=436 y=0 width=10 height=13 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=114 x=713 y=0 width=6 height=10 xoffset=0 yoffset=5 xadvance=5 page=0 chnl=0 +char id=115 x=719 y=0 width=10 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=116 x=617 y=0 width=6 height=12 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=117 x=729 y=0 width=10 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=118 x=739 y=0 width=9 height=10 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=119 x=748 y=0 width=15 height=10 xoffset=-2 yoffset=5 xadvance=11 page=0 chnl=0 +char id=120 x=763 y=0 width=9 height=10 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=121 x=446 y=0 width=9 height=13 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=122 x=772 y=0 width=10 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=123 x=44 y=0 width=7 height=16 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=124 x=58 y=0 width=4 height=16 xoffset=0 yoffset=2 xadvance=3 page=0 chnl=0 +char id=125 x=51 y=0 width=7 height=16 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=126 x=851 y=0 width=11 height=5 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=0 +kernings count=73 +kerning first=70 second=46 amount=-2 +kerning first=84 second=121 amount=-1 +kerning first=121 second=44 amount=-1 +kerning first=86 second=58 amount=-1 +kerning first=89 second=101 amount=-1 +kerning first=89 second=46 amount=-2 +kerning first=84 second=45 amount=-1 +kerning first=119 second=44 amount=-1 +kerning first=89 second=59 amount=-1 +kerning first=84 second=58 amount=-2 +kerning first=87 second=46 amount=-1 +kerning first=65 second=84 amount=-1 +kerning first=84 second=105 amount=-1 +kerning first=86 second=97 amount=-1 +kerning first=84 second=97 amount=-2 +kerning first=76 second=87 amount=-1 +kerning first=65 second=89 amount=-1 +kerning first=76 second=32 amount=-1 +kerning first=76 second=121 amount=-1 +kerning first=89 second=111 amount=-1 +kerning first=121 second=46 amount=-1 +kerning first=119 second=46 amount=-1 +kerning first=84 second=115 amount=-2 +kerning first=76 second=84 amount=-1 +kerning first=65 second=86 amount=-1 +kerning first=86 second=65 amount=-1 +kerning first=86 second=44 amount=-1 +kerning first=84 second=65 amount=-1 +kerning first=84 second=99 amount=-2 +kerning first=89 second=45 amount=-1 +kerning first=84 second=44 amount=-2 +kerning first=76 second=89 amount=-1 +kerning first=89 second=113 amount=-1 +kerning first=89 second=58 amount=-1 +kerning first=86 second=117 amount=-1 +kerning first=80 second=65 amount=-1 +kerning first=89 second=105 amount=-1 +kerning first=80 second=44 amount=-2 +kerning first=89 second=118 amount=-1 +kerning first=84 second=117 amount=-1 +kerning first=89 second=97 amount=-1 +kerning first=76 second=86 amount=-1 +kerning first=118 second=44 amount=-1 +kerning first=86 second=101 amount=-1 +kerning first=87 second=97 amount=-1 +kerning first=86 second=46 amount=-1 +kerning first=86 second=114 amount=-1 +kerning first=86 second=59 amount=-1 +kerning first=84 second=101 amount=-2 +kerning first=84 second=46 amount=-2 +kerning first=32 second=65 amount=-1 +kerning first=84 second=114 amount=-1 +kerning first=114 second=44 amount=-1 +kerning first=84 second=59 amount=-2 +kerning first=70 second=65 amount=-1 +kerning first=80 second=46 amount=-2 +kerning first=70 second=44 amount=-2 +kerning first=84 second=119 amount=-1 +kerning first=89 second=65 amount=-1 +kerning first=86 second=111 amount=-1 +kerning first=89 second=44 amount=-2 +kerning first=89 second=112 amount=-1 +kerning first=87 second=65 amount=-1 +kerning first=118 second=46 amount=-1 +kerning first=84 second=111 amount=-2 +kerning first=87 second=44 amount=-1 +kerning first=49 second=49 amount=-1 +kerning first=89 second=117 amount=-1 +kerning first=114 second=46 amount=-1 +kerning first=86 second=121 amount=-1 +kerning first=65 second=87 amount=-1 +kerning first=65 second=32 amount=-1 +kerning first=86 second=45 amount=-1 diff --git a/examples/core/desktop/assets/data/lsans-15.png b/examples/core/desktop/assets/data/lsans-15.png new file mode 100644 index 0000000000000000000000000000000000000000..388eba3f0982bd17c30f42c96f74efcb73077d86 GIT binary patch literal 10373 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 S0^jaG?guF)$trOp|NjGanha_H literal 0 HcmV?d00001 diff --git a/examples/core/desktop/assets/data/lsans-15_00.png b/examples/core/desktop/assets/data/lsans-15_00.png new file mode 100644 index 0000000000000000000000000000000000000000..436970a6d0c367fada0707125fb111a152903faf GIT binary patch literal 7157 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 literal 0 HcmV?d00001 diff --git a/examples/core/desktop/assets/test.txt b/examples/core/desktop/assets/test.txt deleted file mode 100644 index 5e1c309d..00000000 --- a/examples/core/desktop/assets/test.txt +++ /dev/null @@ -1 +0,0 @@ -Hello World \ No newline at end of file diff --git a/examples/core/desktop/src/main/java/com/github/xpenatan/gdx/examples/desktop/Main.java b/examples/core/desktop/src/main/java/com/github/xpenatan/gdx/examples/desktop/Main.java index f79fad0c..9e97ca57 100644 --- a/examples/core/desktop/src/main/java/com/github/xpenatan/gdx/examples/desktop/Main.java +++ b/examples/core/desktop/src/main/java/com/github/xpenatan/gdx/examples/desktop/Main.java @@ -1,11 +1,11 @@ package com.github.xpenatan.gdx.examples.desktop; import com.badlogic.gdx.backends.lwjgl.LwjglApplication; -import com.github.xpenatan.gdx.examples.tests.PixelTest; +import com.github.xpenatan.gdx.examples.tests.FilesTest; public class Main { public static void main(String[] args) { - new LwjglApplication(new PixelTest()); + new LwjglApplication(new FilesTest()); } } diff --git a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildArtemisTest.java b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildArtemisTest.java deleted file mode 100644 index 9ce8b677..00000000 --- a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildArtemisTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.github.xpenatan.gdx.examples.teavm; - -import com.github.xpenatan.gdx.backends.teavm.config.TeaBuildConfiguration; -import com.github.xpenatan.gdx.backends.teavm.config.TeaBuilder; -import com.github.xpenatan.gdx.backends.teavm.config.plugins.TeaReflectionSupplier; -import com.github.xpenatan.gdx.backends.teavm.gen.SkipClass; -import com.github.xpenatan.gdx.examples.tests.ArtemisTest; -import java.io.File; -import java.io.IOException; -import org.teavm.tooling.TeaVMTool; - -@SkipClass -public class BuildArtemisTest { - - public static void main(String[] args) throws IOException { - String reflectionPackage = "com.badlogic.gdx.math"; - TeaReflectionSupplier.addReflectionClass(reflectionPackage); - TeaReflectionSupplier.addReflectionClass("com.github.xpenatan.gdx.examples.tests"); - - TeaBuildConfiguration teaBuildConfiguration = new TeaBuildConfiguration(); - teaBuildConfiguration.assetsPath.add(new File("../desktop/assets")); - teaBuildConfiguration.webappPath = new File("build/dist").getCanonicalPath(); - teaBuildConfiguration.setApplicationListener(ArtemisTest.class); - TeaVMTool tool = TeaBuilder.config(teaBuildConfiguration); - tool.setObfuscated(false); - TeaBuilder.build(tool); - } -} \ No newline at end of file diff --git a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildLoadingTest.java b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildLoadingTest.java deleted file mode 100644 index a07f6289..00000000 --- a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildLoadingTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.github.xpenatan.gdx.examples.teavm; - -import com.github.xpenatan.gdx.backends.teavm.config.TeaBuildConfiguration; -import com.github.xpenatan.gdx.backends.teavm.config.TeaBuilder; -import com.github.xpenatan.gdx.backends.teavm.gen.SkipClass; -import com.github.xpenatan.gdx.examples.teavm.launcher.LoadingTestLauncher; -import java.io.File; -import java.io.IOException; -import org.teavm.tooling.TeaVMTool; - -@SkipClass -public class BuildLoadingTest { - - public static void main(String[] args) throws IOException { - TeaBuildConfiguration teaBuildConfiguration = new TeaBuildConfiguration(); - teaBuildConfiguration.assetsPath.add(new File("../desktop/assets")); - teaBuildConfiguration.webappPath = new File("build/dist").getCanonicalPath(); - - TeaVMTool tool = TeaBuilder.config(teaBuildConfiguration); - tool.setObfuscated(false); - tool.setMainClass(LoadingTestLauncher.class.getName()); - TeaBuilder.build(tool); - } -} diff --git a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildReflectionTest.java b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildReflectionTest.java deleted file mode 100644 index 610118da..00000000 --- a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildReflectionTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.github.xpenatan.gdx.examples.teavm; - -import com.github.xpenatan.gdx.backends.teavm.config.TeaBuildConfiguration; -import com.github.xpenatan.gdx.backends.teavm.config.TeaBuilder; -import com.github.xpenatan.gdx.backends.teavm.config.plugins.TeaReflectionSupplier; -import com.github.xpenatan.gdx.backends.teavm.gen.SkipClass; -import com.github.xpenatan.gdx.examples.tests.ReflectionTest; -import java.io.File; -import java.io.IOException; -import org.teavm.tooling.TeaVMTool; - -@SkipClass -public class BuildReflectionTest { - - public static void main(String[] args) throws IOException { - String reflectionPackage = "com.badlogic.gdx.math"; - TeaReflectionSupplier.addReflectionClass(reflectionPackage); - - TeaBuildConfiguration teaBuildConfiguration = new TeaBuildConfiguration(); - teaBuildConfiguration.assetsPath.add(new File("../desktop/assets")); - teaBuildConfiguration.webappPath = new File("build/dist").getCanonicalPath(); - teaBuildConfiguration.setApplicationListener(ReflectionTest.class); - TeaVMTool tool = TeaBuilder.config(teaBuildConfiguration); - TeaBuilder.build(tool); - } -} diff --git a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildTeaVMTestDemo.java b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildTeaVMTestDemo.java index ec63eb4d..78720371 100644 --- a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildTeaVMTestDemo.java +++ b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildTeaVMTestDemo.java @@ -2,6 +2,7 @@ import com.github.xpenatan.gdx.backends.teavm.config.TeaBuildConfiguration; import com.github.xpenatan.gdx.backends.teavm.config.TeaBuilder; +import com.github.xpenatan.gdx.backends.teavm.config.plugins.TeaReflectionSupplier; import com.github.xpenatan.gdx.backends.teavm.gen.SkipClass; import com.github.xpenatan.gdx.examples.teavm.launcher.TeaVMTestLauncher; import java.io.File; @@ -12,12 +13,14 @@ public class BuildTeaVMTestDemo { public static void main(String[] args) throws IOException { + String reflectionPackage = "com.badlogic.gdx.math"; + TeaReflectionSupplier.addReflectionClass(reflectionPackage); + TeaBuildConfiguration teaBuildConfiguration = new TeaBuildConfiguration(); teaBuildConfiguration.assetsPath.add(new File("../desktop/assets")); teaBuildConfiguration.webappPath = new File("build/dist").getCanonicalPath(); teaBuildConfiguration.logoPath = "logo.png"; - TeaVMTool tool = TeaBuilder.config(teaBuildConfiguration); tool.setMainClass(TeaVMTestLauncher.class.getName()); tool.setObfuscated(false); diff --git a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java index cf83cff1..b1fffb9f 100644 --- a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java +++ b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java @@ -2,6 +2,7 @@ import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; +import com.github.xpenatan.gdx.examples.tests.FilesTest; import com.github.xpenatan.gdx.examples.tests.PixelTest; import com.github.xpenatan.gdx.examples.tests.ReadPixelsTest; @@ -13,7 +14,7 @@ public static void main(String[] args) { config.height = 0; config.showDownloadLogs = true; // new TeaApplication(new GearsDemo(), config); - new TeaApplication(new ReadPixelsTest(), config); + new TeaApplication(new FilesTest(), config); // new TeaApplication(new PixelTest(), config); } } \ No newline at end of file From 0f61612169f9d96bd6675e47623ed2a305cf83ab Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 28 May 2024 20:57:11 -0300 Subject: [PATCH 028/114] update filetest --- .../gdx/examples/tests/FilesTest.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java index 1c3317c5..49757c09 100644 --- a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java +++ b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java @@ -85,25 +85,27 @@ public void create() { message += "External storage not available"; } if(Gdx.files.isLocalStorageAvailable()) { - message += "Local storage available\n"; + message += "\nLocal storage available\n"; message += "Local storage path: " + Gdx.files.getLocalStoragePath() + "\n"; BufferedWriter out = null; + boolean canDelete = false; try { - out = new BufferedWriter(new OutputStreamWriter(Gdx.files.local("test.txt").write(false))); - out.write("test"); - message += "Write local success\n"; + FileHandle testFile = Gdx.files.local("test.txt"); + boolean exists = testFile.exists(); + canDelete = exists; + message += "text.txt exists: " + exists + "\n"; + + testFile.writeString("test", false); + } catch(GdxRuntimeException ex) { message += "Couldn't open localstorage/test.txt\n"; - } catch(IOException e) { - message += "Couldn't write localstorage/test.txt\n"; } finally { StreamUtils.closeQuietly(out); } try { - InputStream in = Gdx.files.local("test.txt").read(); - StreamUtils.closeQuietly(in); + String s = Gdx.files.local("test.txt").readString(); message += "Open local success\n"; } catch(Throwable e) { message += "Couldn't open localstorage/test.txt\n" + e.getMessage() + "\n"; @@ -134,7 +136,11 @@ public void create() { message += "Couldn't read localstorage/test.txt\n" + e.getMessage() + "\n"; } - if(!Gdx.files.local("test.txt").delete()) message += "Couldn't delete localstorage/test.txt"; + if(canDelete) { + if(!Gdx.files.local("test.txt").delete()) { + message += "Couldn't delete localstorage/test.txt"; + } + } } try { testClasspath(); From 12c5607c218bf77a8a3eae9dbf0461eb7f3694fe Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 28 May 2024 22:33:27 -0300 Subject: [PATCH 029/114] wip indexeddb --- .../teavm/TeaApplicationConfiguration.java | 2 + .../teavm/filesystem/FileDBManager.java | 53 +++++++++++++- .../teavm/filesystem/IndexedDBStorage.java | 72 +++++++++++++++++++ .../filesystem/indexeddb/IDBIndexEmu.java | 55 ++++++++++++++ .../gdx/examples/tests/FilesTest.java | 6 +- 5 files changed, 185 insertions(+), 3 deletions(-) create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/indexeddb/IDBIndexEmu.java diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java index 8daf185b..79b0998d 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java @@ -20,6 +20,8 @@ public class TeaApplicationConfiguration { */ public boolean preloadAssets = true; + public boolean useIndexedDB = false; + /** * The prefix for the browser storage. If you have multiple apps on the same server and want to keep the * data separate for those applications, you will need to set unique prefixes. This is useful if you are diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java index 6f72ca7c..1c2c9372 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java @@ -2,6 +2,7 @@ import com.badlogic.gdx.Gdx; import com.github.xpenatan.gdx.backends.teavm.TeaApplication; +import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; import java.io.InputStream; @@ -22,13 +23,28 @@ public final class FileDBManager extends FileDB { */ private final FileDBStorage memory; + /** + * IndexedDB is async, we store in memory while we save it. It will delete from memory when it's done. + */ + private FileDB indexedDB; + FileDBManager() { - localStorage = new FileDBStorage(new StoreLocal(((TeaApplication)Gdx.app).getConfig().storagePrefix)); + TeaApplicationConfiguration config = ((TeaApplication)Gdx.app).getConfig(); + String storagePrefix = config.storagePrefix; + localStorage = new FileDBStorage(new StoreLocal(storagePrefix)); memory = new FileDBStorage(new StoreMemory()); + + if(config.useIndexedDB) { + indexedDB = new IndexedDBStorage(); + } } @Override public InputStream read(TeaFileHandle file) { + if(indexedDB != null) { + return indexedDB.read(file); + } + if(memory.exists(file)) { return memory.read(file); } @@ -39,6 +55,11 @@ public InputStream read(TeaFileHandle file) { @Override protected void writeInternal(TeaFileHandle file, byte[] data, boolean append, int expectedLength) { + if(indexedDB != null) { + indexedDB.writeInternal(file, data, append, expectedLength); + return; + } + // write larger files into memory: up to 16.384kb into local storage (permanent) int localStorageMax = 16384; if((data.length >= localStorageMax) || (append && (expectedLength >= localStorageMax))) { @@ -54,6 +75,10 @@ protected void writeInternal(TeaFileHandle file, byte[] data, boolean append, in @Override protected String[] paths(TeaFileHandle file) { + if(indexedDB != null) { + return indexedDB.paths(file); + } + // combine & return the paths of memory & local storage String[] pathsMemory = memory.paths(file); String[] pathsLocalStorage = localStorage.paths(file); @@ -65,6 +90,10 @@ protected String[] paths(TeaFileHandle file) { @Override public boolean isDirectory(TeaFileHandle file) { + if(indexedDB != null) { + return indexedDB.isDirectory(file); + } + if(memory.exists(file)) { return memory.isDirectory(file); } @@ -75,16 +104,29 @@ public boolean isDirectory(TeaFileHandle file) { @Override public void mkdirs(TeaFileHandle file) { + if(indexedDB != null) { + indexedDB.mkdirs(file); + return; + } + localStorage.mkdirs(file); } @Override public boolean exists(TeaFileHandle file) { + if(indexedDB != null) { + return indexedDB.exists(file); + } + return memory.exists(file) || localStorage.exists(file); } @Override public boolean delete(TeaFileHandle file) { + if(indexedDB != null) { + return indexedDB.delete(file); + } + if(memory.exists(file)) { return memory.delete(file); } @@ -95,6 +137,10 @@ public boolean delete(TeaFileHandle file) { @Override public long length(TeaFileHandle file) { + if(indexedDB != null) { + return indexedDB.length(file); + } + if(memory.exists(file)) { return memory.length(file); } @@ -105,6 +151,11 @@ public long length(TeaFileHandle file) { @Override public void rename(TeaFileHandle source, TeaFileHandle target) { + if(indexedDB != null) { + indexedDB.rename(source, target); + return; + } + if(memory.exists(source)) { memory.rename(source, target); } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java new file mode 100644 index 00000000..4d337861 --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java @@ -0,0 +1,72 @@ +package com.github.xpenatan.gdx.backends.teavm.filesystem; + +import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; +import java.io.InputStream; +import org.teavm.jso.indexeddb.IDBDatabase; +import org.teavm.jso.indexeddb.IDBFactory; +import org.teavm.jso.indexeddb.IDBOpenDBRequest; + +public class IndexedDBStorage extends FileDB { + + private IDBDatabase result = null; + + public IndexedDBStorage() { + + IDBFactory instance = IDBFactory.getInstance(); + + IDBOpenDBRequest request = instance.open("TeaVM", 1); + request.setOnSuccess(() -> { + result = request.getResult(); + System.out.println("SUCCESS"); + }); + + request.setOnError(() -> { + System.out.println("ERROR"); + }); + } + + @Override + public InputStream read(TeaFileHandle file) { + return null; + } + + @Override + protected void writeInternal(TeaFileHandle file, byte[] data, boolean append, int expectedLength) { + + } + + @Override + protected String[] paths(TeaFileHandle file) { + return new String[0]; + } + + @Override + public boolean isDirectory(TeaFileHandle file) { + return false; + } + + @Override + public void mkdirs(TeaFileHandle file) { + + } + + @Override + public boolean exists(TeaFileHandle file) { + return false; + } + + @Override + public boolean delete(TeaFileHandle file) { + return false; + } + + @Override + public long length(TeaFileHandle file) { + return 0; + } + + @Override + public void rename(TeaFileHandle source, TeaFileHandle target) { + + } +} diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/indexeddb/IDBIndexEmu.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/indexeddb/IDBIndexEmu.java new file mode 100644 index 00000000..d86bf800 --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/indexeddb/IDBIndexEmu.java @@ -0,0 +1,55 @@ +package com.github.xpenatan.gdx.backends.teavm.filesystem.indexeddb; + +import com.github.xpenatan.gdx.backends.teavm.gen.Emulate; +import org.teavm.jso.JSBody; +import org.teavm.jso.JSByRef; +import org.teavm.jso.JSObject; +import org.teavm.jso.JSProperty; +import org.teavm.jso.core.JSString; +import org.teavm.jso.indexeddb.IDBCountRequest; +import org.teavm.jso.indexeddb.IDBCursorRequest; +import org.teavm.jso.indexeddb.IDBCursorSource; +import org.teavm.jso.indexeddb.IDBGetRequest; +import org.teavm.jso.indexeddb.IDBIndex; +import org.teavm.jso.indexeddb.IDBKeyRange; + +@Emulate(IDBIndex.class) +public abstract class IDBIndexEmu implements JSObject, IDBCursorSource { + @JSProperty + public abstract String getName(); + + @JSProperty("keyPath") + abstract JSObject getKeyPathImpl(); + + public final String[] getKeyPath() { + JSObject result = getKeyPathImpl(); + if (JSString.isInstance(result)) { + return new String[] { result.cast().stringValue() }; + } else { + return unwrapStringArray(result); + } + } + + @JSBody(params = "obj", script = "return obj;") + private static native String[] unwrapStringArray(JSObject obj); + + @JSProperty + public abstract boolean isMultiEntry(); + + @JSProperty + public abstract boolean isUnique(); + + public abstract IDBCursorRequest openCursor(); + + public abstract IDBCursorRequest openCursor(IDBKeyRange range); + + public abstract IDBCursorRequest openKeyCursor(); + + public abstract IDBGetRequest get(JSObject key); + + public abstract IDBGetRequest getKey(JSObject key); + + public abstract IDBCountRequest count(JSObject key); + + public abstract IDBCountRequest count(); +} diff --git a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java index 49757c09..b7aeb2e0 100644 --- a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java +++ b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java @@ -113,14 +113,16 @@ public void create() { BufferedReader in = null; try { - in = new BufferedReader(new InputStreamReader(Gdx.files.local("test.txt").read())); + FileHandle testFile = Gdx.files.local("test.txt"); + InputStream read = testFile.read(); + in = new BufferedReader(new InputStreamReader(read)); if(!in.readLine().equals("test")) message += "Read result wrong\n"; else message += "Read local success\n"; } catch(GdxRuntimeException ex) { message += "Couldn't open localstorage/test.txt\n"; - } catch(IOException e) { + } catch(Throwable e) { message += "Couldn't read localstorage/test.txt\n"; } finally { StreamUtils.closeQuietly(in); From 565cb691e45199bb569fa0fdb3f98aa79b1756b8 Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 28 May 2024 22:50:30 -0300 Subject: [PATCH 030/114] add delay count in application --- .../gdx/backends/teavm/TeaApplication.java | 16 +++++++++--- .../teavm/filesystem/IndexedDBStorage.java | 26 ++++++++++++++----- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java index 859e1046..4802d332 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java @@ -19,6 +19,7 @@ import com.github.xpenatan.gdx.backends.teavm.dom.EventListenerWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.EventWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.impl.TeaWindow; +import com.github.xpenatan.gdx.backends.teavm.filesystem.FileDB; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloadImpl; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloader; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloader.AssetDownload; @@ -37,6 +38,8 @@ public class TeaApplication implements Application, Runnable { private static TeaAgentInfo agentInfo; + public int delayInitCount; + public static TeaAgentInfo getAgentInfo() { return agentInfo; } @@ -56,7 +59,7 @@ public static TeaApplication get() { private final Array lifecycleListeners = new Array(4); private TeaWindow window; - private AppState initState = AppState.LOAD_ASSETS; + private AppState initState = AppState.INIT; private int lastWidth = -1; private int lastHeight = 1; @@ -162,8 +165,6 @@ public void handleEvent(EventWrapper evt) { } }); - window.requestAnimationFrame(this); - if(config.isAutoSizeApplication()) { window.addEventListener("resize", new EventListenerWrapper() { @Override @@ -188,6 +189,10 @@ public void handleEvent(EventWrapper evt) { } }); } + + // Init database + FileDB.getInstance(); + window.requestAnimationFrame(this); } @Override @@ -195,6 +200,10 @@ public void run() { AppState state = initState; try { switch(state) { + case INIT: + if(delayInitCount == 0) { + initState = AppState.LOAD_ASSETS; + } case LOAD_ASSETS: int queue = AssetDownloader.getInstance().getQueue(); if(queue == 0) { @@ -448,6 +457,7 @@ public static boolean isMobileDevice () { } public enum AppState { + INIT, LOAD_ASSETS, APP_CREATE, APP_LOOP diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java index 4d337861..cfe5088f 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java @@ -1,5 +1,7 @@ package com.github.xpenatan.gdx.backends.teavm.filesystem; +import com.badlogic.gdx.Gdx; +import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; import java.io.InputStream; import org.teavm.jso.indexeddb.IDBDatabase; @@ -8,65 +10,75 @@ public class IndexedDBStorage extends FileDB { - private IDBDatabase result = null; + private IDBDatabase dataBase = null; public IndexedDBStorage() { - + TeaApplication teaApplication = (TeaApplication)Gdx.app; + teaApplication.delayInitCount++; IDBFactory instance = IDBFactory.getInstance(); - IDBOpenDBRequest request = instance.open("TeaVM", 1); request.setOnSuccess(() -> { - result = request.getResult(); + dataBase = request.getResult(); System.out.println("SUCCESS"); + teaApplication.delayInitCount--; }); request.setOnError(() -> { System.out.println("ERROR"); + teaApplication.delayInitCount--; }); } @Override public InputStream read(TeaFileHandle file) { + + System.out.println("1111"); return null; } @Override protected void writeInternal(TeaFileHandle file, byte[] data, boolean append, int expectedLength) { - + System.out.println("2222"); } @Override protected String[] paths(TeaFileHandle file) { + + System.out.println("3333"); return new String[0]; } @Override public boolean isDirectory(TeaFileHandle file) { + System.out.println("4444"); return false; } @Override public void mkdirs(TeaFileHandle file) { - + System.out.println("5555"); } @Override public boolean exists(TeaFileHandle file) { + System.out.println("6666"); return false; } @Override public boolean delete(TeaFileHandle file) { + System.out.println("7777"); return false; } @Override public long length(TeaFileHandle file) { + System.out.println("8888"); return 0; } @Override public void rename(TeaFileHandle source, TeaFileHandle target) { - + System.out.println("9999"); } } From d524f021be609c64fe360b76306ba628f4696e23 Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 30 May 2024 10:52:02 -0300 Subject: [PATCH 031/114] update indexeddb code --- .../teavm/filesystem/IndexedDBStorage.java | 181 ++++++++++++++++-- .../indexeddb/IndexedDBFileData.java | 24 +++ .../gdx/examples/tests/FilesTest.java | 2 + 3 files changed, 187 insertions(+), 20 deletions(-) create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/indexeddb/IndexedDBFileData.java diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java index cfe5088f..f6b5bd22 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java @@ -1,84 +1,225 @@ package com.github.xpenatan.gdx.backends.teavm.filesystem; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.ObjectMap; import com.github.xpenatan.gdx.backends.teavm.TeaApplication; +import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; +import com.github.xpenatan.gdx.backends.teavm.filesystem.indexeddb.IndexedDBFileData; +import java.io.ByteArrayInputStream; import java.io.InputStream; +import org.teavm.jso.JSBody; +import org.teavm.jso.JSObject; +import org.teavm.jso.core.JSDate; +import org.teavm.jso.indexeddb.IDBCursor; +import org.teavm.jso.indexeddb.IDBCursorRequest; import org.teavm.jso.indexeddb.IDBDatabase; import org.teavm.jso.indexeddb.IDBFactory; +import org.teavm.jso.indexeddb.IDBObjectStore; +import org.teavm.jso.indexeddb.IDBObjectStoreParameters; import org.teavm.jso.indexeddb.IDBOpenDBRequest; +import org.teavm.jso.indexeddb.IDBRequest; +import org.teavm.jso.indexeddb.IDBTransaction; public class IndexedDBStorage extends FileDB { - + private final static String KEY_OBJECT_STORE = "FILE_DATA"; private IDBDatabase dataBase = null; + private static final int TYPE_FILE = 1; + private static final int TYPE_DIRECTORY = 2; + + private final ObjectMap fileMap; + public IndexedDBStorage() { + fileMap = new ObjectMap<>(); + setupIndexedDB(); + } + + private void setupIndexedDB() { TeaApplication teaApplication = (TeaApplication)Gdx.app; + TeaApplicationConfiguration config = teaApplication.getConfig(); teaApplication.delayInitCount++; + IDBFactory instance = IDBFactory.getInstance(); - IDBOpenDBRequest request = instance.open("TeaVM", 1); + String databaseName = getDatabaseName(config); + IDBOpenDBRequest request = instance.open(databaseName, 1); + + request.setOnUpgradeNeeded(evt -> { + IDBDatabase result = request.getResult(); + IDBObjectStoreParameters op = IDBObjectStoreParameters.create(); + result.createObjectStore(KEY_OBJECT_STORE, op); + }); + request.setOnSuccess(() -> { dataBase = request.getResult(); - System.out.println("SUCCESS"); - teaApplication.delayInitCount--; + readAllFilesAsync(teaApplication); }); request.setOnError(() -> { - System.out.println("ERROR"); + Gdx.app.error("IndexedDB", "Error opening database: " + databaseName); teaApplication.delayInitCount--; }); } + private String getDatabaseName(TeaApplicationConfiguration config) { + String name = "home/assets"; + if(config.storagePrefix.endsWith("/")) { + name = config.storagePrefix + name; + } + else { + name = config.storagePrefix + "/" + name; + } + return name; + } + @Override public InputStream read(TeaFileHandle file) { - - System.out.println("1111"); - return null; + String path = file.path(); + IndexedDBFileData data = fileMap.get(path); + Int8ArrayWrapper array = data.getContents(); + byte[] byteArray = TypedArrays.toByteArray(array); + try { + return new ByteArrayInputStream(byteArray); + } + catch(RuntimeException e) { + // Something corrupted: we remove it & re-throw the error + fileMap.remove(path); + removeFileAsync(path); + throw e; + } } @Override protected void writeInternal(TeaFileHandle file, byte[] data, boolean append, int expectedLength) { - System.out.println("2222"); + String path = file.path(); + IndexedDBFileData fileData = IndexedDBFileData.create(TYPE_FILE, new JSDate()); + fileData.setContents(data); + fileMap.put(path, fileData); + putFileAsync(path, fileData); } @Override protected String[] paths(TeaFileHandle file) { - - System.out.println("3333"); - return new String[0]; + Array paths = new Array<>(fileMap.size); + String dir = file.path() + "/"; + ObjectMap.Entries it = fileMap.iterator(); + while(it.hasNext) { + ObjectMap.Entry next = it.next(); + String path = next.key; + if(path.startsWith(dir)) { + paths.add(path); + } + } + paths.sort(); + return paths.items; } @Override public boolean isDirectory(TeaFileHandle file) { - System.out.println("4444"); + String path = file.path(); + IndexedDBFileData data = fileMap.get(path); + if(data != null) { + int type = data.getType(); + return type == TYPE_DIRECTORY; + } return false; } @Override public void mkdirs(TeaFileHandle file) { - System.out.println("5555"); + String path = file.path(); + IndexedDBFileData fileData = IndexedDBFileData.create(TYPE_DIRECTORY, new JSDate()); + fileMap.put(path, fileData); + putFileAsync(path, fileData); } @Override public boolean exists(TeaFileHandle file) { - System.out.println("6666"); - return false; + String path = file.path(); + return fileMap.containsKey(path); } @Override public boolean delete(TeaFileHandle file) { - System.out.println("7777"); + String path = file.path(); + IndexedDBFileData data = fileMap.remove(path); + if(data != null) { + removeFileAsync(path); + return true; + } return false; } @Override public long length(TeaFileHandle file) { - System.out.println("8888"); + String path = file.path(); + IndexedDBFileData data = fileMap.get(path); + if(data.getType() == TYPE_FILE) { + Int8ArrayWrapper contents = data.getContents(); + byte[] bytes = TypedArrays.toByteArray(contents); + return bytes.length; + } return 0; } @Override public void rename(TeaFileHandle source, TeaFileHandle target) { - System.out.println("9999"); + String sourcePath = source.path(); + String targetPath = target.path(); + IndexedDBFileData data = fileMap.remove(sourcePath); + if(data != null) { + fileMap.put(targetPath, data); + removeFileAsync(sourcePath); + putFileAsync(targetPath, data); + } + } + + private void putFileAsync(String key, IndexedDBFileData data) { + IDBTransaction transaction = dataBase.transaction(KEY_OBJECT_STORE, "readwrite"); + IDBObjectStore objectStore = transaction.objectStore(KEY_OBJECT_STORE); + IDBRequest request = objectStore.put(data, getJSString(key)); + request.setOnError(() -> { + Gdx.app.error("IndexedDB", "Error putting file: " + key); + }); + } + + private void removeFileAsync(String key) { + IDBTransaction transaction = dataBase.transaction(KEY_OBJECT_STORE, "readwrite"); + IDBObjectStore objectStore = transaction.objectStore(KEY_OBJECT_STORE); + IDBRequest request = objectStore.delete(getJSString(key)); + request.setOnError(() -> { + Gdx.app.error("IndexedDB", "Error removing file: " + key); + }); + } + + private void readAllFilesAsync(TeaApplication teaApplication) { + IDBTransaction transaction = dataBase.transaction(KEY_OBJECT_STORE, "readonly"); + IDBObjectStore objectStore = transaction.objectStore(KEY_OBJECT_STORE); + IDBCursorRequest cursorRequest = objectStore.openCursor(); + cursorRequest.setOnSuccess(() -> { + IDBCursor cursor = cursorRequest.getResult(); + if(cursor != null) { + String key = getJavaString(cursor.getKey()); + JSObject value = cursor.getValue(); + IndexedDBFileData fileData = getFileData(value); + fileMap.put(key, fileData); + } + teaApplication.delayInitCount--; + }); + cursorRequest.setOnError(() -> { + teaApplication.delayInitCount--; + }); } -} + + @JSBody(params = { "data" }, script = "return data;") + private static native JSObject getJSString(String data); + + @JSBody(params = { "data" }, script = "return data;") + private static native String getJavaString(JSObject data); + + @JSBody(params = { "data" }, script = "return data;") + private static native IndexedDBFileData getFileData(JSObject data); +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/indexeddb/IndexedDBFileData.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/indexeddb/IndexedDBFileData.java new file mode 100644 index 00000000..b7ada055 --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/indexeddb/IndexedDBFileData.java @@ -0,0 +1,24 @@ +package com.github.xpenatan.gdx.backends.teavm.filesystem.indexeddb; + +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; +import org.teavm.jso.JSBody; +import org.teavm.jso.JSObject; +import org.teavm.jso.JSProperty; +import org.teavm.jso.core.JSDate; + +public abstract class IndexedDBFileData implements JSObject { + @JSProperty + public abstract void setContents(byte[] contents); + + @JSProperty + public abstract Int8ArrayWrapper getContents(); + + @JSProperty + public abstract int getType(); + + @JSProperty + public abstract JSDate getTimestamp(); + + @JSBody(params = { "type", "timestamp" }, script = "return {type: type, date: timestamp};") + public static native IndexedDBFileData create(int type, JSDate timestamp); +} \ No newline at end of file diff --git a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java index b7aeb2e0..e87ff006 100644 --- a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java +++ b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java @@ -1,5 +1,6 @@ package com.github.xpenatan.gdx.examples.tests; +import com.badlogic.gdx.Application; import com.badlogic.gdx.ApplicationListener; import java.io.BufferedReader; import java.io.BufferedWriter; @@ -28,6 +29,7 @@ public class FilesTest implements ApplicationListener { @Override public void create() { + Gdx.app.setLogLevel(Application.LOG_DEBUG); font = new BitmapFont(Gdx.files.internal("data/lsans-15.fnt"), false); batch = new SpriteBatch(); From 6ef34430237043e804c36587a1f6cbbcb6cbeeda Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 30 May 2024 12:40:05 -0300 Subject: [PATCH 032/114] indexeddb improvements --- .../teavm/TeaApplicationConfiguration.java | 5 +- .../gdx/backends/teavm/TeaFileHandle.java | 3 + .../xpenatan/gdx/backends/teavm/TeaFiles.java | 3 +- .../gdx/backends/teavm/filesystem/FileDB.java | 2 + .../teavm/filesystem/FileDBManager.java | 8 ++ .../teavm/filesystem/FileDBStorage.java | 5 + .../teavm/filesystem/IndexedDBStorage.java | 120 +++++++++++++++--- .../gdx/examples/tests/FilesTest.java | 95 +++++++++++--- 8 files changed, 200 insertions(+), 41 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java index 79b0998d..7cb9e802 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java @@ -20,7 +20,10 @@ public class TeaApplicationConfiguration { */ public boolean preloadAssets = true; - public boolean useIndexedDB = false; + /** + * Use IndexedDB for local storage instead of Storage/Memory. + */ + public boolean useIndexedDB = true; /** * The prefix for the browser storage. If you have multiple apps on the same server and want to keep the diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java index 24d318e1..fcdc4a91 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java @@ -563,6 +563,9 @@ public boolean delete() { * @throws GdxRuntimeException if this file handle is a {@link FileType#Classpath} or {@link FileType#Internal} file. */ public boolean deleteDirectory() { + if(type == FileType.Local) { + return FileDB.getInstance().delete(this); + } throw new GdxRuntimeException("Cannot delete directory (missing implementation): " + file); } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java index 44bfdd86..e7653955 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java @@ -2,6 +2,7 @@ import com.badlogic.gdx.Files; import com.badlogic.gdx.files.FileHandle; +import com.github.xpenatan.gdx.backends.teavm.filesystem.FileDB; import com.github.xpenatan.gdx.backends.teavm.preloader.Preloader; /** @@ -57,7 +58,7 @@ public boolean isExternalStorageAvailable() { @Override public String getLocalStoragePath() { - return null; + return FileDB.getInstance().getLocalStoragePath(); } @Override diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java index 408ed67c..6d3d7c0f 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java @@ -126,4 +126,6 @@ public final FileHandle[] list(TeaFileHandle file, String suffix) { public abstract long length(TeaFileHandle file); public abstract void rename(TeaFileHandle source, TeaFileHandle target); + + public abstract String getLocalStoragePath(); } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java index 1c2c9372..dbc725e5 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java @@ -163,4 +163,12 @@ public void rename(TeaFileHandle source, TeaFileHandle target) { localStorage.rename(source, target); } } + + @Override + public String getLocalStoragePath() { + if(indexedDB != null) { + return indexedDB.getLocalStoragePath(); + } + return null; + } } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBStorage.java index 31eadd47..49da5fe6 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBStorage.java @@ -131,4 +131,9 @@ public void rename(TeaFileHandle source, TeaFileHandle target) { store.removeItem(ID_FOR_FILE + source.path()); store.setItem(ID_FOR_FILE + target.path(), data); } + + @Override + public String getLocalStoragePath() { + return null; + } } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java index f6b5bd22..3db40984 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java @@ -1,6 +1,7 @@ package com.github.xpenatan.gdx.backends.teavm.filesystem; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.ObjectMap; import com.github.xpenatan.gdx.backends.teavm.TeaApplication; @@ -26,6 +27,7 @@ public class IndexedDBStorage extends FileDB { private final static String KEY_OBJECT_STORE = "FILE_DATA"; + private final static String ROOT_PATH = "db/assets"; private IDBDatabase dataBase = null; private static final int TYPE_FILE = 1; @@ -33,6 +35,10 @@ public class IndexedDBStorage extends FileDB { private final ObjectMap fileMap; + private Array tmpPaths = new Array<>(); + + private String databaseName; + public IndexedDBStorage() { fileMap = new ObjectMap<>(); setupIndexedDB(); @@ -44,7 +50,7 @@ private void setupIndexedDB() { teaApplication.delayInitCount++; IDBFactory instance = IDBFactory.getInstance(); - String databaseName = getDatabaseName(config); + databaseName = getDatabaseName(config); IDBOpenDBRequest request = instance.open(databaseName, 1); request.setOnUpgradeNeeded(evt -> { @@ -65,14 +71,20 @@ private void setupIndexedDB() { } private String getDatabaseName(TeaApplicationConfiguration config) { - String name = "home/assets"; - if(config.storagePrefix.endsWith("/")) { - name = config.storagePrefix + name; + String path = ROOT_PATH; + String storagePrefix = config.storagePrefix.trim(); + if(storagePrefix.endsWith("/")) { + path = storagePrefix + ROOT_PATH; } else { - name = config.storagePrefix + "/" + name; + if(storagePrefix.isEmpty()) { + path = ROOT_PATH; + } + else { + path = storagePrefix + "/" + ROOT_PATH; + } } - return name; + return path; } @Override @@ -99,22 +111,18 @@ protected void writeInternal(TeaFileHandle file, byte[] data, boolean append, in fileData.setContents(data); fileMap.put(path, fileData); putFileAsync(path, fileData); + + FileHandle cur = file.parent(); + while(!cur.path().isEmpty()) { + String parentPath = cur.path(); + putFolder(parentPath); + cur = cur.parent(); + } } @Override protected String[] paths(TeaFileHandle file) { - Array paths = new Array<>(fileMap.size); - String dir = file.path() + "/"; - ObjectMap.Entries it = fileMap.iterator(); - while(it.hasNext) { - ObjectMap.Entry next = it.next(); - String path = next.key; - if(path.startsWith(dir)) { - paths.add(path); - } - } - paths.sort(); - return paths.items; + return getAllChildren(file); } @Override @@ -131,9 +139,14 @@ public boolean isDirectory(TeaFileHandle file) { @Override public void mkdirs(TeaFileHandle file) { String path = file.path(); - IndexedDBFileData fileData = IndexedDBFileData.create(TYPE_DIRECTORY, new JSDate()); - fileMap.put(path, fileData); - putFileAsync(path, fileData); + putFolder(path); + + FileHandle cur = file.parent(); + while(!cur.path().isEmpty()) { + String parentPath = cur.path(); + putFolder(parentPath); + cur = cur.parent(); + } } @Override @@ -147,7 +160,21 @@ public boolean delete(TeaFileHandle file) { String path = file.path(); IndexedDBFileData data = fileMap.remove(path); if(data != null) { + boolean isDirectory = data.getType() == TYPE_DIRECTORY; + removeFileAsync(path); + + if(isDirectory) { + FileHandle[] list = file.list(); + // Get all children paths and delete them all + String[] paths = getAllChildrenAndSiblings(file); + for(int i = 0; i < paths.length; i++) { + String childOrSiblingPath = paths[i]; + if(fileMap.remove(childOrSiblingPath) != null) { + removeFileAsync(childOrSiblingPath); + } + } + } return true; } return false; @@ -177,6 +204,56 @@ public void rename(TeaFileHandle source, TeaFileHandle target) { } } + @Override + public String getLocalStoragePath() { + return databaseName; + } + + private String[] getAllChildrenAndSiblings(FileHandle file) { + return list(file, false); + } + + private String[] getAllChildren(FileHandle file) { + return list(file, true); + } + + private String[] list(FileHandle file, boolean equals) { + String dir = file.path(); + ObjectMap.Entries it = fileMap.iterator(); + while(it.hasNext) { + ObjectMap.Entry next = it.next(); + String path = next.key; + String parentPath = Gdx.files.local(path).parent().path(); + // Only add path if parent is dir + if(!parentPath.isEmpty()) { + if(equals) { + if(parentPath.equals(dir)) { + tmpPaths.add(path); + } + } + else { + if(parentPath.startsWith(dir)) { + tmpPaths.add(path); + } + } + } + } + tmpPaths.sort(); + String[] str = new String[tmpPaths.size]; + for(int i = 0; i < tmpPaths.size; i++) { + String s = tmpPaths.get(i); + str[i] = s; + } + tmpPaths.clear(); + return str; + } + + private void putFolder(String path) { + IndexedDBFileData fileData = IndexedDBFileData.create(TYPE_DIRECTORY, new JSDate()); + fileMap.put(path, fileData); + putFileAsync(path, fileData); + } + private void putFileAsync(String key, IndexedDBFileData data) { IDBTransaction transaction = dataBase.transaction(KEY_OBJECT_STORE, "readwrite"); IDBObjectStore objectStore = transaction.objectStore(KEY_OBJECT_STORE); @@ -206,6 +283,7 @@ private void readAllFilesAsync(TeaApplication teaApplication) { JSObject value = cursor.getValue(); IndexedDBFileData fileData = getFileData(value); fileMap.put(key, fileData); + cursor.doContinue(); } teaApplication.delayInitCount--; }); diff --git a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java index e87ff006..5d285208 100644 --- a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java +++ b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java @@ -86,9 +86,85 @@ public void create() { else { message += "External storage not available"; } + testLocalPath(); + try { + testClasspath(); + testInternal(); + if(!(Gdx.app.getType() == ApplicationType.WebGL)) { + testExternal(); + testAbsolute(); + testLocal(); + } + } catch(IOException ex) { + throw new RuntimeException(ex); + } + } + + @Override + public void resize(int width, int height) { + + } + + private void testLocalPath() { if(Gdx.files.isLocalStorageAvailable()) { message += "\nLocal storage available\n"; - message += "Local storage path: " + Gdx.files.getLocalStoragePath() + "\n"; + message += "Local storage path: " + Gdx.files.getLocalStoragePath() + "\n\n"; + + { + // Test multiple subfolder + FileHandle subFolder = Gdx.files.local("rootFolder/childFolder/subFolder/"); + FileHandle childFolder1 = Gdx.files.local("rootFolder/childFolder/"); + FileHandle childFolder2 = Gdx.files.local("rootFolder/childFolder"); + FileHandle rootFolder1 = Gdx.files.local("rootFolder/"); + FileHandle rootFolder2 = Gdx.files.local("rootFolder"); + + boolean exists = rootFolder1.exists(); + + message += "subFolder: " + subFolder + " exists: " + subFolder.exists() + "\n"; + message += "childFolder1: " + childFolder1 + " exists: " + childFolder1.exists() + "\n"; + message += "childFolder2: " + childFolder2 + " exists: " + childFolder2.exists() + "\n"; + message += "rootFolder1: " + rootFolder1 + " exists: " + exists + "\n"; + message += "rootFolder2: " + rootFolder2 + " exists: " + rootFolder2.exists() + "\n"; + + subFolder.mkdirs(); + + if(exists) { + FileHandle[] list = rootFolder1.list(); + for(int i = 0; i < list.length; i++) { + FileHandle fileHandle = list[i]; + System.out.println("FOLDER LIST: " + fileHandle); + } + boolean delete = rootFolder1.deleteDirectory(); + System.out.println("Deleted: " + delete + " " + rootFolder1); + } + + } + message += "\n"; + { + // Test file in subfolder + FileHandle subFile = Gdx.files.local("rootFileFolder/childFileFolder/subFile.txt"); + FileHandle childFileFolder1 = Gdx.files.local("rootFileFolder/childFileFolder/"); + FileHandle childFileFolder2 = Gdx.files.local("rootFileFolder/childFileFolder"); + FileHandle rootFileFolder1 = Gdx.files.local("rootFileFolder/"); + FileHandle rootFileFolder2 = Gdx.files.local("rootFileFolder"); + + boolean exists = rootFileFolder1.exists(); + + message += "subFile: " + subFile + " exists: " + subFile.exists() + "\n"; + message += "childFileFolder1: " + childFileFolder1 + " exists: " + childFileFolder1.exists() + "\n"; + message += "childFileFolder2: " + childFileFolder2 + " exists: " + childFileFolder2.exists() + "\n"; + message += "rootFileFolder1: " + rootFileFolder1 + " exists: " + exists + "\n"; + message += "rootFileFolder2: " + rootFileFolder2 + " exists: " + rootFileFolder2.exists() + "\n"; + + subFile.writeString("HELLO", false); + + if(exists) { + boolean delete = rootFileFolder1.deleteDirectory(); + System.out.println("Deleted: " + delete + " " + rootFileFolder1); + } + } + + message += "\n"; BufferedWriter out = null; boolean canDelete = false; @@ -146,22 +222,6 @@ public void create() { } } } - try { - testClasspath(); - testInternal(); - if(!(Gdx.app.getType() == ApplicationType.WebGL)) { - testExternal(); - testAbsolute(); - testLocal(); - } - } catch(IOException ex) { - throw new RuntimeException(ex); - } - } - - @Override - public void resize(int width, int height) { - } private void testClasspath() throws IOException { @@ -207,7 +267,6 @@ private void testInternal() throws IOException { if(handle.list().length != 0) fail("File length shouldn't be 0"); if(Gdx.app.getType() != ApplicationType.Android) { FileHandle parent = handle.parent(); - System.out.println("PATH: " + parent.path()); boolean exists = parent.exists(); if(!exists) fail("Parent doesn't exist"); } From ebfdcaa1c3f2c71ec26f2b6b0e39c7e486a83107 Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 30 May 2024 14:51:31 -0300 Subject: [PATCH 033/114] Some db fixes --- .../gdx/backends/teavm/TeaFileHandle.java | 13 +++----- .../gdx/backends/teavm/filesystem/FileDB.java | 2 ++ .../teavm/filesystem/FileDBManager.java | 9 ++++++ .../teavm/filesystem/FileDBStorage.java | 7 ++++- .../teavm/filesystem/IndexedDBStorage.java | 31 ++++++++++++++----- .../gdx/examples/tests/FilesTest.java | 8 ++++- 6 files changed, 52 insertions(+), 18 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java index fcdc4a91..14515880 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java @@ -274,6 +274,7 @@ public int readBytes(byte[] bytes, int offset, int size) { * {@link FileType#Internal} file, or if it could not be written. */ public OutputStream write(boolean append) { + //TODO remove fixed size return write(append, 4096); } @@ -305,7 +306,8 @@ public OutputStream write(boolean append, int bufferSize) { public void write(InputStream input, boolean append) { OutputStream output = null; try { - output = write(append, (int)length()); + int available = input.available(); + output = write(append, available); StreamUtils.copyStream(input, output); } catch(Exception ex) { @@ -564,7 +566,7 @@ public boolean delete() { */ public boolean deleteDirectory() { if(type == FileType.Local) { - return FileDB.getInstance().delete(this); + return FileDB.getInstance().deleteDirectory(this); } throw new GdxRuntimeException("Cannot delete directory (missing implementation): " + file); } @@ -614,13 +616,6 @@ public void moveTo(FileHandle dest) { case Absolute: case External: default: - if((type == FileType.Local) && (dest.type() == FileType.Local)) { - // we can potentially rename directly? - if(isDirectory() == dest.isDirectory()) { - FileDB.getInstance().rename(this, (TeaFileHandle)dest); - return; - } - } copyTo(dest); delete(); if(exists() && isDirectory()) deleteDirectory(); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java index 6d3d7c0f..93269d98 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java @@ -123,6 +123,8 @@ public final FileHandle[] list(TeaFileHandle file, String suffix) { public abstract boolean delete(TeaFileHandle file); + public abstract boolean deleteDirectory(TeaFileHandle file); + public abstract long length(TeaFileHandle file); public abstract void rename(TeaFileHandle source, TeaFileHandle target); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java index dbc725e5..53678390 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java @@ -1,6 +1,7 @@ package com.github.xpenatan.gdx.backends.teavm.filesystem; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.utils.GdxRuntimeException; import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; @@ -135,6 +136,14 @@ public boolean delete(TeaFileHandle file) { } } + @Override + public boolean deleteDirectory(TeaFileHandle file) { + if(indexedDB != null) { + return indexedDB.deleteDirectory(file); + } + throw new GdxRuntimeException("Cannot delete directory (missing implementation): " + file); + } + @Override public long length(TeaFileHandle file) { if(indexedDB != null) { diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBStorage.java index 49da5fe6..8e151905 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBStorage.java @@ -1,7 +1,7 @@ package com.github.xpenatan.gdx.backends.teavm.filesystem; -import com.badlogic.gdx.Gdx; import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.GdxRuntimeException; import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; import java.io.ByteArrayInputStream; @@ -110,6 +110,11 @@ public boolean delete(TeaFileHandle file) { return true; } + @Override + public boolean deleteDirectory(TeaFileHandle file) { + throw new GdxRuntimeException("Cannot delete directory (missing implementation): " + file); + } + @Override public long length(TeaFileHandle file) { // this is somewhat slow diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java index 3db40984..631c03a4 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java @@ -140,7 +140,6 @@ public boolean isDirectory(TeaFileHandle file) { public void mkdirs(TeaFileHandle file) { String path = file.path(); putFolder(path); - FileHandle cur = file.parent(); while(!cur.path().isEmpty()) { String parentPath = cur.path(); @@ -158,24 +157,42 @@ public boolean exists(TeaFileHandle file) { @Override public boolean delete(TeaFileHandle file) { String path = file.path(); - IndexedDBFileData data = fileMap.remove(path); + IndexedDBFileData data = fileMap.get(path); if(data != null) { - boolean isDirectory = data.getType() == TYPE_DIRECTORY; + if(data.getType() != TYPE_FILE) { + return false; + } + if(fileMap.remove(path) != null) { + removeFileAsync(path); + return true; + } + } + return false; + } - removeFileAsync(path); + @Override + public boolean deleteDirectory(TeaFileHandle file) { + String path = file.path(); + IndexedDBFileData data = fileMap.get(path); + if(data != null) { + if(data.getType() != TYPE_DIRECTORY) { + return false; + } - if(isDirectory) { + if(fileMap.remove(path) != null) { + removeFileAsync(path); FileHandle[] list = file.list(); // Get all children paths and delete them all String[] paths = getAllChildrenAndSiblings(file); for(int i = 0; i < paths.length; i++) { String childOrSiblingPath = paths[i]; - if(fileMap.remove(childOrSiblingPath) != null) { + boolean rem = fileMap.remove(childOrSiblingPath) != null; + if(rem) { removeFileAsync(childOrSiblingPath); } } + return true; } - return true; } return false; } diff --git a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java index 5d285208..d0b814f2 100644 --- a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java +++ b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java @@ -157,11 +157,17 @@ private void testLocalPath() { message += "rootFileFolder2: " + rootFileFolder2 + " exists: " + rootFileFolder2.exists() + "\n"; subFile.writeString("HELLO", false); - + FileHandle helloFolder = Gdx.files.local("HELLO"); if(exists) { + System.out.println("================"); + rootFileFolder1.moveTo(helloFolder); + boolean delete = rootFileFolder1.deleteDirectory(); System.out.println("Deleted: " + delete + " " + rootFileFolder1); } + else { + helloFolder.deleteDirectory(); + } } message += "\n"; From 3d37968d1b9a8fe52dc66fcf106f15b40b7dfbd8 Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 30 May 2024 21:56:00 -0300 Subject: [PATCH 034/114] Update changes --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 9c4b7ea6..414784d1 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,7 @@ [1.0.0-SNAPSHOT] - Update teavm to 0.10.0 - Pixmap now use Gdx2DPixmap +- Add Gdx.files.local support using IndexedDB [1.0.0-b9] - add TeaClassFilter printAllowedClasses() and printExcludedClasses() From 0662298db1f21c5bee016cc426e0ccb52cebdbf0 Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 8 Jun 2024 16:42:26 -0300 Subject: [PATCH 035/114] local file improvements --- .../teavm/filesystem/IndexedDBStorage.java | 136 ++++++++++++++---- .../gdx/examples/tests/FilesTest.java | 17 ++- 2 files changed, 126 insertions(+), 27 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java index 631c03a4..b6309579 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.ObjectMap; +import com.badlogic.gdx.utils.OrderedMap; import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; @@ -33,14 +34,16 @@ public class IndexedDBStorage extends FileDB { private static final int TYPE_FILE = 1; private static final int TYPE_DIRECTORY = 2; - private final ObjectMap fileMap; + private final OrderedMap fileMap; private Array tmpPaths = new Array<>(); private String databaseName; + private boolean debug = false; + public IndexedDBStorage() { - fileMap = new ObjectMap<>(); + fileMap = new OrderedMap<>(); setupIndexedDB(); } @@ -90,7 +93,7 @@ private String getDatabaseName(TeaApplicationConfiguration config) { @Override public InputStream read(TeaFileHandle file) { String path = file.path(); - IndexedDBFileData data = fileMap.get(path); + IndexedDBFileData data = get(path); Int8ArrayWrapper array = data.getContents(); byte[] byteArray = TypedArrays.toByteArray(array); try { @@ -98,7 +101,7 @@ public InputStream read(TeaFileHandle file) { } catch(RuntimeException e) { // Something corrupted: we remove it & re-throw the error - fileMap.remove(path); + remove(path); removeFileAsync(path); throw e; } @@ -109,11 +112,11 @@ protected void writeInternal(TeaFileHandle file, byte[] data, boolean append, in String path = file.path(); IndexedDBFileData fileData = IndexedDBFileData.create(TYPE_FILE, new JSDate()); fileData.setContents(data); - fileMap.put(path, fileData); + put(path, fileData); putFileAsync(path, fileData); FileHandle cur = file.parent(); - while(!cur.path().isEmpty()) { + while(!isRootFolder(cur)) { String parentPath = cur.path(); putFolder(parentPath); cur = cur.parent(); @@ -128,7 +131,12 @@ protected String[] paths(TeaFileHandle file) { @Override public boolean isDirectory(TeaFileHandle file) { String path = file.path(); - IndexedDBFileData data = fileMap.get(path); + + if(isRootFolder(file)) { + return true; + } + + IndexedDBFileData data = get(path); if(data != null) { int type = data.getType(); return type == TYPE_DIRECTORY; @@ -139,9 +147,15 @@ public boolean isDirectory(TeaFileHandle file) { @Override public void mkdirs(TeaFileHandle file) { String path = file.path(); + if(path.startsWith(".")) { + path = path.replaceFirst(".", ""); + } + if(path.startsWith("/")) { + path = path.replaceFirst("/", ""); + } putFolder(path); FileHandle cur = file.parent(); - while(!cur.path().isEmpty()) { + while(!isRootFolder(cur)) { String parentPath = cur.path(); putFolder(parentPath); cur = cur.parent(); @@ -151,18 +165,25 @@ public void mkdirs(TeaFileHandle file) { @Override public boolean exists(TeaFileHandle file) { String path = file.path(); - return fileMap.containsKey(path); + if(isRootFolder(file)) { + return true; + } + return containsKey(path); } @Override public boolean delete(TeaFileHandle file) { String path = file.path(); - IndexedDBFileData data = fileMap.get(path); + if(isRootFolder(file)) { + return false; + } + + IndexedDBFileData data = get(path); if(data != null) { if(data.getType() != TYPE_FILE) { return false; } - if(fileMap.remove(path) != null) { + if(remove(path) != null) { removeFileAsync(path); return true; } @@ -173,20 +194,23 @@ public boolean delete(TeaFileHandle file) { @Override public boolean deleteDirectory(TeaFileHandle file) { String path = file.path(); - IndexedDBFileData data = fileMap.get(path); + if(isRootFolder(file)) { + return false; + } + IndexedDBFileData data = get(path); if(data != null) { if(data.getType() != TYPE_DIRECTORY) { return false; } - if(fileMap.remove(path) != null) { + if(remove(path) != null) { removeFileAsync(path); FileHandle[] list = file.list(); // Get all children paths and delete them all String[] paths = getAllChildrenAndSiblings(file); for(int i = 0; i < paths.length; i++) { String childOrSiblingPath = paths[i]; - boolean rem = fileMap.remove(childOrSiblingPath) != null; + boolean rem = remove(childOrSiblingPath) != null; if(rem) { removeFileAsync(childOrSiblingPath); } @@ -200,8 +224,8 @@ public boolean deleteDirectory(TeaFileHandle file) { @Override public long length(TeaFileHandle file) { String path = file.path(); - IndexedDBFileData data = fileMap.get(path); - if(data.getType() == TYPE_FILE) { + IndexedDBFileData data = get(path); + if(data != null && data.getType() == TYPE_FILE) { Int8ArrayWrapper contents = data.getContents(); byte[] bytes = TypedArrays.toByteArray(contents); return bytes.length; @@ -213,9 +237,9 @@ public long length(TeaFileHandle file) { public void rename(TeaFileHandle source, TeaFileHandle target) { String sourcePath = source.path(); String targetPath = target.path(); - IndexedDBFileData data = fileMap.remove(sourcePath); + IndexedDBFileData data = remove(sourcePath); if(data != null) { - fileMap.put(targetPath, data); + put(targetPath, data); removeFileAsync(sourcePath); putFileAsync(targetPath, data); } @@ -226,6 +250,16 @@ public String getLocalStoragePath() { return databaseName; } + private boolean isRootFolder(FileHandle cur) { + String path = cur.path(); + if(path.isEmpty() || path.equals(".") || path.equals("/") || path.equals("./")) { + return true; + } + else { + return false; + } + } + private String[] getAllChildrenAndSiblings(FileHandle file) { return list(file, false); } @@ -235,14 +269,25 @@ private String[] getAllChildren(FileHandle file) { } private String[] list(FileHandle file, boolean equals) { - String dir = file.path(); + String dirPath = file.path(); + + boolean isRoot = isRootFolder(file); + + String dir = dirPath; ObjectMap.Entries it = fileMap.iterator(); while(it.hasNext) { ObjectMap.Entry next = it.next(); String path = next.key; - String parentPath = Gdx.files.local(path).parent().path(); + FileHandle parent = Gdx.files.local(path).parent(); + String parentPath = parent.path(); + + boolean isChildParentRoot = isRootFolder(parent); + // Only add path if parent is dir - if(!parentPath.isEmpty()) { + if(isChildParentRoot && isRoot) { + tmpPaths.add(path); + } + else { if(equals) { if(parentPath.equals(dir)) { tmpPaths.add(path); @@ -259,6 +304,9 @@ private String[] list(FileHandle file, boolean equals) { String[] str = new String[tmpPaths.size]; for(int i = 0; i < tmpPaths.size; i++) { String s = tmpPaths.get(i); + if(debug) { + System.out.println("Listh[" + i + "]: " + s); + } str[i] = s; } tmpPaths.clear(); @@ -267,11 +315,15 @@ private String[] list(FileHandle file, boolean equals) { private void putFolder(String path) { IndexedDBFileData fileData = IndexedDBFileData.create(TYPE_DIRECTORY, new JSDate()); - fileMap.put(path, fileData); + put(path, fileData); putFileAsync(path, fileData); } - private void putFileAsync(String key, IndexedDBFileData data) { + private void putFileAsync(String key1, IndexedDBFileData data) { + String key = getPath(key1); + if(debug) { + System.out.println("putFileAsync: " + key); + } IDBTransaction transaction = dataBase.transaction(KEY_OBJECT_STORE, "readwrite"); IDBObjectStore objectStore = transaction.objectStore(KEY_OBJECT_STORE); IDBRequest request = objectStore.put(data, getJSString(key)); @@ -280,7 +332,11 @@ private void putFileAsync(String key, IndexedDBFileData data) { }); } - private void removeFileAsync(String key) { + private void removeFileAsync(String key1) { + String key = getPath(key1); + if(debug) { + System.out.println("removeFileAsync: " + key); + } IDBTransaction transaction = dataBase.transaction(KEY_OBJECT_STORE, "readwrite"); IDBObjectStore objectStore = transaction.objectStore(KEY_OBJECT_STORE); IDBRequest request = objectStore.delete(getJSString(key)); @@ -297,9 +353,12 @@ private void readAllFilesAsync(TeaApplication teaApplication) { IDBCursor cursor = cursorRequest.getResult(); if(cursor != null) { String key = getJavaString(cursor.getKey()); + if(key.startsWith("/")) { + key = key.replaceFirst("/", ""); + } JSObject value = cursor.getValue(); IndexedDBFileData fileData = getFileData(value); - fileMap.put(key, fileData); + put(key, fileData); cursor.doContinue(); } teaApplication.delayInitCount--; @@ -309,6 +368,33 @@ private void readAllFilesAsync(TeaApplication teaApplication) { }); } + private IndexedDBFileData get(String path) { + return fileMap.get(path); + } + + private void put(String path, IndexedDBFileData fileData) { + fileMap.put(path, fileData); + } + + private IndexedDBFileData remove(String path) { + return fileMap.remove(path); + } + + private boolean containsKey(String path) { + return fileMap.containsKey(path); + } + + private String getPath(String path) { + if(path.startsWith("./")) { + path = path.replace("./", ""); + } + + if(!path.startsWith("/")) { + path = "/" + path; + } + return path; + } + @JSBody(params = { "data" }, script = "return data;") private static native JSObject getJSString(String data); diff --git a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java index d0b814f2..e2d444e6 100644 --- a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java +++ b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java @@ -102,7 +102,6 @@ public void create() { @Override public void resize(int width, int height) { - } private void testLocalPath() { @@ -169,7 +168,6 @@ private void testLocalPath() { helloFolder.deleteDirectory(); } } - message += "\n"; BufferedWriter out = null; @@ -227,6 +225,21 @@ private void testLocalPath() { message += "Couldn't delete localstorage/test.txt"; } } + message += "\n"; + { + FileHandle root1 = Gdx.files.local(""); + FileHandle root2 = Gdx.files.local("./"); + FileHandle root3 = Gdx.files.local("."); + + message += "root1: " + root1 + " exists: " + root1.exists() + " Root size: " + root1.list().length + "\n"; + message += "root2: " + root2 + " exists: " + root2.exists() + " Root size: " + root2.list().length + "\n"; + message += "root3: " + root3 + " exists: " + root3.exists() + " Root size: " + root3.list().length + "\n"; + message += "root2 length: " + root2.length() + "\n"; + FileHandle[] list = root1.list(); + for(int i = 0; i < list.length; i++) { + System.out.println("Files: " + list[i]); + } + } } } From 1f713ae89176dcf9924658bff210ad7d8a1cbd1c Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 8 Jun 2024 20:52:52 -0300 Subject: [PATCH 036/114] Small file handle change --- .../com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java index 14515880..e8cd69b8 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java @@ -40,9 +40,7 @@ public TeaFileHandle(Preloader preloader, String fileName, FileType type) { } public TeaFileHandle(String path) { - this.type = FileType.Internal; - this.preloader = ((TeaApplication)Gdx.app).getPreloader(); - this.file = fixSlashes(path); + this(((TeaApplication)Gdx.app).getPreloader(), path, FileType.Internal); } /** @return The full url to an asset, e.g. http://localhost:8080/assets/data/shotgun.ogg */ From 96a94e6de336bdf9adf7b9552deaed11f48c9a9d Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 8 Jun 2024 21:27:03 -0300 Subject: [PATCH 037/114] Make all paths start with dash --- .../teavm/filesystem/IndexedDBStorage.java | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java index b6309579..f5bc4ca8 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java @@ -147,12 +147,6 @@ public boolean isDirectory(TeaFileHandle file) { @Override public void mkdirs(TeaFileHandle file) { String path = file.path(); - if(path.startsWith(".")) { - path = path.replaceFirst(".", ""); - } - if(path.startsWith("/")) { - path = path.replaceFirst("/", ""); - } putFolder(path); FileHandle cur = file.parent(); while(!isRootFolder(cur)) { @@ -320,7 +314,7 @@ private void putFolder(String path) { } private void putFileAsync(String key1, IndexedDBFileData data) { - String key = getPath(key1); + String key = fixPath(key1); if(debug) { System.out.println("putFileAsync: " + key); } @@ -333,7 +327,7 @@ private void putFileAsync(String key1, IndexedDBFileData data) { } private void removeFileAsync(String key1) { - String key = getPath(key1); + String key = fixPath(key1); if(debug) { System.out.println("removeFileAsync: " + key); } @@ -353,9 +347,6 @@ private void readAllFilesAsync(TeaApplication teaApplication) { IDBCursor cursor = cursorRequest.getResult(); if(cursor != null) { String key = getJavaString(cursor.getKey()); - if(key.startsWith("/")) { - key = key.replaceFirst("/", ""); - } JSObject value = cursor.getValue(); IndexedDBFileData fileData = getFileData(value); put(key, fileData); @@ -369,26 +360,48 @@ private void readAllFilesAsync(TeaApplication teaApplication) { } private IndexedDBFileData get(String path) { + path = fixPath(path); + + if(debug) { + System.out.println("file get: " + path); + } return fileMap.get(path); } private void put(String path, IndexedDBFileData fileData) { + path = fixPath(path); + if(debug) { + System.out.println("file put: " + path); + } fileMap.put(path, fileData); } private IndexedDBFileData remove(String path) { + path = fixPath(path); + if(debug) { + System.out.println("file remove: " + path); + } return fileMap.remove(path); } private boolean containsKey(String path) { + path = fixPath(path); + + if(debug) { + System.out.println("file containsKey: " + path); + } return fileMap.containsKey(path); } - private String getPath(String path) { + private String fixPath(String path) { if(path.startsWith("./")) { path = path.replace("./", ""); } + if(path.startsWith(".")) { + path = path.replaceFirst(".", ""); + } + if(!path.startsWith("/")) { path = "/" + path; } From b7e3436d07c141747813437001c3a318e533569a Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 8 Jun 2024 21:57:25 -0300 Subject: [PATCH 038/114] Fix local path --- .../teavm/filesystem/IndexedDBStorage.java | 23 ++++++++++--------- .../gdx/examples/tests/FilesTest.java | 5 +--- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java index f5bc4ca8..cc59379e 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java @@ -267,13 +267,13 @@ private String[] list(FileHandle file, boolean equals) { boolean isRoot = isRootFolder(file); - String dir = dirPath; + String dir = fixPath(dirPath); ObjectMap.Entries it = fileMap.iterator(); while(it.hasNext) { ObjectMap.Entry next = it.next(); - String path = next.key; + String path = fixPath(next.key); FileHandle parent = Gdx.files.local(path).parent(); - String parentPath = parent.path(); + String parentPath = fixPath(parent.path()); boolean isChildParentRoot = isRootFolder(parent); @@ -361,11 +361,11 @@ private void readAllFilesAsync(TeaApplication teaApplication) { private IndexedDBFileData get(String path) { path = fixPath(path); - + IndexedDBFileData data = fileMap.get(path); if(debug) { - System.out.println("file get: " + path); + System.out.println("file get: " + (data != null) + " Path: " + path); } - return fileMap.get(path); + return data; } private void put(String path, IndexedDBFileData fileData) { @@ -378,19 +378,20 @@ private void put(String path, IndexedDBFileData fileData) { private IndexedDBFileData remove(String path) { path = fixPath(path); + IndexedDBFileData data = fileMap.remove(path); if(debug) { - System.out.println("file remove: " + path); + System.out.println("file remove: " + (data != null) + " Path: " + path); } - return fileMap.remove(path); + return data; } private boolean containsKey(String path) { path = fixPath(path); - + boolean flag = fileMap.containsKey(path); if(debug) { - System.out.println("file containsKey: " + path); + System.out.println("file containsKey: " + flag + " Path: " + path); } - return fileMap.containsKey(path); + return flag; } private String fixPath(String path) { diff --git a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java index e2d444e6..1598f5a6 100644 --- a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java +++ b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java @@ -155,16 +155,13 @@ private void testLocalPath() { message += "rootFileFolder1: " + rootFileFolder1 + " exists: " + exists + "\n"; message += "rootFileFolder2: " + rootFileFolder2 + " exists: " + rootFileFolder2.exists() + "\n"; - subFile.writeString("HELLO", false); FileHandle helloFolder = Gdx.files.local("HELLO"); if(exists) { System.out.println("================"); rootFileFolder1.moveTo(helloFolder); - - boolean delete = rootFileFolder1.deleteDirectory(); - System.out.println("Deleted: " + delete + " " + rootFileFolder1); } else { + subFile.writeString("HELLO", false); helloFolder.deleteDirectory(); } } From 299d481faf76bc9a411370a15a75c33fb1205dbc Mon Sep 17 00:00:00 2001 From: Natan Date: Sun, 9 Jun 2024 22:44:22 -0300 Subject: [PATCH 039/114] wip assets --- .../com/badlogic/gdx/graphics/PixmapEmu.java | 27 ++- .../gdx/backends/teavm/TeaApplication.java | 2 +- .../teavm/TeaApplicationConfiguration.java | 6 + .../gdx/backends/teavm/TeaFileHandle.java | 29 +-- .../gdx/backends/teavm/TeaWindowListener.java | 11 +- .../gdx/backends/teavm/filesystem/FileDB.java | 2 + .../teavm/filesystem/FileDBManager.java | 10 +- .../teavm/filesystem/FileDBStorage.java | 5 + .../teavm/filesystem/IndexedDBStorage.java | 12 ++ .../backends/teavm/preloader/FileData.java | 26 +++ .../backends/teavm/preloader/Preloader.java | 186 +++++++++--------- 11 files changed, 206 insertions(+), 110 deletions(-) create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/FileData.java diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java index c3ec9bf2..a498be5e 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java @@ -7,6 +7,8 @@ import com.badlogic.gdx.utils.Disposable; import com.badlogic.gdx.utils.GdxRuntimeException; import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; +import com.github.xpenatan.gdx.backends.teavm.TeaApplication; +import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; @@ -16,6 +18,7 @@ import com.github.xpenatan.gdx.backends.teavm.preloader.AssetType; import com.github.xpenatan.gdx.backends.teavm.preloader.Blob; import java.nio.ByteBuffer; +import org.teavm.jso.JSBody; @Emulate(Pixmap.class) public class PixmapEmu implements Disposable { @@ -93,13 +96,25 @@ public boolean onSuccess(String url, Blob result) { public PixmapEmu(FileHandle file) { TeaFileHandle webFileHandler = (TeaFileHandle)file; String path = webFileHandler.path(); - Blob object = webFileHandler.preloader.images.get(path); - if(object == null) { - // Add a way to debug when assets was not loaded in preloader. - throw new GdxRuntimeException("File is null, it does not exist: " + path); + + TeaApplicationConfiguration config = ((TeaApplication)Gdx.app).getConfig(); + byte[] bytes = null; + if(config.useNewExperimentalAssets) { + if(!file.exists()) { + // Add a way to debug when assets was not loaded in preloader. + throw new GdxRuntimeException("File is null, it does not exist: " + path); + } + bytes = file.readBytes(); + } + else { + Blob object = webFileHandler.preloader.images.get(path); + if(object == null) { + // Add a way to debug when assets was not loaded in preloader. + throw new GdxRuntimeException("File is null, it does not exist: " + path); + } + Int8ArrayWrapper response = object.getData(); + bytes = TypedArrays.toByteArray(response); } - Int8ArrayWrapper response = object.getData(); - byte[] bytes = TypedArrays.toByteArray(response); nativePixmap = new Gdx2DPixmapEmu(bytes, 0, bytes.length, 0); initPixmapEmu(); } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java index 4802d332..fce7e43d 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java @@ -117,7 +117,7 @@ else if(agentInfo.isLinux()) preloader = new Preloader(hostPageBaseURL, graphics.canvas, this); AssetLoaderListener assetListener = new AssetLoaderListener(); - preloader.preload(config.preloadAssets, "assets.txt"); + preloader.preload(config, "assets.txt"); input = new TeaInput(graphics.canvas); files = new TeaFiles(preloader); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java index 7cb9e802..6e83363b 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java @@ -25,6 +25,12 @@ public class TeaApplicationConfiguration { */ public boolean useIndexedDB = true; + /** + * Experimental feature + */ + @Deprecated + public boolean useNewExperimentalAssets = false; + /** * The prefix for the browser storage. If you have multiple apps on the same server and want to keep the * data separate for those applications, you will need to set unique prefixes. This is useful if you are diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java index e8cd69b8..1bb798c4 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java @@ -30,6 +30,8 @@ public class TeaFileHandle extends FileHandle { private final String file; private final FileType type; + private final TeaApplicationConfiguration config; + public TeaFileHandle(Preloader preloader, String fileName, FileType type) { if((type != FileType.Internal) && (type != FileType.Classpath) && (type != FileType.Local)) { throw new GdxRuntimeException("FileType '" + type + "' Not supported in web backend"); @@ -37,6 +39,7 @@ public TeaFileHandle(Preloader preloader, String fileName, FileType type) { this.preloader = preloader; this.file = fixSlashes(fileName); this.type = type; + config = ((TeaApplication)Gdx.app).getConfig(); } public TeaFileHandle(String path) { @@ -100,7 +103,7 @@ public File file() { * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. */ public InputStream read() { - if(type == FileType.Local) { + if(config.useNewExperimentalAssets || type == FileType.Local) { return FileDB.getInstance().read(this); } else { @@ -175,7 +178,7 @@ public String readString() { * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. */ public String readString(String charset) { - if(type == FileType.Local) { + if(config.useNewExperimentalAssets ||type == FileType.Local) { // obtain via reader return super.readString(charset); } @@ -196,6 +199,10 @@ public String readString(String charset) { * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. */ public byte[] readBytes() { + if(config.useNewExperimentalAssets) { + return FileDB.getInstance().readBytes(this); + } + int length = (int)length(); if(length == 0) length = 512; byte[] buffer = new byte[length]; @@ -426,7 +433,7 @@ public void writeBytes(byte[] bytes, int offset, int length, boolean append) { * @throws GdxRuntimeException if this file is an {@link FileType#Classpath} file. */ public FileHandle[] list() { - if(type == FileType.Local) { + if(config.useNewExperimentalAssets || type == FileType.Local) { return FileDB.getInstance().list(this); } else { @@ -442,7 +449,7 @@ public FileHandle[] list() { * @throws GdxRuntimeException if this file is an {@link FileType#Classpath} file. */ public FileHandle[] list(FileFilter filter) { - if(type == FileType.Local) { + if(config.useNewExperimentalAssets || type == FileType.Local) { return FileDB.getInstance().list(this, filter); } else { @@ -458,7 +465,7 @@ public FileHandle[] list(FileFilter filter) { * @throws GdxRuntimeException if this file is an {@link FileType#Classpath} file. */ public FileHandle[] list(FilenameFilter filter) { - if(type == FileType.Local) { + if(config.useNewExperimentalAssets || type == FileType.Local) { return FileDB.getInstance().list(this, filter); } else { @@ -474,7 +481,7 @@ public FileHandle[] list(FilenameFilter filter) { * @throws GdxRuntimeException if this file is an {@link FileType#Classpath} file. */ public FileHandle[] list(String suffix) { - if(type == FileType.Local) { + if(config.useNewExperimentalAssets || type == FileType.Local) { return FileDB.getInstance().list(this, suffix); } else { @@ -488,7 +495,7 @@ public FileHandle[] list(String suffix) { * handle to a directory on the classpath will return false. */ public boolean isDirectory() { - if(type == FileType.Local) { + if(config.useNewExperimentalAssets || type == FileType.Local) { return FileDB.getInstance().isDirectory(this); } else { @@ -535,7 +542,7 @@ public void mkdirs() { * directory will always return false. */ public boolean exists() { - if(type == FileType.Local) { + if(config.useNewExperimentalAssets || type == FileType.Local) { return FileDB.getInstance().exists(this); } else { @@ -549,7 +556,7 @@ public boolean exists() { * @throws GdxRuntimeException if this file handle is a {@link FileType#Classpath} or {@link FileType#Internal} file. */ public boolean delete() { - if(type == FileType.Local) { + if(config.useNewExperimentalAssets || type == FileType.Local) { return FileDB.getInstance().delete(this); } else { @@ -563,7 +570,7 @@ public boolean delete() { * @throws GdxRuntimeException if this file handle is a {@link FileType#Classpath} or {@link FileType#Internal} file. */ public boolean deleteDirectory() { - if(type == FileType.Local) { + if(config.useNewExperimentalAssets || type == FileType.Local) { return FileDB.getInstance().deleteDirectory(this); } throw new GdxRuntimeException("Cannot delete directory (missing implementation): " + file); @@ -625,7 +632,7 @@ public void moveTo(FileHandle dest) { * determined. */ public long length() { - if(type == FileType.Local) { + if(config.useNewExperimentalAssets || type == FileType.Local) { return FileDB.getInstance().length(this); } else { diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaWindowListener.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaWindowListener.java index dafe3f10..94cc4616 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaWindowListener.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaWindowListener.java @@ -1,10 +1,19 @@ package com.github.xpenatan.gdx.backends.teavm; +import com.github.xpenatan.gdx.backends.teavm.preloader.FileData; + public interface TeaWindowListener { /** * Called when external files are dropped into the html canvas, e.g from the Desktop. * * @param files array with absolute paths to the files */ - void filesDropped(String[] files); + default void filesDropped(String[] files) {} + + default void filesDropped(FileData[] files) {} + + /** + * Called to accept or not external files are dropped into the html canvas, e.g from the Desktop. + */ + default boolean acceptFileDropped(String file) { return true; } } \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java index 93269d98..14c24225 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java @@ -40,6 +40,8 @@ public static FileDB getInstance() { public abstract InputStream read(TeaFileHandle file); + public abstract byte[] readBytes(TeaFileHandle file); + public final OutputStream write(TeaFileHandle file, boolean append, int bufferSize) { // buffer for writing ByteArrayOutputStream buffer = new ByteArrayOutputStream(Math.max(512, Math.min(bufferSize, 8192))); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java index 53678390..6d768f8f 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java @@ -35,7 +35,7 @@ public final class FileDBManager extends FileDB { localStorage = new FileDBStorage(new StoreLocal(storagePrefix)); memory = new FileDBStorage(new StoreMemory()); - if(config.useIndexedDB) { + if(config.useIndexedDB || config.useNewExperimentalAssets) { indexedDB = new IndexedDBStorage(); } } @@ -54,6 +54,14 @@ public InputStream read(TeaFileHandle file) { } } + @Override + public byte[] readBytes(TeaFileHandle file) { + if(indexedDB != null) { + return indexedDB.readBytes(file); + } + return new byte[0]; + } + @Override protected void writeInternal(TeaFileHandle file, byte[] data, boolean append, int expectedLength) { if(indexedDB != null) { diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBStorage.java index 8e151905..ab6b59c1 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBStorage.java @@ -44,6 +44,11 @@ public InputStream read(TeaFileHandle file) { } } + @Override + public byte[] readBytes(TeaFileHandle file) { + return new byte[0]; + } + @Override public void writeInternal(TeaFileHandle file, byte[] data, boolean append, int expectedLength) { String value = HEXCoder.encode(data); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java index cc59379e..28fc1485 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java @@ -107,6 +107,18 @@ public InputStream read(TeaFileHandle file) { } } + @Override + public byte[] readBytes(TeaFileHandle file) { + String path = file.path(); + IndexedDBFileData data = get(path); + if(data != null) { + Int8ArrayWrapper array = data.getContents(); + byte[] byteArray = TypedArrays.toByteArray(array); + return byteArray; + } + return new byte[0]; + } + @Override protected void writeInternal(TeaFileHandle file, byte[] data, boolean append, int expectedLength) { String path = file.path(); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/FileData.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/FileData.java new file mode 100644 index 00000000..b776c780 --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/FileData.java @@ -0,0 +1,26 @@ +package com.github.xpenatan.gdx.backends.teavm.preloader; + +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; + +public class FileData { + private final String name; + private final Int8ArrayWrapper data; + + public FileData(String name, Int8ArrayWrapper data) { + this.name = name; + this.data = data; + } + + public String getName() { + return name; + } + + public Int8ArrayWrapper getData() { + return data; + } + + public byte[] getBytes() { + return TypedArrays.toByteArray(data); + } +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java index 76ef3739..d9f51954 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java @@ -1,6 +1,7 @@ package com.github.xpenatan.gdx.backends.teavm.preloader; import com.badlogic.gdx.Files.FileType; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.GdxRuntimeException; @@ -12,7 +13,6 @@ import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; import com.github.xpenatan.gdx.backends.teavm.dom.DataTransferWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.DocumentWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.DragEventWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.EventListenerWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.EventWrapper; @@ -21,7 +21,6 @@ import com.github.xpenatan.gdx.backends.teavm.dom.FileWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.HTMLCanvasElementWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.HTMLDocumentWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.HTMLImageElementWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; @@ -32,7 +31,9 @@ import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; -import org.teavm.jso.browser.Window; +import org.teavm.jso.core.JSArray; +import org.teavm.jso.core.JSArrayReader; +import org.teavm.jso.core.JSPromise; /** * @author xpenatan @@ -96,74 +97,66 @@ public void handleEvent(EventWrapper evt) { public void handleEvent(EventWrapper evt) { evt.preventDefault(); DragEventWrapper event = (DragEventWrapper)evt; - DataTransferWrapper dataTransfer = event.getDataTransfer(); - FileListWrapper files = dataTransfer.getFiles(); + downloadDroppedFile(config, files); + } + }); + } + } - int length = files.getLength(); - if(length > 0) { - Array droppedFiles = new Array<>(); - for(int i = 0; i < length; i++) { - FileWrapper itemWrapper = files.get(i); - String name = itemWrapper.getName(); - AssetType type = AssetFilter.getType(name); - FileReaderWrapper fileReader = FileReaderWrapper.create(); - fileReader.addEventListener("load", new EventListenerWrapper() { - @Override - public void handleEvent(EventWrapper evt) { - FileReaderWrapper target = (FileReaderWrapper)evt.getTarget(); - Object obj = null; - - if(type == AssetType.Binary || type == AssetType.Audio) { - ArrayBufferWrapper arrayBuffer = target.getResultAsArrayBuffer(); - Int8ArrayWrapper data = TypedArrays.createInt8Array(arrayBuffer); - obj = new Blob(arrayBuffer, data); - } - else if(type == AssetType.Image) { - DocumentWrapper document = (DocumentWrapper)Window.current().getDocument(); - final HTMLImageElementWrapper image = (HTMLImageElementWrapper)document.createElement("img"); - String baseUrl = target.getResultAsString(); - image.setSrc(baseUrl); - - ArrayBufferWrapper arrayBuffer = target.getResultAsArrayBuffer(); - Int8ArrayWrapper data = TypedArrays.createInt8Array(arrayBuffer); - Blob blob = new Blob(arrayBuffer, data); - blob.setImage(image); - obj = blob; - } - else if(type == AssetType.Text) { - obj = target.getResultAsString(); - } - - if(obj != null) { - putAssetInMap(type, name, obj); - droppedFiles.add(name); - if(droppedFiles.size == length) { - teaApplication.postRunnable(new Runnable() { - @Override - public void run() { - String[] array = droppedFiles.toArray(); - config.windowListener.filesDropped(array); - } - }); - } - } - } - }); - if(type == AssetType.Binary || type == AssetType.Audio) { - fileReader.readAsArrayBuffer(itemWrapper); - } - else if(type == AssetType.Image) { - fileReader.readAsDataURL(itemWrapper); - } - else if(type == AssetType.Text) { - fileReader.readAsText(itemWrapper); - } - } - } + private JSPromise getFile(String name, FileWrapper fileWrapper) { + JSPromise success = new JSPromise<>((resolve, reject) -> { + FileReaderWrapper fileReader = FileReaderWrapper.create(); + fileReader.readAsArrayBuffer(fileWrapper); + + AssetType type = AssetFilter.getType(name); + + fileReader.addEventListener("load", new EventListenerWrapper() { + @Override + public void handleEvent(EventWrapper evt) { + FileReaderWrapper target = (FileReaderWrapper)evt.getTarget(); + ArrayBufferWrapper arrayBuffer = target.getResultAsArrayBuffer(); + Int8ArrayWrapper data = TypedArrays.createInt8Array(arrayBuffer); + FileData fielData = new FileData(name, data); + resolve.accept(fielData); } }); + }); + + return success; + } + + private void downloadDroppedFile(TeaApplicationConfiguration config, FileListWrapper files) { + int totalDraggedFiles = files.getLength(); + if(totalDraggedFiles > 0) { + Array droppedFiles = new Array<>(); + var promises = new JSArray>(); + for(int i = 0; i < totalDraggedFiles; i++) { + FileWrapper fileWrapper = files.get(i); + String name = fileWrapper.getName(); + + if(config.windowListener.acceptFileDropped(name)) { + JSPromise promiss = getFile(name, fileWrapper); + promises.push(promiss); + } + } + + JSPromise> all = JSPromise.all(promises); + all.then(array -> { + int length = array.getLength(); + FileData [] arr = new FileData[length]; + for(int i = 0; i < length; i++) { + FileData fileData = array.get(i); + arr[i] = fileData; + } + config.windowListener.filesDropped(arr); + return "success"; + }, reason -> { + return "failure"; + }).onSettled(() -> { + return null; + }); } } @@ -171,7 +164,7 @@ public String getAssetUrl() { return baseUrl + ASSET_FOLDER; } - public void preload(boolean loadAssets, final String assetFileUrl) { + public void preload(TeaApplicationConfiguration config, final String assetFileUrl) { AssetDownloader.getInstance().loadText(true, getAssetUrl() + assetFileUrl, new AssetLoaderListener() { @Override public void onProgress(double amount) { @@ -185,6 +178,40 @@ public void onFailure(String url) { @Override public boolean onSuccess(String url, String result) { String[] lines = result.split("\n"); + + if(config.useNewExperimentalAssets) { + assetTotal = lines.length; + + for(String line : lines) { + String[] tokens = line.split(":"); + + String assetUrl = tokens[1].trim(); + + AssetDownloader.getInstance().load(true, getAssetUrl() + assetUrl, AssetType.Binary, null, new AssetLoaderListener() { + @Override + public void onProgress(double amount) { + } + + @Override + public void onFailure(String urll) { + } + + @Override + public boolean onSuccess(String urll, Object result) { + Blob blob = (Blob)result; + + Int8ArrayWrapper data = blob.getData(); + byte[] byteArray = TypedArrays.toByteArray(data); + FileHandle local = Gdx.files.local(assetUrl); + local.writeBytes(byteArray, false); + + return false; + } + }); + } + return false; + } + for(String line : lines) { String[] tokens = line.split(":"); if(tokens.length != 4) { @@ -211,7 +238,7 @@ public boolean onSuccess(String url, String result) { } assetTotal = assets.size; - if(loadAssets) { + if(config.preloadAssets) { for(int i = 0; i < assets.size; i++) { final Asset asset = assets.get(i); loadSingleAsset(asset); @@ -281,28 +308,7 @@ public Asset getAsset(String path) { return null; } - public void loadBinaryAsset(boolean async, final String url, AssetLoaderListener listener) { - AssetDownloader.getInstance().load(async, getAssetUrl() + url, AssetType.Binary, null, new AssetLoaderListener() { - @Override - public void onProgress(double amount) { - listener.onProgress(amount); - } - - @Override - public void onFailure(String urll) { - listener.onFailure(urll); - } - - @Override - public boolean onSuccess(String urll, Blob result) { - putAssetInMap(AssetType.Binary, url, result); - listener.onSuccess(urll, result); - return false; - } - }); - } - - public void loadAsset(boolean async, final String url, final AssetType type, final String mimeType, final AssetLoaderListener listener) { + private void loadAsset(boolean async, final String url, final AssetType type, final String mimeType, final AssetLoaderListener listener) { AssetDownloader.getInstance().load(async, getAssetUrl() + url, type, mimeType, new AssetLoaderListener() { @Override public void onProgress(double amount) { From 895c108560b679906579be5cfdd51d8890072a52 Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 11 Jun 2024 22:03:09 -0300 Subject: [PATCH 040/114] wip file system --- .../xpenatan/gdx/backends/teavm/TeaFiles.java | 2 +- .../gdx/backends/teavm/TeaWindowListener.java | 2 +- .../gdx/backends/teavm/filesystem/FileDB.java | 2 +- .../teavm/filesystem/FileDBManager.java | 4 +- .../teavm/filesystem/FileDBStorage.java | 2 +- .../backends/teavm/filesystem/FileData.java | 42 +++ .../teavm/filesystem/IndexedDBStorage.java | 331 ++---------------- .../teavm/filesystem/MemoryFileStorage.java | 322 +++++++++++++++++ .../backends/teavm/preloader/FileData.java | 26 -- .../backends/teavm/preloader/Preloader.java | 4 +- 10 files changed, 401 insertions(+), 336 deletions(-) create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileData.java create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java delete mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/FileData.java diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java index e7653955..f05373a8 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java @@ -58,7 +58,7 @@ public boolean isExternalStorageAvailable() { @Override public String getLocalStoragePath() { - return FileDB.getInstance().getLocalStoragePath(); + return FileDB.getInstance().getPath(); } @Override diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaWindowListener.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaWindowListener.java index 94cc4616..79bd1d67 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaWindowListener.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaWindowListener.java @@ -1,6 +1,6 @@ package com.github.xpenatan.gdx.backends.teavm; -import com.github.xpenatan.gdx.backends.teavm.preloader.FileData; +import com.github.xpenatan.gdx.backends.teavm.filesystem.FileData; public interface TeaWindowListener { /** diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java index 14c24225..0e26649e 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java @@ -131,5 +131,5 @@ public final FileHandle[] list(TeaFileHandle file, String suffix) { public abstract void rename(TeaFileHandle source, TeaFileHandle target); - public abstract String getLocalStoragePath(); + public abstract String getPath(); } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java index 6d768f8f..b1bea25f 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java @@ -182,9 +182,9 @@ public void rename(TeaFileHandle source, TeaFileHandle target) { } @Override - public String getLocalStoragePath() { + public String getPath() { if(indexedDB != null) { - return indexedDB.getLocalStoragePath(); + return indexedDB.getPath(); } return null; } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBStorage.java index ab6b59c1..6a5479eb 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBStorage.java @@ -143,7 +143,7 @@ public void rename(TeaFileHandle source, TeaFileHandle target) { } @Override - public String getLocalStoragePath() { + public String getPath() { return null; } } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileData.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileData.java new file mode 100644 index 00000000..ee01d42f --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileData.java @@ -0,0 +1,42 @@ +package com.github.xpenatan.gdx.backends.teavm.filesystem; + +public class FileData { + + public static final int TYPE_DIRECTORY = 1; + public static final int TYPE_FILE = 2; + + private final String name; + private byte[] bytes; + private int type; + + public FileData(String name, byte[] bytes) { + this(name, TYPE_FILE, bytes); + } + + public FileData(String name, int type, byte[] bytes) { + this.name = name; + this.bytes = bytes; + this.type = type; + } + + public FileData(String name) { + this.name = name; + this.type = TYPE_DIRECTORY; + } + + public String getName() { + return name; + } + + public byte[] getBytes() { + return bytes; + } + + public boolean isDirectory() { + return type == TYPE_DIRECTORY; + } + + public int getType() { + return type; + } +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java index 28fc1485..3723761c 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java @@ -1,18 +1,11 @@ package com.github.xpenatan.gdx.backends.teavm.filesystem; import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.files.FileHandle; -import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.ObjectMap; -import com.badlogic.gdx.utils.OrderedMap; import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; -import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; import com.github.xpenatan.gdx.backends.teavm.filesystem.indexeddb.IndexedDBFileData; -import java.io.ByteArrayInputStream; -import java.io.InputStream; import org.teavm.jso.JSBody; import org.teavm.jso.JSObject; import org.teavm.jso.core.JSDate; @@ -26,24 +19,14 @@ import org.teavm.jso.indexeddb.IDBRequest; import org.teavm.jso.indexeddb.IDBTransaction; -public class IndexedDBStorage extends FileDB { +public class IndexedDBStorage extends MemoryFileStorage { private final static String KEY_OBJECT_STORE = "FILE_DATA"; private final static String ROOT_PATH = "db/assets"; private IDBDatabase dataBase = null; - private static final int TYPE_FILE = 1; - private static final int TYPE_DIRECTORY = 2; - - private final OrderedMap fileMap; - - private Array tmpPaths = new Array<>(); - private String databaseName; - private boolean debug = false; - public IndexedDBStorage() { - fileMap = new OrderedMap<>(); setupIndexedDB(); } @@ -91,255 +74,36 @@ private String getDatabaseName(TeaApplicationConfiguration config) { } @Override - public InputStream read(TeaFileHandle file) { - String path = file.path(); - IndexedDBFileData data = get(path); - Int8ArrayWrapper array = data.getContents(); - byte[] byteArray = TypedArrays.toByteArray(array); - try { - return new ByteArrayInputStream(byteArray); - } - catch(RuntimeException e) { - // Something corrupted: we remove it & re-throw the error - remove(path); - removeFileAsync(path); - throw e; - } - } - - @Override - public byte[] readBytes(TeaFileHandle file) { - String path = file.path(); - IndexedDBFileData data = get(path); - if(data != null) { - Int8ArrayWrapper array = data.getContents(); - byte[] byteArray = TypedArrays.toByteArray(array); - return byteArray; - } - return new byte[0]; - } - - @Override - protected void writeInternal(TeaFileHandle file, byte[] data, boolean append, int expectedLength) { - String path = file.path(); - IndexedDBFileData fileData = IndexedDBFileData.create(TYPE_FILE, new JSDate()); - fileData.setContents(data); - put(path, fileData); - putFileAsync(path, fileData); - - FileHandle cur = file.parent(); - while(!isRootFolder(cur)) { - String parentPath = cur.path(); - putFolder(parentPath); - cur = cur.parent(); - } - } - - @Override - protected String[] paths(TeaFileHandle file) { - return getAllChildren(file); - } - - @Override - public boolean isDirectory(TeaFileHandle file) { - String path = file.path(); - - if(isRootFolder(file)) { - return true; - } - - IndexedDBFileData data = get(path); - if(data != null) { - int type = data.getType(); - return type == TYPE_DIRECTORY; - } - return false; - } - - @Override - public void mkdirs(TeaFileHandle file) { - String path = file.path(); - putFolder(path); - FileHandle cur = file.parent(); - while(!isRootFolder(cur)) { - String parentPath = cur.path(); - putFolder(parentPath); - cur = cur.parent(); - } - } - - @Override - public boolean exists(TeaFileHandle file) { - String path = file.path(); - if(isRootFolder(file)) { - return true; - } - return containsKey(path); - } - - @Override - public boolean delete(TeaFileHandle file) { - String path = file.path(); - if(isRootFolder(file)) { - return false; - } - - IndexedDBFileData data = get(path); - if(data != null) { - if(data.getType() != TYPE_FILE) { - return false; - } - if(remove(path) != null) { - removeFileAsync(path); - return true; - } - } - return false; - } - - @Override - public boolean deleteDirectory(TeaFileHandle file) { - String path = file.path(); - if(isRootFolder(file)) { - return false; - } - IndexedDBFileData data = get(path); - if(data != null) { - if(data.getType() != TYPE_DIRECTORY) { - return false; - } - - if(remove(path) != null) { - removeFileAsync(path); - FileHandle[] list = file.list(); - // Get all children paths and delete them all - String[] paths = getAllChildrenAndSiblings(file); - for(int i = 0; i < paths.length; i++) { - String childOrSiblingPath = paths[i]; - boolean rem = remove(childOrSiblingPath) != null; - if(rem) { - removeFileAsync(childOrSiblingPath); - } - } - return true; - } - } - return false; - } - - @Override - public long length(TeaFileHandle file) { - String path = file.path(); - IndexedDBFileData data = get(path); - if(data != null && data.getType() == TYPE_FILE) { - Int8ArrayWrapper contents = data.getContents(); - byte[] bytes = TypedArrays.toByteArray(contents); - return bytes.length; - } - return 0; + public String getPath() { + return databaseName; } @Override - public void rename(TeaFileHandle source, TeaFileHandle target) { - String sourcePath = source.path(); - String targetPath = target.path(); - IndexedDBFileData data = remove(sourcePath); - if(data != null) { - put(targetPath, data); - removeFileAsync(sourcePath); - putFileAsync(targetPath, data); - } + protected void renameFile(String sourcePath, String targetPath, FileData data) { + removeFile(sourcePath); + putFile(targetPath, data); } @Override - public String getLocalStoragePath() { - return databaseName; - } - - private boolean isRootFolder(FileHandle cur) { - String path = cur.path(); - if(path.isEmpty() || path.equals(".") || path.equals("/") || path.equals("./")) { - return true; - } - else { - return false; - } - } - - private String[] getAllChildrenAndSiblings(FileHandle file) { - return list(file, false); - } - - private String[] getAllChildren(FileHandle file) { - return list(file, true); - } - - private String[] list(FileHandle file, boolean equals) { - String dirPath = file.path(); - - boolean isRoot = isRootFolder(file); - - String dir = fixPath(dirPath); - ObjectMap.Entries it = fileMap.iterator(); - while(it.hasNext) { - ObjectMap.Entry next = it.next(); - String path = fixPath(next.key); - FileHandle parent = Gdx.files.local(path).parent(); - String parentPath = fixPath(parent.path()); - - boolean isChildParentRoot = isRootFolder(parent); - - // Only add path if parent is dir - if(isChildParentRoot && isRoot) { - tmpPaths.add(path); - } - else { - if(equals) { - if(parentPath.equals(dir)) { - tmpPaths.add(path); - } - } - else { - if(parentPath.startsWith(dir)) { - tmpPaths.add(path); - } - } - } - } - tmpPaths.sort(); - String[] str = new String[tmpPaths.size]; - for(int i = 0; i < tmpPaths.size; i++) { - String s = tmpPaths.get(i); - if(debug) { - System.out.println("Listh[" + i + "]: " + s); - } - str[i] = s; - } - tmpPaths.clear(); - return str; - } - - private void putFolder(String path) { - IndexedDBFileData fileData = IndexedDBFileData.create(TYPE_DIRECTORY, new JSDate()); - put(path, fileData); - putFileAsync(path, fileData); - } - - private void putFileAsync(String key1, IndexedDBFileData data) { - String key = fixPath(key1); + protected void putFile(String key, FileData data) { if(debug) { System.out.println("putFileAsync: " + key); } IDBTransaction transaction = dataBase.transaction(KEY_OBJECT_STORE, "readwrite"); IDBObjectStore objectStore = transaction.objectStore(KEY_OBJECT_STORE); - IDBRequest request = objectStore.put(data, getJSString(key)); + + IndexedDBFileData dbFileData = IndexedDBFileData.create(data.getType(), new JSDate()); + if(!data.isDirectory()) { + dbFileData.setContents(data.getBytes()); + } + IDBRequest request = objectStore.put(dbFileData, getJSString(key)); request.setOnError(() -> { Gdx.app.error("IndexedDB", "Error putting file: " + key); }); } - private void removeFileAsync(String key1) { - String key = fixPath(key1); + @Override + protected void removeFile(String key) { if(debug) { System.out.println("removeFileAsync: " + key); } @@ -358,9 +122,20 @@ private void readAllFilesAsync(TeaApplication teaApplication) { cursorRequest.setOnSuccess(() -> { IDBCursor cursor = cursorRequest.getResult(); if(cursor != null) { - String key = getJavaString(cursor.getKey()); + String key = fixPath(getJavaString(cursor.getKey())); JSObject value = cursor.getValue(); - IndexedDBFileData fileData = getFileData(value); + IndexedDBFileData dbFileData = getFileData(value); + int type = dbFileData.getType(); + FileData fileData = null; + + if(type == FileData.TYPE_DIRECTORY) { + fileData = new FileData(key); + } + else { + Int8ArrayWrapper contents = dbFileData.getContents(); + byte[] bytes = TypedArrays.toByteArray(contents); + fileData = new FileData(key, type, bytes); + } put(key, fileData); cursor.doContinue(); } @@ -371,56 +146,6 @@ private void readAllFilesAsync(TeaApplication teaApplication) { }); } - private IndexedDBFileData get(String path) { - path = fixPath(path); - IndexedDBFileData data = fileMap.get(path); - if(debug) { - System.out.println("file get: " + (data != null) + " Path: " + path); - } - return data; - } - - private void put(String path, IndexedDBFileData fileData) { - path = fixPath(path); - if(debug) { - System.out.println("file put: " + path); - } - fileMap.put(path, fileData); - } - - private IndexedDBFileData remove(String path) { - path = fixPath(path); - IndexedDBFileData data = fileMap.remove(path); - if(debug) { - System.out.println("file remove: " + (data != null) + " Path: " + path); - } - return data; - } - - private boolean containsKey(String path) { - path = fixPath(path); - boolean flag = fileMap.containsKey(path); - if(debug) { - System.out.println("file containsKey: " + flag + " Path: " + path); - } - return flag; - } - - private String fixPath(String path) { - if(path.startsWith("./")) { - path = path.replace("./", ""); - } - - if(path.startsWith(".")) { - path = path.replaceFirst(".", ""); - } - - if(!path.startsWith("/")) { - path = "/" + path; - } - return path; - } - @JSBody(params = { "data" }, script = "return data;") private static native JSObject getJSString(String data); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java new file mode 100644 index 00000000..69ee0040 --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java @@ -0,0 +1,322 @@ +package com.github.xpenatan.gdx.backends.teavm.filesystem; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.GdxRuntimeException; +import com.badlogic.gdx.utils.ObjectMap; +import com.badlogic.gdx.utils.OrderedMap; +import com.github.xpenatan.gdx.backends.teavm.TeaApplication; +import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; +import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +public class MemoryFileStorage extends FileDB { + private final OrderedMap fileMap; + + private final Array tmpPaths = new Array<>(); + + protected boolean debug = false; + + public MemoryFileStorage() { + fileMap = new OrderedMap<>(); + setupIndexedDB(); + } + + private void setupIndexedDB() { + TeaApplication teaApplication = (TeaApplication)Gdx.app; + TeaApplicationConfiguration config = teaApplication.getConfig(); + } + + @Override + public InputStream read(TeaFileHandle file) { + String path = fixPath(file.path()); + FileData data = get(path); + byte[] byteArray = data.getBytes(); + try { + return new ByteArrayInputStream(byteArray); + } + catch(RuntimeException e) { + // Something corrupted: we remove it & re-throw the error + remove(path); + removeFile(path); + throw e; + } + } + + @Override + public byte[] readBytes(TeaFileHandle file) { + String path = fixPath(file.path()); + FileData data = get(path); + if(data != null) { + byte[] byteArray = data.getBytes(); + return byteArray; + } + return new byte[0]; + } + + @Override + protected void writeInternal(TeaFileHandle file, byte[] data, boolean append, int expectedLength) { + String path = fixPath(file.path()); + + FileData fileData = new FileData(path, data); + put(path, fileData); + putFile(path, fileData); + + FileHandle cur = file.parent(); + while(!isRootFolder(cur)) { + String parentPath = fixPath(cur.path()); + putFolder(parentPath); + cur = cur.parent(); + } + } + + @Override + protected String[] paths(TeaFileHandle file) { + return getAllChildren(file); + } + + @Override + public boolean isDirectory(TeaFileHandle file) { + String path = fixPath(file.path()); + + if(isRootFolder(file)) { + return true; + } + + FileData data = get(path); + if(data != null) { + return data.isDirectory(); + } + return false; + } + + @Override + public void mkdirs(TeaFileHandle file) { + String path = fixPath(file.path()); + putFolder(path); + FileHandle cur = file.parent(); + while(!isRootFolder(cur)) { + String parentPath = fixPath(cur.path()); + putFolder(parentPath); + cur = cur.parent(); + } + } + + @Override + public boolean exists(TeaFileHandle file) { + String path = fixPath(file.path()); + if(isRootFolder(file)) { + return true; + } + return containsKey(path); + } + + @Override + public boolean delete(TeaFileHandle file) { + String path = fixPath(file.path()); + if(isRootFolder(file)) { + return false; + } + + FileData data = get(path); + if(data != null) { + if(data.isDirectory()) { + return false; + } + if(remove(path) != null) { + removeFile(path); + return true; + } + } + return false; + } + + @Override + public boolean deleteDirectory(TeaFileHandle file) { + String path = fixPath(file.path()); + if(isRootFolder(file)) { + return false; + } + FileData data = get(path); + if(data != null) { + if(!data.isDirectory()) { + return false; + } + + if(remove(path) != null) { + removeFile(path); + FileHandle[] list = file.list(); + // Get all children paths and delete them all + String[] paths = getAllChildrenAndSiblings(file); + for(int i = 0; i < paths.length; i++) { + String childOrSiblingPath = fixPath(paths[i]); + boolean rem = remove(childOrSiblingPath) != null; + if(rem) { + removeFile(childOrSiblingPath); + } + } + return true; + } + } + return false; + } + + @Override + public long length(TeaFileHandle file) { + String path = fixPath(file.path()); + FileData data = get(path); + if(data != null && !data.isDirectory()) { + byte[] bytes = data.getBytes(); + return bytes.length; + } + return 0; + } + + @Override + public void rename(TeaFileHandle source, TeaFileHandle target) { + String sourcePath = fixPath(source.path()); + String targetPath = fixPath(target.path()); + FileData data = remove(sourcePath); + if(data != null) { + put(targetPath, data); + renameFile(sourcePath, targetPath, data); + } + } + + @Override + public String getPath() { + return ""; + } + + private boolean isRootFolder(FileHandle cur) { + String path = fixPath(cur.path()); + if(path.isEmpty() || path.equals(".") || path.equals("/") || path.equals("./")) { + return true; + } + else { + return false; + } + } + + private String[] getAllChildrenAndSiblings(FileHandle file) { + return list(file, false); + } + + private String[] getAllChildren(FileHandle file) { + return list(file, true); + } + + private String[] list(FileHandle file, boolean equals) { + String dirPath = fixPath(file.path()); + + boolean isRoot = isRootFolder(file); + + String dir = fixPath(dirPath); + ObjectMap.Entries it = fileMap.iterator(); + while(it.hasNext) { + ObjectMap.Entry next = it.next(); + String path = fixPath(next.key); + FileHandle parent = Gdx.files.local(path).parent(); + String parentPath = fixPath(parent.path()); + + boolean isChildParentRoot = isRootFolder(parent); + + // Only add path if parent is dir + if(isChildParentRoot && isRoot) { + tmpPaths.add(path); + } + else { + if(equals) { + if(parentPath.equals(dir)) { + tmpPaths.add(path); + } + } + else { + if(parentPath.startsWith(dir)) { + tmpPaths.add(path); + } + } + } + } + tmpPaths.sort(); + String[] str = new String[tmpPaths.size]; + for(int i = 0; i < tmpPaths.size; i++) { + String s = tmpPaths.get(i); + if(debug) { + System.out.println("Listh[" + i + "]: " + s); + } + str[i] = s; + } + tmpPaths.clear(); + return str; + } + + private void putFolder(String path) { + FileData fileData = new FileData(path); + put(path, fileData); + putFile(path, fileData); + } + + protected void renameFile(String sourcePath, String targetPath, FileData data) { + removeFile(sourcePath); + putFile(targetPath, data); + } + + protected void putFile(String key, FileData data) { + } + + protected void removeFile(String key) { + } + + final protected FileData get(String path) { + FileData data = fileMap.get(path); + if(debug) { + System.out.println("file get: " + (data != null) + " Path: " + path); + } + return data; + } + + final protected void put(String path, FileData fileData) { + if(debug) { + System.out.println("file put: " + path); + } + if(path.isEmpty() || path.equals(".") || path.equals("/") || path.equals("./")) { + throw new GdxRuntimeException("Cannot put an empty folder name"); + } + fileMap.put(path, fileData); + } + + final protected FileData remove(String path) { + FileData data = fileMap.remove(path); + if(debug) { + System.out.println("file remove: " + (data != null) + " Path: " + path); + } + return data; + } + + final protected boolean containsKey(String path) { + boolean flag = fileMap.containsKey(path); + if(debug) { + System.out.println("file containsKey: " + flag + " Path: " + path); + } + return flag; + } + + final protected String fixPath(String path) { + path = path.trim(); + if(path.startsWith("./")) { + path = path.replace("./", ""); + } + + if(path.startsWith(".")) { + path = path.replaceFirst(".", ""); + } + + if(!path.startsWith("/")) { + path = "/" + path; + } + return path; + } +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/FileData.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/FileData.java deleted file mode 100644 index b776c780..00000000 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/FileData.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.github.xpenatan.gdx.backends.teavm.preloader; - -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; - -public class FileData { - private final String name; - private final Int8ArrayWrapper data; - - public FileData(String name, Int8ArrayWrapper data) { - this.name = name; - this.data = data; - } - - public String getName() { - return name; - } - - public Int8ArrayWrapper getData() { - return data; - } - - public byte[] getBytes() { - return TypedArrays.toByteArray(data); - } -} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java index d9f51954..cc244339 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java @@ -24,6 +24,7 @@ import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; +import com.github.xpenatan.gdx.backends.teavm.filesystem.FileData; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileFilter; @@ -118,7 +119,8 @@ public void handleEvent(EventWrapper evt) { FileReaderWrapper target = (FileReaderWrapper)evt.getTarget(); ArrayBufferWrapper arrayBuffer = target.getResultAsArrayBuffer(); Int8ArrayWrapper data = TypedArrays.createInt8Array(arrayBuffer); - FileData fielData = new FileData(name, data); + byte[] bytes = TypedArrays.toByteArray(data); + FileData fielData = new FileData(name, bytes); resolve.accept(fielData); } }); From bbf6562485268db6b30ae42e5ebfd58f959f86b9 Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 11 Jun 2024 22:31:35 -0300 Subject: [PATCH 041/114] remove emulated byte buffer --- .../emu/emu/java/nio/ByteBufferEmu.java | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 backends/backend-teavm/emu/emu/java/nio/ByteBufferEmu.java diff --git a/backends/backend-teavm/emu/emu/java/nio/ByteBufferEmu.java b/backends/backend-teavm/emu/emu/java/nio/ByteBufferEmu.java deleted file mode 100644 index 49ca2e66..00000000 --- a/backends/backend-teavm/emu/emu/java/nio/ByteBufferEmu.java +++ /dev/null @@ -1,17 +0,0 @@ -package emu.java.nio; - -import com.github.xpenatan.gdx.backends.teavm.gen.Emulate; -import java.nio.ByteBuffer; - -@Emulate(value = ByteBuffer.class, updateCode = true) -public abstract class ByteBufferEmu { - - public abstract byte[] array(); - - @Emulate - public float getFloat() { - byte[] bytes = array(); - float value = bytes[0] << 24 | (bytes[1] & 0xFF) << 16 | (bytes[2] & 0xFF) << 8 | (bytes[3] & 0xFF); - return value; - } -} \ No newline at end of file From 19e8ef47cd043f0b238f28f152df537d54ad5124 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 12 Jun 2024 08:48:41 -0300 Subject: [PATCH 042/114] Improvements --- CHANGES.md | 2 +- .../com/badlogic/gdx/graphics/PixmapEmu.java | 3 +- .../gdx/backends/teavm/TeaApplication.java | 6 +- .../teavm/TeaApplicationConfiguration.java | 9 +- .../gdx/backends/teavm/TeaFileHandle.java | 94 +++++++++++++++---- .../teavm/filesystem/FileDBManager.java | 57 ----------- .../teavm/filesystem/MemoryFileStorage.java | 19 ++-- .../filesystem/types/InternalDBStorage.java | 6 ++ .../LocalDBStorage.java} | 18 +++- .../backends/teavm/preloader/Preloader.java | 4 +- 10 files changed, 117 insertions(+), 101 deletions(-) create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/InternalDBStorage.java rename backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/{IndexedDBStorage.java => types/LocalDBStorage.java} (91%) diff --git a/CHANGES.md b/CHANGES.md index 414784d1..82f3fb71 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,7 +1,7 @@ [1.0.0-SNAPSHOT] - Update teavm to 0.10.0 - Pixmap now use Gdx2DPixmap -- Add Gdx.files.local support using IndexedDB +- Add useNewFileHandle as default with new Gdx.files.internal/classpath and Gdx.files.local support using IndexedDB [1.0.0-b9] - add TeaClassFilter printAllowedClasses() and printExcludedClasses() diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java index a498be5e..5cbe48f6 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java @@ -18,7 +18,6 @@ import com.github.xpenatan.gdx.backends.teavm.preloader.AssetType; import com.github.xpenatan.gdx.backends.teavm.preloader.Blob; import java.nio.ByteBuffer; -import org.teavm.jso.JSBody; @Emulate(Pixmap.class) public class PixmapEmu implements Disposable { @@ -99,7 +98,7 @@ public PixmapEmu(FileHandle file) { TeaApplicationConfiguration config = ((TeaApplication)Gdx.app).getConfig(); byte[] bytes = null; - if(config.useNewExperimentalAssets) { + if(config.useNewFileHandle) { if(!file.exists()) { // Add a way to debug when assets was not loaded in preloader. throw new GdxRuntimeException("File is null, it does not exist: " + path); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java index fce7e43d..64418964 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java @@ -19,7 +19,6 @@ import com.github.xpenatan.gdx.backends.teavm.dom.EventListenerWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.EventWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.impl.TeaWindow; -import com.github.xpenatan.gdx.backends.teavm.filesystem.FileDB; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloadImpl; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloader; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloader.AssetDownload; @@ -117,7 +116,6 @@ else if(agentInfo.isLinux()) preloader = new Preloader(hostPageBaseURL, graphics.canvas, this); AssetLoaderListener assetListener = new AssetLoaderListener(); - preloader.preload(config, "assets.txt"); input = new TeaInput(graphics.canvas); files = new TeaFiles(preloader); @@ -191,7 +189,9 @@ public void handleEvent(EventWrapper evt) { } // Init database - FileDB.getInstance(); + TeaFileHandle.initHandle(config); + preloader.preload(config, "assets.txt"); + window.requestAnimationFrame(this); } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java index 6e83363b..7abd21b6 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java @@ -21,15 +21,10 @@ public class TeaApplicationConfiguration { public boolean preloadAssets = true; /** - * Use IndexedDB for local storage instead of Storage/Memory. - */ - public boolean useIndexedDB = true; - - /** - * Experimental feature + * Experimental LocalHandle feature */ @Deprecated - public boolean useNewExperimentalAssets = false; + public boolean useNewFileHandle = true; /** * The prefix for the browser storage. If you have multiple apps on the same server and want to keep the diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java index 1bb798c4..c9583f50 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java @@ -6,6 +6,8 @@ import com.badlogic.gdx.utils.GdxRuntimeException; import com.badlogic.gdx.utils.StreamUtils; import com.github.xpenatan.gdx.backends.teavm.filesystem.FileDB; +import com.github.xpenatan.gdx.backends.teavm.filesystem.types.InternalDBStorage; +import com.github.xpenatan.gdx.backends.teavm.filesystem.types.LocalDBStorage; import com.github.xpenatan.gdx.backends.teavm.preloader.Preloader; import java.io.BufferedInputStream; import java.io.BufferedReader; @@ -26,11 +28,21 @@ * @author xpenatan */ public class TeaFileHandle extends FileHandle { + private static InternalDBStorage internalStorage; + private static LocalDBStorage localStorage; + public final Preloader preloader; private final String file; private final FileType type; - private final TeaApplicationConfiguration config; + private FileDB fileDB; + + public static void initHandle(TeaApplicationConfiguration config) { + if(config.useNewFileHandle) { + internalStorage = new InternalDBStorage(); + localStorage = new LocalDBStorage(); + } + } public TeaFileHandle(Preloader preloader, String fileName, FileType type) { if((type != FileType.Internal) && (type != FileType.Classpath) && (type != FileType.Local)) { @@ -39,7 +51,16 @@ public TeaFileHandle(Preloader preloader, String fileName, FileType type) { this.preloader = preloader; this.file = fixSlashes(fileName); this.type = type; - config = ((TeaApplication)Gdx.app).getConfig(); + TeaApplicationConfiguration config = ((TeaApplication)Gdx.app).getConfig(); + if(config.useNewFileHandle) { + if(type == FileType.Local) { + fileDB = internalStorage; + } + else { + // Internal and Classpath share the same storage + fileDB = internalStorage; + } + } } public TeaFileHandle(String path) { @@ -103,7 +124,10 @@ public File file() { * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. */ public InputStream read() { - if(config.useNewExperimentalAssets || type == FileType.Local) { + if(fileDB != null) { + return fileDB.read(this); + } + else if(type == FileType.Local) { return FileDB.getInstance().read(this); } else { @@ -178,7 +202,10 @@ public String readString() { * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. */ public String readString(String charset) { - if(config.useNewExperimentalAssets ||type == FileType.Local) { + if(fileDB != null) { + return super.readString(charset); + } + else if(type == FileType.Local) { // obtain via reader return super.readString(charset); } @@ -199,8 +226,8 @@ public String readString(String charset) { * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. */ public byte[] readBytes() { - if(config.useNewExperimentalAssets) { - return FileDB.getInstance().readBytes(this); + if(fileDB != null) { + return fileDB.readBytes(this); } int length = (int)length(); @@ -292,7 +319,10 @@ public OutputStream write(boolean append) { * {@link FileType#Internal} file, or if it could not be written. */ public OutputStream write(boolean append, int bufferSize) { - if(type == FileType.Local) { + if(fileDB != null) { + return fileDB.write(this, append, bufferSize); + } + else if(type == FileType.Local) { return FileDB.getInstance().write(this, append, bufferSize); } else { @@ -433,7 +463,10 @@ public void writeBytes(byte[] bytes, int offset, int length, boolean append) { * @throws GdxRuntimeException if this file is an {@link FileType#Classpath} file. */ public FileHandle[] list() { - if(config.useNewExperimentalAssets || type == FileType.Local) { + if(fileDB != null) { + return fileDB.list(this); + } + else if(type == FileType.Local) { return FileDB.getInstance().list(this); } else { @@ -449,7 +482,10 @@ public FileHandle[] list() { * @throws GdxRuntimeException if this file is an {@link FileType#Classpath} file. */ public FileHandle[] list(FileFilter filter) { - if(config.useNewExperimentalAssets || type == FileType.Local) { + if(fileDB != null) { + return fileDB.list(this, filter); + } + else if(type == FileType.Local) { return FileDB.getInstance().list(this, filter); } else { @@ -465,7 +501,10 @@ public FileHandle[] list(FileFilter filter) { * @throws GdxRuntimeException if this file is an {@link FileType#Classpath} file. */ public FileHandle[] list(FilenameFilter filter) { - if(config.useNewExperimentalAssets || type == FileType.Local) { + if(fileDB != null) { + return fileDB.list(this, filter); + } + else if(type == FileType.Local) { return FileDB.getInstance().list(this, filter); } else { @@ -481,7 +520,10 @@ public FileHandle[] list(FilenameFilter filter) { * @throws GdxRuntimeException if this file is an {@link FileType#Classpath} file. */ public FileHandle[] list(String suffix) { - if(config.useNewExperimentalAssets || type == FileType.Local) { + if(fileDB != null) { + return fileDB.list(this, suffix); + } + else if(type == FileType.Local) { return FileDB.getInstance().list(this, suffix); } else { @@ -495,7 +537,10 @@ public FileHandle[] list(String suffix) { * handle to a directory on the classpath will return false. */ public boolean isDirectory() { - if(config.useNewExperimentalAssets || type == FileType.Local) { + if(fileDB != null) { + return fileDB.isDirectory(this); + } + else if(type == FileType.Local) { return FileDB.getInstance().isDirectory(this); } else { @@ -529,7 +574,10 @@ public FileHandle sibling(String name) { * @throws GdxRuntimeException if this file handle is a {@link FileType#Classpath} or {@link FileType#Internal} file. */ public void mkdirs() { - if(type == FileType.Local) { + if(fileDB != null) { + fileDB.mkdirs(this); + } + else if(type == FileType.Local) { FileDB.getInstance().mkdirs(this); } else { @@ -542,7 +590,10 @@ public void mkdirs() { * directory will always return false. */ public boolean exists() { - if(config.useNewExperimentalAssets || type == FileType.Local) { + if(fileDB != null) { + return fileDB.exists(this); + } + else if(type == FileType.Local) { return FileDB.getInstance().exists(this); } else { @@ -556,7 +607,10 @@ public boolean exists() { * @throws GdxRuntimeException if this file handle is a {@link FileType#Classpath} or {@link FileType#Internal} file. */ public boolean delete() { - if(config.useNewExperimentalAssets || type == FileType.Local) { + if(fileDB != null) { + return fileDB.delete(this); + } + else if(type == FileType.Local) { return FileDB.getInstance().delete(this); } else { @@ -570,7 +624,10 @@ public boolean delete() { * @throws GdxRuntimeException if this file handle is a {@link FileType#Classpath} or {@link FileType#Internal} file. */ public boolean deleteDirectory() { - if(config.useNewExperimentalAssets || type == FileType.Local) { + if(fileDB != null) { + return fileDB.deleteDirectory(this); + } + else if(type == FileType.Local) { return FileDB.getInstance().deleteDirectory(this); } throw new GdxRuntimeException("Cannot delete directory (missing implementation): " + file); @@ -632,7 +689,10 @@ public void moveTo(FileHandle dest) { * determined. */ public long length() { - if(config.useNewExperimentalAssets || type == FileType.Local) { + if(fileDB != null) { + return fileDB.length(this); + } + else if(type == FileType.Local) { return FileDB.getInstance().length(this); } else { diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java index b1bea25f..2fa33e26 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java @@ -24,28 +24,15 @@ public final class FileDBManager extends FileDB { */ private final FileDBStorage memory; - /** - * IndexedDB is async, we store in memory while we save it. It will delete from memory when it's done. - */ - private FileDB indexedDB; - FileDBManager() { TeaApplicationConfiguration config = ((TeaApplication)Gdx.app).getConfig(); String storagePrefix = config.storagePrefix; localStorage = new FileDBStorage(new StoreLocal(storagePrefix)); memory = new FileDBStorage(new StoreMemory()); - - if(config.useIndexedDB || config.useNewExperimentalAssets) { - indexedDB = new IndexedDBStorage(); - } } @Override public InputStream read(TeaFileHandle file) { - if(indexedDB != null) { - return indexedDB.read(file); - } - if(memory.exists(file)) { return memory.read(file); } @@ -56,19 +43,11 @@ public InputStream read(TeaFileHandle file) { @Override public byte[] readBytes(TeaFileHandle file) { - if(indexedDB != null) { - return indexedDB.readBytes(file); - } return new byte[0]; } @Override protected void writeInternal(TeaFileHandle file, byte[] data, boolean append, int expectedLength) { - if(indexedDB != null) { - indexedDB.writeInternal(file, data, append, expectedLength); - return; - } - // write larger files into memory: up to 16.384kb into local storage (permanent) int localStorageMax = 16384; if((data.length >= localStorageMax) || (append && (expectedLength >= localStorageMax))) { @@ -84,10 +63,6 @@ protected void writeInternal(TeaFileHandle file, byte[] data, boolean append, in @Override protected String[] paths(TeaFileHandle file) { - if(indexedDB != null) { - return indexedDB.paths(file); - } - // combine & return the paths of memory & local storage String[] pathsMemory = memory.paths(file); String[] pathsLocalStorage = localStorage.paths(file); @@ -99,10 +74,6 @@ protected String[] paths(TeaFileHandle file) { @Override public boolean isDirectory(TeaFileHandle file) { - if(indexedDB != null) { - return indexedDB.isDirectory(file); - } - if(memory.exists(file)) { return memory.isDirectory(file); } @@ -113,29 +84,16 @@ public boolean isDirectory(TeaFileHandle file) { @Override public void mkdirs(TeaFileHandle file) { - if(indexedDB != null) { - indexedDB.mkdirs(file); - return; - } - localStorage.mkdirs(file); } @Override public boolean exists(TeaFileHandle file) { - if(indexedDB != null) { - return indexedDB.exists(file); - } - return memory.exists(file) || localStorage.exists(file); } @Override public boolean delete(TeaFileHandle file) { - if(indexedDB != null) { - return indexedDB.delete(file); - } - if(memory.exists(file)) { return memory.delete(file); } @@ -146,18 +104,11 @@ public boolean delete(TeaFileHandle file) { @Override public boolean deleteDirectory(TeaFileHandle file) { - if(indexedDB != null) { - return indexedDB.deleteDirectory(file); - } throw new GdxRuntimeException("Cannot delete directory (missing implementation): " + file); } @Override public long length(TeaFileHandle file) { - if(indexedDB != null) { - return indexedDB.length(file); - } - if(memory.exists(file)) { return memory.length(file); } @@ -168,11 +119,6 @@ public long length(TeaFileHandle file) { @Override public void rename(TeaFileHandle source, TeaFileHandle target) { - if(indexedDB != null) { - indexedDB.rename(source, target); - return; - } - if(memory.exists(source)) { memory.rename(source, target); } @@ -183,9 +129,6 @@ public void rename(TeaFileHandle source, TeaFileHandle target) { @Override public String getPath() { - if(indexedDB != null) { - return indexedDB.getPath(); - } return null; } } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java index 69ee0040..c675adb7 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java @@ -17,7 +17,7 @@ public class MemoryFileStorage extends FileDB { private final Array tmpPaths = new Array<>(); - protected boolean debug = false; + public boolean debug = false; public MemoryFileStorage() { fileMap = new OrderedMap<>(); @@ -218,7 +218,8 @@ private String[] list(FileHandle file, boolean equals) { while(it.hasNext) { ObjectMap.Entry next = it.next(); String path = fixPath(next.key); - FileHandle parent = Gdx.files.local(path).parent(); + + FileHandle parent = getFilePath(path).parent(); String parentPath = fixPath(parent.path()); boolean isChildParentRoot = isRootFolder(parent); @@ -245,7 +246,7 @@ private String[] list(FileHandle file, boolean equals) { for(int i = 0; i < tmpPaths.size; i++) { String s = tmpPaths.get(i); if(debug) { - System.out.println("Listh[" + i + "]: " + s); + System.out.println(getClass().getSimpleName() + " LIST[" + i + "]: " + s); } str[i] = s; } @@ -259,6 +260,10 @@ private void putFolder(String path) { putFile(path, fileData); } + protected FileHandle getFilePath(String path) { + return Gdx.files.internal(path); + } + protected void renameFile(String sourcePath, String targetPath, FileData data) { removeFile(sourcePath); putFile(targetPath, data); @@ -273,14 +278,14 @@ protected void removeFile(String key) { final protected FileData get(String path) { FileData data = fileMap.get(path); if(debug) { - System.out.println("file get: " + (data != null) + " Path: " + path); + System.out.println(getClass().getSimpleName() + " GET FILE: " + (data != null) + " Path: " + path); } return data; } final protected void put(String path, FileData fileData) { if(debug) { - System.out.println("file put: " + path); + System.out.println(getClass().getSimpleName() + " PUT FILE: " + path); } if(path.isEmpty() || path.equals(".") || path.equals("/") || path.equals("./")) { throw new GdxRuntimeException("Cannot put an empty folder name"); @@ -291,7 +296,7 @@ final protected void put(String path, FileData fileData) { final protected FileData remove(String path) { FileData data = fileMap.remove(path); if(debug) { - System.out.println("file remove: " + (data != null) + " Path: " + path); + System.out.println(getClass().getSimpleName() + " REMOVE FILE: " + (data != null) + " Path: " + path); } return data; } @@ -299,7 +304,7 @@ final protected FileData remove(String path) { final protected boolean containsKey(String path) { boolean flag = fileMap.containsKey(path); if(debug) { - System.out.println("file containsKey: " + flag + " Path: " + path); + System.out.println(getClass().getSimpleName() + " CONTAINS FILE: " + flag + " Path: " + path); } return flag; } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/InternalDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/InternalDBStorage.java new file mode 100644 index 00000000..771b469f --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/InternalDBStorage.java @@ -0,0 +1,6 @@ +package com.github.xpenatan.gdx.backends.teavm.filesystem.types; + +import com.github.xpenatan.gdx.backends.teavm.filesystem.MemoryFileStorage; + +public class InternalDBStorage extends MemoryFileStorage { +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java similarity index 91% rename from backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java rename to backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java index 3723761c..a1f54af5 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/IndexedDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java @@ -1,10 +1,13 @@ -package com.github.xpenatan.gdx.backends.teavm.filesystem; +package com.github.xpenatan.gdx.backends.teavm.filesystem.types; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; +import com.github.xpenatan.gdx.backends.teavm.filesystem.FileData; +import com.github.xpenatan.gdx.backends.teavm.filesystem.MemoryFileStorage; import com.github.xpenatan.gdx.backends.teavm.filesystem.indexeddb.IndexedDBFileData; import org.teavm.jso.JSBody; import org.teavm.jso.JSObject; @@ -19,14 +22,14 @@ import org.teavm.jso.indexeddb.IDBRequest; import org.teavm.jso.indexeddb.IDBTransaction; -public class IndexedDBStorage extends MemoryFileStorage { +public class LocalDBStorage extends MemoryFileStorage { private final static String KEY_OBJECT_STORE = "FILE_DATA"; private final static String ROOT_PATH = "db/assets"; private IDBDatabase dataBase = null; private String databaseName; - public IndexedDBStorage() { + public LocalDBStorage() { setupIndexedDB(); } @@ -78,6 +81,11 @@ public String getPath() { return databaseName; } + @Override + protected FileHandle getFilePath(String path) { + return Gdx.files.local(path); + } + @Override protected void renameFile(String sourcePath, String targetPath, FileData data) { removeFile(sourcePath); @@ -87,7 +95,7 @@ protected void renameFile(String sourcePath, String targetPath, FileData data) { @Override protected void putFile(String key, FileData data) { if(debug) { - System.out.println("putFileAsync: " + key); + System.out.println("PUT FILE DB: " + key); } IDBTransaction transaction = dataBase.transaction(KEY_OBJECT_STORE, "readwrite"); IDBObjectStore objectStore = transaction.objectStore(KEY_OBJECT_STORE); @@ -105,7 +113,7 @@ protected void putFile(String key, FileData data) { @Override protected void removeFile(String key) { if(debug) { - System.out.println("removeFileAsync: " + key); + System.out.println("REMOVE FILE DB: " + key); } IDBTransaction transaction = dataBase.transaction(KEY_OBJECT_STORE, "readwrite"); IDBObjectStore objectStore = transaction.objectStore(KEY_OBJECT_STORE); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java index cc244339..55570b6c 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java @@ -181,7 +181,7 @@ public void onFailure(String url) { public boolean onSuccess(String url, String result) { String[] lines = result.split("\n"); - if(config.useNewExperimentalAssets) { + if(config.useNewFileHandle) { assetTotal = lines.length; for(String line : lines) { @@ -204,7 +204,7 @@ public boolean onSuccess(String urll, Object result) { Int8ArrayWrapper data = blob.getData(); byte[] byteArray = TypedArrays.toByteArray(data); - FileHandle local = Gdx.files.local(assetUrl); + FileHandle local = Gdx.files.internal(assetUrl); local.writeBytes(byteArray, false); return false; From 413e973ec297fdf97e2941d7869c9385d59ef3a7 Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 13 Jun 2024 07:38:20 -0300 Subject: [PATCH 043/114] small code improvement --- .../gdx/backends/teavm/filesystem/FileData.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileData.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileData.java index ee01d42f..f01c7790 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileData.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileData.java @@ -6,8 +6,12 @@ public class FileData { public static final int TYPE_FILE = 2; private final String name; - private byte[] bytes; - private int type; + private final byte[] bytes; + private final int type; + + public FileData(String name) { + this(name, TYPE_DIRECTORY, null); + } public FileData(String name, byte[] bytes) { this(name, TYPE_FILE, bytes); @@ -19,10 +23,6 @@ public FileData(String name, int type, byte[] bytes) { this.type = type; } - public FileData(String name) { - this.name = name; - this.type = TYPE_DIRECTORY; - } public String getName() { return name; From 85335bc9ef6dccc4ac11a61aa788de94d07d6444 Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 13 Jun 2024 07:43:43 -0300 Subject: [PATCH 044/114] fix typo --- .../com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java index c9583f50..1855d6d6 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java @@ -54,7 +54,7 @@ public TeaFileHandle(Preloader preloader, String fileName, FileType type) { TeaApplicationConfiguration config = ((TeaApplication)Gdx.app).getConfig(); if(config.useNewFileHandle) { if(type == FileType.Local) { - fileDB = internalStorage; + fileDB = localStorage; } else { // Internal and Classpath share the same storage From daec1455da0d840778b2d31c3ed7ea2df592739b Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 13 Jun 2024 07:46:17 -0300 Subject: [PATCH 045/114] fix comment --- .../gdx/backends/teavm/TeaApplicationConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java index 7abd21b6..813bbc2d 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java @@ -21,7 +21,7 @@ public class TeaApplicationConfiguration { public boolean preloadAssets = true; /** - * Experimental LocalHandle feature + * Experimental new Gdx.files.internal and Gdx.files.local implementation */ @Deprecated public boolean useNewFileHandle = true; From 811899a9729896c2ab21e28af9e7b4e8edd59d4c Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 15 Jun 2024 10:03:53 -0300 Subject: [PATCH 046/114] Memory file improvements --- backends/backend-teavm/build.gradle.kts | 2 + .../resolvers/ResolutionFileResolverEmu.java | 2 +- .../gdx/backends/teavm/TeaApplication.java | 4 +- .../gdx/backends/teavm/TeaFileHandle.java | 34 +-- .../xpenatan/gdx/backends/teavm/TeaFiles.java | 33 ++- .../gdx/backends/teavm/filesystem/FileDB.java | 10 +- .../backends/teavm/filesystem/FileData.java | 21 +- .../teavm/filesystem/MemoryFileStorage.java | 203 ++++++++++++------ .../filesystem/types/LocalDBStorage.java | 27 ++- .../backends/teavm/preloader/Preloader.java | 8 +- .../filesystem/MemoryFileStorageTest.java | 122 +++++++++++ buildSrc/src/main/kotlin/Dependencies.kt | 2 + 12 files changed, 329 insertions(+), 139 deletions(-) create mode 100644 backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java diff --git a/backends/backend-teavm/build.gradle.kts b/backends/backend-teavm/build.gradle.kts index 1037e4d9..66202e27 100644 --- a/backends/backend-teavm/build.gradle.kts +++ b/backends/backend-teavm/build.gradle.kts @@ -25,6 +25,8 @@ dependencies { api("org.teavm:teavm-jso:${LibExt.teaVMVersion}") api("org.teavm:teavm-jso-apis:${LibExt.teaVMVersion}") api("org.teavm:teavm-jso-impl:${LibExt.teaVMVersion}") + + testImplementation("com.google.truth:truth:${LibExt.truthVersion}") } publishing { diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/assets/loaders/resolvers/ResolutionFileResolverEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/assets/loaders/resolvers/ResolutionFileResolverEmu.java index 2804bd79..02eadfd8 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/assets/loaders/resolvers/ResolutionFileResolverEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/assets/loaders/resolvers/ResolutionFileResolverEmu.java @@ -49,7 +49,7 @@ public ResolutionFileResolverEmu(FileHandleResolver baseResolver, ResolutionFile @Override public FileHandle resolve(String fileName) { ResolutionFileResolver.Resolution bestDesc = choose(descriptors); - FileHandle originalHandle = new TeaFileHandle(fileName); + FileHandle originalHandle = Gdx.files.internal(fileName); FileHandle handle = baseResolver.resolve(resolve(originalHandle, bestDesc.folder)); if(!handle.exists()) handle = baseResolver.resolve(fileName); return handle; diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java index 64418964..17655f54 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java @@ -118,7 +118,7 @@ else if(agentInfo.isLinux()) AssetLoaderListener assetListener = new AssetLoaderListener(); input = new TeaInput(graphics.canvas); - files = new TeaFiles(preloader); + files = new TeaFiles(config, preloader); net = new TeaNet(); logger = new TeaApplicationLogger(); clipboard = new TeaClipboard(); @@ -188,8 +188,6 @@ public void handleEvent(EventWrapper evt) { }); } - // Init database - TeaFileHandle.initHandle(config); preloader.preload(config, "assets.txt"); window.requestAnimationFrame(this); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java index 1855d6d6..c9d951f3 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java @@ -1,13 +1,10 @@ package com.github.xpenatan.gdx.backends.teavm; import com.badlogic.gdx.Files.FileType; -import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.GdxRuntimeException; import com.badlogic.gdx.utils.StreamUtils; import com.github.xpenatan.gdx.backends.teavm.filesystem.FileDB; -import com.github.xpenatan.gdx.backends.teavm.filesystem.types.InternalDBStorage; -import com.github.xpenatan.gdx.backends.teavm.filesystem.types.LocalDBStorage; import com.github.xpenatan.gdx.backends.teavm.preloader.Preloader; import java.io.BufferedInputStream; import java.io.BufferedReader; @@ -28,43 +25,20 @@ * @author xpenatan */ public class TeaFileHandle extends FileHandle { - private static InternalDBStorage internalStorage; - private static LocalDBStorage localStorage; - public final Preloader preloader; private final String file; private final FileType type; private FileDB fileDB; - public static void initHandle(TeaApplicationConfiguration config) { - if(config.useNewFileHandle) { - internalStorage = new InternalDBStorage(); - localStorage = new LocalDBStorage(); - } - } - - public TeaFileHandle(Preloader preloader, String fileName, FileType type) { + public TeaFileHandle(Preloader preloader, FileDB fileDB, String fileName, FileType type) { if((type != FileType.Internal) && (type != FileType.Classpath) && (type != FileType.Local)) { throw new GdxRuntimeException("FileType '" + type + "' Not supported in web backend"); } this.preloader = preloader; this.file = fixSlashes(fileName); this.type = type; - TeaApplicationConfiguration config = ((TeaApplication)Gdx.app).getConfig(); - if(config.useNewFileHandle) { - if(type == FileType.Local) { - fileDB = localStorage; - } - else { - // Internal and Classpath share the same storage - fileDB = internalStorage; - } - } - } - - public TeaFileHandle(String path) { - this(((TeaApplication)Gdx.app).getPreloader(), path, FileType.Internal); + this.fileDB = fileDB; } /** @return The full url to an asset, e.g. http://localhost:8080/assets/data/shotgun.ogg */ @@ -555,7 +529,7 @@ else if(type == FileType.Local) { * doesn't exist. */ public FileHandle child(String name) { - return new TeaFileHandle(preloader, (file.isEmpty() ? "" : (file + (file.endsWith("/") ? "" : "/"))) + name, + return new TeaFileHandle(preloader, fileDB, (file.isEmpty() ? "" : (file + (file.endsWith("/") ? "" : "/"))) + name, type); } @@ -563,7 +537,7 @@ public FileHandle parent() { int index = file.lastIndexOf("/"); String dir = ""; if(index > 0) dir = file.substring(0, index); - return new TeaFileHandle(preloader, dir, type); + return new TeaFileHandle(preloader, fileDB, dir, type); } public FileHandle sibling(String name) { diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java index f05373a8..82dc2a7b 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java @@ -3,6 +3,8 @@ import com.badlogic.gdx.Files; import com.badlogic.gdx.files.FileHandle; import com.github.xpenatan.gdx.backends.teavm.filesystem.FileDB; +import com.github.xpenatan.gdx.backends.teavm.filesystem.types.InternalDBStorage; +import com.github.xpenatan.gdx.backends.teavm.filesystem.types.LocalDBStorage; import com.github.xpenatan.gdx.backends.teavm.preloader.Preloader; /** @@ -12,38 +14,55 @@ public class TeaFiles implements Files { final Preloader preloader; - public TeaFiles(Preloader preloader) { + public InternalDBStorage internalStorage; + public LocalDBStorage localStorage; + + public TeaFiles(TeaApplicationConfiguration config, Preloader preloader) { this.preloader = preloader; + if(config.useNewFileHandle) { + this.internalStorage = new InternalDBStorage(); + this.localStorage = new LocalDBStorage(); + } } @Override public FileHandle getFileHandle(String path, FileType type) { - return new TeaFileHandle(preloader, path, type); + FileDB fileDB = null; + if(type == FileType.Internal) { + return internal(path); + } + else if(type == FileType.Classpath) { + return classpath(path); + } + else if(type == FileType.Local) { + return local(path); + } + return new TeaFileHandle(preloader, null, path, type); } @Override public FileHandle classpath(String path) { - return new TeaFileHandle(preloader, path, FileType.Classpath); + return new TeaFileHandle(preloader, internalStorage, path, FileType.Classpath); } @Override public FileHandle internal(String path) { - return new TeaFileHandle(preloader, path, FileType.Internal); + return new TeaFileHandle(preloader, internalStorage, path, FileType.Internal); } @Override public FileHandle external(String path) { - return new TeaFileHandle(preloader, path, FileType.External); + return new TeaFileHandle(preloader, null, path, FileType.External); } @Override public FileHandle absolute(String path) { - return new TeaFileHandle(preloader, path, FileType.Absolute); + return new TeaFileHandle(preloader, null, path, FileType.Absolute); } @Override public FileHandle local(String path) { - return new TeaFileHandle(preloader, path, FileType.Local); + return new TeaFileHandle(preloader, localStorage, path, FileType.Local); } @Override diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java index 0e26649e..1ddb3784 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java @@ -6,6 +6,7 @@ import com.badlogic.gdx.utils.GdxRuntimeException; import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; +import com.github.xpenatan.gdx.backends.teavm.preloader.Preloader; import java.io.ByteArrayOutputStream; import java.io.FileFilter; import java.io.FilenameFilter; @@ -80,13 +81,18 @@ public void close() throws IOException { public final FileHandle[] list(TeaFileHandle file) { // convert paths to file handles String[] paths = paths(file); - FileHandle[] files = new FileHandle[paths.length]; + FileHandle[] files = new TeaFileHandle[paths.length]; + + Preloader preloader = null; + if(Gdx.app != null) { + preloader = ((TeaApplication)Gdx.app).getPreloader(); + } for(int i = 0; i < paths.length; i++) { String path = paths[i]; if((path.length() > 0) && (path.charAt(path.length() - 1) == '/')) { path = path.substring(0, path.length() - 1); } - files[i] = new TeaFileHandle(((TeaApplication)Gdx.app).getPreloader(), path, Files.FileType.Local); + files[i] = new TeaFileHandle(preloader, this, path, file.type()); } return files; } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileData.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileData.java index f01c7790..0ba40b4b 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileData.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileData.java @@ -5,27 +5,26 @@ public class FileData { public static final int TYPE_DIRECTORY = 1; public static final int TYPE_FILE = 2; - private final String name; + private final String path; private final byte[] bytes; private final int type; - public FileData(String name) { - this(name, TYPE_DIRECTORY, null); + public FileData(String path) { + this(path, TYPE_DIRECTORY, null); } - public FileData(String name, byte[] bytes) { - this(name, TYPE_FILE, bytes); + public FileData(String path, byte[] bytes) { + this(path, TYPE_FILE, bytes); } public FileData(String name, int type, byte[] bytes) { - this.name = name; + this.path = name; this.bytes = bytes; this.type = type; } - - public String getName() { - return name; + public String getPath() { + return path; } public byte[] getBytes() { @@ -39,4 +38,8 @@ public boolean isDirectory() { public int getType() { return type; } + + public int getBytesSize() { + return bytes != null ? bytes.length : 0; + } } \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java index c675adb7..dd9552b2 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java @@ -6,8 +6,6 @@ import com.badlogic.gdx.utils.GdxRuntimeException; import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.OrderedMap; -import com.github.xpenatan.gdx.backends.teavm.TeaApplication; -import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; import java.io.ByteArrayInputStream; import java.io.InputStream; @@ -21,12 +19,6 @@ public class MemoryFileStorage extends FileDB { public MemoryFileStorage() { fileMap = new OrderedMap<>(); - setupIndexedDB(); - } - - private void setupIndexedDB() { - TeaApplication teaApplication = (TeaApplication)Gdx.app; - TeaApplicationConfiguration config = teaApplication.getConfig(); } @Override @@ -40,7 +32,6 @@ public InputStream read(TeaFileHandle file) { catch(RuntimeException e) { // Something corrupted: we remove it & re-throw the error remove(path); - removeFile(path); throw e; } } @@ -60,14 +51,36 @@ public byte[] readBytes(TeaFileHandle file) { protected void writeInternal(TeaFileHandle file, byte[] data, boolean append, int expectedLength) { String path = fixPath(file.path()); - FileData fileData = new FileData(path, data); - put(path, fileData); - putFile(path, fileData); + byte[] newBytes = null; + FileData oldData = fileMap.get(path); + if(append) { + if(oldData == null) { + newBytes = data; + } + else { + byte[] oldBytes = oldData.getBytes(); + int newSize = data.length + oldBytes.length; + newBytes = new byte[newSize]; + for(int i = 0; i < oldBytes.length; i++) { + newBytes[i] = oldBytes[i]; + } + for(int i = oldBytes.length, j = 0; i < newSize; i++, j++) { + newBytes[i] = data[j]; + } + } + } + else { + newBytes = data; + } + + putFileInternal(path, newBytes); FileHandle cur = file.parent(); while(!isRootFolder(cur)) { String parentPath = fixPath(cur.path()); - putFolder(parentPath); + if(!fileMap.containsKey(parentPath)) { + putFolderInternal(parentPath); + } cur = cur.parent(); } } @@ -95,11 +108,13 @@ public boolean isDirectory(TeaFileHandle file) { @Override public void mkdirs(TeaFileHandle file) { String path = fixPath(file.path()); - putFolder(path); + putFolderInternal(path); FileHandle cur = file.parent(); while(!isRootFolder(cur)) { String parentPath = fixPath(cur.path()); - putFolder(parentPath); + if(!fileMap.containsKey(parentPath)) { + putFolderInternal(parentPath); + } cur = cur.parent(); } } @@ -126,7 +141,6 @@ public boolean delete(TeaFileHandle file) { return false; } if(remove(path) != null) { - removeFile(path); return true; } } @@ -146,16 +160,11 @@ public boolean deleteDirectory(TeaFileHandle file) { } if(remove(path) != null) { - removeFile(path); - FileHandle[] list = file.list(); // Get all children paths and delete them all String[] paths = getAllChildrenAndSiblings(file); for(int i = 0; i < paths.length; i++) { String childOrSiblingPath = fixPath(paths[i]); boolean rem = remove(childOrSiblingPath) != null; - if(rem) { - removeFile(childOrSiblingPath); - } } return true; } @@ -180,8 +189,7 @@ public void rename(TeaFileHandle source, TeaFileHandle target) { String targetPath = fixPath(target.path()); FileData data = remove(sourcePath); if(data != null) { - put(targetPath, data); - renameFile(sourcePath, targetPath, data); + putFileInternal(targetPath, data.getBytes()); } } @@ -190,6 +198,33 @@ public String getPath() { return ""; } + public String debugAllFiles() { + String text = ""; + text += println("####### Start File: " + fileMap.size + "\n"); + ObjectMap.Entries it = fileMap.iterator(); + while(it.hasNext) { + ObjectMap.Entry next = it.next(); + FileData value = next.value; + String name = ""; + String key = next.key; + key = "\"" + key + "\""; + if(!value.getPath().equals(next.key)) { + name = " Name: " + value.getPath(); + } + text += println("Key: " + key + name + " Type: " + value.getType() + " Bytes: " + value.getBytesSize()+ "\n"); + } + text += println("####### End File"); + return text; + } + + public void printAllFiles() { + System.out.println(debugAllFiles()); + } + + private String println(String value) { + return value; + } + private boolean isRootFolder(FileHandle cur) { String path = fixPath(cur.path()); if(path.isEmpty() || path.equals(".") || path.equals("/") || path.equals("./")) { @@ -209,38 +244,57 @@ private String[] getAllChildren(FileHandle file) { } private String[] list(FileHandle file, boolean equals) { - String dirPath = fixPath(file.path()); - + String dir = fixPath(file.path()); boolean isRoot = isRootFolder(file); - - String dir = fixPath(dirPath); - ObjectMap.Entries it = fileMap.iterator(); - while(it.hasNext) { - ObjectMap.Entry next = it.next(); - String path = fixPath(next.key); - - FileHandle parent = getFilePath(path).parent(); - String parentPath = fixPath(parent.path()); - - boolean isChildParentRoot = isRootFolder(parent); - - // Only add path if parent is dir - if(isChildParentRoot && isRoot) { - tmpPaths.add(path); - } - else { - if(equals) { - if(parentPath.equals(dir)) { + if(debug) { + System.out.println("### START LIST ### " + isRoot + " DIR: " + dir); + } +// if(file.exists()) { + ObjectMap.Entries it = fileMap.iterator(); + while(it.hasNext) { + ObjectMap.Entry next = it.next(); + String path = fixPath(next.key); + + FileHandle parent = getFilePath(path).parent(); + String parentPath = fixPath(parent.path()); + + boolean isChildParentRoot = isRootFolder(parent); + + // Only add path if parent is dir + if(isRoot) { + if(isChildParentRoot) { + if(debug) { + System.out.println("LIST ROOD ADD: " + path); + } tmpPaths.add(path); } } else { - if(parentPath.startsWith(dir)) { - tmpPaths.add(path); + if(equals) { + if(parentPath.equals(dir)) { + if(debug) { + System.out.println("LIST EQUAL ADD: PARENT PATH: " + parentPath); + System.out.println("LIST EQUAL ADD: PATH: " + path); + } + tmpPaths.add(path); + } + } + else { + if(parentPath.startsWith(dir)) { + if(debug) { + System.out.println("LIST STARTWITH ADD: PARENT PATH: " + parentPath); + System.out.println("LIST STARTWITH ADD: PATH: " + path); + } + tmpPaths.add(path); + } } } } +// } + if(debug) { + System.out.println("### END LIST ###"); } + tmpPaths.sort(); String[] str = new String[tmpPaths.size]; for(int i = 0; i < tmpPaths.size; i++) { @@ -254,21 +308,10 @@ private String[] list(FileHandle file, boolean equals) { return str; } - private void putFolder(String path) { - FileData fileData = new FileData(path); - put(path, fileData); - putFile(path, fileData); - } - protected FileHandle getFilePath(String path) { return Gdx.files.internal(path); } - protected void renameFile(String sourcePath, String targetPath, FileData data) { - removeFile(sourcePath); - putFile(targetPath, data); - } - protected void putFile(String key, FileData data) { } @@ -276,35 +319,56 @@ protected void removeFile(String key) { } final protected FileData get(String path) { - FileData data = fileMap.get(path); + FileData fileData = fileMap.get(path); if(debug) { - System.out.println(getClass().getSimpleName() + " GET FILE: " + (data != null) + " Path: " + path); + String type = fileData != null && fileData.isDirectory() ? " GET FOLDER: " : " GET FILE: "; + System.out.println(getClass().getSimpleName() + type + (fileData != null) + " Path: " + path); } - return data; + return fileData; } - final protected void put(String path, FileData fileData) { + final public void putFileInternal(String path, byte[] bytes) { if(debug) { System.out.println(getClass().getSimpleName() + " PUT FILE: " + path); } if(path.isEmpty() || path.equals(".") || path.equals("/") || path.equals("./")) { throw new GdxRuntimeException("Cannot put an empty folder name"); } + FileData fileData = new FileData(path, bytes); fileMap.put(path, fileData); + putFile(path, fileData); } - final protected FileData remove(String path) { - FileData data = fileMap.remove(path); + final public void putFolderInternal(String path) { if(debug) { - System.out.println(getClass().getSimpleName() + " REMOVE FILE: " + (data != null) + " Path: " + path); + System.out.println(getClass().getSimpleName() + " PUT FOLDER: " + path); + } + if(path.isEmpty() || path.equals(".") || path.equals("/") || path.equals("./")) { + throw new GdxRuntimeException("Cannot put an empty folder name"); } - return data; + FileData fileData = new FileData(path); + fileMap.put(path, new FileData(path)); + putFile(path, fileData); } - final protected boolean containsKey(String path) { - boolean flag = fileMap.containsKey(path); + final public FileData remove(String path) { + FileData fileData = fileMap.remove(path); if(debug) { - System.out.println(getClass().getSimpleName() + " CONTAINS FILE: " + flag + " Path: " + path); + String type = fileData != null && fileData.isDirectory() ? " REMOVE FOLDER: " : " REMOVE FILE: "; + System.out.println(getClass().getSimpleName() + type + (fileData != null) + " Path: " + path); + } + if(fileData != null) { + removeFile(path); + } + return fileData; + } + + final public boolean containsKey(String path) { + FileData fileData = fileMap.get(path); + boolean flag = fileData != null; + if(debug) { + String type = fileData != null && fileData.isDirectory() ? " CONTAINS FOLDER: " : " CONTAINS FILE: "; + System.out.println(getClass().getSimpleName() + type + flag + " Path: " + path); } return flag; } @@ -322,6 +386,9 @@ final protected String fixPath(String path) { if(!path.startsWith("/")) { path = "/" + path; } + if(!path.endsWith("/")) { + path = path + "/"; + } return path; } } \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java index a1f54af5..e9f4baee 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java @@ -35,6 +35,9 @@ public LocalDBStorage() { private void setupIndexedDB() { TeaApplication teaApplication = (TeaApplication)Gdx.app; + if(teaApplication == null) { + return; + } TeaApplicationConfiguration config = teaApplication.getConfig(); teaApplication.delayInitCount++; @@ -87,22 +90,17 @@ protected FileHandle getFilePath(String path) { } @Override - protected void renameFile(String sourcePath, String targetPath, FileData data) { - removeFile(sourcePath); - putFile(targetPath, data); - } - - @Override - protected void putFile(String key, FileData data) { + protected void putFile(String key, FileData fileData) { if(debug) { - System.out.println("PUT FILE DB: " + key); + String type = fileData != null && fileData.isDirectory() ? "PUT FOLDER DB: " : "PUT FILE DB: "; + System.out.println(type + key); } IDBTransaction transaction = dataBase.transaction(KEY_OBJECT_STORE, "readwrite"); IDBObjectStore objectStore = transaction.objectStore(KEY_OBJECT_STORE); - IndexedDBFileData dbFileData = IndexedDBFileData.create(data.getType(), new JSDate()); - if(!data.isDirectory()) { - dbFileData.setContents(data.getBytes()); + IndexedDBFileData dbFileData = IndexedDBFileData.create(fileData.getType(), new JSDate()); + if(!fileData.isDirectory()) { + dbFileData.setContents(fileData.getBytes()); } IDBRequest request = objectStore.put(dbFileData, getJSString(key)); request.setOnError(() -> { @@ -134,17 +132,16 @@ private void readAllFilesAsync(TeaApplication teaApplication) { JSObject value = cursor.getValue(); IndexedDBFileData dbFileData = getFileData(value); int type = dbFileData.getType(); - FileData fileData = null; if(type == FileData.TYPE_DIRECTORY) { - fileData = new FileData(key); + putFolderInternal(key); } else { Int8ArrayWrapper contents = dbFileData.getContents(); byte[] bytes = TypedArrays.toByteArray(contents); - fileData = new FileData(key, type, bytes); + putFileInternal(key, bytes); } - put(key, fileData); + cursor.doContinue(); } teaApplication.delayInitCount--; diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java index 55570b6c..7b4c9957 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java @@ -465,22 +465,22 @@ private FileHandle[] getMatchedAssetFiles(FilePathFilter filter) { Array files = new Array<>(); for(String file : texts.keys()) { if(filter.accept(file)) { - files.add(new TeaFileHandle(this, file, FileType.Internal)); + files.add(new TeaFileHandle(this, null, file, FileType.Internal)); } } for(String file : images.keys()) { if(filter.accept(file)) { - files.add(new TeaFileHandle(this, file, FileType.Internal)); + files.add(new TeaFileHandle(this, null, file, FileType.Internal)); } } for(String file : binaries.keys()) { if(filter.accept(file)) { - files.add(new TeaFileHandle(this, file, FileType.Internal)); + files.add(new TeaFileHandle(this, null, file, FileType.Internal)); } } for(String file : audio.keys()) { if(filter.accept(file)) { - files.add(new TeaFileHandle(this, file, FileType.Internal)); + files.add(new TeaFileHandle(this, null, file, FileType.Internal)); } } FileHandle[] filesArray = new FileHandle[files.size]; diff --git a/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java b/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java new file mode 100644 index 00000000..f12b2c0d --- /dev/null +++ b/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java @@ -0,0 +1,122 @@ +package com.github.xpenatan.gdx.backends.teavm.filesystem; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; +import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; +import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; +import com.github.xpenatan.gdx.backends.teavm.TeaFiles; +import com.github.xpenatan.gdx.backends.teavm.filesystem.types.InternalDBStorage; +import com.google.common.truth.Truth; +import org.junit.Before; +import org.junit.Test; + +public class MemoryFileStorageTest { + + private InternalDBStorage internalStorage; + + @Before + public void setUp() { + TeaApplicationConfiguration config = new TeaApplicationConfiguration(""); + TeaFiles teaFiles = new TeaFiles(config, null) { + @Override + public FileHandle local(String path) { + return new TeaFileHandle(null, internalStorage, path, FileType.Local); + } + }; + Gdx.files = teaFiles; + internalStorage = teaFiles.internalStorage; + internalStorage.debug = false; + } + + @Test + public void test_add_remove_01() { + // Have 2 folders and another as a child of the second folder. + // Delete the first folder. + + FileHandle A = Gdx.files.local("New folder"); + FileHandle B = Gdx.files.local("New folder(2)"); + FileHandle BA = B.child("New folder(2)/New folder"); + + A.mkdirs(); + B.mkdirs(); + BA.mkdirs(); + + System.out.println("FILES BEFORE: "); + internalStorage.printAllFiles(); + + boolean b = A.deleteDirectory(); + + System.out.println("FILES AFTER: "); + internalStorage.printAllFiles(); + + Truth.assertThat(B.exists()).isTrue(); + Truth.assertThat(BA.exists()).isTrue(); + } + + @Test + public void test_add_remove_02() { + // Have 2 folders and another as a child of the second folder. + // Delete the first folder. + + FileHandle A = Gdx.files.local("A"); + FileHandle B = Gdx.files.local("B"); + FileHandle BA = B.child("A"); + + A.mkdirs(); + B.mkdirs(); + BA.mkdirs(); + + boolean b = A.deleteDirectory(); + + Truth.assertThat(B.exists()).isTrue(); + Truth.assertThat(BA.exists()).isTrue(); + } + + @Test + public void test_move_from_A_to_B() { + // Have 2 folders and another as a child of the second folder. + // Delete the first folder. + + FileHandle A = Gdx.files.local("A"); + FileHandle AA = A.child("AA"); + FileHandle AB = A.child("AB"); + FileHandle ABA = AB.child("ABA"); + FileHandle ABAX = ABA.child("file.txt"); + FileHandle AC = A.child("AC"); + FileHandle B = Gdx.files.local("B"); + + A.mkdirs(); + AA.mkdirs(); + AB.mkdirs(); + ABA.mkdirs(); + AC.mkdirs(); + B.mkdirs(); + + ABAX.writeString("Text", false); + ABAX.writeString("One", true); + + Truth.assertThat(A.exists()).isTrue(); + Truth.assertThat(B.exists()).isTrue(); + Truth.assertThat(AA.exists()).isTrue(); + Truth.assertThat(AB.exists()).isTrue(); + Truth.assertThat(ABA.exists()).isTrue(); + Truth.assertThat(ABAX.exists()).isTrue(); + Truth.assertThat(AC.exists()).isTrue(); + + System.out.println("FILES BEFORE: "); + internalStorage.printAllFiles(); + + A.moveTo(B); + + System.out.println("FILES AFTER: "); + internalStorage.printAllFiles(); + + Truth.assertThat(A.exists()).isFalse(); + Truth.assertThat(B.exists()).isTrue(); + Truth.assertThat(AA.exists()).isFalse(); + Truth.assertThat(AB.exists()).isFalse(); + Truth.assertThat(ABA.exists()).isFalse(); + Truth.assertThat(ABAX.exists()).isFalse(); + Truth.assertThat(AC.exists()).isFalse(); + } +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 8503961c..b1608125 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -16,6 +16,8 @@ object LibExt { const val jettyVersion = "11.0.13" const val aiVersion = "1.8.2" + + const val truthVersion = "1.4.2" } private fun getVersion(): String { From e7114bf66d1b0844a3a254c3b981f1d6668046aa Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 15 Jun 2024 10:15:43 -0300 Subject: [PATCH 047/114] Memory file improvements --- .../xpenatan/gdx/backends/teavm/filesystem/FileData.java | 8 ++++++-- .../gdx/backends/teavm/filesystem/MemoryFileStorage.java | 6 +++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileData.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileData.java index 0ba40b4b..78414def 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileData.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileData.java @@ -17,8 +17,12 @@ public FileData(String path, byte[] bytes) { this(path, TYPE_FILE, bytes); } - public FileData(String name, int type, byte[] bytes) { - this.path = name; + public FileData(String path, int type, byte[] bytes) { + if(bytes != null && path.endsWith("/")) { + int length = path.length(); + path = path.substring(0, length-1); + } + this.path = path; this.bytes = bytes; this.type = type; } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java index dd9552b2..746f3592 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java @@ -207,11 +207,11 @@ public String debugAllFiles() { FileData value = next.value; String name = ""; String key = next.key; - key = "\"" + key + "\""; + key = key + "\""; if(!value.getPath().equals(next.key)) { - name = " Name: " + value.getPath(); + name = " Path: \"" + value.getPath() + "\""; } - text += println("Key: " + key + name + " Type: " + value.getType() + " Bytes: " + value.getBytesSize()+ "\n"); + text += println("Key: \"" + key + name + " Type: " + value.getType() + " Bytes: " + value.getBytesSize()+ "\n"); } text += println("####### End File"); return text; From b1102ea86ba8a0f93adb42e845ca363ddcf4f0eb Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 15 Jun 2024 10:52:10 -0300 Subject: [PATCH 048/114] file fixes --- .../github/xpenatan/gdx/backends/teavm/TeaApplication.java | 2 +- .../com/github/xpenatan/gdx/backends/teavm/TeaFiles.java | 4 ++-- .../gdx/backends/teavm/filesystem/MemoryFileStorage.java | 7 +++---- .../backends/teavm/filesystem/types/LocalDBStorage.java | 7 +++---- .../backends/teavm/filesystem/MemoryFileStorageTest.java | 5 ++++- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java index 17655f54..8348fbdf 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java @@ -118,7 +118,7 @@ else if(agentInfo.isLinux()) AssetLoaderListener assetListener = new AssetLoaderListener(); input = new TeaInput(graphics.canvas); - files = new TeaFiles(config, preloader); + files = new TeaFiles(config, this, preloader); net = new TeaNet(); logger = new TeaApplicationLogger(); clipboard = new TeaClipboard(); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java index 82dc2a7b..a21813d2 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java @@ -17,11 +17,11 @@ public class TeaFiles implements Files { public InternalDBStorage internalStorage; public LocalDBStorage localStorage; - public TeaFiles(TeaApplicationConfiguration config, Preloader preloader) { + public TeaFiles(TeaApplicationConfiguration config, TeaApplication teaApplication, Preloader preloader) { this.preloader = preloader; if(config.useNewFileHandle) { this.internalStorage = new InternalDBStorage(); - this.localStorage = new LocalDBStorage(); + this.localStorage = new LocalDBStorage(teaApplication); } } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java index 746f3592..b68abf32 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java @@ -9,6 +9,7 @@ import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; import java.io.ByteArrayInputStream; import java.io.InputStream; +import java.util.Comparator; public class MemoryFileStorage extends FileDB { private final OrderedMap fileMap; @@ -249,7 +250,7 @@ private String[] list(FileHandle file, boolean equals) { if(debug) { System.out.println("### START LIST ### " + isRoot + " DIR: " + dir); } -// if(file.exists()) { + if(file.exists()) { ObjectMap.Entries it = fileMap.iterator(); while(it.hasNext) { ObjectMap.Entry next = it.next(); @@ -290,12 +291,10 @@ private String[] list(FileHandle file, boolean equals) { } } } -// } + } if(debug) { System.out.println("### END LIST ###"); } - - tmpPaths.sort(); String[] str = new String[tmpPaths.size]; for(int i = 0; i < tmpPaths.size; i++) { String s = tmpPaths.get(i); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java index e9f4baee..38891394 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java @@ -29,12 +29,11 @@ public class LocalDBStorage extends MemoryFileStorage { private String databaseName; - public LocalDBStorage() { - setupIndexedDB(); + public LocalDBStorage(TeaApplication teaApplication) { + setupIndexedDB(teaApplication); } - private void setupIndexedDB() { - TeaApplication teaApplication = (TeaApplication)Gdx.app; + private void setupIndexedDB(TeaApplication teaApplication) { if(teaApplication == null) { return; } diff --git a/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java b/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java index f12b2c0d..8038b169 100644 --- a/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java +++ b/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java @@ -17,7 +17,7 @@ public class MemoryFileStorageTest { @Before public void setUp() { TeaApplicationConfiguration config = new TeaApplicationConfiguration(""); - TeaFiles teaFiles = new TeaFiles(config, null) { + TeaFiles teaFiles = new TeaFiles(config, null, null) { @Override public FileHandle local(String path) { return new TeaFileHandle(null, internalStorage, path, FileType.Local); @@ -37,10 +37,13 @@ public void test_add_remove_01() { FileHandle B = Gdx.files.local("New folder(2)"); FileHandle BA = B.child("New folder(2)/New folder"); + A.mkdirs(); B.mkdirs(); BA.mkdirs(); + FileHandle[] list = Gdx.files.local(".").list(); + System.out.println("FILES BEFORE: "); internalStorage.printAllFiles(); From 5e124b9abfa3d36d147b69a1f9aa59aee206732e Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 15 Jun 2024 13:30:28 -0300 Subject: [PATCH 049/114] Dispose when browser closes --- CHANGES.md | 1 + .../gdx/backends/teavm/TeaApplication.java | 19 +++++++++++++++++-- .../xpenatan/gdx/backends/teavm/TeaInput.java | 11 ++++++++--- .../backends/teavm/dom/ElementWrapper.java | 18 ++++++++++++------ .../teavm/dom/HTMLElementWrapper.java | 6 +++--- .../teavm/filesystem/MemoryFileStorage.java | 1 - 6 files changed, 41 insertions(+), 15 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 82f3fb71..f6c49de6 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,7 @@ - Update teavm to 0.10.0 - Pixmap now use Gdx2DPixmap - Add useNewFileHandle as default with new Gdx.files.internal/classpath and Gdx.files.local support using IndexedDB +- Call dispose when browser closes [1.0.0-b9] - add TeaClassFilter printAllowedClasses() and printExcludedClasses() diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java index 8348fbdf..937f0dea 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java @@ -16,8 +16,10 @@ import com.badlogic.gdx.utils.ObjectMap; import com.github.xpenatan.gdx.backends.teavm.agent.TeaAgentInfo; import com.github.xpenatan.gdx.backends.teavm.agent.TeaWebAgent; +import com.github.xpenatan.gdx.backends.teavm.dom.DocumentWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.EventListenerWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.EventWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.HTMLElementWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.impl.TeaWindow; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloadImpl; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloader; @@ -117,7 +119,7 @@ else if(agentInfo.isLinux()) preloader = new Preloader(hostPageBaseURL, graphics.canvas, this); AssetLoaderListener assetListener = new AssetLoaderListener(); - input = new TeaInput(graphics.canvas); + input = new TeaInput(this, graphics.canvas); files = new TeaFiles(config, this, preloader); net = new TeaNet(); logger = new TeaApplicationLogger(); @@ -137,6 +139,17 @@ else if(agentInfo.isLinux()) audio = new DefaultTeaAudio(); Gdx.audio = audio; + window.addEventListener("beforeunload", new EventListenerWrapper() { + @Override + public void handleEvent(EventWrapper evt) { + if(appListener != null) { + appListener.pause(); + appListener.dispose(); + appListener = null; + } + } + }); + window.getDocument().addEventListener("visibilitychange", new EventListenerWrapper() { @Override public void handleEvent(EventWrapper evt) { @@ -241,7 +254,9 @@ public void run() { initState = AppState.APP_CREATE; graphics.frameId = 0; } - step(appListener); + if(appListener != null) { + step(appListener); + } break; } } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaInput.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaInput.java index 349e9d30..66d06c0f 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaInput.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaInput.java @@ -87,7 +87,10 @@ else if(agent.isMacOS()) { long currentEventTimeStamp; boolean hasFocus = true; - public TeaInput(HTMLCanvasElementWrapper canvas) { + private TeaApplication application; + + public TeaInput(TeaApplication application, HTMLCanvasElementWrapper canvas) { + this.application = application; this.canvas = canvas; hookEvents(); } @@ -111,8 +114,10 @@ private void hookEvents() { @Override public void handleEvent(EventWrapper e) { - handleMouseEvents(e); - handleKeyboardEvents(e); + if(application.getApplicationListener() != null) { + handleMouseEvents(e); + handleKeyboardEvents(e); + } } private void handleMouseEvents(EventWrapper e) { diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/ElementWrapper.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/ElementWrapper.java index 26ba47d3..784bba39 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/ElementWrapper.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/ElementWrapper.java @@ -1,19 +1,25 @@ package com.github.xpenatan.gdx.backends.teavm.dom; +import org.teavm.jso.JSMethod; + /** * @author xpenatan */ public interface ElementWrapper extends NodeWrapper { - public int getScrollTop(); + int getScrollTop(); + + int getScrollLeft(); + + int getClientWidth(); - public int getScrollLeft(); + int getClientHeight(); - public int getClientWidth(); + void setAttribute(String qualifiedName, String value); - public int getClientHeight(); + StyleWrapper getStyle(); - public void setAttribute(String qualifiedName, String value); - public StyleWrapper getStyle(); + @JSMethod + void remove(); } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/HTMLElementWrapper.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/HTMLElementWrapper.java index f19d41e6..c4b2b1b6 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/HTMLElementWrapper.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/HTMLElementWrapper.java @@ -5,9 +5,9 @@ */ public interface HTMLElementWrapper extends ElementWrapper { - public HTMLElementWrapper getOffsetParent(); + HTMLElementWrapper getOffsetParent(); - public int getOffsetTop(); + int getOffsetTop(); - public int getOffsetLeft(); + int getOffsetLeft(); } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java index b68abf32..ad28e01c 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java @@ -9,7 +9,6 @@ import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; import java.io.ByteArrayInputStream; import java.io.InputStream; -import java.util.Comparator; public class MemoryFileStorage extends FileDB { private final OrderedMap fileMap; From 0b830dbd7a625946bbb4aa8cbabdc03f66e11549 Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 15 Jun 2024 14:00:20 -0300 Subject: [PATCH 050/114] update gradle --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3fa8f862..a4413138 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 8b5c6970a1daf0d39800f7f289b135fec2911ce3 Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 15 Jun 2024 18:37:55 -0300 Subject: [PATCH 051/114] encode/decode preference --- .../gdx/backends/teavm/TeaPreferences.java | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaPreferences.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaPreferences.java index c268adeb..61d65fac 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaPreferences.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaPreferences.java @@ -3,6 +3,7 @@ import com.badlogic.gdx.Preferences; import com.badlogic.gdx.utils.GdxRuntimeException; import com.badlogic.gdx.utils.ObjectMap; +import com.github.xpenatan.gdx.backends.teavm.filesystem.HEXCoder; import java.util.HashMap; import java.util.Map; import org.teavm.jso.browser.Storage; @@ -28,14 +29,19 @@ public TeaPreferences(Storage storage, String prefix) { int prefixLength = this.prefix.length(); try { for(int i = 0; i < storage.getLength(); i++) { - String key = storage.key(i); - if(key.startsWith(this.prefix)) { - String value = storage.getItem(key); - values.put(key.substring(prefixLength, key.length() - 1), toObject(key, value)); + String keyEncoded = storage.key(i); + String key = new String(HEXCoder.decode(keyEncoded)); + boolean flag = key.startsWith(this.prefix); + if(flag) { + String value = storage.getItem(keyEncoded); + String keyStr = key.substring(prefixLength, key.length() - 1); + Object object = toObject(key, new String(HEXCoder.decode(value))); + values.put(keyStr, object); } } } catch(Exception e) { + e.printStackTrace(); values.clear(); } } @@ -61,15 +67,18 @@ public void flush() { try { // remove all old values for(int i = 0; i < storage.getLength(); i++) { - String key = storage.key(i); - if(key.startsWith(prefix)) storage.removeItem(key); + String keyEncoded = storage.key(i); + String key = new String(HEXCoder.decode(keyEncoded)); + if(key.startsWith(prefix)) { + storage.removeItem(key); + } } // push new values to LocalStorage for(String key : values.keys()) { String storageKey = toStorageKey(key, values.get(key)); String storageValue = "" + values.get(key).toString(); - storage.setItem(storageKey, storageValue); + storage.setItem(HEXCoder.encode(storageKey.getBytes()), HEXCoder.encode(storageValue.getBytes())); } } catch(Exception e) { From 3b417a5844381c59df2958f2c5aebf35516253dd Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 15 Jun 2024 18:38:14 -0300 Subject: [PATCH 052/114] improvements --- .../gdx/backends/teavm/TeaApplication.java | 2 +- .../gdx/backends/teavm/TeaFileHandle.java | 20 +- .../backends/teavm/preloader/Preloader.java | 37 +++- .../gdx/examples/tests/FilesTest.java | 203 +++++++++--------- .../teavm/launcher/TeaVMTestLauncher.java | 17 +- 5 files changed, 170 insertions(+), 109 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java index 937f0dea..fa960883 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java @@ -139,7 +139,7 @@ else if(agentInfo.isLinux()) audio = new DefaultTeaAudio(); Gdx.audio = audio; - window.addEventListener("beforeunload", new EventListenerWrapper() { + window.addEventListener("pagehide", new EventListenerWrapper() { @Override public void handleEvent(EventWrapper evt) { if(appListener != null) { diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java index c9d951f3..ebb015da 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java @@ -280,7 +280,8 @@ public int readBytes(byte[] bytes, int offset, int size) { * {@link FileType#Internal} file, or if it could not be written. */ public OutputStream write(boolean append) { - //TODO remove fixed size + if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot write to a classpath file: " + file); + if(type == FileType.Internal) throw new GdxRuntimeException("Cannot write to an internal file: " + file); return write(append, 4096); } @@ -348,6 +349,8 @@ public Writer writer(boolean append) { * {@link FileType#Internal} file, or if it could not be written. */ public Writer writer(boolean append, String charset) { + if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot write to a classpath file: " + file); + if(type == FileType.Internal) throw new GdxRuntimeException("Cannot write to an internal file: " + file); try { return new BufferedWriter(new OutputStreamWriter(write(append), "UTF-8")); } @@ -437,6 +440,7 @@ public void writeBytes(byte[] bytes, int offset, int length, boolean append) { * @throws GdxRuntimeException if this file is an {@link FileType#Classpath} file. */ public FileHandle[] list() { + if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot list a classpath directory: " + file); if(fileDB != null) { return fileDB.list(this); } @@ -456,6 +460,7 @@ else if(type == FileType.Local) { * @throws GdxRuntimeException if this file is an {@link FileType#Classpath} file. */ public FileHandle[] list(FileFilter filter) { + if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot list a classpath directory: " + file); if(fileDB != null) { return fileDB.list(this, filter); } @@ -475,6 +480,7 @@ else if(type == FileType.Local) { * @throws GdxRuntimeException if this file is an {@link FileType#Classpath} file. */ public FileHandle[] list(FilenameFilter filter) { + if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot list a classpath directory: " + file); if(fileDB != null) { return fileDB.list(this, filter); } @@ -494,6 +500,7 @@ else if(type == FileType.Local) { * @throws GdxRuntimeException if this file is an {@link FileType#Classpath} file. */ public FileHandle[] list(String suffix) { + if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot list a classpath directory: " + file); if(fileDB != null) { return fileDB.list(this, suffix); } @@ -511,6 +518,7 @@ else if(type == FileType.Local) { * handle to a directory on the classpath will return false. */ public boolean isDirectory() { + if (type == FileType.Classpath) return false; if(fileDB != null) { return fileDB.isDirectory(this); } @@ -548,6 +556,8 @@ public FileHandle sibling(String name) { * @throws GdxRuntimeException if this file handle is a {@link FileType#Classpath} or {@link FileType#Internal} file. */ public void mkdirs() { + if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot mkdirs with a classpath file: " + file); + if(type == FileType.Internal) throw new GdxRuntimeException("Cannot mkdirs with an internal file: " + file); if(fileDB != null) { fileDB.mkdirs(this); } @@ -559,6 +569,10 @@ else if(type == FileType.Local) { } } + public void mkdirsInternal() { + fileDB.mkdirs(this); + } + /** * Returns true if the file exists. On Android, a {@link FileType#Classpath} or {@link FileType#Internal} handle to a * directory will always return false. @@ -581,6 +595,8 @@ else if(type == FileType.Local) { * @throws GdxRuntimeException if this file handle is a {@link FileType#Classpath} or {@link FileType#Internal} file. */ public boolean delete() { + if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot delete a classpath file: " + file); + if(type == FileType.Internal) throw new GdxRuntimeException("Cannot delete an internal file: " + file); if(fileDB != null) { return fileDB.delete(this); } @@ -598,6 +614,8 @@ else if(type == FileType.Local) { * @throws GdxRuntimeException if this file handle is a {@link FileType#Classpath} or {@link FileType#Internal} file. */ public boolean deleteDirectory() { + if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot delete a classpath file: " + file); + if(type == FileType.Internal) throw new GdxRuntimeException("Cannot delete an internal file: " + file); if(fileDB != null) { return fileDB.deleteDirectory(this); } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java index 7b4c9957..103b342a 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java @@ -8,10 +8,12 @@ import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.ObjectMap.Entries; import com.badlogic.gdx.utils.ObjectMap.Entry; +import com.badlogic.gdx.utils.StreamUtils; import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; +import com.github.xpenatan.gdx.backends.teavm.TeaFiles; import com.github.xpenatan.gdx.backends.teavm.dom.DataTransferWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.DragEventWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.EventListenerWrapper; @@ -29,7 +31,9 @@ import java.io.File; import java.io.FileFilter; import java.io.FilenameFilter; +import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import org.teavm.jso.core.JSArray; @@ -186,8 +190,12 @@ public boolean onSuccess(String url, String result) { for(String line : lines) { String[] tokens = line.split(":"); - String assetUrl = tokens[1].trim(); + if(assetUrl.trim().isEmpty()) { + continue; + } + + TeaFiles files = (TeaFiles)Gdx.files; AssetDownloader.getInstance().load(true, getAssetUrl() + assetUrl, AssetType.Binary, null, new AssetLoaderListener() { @Override @@ -201,12 +209,27 @@ public void onFailure(String urll) { @Override public boolean onSuccess(String urll, Object result) { Blob blob = (Blob)result; - - Int8ArrayWrapper data = blob.getData(); - byte[] byteArray = TypedArrays.toByteArray(data); - FileHandle local = Gdx.files.internal(assetUrl); - local.writeBytes(byteArray, false); - + String fileType = tokens[0]; + boolean isDirectory = fileType.equals("d"); + if(isDirectory) { + TeaFileHandle internalFile = (TeaFileHandle)Gdx.files.internal(assetUrl); + internalFile.mkdirsInternal(); + } + else { + Int8ArrayWrapper data = blob.getData(); + byte[] byteArray = TypedArrays.toByteArray(data); + FileHandle internalFile = Gdx.files.internal(assetUrl); + OutputStream output = internalFile.write(false, 4096); + try { + output.write(byteArray); + } + catch(IOException ex) { + throw new GdxRuntimeException("Error writing file: " + internalFile + " (" + internalFile.type() + ")", ex); + } + finally { + StreamUtils.closeQuietly(output); + } + } return false; } }); diff --git a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java index 1598f5a6..e4d3f1c9 100644 --- a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java +++ b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java @@ -109,35 +109,35 @@ private void testLocalPath() { message += "\nLocal storage available\n"; message += "Local storage path: " + Gdx.files.getLocalStoragePath() + "\n\n"; - { - // Test multiple subfolder - FileHandle subFolder = Gdx.files.local("rootFolder/childFolder/subFolder/"); - FileHandle childFolder1 = Gdx.files.local("rootFolder/childFolder/"); - FileHandle childFolder2 = Gdx.files.local("rootFolder/childFolder"); - FileHandle rootFolder1 = Gdx.files.local("rootFolder/"); - FileHandle rootFolder2 = Gdx.files.local("rootFolder"); - - boolean exists = rootFolder1.exists(); - - message += "subFolder: " + subFolder + " exists: " + subFolder.exists() + "\n"; - message += "childFolder1: " + childFolder1 + " exists: " + childFolder1.exists() + "\n"; - message += "childFolder2: " + childFolder2 + " exists: " + childFolder2.exists() + "\n"; - message += "rootFolder1: " + rootFolder1 + " exists: " + exists + "\n"; - message += "rootFolder2: " + rootFolder2 + " exists: " + rootFolder2.exists() + "\n"; - - subFolder.mkdirs(); - - if(exists) { - FileHandle[] list = rootFolder1.list(); - for(int i = 0; i < list.length; i++) { - FileHandle fileHandle = list[i]; - System.out.println("FOLDER LIST: " + fileHandle); - } - boolean delete = rootFolder1.deleteDirectory(); - System.out.println("Deleted: " + delete + " " + rootFolder1); - } - - } +// { +// // Test multiple subfolder +// FileHandle subFolder = Gdx.files.local("rootFolder/childFolder/subFolder/"); +// FileHandle childFolder1 = Gdx.files.local("rootFolder/childFolder/"); +// FileHandle childFolder2 = Gdx.files.local("rootFolder/childFolder"); +// FileHandle rootFolder1 = Gdx.files.local("rootFolder/"); +// FileHandle rootFolder2 = Gdx.files.local("rootFolder"); +// +// boolean exists = rootFolder1.exists(); +// +// message += "subFolder: " + subFolder + " exists: " + subFolder.exists() + "\n"; +// message += "childFolder1: " + childFolder1 + " exists: " + childFolder1.exists() + "\n"; +// message += "childFolder2: " + childFolder2 + " exists: " + childFolder2.exists() + "\n"; +// message += "rootFolder1: " + rootFolder1 + " exists: " + exists + "\n"; +// message += "rootFolder2: " + rootFolder2 + " exists: " + rootFolder2.exists() + "\n"; +// +// subFolder.mkdirs(); +// +// if(exists) { +// FileHandle[] list = rootFolder1.list(); +// for(int i = 0; i < list.length; i++) { +// FileHandle fileHandle = list[i]; +// System.out.println("FOLDER LIST: " + fileHandle); +// } +// boolean delete = rootFolder1.deleteDirectory(); +// System.out.println("Deleted: " + delete + " " + rootFolder1); +// } +// +// } message += "\n"; { // Test file in subfolder @@ -167,76 +167,76 @@ private void testLocalPath() { } message += "\n"; - BufferedWriter out = null; - boolean canDelete = false; - try { - FileHandle testFile = Gdx.files.local("test.txt"); - boolean exists = testFile.exists(); - canDelete = exists; - message += "text.txt exists: " + exists + "\n"; - - testFile.writeString("test", false); - - } catch(GdxRuntimeException ex) { - message += "Couldn't open localstorage/test.txt\n"; - } finally { - StreamUtils.closeQuietly(out); - } - - try { - String s = Gdx.files.local("test.txt").readString(); - message += "Open local success\n"; - } catch(Throwable e) { - message += "Couldn't open localstorage/test.txt\n" + e.getMessage() + "\n"; - } - - BufferedReader in = null; - try { - FileHandle testFile = Gdx.files.local("test.txt"); - InputStream read = testFile.read(); - in = new BufferedReader(new InputStreamReader(read)); - if(!in.readLine().equals("test")) - message += "Read result wrong\n"; - else - message += "Read local success\n"; - } catch(GdxRuntimeException ex) { - message += "Couldn't open localstorage/test.txt\n"; - } catch(Throwable e) { - message += "Couldn't read localstorage/test.txt\n"; - } finally { - StreamUtils.closeQuietly(in); - } - - try { - byte[] testBytes = Gdx.files.local("test.txt").readBytes(); - if(Arrays.equals("test".getBytes(), testBytes)) - message += "Read into byte array success\n"; - else - fail(); - } catch(Throwable e) { - message += "Couldn't read localstorage/test.txt\n" + e.getMessage() + "\n"; - } - - if(canDelete) { - if(!Gdx.files.local("test.txt").delete()) { - message += "Couldn't delete localstorage/test.txt"; - } - } - message += "\n"; - { - FileHandle root1 = Gdx.files.local(""); - FileHandle root2 = Gdx.files.local("./"); - FileHandle root3 = Gdx.files.local("."); - - message += "root1: " + root1 + " exists: " + root1.exists() + " Root size: " + root1.list().length + "\n"; - message += "root2: " + root2 + " exists: " + root2.exists() + " Root size: " + root2.list().length + "\n"; - message += "root3: " + root3 + " exists: " + root3.exists() + " Root size: " + root3.list().length + "\n"; - message += "root2 length: " + root2.length() + "\n"; - FileHandle[] list = root1.list(); - for(int i = 0; i < list.length; i++) { - System.out.println("Files: " + list[i]); - } - } +// BufferedWriter out = null; +// boolean canDelete = false; +// try { +// FileHandle testFile = Gdx.files.local("test.txt"); +// boolean exists = testFile.exists(); +// canDelete = exists; +// message += "text.txt exists: " + exists + "\n"; +// +// testFile.writeString("test", false); +// +// } catch(GdxRuntimeException ex) { +// message += "Couldn't open localstorage/test.txt\n"; +// } finally { +// StreamUtils.closeQuietly(out); +// } +// +// try { +// String s = Gdx.files.local("test.txt").readString(); +// message += "Open local success\n"; +// } catch(Throwable e) { +// message += "Couldn't open localstorage/test.txt\n" + e.getMessage() + "\n"; +// } +// +// BufferedReader in = null; +// try { +// FileHandle testFile = Gdx.files.local("test.txt"); +// InputStream read = testFile.read(); +// in = new BufferedReader(new InputStreamReader(read)); +// if(!in.readLine().equals("test")) +// message += "Read result wrong\n"; +// else +// message += "Read local success\n"; +// } catch(GdxRuntimeException ex) { +// message += "Couldn't open localstorage/test.txt\n"; +// } catch(Throwable e) { +// message += "Couldn't read localstorage/test.txt\n"; +// } finally { +// StreamUtils.closeQuietly(in); +// } +// +// try { +// byte[] testBytes = Gdx.files.local("test.txt").readBytes(); +// if(Arrays.equals("test".getBytes(), testBytes)) +// message += "Read into byte array success\n"; +// else +// fail(); +// } catch(Throwable e) { +// message += "Couldn't read localstorage/test.txt\n" + e.getMessage() + "\n"; +// } +// +// if(canDelete) { +// if(!Gdx.files.local("test.txt").delete()) { +// message += "Couldn't delete localstorage/test.txt"; +// } +// } +// message += "\n"; +// { +// FileHandle root1 = Gdx.files.local(""); +// FileHandle root2 = Gdx.files.local("./"); +// FileHandle root3 = Gdx.files.local("."); +// +// message += "root1: " + root1 + " exists: " + root1.exists() + " Root size: " + root1.list().length + "\n"; +// message += "root2: " + root2 + " exists: " + root2.exists() + " Root size: " + root2.list().length + "\n"; +// message += "root3: " + root3 + " exists: " + root3.exists() + " Root size: " + root3.list().length + "\n"; +// message += "root2 length: " + root2.length() + "\n"; +// FileHandle[] list = root1.list(); +// for(int i = 0; i < list.length; i++) { +// System.out.println("Files: " + list[i]); +// } +// } } } @@ -295,6 +295,7 @@ private void testInternal() throws IOException { if(Gdx.app.getType() != ApplicationType.Android) { if(!dir.exists()) fail(); } +// printInternalFiles(); if(!dir.isDirectory()) fail(); if(dir.list().length == 0) fail(); Gdx.app.log("FilesTest", "Files in data: " + Arrays.toString(dir.list()) + " (" + dir.list().length + ")"); @@ -560,4 +561,8 @@ public void dispose() { batch.dispose(); font.dispose(); } + + public void printInternalFiles() { + + } } diff --git a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java index b1fffb9f..17c4809d 100644 --- a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java +++ b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java @@ -1,7 +1,9 @@ package com.github.xpenatan.gdx.examples.teavm.launcher; +import com.badlogic.gdx.Gdx; import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; +import com.github.xpenatan.gdx.backends.teavm.TeaFiles; import com.github.xpenatan.gdx.examples.tests.FilesTest; import com.github.xpenatan.gdx.examples.tests.PixelTest; import com.github.xpenatan.gdx.examples.tests.ReadPixelsTest; @@ -14,7 +16,20 @@ public static void main(String[] args) { config.height = 0; config.showDownloadLogs = true; // new TeaApplication(new GearsDemo(), config); - new TeaApplication(new FilesTest(), config); + new TeaApplication(new FilesTest() { + @Override + public void create() { + TeaFiles files = (TeaFiles)Gdx.files; + files.localStorage.debug = true; + super.create(); + } + + @Override + public void printInternalFiles() { + TeaFiles files = (TeaFiles)Gdx.files; + files.internalStorage.printAllFiles(); + } + }, config); // new TeaApplication(new PixelTest(), config); } } \ No newline at end of file From acd877b6358c5b935240a0e61117fe2d458e424a Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 15 Jun 2024 19:09:33 -0300 Subject: [PATCH 053/114] log byte size --- .../gdx/backends/teavm/filesystem/MemoryFileStorage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java index ad28e01c..43c1ffca 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java @@ -320,7 +320,7 @@ final protected FileData get(String path) { FileData fileData = fileMap.get(path); if(debug) { String type = fileData != null && fileData.isDirectory() ? " GET FOLDER: " : " GET FILE: "; - System.out.println(getClass().getSimpleName() + type + (fileData != null) + " Path: " + path); + System.out.println(getClass().getSimpleName() + type + (fileData != null) + " Size: " + fileData.getBytesSize() + " Path: " + path); } return fileData; } From effde03baf96bc512bf39aa7d1fcc929114fc09b Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 15 Jun 2024 20:40:57 -0300 Subject: [PATCH 054/114] Fix deleting all child folder/files --- .../teavm/filesystem/MemoryFileStorage.java | 100 +++++++++--------- .../filesystem/MemoryFileStorageTest.java | 9 +- 2 files changed, 56 insertions(+), 53 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java index 43c1ffca..26efdbaf 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java @@ -24,14 +24,14 @@ public MemoryFileStorage() { @Override public InputStream read(TeaFileHandle file) { String path = fixPath(file.path()); - FileData data = get(path); + FileData data = getInternal(path); byte[] byteArray = data.getBytes(); try { return new ByteArrayInputStream(byteArray); } catch(RuntimeException e) { // Something corrupted: we remove it & re-throw the error - remove(path); + removeInternal(path); throw e; } } @@ -39,7 +39,7 @@ public InputStream read(TeaFileHandle file) { @Override public byte[] readBytes(TeaFileHandle file) { String path = fixPath(file.path()); - FileData data = get(path); + FileData data = getInternal(path); if(data != null) { byte[] byteArray = data.getBytes(); return byteArray; @@ -98,7 +98,7 @@ public boolean isDirectory(TeaFileHandle file) { return true; } - FileData data = get(path); + FileData data = getInternal(path); if(data != null) { return data.isDirectory(); } @@ -125,7 +125,7 @@ public boolean exists(TeaFileHandle file) { if(isRootFolder(file)) { return true; } - return containsKey(path); + return containsKeyInternal(path); } @Override @@ -135,12 +135,12 @@ public boolean delete(TeaFileHandle file) { return false; } - FileData data = get(path); + FileData data = getInternal(path); if(data != null) { if(data.isDirectory()) { return false; } - if(remove(path) != null) { + if(removeInternal(path) != null) { return true; } } @@ -153,18 +153,18 @@ public boolean deleteDirectory(TeaFileHandle file) { if(isRootFolder(file)) { return false; } - FileData data = get(path); + FileData data = getInternal(path); if(data != null) { if(!data.isDirectory()) { return false; } - if(remove(path) != null) { + if(removeInternal(path) != null) { // Get all children paths and delete them all String[] paths = getAllChildrenAndSiblings(file); for(int i = 0; i < paths.length; i++) { String childOrSiblingPath = fixPath(paths[i]); - boolean rem = remove(childOrSiblingPath) != null; + boolean rem = removeInternal(childOrSiblingPath) != null; } return true; } @@ -175,7 +175,7 @@ public boolean deleteDirectory(TeaFileHandle file) { @Override public long length(TeaFileHandle file) { String path = fixPath(file.path()); - FileData data = get(path); + FileData data = getInternal(path); if(data != null && !data.isDirectory()) { byte[] bytes = data.getBytes(); return bytes.length; @@ -187,7 +187,7 @@ public long length(TeaFileHandle file) { public void rename(TeaFileHandle source, TeaFileHandle target) { String sourcePath = fixPath(source.path()); String targetPath = fixPath(target.path()); - FileData data = remove(sourcePath); + FileData data = removeInternal(sourcePath); if(data != null) { putFileInternal(targetPath, data.getBytes()); } @@ -200,7 +200,7 @@ public String getPath() { public String debugAllFiles() { String text = ""; - text += println("####### Start File: " + fileMap.size + "\n"); + text += println("####### START DEBUG FILE: " + fileMap.size + "\n"); ObjectMap.Entries it = fileMap.iterator(); while(it.hasNext) { ObjectMap.Entry next = it.next(); @@ -213,7 +213,7 @@ public String debugAllFiles() { } text += println("Key: \"" + key + name + " Type: " + value.getType() + " Bytes: " + value.getBytesSize()+ "\n"); } - text += println("####### End File"); + text += println("####### END DEBUG FILE"); return text; } @@ -247,52 +247,48 @@ private String[] list(FileHandle file, boolean equals) { String dir = fixPath(file.path()); boolean isRoot = isRootFolder(file); if(debug) { - System.out.println("### START LIST ### " + isRoot + " DIR: " + dir); + System.out.println("########## START LIST ### isRoot: " + isRoot + " DIR: " + dir); } - if(file.exists()) { - ObjectMap.Entries it = fileMap.iterator(); - while(it.hasNext) { - ObjectMap.Entry next = it.next(); - String path = fixPath(next.key); + ObjectMap.Entries it = fileMap.iterator(); + while(it.hasNext) { + ObjectMap.Entry next = it.next(); + String path = fixPath(next.key); - FileHandle parent = getFilePath(path).parent(); - String parentPath = fixPath(parent.path()); + FileHandle parent = getFilePath(path).parent(); + String parentPath = fixPath(parent.path()); - boolean isChildParentRoot = isRootFolder(parent); + boolean isChildParentRoot = isRootFolder(parent); - // Only add path if parent is dir - if(isRoot) { - if(isChildParentRoot) { + // Only add path if parent is dir + if(isRoot) { + if(isChildParentRoot) { + if(debug) { + System.out.println("LIST ROOD ADD: " + path); + } + tmpPaths.add(path); + } + } + else { + if(equals) { + if(parentPath.equals(dir)) { if(debug) { - System.out.println("LIST ROOD ADD: " + path); + System.out.println("LIST EQUAL ADD: PATH: " + path + " --- PARENT: " + parentPath); } tmpPaths.add(path); } } else { - if(equals) { - if(parentPath.equals(dir)) { - if(debug) { - System.out.println("LIST EQUAL ADD: PARENT PATH: " + parentPath); - System.out.println("LIST EQUAL ADD: PATH: " + path); - } - tmpPaths.add(path); - } - } - else { - if(parentPath.startsWith(dir)) { - if(debug) { - System.out.println("LIST STARTWITH ADD: PARENT PATH: " + parentPath); - System.out.println("LIST STARTWITH ADD: PATH: " + path); - } - tmpPaths.add(path); + if(parentPath.startsWith(dir)) { + if(debug) { + System.out.println("LIST STARTWITH ADD: PATH: " + path + " --- PARENT: " + parentPath); } + tmpPaths.add(path); } } } } if(debug) { - System.out.println("### END LIST ###"); + System.out.println("########## END LIST ###"); } String[] str = new String[tmpPaths.size]; for(int i = 0; i < tmpPaths.size; i++) { @@ -316,9 +312,10 @@ protected void putFile(String key, FileData data) { protected void removeFile(String key) { } - final protected FileData get(String path) { + final protected FileData getInternal(String path) { FileData fileData = fileMap.get(path); if(debug) { + path = "\"" + path + "\""; String type = fileData != null && fileData.isDirectory() ? " GET FOLDER: " : " GET FILE: "; System.out.println(getClass().getSimpleName() + type + (fileData != null) + " Size: " + fileData.getBytesSize() + " Path: " + path); } @@ -327,7 +324,8 @@ final protected FileData get(String path) { final public void putFileInternal(String path, byte[] bytes) { if(debug) { - System.out.println(getClass().getSimpleName() + " PUT FILE: " + path); + String pathStr = "\"" + path + "\""; + System.out.println(getClass().getSimpleName() + " PUT FILE: " + pathStr + " Bytes: " + bytes.length); } if(path.isEmpty() || path.equals(".") || path.equals("/") || path.equals("./")) { throw new GdxRuntimeException("Cannot put an empty folder name"); @@ -339,7 +337,8 @@ final public void putFileInternal(String path, byte[] bytes) { final public void putFolderInternal(String path) { if(debug) { - System.out.println(getClass().getSimpleName() + " PUT FOLDER: " + path); + String pathStr = "\"" + path + "\""; + System.out.println(getClass().getSimpleName() + " PUT FOLDER: " + pathStr); } if(path.isEmpty() || path.equals(".") || path.equals("/") || path.equals("./")) { throw new GdxRuntimeException("Cannot put an empty folder name"); @@ -349,11 +348,12 @@ final public void putFolderInternal(String path) { putFile(path, fileData); } - final public FileData remove(String path) { + final public FileData removeInternal(String path) { FileData fileData = fileMap.remove(path); if(debug) { + String pathStr = "\"" + path + "\""; String type = fileData != null && fileData.isDirectory() ? " REMOVE FOLDER: " : " REMOVE FILE: "; - System.out.println(getClass().getSimpleName() + type + (fileData != null) + " Path: " + path); + System.out.println(getClass().getSimpleName() + type + (fileData != null) + " Path: " + pathStr); } if(fileData != null) { removeFile(path); @@ -361,7 +361,7 @@ final public FileData remove(String path) { return fileData; } - final public boolean containsKey(String path) { + final public boolean containsKeyInternal(String path) { FileData fileData = fileMap.get(path); boolean flag = fileData != null; if(debug) { diff --git a/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java b/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java index 8038b169..3540ac0e 100644 --- a/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java +++ b/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java @@ -25,7 +25,7 @@ public FileHandle local(String path) { }; Gdx.files = teaFiles; internalStorage = teaFiles.internalStorage; - internalStorage.debug = false; +// internalStorage.debug = true; } @Test @@ -106,13 +106,16 @@ public void test_move_from_A_to_B() { Truth.assertThat(ABAX.exists()).isTrue(); Truth.assertThat(AC.exists()).isTrue(); - System.out.println("FILES BEFORE: "); + System.out.println("\n####################### FILES BEFORE: "); internalStorage.printAllFiles(); + System.out.println("####################### FILES BEFORE END"); + System.out.println("####################### MOVE TO: \n"); A.moveTo(B); - System.out.println("FILES AFTER: "); + System.out.println("\n####################### FILES AFTER: "); internalStorage.printAllFiles(); + System.out.println("####################### FILES AFTER END"); Truth.assertThat(A.exists()).isFalse(); Truth.assertThat(B.exists()).isTrue(); From ef91f7a0a1b7f9c5ae065f649676d8995193f79f Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 18 Jun 2024 22:35:17 -0300 Subject: [PATCH 055/114] Improve file renaming --- .../gdx/backends/teavm/TeaFileHandle.java | 20 ++- .../teavm/filesystem/MemoryFileStorage.java | 17 +- .../filesystem/MemoryFileStorageTest.java | 145 ++++++++++++++++++ 3 files changed, 172 insertions(+), 10 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java index ebb015da..fdb67e36 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java @@ -666,14 +666,20 @@ public void moveTo(FileHandle dest) { case Internal: { throw new GdxRuntimeException("Cannot move an internal file: " + file); } - case Local: - case Absolute: - case External: - default: - copyTo(dest); - delete(); - if(exists() && isDirectory()) deleteDirectory(); } + if(fileDB != null) { + FileHandle destParent = dest.parent(); + FileHandle thisParent = parent(); + if(thisParent.equals(destParent)) { + // Rename if same parent. Similar to absolute from desktop + fileDB.rename(this, (TeaFileHandle)dest); + return; + } + } + + copyTo(dest); + delete(); + if(exists() && isDirectory()) deleteDirectory(); } /** diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java index 26efdbaf..1851b719 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java @@ -187,9 +187,20 @@ public long length(TeaFileHandle file) { public void rename(TeaFileHandle source, TeaFileHandle target) { String sourcePath = fixPath(source.path()); String targetPath = fixPath(target.path()); - FileData data = removeInternal(sourcePath); - if(data != null) { - putFileInternal(targetPath, data.getBytes()); + + if(source.isDirectory()) { + target.mkdirs(); + FileHandle[] list = source.list(); + for(int i = 0; i < list.length; i++) { + FileHandle fileHandle = list[i]; + fileHandle.moveTo(target); + } + source.deleteDirectory(); + } + else { + byte[] bytes = source.readBytes(); + target.writeBytes(bytes, false); + source.delete(); } } diff --git a/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java b/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java index 3540ac0e..215e21f8 100644 --- a/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java +++ b/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java @@ -125,4 +125,149 @@ public void test_move_from_A_to_B() { Truth.assertThat(ABAX.exists()).isFalse(); Truth.assertThat(AC.exists()).isFalse(); } + + @Test + public void test_rename_A_to_B_from_root() { + + FileHandle A = Gdx.files.local("A"); + FileHandle AA = A.child("AA"); + FileHandle AB = A.child("AB"); + FileHandle AX = A.child("file.txt"); + FileHandle B = A.sibling("B"); + + A.mkdirs(); + AA.mkdirs(); + AB.mkdirs(); + AX.writeString("Hello", false); + + Truth.assertThat(A.exists()).isTrue(); + Truth.assertThat(AA.exists()).isTrue(); + Truth.assertThat(AB.exists()).isTrue(); + Truth.assertThat(AX.exists()).isTrue(); + Truth.assertThat(B.exists()).isFalse(); + + System.out.println("\n####################### FILES BEFORE: "); + internalStorage.printAllFiles(); + System.out.println("####################### FILES BEFORE END"); + + System.out.println("####################### MOVE TO: \n"); + A.moveTo(B); + + System.out.println("\n####################### FILES AFTER: "); + internalStorage.printAllFiles(); + System.out.println("####################### FILES AFTER END"); + + Truth.assertThat(B.exists()).isTrue(); + Truth.assertThat(A.exists()).isFalse(); + Truth.assertThat(AA.exists()).isFalse(); + Truth.assertThat(AB.exists()).isFalse(); + Truth.assertThat(AX.exists()).isFalse(); + } + + @Test + public void test_rename_A_to_B_from_child() { + + FileHandle Root = Gdx.files.local("root"); + FileHandle A = Root.child("A"); + FileHandle AA = A.child("AA"); + FileHandle AB = A.child("AB"); + FileHandle AX = A.child("file.txt"); + FileHandle B = A.sibling("B"); + + A.mkdirs(); + AA.mkdirs(); + AB.mkdirs(); + AX.writeString("Hello", false); + + Truth.assertThat(A.exists()).isTrue(); + Truth.assertThat(AA.exists()).isTrue(); + Truth.assertThat(AB.exists()).isTrue(); + Truth.assertThat(AX.exists()).isTrue(); + Truth.assertThat(B.exists()).isFalse(); + + System.out.println("\n####################### FILES BEFORE: "); + internalStorage.printAllFiles(); + System.out.println("####################### FILES BEFORE END"); + + System.out.println("####################### MOVE TO: \n"); + A.moveTo(B); + + System.out.println("\n####################### FILES AFTER: "); + internalStorage.printAllFiles(); + System.out.println("####################### FILES AFTER END"); + + Truth.assertThat(B.exists()).isTrue(); + Truth.assertThat(A.exists()).isFalse(); + Truth.assertThat(AA.exists()).isFalse(); + Truth.assertThat(AB.exists()).isFalse(); + Truth.assertThat(AX.exists()).isFalse(); + } + + @Test + public void test_rename_folder_child() { + + FileHandle Root = Gdx.files.local("root"); + FileHandle A = Root.child("A"); + FileHandle AA = A.child("AA"); + + FileHandle AB = AA.sibling("AB"); + + Root.mkdirs(); + A.mkdirs(); + AA.mkdirs(); + + Truth.assertThat(Root.exists()).isTrue(); + Truth.assertThat(A.exists()).isTrue(); + Truth.assertThat(AA.exists()).isTrue(); + + System.out.println("\n####################### FILES BEFORE: "); + internalStorage.printAllFiles(); + System.out.println("####################### FILES BEFORE END"); + + System.out.println("####################### MOVE TO: \n"); + AA.moveTo(AB); + + System.out.println("\n####################### FILES AFTER: "); + internalStorage.printAllFiles(); + System.out.println("####################### FILES AFTER END"); + + Truth.assertThat(Root.exists()).isTrue(); + Truth.assertThat(A.exists()).isTrue(); + Truth.assertThat(AA.exists()).isFalse(); + Truth.assertThat(AB.exists()).isTrue(); + } + + @Test + public void test_rename_file_child() { + + FileHandle Root = Gdx.files.local("root"); + FileHandle A = Root.child("A"); + FileHandle AA = A.child("AA.txt"); + + FileHandle AB = AA.sibling("AB.txt"); + + Root.mkdirs(); + A.mkdirs(); + AA.writeString("Hello", false); + + Truth.assertThat(Root.exists()).isTrue(); + Truth.assertThat(A.exists()).isTrue(); + Truth.assertThat(AA.exists()).isTrue(); + + System.out.println("\n####################### FILES BEFORE: "); + internalStorage.printAllFiles(); + System.out.println("####################### FILES BEFORE END"); + + System.out.println("####################### MOVE TO: \n"); + AA.moveTo(AB); + + System.out.println("\n####################### FILES AFTER: "); + internalStorage.printAllFiles(); + System.out.println("####################### FILES AFTER END"); + + Truth.assertThat(Root.exists()).isTrue(); + Truth.assertThat(A.exists()).isTrue(); + Truth.assertThat(AA.exists()).isFalse(); + Truth.assertThat(AB.exists()).isTrue(); + } } \ No newline at end of file From ee9efedc272f54565c1760ad24cb9a4e77cc4ba9 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 19 Jun 2024 07:52:01 -0300 Subject: [PATCH 056/114] Fix moving files/folders --- .../com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java | 2 +- .../github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java index fdb67e36..70ba055a 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java @@ -667,7 +667,7 @@ public void moveTo(FileHandle dest) { throw new GdxRuntimeException("Cannot move an internal file: " + file); } } - if(fileDB != null) { + if(fileDB != null && !dest.exists()) { FileHandle destParent = dest.parent(); FileHandle thisParent = parent(); if(thisParent.equals(destParent)) { diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java index 1ddb3784..fe34a9e8 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java @@ -85,7 +85,9 @@ public final FileHandle[] list(TeaFileHandle file) { Preloader preloader = null; if(Gdx.app != null) { - preloader = ((TeaApplication)Gdx.app).getPreloader(); + if(Gdx.app instanceof TeaApplication) { + preloader = ((TeaApplication)Gdx.app).getPreloader(); + } } for(int i = 0; i < paths.length; i++) { String path = paths[i]; From 8396621ef5434a2a2ed3a5a307d05f7f69aba6e2 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 19 Jun 2024 08:00:02 -0300 Subject: [PATCH 057/114] add more tests --- .../filesystem/MemoryFileStorageTest.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java b/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java index 215e21f8..171d821e 100644 --- a/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java +++ b/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java @@ -203,6 +203,68 @@ public void test_rename_A_to_B_from_child() { Truth.assertThat(AX.exists()).isFalse(); } + @Test + public void test_move_folder_A_to_B() { + + FileHandle Root = Gdx.files.local("root"); + FileHandle A = Root.child("A"); + FileHandle B = A.sibling("B"); + FileHandle BA = B.child("A"); + + A.mkdirs(); + B.mkdirs(); + + Truth.assertThat(A.exists()).isTrue(); + Truth.assertThat(B.exists()).isTrue(); + Truth.assertThat(BA.exists()).isFalse(); + + System.out.println("\n####################### FILES BEFORE: "); + internalStorage.printAllFiles(); + System.out.println("####################### FILES BEFORE END"); + + System.out.println("####################### MOVE TO: \n"); + A.moveTo(B); + + System.out.println("\n####################### FILES AFTER: "); + internalStorage.printAllFiles(); + System.out.println("####################### FILES AFTER END"); + + Truth.assertThat(B.exists()).isTrue(); + Truth.assertThat(A.exists()).isFalse(); + Truth.assertThat(BA.exists()).isTrue(); + } + + @Test + public void test_move_file_A_to_B() { + + FileHandle Root = Gdx.files.local("root"); + FileHandle A = Root.child("A.txt"); + FileHandle B = A.sibling("B"); + FileHandle BA = B.child("A.txt"); + + A.writeString("Hello", false); + B.mkdirs(); + + Truth.assertThat(A.exists()).isTrue(); + Truth.assertThat(B.exists()).isTrue(); + Truth.assertThat(BA.exists()).isFalse(); + + System.out.println("\n####################### FILES BEFORE: "); + internalStorage.printAllFiles(); + System.out.println("####################### FILES BEFORE END"); + + System.out.println("####################### MOVE TO: \n"); + A.moveTo(B); + + System.out.println("\n####################### FILES AFTER: "); + internalStorage.printAllFiles(); + System.out.println("####################### FILES AFTER END"); + + Truth.assertThat(B.exists()).isTrue(); + Truth.assertThat(A.exists()).isFalse(); + Truth.assertThat(BA.exists()).isTrue(); + } + @Test public void test_rename_folder_child() { From 7e2e954a36c5f65cff61637f39c64046e2d84eba Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 20 Jun 2024 23:01:28 -0300 Subject: [PATCH 058/114] Fix saving local data --- .../gdx/backends/teavm/TeaApplication.java | 1 + .../teavm/filesystem/MemoryFileStorage.java | 22 ++++++++++++++++--- .../filesystem/types/LocalDBStorage.java | 6 ++--- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java index fa960883..5d11a7a9 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java @@ -215,6 +215,7 @@ public void run() { if(delayInitCount == 0) { initState = AppState.LOAD_ASSETS; } + break; case LOAD_ASSETS: int queue = AssetDownloader.getInstance().getQueue(); if(queue == 0) { diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java index 1851b719..dc130d03 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java @@ -334,6 +334,10 @@ final protected FileData getInternal(String path) { } final public void putFileInternal(String path, byte[] bytes) { + putFileInternal(path, bytes, true); + } + + final public void putFileInternal(String path, byte[] bytes, boolean callMethod) { if(debug) { String pathStr = "\"" + path + "\""; System.out.println(getClass().getSimpleName() + " PUT FILE: " + pathStr + " Bytes: " + bytes.length); @@ -343,10 +347,16 @@ final public void putFileInternal(String path, byte[] bytes) { } FileData fileData = new FileData(path, bytes); fileMap.put(path, fileData); - putFile(path, fileData); + if(callMethod) { + putFile(path, fileData); + } } final public void putFolderInternal(String path) { + putFolderInternal(path, true); + } + + final public void putFolderInternal(String path, boolean callMethod) { if(debug) { String pathStr = "\"" + path + "\""; System.out.println(getClass().getSimpleName() + " PUT FOLDER: " + pathStr); @@ -356,17 +366,23 @@ final public void putFolderInternal(String path) { } FileData fileData = new FileData(path); fileMap.put(path, new FileData(path)); - putFile(path, fileData); + if(callMethod) { + putFile(path, fileData); + } } final public FileData removeInternal(String path) { + return removeInternal(path, true); + } + + final public FileData removeInternal(String path, boolean callMethod) { FileData fileData = fileMap.remove(path); if(debug) { String pathStr = "\"" + path + "\""; String type = fileData != null && fileData.isDirectory() ? " REMOVE FOLDER: " : " REMOVE FILE: "; System.out.println(getClass().getSimpleName() + type + (fileData != null) + " Path: " + pathStr); } - if(fileData != null) { + if(fileData != null && callMethod) { removeFile(path); } return fileData; diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java index 38891394..2f443934 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java @@ -133,17 +133,17 @@ private void readAllFilesAsync(TeaApplication teaApplication) { int type = dbFileData.getType(); if(type == FileData.TYPE_DIRECTORY) { - putFolderInternal(key); + putFolderInternal(key, false); } else { Int8ArrayWrapper contents = dbFileData.getContents(); byte[] bytes = TypedArrays.toByteArray(contents); - putFileInternal(key, bytes); + putFileInternal(key, bytes, false); } cursor.doContinue(); + teaApplication.delayInitCount--; } - teaApplication.delayInitCount--; }); cursorRequest.setOnError(() -> { teaApplication.delayInitCount--; From b52264de2a13e38c845cffb90a40ca690400dd2d Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 22 Jun 2024 17:39:02 -0300 Subject: [PATCH 059/114] Call resume/pause if state is loop --- .../gdx/backends/teavm/TeaApplication.java | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java index 5d11a7a9..a6f0baa6 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java @@ -154,24 +154,26 @@ public void handleEvent(EventWrapper evt) { @Override public void handleEvent(EventWrapper evt) { // notify of state change - String state = window.getDocument().getVisibilityState(); - if ("hidden".equals(state)) { - // hidden: i.e. we are paused - synchronized (lifecycleListeners) { - for (LifecycleListener listener : lifecycleListeners) { - listener.pause(); + if(initState == AppState.APP_LOOP) { + String state = window.getDocument().getVisibilityState(); + if (state.equals("hidden")) { + // hidden: i.e. we are paused + synchronized (lifecycleListeners) { + for (LifecycleListener listener : lifecycleListeners) { + listener.pause(); + } } + appListener.pause(); } - appListener.pause(); - } - else { - // visible: i.e. we resume - synchronized (lifecycleListeners) { - for (LifecycleListener listener : lifecycleListeners) { - listener.resume(); + else if(state.equals("visible")){ + // visible: i.e. we resume + synchronized (lifecycleListeners) { + for (LifecycleListener listener : lifecycleListeners) { + listener.resume(); + } } + appListener.resume(); } - appListener.resume(); } } }); @@ -212,6 +214,7 @@ public void run() { try { switch(state) { case INIT: + System.out.println("delayInitCount: " + delayInitCount); if(delayInitCount == 0) { initState = AppState.LOAD_ASSETS; } From 109ff3753764e62bc0f0e8a9285c13168d119eb2 Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 22 Jun 2024 17:39:15 -0300 Subject: [PATCH 060/114] Fix starting with empty file --- .../teavm/filesystem/types/LocalDBStorage.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java index 2f443934..978eccbb 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java @@ -56,7 +56,7 @@ private void setupIndexedDB(TeaApplication teaApplication) { }); request.setOnError(() -> { - Gdx.app.error("IndexedDB", "Error opening database: " + databaseName); + System.err.println("IndexedDB" + " Error opening database: " + databaseName); teaApplication.delayInitCount--; }); } @@ -103,7 +103,7 @@ protected void putFile(String key, FileData fileData) { } IDBRequest request = objectStore.put(dbFileData, getJSString(key)); request.setOnError(() -> { - Gdx.app.error("IndexedDB", "Error putting file: " + key); + System.err.println("IndexedDB" + " Error putting file: " + key); }); } @@ -116,7 +116,7 @@ protected void removeFile(String key) { IDBObjectStore objectStore = transaction.objectStore(KEY_OBJECT_STORE); IDBRequest request = objectStore.delete(getJSString(key)); request.setOnError(() -> { - Gdx.app.error("IndexedDB", "Error removing file: " + key); + System.err.println("IndexedDB" + " Error removing file: " + key); }); } @@ -142,10 +142,12 @@ private void readAllFilesAsync(TeaApplication teaApplication) { } cursor.doContinue(); - teaApplication.delayInitCount--; } + teaApplication.delayInitCount--; }); + cursorRequest.setOnError(() -> { + System.err.println("IndexedDB" + " Error cursor"); teaApplication.delayInitCount--; }); } From f794cb1c0e4aa12b4253695a3fd6a5a87c0e82d8 Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 22 Jun 2024 17:45:12 -0300 Subject: [PATCH 061/114] remove typo --- .../com/github/xpenatan/gdx/backends/teavm/TeaApplication.java | 1 - 1 file changed, 1 deletion(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java index a6f0baa6..b1db2ee1 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java @@ -214,7 +214,6 @@ public void run() { try { switch(state) { case INIT: - System.out.println("delayInitCount: " + delayInitCount); if(delayInitCount == 0) { initState = AppState.LOAD_ASSETS; } From 2d23254f6424db2aff3a7fd18eeb24488bfe7420 Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 22 Jun 2024 18:43:36 -0300 Subject: [PATCH 062/114] Reduce init count in onComplete --- .../gdx/backends/teavm/filesystem/types/LocalDBStorage.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java index 978eccbb..cbe42c54 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java @@ -143,6 +143,9 @@ private void readAllFilesAsync(TeaApplication teaApplication) { cursor.doContinue(); } + }); + + transaction.setOnComplete(() -> { teaApplication.delayInitCount--; }); From 0fafa3305abc2ea11736ccb79973399ced006b51 Mon Sep 17 00:00:00 2001 From: Natan Date: Mon, 24 Jun 2024 08:37:41 -0300 Subject: [PATCH 063/114] add copy/paste clipboard event --- .../gdx/backends/teavm/TeaClipboard.java | 112 ++++++++++++------ .../teavm/dom/ClipboardEventWrapper.java | 12 ++ .../teavm/dom/DataTransferWrapper.java | 7 ++ 3 files changed, 93 insertions(+), 38 deletions(-) create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/ClipboardEventWrapper.java diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaClipboard.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaClipboard.java index 85bf07a5..b58289fd 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaClipboard.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaClipboard.java @@ -1,6 +1,9 @@ package com.github.xpenatan.gdx.backends.teavm; import com.badlogic.gdx.utils.Clipboard; +import com.github.xpenatan.gdx.backends.teavm.dom.ClipboardEventWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.DataTransferWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.impl.TeaWindow; import org.teavm.jso.JSBody; /** @@ -8,57 +11,90 @@ */ public class TeaClipboard implements Clipboard { - private boolean requestedWritePermissions = false; - private boolean hasWritePermissions = true; + private boolean requestedWritePermissions = false; + private boolean hasWritePermissions = true; - private final ClipboardWriteHandler writeHandler = new ClipboardWriteHandler(); + private final ClipboardWriteHandler writeHandler = new ClipboardWriteHandler(); - private String content = ""; + private String content = ""; - @Override - public boolean hasContents () { - String contents = getContents(); - return contents != null && !contents.isEmpty(); - } + public TeaClipboard() { - @Override - public String getContents () { - return content; - } + TeaWindow.get().getDocument().addEventListener("copy", evt -> { + ClipboardEventWrapper event = (ClipboardEventWrapper)evt; + DataTransferWrapper clipboardData = event.getClipboardData(); + if(clipboardData != null) { +// System.out.println("COPY DATA: " + content); + clipboardData.setData("text/plain", content); + } + evt.preventDefault(); + }); - @Override - public void setContents (String content) { - this.content = content; - if (requestedWritePermissions || TeaApplication.getAgentInfo().isFirefox()) { - if (hasWritePermissions) setContentNATIVE(content); - } else { - TeaPermissions.queryPermission("clipboard-write", writeHandler); - requestedWritePermissions = true; - } - } + TeaWindow.get().getDocument().addEventListener("cut", evt -> { + ClipboardEventWrapper event = (ClipboardEventWrapper)evt; + DataTransferWrapper clipboardData = event.getClipboardData(); + if(clipboardData != null) { +// System.out.println("CUT DATA: " + content); + clipboardData.setData("text/plain", content); + } + evt.preventDefault(); + }); - @JSBody(params = {"content"}, script = - "if (\"clipboard\" in navigator) {\n" + - " navigator.clipboard.writeText(content);\n" + - "}") - private static native void setContentNATIVE(String content); + TeaWindow.get().getDocument().addEventListener("paste", evt -> { + ClipboardEventWrapper event = (ClipboardEventWrapper)evt; + DataTransferWrapper clipboardData = event.getClipboardData(); + if(clipboardData != null) { + content = clipboardData.getData("text/plain"); +// System.out.println("PASTE DATA: " + content); + } + evt.preventDefault(); + }); + } - private class ClipboardWriteHandler implements TeaPermissions.TeaPermissionResult { @Override - public void granted () { - hasWritePermissions = true; - setContentNATIVE(content); + public boolean hasContents() { + String contents = getContents(); + return contents != null && !contents.isEmpty(); } @Override - public void denied () { - hasWritePermissions = false; + public String getContents () { + return content; } @Override - public void prompt () { - hasWritePermissions = true; - setContentNATIVE(content); + public void setContents (String content) { + this.content = content; + if (requestedWritePermissions || TeaApplication.getAgentInfo().isFirefox()) { + if (hasWritePermissions) setContentNATIVE(content); + } else { + TeaPermissions.queryPermission("clipboard-write", writeHandler); + requestedWritePermissions = true; + } + } + + @JSBody(params = {"content"}, script = + "if (\"clipboard\" in navigator) {\n" + + " navigator.clipboard.writeText(content);\n" + + "}") + private static native void setContentNATIVE(String content); + + private class ClipboardWriteHandler implements TeaPermissions.TeaPermissionResult { + @Override + public void granted() { + hasWritePermissions = true; + setContentNATIVE(content); + } + + @Override + public void denied() { + hasWritePermissions = false; + } + + @Override + public void prompt() { + hasWritePermissions = true; + setContentNATIVE(content); + } } - } } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/ClipboardEventWrapper.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/ClipboardEventWrapper.java new file mode 100644 index 00000000..18ff6e44 --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/ClipboardEventWrapper.java @@ -0,0 +1,12 @@ +package com.github.xpenatan.gdx.backends.teavm.dom; + +import org.teavm.jso.JSProperty; + +/** + * @author xpenatan + */ +public interface ClipboardEventWrapper extends EventWrapper { + + @JSProperty + DataTransferWrapper getClipboardData(); +} diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/DataTransferWrapper.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/DataTransferWrapper.java index 99630b54..e752de47 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/DataTransferWrapper.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/DataTransferWrapper.java @@ -1,5 +1,6 @@ package com.github.xpenatan.gdx.backends.teavm.dom; +import org.teavm.jso.JSMethod; import org.teavm.jso.JSObject; import org.teavm.jso.JSProperty; @@ -10,4 +11,10 @@ public interface DataTransferWrapper extends JSObject { @JSProperty FileListWrapper getFiles(); + + @JSMethod + String getData(String format); + + @JSMethod + void setData(String format, String data); } \ No newline at end of file From d161793b91294cc2aa6a36a5b6ffaa2f17a921c3 Mon Sep 17 00:00:00 2001 From: Natan Date: Mon, 24 Jun 2024 08:38:20 -0300 Subject: [PATCH 064/114] fix indent --- .../gdx/backends/teavm/TeaClipboard.java | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaClipboard.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaClipboard.java index b58289fd..7b329a34 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaClipboard.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaClipboard.java @@ -19,26 +19,25 @@ public class TeaClipboard implements Clipboard { private String content = ""; public TeaClipboard() { + TeaWindow.get().getDocument().addEventListener("copy", evt -> { + ClipboardEventWrapper event = (ClipboardEventWrapper)evt; + DataTransferWrapper clipboardData = event.getClipboardData(); + if(clipboardData != null) { + // System.out.println("COPY DATA: " + content); + clipboardData.setData("text/plain", content); + } + evt.preventDefault(); + }); - TeaWindow.get().getDocument().addEventListener("copy", evt -> { - ClipboardEventWrapper event = (ClipboardEventWrapper)evt; - DataTransferWrapper clipboardData = event.getClipboardData(); - if(clipboardData != null) { -// System.out.println("COPY DATA: " + content); - clipboardData.setData("text/plain", content); - } - evt.preventDefault(); - }); - - TeaWindow.get().getDocument().addEventListener("cut", evt -> { - ClipboardEventWrapper event = (ClipboardEventWrapper)evt; - DataTransferWrapper clipboardData = event.getClipboardData(); - if(clipboardData != null) { -// System.out.println("CUT DATA: " + content); - clipboardData.setData("text/plain", content); - } - evt.preventDefault(); - }); + TeaWindow.get().getDocument().addEventListener("cut", evt -> { + ClipboardEventWrapper event = (ClipboardEventWrapper)evt; + DataTransferWrapper clipboardData = event.getClipboardData(); + if(clipboardData != null) { + // System.out.println("CUT DATA: " + content); + clipboardData.setData("text/plain", content); + } + evt.preventDefault(); + }); TeaWindow.get().getDocument().addEventListener("paste", evt -> { ClipboardEventWrapper event = (ClipboardEventWrapper)evt; From 39f75f2f081292904d1b336017edca57ba456647 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 26 Jun 2024 12:09:31 -0300 Subject: [PATCH 065/114] update readme --- CHANGES.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index f6c49de6..38033d44 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,8 +1,9 @@ [1.0.0-SNAPSHOT] - Update teavm to 0.10.0 - Pixmap now use Gdx2DPixmap -- Add useNewFileHandle as default with new Gdx.files.internal/classpath and Gdx.files.local support using IndexedDB +- Add useNewFileHandle set to true as default. Gdx.files.internal/classpath use new class to hold files and add IndexedDB support for Gdx.files.local - Call dispose when browser closes +- Improve clipboard text copy/paste. [1.0.0-b9] - add TeaClassFilter printAllowedClasses() and printExcludedClasses() From 3ff2c6ecc9e3bf828be32741be202d6399d6b418 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 26 Jun 2024 13:00:29 -0300 Subject: [PATCH 066/114] update workflow --- .github/workflows/build_and_upload.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_and_upload.yml b/.github/workflows/build_and_upload.yml index 030c4594..ee67bb76 100644 --- a/.github/workflows/build_and_upload.yml +++ b/.github/workflows/build_and_upload.yml @@ -24,10 +24,10 @@ jobs: access_token: ${{ github.token }} - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up JDK 11 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: 'zulu' java-version: 11 From 2fbd7099eef6dad989587e277be4deeb08aca5a6 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 26 Jun 2024 13:10:43 -0300 Subject: [PATCH 067/114] update workflow --- .github/workflows/build_and_upload.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_and_upload.yml b/.github/workflows/build_and_upload.yml index ee67bb76..e7203e4e 100644 --- a/.github/workflows/build_and_upload.yml +++ b/.github/workflows/build_and_upload.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@0.12.0 + uses: styfle/cancel-workflow-action@0.12.1 with: access_token: ${{ github.token }} From 9ed9350db03ceac44eeb9d012f0cb04a091c48b0 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 3 Jul 2024 12:42:07 -0300 Subject: [PATCH 068/114] update file drop listener --- .../github/xpenatan/gdx/backends/teavm/TeaWindowListener.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaWindowListener.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaWindowListener.java index 79bd1d67..3c1760ca 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaWindowListener.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaWindowListener.java @@ -6,10 +6,8 @@ public interface TeaWindowListener { /** * Called when external files are dropped into the html canvas, e.g from the Desktop. * - * @param files array with absolute paths to the files + * @param files array with absolute paths to the files. */ - default void filesDropped(String[] files) {} - default void filesDropped(FileData[] files) {} /** From 6a7a393b873c856c4f53c642e79dca14f537c2f3 Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 4 Jul 2024 15:12:42 -0300 Subject: [PATCH 069/114] kill old file system --- CHANGES.md | 2 +- .../com/badlogic/gdx/graphics/PixmapEmu.java | 22 +- .../gdx/backends/teavm/TeaApplication.java | 6 +- .../teavm/TeaApplicationConfiguration.java | 8 +- .../gdx/backends/teavm/TeaFileHandle.java | 262 ++----- .../xpenatan/gdx/backends/teavm/TeaFiles.java | 54 +- .../teavm/config/AssetFileHandle.java | 42 ++ .../gdx/backends/teavm/config/AssetsCopy.java | 89 ++- .../teavm/config/TeaBuildConfiguration.java | 6 +- .../gdx/backends/teavm/config/TeaBuilder.java | 110 +-- .../teavm/config/TeaVMResourceProperties.java | 2 + .../teavm/dom/typedarray/TypedArrays.java | 2 +- .../gdx/backends/teavm/filesystem/FileDB.java | 32 +- .../teavm/filesystem/FileDBManager.java | 134 ---- .../teavm/filesystem/FileDBStorage.java | 149 ---- .../teavm/filesystem/MemoryFileStorage.java | 9 +- .../gdx/backends/teavm/filesystem/Store.java | 22 - .../backends/teavm/filesystem/StoreLocal.java | 62 -- .../teavm/filesystem/StoreMemory.java | 60 -- ...alDBStorage.java => ClasspathStorage.java} | 2 +- .../filesystem/types/InternalStorage.java | 6 + .../filesystem/types/LocalDBStorage.java | 27 +- .../backends/teavm/preloader/FileWrapper.java | 708 ------------------ .../backends/teavm/preloader/Preloader.java | 396 ++-------- .../filesystem/MemoryFileStorageTest.java | 14 +- .../gdx/examples/tests/FilesTest.java | 198 ++--- .../examples/teavm/BuildTeaVMTestDemo.java | 4 +- .../teavm/launcher/LoadingTestLauncher.java | 6 +- 28 files changed, 432 insertions(+), 2002 deletions(-) create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetFileHandle.java delete mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java delete mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBStorage.java delete mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/Store.java delete mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/StoreLocal.java delete mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/StoreMemory.java rename backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/{InternalDBStorage.java => ClasspathStorage.java} (70%) create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/InternalStorage.java delete mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/FileWrapper.java diff --git a/CHANGES.md b/CHANGES.md index 38033d44..3a5335e6 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,7 +1,7 @@ [1.0.0-SNAPSHOT] - Update teavm to 0.10.0 - Pixmap now use Gdx2DPixmap -- Add useNewFileHandle set to true as default. Gdx.files.internal/classpath use new class to hold files and add IndexedDB support for Gdx.files.local +- New Gdx.files.internal, classpath and local implementation. Local files uses IndexedDB. - Call dispose when browser closes - Improve clipboard text copy/paste. diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java index 5cbe48f6..a076c726 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java @@ -89,7 +89,7 @@ public boolean onSuccess(String url, Blob result) { return false; } }; - AssetDownloader.getInstance().load(true, url, AssetType.Image, null, listener); + AssetDownloader.getInstance().load(true, url, AssetType.Binary, null, listener); } public PixmapEmu(FileHandle file) { @@ -97,23 +97,11 @@ public PixmapEmu(FileHandle file) { String path = webFileHandler.path(); TeaApplicationConfiguration config = ((TeaApplication)Gdx.app).getConfig(); - byte[] bytes = null; - if(config.useNewFileHandle) { - if(!file.exists()) { - // Add a way to debug when assets was not loaded in preloader. - throw new GdxRuntimeException("File is null, it does not exist: " + path); - } - bytes = file.readBytes(); - } - else { - Blob object = webFileHandler.preloader.images.get(path); - if(object == null) { - // Add a way to debug when assets was not loaded in preloader. - throw new GdxRuntimeException("File is null, it does not exist: " + path); - } - Int8ArrayWrapper response = object.getData(); - bytes = TypedArrays.toByteArray(response); + if(!file.exists()) { + // Add a way to debug when assets was not loaded in preloader. + throw new GdxRuntimeException("File is null, it does not exist: " + path); } + byte[] bytes = file.readBytes(); nativePixmap = new Gdx2DPixmapEmu(bytes, 0, bytes.length, 0); initPixmapEmu(); } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java index b1db2ee1..25985c29 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java @@ -120,7 +120,7 @@ else if(agentInfo.isLinux()) AssetLoaderListener assetListener = new AssetLoaderListener(); input = new TeaInput(this, graphics.canvas); - files = new TeaFiles(config, this, preloader); + files = new TeaFiles(config, this); net = new TeaNet(); logger = new TeaApplicationLogger(); clipboard = new TeaClipboard(); @@ -456,10 +456,6 @@ public void removeLifecycleListener(LifecycleListener listener) { } } - public String getAssetUrl() { - return preloader.getAssetUrl(); - } - /** @return {@code true} if application runs on a mobile device */ public static boolean isMobileDevice () { // RegEx pattern from detectmobilebrowsers.com (public domain) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java index 813bbc2d..d4cb5119 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java @@ -20,12 +20,6 @@ public class TeaApplicationConfiguration { */ public boolean preloadAssets = true; - /** - * Experimental new Gdx.files.internal and Gdx.files.local implementation - */ - @Deprecated - public boolean useNewFileHandle = true; - /** * The prefix for the browser storage. If you have multiple apps on the same server and want to keep the * data separate for those applications, you will need to set unique prefixes. This is useful if you are @@ -35,7 +29,7 @@ public class TeaApplicationConfiguration { * browser is not shared between the applications. If you leave the storage prefix at "", all the data * and files stored will be shared between the applications. */ - public String storagePrefix = ""; + public String storagePrefix = "db/assets"; /** * Show download logs. diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java index 70ba055a..cbe4b7f4 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFileHandle.java @@ -4,13 +4,12 @@ import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.GdxRuntimeException; import com.badlogic.gdx.utils.StreamUtils; -import com.github.xpenatan.gdx.backends.teavm.filesystem.FileDB; -import com.github.xpenatan.gdx.backends.teavm.preloader.Preloader; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileFilter; +import java.io.FileInputStream; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; @@ -25,37 +24,33 @@ * @author xpenatan */ public class TeaFileHandle extends FileHandle { - public final Preloader preloader; private final String file; private final FileType type; - private FileDB fileDB; + private TeaFiles teaFiles; - public TeaFileHandle(Preloader preloader, FileDB fileDB, String fileName, FileType type) { + public TeaFileHandle(TeaFiles teaFiles, String fileName, FileType type) { if((type != FileType.Internal) && (type != FileType.Classpath) && (type != FileType.Local)) { throw new GdxRuntimeException("FileType '" + type + "' Not supported in web backend"); } - this.preloader = preloader; this.file = fixSlashes(fileName); this.type = type; - this.fileDB = fileDB; - } - - /** @return The full url to an asset, e.g. http://localhost:8080/assets/data/shotgun.ogg */ - public String getAssetUrl () { - return preloader.getAssetUrl() + preloader.assetNames.get(file, file); + this.teaFiles = teaFiles; } + @Override public String path() { return file; } + @Override public String name() { int index = file.lastIndexOf('/'); if(index < 0) return file; return file.substring(index + 1); } + @Override public String extension() { String name = name(); int dotIndex = name.lastIndexOf('.'); @@ -63,6 +58,7 @@ public String extension() { return name.substring(dotIndex + 1); } + @Override public String nameWithoutExtension() { String name = name(); int dotIndex = name.lastIndexOf('.'); @@ -73,6 +69,7 @@ public String nameWithoutExtension() { /** * @return the path and filename without the extension, e.g. dir/dir2/file.png -> dir/dir2/file */ + @Override public String pathWithoutExtension() { String path = file; int dotIndex = path.lastIndexOf('.'); @@ -80,6 +77,7 @@ public String pathWithoutExtension() { return path.substring(0, dotIndex); } + @Override public FileType type() { return type; } @@ -88,6 +86,7 @@ public FileType type() { * Returns a java.io.File that represents this file handle. Note the returned file will only be usable for * {@link FileType#Absolute} and {@link FileType#External} file handles. */ + @Override public File file() { throw new GdxRuntimeException("Not supported in web backend"); } @@ -97,18 +96,15 @@ public File file() { * * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. */ + @Override public InputStream read() { - if(fileDB != null) { - return fileDB.read(this); - } - else if(type == FileType.Local) { - return FileDB.getInstance().read(this); - } - else { - InputStream in = preloader.read(file); - if(in == null) throw new GdxRuntimeException(file + " does not exist"); - return in; + boolean exists = teaFiles.getFileDB(type).exists(this); + if (type == FileType.Classpath || (type == FileType.Internal && !exists) || (type == FileType.Local && !exists)) { + InputStream input = teaFiles.getFileDB(FileType.Classpath).read(this); + if (input == null) throw new GdxRuntimeException("File not found: " + file + " (" + type + ")"); + return input; } + return teaFiles.getFileDB(type).read(this); } /** @@ -116,6 +112,7 @@ else if(type == FileType.Local) { * * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. */ + @Override public BufferedInputStream read(int bufferSize) { return new BufferedInputStream(read(), bufferSize); } @@ -125,6 +122,7 @@ public BufferedInputStream read(int bufferSize) { * * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. */ + @Override public Reader reader() { return new InputStreamReader(read()); } @@ -134,6 +132,7 @@ public Reader reader() { * * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. */ + @Override public Reader reader(String charset) { try { return new InputStreamReader(read(), charset); @@ -148,6 +147,7 @@ public Reader reader(String charset) { * * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. */ + @Override public BufferedReader reader(int bufferSize) { return new BufferedReader(reader(), bufferSize); } @@ -157,6 +157,7 @@ public BufferedReader reader(int bufferSize) { * * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. */ + @Override public BufferedReader reader(int bufferSize, String charset) { return new BufferedReader(reader(charset), bufferSize); } @@ -166,6 +167,7 @@ public BufferedReader reader(int bufferSize, String charset) { * * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. */ + @Override public String readString() { return readString(null); } @@ -175,70 +177,9 @@ public String readString() { * * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. */ + @Override public String readString(String charset) { - if(fileDB != null) { - return super.readString(charset); - } - else if(type == FileType.Local) { - // obtain via reader - return super.readString(charset); - } - else { - if(preloader.isText(file)) return preloader.texts.get(file); - try { - return new String(readBytes(), "UTF-8"); - } - catch(UnsupportedEncodingException e) { - return null; - } - } - } - - /** - * Reads the entire file into a byte array. - * - * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. - */ - public byte[] readBytes() { - if(fileDB != null) { - return fileDB.readBytes(this); - } - - int length = (int)length(); - if(length == 0) length = 512; - byte[] buffer = new byte[length]; - int position = 0; - InputStream input = read(); - try { - while(true) { - int count = input.read(buffer, position, buffer.length - position); - if(count == -1) break; - position += count; - if(position == buffer.length) { - // Grow buffer. - byte[] newBuffer = new byte[buffer.length * 2]; - System.arraycopy(buffer, 0, newBuffer, 0, position); - buffer = newBuffer; - } - } - } - catch(IOException ex) { - throw new GdxRuntimeException("Error reading file: " + this, ex); - } - finally { - try { - if(input != null) input.close(); - } - catch(IOException ignored) { - } - } - if(position < buffer.length) { - // Shrink buffer. - byte[] newBuffer = new byte[position]; - System.arraycopy(buffer, 0, newBuffer, 0, position); - buffer = newBuffer; - } - return buffer; + return super.readString(charset); } /** @@ -249,6 +190,7 @@ public byte[] readBytes() { * @param size the number of bytes to read, see {@link #length()} * @return the number of read bytes */ + @Override public int readBytes(byte[] bytes, int offset, int size) { InputStream input = read(); int position = 0; @@ -279,6 +221,7 @@ public int readBytes(byte[] bytes, int offset, int size) { * @throws GdxRuntimeException if this file handle represents a directory, if it is a {@link FileType#Classpath} or * {@link FileType#Internal} file, or if it could not be written. */ + @Override public OutputStream write(boolean append) { if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot write to a classpath file: " + file); if(type == FileType.Internal) throw new GdxRuntimeException("Cannot write to an internal file: " + file); @@ -293,16 +236,9 @@ public OutputStream write(boolean append) { * @throws GdxRuntimeException if this file handle represents a directory, if it is a {@link FileType#Classpath} or * {@link FileType#Internal} file, or if it could not be written. */ + @Override public OutputStream write(boolean append, int bufferSize) { - if(fileDB != null) { - return fileDB.write(this, append, bufferSize); - } - else if(type == FileType.Local) { - return FileDB.getInstance().write(this, append, bufferSize); - } - else { - throw new GdxRuntimeException("Cannot write to the given file."); - } + return teaFiles.getFileDB(type).write(this, append, bufferSize); } /** @@ -313,6 +249,7 @@ else if(type == FileType.Local) { * @throws GdxRuntimeException if this file handle represents a directory, if it is a {@link FileType#Classpath} or * {@link FileType#Internal} file, or if it could not be written. */ + @Override public void write(InputStream input, boolean append) { OutputStream output = null; try { @@ -336,6 +273,7 @@ public void write(InputStream input, boolean append) { * @throws GdxRuntimeException if this file handle represents a directory, if it is a {@link FileType#Classpath} or * {@link FileType#Internal} file, or if it could not be written. */ + @Override public Writer writer(boolean append) { return writer(append, null); } @@ -348,6 +286,7 @@ public Writer writer(boolean append) { * @throws GdxRuntimeException if this file handle represents a directory, if it is a {@link FileType#Classpath} or * {@link FileType#Internal} file, or if it could not be written. */ + @Override public Writer writer(boolean append, String charset) { if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot write to a classpath file: " + file); if(type == FileType.Internal) throw new GdxRuntimeException("Cannot write to an internal file: " + file); @@ -366,6 +305,7 @@ public Writer writer(boolean append, String charset) { * @throws GdxRuntimeException if this file handle represents a directory, if it is a {@link FileType#Classpath} or * {@link FileType#Internal} file, or if it could not be written. */ + @Override public void writeString(String string, boolean append) { writeString(string, append, null); } @@ -378,6 +318,7 @@ public void writeString(String string, boolean append) { * @throws GdxRuntimeException if this file handle represents a directory, if it is a {@link FileType#Classpath} or * {@link FileType#Internal} file, or if it could not be written. */ + @Override public void writeString(String string, boolean append, String charset) { Writer writer = null; try { @@ -399,6 +340,7 @@ public void writeString(String string, boolean append, String charset) { * @throws GdxRuntimeException if this file handle represents a directory, if it is a {@link FileType#Classpath} or * {@link FileType#Internal} file, or if it could not be written. */ + @Override public void writeBytes(byte[] bytes, boolean append) { OutputStream output = write(append); try { @@ -419,6 +361,7 @@ public void writeBytes(byte[] bytes, boolean append) { * @throws GdxRuntimeException if this file handle represents a directory, if it is a {@link FileType#Classpath} or * {@link FileType#Internal} file, or if it could not be written. */ + @Override public void writeBytes(byte[] bytes, int offset, int length, boolean append) { OutputStream output = write(append); try { @@ -439,17 +382,10 @@ public void writeBytes(byte[] bytes, int offset, int length, boolean append) { * * @throws GdxRuntimeException if this file is an {@link FileType#Classpath} file. */ + @Override public FileHandle[] list() { if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot list a classpath directory: " + file); - if(fileDB != null) { - return fileDB.list(this); - } - else if(type == FileType.Local) { - return FileDB.getInstance().list(this); - } - else { - return preloader.list(file); - } + return teaFiles.getFileDB(type).list(this); } /** @@ -459,17 +395,10 @@ else if(type == FileType.Local) { * * @throws GdxRuntimeException if this file is an {@link FileType#Classpath} file. */ + @Override public FileHandle[] list(FileFilter filter) { if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot list a classpath directory: " + file); - if(fileDB != null) { - return fileDB.list(this, filter); - } - else if(type == FileType.Local) { - return FileDB.getInstance().list(this, filter); - } - else { - return preloader.list(file); - } + return teaFiles.getFileDB(type).list(this, filter); } /** @@ -479,17 +408,10 @@ else if(type == FileType.Local) { * * @throws GdxRuntimeException if this file is an {@link FileType#Classpath} file. */ + @Override public FileHandle[] list(FilenameFilter filter) { if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot list a classpath directory: " + file); - if(fileDB != null) { - return fileDB.list(this, filter); - } - else if(type == FileType.Local) { - return FileDB.getInstance().list(this, filter); - } - else { - return preloader.list(file, filter); - } + return teaFiles.getFileDB(type).list(this, filter); } /** @@ -499,17 +421,10 @@ else if(type == FileType.Local) { * * @throws GdxRuntimeException if this file is an {@link FileType#Classpath} file. */ + @Override public FileHandle[] list(String suffix) { if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot list a classpath directory: " + file); - if(fileDB != null) { - return fileDB.list(this, suffix); - } - else if(type == FileType.Local) { - return FileDB.getInstance().list(this, suffix); - } - else { - return preloader.list(file, suffix); - } + return teaFiles.getFileDB(type).list(this, suffix); } /** @@ -517,17 +432,10 @@ else if(type == FileType.Local) { * {@link FileType#Internal} handle to an empty directory will return false. On the desktop, an {@link FileType#Internal} * handle to a directory on the classpath will return false. */ + @Override public boolean isDirectory() { if (type == FileType.Classpath) return false; - if(fileDB != null) { - return fileDB.isDirectory(this); - } - else if(type == FileType.Local) { - return FileDB.getInstance().isDirectory(this); - } - else { - return preloader.isDirectory(file); - } + return teaFiles.getFileDB(type).isDirectory(this); } /** @@ -536,18 +444,21 @@ else if(type == FileType.Local) { * @throws GdxRuntimeException if this file handle is a {@link FileType#Classpath} or {@link FileType#Internal} and the child * doesn't exist. */ + @Override public FileHandle child(String name) { - return new TeaFileHandle(preloader, fileDB, (file.isEmpty() ? "" : (file + (file.endsWith("/") ? "" : "/"))) + name, + return new TeaFileHandle(teaFiles, (file.isEmpty() ? "" : (file + (file.endsWith("/") ? "" : "/"))) + name, type); } + @Override public FileHandle parent() { int index = file.lastIndexOf("/"); String dir = ""; if(index > 0) dir = file.substring(0, index); - return new TeaFileHandle(preloader, fileDB, dir, type); + return new TeaFileHandle(teaFiles, dir, type); } + @Override public FileHandle sibling(String name) { return parent().child(fixSlashes(name)); } @@ -555,38 +466,32 @@ public FileHandle sibling(String name) { /** * @throws GdxRuntimeException if this file handle is a {@link FileType#Classpath} or {@link FileType#Internal} file. */ + @Override public void mkdirs() { if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot mkdirs with a classpath file: " + file); if(type == FileType.Internal) throw new GdxRuntimeException("Cannot mkdirs with an internal file: " + file); - if(fileDB != null) { - fileDB.mkdirs(this); - } - else if(type == FileType.Local) { - FileDB.getInstance().mkdirs(this); - } - else { - throw new GdxRuntimeException("Cannot mkdirs for non-local file: " + file); - } + teaFiles.getFileDB(type).mkdirs(this); } public void mkdirsInternal() { - fileDB.mkdirs(this); + teaFiles.getFileDB(type).mkdirs(this); } /** * Returns true if the file exists. On Android, a {@link FileType#Classpath} or {@link FileType#Internal} handle to a * directory will always return false. */ + @Override public boolean exists() { - if(fileDB != null) { - return fileDB.exists(this); - } - else if(type == FileType.Local) { - return FileDB.getInstance().exists(this); - } - else { - return preloader.contains(file); + boolean exists = teaFiles.getFileDB(type).exists(this); + switch (type) { + case Internal: + if (exists) return true; + // Fall through. + case Classpath: + return teaFiles.getFileDB(FileType.Classpath).exists(this); } + return exists; } /** @@ -594,18 +499,11 @@ else if(type == FileType.Local) { * * @throws GdxRuntimeException if this file handle is a {@link FileType#Classpath} or {@link FileType#Internal} file. */ + @Override public boolean delete() { if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot delete a classpath file: " + file); if(type == FileType.Internal) throw new GdxRuntimeException("Cannot delete an internal file: " + file); - if(fileDB != null) { - return fileDB.delete(this); - } - else if(type == FileType.Local) { - return FileDB.getInstance().delete(this); - } - else { - throw new GdxRuntimeException("Cannot delete a non-local file: " + file); - } + return teaFiles.getFileDB(type).delete(this); } /** @@ -613,16 +511,11 @@ else if(type == FileType.Local) { * * @throws GdxRuntimeException if this file handle is a {@link FileType#Classpath} or {@link FileType#Internal} file. */ + @Override public boolean deleteDirectory() { if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot delete a classpath file: " + file); if(type == FileType.Internal) throw new GdxRuntimeException("Cannot delete an internal file: " + file); - if(fileDB != null) { - return fileDB.deleteDirectory(this); - } - else if(type == FileType.Local) { - return FileDB.getInstance().deleteDirectory(this); - } - throw new GdxRuntimeException("Cannot delete directory (missing implementation): " + file); + return teaFiles.getFileDB(type).deleteDirectory(this); } /** @@ -636,6 +529,7 @@ else if(type == FileType.Local) { * @throws GdxRuntimeException if the destination file handle is a {@link FileType#Classpath} or {@link FileType#Internal} file, * or copying failed. */ + @Override public void copyTo(FileHandle dest) { if(!isDirectory()) { if(dest.isDirectory()) dest = dest.child(name()); @@ -658,6 +552,7 @@ public void copyTo(FileHandle dest) { * @throws GdxRuntimeException if the source or destination file handle is a {@link FileType#Classpath} or * {@link FileType#Internal} file. */ + @Override public void moveTo(FileHandle dest) { switch(type) { case Classpath: { @@ -667,12 +562,12 @@ public void moveTo(FileHandle dest) { throw new GdxRuntimeException("Cannot move an internal file: " + file); } } - if(fileDB != null && !dest.exists()) { + if(!dest.exists()) { FileHandle destParent = dest.parent(); FileHandle thisParent = parent(); if(thisParent.equals(destParent)) { // Rename if same parent. Similar to absolute from desktop - fileDB.rename(this, (TeaFileHandle)dest); + teaFiles.getFileDB(type).rename(this, (TeaFileHandle)dest); return; } } @@ -686,16 +581,9 @@ public void moveTo(FileHandle dest) { * Returns the length in bytes of this file, or 0 if this file is a directory, does not exist, or the size cannot otherwise be * determined. */ + @Override public long length() { - if(fileDB != null) { - return fileDB.length(this); - } - else if(type == FileType.Local) { - return FileDB.getInstance().length(this); - } - else { - return preloader.length(file); - } + return teaFiles.getFileDB(type).length(this); } /** @@ -703,10 +591,12 @@ else if(type == FileType.Local) { * for {@link FileType#Classpath} files. On Android, zero is returned for {@link FileType#Internal} files. On the desktop, zero * is returned for {@link FileType#Internal} files on the classpath. */ + @Override public long lastModified() { return 0; } + @Override public String toString() { return file; } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java index a21813d2..1563dca2 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java @@ -2,27 +2,41 @@ import com.badlogic.gdx.Files; import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.utils.GdxRuntimeException; import com.github.xpenatan.gdx.backends.teavm.filesystem.FileDB; -import com.github.xpenatan.gdx.backends.teavm.filesystem.types.InternalDBStorage; +import com.github.xpenatan.gdx.backends.teavm.filesystem.MemoryFileStorage; +import com.github.xpenatan.gdx.backends.teavm.filesystem.types.ClasspathStorage; +import com.github.xpenatan.gdx.backends.teavm.filesystem.types.InternalStorage; import com.github.xpenatan.gdx.backends.teavm.filesystem.types.LocalDBStorage; -import com.github.xpenatan.gdx.backends.teavm.preloader.Preloader; /** * @author xpenatan */ public class TeaFiles implements Files { - final Preloader preloader; + public MemoryFileStorage internalStorage; + public MemoryFileStorage classpathStorage; + public MemoryFileStorage localStorage; + public String storagePath; - public InternalDBStorage internalStorage; - public LocalDBStorage localStorage; + public TeaFiles(TeaApplicationConfiguration config, TeaApplication teaApplication) { + this.internalStorage = new InternalStorage(); + this.classpathStorage = new ClasspathStorage(); + this.localStorage = new LocalDBStorage(teaApplication); + storagePath = config.storagePrefix; + } - public TeaFiles(TeaApplicationConfiguration config, TeaApplication teaApplication, Preloader preloader) { - this.preloader = preloader; - if(config.useNewFileHandle) { - this.internalStorage = new InternalDBStorage(); - this.localStorage = new LocalDBStorage(teaApplication); + public FileDB getFileDB(FileType type) { + if(type == FileType.Internal) { + return internalStorage; + } + else if(type == FileType.Classpath) { + return classpathStorage; } + else if(type == FileType.Local) { + return localStorage; + } + return null; } @Override @@ -37,32 +51,32 @@ else if(type == FileType.Classpath) { else if(type == FileType.Local) { return local(path); } - return new TeaFileHandle(preloader, null, path, type); + throw new GdxRuntimeException("Type " + type + " is not supported"); } @Override public FileHandle classpath(String path) { - return new TeaFileHandle(preloader, internalStorage, path, FileType.Classpath); + return new TeaFileHandle(this, path, FileType.Classpath); } @Override public FileHandle internal(String path) { - return new TeaFileHandle(preloader, internalStorage, path, FileType.Internal); + return new TeaFileHandle(this, path, FileType.Internal); } @Override - public FileHandle external(String path) { - return new TeaFileHandle(preloader, null, path, FileType.External); + public FileHandle local(String path) { + return new TeaFileHandle(this, path, FileType.Local); } @Override - public FileHandle absolute(String path) { - return new TeaFileHandle(preloader, null, path, FileType.Absolute); + public FileHandle external(String path) { + throw new GdxRuntimeException("Type external is not supported"); } @Override - public FileHandle local(String path) { - return new TeaFileHandle(preloader, localStorage, path, FileType.Local); + public FileHandle absolute(String path) { + throw new GdxRuntimeException("Type absolute is not supported"); } @Override @@ -77,7 +91,7 @@ public boolean isExternalStorageAvailable() { @Override public String getLocalStoragePath() { - return FileDB.getInstance().getPath(); + return storagePath; } @Override diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetFileHandle.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetFileHandle.java new file mode 100644 index 00000000..4217e0a6 --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetFileHandle.java @@ -0,0 +1,42 @@ +package com.github.xpenatan.gdx.backends.teavm.config; + +import com.badlogic.gdx.Files.FileType; +import com.badlogic.gdx.files.FileHandle; +import java.io.File; + +public class AssetFileHandle extends FileHandle { + + FileType copyType; + + public static AssetFileHandle createHandle(String fileName, FileType type) { + return new AssetFileHandle(fileName, type, type); + } + + public static AssetFileHandle createCopyHandle(File file, FileType type) { + return new AssetFileHandle(file, FileType.Absolute, type); + } + + public AssetFileHandle(String fileName) { + this(new File(fileName), FileType.Absolute, FileType.Internal); + } + + private AssetFileHandle(String fileName, FileType type, FileType copyType) { + this(new File(fileName), type, copyType); + } + + private AssetFileHandle(File file, FileType type, FileType copyType) { + this.type = type; + this.copyType = copyType; + this.file = file; + } + + public FileHandle child (String name) { + if (file.getPath().isEmpty()) return new AssetFileHandle(new File(name), super.type(), copyType); + return new AssetFileHandle(new File(file, name), super.type(), copyType); + } + + @Override + public FileType type() { + return copyType; + } +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java index 106cb723..287ce847 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java @@ -1,18 +1,16 @@ package com.github.xpenatan.gdx.backends.teavm.config; +import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.GdxRuntimeException; import com.github.xpenatan.gdx.backends.teavm.TeaClassLoader; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetFilter; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetType; import com.github.xpenatan.gdx.backends.teavm.preloader.DefaultAssetFilter; -import com.github.xpenatan.gdx.backends.teavm.preloader.FileWrapper; -import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; -import java.net.URLConnection; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Files; @@ -26,35 +24,41 @@ import java.util.List; import java.util.Map.Entry; import java.util.stream.Stream; +import com.badlogic.gdx.Files.FileType; /** * @author xpenatan */ public class AssetsCopy { + private static class Asset { - FileWrapper file; + FileHandle file; AssetType type; - public Asset(FileWrapper file, AssetType type) { + public Asset(FileHandle file, AssetType type) { this.file = file; this.type = type; } } - public static void copy(ArrayList assetsPaths, AssetFilter filter, String assetsOutputPath, boolean generateTextFile) { - copy(null, null, assetsPaths, null, assetsOutputPath, generateTextFile, false); + public static void copyResources(TeaClassLoader classLoader, List classPathAssetsFiles, String assetsOutputPath, boolean generateTextFile, boolean append) { + copy(classLoader, classPathAssetsFiles, true, null, null, assetsOutputPath, generateTextFile, append); + } + + public static void copy(TeaClassLoader classLoader, List classPathAssetsFiles, ArrayList assetsPaths, AssetFilter filter, String assetsOutputPath, boolean generateTextFile, boolean append) { + copy(classLoader, classPathAssetsFiles, false, assetsPaths, filter, assetsOutputPath, generateTextFile, append); } - public static void copy(TeaClassLoader classloader, List classPathAssetsFiles, ArrayList assetsPaths, AssetFilter filter, String assetsOutputPath, boolean generateTextFile, boolean append) { - assetsOutputPath = assetsOutputPath.replace("\\", "/"); - FileWrapper target = new FileWrapper(assetsOutputPath); + private static void copy(TeaClassLoader classloader, List classPathAssetsFiles, boolean isResources, ArrayList assetsPaths, AssetFilter filter, String assetsOutputPath, boolean generateTextFile, boolean append) { + FileHandle target = new FileHandle(assetsOutputPath); + assetsOutputPath = target.path(); ArrayList assets = new ArrayList(); AssetFilter defaultAssetFilter = filter != null ? filter : new DefaultAssetFilter(); if(assetsPaths != null && assetsPaths.size() > 0) { TeaBuilder.log("Copying assets from:"); for(int i = 0; i < assetsPaths.size(); i++) { - String path = assetsPaths.get(i).getAbsolutePath(); - FileWrapper source = new FileWrapper(path); + FileHandle source = assetsPaths.get(i); + String path = source.path(); TeaBuilder.log(path); copyDirectory(source, target, defaultAssetFilter, assets); } @@ -82,11 +86,12 @@ public static void copy(TeaClassLoader classloader, List classPathAssets TeaBuilder.log(classpathFile); InputStream is = classloader.getResourceAsStream(classpathFile); if(is != null) { - FileWrapper dest = target.child(classpathFile); + FileHandle dest = target.child(classpathFile); dest.write(is, false); String destPath = dest.path(); if(!destPath.endsWith(".js") && !destPath.endsWith(".wasm")) { - assets.add(new Asset(dest, AssetFilter.getType(destPath))); + AssetFileHandle dest2 = AssetFileHandle.createCopyHandle(dest.file(), FileType.Classpath); + assets.add(new Asset(dest2, AssetFilter.getType(destPath))); } is.close(); } @@ -119,23 +124,35 @@ public static void copy(TeaClassLoader classloader, List classPathAssets for(Entry> bundle : bundles.entrySet()) { StringBuffer buffer = new StringBuffer(); for(Asset asset : bundle.getValue()) { - String path = asset.file.path().replace('\\', '/'); - path = path.replace(assetsOutputPath, ""); - if(path.startsWith("/")) path = path.substring(1); - buffer.append(asset.type.code); - buffer.append(":"); - buffer.append(path); - buffer.append(":"); - buffer.append(asset.file.isDirectory() ? 0 : asset.file.length()); - buffer.append(":"); - String mimetype = URLConnection.guessContentTypeFromName(asset.file.name()); - buffer.append(mimetype == null ? "application/unknown" : mimetype); - buffer.append("\n"); + setupPreloadAssetFileFormat(asset, buffer, assetsOutputPath); } target.child(bundle.getKey() + ".txt").writeString(buffer.toString(), append); } } + private static void setupPreloadAssetFileFormat(Asset asset, StringBuffer buffer, String assetsOutputPath) { + FileHandle fileHandle = asset.file; + FileType type = fileHandle.type(); + String path = fileHandle.path(); + path = path.replace(assetsOutputPath, ""); + String fileTypeStr = "i"; + if(type == FileType.Local) { + fileTypeStr = "l"; + } + else if(type == FileType.Classpath) { + fileTypeStr = "c"; + } + + buffer.append(fileTypeStr); + buffer.append(":"); + buffer.append(asset.type.code); + buffer.append(":"); + buffer.append(path); + buffer.append(":"); + buffer.append(asset.file.isDirectory() ? 0 : asset.file.length()); + buffer.append("\n"); + } + private static void addDirectoryClassPathFiles(List classPathFiles) { ArrayList folderFilePaths = new ArrayList<>(); for(int k = 0; k < classPathFiles.size(); k++) { @@ -229,7 +246,7 @@ private static void addDirectoryClassPathFiles(List classPathFiles) { classPathFiles.addAll(set); } - private static void copyFile(FileWrapper source, FileWrapper dest, AssetFilter filter, ArrayList assets) { + private static void copyFile(FileHandle source, FileHandle dest, AssetFilter filter, ArrayList assets) { if(!filter.accept(dest.path(), false)) return; try { assets.add(new Asset(dest, AssetFilter.getType(dest.path()))); @@ -243,16 +260,20 @@ private static void copyFile(FileWrapper source, FileWrapper dest, AssetFilter f } } - private static void copyDirectory(FileWrapper sourceDir, FileWrapper destDir, AssetFilter filter, ArrayList assets) { - if(!filter.accept(destDir.path(), true)) return; - assets.add(new Asset(destDir, AssetType.Directory)); + private static void copyDirectory(FileHandle sourceDir, FileHandle destDir, AssetFilter filter, ArrayList assets) { + String destPath = destDir.path(); + if(!filter.accept(destPath, true)) return; destDir.mkdirs(); - FileWrapper[] files = sourceDir.list(); + FileHandle[] files = sourceDir.list(); for(int i = 0, n = files.length; i < n; i++) { - FileWrapper srcFile = files[i]; - FileWrapper destFile = destDir.child(srcFile.name()); - if(srcFile.isDirectory()) + FileHandle srcFile = files[i]; + FileHandle destFile1 = destDir.child(srcFile.name()); + // Destination type is copied from source type + FileHandle destFile = AssetFileHandle.createCopyHandle(destFile1.file(), srcFile.type()); + if(srcFile.isDirectory()) { + assets.add(new Asset(destFile, AssetType.Directory)); copyDirectory(srcFile, destFile, filter, assets); + } else copyFile(srcFile, destFile, filter, assets); } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuildConfiguration.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuildConfiguration.java index dcb292f3..e05a31e3 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuildConfiguration.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuildConfiguration.java @@ -1,9 +1,9 @@ package com.github.xpenatan.gdx.backends.teavm.config; import com.badlogic.gdx.ApplicationListener; +import com.badlogic.gdx.files.FileHandle; import com.github.xpenatan.gdx.backends.teavm.TeaLauncher; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetFilter; -import java.io.File; import java.net.URL; import java.util.ArrayList; @@ -13,7 +13,7 @@ public class TeaBuildConfiguration { public AssetFilter assetFilter = null; - public ArrayList assetsPath = new ArrayList<>(); + public ArrayList assetsPath = new ArrayList<>(); public ArrayList additionalAssetsClasspathFiles = new ArrayList<>(); private String mainApplicationClass; @@ -89,7 +89,7 @@ public String getWebAppPath() { return webappPath; } - public boolean assetsPath(ArrayList paths) { + public boolean assetsPath(ArrayList paths) { paths.addAll(assetsPath); return true; } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java index 82c758e6..0a0815d1 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java @@ -346,41 +346,6 @@ private static void configClasspath(TeaBuildConfiguration configuration, ArrayLi } } - private static void assetsDefaultClasspath(ArrayList filePath) { - //TODO remove if its working correctly without these assets -// filePath.add("com/badlogic/gdx/graphics/g3d/particles/"); -// filePath.add("com/badlogic/gdx/graphics/g3d/shaders/"); -// filePath.add("com/badlogic/gdx/utils/arial-15.fnt"); // Cannot be utils folder for now because its trying to copy from emu folder and not core gdx classpath -// filePath.add("com/badlogic/gdx/utils/arial-15.png"); -// -// filePath.add("com/badlogic/gdx/utils/lsans-15.fnt"); -// filePath.add("com/badlogic/gdx/utils/lsans-15.png"); - -// filePath.add("net/mgsx/gltf/shaders/brdfLUT.png"); -// filePath.add("net/mgsx/gltf/shaders/default.fs.glsl"); -// filePath.add("net/mgsx/gltf/shaders/default.vs.glsl"); -// filePath.add("net/mgsx/gltf/shaders/gdx-pbr.vs.glsl"); -// filePath.add("net/mgsx/gltf/shaders/gdx-pbr.fs.glsl"); -// filePath.add("net/mgsx/gltf/shaders/depth.fs.glsl"); -// filePath.add("net/mgsx/gltf/shaders/depth.vs.glsl"); -// filePath.add("net/mgsx/gltf/shaders/emissive-only.fs"); -// filePath.add("net/mgsx/gltf/shaders/ibl-sun.fs.glsl"); -// filePath.add("net/mgsx/gltf/shaders/ibl-sun.vs.glsl"); -// filePath.add("net/mgsx/gltf/shaders/skybox.fs.glsl"); -// filePath.add("net/mgsx/gltf/shaders/skybox.vs.glsl"); -// filePath.add("net/mgsx/gltf/shaders/pbr/compat.fs.glsl"); -// filePath.add("net/mgsx/gltf/shaders/pbr/compat.vs.glsl"); -// filePath.add("net/mgsx/gltf/shaders/pbr/env.glsl"); -// filePath.add("net/mgsx/gltf/shaders/pbr/functions.glsl"); -// filePath.add("net/mgsx/gltf/shaders/pbr/ibl.glsl"); -// filePath.add("net/mgsx/gltf/shaders/pbr/iridescence.glsl"); -// filePath.add("net/mgsx/gltf/shaders/pbr/lights.glsl"); -// filePath.add("net/mgsx/gltf/shaders/pbr/material.glsl"); -// filePath.add("net/mgsx/gltf/shaders/pbr/pbr.fs.glsl"); -// filePath.add("net/mgsx/gltf/shaders/pbr/pbr.vs.glsl"); -// filePath.add("net/mgsx/gltf/shaders/pbr/shadows.glsl"); - } - private static ACCEPT_STATE acceptPath(String path) { ACCEPT_STATE isValid = ACCEPT_STATE.NO_MATCH; if(path.contains("junit")) @@ -524,47 +489,20 @@ public TeaVMProgressFeedback progressReached(int i) { } public static void configAssets(TeaClassLoader classLoader, TeaBuildConfiguration configuration, String webappDirectory, String webappName, ArrayList acceptedURL) { - ArrayList webappAssetsFiles = new ArrayList<>(); - webappAssetsFiles.add(webappName); TeaBuilder.logHeader("COPYING ASSETS"); - boolean shouldUseDefaultHtmlIndex = configuration.shouldUseDefaultHtmlIndex(); - if(shouldUseDefaultHtmlIndex) { - AssetsCopy.copy(classLoader, webappAssetsFiles, new ArrayList<>(), null, webappDirectory, false, false); - TeaBuilder.log(""); - } - - String scriptsOutputPath = webappDirectory + File.separator + webappName; - String assetsOutputPath = scriptsOutputPath + File.separator + "assets"; + String webappOutputPath = webappDirectory + File.separator + webappName; + String assetsOutputPath = webappOutputPath + File.separator + "assets"; - AssetFilter filter = configuration.assetFilter(); - ArrayList assetsPaths = new ArrayList<>(); + ArrayList assetsPaths = new ArrayList<>(); ArrayList classPathAssetsFiles = new ArrayList<>(); - assetsDefaultClasspath(classPathAssetsFiles); + AssetFilter filter = configuration.assetFilter(); + boolean shouldUseDefaultHtmlIndex = configuration.shouldUseDefaultHtmlIndex(); if(shouldUseDefaultHtmlIndex) { - File indexFile = new File(scriptsOutputPath + File.separator + "index.html"); - FileHandle handler = new FileHandle(indexFile); - String indexHtmlStr = handler.readString(); - - String logo = configuration.getLogoPath(); - String htmlLogo = "assets/" + logo; - boolean showLoadingLogo = configuration.isShowLoadingLogo(); - - indexHtmlStr = indexHtmlStr.replace("%TITLE%", configuration.getHtmlTitle()); - indexHtmlStr = indexHtmlStr.replace("%WIDTH%", configuration.getHtmlWidth()); - indexHtmlStr = indexHtmlStr.replace("%HEIGHT%", configuration.getHtmlHeight()); - indexHtmlStr = indexHtmlStr.replace("%ARGS%", configuration.getMainClassArgs()); - indexHtmlStr = indexHtmlStr.replace( - "%LOGO%", showLoadingLogo ? "" : "" - ); - - handler.writeString(indexHtmlStr, false); - - if(showLoadingLogo) { - classPathAssetsFiles.add(logo); - } + useDefaultHTMLIndexFile(classLoader, configuration, webappDirectory, webappName, webappOutputPath); } + ArrayList additionalAssetClasspath = configuration.getAdditionalAssetClasspath(); classPathAssetsFiles.addAll(additionalAssetClasspath); boolean generateAssetPaths = configuration.assetsPath(assetsPaths); @@ -572,7 +510,39 @@ public static void configAssets(TeaClassLoader classLoader, TeaBuildConfiguratio // Copy assets from resources List resources = TeaVMResourceProperties.getResources(acceptedURL); - AssetsCopy.copy(classLoader, resources, null, null, assetsOutputPath, true, true); + AssetsCopy.copyResources(classLoader, resources, assetsOutputPath, true, true); + TeaBuilder.log(""); + } + + private static void useDefaultHTMLIndexFile(TeaClassLoader classLoader, TeaBuildConfiguration configuration, String webappDirectory, String webappName, String webappOutputPath) { + ArrayList webappAssetsFiles = new ArrayList<>(); + webappAssetsFiles.add(webappName); + // Copy webapp folder from resources to destination + AssetsCopy.copyResources(classLoader, webappAssetsFiles, webappDirectory, false, false); TeaBuilder.log(""); + + File indexFile = new File(webappOutputPath + File.separator + "index.html"); + FileHandle handler = new FileHandle(indexFile); + String indexHtmlStr = handler.readString(); + + String logo = configuration.getLogoPath(); + String htmlLogo = logo; + boolean showLoadingLogo = configuration.isShowLoadingLogo(); + + indexHtmlStr = indexHtmlStr.replace("%TITLE%", configuration.getHtmlTitle()); + indexHtmlStr = indexHtmlStr.replace("%WIDTH%", configuration.getHtmlWidth()); + indexHtmlStr = indexHtmlStr.replace("%HEIGHT%", configuration.getHtmlHeight()); + indexHtmlStr = indexHtmlStr.replace("%ARGS%", configuration.getMainClassArgs()); + indexHtmlStr = indexHtmlStr.replace( + "%LOGO%", showLoadingLogo ? "" : "" + ); + + handler.writeString(indexHtmlStr, false); + + if(showLoadingLogo) { + ArrayList logoAsset = new ArrayList<>(); + logoAsset.add(logo); + AssetsCopy.copyResources(classLoader, logoAsset, webappOutputPath, false, false); + } } } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaVMResourceProperties.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaVMResourceProperties.java index 2f179325..05c09655 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaVMResourceProperties.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaVMResourceProperties.java @@ -1,5 +1,6 @@ package com.github.xpenatan.gdx.backends.teavm.config; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -20,6 +21,7 @@ import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; +import com.badlogic.gdx.Files.FileType; public class TeaVMResourceProperties { private static final String OPTION_ADDITIONAL_RESOURCES = "resources"; diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/typedarray/TypedArrays.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/typedarray/TypedArrays.java index 22ca5044..105d90d3 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/typedarray/TypedArrays.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/typedarray/TypedArrays.java @@ -205,7 +205,7 @@ public static ArrayBufferViewWrapper getTypedArray(FloatBuffer buffer) { @JSBody(params = {"buffer"}, script = "" + "return buffer;") - private static native ArrayBufferViewWrapper getTypedArray(@JSByRef() byte[] buffer); + public static native ArrayBufferViewWrapper getTypedArray(@JSByRef() byte[] buffer); @JSBody(params = {"buffer"}, script = "" + "return buffer;") diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java index fe34a9e8..a2f94c00 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDB.java @@ -1,12 +1,9 @@ package com.github.xpenatan.gdx.backends.teavm.filesystem; -import com.badlogic.gdx.Files; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.GdxRuntimeException; -import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; -import com.github.xpenatan.gdx.backends.teavm.preloader.Preloader; import java.io.ByteArrayOutputStream; import java.io.FileFilter; import java.io.FilenameFilter; @@ -23,22 +20,6 @@ */ public abstract class FileDB { - /** - * The singleton instance as we only have one file system DB. - */ - private static FileDB INSTANCE = null; - - protected FileDB() { - // hiding the constructor - } - - public static FileDB getInstance() { - if(INSTANCE == null) { - INSTANCE = new FileDBManager(); - } - return INSTANCE; - } - public abstract InputStream read(TeaFileHandle file); public abstract byte[] readBytes(TeaFileHandle file); @@ -83,18 +64,13 @@ public final FileHandle[] list(TeaFileHandle file) { String[] paths = paths(file); FileHandle[] files = new TeaFileHandle[paths.length]; - Preloader preloader = null; - if(Gdx.app != null) { - if(Gdx.app instanceof TeaApplication) { - preloader = ((TeaApplication)Gdx.app).getPreloader(); - } - } for(int i = 0; i < paths.length; i++) { String path = paths[i]; if((path.length() > 0) && (path.charAt(path.length() - 1) == '/')) { path = path.substring(0, path.length() - 1); } - files[i] = new TeaFileHandle(preloader, this, path, file.type()); + + files[i] = Gdx.files.getFileHandle(path, file.type()); } return files; } @@ -138,6 +114,4 @@ public final FileHandle[] list(TeaFileHandle file, String suffix) { public abstract long length(TeaFileHandle file); public abstract void rename(TeaFileHandle source, TeaFileHandle target); - - public abstract String getPath(); -} +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java deleted file mode 100644 index 2fa33e26..00000000 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBManager.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.github.xpenatan.gdx.backends.teavm.filesystem; - -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.utils.GdxRuntimeException; -import com.github.xpenatan.gdx.backends.teavm.TeaApplication; -import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; -import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; - -import java.io.InputStream; - -/** - * Stores data either in persistent storage or memory. - * - * @author noblemaster - */ -public final class FileDBManager extends FileDB { - - /** - * Persistent local store for smaller files. - */ - private final FileDBStorage localStorage; - /** - * Memory store for larger files. Will be wiped when the page is newly loaded. - */ - private final FileDBStorage memory; - - FileDBManager() { - TeaApplicationConfiguration config = ((TeaApplication)Gdx.app).getConfig(); - String storagePrefix = config.storagePrefix; - localStorage = new FileDBStorage(new StoreLocal(storagePrefix)); - memory = new FileDBStorage(new StoreMemory()); - } - - @Override - public InputStream read(TeaFileHandle file) { - if(memory.exists(file)) { - return memory.read(file); - } - else { - return localStorage.read(file); - } - } - - @Override - public byte[] readBytes(TeaFileHandle file) { - return new byte[0]; - } - - @Override - protected void writeInternal(TeaFileHandle file, byte[] data, boolean append, int expectedLength) { - // write larger files into memory: up to 16.384kb into local storage (permanent) - int localStorageMax = 16384; - if((data.length >= localStorageMax) || (append && (expectedLength >= localStorageMax))) { - // write to memory... - memory.writeInternal(file, data, append, expectedLength); - localStorage.delete(file); - } - else { - localStorage.writeInternal(file, data, append, expectedLength); - memory.delete(file); - } - } - - @Override - protected String[] paths(TeaFileHandle file) { - // combine & return the paths of memory & local storage - String[] pathsMemory = memory.paths(file); - String[] pathsLocalStorage = localStorage.paths(file); - String[] paths = new String[pathsMemory.length + pathsLocalStorage.length]; - System.arraycopy(pathsMemory, 0, paths, 0, pathsMemory.length); - System.arraycopy(pathsLocalStorage, 0, paths, pathsMemory.length, pathsLocalStorage.length); - return paths; - } - - @Override - public boolean isDirectory(TeaFileHandle file) { - if(memory.exists(file)) { - return memory.isDirectory(file); - } - else { - return localStorage.isDirectory(file); - } - } - - @Override - public void mkdirs(TeaFileHandle file) { - localStorage.mkdirs(file); - } - - @Override - public boolean exists(TeaFileHandle file) { - return memory.exists(file) || localStorage.exists(file); - } - - @Override - public boolean delete(TeaFileHandle file) { - if(memory.exists(file)) { - return memory.delete(file); - } - else { - return localStorage.delete(file); - } - } - - @Override - public boolean deleteDirectory(TeaFileHandle file) { - throw new GdxRuntimeException("Cannot delete directory (missing implementation): " + file); - } - - @Override - public long length(TeaFileHandle file) { - if(memory.exists(file)) { - return memory.length(file); - } - else { - return localStorage.length(file); - } - } - - @Override - public void rename(TeaFileHandle source, TeaFileHandle target) { - if(memory.exists(source)) { - memory.rename(source, target); - } - else { - localStorage.rename(source, target); - } - } - - @Override - public String getPath() { - return null; - } -} diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBStorage.java deleted file mode 100644 index 6a5479eb..00000000 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/FileDBStorage.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.github.xpenatan.gdx.backends.teavm.filesystem; - -import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.GdxRuntimeException; -import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; - -/** - * Local storage based file system. Stays persistent but is limited to about 2.5-5MB in general. - * - * @author noblemaster - */ -final class FileDBStorage extends FileDB { - - /** - * Our files stored and encoded as Base64. Directories with "d:..." and regular files stored as "f:...". - */ - private final Store store; - - private static final String ID_FOR_FILE = "file-f:"; - private static final String ID_FOR_DIR = "file-d:"; - /** - * The ID length should match both for files and directories. - */ - private static final int ID_LENGTH = ID_FOR_FILE.length(); - - FileDBStorage(Store store) { - this.store = store; - } - - @Override - public InputStream read(TeaFileHandle file) { - // we obtain the stored byte array - String data = store.getItem(ID_FOR_FILE + file.path()); - try { - return new ByteArrayInputStream(HEXCoder.decode(data)); - } - catch(RuntimeException e) { - // something corrupted: we remove it & re-throw the error - store.removeItem(ID_FOR_FILE + file.path()); - throw e; - } - } - - @Override - public byte[] readBytes(TeaFileHandle file) { - return new byte[0]; - } - - @Override - public void writeInternal(TeaFileHandle file, byte[] data, boolean append, int expectedLength) { - String value = HEXCoder.encode(data); - - // append to existing as needed - if(append) { - String dataCurrent = store.getItem(ID_FOR_FILE + file.path()); - if(dataCurrent != null) { - value = dataCurrent + value; - } - } - store.setItem(ID_FOR_FILE + file.path(), value); - } - - @Override - public String[] paths(TeaFileHandle file) { - String dir = file.path() + "/"; - int length = store.getLength(); - Array paths = new Array(length); - for(int i = 0; i < length; i++) { - // cut the identifier for files and directories and add to path list - String key = store.key(i); - if ((key != null) && ((key.startsWith(ID_FOR_DIR) || key.startsWith(ID_FOR_FILE)))) { - String path = key.substring(ID_LENGTH); - if(path.startsWith(dir)) { - paths.add(path); - } - } - } - return paths.toArray(String.class); - } - - @Override - public boolean isDirectory(TeaFileHandle file) { - return store.getItem(ID_FOR_DIR + file.path()) != null; - } - - @Override - public void mkdirs(TeaFileHandle file) { - // add for current path if not already a file! - if(store.getItem(ID_FOR_FILE + file.path()) == null) { - store.setItem(ID_FOR_DIR + file.path(), ""); - } - - // do for parent directories also - file = (TeaFileHandle)file.parent(); - while(file.path().length() > 0) { - store.setItem(ID_FOR_DIR + file.path(), ""); - file = (TeaFileHandle)file.parent(); - } - } - - @Override - public boolean exists(TeaFileHandle file) { - // check if either a file or directory entry exists - return (store.getItem(ID_FOR_DIR + file.path()) != null) || - (store.getItem(ID_FOR_FILE + file.path()) != null); - } - - @Override - public boolean delete(TeaFileHandle file) { - store.removeItem(ID_FOR_DIR + file.path()); - store.removeItem(ID_FOR_FILE + file.path()); - return true; - } - - @Override - public boolean deleteDirectory(TeaFileHandle file) { - throw new GdxRuntimeException("Cannot delete directory (missing implementation): " + file); - } - - @Override - public long length(TeaFileHandle file) { - // this is somewhat slow - String data = store.getItem(ID_FOR_FILE + file.path()); - if (data != null) { - // 2 HEX characters == 1 byte - return data.length() / 2; - } - else { - // no data available - return 0L; - } - } - - @Override - public void rename(TeaFileHandle source, TeaFileHandle target) { - // assuming file (not directory) - String data = store.getItem(ID_FOR_FILE + source.path()); - store.removeItem(ID_FOR_FILE + source.path()); - store.setItem(ID_FOR_FILE + target.path(), data); - } - - @Override - public String getPath() { - return null; - } -} diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java index dc130d03..83df0154 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java @@ -15,7 +15,7 @@ public class MemoryFileStorage extends FileDB { private final Array tmpPaths = new Array<>(); - public boolean debug = false; + public boolean debug = true; public MemoryFileStorage() { fileMap = new OrderedMap<>(); @@ -204,11 +204,6 @@ public void rename(TeaFileHandle source, TeaFileHandle target) { } } - @Override - public String getPath() { - return ""; - } - public String debugAllFiles() { String text = ""; text += println("####### START DEBUG FILE: " + fileMap.size + "\n"); @@ -328,7 +323,7 @@ final protected FileData getInternal(String path) { if(debug) { path = "\"" + path + "\""; String type = fileData != null && fileData.isDirectory() ? " GET FOLDER: " : " GET FILE: "; - System.out.println(getClass().getSimpleName() + type + (fileData != null) + " Size: " + fileData.getBytesSize() + " Path: " + path); + System.out.println(getClass().getSimpleName() + type + (fileData != null) + " Size: " + (fileData != null ? fileData.getBytesSize() : 0) + " Path: " + path); } return fileData; } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/Store.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/Store.java deleted file mode 100644 index be8d89cb..00000000 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/Store.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.github.xpenatan.gdx.backends.teavm.filesystem; - -/** - * Definition for a key-based file store. - * - * @author noblemaster - */ -public interface Store { - - int getLength(); - - /** The key or 'null' if it's not related to this application. */ - String key(int i); - - String getItem(String key); - - void setItem(String key, String item); - - void removeItem(String key); - - void clear(); -} diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/StoreLocal.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/StoreLocal.java deleted file mode 100644 index ca716388..00000000 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/StoreLocal.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.github.xpenatan.gdx.backends.teavm.filesystem; - -import org.teavm.jso.browser.Storage; - -/** - * Storage for data in browser's local storage (limited to a max. size of ~2.5MB). - * - * @author noblemaster - */ -class StoreLocal implements Store { - - /** - * Contains all the data. - */ - private final Storage storage; - - /** - * Prefix that makes sure multiple applications on the same server don't use the same paths. - */ - private final String prefix; - - StoreLocal(String prefix) { - storage = Storage.getLocalStorage(); - this.prefix = prefix; - } - - @Override - public int getLength() { - return storage.getLength(); - } - - @Override - public String key(int i) { - String key = storage.key(i); - if (key.startsWith(prefix)) { - return key.substring(prefix.length()); - } - else { - return null; - } - } - - @Override - public String getItem(String key) { - return storage.getItem(prefix + key); - } - - @Override - public void setItem(String key, String item) { - storage.setItem(prefix + key, item); - } - - @Override - public void removeItem(String key) { - storage.removeItem(prefix + key); - } - - @Override - public void clear() { - storage.clear(); - } -} diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/StoreMemory.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/StoreMemory.java deleted file mode 100644 index 077d417e..00000000 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/StoreMemory.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.github.xpenatan.gdx.backends.teavm.filesystem; - -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.ObjectMap; - -/** - * Storage for data in memory (RAM). The limit is on how much memory the browser will allow the JavaScript - * application. - * - * @author noblemaster - */ -class StoreMemory implements Store { - - /** - * Contains all the data. - */ - private final Array keys; - private final ObjectMap map; - - StoreMemory() { - keys = new Array(16); - map = new ObjectMap(16); - } - - @Override - public int getLength() { - return keys.size; - } - - @Override - public String key(int i) { - return keys.get(i); - } - - @Override - public String getItem(String key) { - return map.get(key); - } - - @Override - public void setItem(String key, String item) { - if(!map.containsKey(key)) { - keys.add(key); - } - map.put(key, item); - } - - @Override - public void removeItem(String key) { - keys.removeValue(key, false); - map.remove(key); - } - - @Override - public void clear() { - keys.clear(); - map.clear(); - } -} diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/InternalDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/ClasspathStorage.java similarity index 70% rename from backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/InternalDBStorage.java rename to backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/ClasspathStorage.java index 771b469f..5fd26aa4 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/InternalDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/ClasspathStorage.java @@ -2,5 +2,5 @@ import com.github.xpenatan.gdx.backends.teavm.filesystem.MemoryFileStorage; -public class InternalDBStorage extends MemoryFileStorage { +public class ClasspathStorage extends MemoryFileStorage { } \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/InternalStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/InternalStorage.java new file mode 100644 index 00000000..462a8713 --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/InternalStorage.java @@ -0,0 +1,6 @@ +package com.github.xpenatan.gdx.backends.teavm.filesystem.types; + +import com.github.xpenatan.gdx.backends.teavm.filesystem.MemoryFileStorage; + +public class InternalStorage extends MemoryFileStorage { +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java index cbe42c54..a25c0d01 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java @@ -24,11 +24,8 @@ public class LocalDBStorage extends MemoryFileStorage { private final static String KEY_OBJECT_STORE = "FILE_DATA"; - private final static String ROOT_PATH = "db/assets"; private IDBDatabase dataBase = null; - private String databaseName; - public LocalDBStorage(TeaApplication teaApplication) { setupIndexedDB(teaApplication); } @@ -41,7 +38,7 @@ private void setupIndexedDB(TeaApplication teaApplication) { teaApplication.delayInitCount++; IDBFactory instance = IDBFactory.getInstance(); - databaseName = getDatabaseName(config); + String databaseName = config.storagePrefix; IDBOpenDBRequest request = instance.open(databaseName, 1); request.setOnUpgradeNeeded(evt -> { @@ -61,28 +58,6 @@ private void setupIndexedDB(TeaApplication teaApplication) { }); } - private String getDatabaseName(TeaApplicationConfiguration config) { - String path = ROOT_PATH; - String storagePrefix = config.storagePrefix.trim(); - if(storagePrefix.endsWith("/")) { - path = storagePrefix + ROOT_PATH; - } - else { - if(storagePrefix.isEmpty()) { - path = ROOT_PATH; - } - else { - path = storagePrefix + "/" + ROOT_PATH; - } - } - return path; - } - - @Override - public String getPath() { - return databaseName; - } - @Override protected FileHandle getFilePath(String path) { return Gdx.files.local(path); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/FileWrapper.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/FileWrapper.java deleted file mode 100644 index 731a0f44..00000000 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/FileWrapper.java +++ /dev/null @@ -1,708 +0,0 @@ -package com.github.xpenatan.gdx.backends.teavm.preloader; - -import com.badlogic.gdx.Files; -import com.badlogic.gdx.Files.FileType; -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.utils.GdxRuntimeException; -import com.badlogic.gdx.utils.StreamUtils; -import java.io.BufferedInputStream; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.Reader; -import java.io.UnsupportedEncodingException; -import java.io.Writer; - -/** - * @author xpenatan - */ -public class FileWrapper { - protected File file; - protected FileType type; - - protected FileWrapper() { - } - - /** - * Creates a new absolute FileHandle for the file name. Use this for tools on the desktop that don't need any of the backends. - * Do not use this constructor in case you write something cross-platform. Use the {@link Files} interface instead. - * - * @param fileName the filename. - */ - public FileWrapper(String fileName) { - this.file = new File(fileName); - this.type = FileType.Absolute; - } - - /** - * Creates a new absolute FileHandle for the {@link File}. Use this for tools on the desktop that don't need any of the - * backends. Do not use this constructor in case you write something cross-platform. Use the {@link Files} interface instead. - * - * @param file the file. - */ - public FileWrapper(File file) { - this.file = file; - this.type = FileType.Absolute; - } - - protected FileWrapper(String fileName, FileType type) { - this.type = type; - file = new File(fileName); - } - - protected FileWrapper(File file, FileType type) { - this.file = file; - this.type = type; - } - - public String path() { - return file.getPath(); - } - - public String name() { - return file.getName(); - } - - public String extension() { - String name = file.getName(); - int dotIndex = name.lastIndexOf('.'); - if(dotIndex == -1) return ""; - return name.substring(dotIndex + 1); - } - - public String nameWithoutExtension() { - String name = file.getName(); - int dotIndex = name.lastIndexOf('.'); - if(dotIndex == -1) return name; - return name.substring(0, dotIndex); - } - - public FileType type() { - return type; - } - - /** - * Returns a java.io.File that represents this file handle. Note the returned file will only be usable for - * {@link FileType#Absolute} and {@link FileType#External} file handles. - */ - public File file() { - if(type == FileType.External) return new File(Gdx.files.getExternalStoragePath(), file.getPath()); - return file; - } - - /** - * Returns a stream for reading this file as bytes. - * - * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. - */ - public InputStream read() { - if(type == FileType.Classpath || (type == FileType.Internal && !file.exists()) - || (type == FileType.Local && !file.exists())) { - InputStream input = FileWrapper.class.getResourceAsStream("/" + file.getPath().replace('\\', '/')); - if(input == null) throw new GdxRuntimeException("File not found: " + file + " (" + type + ")"); - return input; - } - try { - return new FileInputStream(file()); - } - catch(Exception ex) { - if(file().isDirectory()) - throw new GdxRuntimeException("Cannot open a stream to a directory: " + file + " (" + type + ")", ex); - throw new GdxRuntimeException("Error reading file: " + file + " (" + type + ")", ex); - } - } - - /** - * Returns a buffered stream for reading this file as bytes. - * - * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. - */ - public BufferedInputStream read(int bufferSize) { - return new BufferedInputStream(read(), bufferSize); - } - - /** - * Returns a reader for reading this file as characters. - * - * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. - */ - public Reader reader() { - return new InputStreamReader(read()); - } - - /** - * Returns a reader for reading this file as characters. - * - * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. - */ - public Reader reader(String charset) { - try { - return new InputStreamReader(read(), charset); - } - catch(UnsupportedEncodingException ex) { - throw new GdxRuntimeException("Error reading file: " + this, ex); - } - } - - /** - * Returns a buffered reader for reading this file as characters. - * - * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. - */ - public BufferedReader reader(int bufferSize) { - return new BufferedReader(new InputStreamReader(read()), bufferSize); - } - - /** - * Returns a buffered reader for reading this file as characters. - * - * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. - */ - public BufferedReader reader(int bufferSize, String charset) { - try { - return new BufferedReader(new InputStreamReader(read(), charset), bufferSize); - } - catch(UnsupportedEncodingException ex) { - throw new GdxRuntimeException("Error reading file: " + this, ex); - } - } - - /** - * Reads the entire file into a string using the platform's default charset. - * - * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. - */ - public String readString() { - return readString(null); - } - - /** - * Reads the entire file into a string using the specified charset. - * - * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. - */ - public String readString(String charset) { - int fileLength = (int)length(); - if(fileLength == 0) fileLength = 512; - StringBuilder output = new StringBuilder(fileLength); - InputStreamReader reader = null; - try { - if(charset == null) - reader = new InputStreamReader(read()); - else - reader = new InputStreamReader(read(), charset); - char[] buffer = new char[256]; - while(true) { - int length = reader.read(buffer); - if(length == -1) break; - output.append(buffer, 0, length); - } - } - catch(IOException ex) { - throw new GdxRuntimeException("Error reading layout file: " + this, ex); - } - finally { - StreamUtils.closeQuietly(reader); - } - return output.toString(); - } - - /** - * Reads the entire file into a byte array. - * - * @throws GdxRuntimeException if the file handle represents a directory, doesn't exist, or could not be read. - */ - public byte[] readBytes() { - int length = (int)length(); - if(length == 0) length = 512; - byte[] buffer = new byte[length]; - int position = 0; - InputStream input = read(); - try { - while(true) { - int count = input.read(buffer, position, buffer.length - position); - if(count == -1) break; - position += count; - if(position == buffer.length) { - // Grow buffer. - byte[] newBuffer = new byte[buffer.length * 2]; - System.arraycopy(buffer, 0, newBuffer, 0, position); - buffer = newBuffer; - } - } - } - catch(IOException ex) { - throw new GdxRuntimeException("Error reading file: " + this, ex); - } - finally { - try { - if(input != null) input.close(); - } - catch(IOException ignored) { - } - } - if(position < buffer.length) { - // Shrink buffer. - byte[] newBuffer = new byte[position]; - System.arraycopy(buffer, 0, newBuffer, 0, position); - buffer = newBuffer; - } - return buffer; - } - - /** - * Reads the entire file into the byte array. The byte array must be big enough to hold the file's data. - * - * @param bytes the array to load the file into - * @param offset the offset to start writing bytes - * @param size the number of bytes to read, see {@link #length()} - * @return the number of read bytes - */ - public int readBytes(byte[] bytes, int offset, int size) { - InputStream input = read(); - int position = 0; - try { - while(true) { - int count = input.read(bytes, offset + position, size - position); - if(count <= 0) break; - position += count; - } - } - catch(IOException ex) { - throw new GdxRuntimeException("Error reading file: " + this, ex); - } - finally { - try { - if(input != null) input.close(); - } - catch(IOException ignored) { - } - } - return position - offset; - } - - /** - * Returns a stream for writing to this file. Parent directories will be created if necessary. - * - * @param append If false, this file will be overwritten if it exists, otherwise it will be appended. - * @throws GdxRuntimeException if this file handle represents a directory, if it is a {@link FileType#Classpath} or - * {@link FileType#Internal} file, or if it could not be written. - */ - public OutputStream write(boolean append) { - if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot write to a classpath file: " + file); - if(type == FileType.Internal) throw new GdxRuntimeException("Cannot write to an internal file: " + file); - parent().mkdirs(); - try { - return new FileOutputStream(file(), append); - } - catch(Exception ex) { - if(file().isDirectory()) - throw new GdxRuntimeException("Cannot open a stream to a directory: " + file + " (" + type + ")", ex); - throw new GdxRuntimeException("Error writing file: " + file + " (" + type + ")", ex); - } - } - - /** - * Reads the remaining bytes from the specified stream and writes them to this file. The stream is closed. Parent directories - * will be created if necessary. - * - * @param append If false, this file will be overwritten if it exists, otherwise it will be appended. - * @throws GdxRuntimeException if this file handle represents a directory, if it is a {@link FileType#Classpath} or - * {@link FileType#Internal} file, or if it could not be written. - */ - public void write(InputStream input, boolean append) { - OutputStream output = null; - try { - output = write(append); - byte[] buffer = new byte[4096]; - while(true) { - int length = input.read(buffer); - if(length == -1) break; - output.write(buffer, 0, length); - } - } - catch(Exception ex) { - throw new GdxRuntimeException("Error stream writing to file: " + file + " (" + type + ")", ex); - } - finally { - try { - if(input != null) input.close(); - } - catch(Exception ignored) { - } - try { - if(output != null) output.close(); - } - catch(Exception ignored) { - } - } - } - - /** - * Returns a writer for writing to this file using the default charset. Parent directories will be created if necessary. - * - * @param append If false, this file will be overwritten if it exists, otherwise it will be appended. - * @throws GdxRuntimeException if this file handle represents a directory, if it is a {@link FileType#Classpath} or - * {@link FileType#Internal} file, or if it could not be written. - */ - public Writer writer(boolean append) { - return writer(append, null); - } - - /** - * Returns a writer for writing to this file. Parent directories will be created if necessary. - * - * @param append If false, this file will be overwritten if it exists, otherwise it will be appended. - * @param charset May be null to use the default charset. - * @throws GdxRuntimeException if this file handle represents a directory, if it is a {@link FileType#Classpath} or - * {@link FileType#Internal} file, or if it could not be written. - */ - public Writer writer(boolean append, String charset) { - if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot write to a classpath file: " + file); - if(type == FileType.Internal) throw new GdxRuntimeException("Cannot write to an internal file: " + file); - parent().mkdirs(); - try { - FileOutputStream output = new FileOutputStream(file(), append); - if(charset == null) - return new OutputStreamWriter(output); - else - return new OutputStreamWriter(output, charset); - } - catch(IOException ex) { - if(file().isDirectory()) - throw new GdxRuntimeException("Cannot open a stream to a directory: " + file + " (" + type + ")", ex); - throw new GdxRuntimeException("Error writing file: " + file + " (" + type + ")", ex); - } - } - - /** - * Writes the specified string to the file using the default charset. Parent directories will be created if necessary. - * - * @param append If false, this file will be overwritten if it exists, otherwise it will be appended. - * @throws GdxRuntimeException if this file handle represents a directory, if it is a {@link FileType#Classpath} or - * {@link FileType#Internal} file, or if it could not be written. - */ - public void writeString(String string, boolean append) { - writeString(string, append, null); - } - - /** - * Writes the specified string to the file as UTF-8. Parent directories will be created if necessary. - * - * @param append If false, this file will be overwritten if it exists, otherwise it will be appended. - * @param charset May be null to use the default charset. - * @throws GdxRuntimeException if this file handle represents a directory, if it is a {@link FileType#Classpath} or - * {@link FileType#Internal} file, or if it could not be written. - */ - public void writeString(String string, boolean append, String charset) { - Writer writer = null; - try { - writer = writer(append, charset); - writer.write(string); - } - catch(Exception ex) { - throw new GdxRuntimeException("Error writing file: " + file + " (" + type + ")", ex); - } - finally { - StreamUtils.closeQuietly(writer); - } - } - - /** - * Writes the specified bytes to the file. Parent directories will be created if necessary. - * - * @param append If false, this file will be overwritten if it exists, otherwise it will be appended. - * @throws GdxRuntimeException if this file handle represents a directory, if it is a {@link FileType#Classpath} or - * {@link FileType#Internal} file, or if it could not be written. - */ - public void writeBytes(byte[] bytes, boolean append) { - OutputStream output = write(append); - try { - output.write(bytes); - } - catch(IOException ex) { - throw new GdxRuntimeException("Error writing file: " + file + " (" + type + ")", ex); - } - finally { - try { - output.close(); - } - catch(IOException ignored) { - } - } - } - - /** - * Writes the specified bytes to the file. Parent directories will be created if necessary. - * - * @param append If false, this file will be overwritten if it exists, otherwise it will be appended. - * @throws GdxRuntimeException if this file handle represents a directory, if it is a {@link FileType#Classpath} or - * {@link FileType#Internal} file, or if it could not be written. - */ - public void writeBytes(byte[] bytes, int offset, int length, boolean append) { - OutputStream output = write(append); - try { - output.write(bytes, offset, length); - } - catch(IOException ex) { - throw new GdxRuntimeException("Error writing file: " + file + " (" + type + ")", ex); - } - finally { - try { - output.close(); - } - catch(IOException ignored) { - } - } - } - - /** - * Returns the paths to the children of this directory. Returns an empty list if this file handle represents a file and not a - * directory. On the desktop, an {@link FileType#Internal} handle to a directory on the classpath will return a zero length - * array. - * - * @throws GdxRuntimeException if this file is an {@link FileType#Classpath} file. - */ - public FileWrapper[] list() { - if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot list a classpath directory: " + file); - String[] relativePaths = file().list(); - if(relativePaths == null) return new FileWrapper[0]; - FileWrapper[] handles = new FileWrapper[relativePaths.length]; - for(int i = 0, n = relativePaths.length; i < n; i++) - handles[i] = child(relativePaths[i]); - return handles; - } - - /** - * Returns the paths to the children of this directory with the specified suffix. Returns an empty list if this file handle - * represents a file and not a directory. On the desktop, an {@link FileType#Internal} handle to a directory on the classpath - * will return a zero length array. - * - * @throws GdxRuntimeException if this file is an {@link FileType#Classpath} file. - */ - public FileWrapper[] list(String suffix) { - if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot list a classpath directory: " + file); - String[] relativePaths = file().list(); - if(relativePaths == null) return new FileWrapper[0]; - FileWrapper[] handles = new FileWrapper[relativePaths.length]; - int count = 0; - for(int i = 0, n = relativePaths.length; i < n; i++) { - String path = relativePaths[i]; - if(!path.endsWith(suffix)) continue; - handles[count] = child(path); - count++; - } - if(count < relativePaths.length) { - FileWrapper[] newHandles = new FileWrapper[count]; - System.arraycopy(handles, 0, newHandles, 0, count); - handles = newHandles; - } - return handles; - } - - /** - * Returns true if this file is a directory. Always returns false for classpath files. On Android, an {@link FileType#Internal} - * handle to an empty directory will return false. On the desktop, an {@link FileType#Internal} handle to a directory on the - * classpath will return false. - */ - public boolean isDirectory() { - if(type == FileType.Classpath) return false; - return file().isDirectory(); - } - - /** - * Returns a handle to the child with the specified name. - * - * @throws GdxRuntimeException if this file handle is a {@link FileType#Classpath} or {@link FileType#Internal} and the child - * doesn't exist. - */ - public FileWrapper child(String name) { - if(file.getPath().length() == 0) return new FileWrapper(new File(name), type); - return new FileWrapper(new File(file, name), type); - } - - public FileWrapper parent() { - File parent = file.getParentFile(); - if(parent == null) { - if(type == FileType.Absolute) - parent = new File("/"); - else - parent = new File(""); - } - return new FileWrapper(parent, type); - } - - /** - * @throws GdxRuntimeException if this file handle is a {@link FileType#Classpath} or {@link FileType#Internal} file. - */ - public boolean mkdirs() { - if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot mkdirs with a classpath file: " + file); - if(type == FileType.Internal) throw new GdxRuntimeException("Cannot mkdirs with an internal file: " + file); - return file().mkdirs(); - } - - /** - * Returns true if the file exists. On Android, a {@link FileType#Classpath} or {@link FileType#Internal} handle to a directory - * will always return false. - */ - public boolean exists() { - switch(type) { - case Internal: - if(file.exists()) return true; - // Fall through. - case Classpath: - return FileWrapper.class.getResource("/" + file.getPath().replace('\\', '/')) != null; - } - return file().exists(); - } - - /** - * Deletes this file or empty directory and returns success. Will not delete a directory that has children. - * - * @throws GdxRuntimeException if this file handle is a {@link FileType#Classpath} or {@link FileType#Internal} file. - */ - public boolean delete() { - if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot delete a classpath file: " + file); - if(type == FileType.Internal) throw new GdxRuntimeException("Cannot delete an internal file: " + file); - return file().delete(); - } - - /** - * Deletes this file or directory and all children, recursively. - * - * @throws GdxRuntimeException if this file handle is a {@link FileType#Classpath} or {@link FileType#Internal} file. - */ - public boolean deleteDirectory() { - if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot delete a classpath file: " + file); - if(type == FileType.Internal) throw new GdxRuntimeException("Cannot delete an internal file: " + file); - return deleteDirectory(file()); - } - - /** - * Copies this file or directory to the specified file or directory. If this handle is a file, then 1) if the destination is a - * file, it is overwritten, or 2) if the destination is a directory, this file is copied into it, or 3) if the destination - * doesn't exist, {@link #mkdirs()} is called on the destination's parent and this file is copied into it with a new name. If - * this handle is a directory, then 1) if the destination is a file, GdxRuntimeException is thrown, or 2) if the destination is - * a directory, this directory is copied into it recursively, overwriting existing files, or 3) if the destination doesn't - * exist, {@link #mkdirs()} is called on the destination and this directory is copied into it recursively. - * - * @throws GdxRuntimeException if the destination file handle is a {@link FileType#Classpath} or {@link FileType#Internal} file, - * or copying failed. - */ - public void copyTo(FileWrapper dest) { - boolean sourceDir = isDirectory(); - if(!sourceDir) { - if(dest.isDirectory()) dest = dest.child(name()); - copyFile(this, dest); - return; - } - if(dest.exists()) { - if(!dest.isDirectory()) throw new GdxRuntimeException("Destination exists but is not a directory: " + dest); - } - else { - dest.mkdirs(); - if(!dest.isDirectory()) throw new GdxRuntimeException("Destination directory cannot be created: " + dest); - } - if(!sourceDir) dest = dest.child(name()); - copyDirectory(this, dest); - } - - /** - * Moves this file to the specified file, overwriting the file if it already exists. - * - * @throws GdxRuntimeException if the source or destination file handle is a {@link FileType#Classpath} or - * {@link FileType#Internal} file. - */ - public void moveTo(FileWrapper dest) { - if(type == FileType.Classpath) throw new GdxRuntimeException("Cannot move a classpath file: " + file); - if(type == FileType.Internal) throw new GdxRuntimeException("Cannot move an internal file: " + file); - copyTo(dest); - delete(); - } - - /** - * Returns the length in bytes of this file, or 0 if this file is a directory, does not exist, or the size cannot otherwise be - * determined. - */ - public long length() { - return file().length(); - } - - /** - * Returns the last modified time in milliseconds for this file. Zero is returned if the file doesn't exist. Zero is returned - * for {@link FileType#Classpath} files. On Android, zero is returned for {@link FileType#Internal} files. On the desktop, zero - * is returned for {@link FileType#Internal} files on the classpath. - */ - public long lastModified() { - return file().lastModified(); - } - - public String toString() { - return file.getPath(); - } - - static public FileWrapper tempFile(String prefix) { - try { - return new FileWrapper(File.createTempFile(prefix, null)); - } - catch(IOException ex) { - throw new GdxRuntimeException("Unable to create temp file.", ex); - } - } - - static public FileWrapper tempDirectory(String prefix) { - try { - File file = File.createTempFile(prefix, null); - if(!file.delete()) throw new IOException("Unable to delete temp file: " + file); - if(!file.mkdir()) throw new IOException("Unable to create temp directory: " + file); - return new FileWrapper(file); - } - catch(IOException ex) { - throw new GdxRuntimeException("Unable to create temp file.", ex); - } - } - - static private boolean deleteDirectory(File file) { - if(file.exists()) { - File[] files = file.listFiles(); - if(files != null) { - for(int i = 0, n = files.length; i < n; i++) { - if(files[i].isDirectory()) - deleteDirectory(files[i]); - else - files[i].delete(); - } - } - } - return file.delete(); - } - - static private void copyFile(FileWrapper source, FileWrapper dest) { - try { - dest.write(source.read(), false); - } - catch(Exception ex) { - throw new GdxRuntimeException("Error copying source file: " + source.file + " (" + source.type + ")\n" // - + "To destination: " + dest.file + " (" + dest.type + ")", ex); - } - } - - static private void copyDirectory(FileWrapper sourceDir, FileWrapper destDir) { - destDir.mkdirs(); - FileWrapper[] files = sourceDir.list(); - for(int i = 0, n = files.length; i < n; i++) { - FileWrapper srcFile = files[i]; - FileWrapper destFile = destDir.child(srcFile.name()); - if(srcFile.isDirectory()) - copyDirectory(srcFile, destFile); - else - copyFile(srcFile, destFile); - } - } -} diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java index 103b342a..761a9bf5 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java @@ -5,9 +5,6 @@ import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.GdxRuntimeException; -import com.badlogic.gdx.utils.ObjectMap; -import com.badlogic.gdx.utils.ObjectMap.Entries; -import com.badlogic.gdx.utils.ObjectMap.Entry; import com.badlogic.gdx.utils.StreamUtils; import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; import com.github.xpenatan.gdx.backends.teavm.TeaApplication; @@ -27,15 +24,8 @@ import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; import com.github.xpenatan.gdx.backends.teavm.filesystem.FileData; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileFilter; -import java.io.FilenameFilter; import java.io.IOException; -import java.io.InputStream; import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.nio.charset.StandardCharsets; import org.teavm.jso.core.JSArray; import org.teavm.jso.core.JSArrayReader; import org.teavm.jso.core.JSPromise; @@ -44,35 +34,10 @@ * @author xpenatan */ public class Preloader { - public ObjectMap directories = new ObjectMap<>(); - public ObjectMap images = new ObjectMap<>(); - public ObjectMap audio = new ObjectMap<>(); - public ObjectMap texts = new ObjectMap<>(); - public ObjectMap binaries = new ObjectMap<>(); - public ObjectMap assetNames = new ObjectMap<>(); - public Array assets = new Array<>(); public int assetTotal = -1; private static final String ASSET_FOLDER = "assets/"; - public static class Asset { - public Asset(String url, AssetType type, long size, String mimeType) { - this.url = url; - this.type = type; - this.size = size; - this.mimeType = mimeType; - } - - public boolean succeed; - public boolean failed; - public boolean isLoading; - public long loaded; - public final String url; - public final AssetType type; - public final long size; - public final String mimeType; - } - public final String baseUrl; public Preloader(String newBaseURL, HTMLCanvasElementWrapper canvas, TeaApplication teaApplication) { @@ -166,7 +131,7 @@ private void downloadDroppedFile(TeaApplicationConfiguration config, FileListWra } } - public String getAssetUrl() { + private String getAssetUrl() { return baseUrl + ASSET_FOLDER; } @@ -185,57 +150,7 @@ public void onFailure(String url) { public boolean onSuccess(String url, String result) { String[] lines = result.split("\n"); - if(config.useNewFileHandle) { - assetTotal = lines.length; - - for(String line : lines) { - String[] tokens = line.split(":"); - String assetUrl = tokens[1].trim(); - if(assetUrl.trim().isEmpty()) { - continue; - } - - TeaFiles files = (TeaFiles)Gdx.files; - - AssetDownloader.getInstance().load(true, getAssetUrl() + assetUrl, AssetType.Binary, null, new AssetLoaderListener() { - @Override - public void onProgress(double amount) { - } - - @Override - public void onFailure(String urll) { - } - - @Override - public boolean onSuccess(String urll, Object result) { - Blob blob = (Blob)result; - String fileType = tokens[0]; - boolean isDirectory = fileType.equals("d"); - if(isDirectory) { - TeaFileHandle internalFile = (TeaFileHandle)Gdx.files.internal(assetUrl); - internalFile.mkdirsInternal(); - } - else { - Int8ArrayWrapper data = blob.getData(); - byte[] byteArray = TypedArrays.toByteArray(data); - FileHandle internalFile = Gdx.files.internal(assetUrl); - OutputStream output = internalFile.write(false, 4096); - try { - output.write(byteArray); - } - catch(IOException ex) { - throw new GdxRuntimeException("Error writing file: " + internalFile + " (" + internalFile.type() + ")", ex); - } - finally { - StreamUtils.closeQuietly(output); - } - } - return false; - } - }); - } - return false; - } + assetTotal = lines.length; for(String line : lines) { String[] tokens = line.split(":"); @@ -243,112 +158,71 @@ public boolean onSuccess(String urll, Object result) { throw new GdxRuntimeException("Invalid assets description file."); } - String fileType = tokens[0]; - String assetUrl = tokens[1].trim(); - long size = Long.parseLong(tokens[2]); - String mimeType = tokens[3]; - - AssetType type = AssetType.Text; - if(fileType.equals("i")) type = AssetType.Image; - if(fileType.equals("b")) type = AssetType.Binary; - if(fileType.equals("a")) type = AssetType.Audio; - if(fileType.equals("d")) type = AssetType.Directory; - - if(type == AssetType.Audio && !AssetDownloader.getInstance().isUseBrowserCache()) { - size = 0; + String assetUrl = tokens[2].trim(); + assetUrl = assetUrl.trim(); + if(assetUrl.isEmpty()) { + continue; } - Asset asset = new Asset(assetUrl, type, size, mimeType); - assetNames.put(asset.url, asset.url); - assets.add(asset); - } - assetTotal = assets.size; + String fileTypeStr = tokens[0]; + String assetTypeStr = tokens[1]; - if(config.preloadAssets) { - for(int i = 0; i < assets.size; i++) { - final Asset asset = assets.get(i); - loadSingleAsset(asset); + FileType fileType = FileType.Internal; + if(fileTypeStr.equals("c")) { + fileType = FileType.Classpath; } + else if(fileTypeStr.equals("l")) { + fileType = FileType.Local; + } + AssetType assetType = AssetType.Binary; + if(assetTypeStr.equals("d")) assetType = AssetType.Directory; + + loadAsset(assetType, fileType, assetUrl); } return false; } }); } - public int loadAssets() { - int assetsToDownload = 0; - for(int i = 0; i < assets.size; i++) { - final Asset asset = assets.get(i); - if(loadSingleAsset(asset)) { - assetsToDownload++; - } - } - return assetsToDownload; - } - - public boolean loadSingleAsset(Asset asset) { - if(contains(asset.url)) { - asset.loaded = asset.size; - asset.succeed = true; - asset.failed = false; - asset.isLoading = false; - return false; - } - - if(!asset.isLoading) { - asset.failed = false; - asset.succeed = false; - asset.isLoading = true; - loadAsset(true, asset.url, asset.type, asset.mimeType, new AssetLoaderListener() { - @Override - public void onProgress(double amount) { - asset.loaded = (long)amount; - } - - @Override - public void onFailure(String url) { - asset.failed = true; - asset.isLoading = false; - } - - @Override - public boolean onSuccess(String url, Object result) { - asset.succeed = true; - asset.isLoading = false; - return false; - } - }); - return true; + public void loadAsset(AssetType assetType, FileType fileType, String path1) { + path1 = path1.trim().replace("\\", "/"); + if(path1.startsWith("/")) { + path1 = path1.substring(1); } - return false; - } - - public Asset getAsset(String path) { - for(int i = 0; i < assets.size; i++) { - final Asset asset = assets.get(i); - String url = asset.url; - if(path.equals(url)) { - return asset; - } + if(path1.isEmpty()) { + return; } - return null; - } - - private void loadAsset(boolean async, final String url, final AssetType type, final String mimeType, final AssetLoaderListener listener) { - AssetDownloader.getInstance().load(async, getAssetUrl() + url, type, mimeType, new AssetLoaderListener() { + String path = path1; + AssetDownloader.getInstance().load(true, getAssetUrl() + path, AssetType.Binary, null, new AssetLoaderListener<>() { @Override public void onProgress(double amount) { - listener.onProgress(amount); } @Override - public void onFailure(String urll) { - listener.onFailure(urll); + public void onFailure(String url) { } @Override - public boolean onSuccess(String urll, Object result) { - putAssetInMap(type, url, result); - listener.onSuccess(urll, result); + public boolean onSuccess(String url, Object result) { + Blob blob = (Blob)result; + AssetType type = AssetType.Binary; + TeaFileHandle internalFile = (TeaFileHandle)Gdx.files.getFileHandle(path, fileType); + if(assetType == AssetType.Directory) { + internalFile.mkdirsInternal(); + } + else { + Int8ArrayWrapper data = blob.getData(); + byte[] byteArray = TypedArrays.toByteArray(data); + OutputStream output = internalFile.write(false, 4096); + try { + output.write(byteArray); + } + catch(IOException ex) { + throw new GdxRuntimeException("Error writing file: " + internalFile + " (" + internalFile.type() + ")", ex); + } + finally { + StreamUtils.closeQuietly(output); + } + } return false; } }); @@ -358,179 +232,7 @@ public void loadScript(boolean async, final String url, final AssetLoaderListene AssetDownloader.getInstance().loadScript(async, getAssetUrl() + url, listener); } - protected void putAssetInMap(AssetType type, String url, Object result) { - switch(type) { - case Text: - texts.put(url, (String)result); - break; - case Image: - images.put(url, (Blob)result); - break; - case Binary: - binaries.put(url, (Blob)result); - break; - case Audio: - audio.put(url, (Blob)result); - break; - case Directory: - directories.put(url, null); - break; - } - } - - public InputStream read(String url) { - if(texts.containsKey(url)) { - try { - return new ByteArrayInputStream(texts.get(url).getBytes("UTF-8")); - } - catch(UnsupportedEncodingException e) { - return null; - } - } - if(images.containsKey(url)) { - return new ByteArrayInputStream(new byte[1]); // FIXME, sensible? - } - if(binaries.containsKey(url)) { - return binaries.get(url).read(); - } - if(audio.containsKey(url)) { - return new ByteArrayInputStream(new byte[1]); // FIXME, sensible? - } - return null; - } - - public boolean contains(String file) { - return texts.containsKey(file) || images.containsKey(file) || binaries.containsKey(file) || audio.containsKey(file) - || directories.containsKey(file); - } - - public boolean isText(String url) { - return texts.containsKey(url); - } - - public boolean isImage(String url) { - return images.containsKey(url); - } - - public boolean isBinary(String url) { - return binaries.containsKey(url); - } - - public boolean isAudio(String url) { - return audio.containsKey(url); - } - - public boolean isDirectory(String url) { - return directories.containsKey(url); - } - - private boolean isChild(String filePath, String directory) { - return filePath.startsWith(directory + "/"); - } - - public FileHandle[] list(final String file) { - return getMatchedAssetFiles(new FilePathFilter() { - @Override - public boolean accept(String path) { - return isChild(path, file); - } - }); - } - - public FileHandle[] list(final String file, final FileFilter filter) { - return getMatchedAssetFiles(new FilePathFilter() { - @Override - public boolean accept(String path) { - return isChild(path, file) && filter.accept(new File(path)); - } - }); - } - - public FileHandle[] list(final String file, final FilenameFilter filter) { - return getMatchedAssetFiles(new FilePathFilter() { - @Override - public boolean accept(String path) { - return isChild(path, file) && filter.accept(new File(file), path.substring(file.length() + 1)); - } - }); - } - - public FileHandle[] list(final String file, final String suffix) { - return getMatchedAssetFiles(new FilePathFilter() { - @Override - public boolean accept(String path) { - return isChild(path, file) && path.endsWith(suffix); - } - }); - } - - public long length(String file) { - if(texts.containsKey(file)) { - return texts.get(file).getBytes(StandardCharsets.UTF_8).length; - } - if(images.containsKey(file)) { - return 1; // FIXME, sensible? - } - if(binaries.containsKey(file)) { - return binaries.get(file).length(); - } - if(audio.containsKey(file)) { - return audio.get(file).length(); - } - return 0; - } - - private interface FilePathFilter { - boolean accept(String path); - } - - private FileHandle[] getMatchedAssetFiles(FilePathFilter filter) { - Array files = new Array<>(); - for(String file : texts.keys()) { - if(filter.accept(file)) { - files.add(new TeaFileHandle(this, null, file, FileType.Internal)); - } - } - for(String file : images.keys()) { - if(filter.accept(file)) { - files.add(new TeaFileHandle(this, null, file, FileType.Internal)); - } - } - for(String file : binaries.keys()) { - if(filter.accept(file)) { - files.add(new TeaFileHandle(this, null, file, FileType.Internal)); - } - } - for(String file : audio.keys()) { - if(filter.accept(file)) { - files.add(new TeaFileHandle(this, null, file, FileType.Internal)); - } - } - FileHandle[] filesArray = new FileHandle[files.size]; - System.arraycopy(files.items, 0, filesArray, 0, filesArray.length); - return filesArray; - } - public int getQueue() { return AssetDownloader.getInstance().getQueue(); } - - public void printLoadedAssets() { - System.out.println("### Text Assets: "); - printKeys(texts); - System.out.println("##########"); - System.out.println("### Image Assets: "); - printKeys(images); - System.out.println("##########"); - } - - private void printKeys(ObjectMap map) { - Entries iterator = map.iterator(); - - while(iterator.hasNext) { - Entry next = iterator.next(); - String key = next.key; - System.out.println("Key: " + key); - } - } -} +} \ No newline at end of file diff --git a/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java b/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java index 171d821e..4389adc1 100644 --- a/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java +++ b/backends/backend-teavm/src/test/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorageTest.java @@ -3,28 +3,22 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; -import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; import com.github.xpenatan.gdx.backends.teavm.TeaFiles; -import com.github.xpenatan.gdx.backends.teavm.filesystem.types.InternalDBStorage; import com.google.common.truth.Truth; import org.junit.Before; import org.junit.Test; public class MemoryFileStorageTest { - private InternalDBStorage internalStorage; + private MemoryFileStorage internalStorage; @Before public void setUp() { TeaApplicationConfiguration config = new TeaApplicationConfiguration(""); - TeaFiles teaFiles = new TeaFiles(config, null, null) { - @Override - public FileHandle local(String path) { - return new TeaFileHandle(null, internalStorage, path, FileType.Local); - } - }; + TeaFiles teaFiles = new TeaFiles(config, null); + internalStorage= new MemoryFileStorage(); + teaFiles.localStorage = internalStorage; Gdx.files = teaFiles; - internalStorage = teaFiles.internalStorage; // internalStorage.debug = true; } diff --git a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java index e4d3f1c9..3e36ca1f 100644 --- a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java +++ b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java @@ -109,35 +109,35 @@ private void testLocalPath() { message += "\nLocal storage available\n"; message += "Local storage path: " + Gdx.files.getLocalStoragePath() + "\n\n"; -// { -// // Test multiple subfolder -// FileHandle subFolder = Gdx.files.local("rootFolder/childFolder/subFolder/"); -// FileHandle childFolder1 = Gdx.files.local("rootFolder/childFolder/"); -// FileHandle childFolder2 = Gdx.files.local("rootFolder/childFolder"); -// FileHandle rootFolder1 = Gdx.files.local("rootFolder/"); -// FileHandle rootFolder2 = Gdx.files.local("rootFolder"); -// -// boolean exists = rootFolder1.exists(); -// -// message += "subFolder: " + subFolder + " exists: " + subFolder.exists() + "\n"; -// message += "childFolder1: " + childFolder1 + " exists: " + childFolder1.exists() + "\n"; -// message += "childFolder2: " + childFolder2 + " exists: " + childFolder2.exists() + "\n"; -// message += "rootFolder1: " + rootFolder1 + " exists: " + exists + "\n"; -// message += "rootFolder2: " + rootFolder2 + " exists: " + rootFolder2.exists() + "\n"; -// -// subFolder.mkdirs(); -// -// if(exists) { -// FileHandle[] list = rootFolder1.list(); -// for(int i = 0; i < list.length; i++) { -// FileHandle fileHandle = list[i]; -// System.out.println("FOLDER LIST: " + fileHandle); -// } -// boolean delete = rootFolder1.deleteDirectory(); -// System.out.println("Deleted: " + delete + " " + rootFolder1); -// } -// -// } + { + // Test multiple subfolder + FileHandle subFolder = Gdx.files.local("rootFolder/childFolder/subFolder/"); + FileHandle childFolder1 = Gdx.files.local("rootFolder/childFolder/"); + FileHandle childFolder2 = Gdx.files.local("rootFolder/childFolder"); + FileHandle rootFolder1 = Gdx.files.local("rootFolder/"); + FileHandle rootFolder2 = Gdx.files.local("rootFolder"); + + boolean exists = rootFolder1.exists(); + + message += "subFolder: " + subFolder + " exists: " + subFolder.exists() + "\n"; + message += "childFolder1: " + childFolder1 + " exists: " + childFolder1.exists() + "\n"; + message += "childFolder2: " + childFolder2 + " exists: " + childFolder2.exists() + "\n"; + message += "rootFolder1: " + rootFolder1 + " exists: " + exists + "\n"; + message += "rootFolder2: " + rootFolder2 + " exists: " + rootFolder2.exists() + "\n"; + + subFolder.mkdirs(); + + if(exists) { + FileHandle[] list = rootFolder1.list(); + for(int i = 0; i < list.length; i++) { + FileHandle fileHandle = list[i]; + System.out.println("FOLDER LIST: " + fileHandle); + } + boolean delete = rootFolder1.deleteDirectory(); + System.out.println("Deleted: " + delete + " " + rootFolder1); + } + + } message += "\n"; { // Test file in subfolder @@ -167,76 +167,76 @@ private void testLocalPath() { } message += "\n"; -// BufferedWriter out = null; -// boolean canDelete = false; -// try { -// FileHandle testFile = Gdx.files.local("test.txt"); -// boolean exists = testFile.exists(); -// canDelete = exists; -// message += "text.txt exists: " + exists + "\n"; -// -// testFile.writeString("test", false); -// -// } catch(GdxRuntimeException ex) { -// message += "Couldn't open localstorage/test.txt\n"; -// } finally { -// StreamUtils.closeQuietly(out); -// } -// -// try { -// String s = Gdx.files.local("test.txt").readString(); -// message += "Open local success\n"; -// } catch(Throwable e) { -// message += "Couldn't open localstorage/test.txt\n" + e.getMessage() + "\n"; -// } -// -// BufferedReader in = null; -// try { -// FileHandle testFile = Gdx.files.local("test.txt"); -// InputStream read = testFile.read(); -// in = new BufferedReader(new InputStreamReader(read)); -// if(!in.readLine().equals("test")) -// message += "Read result wrong\n"; -// else -// message += "Read local success\n"; -// } catch(GdxRuntimeException ex) { -// message += "Couldn't open localstorage/test.txt\n"; -// } catch(Throwable e) { -// message += "Couldn't read localstorage/test.txt\n"; -// } finally { -// StreamUtils.closeQuietly(in); -// } -// -// try { -// byte[] testBytes = Gdx.files.local("test.txt").readBytes(); -// if(Arrays.equals("test".getBytes(), testBytes)) -// message += "Read into byte array success\n"; -// else -// fail(); -// } catch(Throwable e) { -// message += "Couldn't read localstorage/test.txt\n" + e.getMessage() + "\n"; -// } -// -// if(canDelete) { -// if(!Gdx.files.local("test.txt").delete()) { -// message += "Couldn't delete localstorage/test.txt"; -// } -// } -// message += "\n"; -// { -// FileHandle root1 = Gdx.files.local(""); -// FileHandle root2 = Gdx.files.local("./"); -// FileHandle root3 = Gdx.files.local("."); -// -// message += "root1: " + root1 + " exists: " + root1.exists() + " Root size: " + root1.list().length + "\n"; -// message += "root2: " + root2 + " exists: " + root2.exists() + " Root size: " + root2.list().length + "\n"; -// message += "root3: " + root3 + " exists: " + root3.exists() + " Root size: " + root3.list().length + "\n"; -// message += "root2 length: " + root2.length() + "\n"; -// FileHandle[] list = root1.list(); -// for(int i = 0; i < list.length; i++) { -// System.out.println("Files: " + list[i]); -// } -// } + BufferedWriter out = null; + boolean canDelete = false; + try { + FileHandle testFile = Gdx.files.local("test.txt"); + boolean exists = testFile.exists(); + canDelete = exists; + message += "text.txt exists: " + exists + "\n"; + + testFile.writeString("test", false); + + } catch(GdxRuntimeException ex) { + message += "Couldn't open localstorage/test.txt\n"; + } finally { + StreamUtils.closeQuietly(out); + } + + try { + String s = Gdx.files.local("test.txt").readString(); + message += "Open local success\n"; + } catch(Throwable e) { + message += "Couldn't open localstorage/test.txt\n" + e.getMessage() + "\n"; + } + + BufferedReader in = null; + try { + FileHandle testFile = Gdx.files.local("test.txt"); + InputStream read = testFile.read(); + in = new BufferedReader(new InputStreamReader(read)); + if(!in.readLine().equals("test")) + message += "Read result wrong\n"; + else + message += "Read local success\n"; + } catch(GdxRuntimeException ex) { + message += "Couldn't open localstorage/test.txt\n"; + } catch(Throwable e) { + message += "Couldn't read localstorage/test.txt\n"; + } finally { + StreamUtils.closeQuietly(in); + } + + try { + byte[] testBytes = Gdx.files.local("test.txt").readBytes(); + if(Arrays.equals("test".getBytes(), testBytes)) + message += "Read into byte array success\n"; + else + fail(); + } catch(Throwable e) { + message += "Couldn't read localstorage/test.txt\n" + e.getMessage() + "\n"; + } + + if(canDelete) { + if(!Gdx.files.local("test.txt").delete()) { + message += "Couldn't delete localstorage/test.txt"; + } + } + message += "\n"; + { + FileHandle root1 = Gdx.files.local(""); + FileHandle root2 = Gdx.files.local("./"); + FileHandle root3 = Gdx.files.local("."); + + message += "root1: " + root1 + " exists: " + root1.exists() + " Root size: " + root1.list().length + "\n"; + message += "root2: " + root2 + " exists: " + root2.exists() + " Root size: " + root2.list().length + "\n"; + message += "root3: " + root3 + " exists: " + root3.exists() + " Root size: " + root3.list().length + "\n"; + message += "root2 length: " + root2.length() + "\n"; + FileHandle[] list = root1.list(); + for(int i = 0; i < list.length; i++) { + System.out.println("Files: " + list[i]); + } + } } } diff --git a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildTeaVMTestDemo.java b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildTeaVMTestDemo.java index 78720371..40897276 100644 --- a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildTeaVMTestDemo.java +++ b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildTeaVMTestDemo.java @@ -1,5 +1,7 @@ package com.github.xpenatan.gdx.examples.teavm; +import com.badlogic.gdx.files.FileHandle; +import com.github.xpenatan.gdx.backends.teavm.config.AssetFileHandle; import com.github.xpenatan.gdx.backends.teavm.config.TeaBuildConfiguration; import com.github.xpenatan.gdx.backends.teavm.config.TeaBuilder; import com.github.xpenatan.gdx.backends.teavm.config.plugins.TeaReflectionSupplier; @@ -17,7 +19,7 @@ public static void main(String[] args) throws IOException { TeaReflectionSupplier.addReflectionClass(reflectionPackage); TeaBuildConfiguration teaBuildConfiguration = new TeaBuildConfiguration(); - teaBuildConfiguration.assetsPath.add(new File("../desktop/assets")); + teaBuildConfiguration.assetsPath.add(new AssetFileHandle("../desktop/assets")); teaBuildConfiguration.webappPath = new File("build/dist").getCanonicalPath(); teaBuildConfiguration.logoPath = "logo.png"; diff --git a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/LoadingTestLauncher.java b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/LoadingTestLauncher.java index 79ae85ed..3aabb53f 100644 --- a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/LoadingTestLauncher.java +++ b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/LoadingTestLauncher.java @@ -111,8 +111,8 @@ public void render() { } private void preloadScene2dAssets() { - preloader.loadSingleAsset(preloader.getAsset("data/loading/loading.pack")); - preloader.loadSingleAsset(preloader.getAsset("data/loading/loading.png")); +// preloader.loadSingleAsset(preloader.getAsset("data/loading/loading.pack")); +// preloader.loadSingleAsset(preloader.getAsset("data/loading/loading.png")); } private void loadScene2dAssets() { @@ -125,7 +125,7 @@ private void loadScene2dAssets() { } private void loadGameAssets() { - assetsCount = preloader.loadAssets(); +// assetsCount = preloader.loadAssets(); System.out.println("AssetsCount: " + assetsCount); } From 61d4bc29d69efb2c81a098b073874cea1b90dc00 Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 4 Jul 2024 16:17:07 -0300 Subject: [PATCH 070/114] Improve adding gdx source --- buildSrc/src/main/kotlin/Dependencies.kt | 39 ++++++++---- .../gdx/examples/teavm/BuildFreetypeTest.java | 3 +- examples/gdx-tests/desktop/build.gradle.kts | 3 +- examples/gdx-tests/teavm/build.gradle.kts | 1 + .../gdx/examples/teavm/BuildGdxTest.java | 6 +- gradle.properties | 6 +- settings.gradle.kts | 60 +++++++++---------- 7 files changed, 68 insertions(+), 50 deletions(-) diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index b1608125..76607562 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -4,7 +4,9 @@ import java.util.* object LibExt { const val groupId = "com.github.xpenatan.gdx-teavm" - val libVersion: String = getVersion() + val properties = getProperties(); + + val libVersion: String = getVersion(properties) const val gdxVersion = "1.12.1" const val teaVMVersion = "0.10.0" @@ -18,26 +20,39 @@ object LibExt { const val aiVersion = "1.8.2" const val truthVersion = "1.4.2" + + + // ######### Add libgdx tests to project + // ######### Need to have libgdx project source code tag 1.12.1. + // ######### Need to disable in libgdx settings :tests:gdx-tests-gwt because of some conflicts + // ######### Need to update gradle properties. + val gdxSourcePath = properties.getOrDefault("gdxSourcePath", "") as String + val gdxTestsAssetsPath = "${gdxSourcePath}/tests/gdx-tests-android/assets/" + val teavmPath = properties.getOrDefault("teavmPath", "") as String + val includeLibgdxSource = (properties.getOrDefault("includeLibgdxSource", "false") as String).toBoolean() + val includeTeaVMSource = (properties.getOrDefault("includeTeaVMSource", "false") as String).toBoolean() } -private fun getVersion(): String { +private fun getVersion(properties: Properties): String { val isReleaseStr = System.getenv("RELEASE") val isRelease = isReleaseStr != null && isReleaseStr.toBoolean() var libVersion = "-SNAPSHOT" + val version = properties.getProperty("version") + if(isRelease) { + libVersion = version + } + println("Lib Version: $libVersion") + return libVersion +} + +private fun getProperties(): Properties { val file = File("gradle.properties") + val properties = Properties() if(file.exists()) { - val properties = Properties() properties.load(file.inputStream()) - val version = properties.getProperty("version") - if(isRelease) { - libVersion = version - } } else { - if(isRelease) { - throw RuntimeException("properties should exist") - } + throw RuntimeException("properties should exist") } - println("Lib Version: $libVersion") - return libVersion + return properties } \ No newline at end of file diff --git a/examples/freetype/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java b/examples/freetype/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java index 0f3632f5..d21aa34c 100644 --- a/examples/freetype/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java +++ b/examples/freetype/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java @@ -1,5 +1,6 @@ package com.github.xpenatan.gdx.examples.teavm; +import com.github.xpenatan.gdx.backends.teavm.config.AssetFileHandle; import com.github.xpenatan.gdx.backends.teavm.config.TeaBuildConfiguration; import com.github.xpenatan.gdx.backends.teavm.config.TeaBuilder; import com.github.xpenatan.gdx.backends.teavm.gen.SkipClass; @@ -14,7 +15,7 @@ public class BuildFreetypeTest { public static void main(String[] args) throws IOException { TeaBuildConfiguration teaBuildConfiguration = new TeaBuildConfiguration(); - teaBuildConfiguration.assetsPath.add(new File("../desktop/assets")); + teaBuildConfiguration.assetsPath.add(new AssetFileHandle("../desktop/assets")); teaBuildConfiguration.webappPath = new File("build/dist").getCanonicalPath(); TeaVMTool tool = TeaBuilder.config(teaBuildConfiguration); diff --git a/examples/gdx-tests/desktop/build.gradle.kts b/examples/gdx-tests/desktop/build.gradle.kts index d4484644..cc79a95e 100644 --- a/examples/gdx-tests/desktop/build.gradle.kts +++ b/examples/gdx-tests/desktop/build.gradle.kts @@ -10,8 +10,7 @@ dependencies { val mainClassName = "com.github.xpenatan.imgui.example.tests.Main" -// Change to your source asset directory -val assetsDir = File("E:\\Dev\\Projects\\java\\libgdx\\tests\\gdx-tests-android\\assets\\"); +val assetsDir = File(LibExt.gdxTestsAssetsPath) tasks.register("gdx-tests-run-desktop") { dependsOn("classes") diff --git a/examples/gdx-tests/teavm/build.gradle.kts b/examples/gdx-tests/teavm/build.gradle.kts index f7811f8e..234d1543 100644 --- a/examples/gdx-tests/teavm/build.gradle.kts +++ b/examples/gdx-tests/teavm/build.gradle.kts @@ -23,6 +23,7 @@ tasks.register("gdx-tests-build") { group = "examples-teavm" description = "Build gdx-tests example" mainClass.set(mainClassName) + args = mutableListOf(LibExt.gdxTestsAssetsPath) classpath = sourceSets["main"].runtimeClasspath } diff --git a/examples/gdx-tests/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildGdxTest.java b/examples/gdx-tests/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildGdxTest.java index 74646f7c..49709f30 100644 --- a/examples/gdx-tests/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildGdxTest.java +++ b/examples/gdx-tests/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildGdxTest.java @@ -1,5 +1,6 @@ package com.github.xpenatan.gdx.examples.teavm; +import com.github.xpenatan.gdx.backends.teavm.config.AssetFileHandle; import com.github.xpenatan.gdx.backends.teavm.config.TeaBuildConfiguration; import com.github.xpenatan.gdx.backends.teavm.config.TeaBuilder; import com.github.xpenatan.gdx.backends.teavm.config.plugins.TeaReflectionSupplier; @@ -16,11 +17,8 @@ public static void main(String[] args) throws IOException { String reflectionPackage = "com.badlogic.gdx.math"; TeaReflectionSupplier.addReflectionClass(reflectionPackage); - // Change to your source asset directory - String libgdxTestAssetsPath = "E:\\Dev\\Projects\\java\\libgdx\\tests\\gdx-tests-android\\assets\\"; - TeaBuildConfiguration teaBuildConfiguration = new TeaBuildConfiguration(); - teaBuildConfiguration.assetsPath.add(new File(libgdxTestAssetsPath)); + teaBuildConfiguration.assetsPath.add(new AssetFileHandle(args[0])); teaBuildConfiguration.webappPath = new File("build/dist").getCanonicalPath(); TeaVMTool tool = TeaBuilder.config(teaBuildConfiguration); diff --git a/gradle.properties b/gradle.properties index 67ff577c..68903dee 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1,5 @@ -version=1.0.0-b10 \ No newline at end of file +version=1.0.0-b10 +gdxSourcePath = E:/Dev/Projects/java/libgdx +teavmPath = E:/Dev/Projects/java/teavm +includeLibgdxSource = false +includeTeaVMSource = false \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 10981b2a..9acdcaa0 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,3 +1,5 @@ +import java.util.* + include(":backends:backend-teavm") include(":extensions:gdx-freetype-teavm") @@ -14,33 +16,31 @@ include(":examples:freetype:core") include(":examples:freetype:desktop") include(":examples:freetype:teavm") -// ######### Add libgdx tests to project -// ######### Need to have libgdx project source code tag 1.12.1. -// ######### Need to disable in libgdx settings :tests:gdx-tests-gwt because of some conflicts -// ######### Need to update assets path in desktop gradle and teavm build class. - -//include(":examples:gdx-tests:core") -//include(":examples:gdx-tests:desktop") -//include(":examples:gdx-tests:teavm") -//includeBuild("E:\\Dev\\Projects\\java\\libgdx") - -// ######### - -// ######### Replace teavm libs to use teavm sources -// ######### Only use it if you want to test teavm source code. -// ######### Change 'teavmPath' to your teavm source directory - -//val teavmPath = "E:\\Dev\\Projects\\java\\teavm"; - -//includeBuild(teavmPath) { -// dependencySubstitution { -// substitute(module("org.teavm:teavm-tooling")).using(project(":tools:core")) -// substitute(module("org.teavm:teavm-core")).using(project(":core")) -// substitute(module("org.teavm:teavm-classlib")).using(project(":classlib")) -// substitute(module("org.teavm:teavm-jso")).using(project(":jso:core")) -// substitute(module("org.teavm:teavm-jso-apis")).using(project(":jso:apis")) -// substitute(module("org.teavm:teavm-jso-impl")).using(project(":jso:impl")) -// } -//} - -// ######### \ No newline at end of file +val file = File("gradle.properties") +val properties = Properties() +properties.load(file.inputStream()) + +val gdxSourcePath = properties.getOrDefault("gdxSourcePath", "") as String +val teavmPath = properties.getOrDefault("teavmPath", "") as String +val includeLibgdxSource = (properties.getOrDefault("includeLibgdxSource", "false") as String).toBoolean() +val includeTeaVMSource = (properties.getOrDefault("includeTeaVMSource", "false") as String).toBoolean() + +if(includeLibgdxSource) { + include(":examples:gdx-tests:core") + include(":examples:gdx-tests:desktop") + include(":examples:gdx-tests:teavm") + includeBuild(gdxSourcePath) +} + +if(includeTeaVMSource) { + includeBuild(teavmPath) { + dependencySubstitution { + substitute(module("org.teavm:teavm-tooling")).using(project(":tools:core")) + substitute(module("org.teavm:teavm-core")).using(project(":core")) + substitute(module("org.teavm:teavm-classlib")).using(project(":classlib")) + substitute(module("org.teavm:teavm-jso")).using(project(":jso:core")) + substitute(module("org.teavm:teavm-jso-apis")).using(project(":jso:apis")) + substitute(module("org.teavm:teavm-jso-impl")).using(project(":jso:impl")) + } + } +} \ No newline at end of file From 2b2172767ccb962af24f45fbf8543d54e768dbc4 Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 4 Jul 2024 16:19:52 -0300 Subject: [PATCH 071/114] fix imgui code --- .../imgui/example/tests/imgui/ImGuiTestsApp.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java b/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java index 14208b24..946dadc2 100644 --- a/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java +++ b/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java @@ -43,13 +43,7 @@ public class ImGuiTestsApp implements Screen { @Override public void show() { testList = TeaVMGdxTests.getTestList(); - if(Gdx.app.getType() == Application.ApplicationType.WebGL) { - // Not possible to have ini filename with webgl - ImGui.CreateContext(false); - } - else { - ImGui.CreateContext(true); - } + ImGui.CreateContext(); ImGuiIO io = ImGui.GetIO(); io.ConfigFlags(ImGuiConfigFlags.ImGuiConfigFlags_DockingEnable); @@ -174,4 +168,4 @@ public void dispose() { ImGui.disposeStatic(); ImGui.DestroyContext(); } -} +} \ No newline at end of file From 6d7fa00974d178024a02e33eab7100660b8dedb8 Mon Sep 17 00:00:00 2001 From: Natan Date: Fri, 5 Jul 2024 14:09:31 -0300 Subject: [PATCH 072/114] wip audio --- .../dom/AudioBufferSourceNodeWrapper.java | 141 ++++++++ .../teavm/filesystem/MemoryFileStorage.java | 2 +- .../teavm/webaudio/AudioControlGraphPool.java | 20 +- .../backends/teavm/webaudio/WebAudioAPI.java | 315 ++++++++++++++++ .../teavm/webaudio/WebAudioAPIManager.java | 82 +---- .../teavm/webaudio/WebAudioAPISound.java | 336 ------------------ .../teavm/webaudio/WebAudioMusic.java | 141 ++++++++ .../teavm/webaudio/WebAudioSound.java | 107 ++++++ 8 files changed, 724 insertions(+), 420 deletions(-) create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/AudioBufferSourceNodeWrapper.java create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPI.java delete mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPISound.java create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioMusic.java create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioSound.java diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/AudioBufferSourceNodeWrapper.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/AudioBufferSourceNodeWrapper.java new file mode 100644 index 00000000..537968f2 --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/AudioBufferSourceNodeWrapper.java @@ -0,0 +1,141 @@ +package com.github.xpenatan.gdx.backends.teavm.dom; + +import org.teavm.jso.dom.events.EventListener; +import org.teavm.jso.typedarrays.Float32Array; +import org.teavm.jso.webaudio.AnalyserNode; +import org.teavm.jso.webaudio.AudioBuffer; +import org.teavm.jso.webaudio.AudioBufferSourceNode; +import org.teavm.jso.webaudio.AudioContext; +import org.teavm.jso.webaudio.AudioParam; +import org.teavm.jso.webaudio.ChannelMergerNode; +import org.teavm.jso.webaudio.ChannelSplitterNode; +import org.teavm.jso.webaudio.MediaEvent; + +/** + * Ported https://github.com/WebAudio/web-audio-api/issues/2397#issuecomment-1262583050 + * @author xpenatan + */ +public class AudioBufferSourceNodeWrapper { + + private AudioContext audioContext; + public AudioBufferSourceNode _bufferSource; + ChannelSplitterNode _splitter; + ChannelMergerNode _out; + Float32Array _sampleHolder; + AnalyserNode _analyser; + + public AudioBufferSourceNodeWrapper(AudioContext audioContext) { + this.audioContext = audioContext; + _bufferSource = audioContext.createBufferSource(); + _splitter = audioContext.createChannelSplitter(); + _out = audioContext.createChannelMerger(); + _sampleHolder = new Float32Array(1); + } + + public AudioBuffer getBuffer() { + return _bufferSource.getBuffer(); + } + + public void setBuffer(AudioBuffer audioBuffer) { + + AudioBuffer buffer2 = audioContext.createBuffer(audioBuffer.getNumberOfChannels() + 1, audioBuffer.getLength(), audioBuffer.getSampleRate()); + + _bufferSource.setBuffer(buffer2); + + // copy data from the audioBuffer arg to our new AudioBuffer + for (int index = 0; index < audioBuffer.getNumberOfChannels(); index++) { + _bufferSource.getBuffer().copyToChannel(audioBuffer.getChannelData(index), index); + } + + // fill up the position channel with numbers from 0 to 1 + + int length = audioBuffer.getLength(); + Float32Array timeDataArray = new Float32Array(length); + for (int i = 0; i < length; i++) { + timeDataArray.set(i, (float)i / length); + } + _bufferSource.getBuffer().copyToChannel(timeDataArray, audioBuffer.getNumberOfChannels()); + +// for (int index = 0; index < audioBuffer.getLength(); index++) { +// Float32Array channelData = _bufferSource.getBuffer().getChannelData(audioBuffer.getNumberOfChannels()); +// channelData.set(index, (float)(index / audioBuffer.getLength())); +// } + + // split the channels + _bufferSource.connect(_splitter); + + // connect all the audio channels to the line out + for (int index = 0; index < audioBuffer.getNumberOfChannels(); index++) { + _splitter.connect(_out, index, index); + } + + // connect the position channel to an analyzer so we can extract position data + _analyser = audioContext.createAnalyser(); + _splitter.connect(_analyser, audioBuffer.getNumberOfChannels()); + } + + public AudioParam getPlaybackRate() { + return _bufferSource.getPlaybackRate(); + } + + public AudioParam getDetune() { + return _bufferSource.getDetune(); + } + + public boolean getLoop() { + return _bufferSource.getLoop(); + } + + public void setLoop(boolean loop) { + _bufferSource.setLoop(loop); + } + + public double getLoopStart() { + return _bufferSource.getLoopStart(); + } + + public void setLoopStart(double start) { + _bufferSource.setLoopStart(start); + } + + public double getLoopEnd() { + return _bufferSource.getLoopEnd(); + } + + public void setLoopEnd(double end) { + _bufferSource.setLoopEnd(end); + } + + public void setOnEnded(EventListener ent) { + _bufferSource.setOnEnded(ent); + } + + public void start(double when, double offset, double duration) { + _bufferSource.start(when, offset, duration); + } + + public void start(double when, double offset) { + _bufferSource.start(when, offset); + } + + public void start(double when) { + _bufferSource.start(when); + } + + public void start() { + _bufferSource.start(); + } + + public void stop(double when) { + _bufferSource.stop(when); + } + + public void stop() { + _bufferSource.stop(); + } + + public float getPlaybackPosition() { + _analyser.getFloatTimeDomainData(_sampleHolder); + return _sampleHolder.get(0); + } +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java index 83df0154..32bd36bc 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java @@ -15,7 +15,7 @@ public class MemoryFileStorage extends FileDB { private final Array tmpPaths = new Array<>(); - public boolean debug = true; + public boolean debug = false; public MemoryFileStorage() { fileMap = new OrderedMap<>(); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/AudioControlGraphPool.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/AudioControlGraphPool.java index 68e13156..c960c449 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/AudioControlGraphPool.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/AudioControlGraphPool.java @@ -9,16 +9,16 @@ * @author xpenatan */ public class AudioControlGraphPool extends Pool { - public JSObject audioContext; - public JSObject destinationNode; + public JSObject audioContext; + public JSObject destinationNode; - public AudioControlGraphPool(JSObject audioContext, JSObject destinationNode) { - this.audioContext = audioContext; - this.destinationNode = destinationNode; - } + public AudioControlGraphPool(JSObject audioContext, JSObject destinationNode) { + this.audioContext = audioContext; + this.destinationNode = destinationNode; + } - @Override - protected AudioControlGraph newObject () { - return new AudioControlGraph(audioContext, destinationNode); - } + @Override + protected AudioControlGraph newObject() { + return new AudioControlGraph(audioContext, destinationNode); + } } \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPI.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPI.java new file mode 100644 index 00000000..42a0c4ae --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPI.java @@ -0,0 +1,315 @@ +package com.github.xpenatan.gdx.backends.teavm.webaudio; + +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.utils.IntMap; +import com.badlogic.gdx.utils.IntMap.Keys; +import com.github.xpenatan.gdx.backends.teavm.dom.AudioBufferSourceNodeWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferWrapper; +import org.teavm.jso.JSObject; +import org.teavm.jso.typedarrays.ArrayBuffer; +import org.teavm.jso.webaudio.AudioBuffer; +import org.teavm.jso.webaudio.AudioContext; +import org.teavm.jso.webaudio.AudioParam; +import org.teavm.jso.webaudio.DecodeErrorCallback; +import org.teavm.jso.webaudio.DecodeSuccessCallback; +import org.teavm.jso.webaudio.GainNode; + +/** + * Port from GWT gdx 1.12.0 + * + * @author xpenatan + */ +public class WebAudioAPI { + // JavaScript object that is the base object of the Web Audio API + private final AudioContext audioContext; + + // JavaScript AudioNode representing the final destination of the sound. Typically the speakers of whatever device we are + // running on. + private final GainNode destinationNode; + + // Maps from integer keys to active sounds. Both the AudioBufferSourceNode and the associated AudioControlGraph are stored for + // quick access + private final IntMap activeSounds; + + // The raw sound data of this sound, which will be fed into the audio nodes + private AudioBuffer audioBuffer; + + // Key generator for sound objects. + private int nextKey = 0; + + // We use a pool of AudioControlGraphs in order to minimize object creation + private final AudioControlGraphPool audioGraphPool; + + /** + * @param audioContext The JavaScript AudioContext object that servers as the base object of the Web Audio API + * @param destinationNode The JavaScript AudioNode to route all the sound output to + * @param audioGraphPool A Pool that allows us to create AudioControlGraphs efficiently + */ + public WebAudioAPI(AudioContext audioContext, GainNode destinationNode, AudioControlGraphPool audioGraphPool) { + this.audioContext = audioContext; + this.destinationNode = destinationNode; + this.audioGraphPool = audioGraphPool; + this.activeSounds = new IntMap<>(); + } + + /** + * Set the buffer containing the actual sound data + * + * @param audioBuffer + */ + public void setAudioBuffer(AudioBuffer audioBuffer) { + this.audioBuffer = audioBuffer; + // If play-back of sounds have been requested before we were ready, do a pause/resume to get sound flowing + Keys keys = activeSounds.keys(); + while(keys.hasNext) { + int key = keys.next(); + pause(key); + resume(key, 0f); + } + } + + public long play(float offset, float volume, float pitch, float pan, boolean loop) { + // if the sound system is not yet unlocked, skip playing the sound. + // otherwise, it is played when the user makes his first input + if(!WebAudioAPIManager.isSoundUnlocked() && WebAudioAPIManager.isAudioContextLocked(audioContext)) return -1; + + int myKey = nextKey++; + AudioSourceData audioSourceData = new AudioSourceData(myKey); + + audioSourceData.offset = offset; + audioSourceData.volume = volume; + audioSourceData.pitch = pitch; + audioSourceData.pan = pan; + audioSourceData.loop = loop; + activeSounds.put(myKey, audioSourceData); + + // Get ourselves a fresh audio graph + AudioControlGraph audioControlGraph = audioGraphPool.obtain(); + audioSourceData.audioControlGraph = audioControlGraph; + // Create the source node that will be feeding the audio graph + createBufferSourceNodeInternal(audioSourceData, loop, pitch); + + // Configure the audio graph + audioControlGraph.setSource(audioSourceData.node._bufferSource); + audioControlGraph.setPan(pan); + audioControlGraph.setVolume(volume); + + // Start the playback + playInternal(audioSourceData, offset); + return myKey; + } + + public void stop() { + Keys keys = activeSounds.keys(); + while(keys.hasNext) { + int next = keys.next(); + stop(next); + } + } + + public void pause() { + System.out.println("PAUSEEEE"); + Keys keys = activeSounds.keys(); + while(keys.hasNext) { + pause(keys.next()); + } + } + + public void resume() { + System.out.println("RESUMEEEE"); + Keys keys = activeSounds.keys(); + while(keys.hasNext) { + resume(keys.next()); + } + } + + public void dispose() { + stop(); + activeSounds.clear(); + } + + public void stop(long soundId) { + int soundKey = (int)soundId; + if(activeSounds.containsKey(soundKey)) { + AudioSourceData audioSourceData = activeSounds.remove(soundKey); + if(audioSourceData.node != null) { + audioSourceData.node.stop(); + audioSourceData.node = null; + } + if(audioSourceData.audioControlGraph != null) { + audioGraphPool.free(audioSourceData.audioControlGraph); + audioSourceData.audioControlGraph = null; + } + } + } + + public void pause(long soundId) { + // Record our current position, and then stop + int soundKey = (int)soundId; + if(activeSounds.containsKey(soundKey)) { + AudioSourceData audioSourceData = activeSounds.get(soundKey); + + // The API has no concept of pause/resume, so we do it by recording a pause time stamp, and then stopping the sound. On + // resume we play the + // sound again, starting from a calculated offset. + + audioSourceData.pauseTime = audioContext.getCurrentTime(); + // Remove ended listener when pausing + audioSourceData.node.setOnEnded(evt -> {}); + audioSourceData.node.stop(); + } + } + + public void resume(long soundId) { + resume(soundId, null); + } + + private void resume(long soundId, Float from) { + // Start from previous paused position + int soundKey = (int)soundId; + if(activeSounds.containsKey(soundKey)) { + AudioSourceData audioSourceData = activeSounds.get(soundKey); + + boolean loop = audioSourceData.node.getLoop(); + float pitch = audioSourceData.node.getPlaybackRate().getValue(); + + float resumeOffset = (float)(audioSourceData.pauseTime - audioSourceData.startTime); + + if(from != null) resumeOffset = from; + + createBufferSourceNodeInternal(audioSourceData, loop, pitch); + + audioSourceData.audioControlGraph.setSource(audioSourceData.node._bufferSource); + + playInternal(audioSourceData, resumeOffset); + } + } + + public void setLooping(long soundId, boolean looping) { + int soundKey = (int)soundId; + if(activeSounds.containsKey(soundKey)) { + AudioSourceData audioSourceData = activeSounds.get(soundKey); + audioSourceData.node.setLoop(looping); + } + } + + public void setPitch(long soundId, float pitch) { + int soundKey = (int)soundId; + if(activeSounds.containsKey(soundKey)) { + AudioSourceData audioSourceData = activeSounds.get(soundKey); + audioSourceData.node.getPlaybackRate().setValue(pitch); + } + } + + public void setVolume(long soundId, float volume) { + int soundKey = (int)soundId; + if(activeSounds.containsKey(soundKey)) { + AudioSourceData audioSourceNodeData = activeSounds.get(soundKey); + audioSourceNodeData.audioControlGraph.setVolume(volume); + } + } + + public float getVolume(long soundId) { + int soundKey = (int)soundId; + if(activeSounds.containsKey(soundKey)) { + AudioSourceData audioSourceNodeData = activeSounds.get(soundKey); + return audioSourceNodeData.audioControlGraph.getVolume(); + } + return -1; + } + + public void setPan(long soundId, float pan, float volume) { + int soundKey = (int)soundId; + if(activeSounds.containsKey(soundKey)) { + AudioSourceData audioSourceNodeData = activeSounds.get(soundKey); + AudioControlGraph audioControlGraph = audioSourceNodeData.audioControlGraph; + audioControlGraph.setPan(pan); + audioControlGraph.setVolume(volume); + } + } + + public float getCurrentTime(long soundId) { + int soundKey = (int)soundId; + if(activeSounds.containsKey(soundKey)) { + AudioSourceData audioSourceData = activeSounds.get(soundKey); + float playbackPosition = audioSourceData.node.getPlaybackPosition(); + + System.out.println("playbackPosition: " + playbackPosition); + + +// if(audioSourceData.pauseTime == audioSourceData.startTime) { +// return (float)(audioContext.getCurrentTime() - audioSourceData.startTime); +// } +// else { +// float resumeOffset = (float)(audioSourceData.pauseTime - audioSourceData.startTime); +// return resumeOffset; +// } + } + return 0; + } + + protected void onSoundDone(int soundId) { + } + + private void soundDone(int soundKey) { + // The sound might have been removed by an explicit stop, before the sound reached its end + if(activeSounds.containsKey(soundKey)) { + AudioSourceData audioSourceData = activeSounds.remove(soundKey); + audioGraphPool.free(audioSourceData.audioControlGraph); + audioSourceData.audioControlGraph = null; + } + onSoundDone(soundKey); + } + + private void createBufferSourceNodeInternal(AudioSourceData data, boolean loop, float pitch) { + if(audioBuffer == null) { + audioBuffer = audioContext.createBuffer(2, 22050, 44100); + } + + AudioBufferSourceNodeWrapper newAudioBufferSourceNode = new AudioBufferSourceNodeWrapper(audioContext); + newAudioBufferSourceNode.setBuffer(audioBuffer); + newAudioBufferSourceNode.setLoop(loop); + if(pitch != 1.0f) { + AudioParam playbackRate = newAudioBufferSourceNode.getPlaybackRate(); + playbackRate.setValue(pitch); + } + data.node = newAudioBufferSourceNode; + } + + private void playInternal(AudioSourceData audioSourceData, float startOffset) { + double currentTime = audioContext.getCurrentTime(); + audioSourceData.startTime = currentTime; + audioSourceData.pauseTime = currentTime; + audioSourceData.node.setOnEnded(evt -> soundDone(audioSourceData.soundId)); + audioSourceData.node.start(currentTime, startOffset); + } + + public static void decodeAudioData(FileHandle fileHandle, AudioContext audioContext, ArrayBufferWrapper audioData, DecodeSuccessCallback decodeFunction) { + audioContext.decodeAudioData((ArrayBuffer)audioData, decodeFunction, new DecodeErrorCallback() { + @Override + public void onError(JSObject error) { + System.err.println("Error: decodeAudioData"); + } + }); + } + + private static class AudioSourceData { + public final int soundId; + + public AudioBufferSourceNodeWrapper node; + public AudioControlGraph audioControlGraph; + public double startTime; + public double pauseTime; + + public float offset; + public float volume; + public float pitch; + public float pan; + public boolean loop; + public boolean delayedPlay = false; + + public AudioSourceData(int soundId) { + this.soundId = soundId; + } + } +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPIManager.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPIManager.java index 1ff912b9..df5a1b9e 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPIManager.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPIManager.java @@ -5,19 +5,12 @@ import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.files.FileHandle; -import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; -import com.github.xpenatan.gdx.backends.teavm.dom.audio.Audio; -import com.github.xpenatan.gdx.backends.teavm.dom.audio.AudioContextWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.audio.HTMLAudioElementWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; import org.teavm.jso.JSBody; import org.teavm.jso.JSFunctor; import org.teavm.jso.JSObject; -import org.teavm.jso.ajax.ReadyStateChangeHandler; -import org.teavm.jso.ajax.XMLHttpRequest; -import org.teavm.jso.typedarrays.ArrayBuffer; -import org.teavm.jso.typedarrays.Int8Array; +import org.teavm.jso.webaudio.AudioContext; +import org.teavm.jso.webaudio.AudioDestinationNode; +import org.teavm.jso.webaudio.GainNode; /** * Port from GWT gdx 1.12.0 @@ -25,8 +18,8 @@ * @author xpenatan */ public class WebAudioAPIManager implements LifecycleListener { - private final AudioContextWrapper audioContext; - private final JSObject globalVolumeNode; + private final AudioContext audioContext; + private final GainNode globalVolumeNode; private final AudioControlGraphPool audioControlGraphPool; private static boolean soundUnlocked; @@ -117,7 +110,7 @@ public static boolean isSoundUnlocked() { "}" + "return null;" ) - private static native AudioContextWrapper createAudioContextJSNI(); + private static native AudioContext createAudioContextJSNI(); @JSBody(params = { "audioContext" }, script = "" + "var gainNode = null;" + @@ -129,7 +122,7 @@ public static boolean isSoundUnlocked() { "gainNode.connect(audioContext.destination);" + "return gainNode;" ) - private static native JSObject createGlobalVolumeNodeJSNI(JSObject audioContext); + private static native GainNode createGlobalVolumeNodeJSNI(JSObject audioContext); @JSBody(params = { "audioContext", "gainNode" }, script = "" + "gainNode.disconnect(audioContext.destination);" @@ -146,70 +139,13 @@ public JSObject getAudioContext() { } public Sound createSound(FileHandle fileHandle) { - final WebAudioAPISound newSound = new WebAudioAPISound(audioContext, globalVolumeNode, audioControlGraphPool); - - String url = ((TeaFileHandle)fileHandle).getAssetUrl(); - - XMLHttpRequest request = XMLHttpRequest.create(); - request.setOnReadyStateChange(new ReadyStateChangeHandler() { - @Override - public void stateChanged() { - if(request.getReadyState() == XMLHttpRequest.DONE) { - if(request.getStatus() != 200) { - } - else { - Int8ArrayWrapper data = (Int8ArrayWrapper)Int8Array.create((ArrayBuffer)request.getResponse()); - - /* - * Start decoding the sound data. This is an asynchronous process, which is a bad fit for the libGDX API, which - * expects sound creation to be synchronous. The result is that sound won't actually start playing until the - * decoding is done. - */ - - DecodeAudioFunction audioFunction = new DecodeAudioFunction() { - @Override - public void decodeAudioFunction(JSObject jsObject) { - newSound.setAudioBuffer(jsObject); - } - }; - decodeAudioData(getAudioContext(), data.getBuffer(), audioFunction); - } - } - } - }); - request.open("GET", url); - request.setResponseType("arraybuffer"); - request.send(); - return newSound; + return new WebAudioSound(fileHandle, audioContext, globalVolumeNode, audioControlGraphPool); } public Music createMusic(FileHandle fileHandle) { - String url = ((TeaFileHandle)fileHandle).getAssetUrl(); - - HTMLAudioElementWrapper audio = Audio.createIfSupported(); - audio.setSrc(url); - - WebAudioAPIMusic music = new WebAudioAPIMusic(audioContext, audio, audioControlGraphPool); - - return music; + return new WebAudioMusic(fileHandle, audioContext, globalVolumeNode, audioControlGraphPool); } - @JSFunctor - public interface DecodeAudioFunction extends JSObject { - void decodeAudioFunction(JSObject jsObject); - } - - @JSBody(params = { "audioContextIn", "audioData", "decodeFunction" }, script = "" + - "audioContextIn.decodeAudioData(" + - " audioData, " + - " decodeFunction," + - " function() {" + - " console.log(\"Error: decodeAudioData\");" + - " }" + - ");" - ) - public static native void decodeAudioData(JSObject audioContextIn, ArrayBufferWrapper audioData, DecodeAudioFunction decodeFunction); - @Override public void pause() { // As the web application looses focus, we mute the sound diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPISound.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPISound.java deleted file mode 100644 index 4773da30..00000000 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPISound.java +++ /dev/null @@ -1,336 +0,0 @@ -package com.github.xpenatan.gdx.backends.teavm.webaudio; - -import com.badlogic.gdx.audio.Sound; -import com.badlogic.gdx.utils.IntMap; -import com.badlogic.gdx.utils.IntMap.Keys; -import org.teavm.jso.JSBody; -import org.teavm.jso.JSFunctor; -import org.teavm.jso.JSObject; - -/** - * Port from GWT gdx 1.12.0 - * - * @author xpenatan - */ -public class WebAudioAPISound implements Sound { - // JavaScript object that is the base object of the Web Audio API - private final JSObject audioContext; - - // JavaScript AudioNode representing the final destination of the sound. Typically the speakers of whatever device we are - // running on. - private final JSObject destinationNode; - - // Maps from integer keys to active sounds. Both the AudioBufferSourceNode and the associated AudioControlGraph are stored for - // quick access - private final IntMap activeSounds; - private final IntMap activeAudioControlGraphs; - - // The raw sound data of this sound, which will be fed into the audio nodes - private JSObject audioBuffer; - - // Key generator for sound objects. - private int nextKey = 0; - - // We use a pool of AudioControlGraphs in order to minimize object creation - private AudioControlGraphPool audioGraphPool; - - /** - * @param audioContext The JavaScript AudioContext object that servers as the base object of the Web Audio API - * @param destinationNode The JavaScript AudioNode to route all the sound output to - * @param audioGraphPool A Pool that allows us to create AudioControlGraphs efficiently - */ - public WebAudioAPISound(JSObject audioContext, JSObject destinationNode, AudioControlGraphPool audioGraphPool) { - this.audioContext = audioContext; - this.destinationNode = destinationNode; - this.audioGraphPool = audioGraphPool; - this.activeSounds = new IntMap(); - this.activeAudioControlGraphs = new IntMap(); - } - - /** - * Set the buffer containing the actual sound data - * - * @param audioBuffer - */ - public void setAudioBuffer(JSObject audioBuffer) { - this.audioBuffer = audioBuffer; - - // If play-back of sounds have been requested before we were ready, do a pause/resume to get sound flowing - Keys keys = activeSounds.keys(); - while(keys.hasNext) { - int key = keys.next(); - pause(key); - resume(key, 0f); - } - } - - protected long play(float volume, float pitch, float pan, boolean loop) { - // if the sound system is not yet unlocked, skip playing the sound. - // otherwise, it is played when the user makes his first input - if(!WebAudioAPIManager.isSoundUnlocked() && WebAudioAPIManager.isAudioContextLocked(audioContext)) return -1; - - // Get ourselves a fresh audio graph - AudioControlGraph audioControlGraph = audioGraphPool.obtain(); - - // Create the source node that will be feeding the audio graph - JSObject audioBufferSourceNode = createBufferSourceNode(loop, pitch, audioContext, audioBuffer); - - // Configure the audio graph - audioControlGraph.setSource(audioBufferSourceNode); - audioControlGraph.setPan(pan); - audioControlGraph.setVolume(volume); - - int myKey = nextKey++; - - // Start the playback - - EndedFunction endedFunction = new EndedFunction() { - @Override - public void endedFunc() { - soundDone(myKey); - } - }; - playJSNI(audioBufferSourceNode, myKey, 0f, audioContext, endedFunction); - - // Remember that we are playing - activeSounds.put(myKey, audioBufferSourceNode); - activeAudioControlGraphs.put(myKey, audioControlGraph); - - return myKey; - } - - private void soundDone(int key) { - // The sound might have been removed by an explicit stop, before the sound reached its end - if(activeSounds.containsKey(key)) { - activeSounds.remove(key); - audioGraphPool.free(activeAudioControlGraphs.remove(key)); - } - } - - @JSBody(params = { "loop", "pitch", "audioContext", "audioBuffer" }, script = "" + - "if (audioBuffer == null) {" + - " audioBuffer = audioContext.createBuffer(2, 22050, 44100);" + - "}" + - "var source = audioContext.createBufferSource();" + - "source.buffer = audioBuffer;" + - "source.loop = loop;" + - "if (pitch !== 1.0) {" + - " source.playbackRate.value = pitch;" + - "}" + - "return source;" - ) - public static native JSObject createBufferSourceNode(boolean loop, float pitch, JSObject audioContext, JSObject audioBuffer); - - - @JSFunctor - public interface EndedFunction extends JSObject { - void endedFunc(); - } - - @JSBody(params = { "source", "key", "startOffset", "audioContext", "endedFunction" }, script = "" + - "source.startTime = audioContext.currentTime;" + - "source.onended = endedFunction;" + - "if(typeof (source.start) !== \"undefined\")" + - " source.start(audioContext.currentTime, startOffset);" + - "else" + - " source.noteOn(audioContext.currentTime, startOffset);" + - "return source;" - ) - public static native JSObject playJSNI(JSObject source, int key, float startOffset, JSObject audioContext, EndedFunction endedFunction); - - @JSBody(params = { "audioBufferSourceNode" }, script = "" + - "if(typeof (audioBufferSourceNode.stop) !== 'undefined')" + - " audioBufferSourceNode.stop();" + - "else" + - " audioBufferSourceNode.noteOff();" - ) - public static native void stopJSNI(JSObject audioBufferSourceNode); - - @Override - public long play() { - return play(1f); - } - - @Override - public long play(float volume) { - return play(volume, 1f, 0f); - } - - @Override - public long play(float volume, float pitch, float pan) { - return play(volume, pitch, pan, false); - } - - @Override - public long loop() { - return loop(1f); - } - - @Override - public long loop(float volume) { - return loop(volume, 1f, 0f); - } - - @Override - public long loop(float volume, float pitch, float pan) { - return play(volume, pitch, pan, true); - } - - @Override - public void stop() { - Keys keys = activeSounds.keys(); - while(keys.hasNext) { - int next = keys.next(); - stop(next); - } - } - - @Override - public void pause() { - Keys keys = activeSounds.keys(); - while(keys.hasNext) { - pause(keys.next()); - } - } - - @Override - public void resume() { - Keys keys = activeSounds.keys(); - while(keys.hasNext) { - resume(keys.next()); - } - } - - @Override - public void dispose() { - stop(); - activeSounds.clear(); - } - - @Override - public void stop(long soundId) { - int soundKey = (int)soundId; - if(activeSounds.containsKey(soundKey)) { - JSObject audioBufferSourceNode = activeSounds.remove(soundKey); - stopJSNI(audioBufferSourceNode); - - audioGraphPool.free(activeAudioControlGraphs.remove(soundKey)); - } - } - - @Override - public void pause(long soundId) { - // Record our current position, and then stop - int soundKey = (int)soundId; - if(activeSounds.containsKey(soundKey)) { - JSObject audioBufferSourceNode = activeSounds.get(soundKey); - - // The API has no concept of pause/resume, so we do it by recording a pause time stamp, and then stopping the sound. On - // resume we play the - // sound again, starting from a calculated offset. - pauseJSNI(audioBufferSourceNode, audioContext); - stopJSNI(audioBufferSourceNode); - } - } - - @Override - public void resume(long soundId) { - resume(soundId, null); - } - - private void resume(long soundId, Float from) { - // Start from previous paused position - int soundKey = (int)soundId; - if(activeSounds.containsKey(soundKey)) { - JSObject audioBufferSourceNode = activeSounds.remove(soundKey); - AudioControlGraph audioControlGraph = activeAudioControlGraphs.get(soundKey); - - boolean loop = getLoopingJSNI(audioBufferSourceNode); - float pitch = getPitchJSNI(audioBufferSourceNode); - float resumeOffset = getResumeOffsetJSNI(audioBufferSourceNode); - - if(from != null) resumeOffset = from; - - // These things can not be re-used. One play only, as dictated by the Web Audio API - JSObject newAudioBufferSourceNode = createBufferSourceNode(loop, pitch, audioContext, audioBuffer); - audioControlGraph.setSource(newAudioBufferSourceNode); - activeSounds.put(soundKey, newAudioBufferSourceNode); - - - EndedFunction endedFunction = new EndedFunction() { - @Override - public void endedFunc() { - soundDone(soundKey); - } - }; - playJSNI(newAudioBufferSourceNode, soundKey, resumeOffset, audioContext, endedFunction); - } - } - - @Override - public void setLooping(long soundId, boolean looping) { - int soundKey = (int)soundId; - if(activeSounds.containsKey(soundKey)) { - JSObject sound = activeSounds.get(soundKey); - setLoopingJSNI(sound, looping); - } - } - - @Override - public void setPitch(long soundId, float pitch) { - int soundKey = (int)soundId; - if(activeSounds.containsKey(soundKey)) { - JSObject sound = activeSounds.get(soundKey); - setPitchJSNI(sound, pitch); - } - } - - @Override - public void setVolume(long soundId, float volume) { - int soundKey = (int)soundId; - if(activeSounds.containsKey(soundKey)) { - AudioControlGraph audioControlGraph = activeAudioControlGraphs.get(soundKey); - audioControlGraph.setVolume(volume); - } - } - - @Override - public void setPan(long soundId, float pan, float volume) { - int soundKey = (int)soundId; - if(activeSounds.containsKey(soundKey)) { - AudioControlGraph audioControlGraph = activeAudioControlGraphs.get(soundKey); - audioControlGraph.setPan(pan); - audioControlGraph.setVolume(volume); - } - } - - @JSBody(params = { "audioBufferSourceNode", "pitch" }, script = "" + - "audioBufferSourceNode.playbackRate.value = pitch;" - ) - public static native void setPitchJSNI(JSObject audioBufferSourceNode, float pitch); - - @JSBody(params = { "audioBufferSourceNode" }, script = "" + - "return audioBufferSourceNode.playbackRate.value;" - ) - public static native float getPitchJSNI(JSObject audioBufferSourceNode); - - @JSBody(params = { "audioBufferSourceNode", "looping" }, script = "" + - "audioBufferSourceNode.loop = looping;" - ) - public static native void setLoopingJSNI(JSObject audioBufferSourceNode, boolean looping); - - @JSBody(params = { "audioBufferSourceNode" }, script = "" + - "return audioBufferSourceNode.loop;" - ) - public static native boolean getLoopingJSNI(JSObject audioBufferSourceNode); - - @JSBody(params = { "audioBufferSourceNode", "audioContext" }, script = "" + - "audioBufferSourceNode.pauseTime = audioContext.currentTime;" - ) - public static native void pauseJSNI(JSObject audioBufferSourceNode, JSObject audioContext); - - @JSBody(params = { "audioBufferSourceNode" }, script = "" + - "return audioBufferSourceNode.pauseTime - audioBufferSourceNode.startTime;" - ) - public static native float getResumeOffsetJSNI(JSObject audioBufferSourceNode); -} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioMusic.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioMusic.java new file mode 100644 index 00000000..d39dd9c8 --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioMusic.java @@ -0,0 +1,141 @@ +package com.github.xpenatan.gdx.backends.teavm.webaudio; + +import com.badlogic.gdx.audio.Music; +import com.badlogic.gdx.files.FileHandle; +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; +import org.teavm.jso.webaudio.AudioContext; +import org.teavm.jso.webaudio.DecodeSuccessCallback; +import org.teavm.jso.webaudio.GainNode; + +public class WebAudioMusic implements Music { + + private AudioContext audioContext; + final WebAudioAPI audioAPI; + + private long sourceId = -1; + + private OnCompletionListener listener; + + private boolean isLooping; + private MusicState state = MusicState.STOP; + private float startPosition = 0; + private float volume = 1; + private float pan = 0; + + public WebAudioMusic(FileHandle fileHandle, AudioContext audioContext, GainNode globalVolumeNode, AudioControlGraphPool audioControlGraphPool) { + byte[] bytes = fileHandle.readBytes(); + this.audioContext = audioContext; + audioAPI = new WebAudioAPI(audioContext, globalVolumeNode, audioControlGraphPool) { + @Override + protected void onSoundDone(int soundId) { + if(listener != null) { + listener.onCompletion(WebAudioMusic.this); + } + } + }; + ArrayBufferViewWrapper data = TypedArrays.getTypedArray(bytes); + DecodeSuccessCallback successCallback = audioAPI::setAudioBuffer; + WebAudioAPI.decodeAudioData(fileHandle, audioContext, data.getBuffer(), successCallback); + } + + @Override + public void play() { + if(state == MusicState.STOP) { + state = MusicState.PLAY; + sourceId = audioAPI.play(startPosition, volume, 1f, pan, isLooping); + startPosition = 0; + } + else if(state == MusicState.PAUSE) { + state = MusicState.PLAY; + audioAPI.resume(sourceId); + } + } + + @Override + public void pause() { + if(state == MusicState.PLAY) { + state = MusicState.PAUSE; + audioAPI.pause(sourceId); + } + } + + @Override + public void stop() { + if(state == MusicState.PLAY || state == MusicState.PAUSE) { + state = MusicState.STOP; + audioAPI.stop(sourceId); + sourceId = -1; + } + } + + @Override + public boolean isPlaying() { + return state == MusicState.PLAY; + } + + @Override + public void setLooping(boolean isLooping) { + this.isLooping = isLooping; + audioAPI.setLooping(sourceId, isLooping); + } + + @Override + public boolean isLooping() { + return isLooping; + } + + @Override + public void setVolume(float volume) { + this.volume = volume; + audioAPI.setVolume(sourceId, volume); + } + + @Override + public float getVolume() { + return volume; + } + + @Override + public void setPan(float pan, float volume) { + this.volume = volume; + this.pan = pan; + audioAPI.setPan(sourceId, pan, volume); + } + + @Override + public void setPosition(float position) { + this.startPosition = position; + if(state == MusicState.PLAY) { + stop(); + play(); + } + else if(state == MusicState.PAUSE) { + stop(); + } + } + + @Override + public float getPosition() { + if(audioContext != null) { + return audioAPI.getCurrentTime(sourceId); + } + else { + return 0f; + } + } + + @Override + public void dispose() { + audioAPI.dispose(); + } + + @Override + public void setOnCompletionListener(OnCompletionListener listener) { + this.listener = listener; + } + + private enum MusicState { + PLAY, PAUSE, STOP + } +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioSound.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioSound.java new file mode 100644 index 00000000..62bf2624 --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioSound.java @@ -0,0 +1,107 @@ +package com.github.xpenatan.gdx.backends.teavm.webaudio; + +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.files.FileHandle; +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; +import org.teavm.jso.webaudio.AudioContext; +import org.teavm.jso.webaudio.DecodeSuccessCallback; +import org.teavm.jso.webaudio.GainNode; + +public class WebAudioSound implements Sound { + + final WebAudioAPI audioAPI; + + public WebAudioSound(FileHandle fileHandle, AudioContext audioContext, GainNode globalVolumeNode, AudioControlGraphPool audioControlGraphPool) { + byte[] bytes = fileHandle.readBytes(); + audioAPI = new WebAudioAPI(audioContext, globalVolumeNode, audioControlGraphPool); + ArrayBufferViewWrapper data = TypedArrays.getTypedArray(bytes); + DecodeSuccessCallback successCallback = audioAPI::setAudioBuffer; + WebAudioAPI.decodeAudioData(fileHandle, audioContext, data.getBuffer(), successCallback); + } + + @Override + public long play() { + return audioAPI.play(0f, 1f, 0f, 0f, false); + } + + @Override + public long play(float volume) { + return audioAPI.play(0f, volume, 0f, 0f, false); + } + + @Override + public long play(float volume, float pitch, float pan) { + return audioAPI.play(0f, volume, pitch, pan, false); + } + + @Override + public long loop() { + return audioAPI.play(0f, 1f, 0f, 0f, true); + } + + @Override + public long loop(float volume) { + return audioAPI.play(0f, volume, 0f, 0f, true); + } + + @Override + public long loop(float volume, float pitch, float pan) { + return audioAPI.play(0f, volume, pitch, pan, true); + } + + @Override + public void stop() { + audioAPI.stop(); + } + + @Override + public void pause() { + audioAPI.pause(); + } + + @Override + public void resume() { + audioAPI.resume(); + } + + @Override + public void dispose() { + audioAPI.dispose(); + } + + @Override + public void stop(long soundId) { + audioAPI.stop(soundId); + } + + @Override + public void pause(long soundId) { + audioAPI.pause(soundId); + } + + @Override + public void resume(long soundId) { + audioAPI.resume(soundId); + } + + @Override + public void setLooping(long soundId, boolean looping) { + audioAPI.setLooping(soundId, looping); + } + + @Override + public void setPitch(long soundId, float pitch) { + audioAPI.setPitch(soundId, pitch); + } + + @Override + public void setVolume(long soundId, float volume) { + audioAPI.setVolume(soundId, volume); + } + + @Override + public void setPan(long soundId, float pan, float volume) { + audioAPI.setPan(soundId, pan, volume); + } +} \ No newline at end of file From 9ee34fd9e1cb0b517d4e549cf3cde78537426fcc Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 4 Jul 2024 16:17:07 -0300 Subject: [PATCH 073/114] Improve adding gdx source --- buildSrc/src/main/kotlin/Dependencies.kt | 39 ++++++++---- .../gdx/examples/teavm/BuildFreetypeTest.java | 3 +- examples/gdx-tests/desktop/build.gradle.kts | 3 +- examples/gdx-tests/teavm/build.gradle.kts | 1 + .../gdx/examples/teavm/BuildGdxTest.java | 6 +- gradle.properties | 6 +- settings.gradle.kts | 60 +++++++++---------- 7 files changed, 68 insertions(+), 50 deletions(-) diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index b1608125..76607562 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -4,7 +4,9 @@ import java.util.* object LibExt { const val groupId = "com.github.xpenatan.gdx-teavm" - val libVersion: String = getVersion() + val properties = getProperties(); + + val libVersion: String = getVersion(properties) const val gdxVersion = "1.12.1" const val teaVMVersion = "0.10.0" @@ -18,26 +20,39 @@ object LibExt { const val aiVersion = "1.8.2" const val truthVersion = "1.4.2" + + + // ######### Add libgdx tests to project + // ######### Need to have libgdx project source code tag 1.12.1. + // ######### Need to disable in libgdx settings :tests:gdx-tests-gwt because of some conflicts + // ######### Need to update gradle properties. + val gdxSourcePath = properties.getOrDefault("gdxSourcePath", "") as String + val gdxTestsAssetsPath = "${gdxSourcePath}/tests/gdx-tests-android/assets/" + val teavmPath = properties.getOrDefault("teavmPath", "") as String + val includeLibgdxSource = (properties.getOrDefault("includeLibgdxSource", "false") as String).toBoolean() + val includeTeaVMSource = (properties.getOrDefault("includeTeaVMSource", "false") as String).toBoolean() } -private fun getVersion(): String { +private fun getVersion(properties: Properties): String { val isReleaseStr = System.getenv("RELEASE") val isRelease = isReleaseStr != null && isReleaseStr.toBoolean() var libVersion = "-SNAPSHOT" + val version = properties.getProperty("version") + if(isRelease) { + libVersion = version + } + println("Lib Version: $libVersion") + return libVersion +} + +private fun getProperties(): Properties { val file = File("gradle.properties") + val properties = Properties() if(file.exists()) { - val properties = Properties() properties.load(file.inputStream()) - val version = properties.getProperty("version") - if(isRelease) { - libVersion = version - } } else { - if(isRelease) { - throw RuntimeException("properties should exist") - } + throw RuntimeException("properties should exist") } - println("Lib Version: $libVersion") - return libVersion + return properties } \ No newline at end of file diff --git a/examples/freetype/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java b/examples/freetype/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java index 0f3632f5..d21aa34c 100644 --- a/examples/freetype/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java +++ b/examples/freetype/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java @@ -1,5 +1,6 @@ package com.github.xpenatan.gdx.examples.teavm; +import com.github.xpenatan.gdx.backends.teavm.config.AssetFileHandle; import com.github.xpenatan.gdx.backends.teavm.config.TeaBuildConfiguration; import com.github.xpenatan.gdx.backends.teavm.config.TeaBuilder; import com.github.xpenatan.gdx.backends.teavm.gen.SkipClass; @@ -14,7 +15,7 @@ public class BuildFreetypeTest { public static void main(String[] args) throws IOException { TeaBuildConfiguration teaBuildConfiguration = new TeaBuildConfiguration(); - teaBuildConfiguration.assetsPath.add(new File("../desktop/assets")); + teaBuildConfiguration.assetsPath.add(new AssetFileHandle("../desktop/assets")); teaBuildConfiguration.webappPath = new File("build/dist").getCanonicalPath(); TeaVMTool tool = TeaBuilder.config(teaBuildConfiguration); diff --git a/examples/gdx-tests/desktop/build.gradle.kts b/examples/gdx-tests/desktop/build.gradle.kts index d4484644..cc79a95e 100644 --- a/examples/gdx-tests/desktop/build.gradle.kts +++ b/examples/gdx-tests/desktop/build.gradle.kts @@ -10,8 +10,7 @@ dependencies { val mainClassName = "com.github.xpenatan.imgui.example.tests.Main" -// Change to your source asset directory -val assetsDir = File("E:\\Dev\\Projects\\java\\libgdx\\tests\\gdx-tests-android\\assets\\"); +val assetsDir = File(LibExt.gdxTestsAssetsPath) tasks.register("gdx-tests-run-desktop") { dependsOn("classes") diff --git a/examples/gdx-tests/teavm/build.gradle.kts b/examples/gdx-tests/teavm/build.gradle.kts index f7811f8e..234d1543 100644 --- a/examples/gdx-tests/teavm/build.gradle.kts +++ b/examples/gdx-tests/teavm/build.gradle.kts @@ -23,6 +23,7 @@ tasks.register("gdx-tests-build") { group = "examples-teavm" description = "Build gdx-tests example" mainClass.set(mainClassName) + args = mutableListOf(LibExt.gdxTestsAssetsPath) classpath = sourceSets["main"].runtimeClasspath } diff --git a/examples/gdx-tests/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildGdxTest.java b/examples/gdx-tests/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildGdxTest.java index 74646f7c..49709f30 100644 --- a/examples/gdx-tests/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildGdxTest.java +++ b/examples/gdx-tests/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildGdxTest.java @@ -1,5 +1,6 @@ package com.github.xpenatan.gdx.examples.teavm; +import com.github.xpenatan.gdx.backends.teavm.config.AssetFileHandle; import com.github.xpenatan.gdx.backends.teavm.config.TeaBuildConfiguration; import com.github.xpenatan.gdx.backends.teavm.config.TeaBuilder; import com.github.xpenatan.gdx.backends.teavm.config.plugins.TeaReflectionSupplier; @@ -16,11 +17,8 @@ public static void main(String[] args) throws IOException { String reflectionPackage = "com.badlogic.gdx.math"; TeaReflectionSupplier.addReflectionClass(reflectionPackage); - // Change to your source asset directory - String libgdxTestAssetsPath = "E:\\Dev\\Projects\\java\\libgdx\\tests\\gdx-tests-android\\assets\\"; - TeaBuildConfiguration teaBuildConfiguration = new TeaBuildConfiguration(); - teaBuildConfiguration.assetsPath.add(new File(libgdxTestAssetsPath)); + teaBuildConfiguration.assetsPath.add(new AssetFileHandle(args[0])); teaBuildConfiguration.webappPath = new File("build/dist").getCanonicalPath(); TeaVMTool tool = TeaBuilder.config(teaBuildConfiguration); diff --git a/gradle.properties b/gradle.properties index 67ff577c..68903dee 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1,5 @@ -version=1.0.0-b10 \ No newline at end of file +version=1.0.0-b10 +gdxSourcePath = E:/Dev/Projects/java/libgdx +teavmPath = E:/Dev/Projects/java/teavm +includeLibgdxSource = false +includeTeaVMSource = false \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 10981b2a..9acdcaa0 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,3 +1,5 @@ +import java.util.* + include(":backends:backend-teavm") include(":extensions:gdx-freetype-teavm") @@ -14,33 +16,31 @@ include(":examples:freetype:core") include(":examples:freetype:desktop") include(":examples:freetype:teavm") -// ######### Add libgdx tests to project -// ######### Need to have libgdx project source code tag 1.12.1. -// ######### Need to disable in libgdx settings :tests:gdx-tests-gwt because of some conflicts -// ######### Need to update assets path in desktop gradle and teavm build class. - -//include(":examples:gdx-tests:core") -//include(":examples:gdx-tests:desktop") -//include(":examples:gdx-tests:teavm") -//includeBuild("E:\\Dev\\Projects\\java\\libgdx") - -// ######### - -// ######### Replace teavm libs to use teavm sources -// ######### Only use it if you want to test teavm source code. -// ######### Change 'teavmPath' to your teavm source directory - -//val teavmPath = "E:\\Dev\\Projects\\java\\teavm"; - -//includeBuild(teavmPath) { -// dependencySubstitution { -// substitute(module("org.teavm:teavm-tooling")).using(project(":tools:core")) -// substitute(module("org.teavm:teavm-core")).using(project(":core")) -// substitute(module("org.teavm:teavm-classlib")).using(project(":classlib")) -// substitute(module("org.teavm:teavm-jso")).using(project(":jso:core")) -// substitute(module("org.teavm:teavm-jso-apis")).using(project(":jso:apis")) -// substitute(module("org.teavm:teavm-jso-impl")).using(project(":jso:impl")) -// } -//} - -// ######### \ No newline at end of file +val file = File("gradle.properties") +val properties = Properties() +properties.load(file.inputStream()) + +val gdxSourcePath = properties.getOrDefault("gdxSourcePath", "") as String +val teavmPath = properties.getOrDefault("teavmPath", "") as String +val includeLibgdxSource = (properties.getOrDefault("includeLibgdxSource", "false") as String).toBoolean() +val includeTeaVMSource = (properties.getOrDefault("includeTeaVMSource", "false") as String).toBoolean() + +if(includeLibgdxSource) { + include(":examples:gdx-tests:core") + include(":examples:gdx-tests:desktop") + include(":examples:gdx-tests:teavm") + includeBuild(gdxSourcePath) +} + +if(includeTeaVMSource) { + includeBuild(teavmPath) { + dependencySubstitution { + substitute(module("org.teavm:teavm-tooling")).using(project(":tools:core")) + substitute(module("org.teavm:teavm-core")).using(project(":core")) + substitute(module("org.teavm:teavm-classlib")).using(project(":classlib")) + substitute(module("org.teavm:teavm-jso")).using(project(":jso:core")) + substitute(module("org.teavm:teavm-jso-apis")).using(project(":jso:apis")) + substitute(module("org.teavm:teavm-jso-impl")).using(project(":jso:impl")) + } + } +} \ No newline at end of file From 534af1179bc218a3c1b80b0d904b3449d457f316 Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 4 Jul 2024 16:19:52 -0300 Subject: [PATCH 074/114] fix imgui code --- .../imgui/example/tests/imgui/ImGuiTestsApp.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java b/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java index 14208b24..946dadc2 100644 --- a/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java +++ b/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java @@ -43,13 +43,7 @@ public class ImGuiTestsApp implements Screen { @Override public void show() { testList = TeaVMGdxTests.getTestList(); - if(Gdx.app.getType() == Application.ApplicationType.WebGL) { - // Not possible to have ini filename with webgl - ImGui.CreateContext(false); - } - else { - ImGui.CreateContext(true); - } + ImGui.CreateContext(); ImGuiIO io = ImGui.GetIO(); io.ConfigFlags(ImGuiConfigFlags.ImGuiConfigFlags_DockingEnable); @@ -174,4 +168,4 @@ public void dispose() { ImGui.disposeStatic(); ImGui.DestroyContext(); } -} +} \ No newline at end of file From f88f1f654874c0c5ad7893fc1d3d9a7df9c843af Mon Sep 17 00:00:00 2001 From: Natan Date: Fri, 5 Jul 2024 14:42:15 -0300 Subject: [PATCH 075/114] Fixes --- .../gdx/backends/teavm/filesystem/MemoryFileStorage.java | 2 +- .../com/github/xpenatan/gdx/examples/teavm/BuildGdxTest.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java index dc130d03..29afab07 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/MemoryFileStorage.java @@ -328,7 +328,7 @@ final protected FileData getInternal(String path) { if(debug) { path = "\"" + path + "\""; String type = fileData != null && fileData.isDirectory() ? " GET FOLDER: " : " GET FILE: "; - System.out.println(getClass().getSimpleName() + type + (fileData != null) + " Size: " + fileData.getBytesSize() + " Path: " + path); + System.out.println(getClass().getSimpleName() + type + (fileData != null) + " Size: " + (fileData != null ? fileData.getBytesSize() : 0) + " Path: " + path); } return fileData; } diff --git a/examples/gdx-tests/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildGdxTest.java b/examples/gdx-tests/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildGdxTest.java index 49709f30..8f4381b5 100644 --- a/examples/gdx-tests/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildGdxTest.java +++ b/examples/gdx-tests/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildGdxTest.java @@ -1,6 +1,5 @@ package com.github.xpenatan.gdx.examples.teavm; -import com.github.xpenatan.gdx.backends.teavm.config.AssetFileHandle; import com.github.xpenatan.gdx.backends.teavm.config.TeaBuildConfiguration; import com.github.xpenatan.gdx.backends.teavm.config.TeaBuilder; import com.github.xpenatan.gdx.backends.teavm.config.plugins.TeaReflectionSupplier; @@ -18,7 +17,7 @@ public static void main(String[] args) throws IOException { TeaReflectionSupplier.addReflectionClass(reflectionPackage); TeaBuildConfiguration teaBuildConfiguration = new TeaBuildConfiguration(); - teaBuildConfiguration.assetsPath.add(new AssetFileHandle(args[0])); + teaBuildConfiguration.assetsPath.add(new File(args[0])); teaBuildConfiguration.webappPath = new File("build/dist").getCanonicalPath(); TeaVMTool tool = TeaBuilder.config(teaBuildConfiguration); From 454c2010dd065ebe2954e5084d099d68ec6ee872 Mon Sep 17 00:00:00 2001 From: Natan Date: Fri, 5 Jul 2024 14:47:32 -0300 Subject: [PATCH 076/114] Fixes --- .../github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/freetype/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java b/examples/freetype/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java index d21aa34c..0f3632f5 100644 --- a/examples/freetype/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java +++ b/examples/freetype/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java @@ -1,6 +1,5 @@ package com.github.xpenatan.gdx.examples.teavm; -import com.github.xpenatan.gdx.backends.teavm.config.AssetFileHandle; import com.github.xpenatan.gdx.backends.teavm.config.TeaBuildConfiguration; import com.github.xpenatan.gdx.backends.teavm.config.TeaBuilder; import com.github.xpenatan.gdx.backends.teavm.gen.SkipClass; @@ -15,7 +14,7 @@ public class BuildFreetypeTest { public static void main(String[] args) throws IOException { TeaBuildConfiguration teaBuildConfiguration = new TeaBuildConfiguration(); - teaBuildConfiguration.assetsPath.add(new AssetFileHandle("../desktop/assets")); + teaBuildConfiguration.assetsPath.add(new File("../desktop/assets")); teaBuildConfiguration.webappPath = new File("build/dist").getCanonicalPath(); TeaVMTool tool = TeaBuilder.config(teaBuildConfiguration); From 8ae8c0224019f4d46994de15ecd80f4c15b48c6d Mon Sep 17 00:00:00 2001 From: Natan Date: Fri, 5 Jul 2024 14:48:20 -0300 Subject: [PATCH 077/114] Change file to asset file handle --- .../github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/freetype/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java b/examples/freetype/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java index 0f3632f5..d21aa34c 100644 --- a/examples/freetype/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java +++ b/examples/freetype/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildFreetypeTest.java @@ -1,5 +1,6 @@ package com.github.xpenatan.gdx.examples.teavm; +import com.github.xpenatan.gdx.backends.teavm.config.AssetFileHandle; import com.github.xpenatan.gdx.backends.teavm.config.TeaBuildConfiguration; import com.github.xpenatan.gdx.backends.teavm.config.TeaBuilder; import com.github.xpenatan.gdx.backends.teavm.gen.SkipClass; @@ -14,7 +15,7 @@ public class BuildFreetypeTest { public static void main(String[] args) throws IOException { TeaBuildConfiguration teaBuildConfiguration = new TeaBuildConfiguration(); - teaBuildConfiguration.assetsPath.add(new File("../desktop/assets")); + teaBuildConfiguration.assetsPath.add(new AssetFileHandle("../desktop/assets")); teaBuildConfiguration.webappPath = new File("build/dist").getCanonicalPath(); TeaVMTool tool = TeaBuilder.config(teaBuildConfiguration); From aff774b29257d5b3d54301b7206e58fdec55cd11 Mon Sep 17 00:00:00 2001 From: Natan Date: Fri, 5 Jul 2024 18:50:12 -0300 Subject: [PATCH 078/114] wip audio --- .../dom/AudioBufferSourceNodeWrapper.java | 58 +++++++++++++------ .../backends/teavm/webaudio/WebAudioAPI.java | 17 ++++-- 2 files changed, 50 insertions(+), 25 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/AudioBufferSourceNodeWrapper.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/AudioBufferSourceNodeWrapper.java index 537968f2..f552f9ea 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/AudioBufferSourceNodeWrapper.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/AudioBufferSourceNodeWrapper.java @@ -13,20 +13,24 @@ /** * Ported https://github.com/WebAudio/web-audio-api/issues/2397#issuecomment-1262583050 + * SourceNode is duplicated because there is sound glitch when trying the original code, * @author xpenatan */ public class AudioBufferSourceNodeWrapper { - private AudioContext audioContext; public AudioBufferSourceNode _bufferSource; - ChannelSplitterNode _splitter; - ChannelMergerNode _out; - Float32Array _sampleHolder; - AnalyserNode _analyser; + private AudioContext audioContext; +// private AudioBufferSourceNode _bufferPositionSource; + private ChannelSplitterNode _splitter; + private ChannelMergerNode _out; + private Float32Array _sampleHolder; + private AnalyserNode _analyser; + private float duration; public AudioBufferSourceNodeWrapper(AudioContext audioContext) { this.audioContext = audioContext; _bufferSource = audioContext.createBufferSource(); +// _bufferPositionSource = audioContext.createBufferSource(); _splitter = audioContext.createChannelSplitter(); _out = audioContext.createChannelMerger(); _sampleHolder = new Float32Array(1); @@ -37,41 +41,42 @@ public AudioBuffer getBuffer() { } public void setBuffer(AudioBuffer audioBuffer) { +// _bufferSource.setBuffer(audioBuffer); + duration = (float)audioBuffer.getDuration(); - AudioBuffer buffer2 = audioContext.createBuffer(audioBuffer.getNumberOfChannels() + 1, audioBuffer.getLength(), audioBuffer.getSampleRate()); + int numberOfChannels = audioBuffer.getNumberOfChannels(); + int length = audioBuffer.getLength(); + float sampleRate = audioBuffer.getSampleRate(); - _bufferSource.setBuffer(buffer2); + AudioBuffer newBuffer = audioContext.createBuffer(numberOfChannels + 1, length, sampleRate); // copy data from the audioBuffer arg to our new AudioBuffer - for (int index = 0; index < audioBuffer.getNumberOfChannels(); index++) { - _bufferSource.getBuffer().copyToChannel(audioBuffer.getChannelData(index), index); + for (int index = 0; index < numberOfChannels; index++) { + newBuffer.copyToChannel(audioBuffer.getChannelData(index), index); } // fill up the position channel with numbers from 0 to 1 - - int length = audioBuffer.getLength(); Float32Array timeDataArray = new Float32Array(length); for (int i = 0; i < length; i++) { - timeDataArray.set(i, (float)i / length); + float val = i / (float)length; + timeDataArray.set(i, val); } - _bufferSource.getBuffer().copyToChannel(timeDataArray, audioBuffer.getNumberOfChannels()); + newBuffer.copyToChannel(timeDataArray, numberOfChannels); -// for (int index = 0; index < audioBuffer.getLength(); index++) { -// Float32Array channelData = _bufferSource.getBuffer().getChannelData(audioBuffer.getNumberOfChannels()); -// channelData.set(index, (float)(index / audioBuffer.getLength())); -// } + // Set buffer need to be after copy channel so timer works on firefox + _bufferSource.setBuffer(newBuffer); // split the channels _bufferSource.connect(_splitter); // connect all the audio channels to the line out - for (int index = 0; index < audioBuffer.getNumberOfChannels(); index++) { + for (int index = 0; index < numberOfChannels; index++) { _splitter.connect(_out, index, index); } // connect the position channel to an analyzer so we can extract position data _analyser = audioContext.createAnalyser(); - _splitter.connect(_analyser, audioBuffer.getNumberOfChannels()); + _splitter.connect(_analyser, numberOfChannels+1); } public AudioParam getPlaybackRate() { @@ -88,6 +93,7 @@ public boolean getLoop() { public void setLoop(boolean loop) { _bufferSource.setLoop(loop); +// _bufferPositionSource.setLoop(loop); } public double getLoopStart() { @@ -96,6 +102,7 @@ public double getLoopStart() { public void setLoopStart(double start) { _bufferSource.setLoopStart(start); +// _bufferPositionSource.setLoopStart(start); } public double getLoopEnd() { @@ -104,6 +111,7 @@ public double getLoopEnd() { public void setLoopEnd(double end) { _bufferSource.setLoopEnd(end); +// _bufferPositionSource.setLoopEnd(end); } public void setOnEnded(EventListener ent) { @@ -112,30 +120,42 @@ public void setOnEnded(EventListener ent) { public void start(double when, double offset, double duration) { _bufferSource.start(when, offset, duration); +// _bufferPositionSource.start(when, offset, duration); } public void start(double when, double offset) { _bufferSource.start(when, offset); +// _bufferPositionSource.start(when, offset); } public void start(double when) { _bufferSource.start(when); +// _bufferPositionSource.start(when); } public void start() { _bufferSource.start(); +// _bufferPositionSource.start(); } public void stop(double when) { _bufferSource.stop(when); +// _bufferPositionSource.stop(when); } public void stop() { _bufferSource.stop(); +// _bufferPositionSource.stop(); } + /** return position 0f - 1f */ public float getPlaybackPosition() { _analyser.getFloatTimeDomainData(_sampleHolder); return _sampleHolder.get(0); } + + /** return position 0f - 1f */ + public float getPlaybackDuration() { + return getPlaybackPosition() * duration; + } } \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPI.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPI.java index 42a0c4ae..f3f47b0d 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPI.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPI.java @@ -155,8 +155,10 @@ public void pause(long soundId) { audioSourceData.pauseTime = audioContext.getCurrentTime(); // Remove ended listener when pausing - audioSourceData.node.setOnEnded(evt -> {}); - audioSourceData.node.stop(); + if(audioSourceData.node != null) { + audioSourceData.node.setOnEnded(evt -> {}); + audioSourceData.node.stop(); + } } } @@ -232,9 +234,8 @@ public float getCurrentTime(long soundId) { int soundKey = (int)soundId; if(activeSounds.containsKey(soundKey)) { AudioSourceData audioSourceData = activeSounds.get(soundKey); - float playbackPosition = audioSourceData.node.getPlaybackPosition(); - - System.out.println("playbackPosition: " + playbackPosition); + float playbackPosition = audioSourceData.node.getPlaybackDuration(); + return playbackPosition; // if(audioSourceData.pauseTime == audioSourceData.startTime) { @@ -296,7 +297,7 @@ public void onError(JSObject error) { private static class AudioSourceData { public final int soundId; - public AudioBufferSourceNodeWrapper node; + private AudioBufferSourceNodeWrapper node; public AudioControlGraph audioControlGraph; public double startTime; public double pauseTime; @@ -308,6 +309,10 @@ private static class AudioSourceData { public boolean loop; public boolean delayedPlay = false; + public AudioBufferSourceNodeWrapper getNode() { + return node; + } + public AudioSourceData(int soundId) { this.soundId = soundId; } From 59b24e57d8d637af70383aedf5864b39d218bca1 Mon Sep 17 00:00:00 2001 From: Natan Date: Fri, 5 Jul 2024 23:19:26 -0300 Subject: [PATCH 079/114] add new audio --- CHANGES.md | 1 + .../gdx/backends/teavm/DefaultTeaAudio.java | 6 +- .../gdx/backends/teavm/TeaApplication.java | 10 ++ .../backends/teavm/webaudio/howler/Howl.java | 68 ++++++++++ .../webaudio/howler/HowlEventFunction.java | 9 ++ .../teavm/webaudio/howler/HowlMusic.java | 92 ++++++++++++++ .../teavm/webaudio/howler/HowlPannerAttr.java | 12 ++ .../teavm/webaudio/howler/HowlSound.java | 120 ++++++++++++++++++ .../webaudio/howler/HowlerAudioManager.java | 31 +++++ 9 files changed, 346 insertions(+), 3 deletions(-) create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/Howl.java create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/HowlEventFunction.java create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/HowlMusic.java create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/HowlPannerAttr.java create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/HowlSound.java create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/HowlerAudioManager.java diff --git a/CHANGES.md b/CHANGES.md index 3a5335e6..87859d5e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,7 @@ - New Gdx.files.internal, classpath and local implementation. Local files uses IndexedDB. - Call dispose when browser closes - Improve clipboard text copy/paste. +- Change default sound/music api to howler.js [1.0.0-b9] - add TeaClassFilter printAllowedClasses() and printExcludedClasses() diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/DefaultTeaAudio.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/DefaultTeaAudio.java index 3090b9b2..e1ce77d2 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/DefaultTeaAudio.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/DefaultTeaAudio.java @@ -6,17 +6,17 @@ import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.GdxRuntimeException; -import com.github.xpenatan.gdx.backends.teavm.webaudio.WebAudioAPIManager; +import com.github.xpenatan.gdx.backends.teavm.webaudio.howler.HowlerAudioManager; /** * @author xpenatan * Port from GWT gdx 1.12.0 */ public class DefaultTeaAudio implements TeaAudio { - private WebAudioAPIManager webAudioAPIManager = null; + private HowlerAudioManager webAudioAPIManager = null; public DefaultTeaAudio() { - webAudioAPIManager = new WebAudioAPIManager(); + webAudioAPIManager = new HowlerAudioManager(); } @Override diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java index 25985c29..b831445b 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java @@ -126,6 +126,7 @@ else if(agentInfo.isLinux()) clipboard = new TeaClipboard(); initGdx(); + initSound(); Gdx.app = this; Gdx.graphics = graphics; @@ -485,4 +486,13 @@ public boolean onSuccess(String url, Object result) { } }); } + + private void initSound() { + preloader.loadScript(true, "howler.js", new AssetLoaderListener() { + @Override + public boolean onSuccess(String url, Object result) { + return true; + } + }); + } } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/Howl.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/Howl.java new file mode 100644 index 00000000..a8351076 --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/Howl.java @@ -0,0 +1,68 @@ +package com.github.xpenatan.gdx.backends.teavm.webaudio.howler; + +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; +import org.teavm.jso.JSBody; +import org.teavm.jso.JSClass; +import org.teavm.jso.JSMethod; +import org.teavm.jso.JSObject; + +@JSClass +public class Howl implements JSObject { + + @JSBody(params = { "arrayBufferView"}, script = "" + + "var blob = new Blob( [ arrayBufferView ]);" + + "var howlSource = URL.createObjectURL(blob);" + + "return new Howl({ src: [howlSource], format: ['ogg', 'webm', 'mp3', 'wav']});") + public static native Howl create(ArrayBufferViewWrapper arrayBufferView); + + public native int play(); + public native int play(int soundId); + public native void stop(int soundId); + public native void pause(int soundId); + @JSMethod("rate") + public native void setRate(float rate, int soundId); + @JSMethod("rate") + public native float getRate(int soundId); + @JSMethod("volume") + public native void setVolume(float volume, int soundId); + @JSMethod("volume") + public native float getVolume(int soundId); + @JSMethod("mute") + public native void setMute(boolean mute, int soundId); + @JSMethod("mute") + public native boolean getMute(int soundId); + @JSMethod("seek") + public native void setSeek(float seek, int soundId); + @JSMethod("seek") + public native float getSeek(int soundId); + @JSMethod("duration") + public native int getDuration(int spriteId); + @JSMethod("duration") + public native float getDuration(); + @JSMethod("loop") + public native void setLoop (boolean loop , int soundId); + @JSMethod("loop") + public native boolean getLoop(int soundId); + @JSMethod("playing") + public native boolean isPlaying(int soundId); + + @JSMethod("pannerAttr") + public native void setPannerAttr(HowlPannerAttr pannerAttr, int soundId); + @JSMethod("pannerAttr") + public native HowlPannerAttr getPannerAttr(int soundId); + @JSMethod("stereo") + public native void setStereo(float pan, int soundId); + @JSMethod("stereo") + public native float getStereo(int soundId); + + // Globals + public native void stop(); + public native void pause(); + @JSMethod("volume") + public native void setVolume(float volume); + @JSMethod("volume") + public native float getVolume(); + public native float on(String event, HowlEventFunction function, int soundId); + @JSMethod("stereo") + public native void setStereo(float pan); +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/HowlEventFunction.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/HowlEventFunction.java new file mode 100644 index 00000000..a4e077f1 --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/HowlEventFunction.java @@ -0,0 +1,9 @@ +package com.github.xpenatan.gdx.backends.teavm.webaudio.howler; + +import org.teavm.jso.JSFunctor; +import org.teavm.jso.JSObject; + +@JSFunctor +public interface HowlEventFunction extends JSObject { + void onEvent(); +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/HowlMusic.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/HowlMusic.java new file mode 100644 index 00000000..63dbe125 --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/HowlMusic.java @@ -0,0 +1,92 @@ +package com.github.xpenatan.gdx.backends.teavm.webaudio.howler; + +import com.badlogic.gdx.audio.Music; +import com.badlogic.gdx.files.FileHandle; +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; + +public class HowlMusic implements Music { + + private int soundId; + private Howl howl; + + public HowlMusic(FileHandle fileHandle) { + byte[] bytes = fileHandle.readBytes(); + ArrayBufferViewWrapper data = TypedArrays.getTypedArray(bytes); + howl = Howl.create(data); + } + + @Override + public void play() { + if(soundId != -1) { + soundId = howl.play(soundId); + } + else { + soundId = howl.play(); + } + } + + @Override + public void pause() { + howl.pause(soundId); + } + + @Override + public void stop() { + howl.stop(); + soundId = -1; + } + + @Override + public boolean isPlaying() { + return howl.isPlaying(soundId); + } + + @Override + public void setLooping(boolean isLooping) { + howl.setLoop(isLooping, soundId); + } + + @Override + public boolean isLooping() { + return howl.getLoop(soundId); + } + + @Override + public void setVolume(float volume) { + howl.setVolume(volume, soundId); + } + + @Override + public float getVolume() { + return howl.getVolume(soundId); + } + + @Override + public void setPan(float pan, float volume) { + howl.setStereo(pan, soundId); + howl.setVolume(volume, soundId); + } + + @Override + public void setPosition(float position) { + howl.setSeek(position, soundId); + } + + @Override + public float getPosition() { + return howl.getSeek(soundId); + } + + @Override + public void dispose() { + howl.stop(); + soundId = -1; + howl = null; + } + + @Override + public void setOnCompletionListener(OnCompletionListener listener) { + howl.on("end", () -> listener.onCompletion(HowlMusic.this), soundId); + } +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/HowlPannerAttr.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/HowlPannerAttr.java new file mode 100644 index 00000000..862b996e --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/HowlPannerAttr.java @@ -0,0 +1,12 @@ +package com.github.xpenatan.gdx.backends.teavm.webaudio.howler; + +import org.teavm.jso.JSClass; +import org.teavm.jso.JSObject; +import org.teavm.jso.JSProperty; + +@JSClass +public class HowlPannerAttr implements JSObject { + + @JSProperty() + public native void setConeInnerAngle (int angle); +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/HowlSound.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/HowlSound.java new file mode 100644 index 00000000..8965ea0a --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/HowlSound.java @@ -0,0 +1,120 @@ +package com.github.xpenatan.gdx.backends.teavm.webaudio.howler; + +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.files.FileHandle; +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; + +public class HowlSound implements Sound { + + private Howl howl; + + public HowlSound(FileHandle fileHandle) { + byte[] bytes = fileHandle.readBytes(); + ArrayBufferViewWrapper data = TypedArrays.getTypedArray(bytes); + howl = Howl.create(data); + } + + @Override + public long play() { + return howl.play(); + } + + @Override + public long play(float volume) { + int soundId = howl.play(); + howl.setVolume(volume, soundId); + return soundId; + } + + @Override + public long play(float volume, float pitch, float pan) { + int soundId = howl.play(); + howl.setVolume(volume, soundId); + howl.setRate(pitch, soundId); + howl.setStereo(pan, soundId); + return soundId; + } + + @Override + public long loop() { + int soundId = howl.play(); + howl.setLoop(true, soundId); + return soundId; + } + + @Override + public long loop(float volume) { + int soundId = howl.play(); + howl.setLoop(true, soundId); + howl.setVolume(volume, soundId); + return soundId; + } + + @Override + public long loop(float volume, float pitch, float pan) { + int soundId = howl.play(); + howl.setLoop(true, soundId); + howl.setVolume(volume, soundId); + howl.setStereo(volume, soundId); + return soundId; + } + + @Override + public void stop() { + howl.stop(); + } + + @Override + public void pause() { + howl.pause(); + } + + @Override + public void resume() { + howl.play(); + } + + @Override + public void dispose() { + howl.stop(); + howl = null; + } + + @Override + public void stop(long soundId) { + howl.stop((int)soundId); + } + + @Override + public void pause(long soundId) { + howl.pause((int)soundId); + } + + @Override + public void resume(long soundId) { + howl.play((int)soundId); + } + + @Override + public void setLooping(long soundId, boolean looping) { + howl.setLoop(looping, (int)soundId); + } + + @Override + public void setPitch(long soundId, float pitch) { + howl.setRate(pitch, (int)soundId); + } + + @Override + public void setVolume(long soundId, float volume) { + howl.setVolume(volume, (int)soundId); + } + + @Override + public void setPan(long soundId, float pan, float volume) { + int soundIdd = (int)soundId; + howl.setStereo(pan, soundIdd); + howl.setVolume(volume, soundIdd); + } +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/HowlerAudioManager.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/HowlerAudioManager.java new file mode 100644 index 00000000..ad082860 --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/howler/HowlerAudioManager.java @@ -0,0 +1,31 @@ +package com.github.xpenatan.gdx.backends.teavm.webaudio.howler; + +import com.badlogic.gdx.LifecycleListener; +import com.badlogic.gdx.audio.Music; +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.files.FileHandle; + +public class HowlerAudioManager implements LifecycleListener { + + public Sound createSound(FileHandle fileHandle) { + return new HowlSound(fileHandle); + } + + public Music createMusic(FileHandle fileHandle) { + return new HowlMusic(fileHandle); + } + @Override + public void pause() { + + } + + @Override + public void resume() { + + } + + @Override + public void dispose() { + + } +} From 2a396369345bac83e1c5d6dd9bcbd3ed573dfd58 Mon Sep 17 00:00:00 2001 From: Natan Date: Fri, 5 Jul 2024 23:22:01 -0300 Subject: [PATCH 080/114] Remove old audio --- .../dom/AudioBufferSourceNodeWrapper.java | 161 --------- .../teavm/webaudio/AudioControlGraph.java | 103 ------ .../teavm/webaudio/AudioControlGraphPool.java | 24 -- .../backends/teavm/webaudio/WebAudioAPI.java | 320 ------------------ .../teavm/webaudio/WebAudioAPIManager.java | 173 ---------- .../teavm/webaudio/WebAudioAPIMusic.java | 135 -------- .../teavm/webaudio/WebAudioMusic.java | 141 -------- .../teavm/webaudio/WebAudioSound.java | 107 ------ 8 files changed, 1164 deletions(-) delete mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/AudioBufferSourceNodeWrapper.java delete mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/AudioControlGraph.java delete mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/AudioControlGraphPool.java delete mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPI.java delete mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPIManager.java delete mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPIMusic.java delete mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioMusic.java delete mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioSound.java diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/AudioBufferSourceNodeWrapper.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/AudioBufferSourceNodeWrapper.java deleted file mode 100644 index f552f9ea..00000000 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/dom/AudioBufferSourceNodeWrapper.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.github.xpenatan.gdx.backends.teavm.dom; - -import org.teavm.jso.dom.events.EventListener; -import org.teavm.jso.typedarrays.Float32Array; -import org.teavm.jso.webaudio.AnalyserNode; -import org.teavm.jso.webaudio.AudioBuffer; -import org.teavm.jso.webaudio.AudioBufferSourceNode; -import org.teavm.jso.webaudio.AudioContext; -import org.teavm.jso.webaudio.AudioParam; -import org.teavm.jso.webaudio.ChannelMergerNode; -import org.teavm.jso.webaudio.ChannelSplitterNode; -import org.teavm.jso.webaudio.MediaEvent; - -/** - * Ported https://github.com/WebAudio/web-audio-api/issues/2397#issuecomment-1262583050 - * SourceNode is duplicated because there is sound glitch when trying the original code, - * @author xpenatan - */ -public class AudioBufferSourceNodeWrapper { - - public AudioBufferSourceNode _bufferSource; - private AudioContext audioContext; -// private AudioBufferSourceNode _bufferPositionSource; - private ChannelSplitterNode _splitter; - private ChannelMergerNode _out; - private Float32Array _sampleHolder; - private AnalyserNode _analyser; - private float duration; - - public AudioBufferSourceNodeWrapper(AudioContext audioContext) { - this.audioContext = audioContext; - _bufferSource = audioContext.createBufferSource(); -// _bufferPositionSource = audioContext.createBufferSource(); - _splitter = audioContext.createChannelSplitter(); - _out = audioContext.createChannelMerger(); - _sampleHolder = new Float32Array(1); - } - - public AudioBuffer getBuffer() { - return _bufferSource.getBuffer(); - } - - public void setBuffer(AudioBuffer audioBuffer) { -// _bufferSource.setBuffer(audioBuffer); - duration = (float)audioBuffer.getDuration(); - - int numberOfChannels = audioBuffer.getNumberOfChannels(); - int length = audioBuffer.getLength(); - float sampleRate = audioBuffer.getSampleRate(); - - AudioBuffer newBuffer = audioContext.createBuffer(numberOfChannels + 1, length, sampleRate); - - // copy data from the audioBuffer arg to our new AudioBuffer - for (int index = 0; index < numberOfChannels; index++) { - newBuffer.copyToChannel(audioBuffer.getChannelData(index), index); - } - - // fill up the position channel with numbers from 0 to 1 - Float32Array timeDataArray = new Float32Array(length); - for (int i = 0; i < length; i++) { - float val = i / (float)length; - timeDataArray.set(i, val); - } - newBuffer.copyToChannel(timeDataArray, numberOfChannels); - - // Set buffer need to be after copy channel so timer works on firefox - _bufferSource.setBuffer(newBuffer); - - // split the channels - _bufferSource.connect(_splitter); - - // connect all the audio channels to the line out - for (int index = 0; index < numberOfChannels; index++) { - _splitter.connect(_out, index, index); - } - - // connect the position channel to an analyzer so we can extract position data - _analyser = audioContext.createAnalyser(); - _splitter.connect(_analyser, numberOfChannels+1); - } - - public AudioParam getPlaybackRate() { - return _bufferSource.getPlaybackRate(); - } - - public AudioParam getDetune() { - return _bufferSource.getDetune(); - } - - public boolean getLoop() { - return _bufferSource.getLoop(); - } - - public void setLoop(boolean loop) { - _bufferSource.setLoop(loop); -// _bufferPositionSource.setLoop(loop); - } - - public double getLoopStart() { - return _bufferSource.getLoopStart(); - } - - public void setLoopStart(double start) { - _bufferSource.setLoopStart(start); -// _bufferPositionSource.setLoopStart(start); - } - - public double getLoopEnd() { - return _bufferSource.getLoopEnd(); - } - - public void setLoopEnd(double end) { - _bufferSource.setLoopEnd(end); -// _bufferPositionSource.setLoopEnd(end); - } - - public void setOnEnded(EventListener ent) { - _bufferSource.setOnEnded(ent); - } - - public void start(double when, double offset, double duration) { - _bufferSource.start(when, offset, duration); -// _bufferPositionSource.start(when, offset, duration); - } - - public void start(double when, double offset) { - _bufferSource.start(when, offset); -// _bufferPositionSource.start(when, offset); - } - - public void start(double when) { - _bufferSource.start(when); -// _bufferPositionSource.start(when); - } - - public void start() { - _bufferSource.start(); -// _bufferPositionSource.start(); - } - - public void stop(double when) { - _bufferSource.stop(when); -// _bufferPositionSource.stop(when); - } - - public void stop() { - _bufferSource.stop(); -// _bufferPositionSource.stop(); - } - - /** return position 0f - 1f */ - public float getPlaybackPosition() { - _analyser.getFloatTimeDomainData(_sampleHolder); - return _sampleHolder.get(0); - } - - /** return position 0f - 1f */ - public float getPlaybackDuration() { - return getPlaybackPosition() * duration; - } -} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/AudioControlGraph.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/AudioControlGraph.java deleted file mode 100644 index 2b59a44d..00000000 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/AudioControlGraph.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.github.xpenatan.gdx.backends.teavm.webaudio; - - -import org.teavm.jso.JSBody; -import org.teavm.jso.JSObject; - -/** - * Port from GWT gdx 1.12.0 - * - * @author xpenatan - */ -public class AudioControlGraph { - private final JSObject audioContext; - private JSObject destinationNode; - - private JSObject gainNode; - private JSObject panNode; - - public AudioControlGraph(JSObject audioContext, JSObject destinationNode) { - this.audioContext = audioContext; - this.destinationNode = destinationNode; - - panNode = setupPanNode(audioContext); - gainNode = setupAudioGraph(audioContext, panNode, destinationNode); - } - - @JSBody(params = { "audioContext" }, script = "" + - "var panNode = null;" + - "if (audioContext.createStereoPanner) {\n" + - " panNode = audioContext.createStereoPanner();\n" + - " panNode.pan.value = 0;\n" + - "}" + - "return panNode;" - ) - public static native JSObject setupPanNode(JSObject audioContext); - - @JSBody(params = { "audioContext", "panNode", "destinationNode" }, script = "" + - "var gainNode = null;" + - "if(audioContext.createGain)" + - " gainNode = audioContext.createGain();" + - "else" + - " gainNode = audioContext.createGainNode();" + - "gainNode.gain.value = 1;" + - "if(panNode) {" + - " panNode.connect(gainNode)" + - "}" + - "gainNode.connect(destinationNode);" + - "return gainNode;" - ) - public static native JSObject setupAudioGraph(JSObject audioContext, JSObject panNode, JSObject destinationNode); - - @JSBody(params = { "sourceNode", "panNode", "gainNode" }, script = "" + - "if (panNode) {" + - " sourceNode.connect(panNode);" + - "} else {" + - " sourceNode.connect(gainNode);" + - "}" - ) - public static native void setSourceJSNI(JSObject sourceNode, JSObject panNode, JSObject gainNode); - - public void setVolume(float volume) { - setVolumeJSNI(volume, gainNode); - } - - public float getVolume() { - return getVolumeJSNI(gainNode); - } - - @JSBody(params = { "volume", "gainNode" }, script = "" + - "gainNode.gain.value = volume;" - ) - public static native void setVolumeJSNI(float volume, JSObject gainNode); - - @JSBody(params = { "gainNode" }, script = "" + - "return gainNode.gain.value;" - ) - public static native float getVolumeJSNI(JSObject gainNode); - - public void setPan(float pan) { - setPanJSNI(pan, panNode); - } - - public float getPan() { - return getPanJSNI(panNode); - } - - @JSBody(params = { "pan", "panNode" }, script = "" + - "if(panNode)" + - " panNode.pan.value = pan" - ) - public static native void setPanJSNI(float pan, JSObject panNode); - - @JSBody(params = { "panNode" }, script = "" + - "if(panNode)" + - " return panNode.pan.value;" + - "return 0;" - ) - public static native float getPanJSNI(JSObject panNode); - - public void setSource(JSObject sourceNode) { - setSourceJSNI(sourceNode, panNode, gainNode); - } -} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/AudioControlGraphPool.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/AudioControlGraphPool.java deleted file mode 100644 index c960c449..00000000 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/AudioControlGraphPool.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.github.xpenatan.gdx.backends.teavm.webaudio; - -import com.badlogic.gdx.utils.Pool; -import org.teavm.jso.JSObject; - -/** - * Port from GWT gdx 1.12.0 - * - * @author xpenatan - */ -public class AudioControlGraphPool extends Pool { - public JSObject audioContext; - public JSObject destinationNode; - - public AudioControlGraphPool(JSObject audioContext, JSObject destinationNode) { - this.audioContext = audioContext; - this.destinationNode = destinationNode; - } - - @Override - protected AudioControlGraph newObject() { - return new AudioControlGraph(audioContext, destinationNode); - } -} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPI.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPI.java deleted file mode 100644 index f3f47b0d..00000000 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPI.java +++ /dev/null @@ -1,320 +0,0 @@ -package com.github.xpenatan.gdx.backends.teavm.webaudio; - -import com.badlogic.gdx.files.FileHandle; -import com.badlogic.gdx.utils.IntMap; -import com.badlogic.gdx.utils.IntMap.Keys; -import com.github.xpenatan.gdx.backends.teavm.dom.AudioBufferSourceNodeWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferWrapper; -import org.teavm.jso.JSObject; -import org.teavm.jso.typedarrays.ArrayBuffer; -import org.teavm.jso.webaudio.AudioBuffer; -import org.teavm.jso.webaudio.AudioContext; -import org.teavm.jso.webaudio.AudioParam; -import org.teavm.jso.webaudio.DecodeErrorCallback; -import org.teavm.jso.webaudio.DecodeSuccessCallback; -import org.teavm.jso.webaudio.GainNode; - -/** - * Port from GWT gdx 1.12.0 - * - * @author xpenatan - */ -public class WebAudioAPI { - // JavaScript object that is the base object of the Web Audio API - private final AudioContext audioContext; - - // JavaScript AudioNode representing the final destination of the sound. Typically the speakers of whatever device we are - // running on. - private final GainNode destinationNode; - - // Maps from integer keys to active sounds. Both the AudioBufferSourceNode and the associated AudioControlGraph are stored for - // quick access - private final IntMap activeSounds; - - // The raw sound data of this sound, which will be fed into the audio nodes - private AudioBuffer audioBuffer; - - // Key generator for sound objects. - private int nextKey = 0; - - // We use a pool of AudioControlGraphs in order to minimize object creation - private final AudioControlGraphPool audioGraphPool; - - /** - * @param audioContext The JavaScript AudioContext object that servers as the base object of the Web Audio API - * @param destinationNode The JavaScript AudioNode to route all the sound output to - * @param audioGraphPool A Pool that allows us to create AudioControlGraphs efficiently - */ - public WebAudioAPI(AudioContext audioContext, GainNode destinationNode, AudioControlGraphPool audioGraphPool) { - this.audioContext = audioContext; - this.destinationNode = destinationNode; - this.audioGraphPool = audioGraphPool; - this.activeSounds = new IntMap<>(); - } - - /** - * Set the buffer containing the actual sound data - * - * @param audioBuffer - */ - public void setAudioBuffer(AudioBuffer audioBuffer) { - this.audioBuffer = audioBuffer; - // If play-back of sounds have been requested before we were ready, do a pause/resume to get sound flowing - Keys keys = activeSounds.keys(); - while(keys.hasNext) { - int key = keys.next(); - pause(key); - resume(key, 0f); - } - } - - public long play(float offset, float volume, float pitch, float pan, boolean loop) { - // if the sound system is not yet unlocked, skip playing the sound. - // otherwise, it is played when the user makes his first input - if(!WebAudioAPIManager.isSoundUnlocked() && WebAudioAPIManager.isAudioContextLocked(audioContext)) return -1; - - int myKey = nextKey++; - AudioSourceData audioSourceData = new AudioSourceData(myKey); - - audioSourceData.offset = offset; - audioSourceData.volume = volume; - audioSourceData.pitch = pitch; - audioSourceData.pan = pan; - audioSourceData.loop = loop; - activeSounds.put(myKey, audioSourceData); - - // Get ourselves a fresh audio graph - AudioControlGraph audioControlGraph = audioGraphPool.obtain(); - audioSourceData.audioControlGraph = audioControlGraph; - // Create the source node that will be feeding the audio graph - createBufferSourceNodeInternal(audioSourceData, loop, pitch); - - // Configure the audio graph - audioControlGraph.setSource(audioSourceData.node._bufferSource); - audioControlGraph.setPan(pan); - audioControlGraph.setVolume(volume); - - // Start the playback - playInternal(audioSourceData, offset); - return myKey; - } - - public void stop() { - Keys keys = activeSounds.keys(); - while(keys.hasNext) { - int next = keys.next(); - stop(next); - } - } - - public void pause() { - System.out.println("PAUSEEEE"); - Keys keys = activeSounds.keys(); - while(keys.hasNext) { - pause(keys.next()); - } - } - - public void resume() { - System.out.println("RESUMEEEE"); - Keys keys = activeSounds.keys(); - while(keys.hasNext) { - resume(keys.next()); - } - } - - public void dispose() { - stop(); - activeSounds.clear(); - } - - public void stop(long soundId) { - int soundKey = (int)soundId; - if(activeSounds.containsKey(soundKey)) { - AudioSourceData audioSourceData = activeSounds.remove(soundKey); - if(audioSourceData.node != null) { - audioSourceData.node.stop(); - audioSourceData.node = null; - } - if(audioSourceData.audioControlGraph != null) { - audioGraphPool.free(audioSourceData.audioControlGraph); - audioSourceData.audioControlGraph = null; - } - } - } - - public void pause(long soundId) { - // Record our current position, and then stop - int soundKey = (int)soundId; - if(activeSounds.containsKey(soundKey)) { - AudioSourceData audioSourceData = activeSounds.get(soundKey); - - // The API has no concept of pause/resume, so we do it by recording a pause time stamp, and then stopping the sound. On - // resume we play the - // sound again, starting from a calculated offset. - - audioSourceData.pauseTime = audioContext.getCurrentTime(); - // Remove ended listener when pausing - if(audioSourceData.node != null) { - audioSourceData.node.setOnEnded(evt -> {}); - audioSourceData.node.stop(); - } - } - } - - public void resume(long soundId) { - resume(soundId, null); - } - - private void resume(long soundId, Float from) { - // Start from previous paused position - int soundKey = (int)soundId; - if(activeSounds.containsKey(soundKey)) { - AudioSourceData audioSourceData = activeSounds.get(soundKey); - - boolean loop = audioSourceData.node.getLoop(); - float pitch = audioSourceData.node.getPlaybackRate().getValue(); - - float resumeOffset = (float)(audioSourceData.pauseTime - audioSourceData.startTime); - - if(from != null) resumeOffset = from; - - createBufferSourceNodeInternal(audioSourceData, loop, pitch); - - audioSourceData.audioControlGraph.setSource(audioSourceData.node._bufferSource); - - playInternal(audioSourceData, resumeOffset); - } - } - - public void setLooping(long soundId, boolean looping) { - int soundKey = (int)soundId; - if(activeSounds.containsKey(soundKey)) { - AudioSourceData audioSourceData = activeSounds.get(soundKey); - audioSourceData.node.setLoop(looping); - } - } - - public void setPitch(long soundId, float pitch) { - int soundKey = (int)soundId; - if(activeSounds.containsKey(soundKey)) { - AudioSourceData audioSourceData = activeSounds.get(soundKey); - audioSourceData.node.getPlaybackRate().setValue(pitch); - } - } - - public void setVolume(long soundId, float volume) { - int soundKey = (int)soundId; - if(activeSounds.containsKey(soundKey)) { - AudioSourceData audioSourceNodeData = activeSounds.get(soundKey); - audioSourceNodeData.audioControlGraph.setVolume(volume); - } - } - - public float getVolume(long soundId) { - int soundKey = (int)soundId; - if(activeSounds.containsKey(soundKey)) { - AudioSourceData audioSourceNodeData = activeSounds.get(soundKey); - return audioSourceNodeData.audioControlGraph.getVolume(); - } - return -1; - } - - public void setPan(long soundId, float pan, float volume) { - int soundKey = (int)soundId; - if(activeSounds.containsKey(soundKey)) { - AudioSourceData audioSourceNodeData = activeSounds.get(soundKey); - AudioControlGraph audioControlGraph = audioSourceNodeData.audioControlGraph; - audioControlGraph.setPan(pan); - audioControlGraph.setVolume(volume); - } - } - - public float getCurrentTime(long soundId) { - int soundKey = (int)soundId; - if(activeSounds.containsKey(soundKey)) { - AudioSourceData audioSourceData = activeSounds.get(soundKey); - float playbackPosition = audioSourceData.node.getPlaybackDuration(); - return playbackPosition; - - -// if(audioSourceData.pauseTime == audioSourceData.startTime) { -// return (float)(audioContext.getCurrentTime() - audioSourceData.startTime); -// } -// else { -// float resumeOffset = (float)(audioSourceData.pauseTime - audioSourceData.startTime); -// return resumeOffset; -// } - } - return 0; - } - - protected void onSoundDone(int soundId) { - } - - private void soundDone(int soundKey) { - // The sound might have been removed by an explicit stop, before the sound reached its end - if(activeSounds.containsKey(soundKey)) { - AudioSourceData audioSourceData = activeSounds.remove(soundKey); - audioGraphPool.free(audioSourceData.audioControlGraph); - audioSourceData.audioControlGraph = null; - } - onSoundDone(soundKey); - } - - private void createBufferSourceNodeInternal(AudioSourceData data, boolean loop, float pitch) { - if(audioBuffer == null) { - audioBuffer = audioContext.createBuffer(2, 22050, 44100); - } - - AudioBufferSourceNodeWrapper newAudioBufferSourceNode = new AudioBufferSourceNodeWrapper(audioContext); - newAudioBufferSourceNode.setBuffer(audioBuffer); - newAudioBufferSourceNode.setLoop(loop); - if(pitch != 1.0f) { - AudioParam playbackRate = newAudioBufferSourceNode.getPlaybackRate(); - playbackRate.setValue(pitch); - } - data.node = newAudioBufferSourceNode; - } - - private void playInternal(AudioSourceData audioSourceData, float startOffset) { - double currentTime = audioContext.getCurrentTime(); - audioSourceData.startTime = currentTime; - audioSourceData.pauseTime = currentTime; - audioSourceData.node.setOnEnded(evt -> soundDone(audioSourceData.soundId)); - audioSourceData.node.start(currentTime, startOffset); - } - - public static void decodeAudioData(FileHandle fileHandle, AudioContext audioContext, ArrayBufferWrapper audioData, DecodeSuccessCallback decodeFunction) { - audioContext.decodeAudioData((ArrayBuffer)audioData, decodeFunction, new DecodeErrorCallback() { - @Override - public void onError(JSObject error) { - System.err.println("Error: decodeAudioData"); - } - }); - } - - private static class AudioSourceData { - public final int soundId; - - private AudioBufferSourceNodeWrapper node; - public AudioControlGraph audioControlGraph; - public double startTime; - public double pauseTime; - - public float offset; - public float volume; - public float pitch; - public float pan; - public boolean loop; - public boolean delayedPlay = false; - - public AudioBufferSourceNodeWrapper getNode() { - return node; - } - - public AudioSourceData(int soundId) { - this.soundId = soundId; - } - } -} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPIManager.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPIManager.java deleted file mode 100644 index df5a1b9e..00000000 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPIManager.java +++ /dev/null @@ -1,173 +0,0 @@ -package com.github.xpenatan.gdx.backends.teavm.webaudio; - -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.LifecycleListener; -import com.badlogic.gdx.audio.Music; -import com.badlogic.gdx.audio.Sound; -import com.badlogic.gdx.files.FileHandle; -import org.teavm.jso.JSBody; -import org.teavm.jso.JSFunctor; -import org.teavm.jso.JSObject; -import org.teavm.jso.webaudio.AudioContext; -import org.teavm.jso.webaudio.AudioDestinationNode; -import org.teavm.jso.webaudio.GainNode; - -/** - * Port from GWT gdx 1.12.0 - * - * @author xpenatan - */ -public class WebAudioAPIManager implements LifecycleListener { - private final AudioContext audioContext; - private final GainNode globalVolumeNode; - private final AudioControlGraphPool audioControlGraphPool; - private static boolean soundUnlocked; - - public WebAudioAPIManager() { - this.audioContext = createAudioContextJSNI(); - this.globalVolumeNode = createGlobalVolumeNodeJSNI(audioContext); - this.audioControlGraphPool = new AudioControlGraphPool(audioContext, globalVolumeNode); - - // for automatically muting/unmuting on pause/resume - Gdx.app.addLifecycleListener(this); - - /* - * The Web Audio API is blocked on many platforms until the developer triggers the first sound playback using the API. But - * it MUST happen as a direct result of a few specific input events. This is a major point of confusion for developers new - * to the platform. Here we attach event listeners to the graphics canvas in order to unlock the sound system on the first - * input event. On the event, we play a silent sample, which should unlock the sound - on platforms where it is not - * necessary the effect should not be noticeable (i.e. we play silence). As soon as the attempt to unlock has been - * performed, we remove all the event listeners. - */ - if(isAudioContextLocked(audioContext)) { - UnlockFunction unlockFunction = new UnlockFunction() { - @Override - public void unlockFunction() { - setUnlocked(); - } - }; - hookUpSoundUnlockers(audioContext, unlockFunction); - } - else - setUnlocked(); - } - - @JSFunctor - public interface UnlockFunction extends JSObject { - void unlockFunction(); - } - - @JSBody(params = { "audioContext", "unlockFunction" }, script = "" + - "var userInputEventNames = [" + - " 'click', 'contextmenu', 'auxclick', 'dblclick', 'mousedown'," + - " 'mouseup', 'pointerup', 'touchend', 'keydown', 'keyup', 'touchstart'" + - "];" + - "var unlock = function(e) {" + - " audioContext.resume();" + - " unlockFunction();" + - " userInputEventNames.forEach(function (eventName) {" + - " document.removeEventListener(eventName, unlock);" + - " });" + - "};" + - "userInputEventNames.forEach(function (eventName) {" + - " document.addEventListener(eventName, unlock);" + - "});" - ) - public static native void hookUpSoundUnlockers(JSObject audioContext, UnlockFunction unlockFunction); - - public void setUnlocked() { - if(!soundUnlocked) { - Gdx.app.log("Webaudio", "Audiocontext unlocked"); - } - soundUnlocked = true; - } - - public static boolean isSoundUnlocked() { - return soundUnlocked; - } - - @JSBody(params = { "audioContext" }, script = "" + - "return audioContext.state !== 'running';" - ) - static native boolean isAudioContextLocked(JSObject audioContext); - - /** - * Older browsers do not support the Web Audio API. This is where we find out. - * - * @return is the WebAudioAPI available in this browser? - */ - - @JSBody(script = "" + - "return typeof (window.AudioContext || window.webkitAudioContext) != \"undefined\";" - ) - public static native boolean isSupported(); - - @JSBody(script = "" + - "var AudioContext = window.AudioContext || window.webkitAudioContext;" + - "if(AudioContext) {" + - " var audioContext = new AudioContext();" + - " return audioContext;" + - "}" + - "return null;" - ) - private static native AudioContext createAudioContextJSNI(); - - @JSBody(params = { "audioContext" }, script = "" + - "var gainNode = null;" + - "if (audioContext.createGain)" + - " gainNode = audioContext.createGain();" + - "else" + - " gainNode = audioContext.createGainNode();" + - "gainNode.gain.value = 1.0;" + - "gainNode.connect(audioContext.destination);" + - "return gainNode;" - ) - private static native GainNode createGlobalVolumeNodeJSNI(JSObject audioContext); - - @JSBody(params = { "audioContext", "gainNode" }, script = "" + - "gainNode.disconnect(audioContext.destination);" - ) - private static native void disconnectJSNI(JSObject audioContext, JSObject gainNode); - - @JSBody(params = { "audioContext", "gainNode" }, script = "" + - "gainNode.connect(audioContext.destination);" - ) - private static native void connectJSNI(JSObject audioContext, JSObject gainNode); - - public JSObject getAudioContext() { - return audioContext; - } - - public Sound createSound(FileHandle fileHandle) { - return new WebAudioSound(fileHandle, audioContext, globalVolumeNode, audioControlGraphPool); - } - - public Music createMusic(FileHandle fileHandle) { - return new WebAudioMusic(fileHandle, audioContext, globalVolumeNode, audioControlGraphPool); - } - - @Override - public void pause() { - // As the web application looses focus, we mute the sound - disconnectJSNI(audioContext, globalVolumeNode); - } - - @Override - public void resume() { - // As the web application regains focus, we unmute the sound - connectJSNI(audioContext, globalVolumeNode); - } - - public void setGlobalVolume(float volume) { - setGlobalVolumeJSNI(volume, globalVolumeNode); - } - - @JSBody(params = { "volume", "gainNode" }, script = "" + - "gainNode.gain.value = volume;" - ) - public static native void setGlobalVolumeJSNI(float volume, JSObject gainNode); - - @Override - public void dispose() { - } -} diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPIMusic.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPIMusic.java deleted file mode 100644 index b4663298..00000000 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioAPIMusic.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.github.xpenatan.gdx.backends.teavm.webaudio; - -import com.badlogic.gdx.audio.Music; -import com.github.xpenatan.gdx.backends.teavm.dom.audio.AudioContextWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.audio.HTMLAudioElementWrapper; -import org.teavm.jso.JSBody; -import org.teavm.jso.JSFunctor; -import org.teavm.jso.JSObject; - -/** - * Port from GWT gdx 1.12.0 - * - * @author xpenatan - */ -public class WebAudioAPIMusic implements Music { - // The Audio element to be streamed - private final HTMLAudioElementWrapper audio; - - // Pool from which we will draw, and eventually return to, our AudioControlGraph from - private final AudioControlGraphPool audioControlGraphPool; - - // The audio graph used to control pan and volume for this piece of music - private final AudioControlGraph audioControlGraph; - - private OnCompletionListener onCompletionListener; - - public WebAudioAPIMusic(AudioContextWrapper audioContext, HTMLAudioElementWrapper audio, AudioControlGraphPool audioControlGraphPool) { - this.audio = audio; - this.audioControlGraphPool = audioControlGraphPool; - - EndedFunction endedFunction = new EndedFunction() { - @Override - public void endedFunc() { - ended(); - } - }; - - // Create AudioSourceNode from Audio element - JSObject audioSourceNode = createMediaElementAudioSourceNode(audioContext, audio, endedFunction); - - // Setup the sound graph to control pan and volume - audioControlGraph = audioControlGraphPool.obtain(); - audioControlGraph.setSource(audioSourceNode); - } - - public void ended() { - if(this.onCompletionListener != null) this.onCompletionListener.onCompletion(this); - } - - @JSFunctor - public interface EndedFunction extends JSObject { - void endedFunc(); - } - - @JSBody(params = { "audioContext", "audioElement", "endedFunction" }, script = "" + - "var source = audioContext.createMediaElementSource(audioElement);" + - "audioElement.addEventListener('ended', endedFunction);" + - "return source;" - ) - public static native JSObject createMediaElementAudioSourceNode(JSObject audioContext, JSObject audioElement, EndedFunction endedFunction); - - @Override - public void play() { - audio.play(); - } - - @Override - public void pause() { - audio.pause(); - } - - @Override - public void stop() { - pause(); - audio.setCurrentTime(0); - } - - @Override - public boolean isPlaying() { - return !audio.isPaused(); - } - - @Override - public void setLooping(boolean isLooping) { - audio.setLoop(isLooping); - } - - @Override - public boolean isLooping() { - return audio.isLoop(); - } - - @Override - public void setVolume(float volume) { - // Volume can be controlled on the Audio element, or as part of the audio graph. We do it as part of the graph to ensure we - // use as much common - // code as possible with the sound effect code. - audioControlGraph.setVolume(volume); - } - - @Override - public float getVolume() { - return audioControlGraph.getVolume(); - } - - @Override - public void setPan(float pan, float volume) { - audioControlGraph.setPan(pan); - audioControlGraph.setVolume(volume); - } - - @Override - public void setPosition(float position) { - audio.setCurrentTime(position); - } - - @Override - public float getPosition() { - return (float)audio.getCurrentTime(); - } - - @Override - public void dispose() { - // Stop the music - pause(); - - // Tear down the audio graph - audioControlGraphPool.free(audioControlGraph); - } - - @Override - public void setOnCompletionListener(OnCompletionListener listener) { - this.onCompletionListener = listener; - } -} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioMusic.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioMusic.java deleted file mode 100644 index d39dd9c8..00000000 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioMusic.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.github.xpenatan.gdx.backends.teavm.webaudio; - -import com.badlogic.gdx.audio.Music; -import com.badlogic.gdx.files.FileHandle; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; -import org.teavm.jso.webaudio.AudioContext; -import org.teavm.jso.webaudio.DecodeSuccessCallback; -import org.teavm.jso.webaudio.GainNode; - -public class WebAudioMusic implements Music { - - private AudioContext audioContext; - final WebAudioAPI audioAPI; - - private long sourceId = -1; - - private OnCompletionListener listener; - - private boolean isLooping; - private MusicState state = MusicState.STOP; - private float startPosition = 0; - private float volume = 1; - private float pan = 0; - - public WebAudioMusic(FileHandle fileHandle, AudioContext audioContext, GainNode globalVolumeNode, AudioControlGraphPool audioControlGraphPool) { - byte[] bytes = fileHandle.readBytes(); - this.audioContext = audioContext; - audioAPI = new WebAudioAPI(audioContext, globalVolumeNode, audioControlGraphPool) { - @Override - protected void onSoundDone(int soundId) { - if(listener != null) { - listener.onCompletion(WebAudioMusic.this); - } - } - }; - ArrayBufferViewWrapper data = TypedArrays.getTypedArray(bytes); - DecodeSuccessCallback successCallback = audioAPI::setAudioBuffer; - WebAudioAPI.decodeAudioData(fileHandle, audioContext, data.getBuffer(), successCallback); - } - - @Override - public void play() { - if(state == MusicState.STOP) { - state = MusicState.PLAY; - sourceId = audioAPI.play(startPosition, volume, 1f, pan, isLooping); - startPosition = 0; - } - else if(state == MusicState.PAUSE) { - state = MusicState.PLAY; - audioAPI.resume(sourceId); - } - } - - @Override - public void pause() { - if(state == MusicState.PLAY) { - state = MusicState.PAUSE; - audioAPI.pause(sourceId); - } - } - - @Override - public void stop() { - if(state == MusicState.PLAY || state == MusicState.PAUSE) { - state = MusicState.STOP; - audioAPI.stop(sourceId); - sourceId = -1; - } - } - - @Override - public boolean isPlaying() { - return state == MusicState.PLAY; - } - - @Override - public void setLooping(boolean isLooping) { - this.isLooping = isLooping; - audioAPI.setLooping(sourceId, isLooping); - } - - @Override - public boolean isLooping() { - return isLooping; - } - - @Override - public void setVolume(float volume) { - this.volume = volume; - audioAPI.setVolume(sourceId, volume); - } - - @Override - public float getVolume() { - return volume; - } - - @Override - public void setPan(float pan, float volume) { - this.volume = volume; - this.pan = pan; - audioAPI.setPan(sourceId, pan, volume); - } - - @Override - public void setPosition(float position) { - this.startPosition = position; - if(state == MusicState.PLAY) { - stop(); - play(); - } - else if(state == MusicState.PAUSE) { - stop(); - } - } - - @Override - public float getPosition() { - if(audioContext != null) { - return audioAPI.getCurrentTime(sourceId); - } - else { - return 0f; - } - } - - @Override - public void dispose() { - audioAPI.dispose(); - } - - @Override - public void setOnCompletionListener(OnCompletionListener listener) { - this.listener = listener; - } - - private enum MusicState { - PLAY, PAUSE, STOP - } -} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioSound.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioSound.java deleted file mode 100644 index 62bf2624..00000000 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/webaudio/WebAudioSound.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.github.xpenatan.gdx.backends.teavm.webaudio; - -import com.badlogic.gdx.audio.Sound; -import com.badlogic.gdx.files.FileHandle; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; -import org.teavm.jso.webaudio.AudioContext; -import org.teavm.jso.webaudio.DecodeSuccessCallback; -import org.teavm.jso.webaudio.GainNode; - -public class WebAudioSound implements Sound { - - final WebAudioAPI audioAPI; - - public WebAudioSound(FileHandle fileHandle, AudioContext audioContext, GainNode globalVolumeNode, AudioControlGraphPool audioControlGraphPool) { - byte[] bytes = fileHandle.readBytes(); - audioAPI = new WebAudioAPI(audioContext, globalVolumeNode, audioControlGraphPool); - ArrayBufferViewWrapper data = TypedArrays.getTypedArray(bytes); - DecodeSuccessCallback successCallback = audioAPI::setAudioBuffer; - WebAudioAPI.decodeAudioData(fileHandle, audioContext, data.getBuffer(), successCallback); - } - - @Override - public long play() { - return audioAPI.play(0f, 1f, 0f, 0f, false); - } - - @Override - public long play(float volume) { - return audioAPI.play(0f, volume, 0f, 0f, false); - } - - @Override - public long play(float volume, float pitch, float pan) { - return audioAPI.play(0f, volume, pitch, pan, false); - } - - @Override - public long loop() { - return audioAPI.play(0f, 1f, 0f, 0f, true); - } - - @Override - public long loop(float volume) { - return audioAPI.play(0f, volume, 0f, 0f, true); - } - - @Override - public long loop(float volume, float pitch, float pan) { - return audioAPI.play(0f, volume, pitch, pan, true); - } - - @Override - public void stop() { - audioAPI.stop(); - } - - @Override - public void pause() { - audioAPI.pause(); - } - - @Override - public void resume() { - audioAPI.resume(); - } - - @Override - public void dispose() { - audioAPI.dispose(); - } - - @Override - public void stop(long soundId) { - audioAPI.stop(soundId); - } - - @Override - public void pause(long soundId) { - audioAPI.pause(soundId); - } - - @Override - public void resume(long soundId) { - audioAPI.resume(soundId); - } - - @Override - public void setLooping(long soundId, boolean looping) { - audioAPI.setLooping(soundId, looping); - } - - @Override - public void setPitch(long soundId, float pitch) { - audioAPI.setPitch(soundId, pitch); - } - - @Override - public void setVolume(long soundId, float volume) { - audioAPI.setVolume(soundId, volume); - } - - @Override - public void setPan(long soundId, float pan, float volume) { - audioAPI.setPan(soundId, pan, volume); - } -} \ No newline at end of file From acdce5601a87ab42eda25a2ebc0bb78e7a53b6b8 Mon Sep 17 00:00:00 2001 From: Natan Date: Fri, 5 Jul 2024 23:26:54 -0300 Subject: [PATCH 081/114] add sound lib --- backends/backend-teavm/src/main/resources/howler.js | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 backends/backend-teavm/src/main/resources/howler.js diff --git a/backends/backend-teavm/src/main/resources/howler.js b/backends/backend-teavm/src/main/resources/howler.js new file mode 100644 index 00000000..40f9a2fb --- /dev/null +++ b/backends/backend-teavm/src/main/resources/howler.js @@ -0,0 +1,4 @@ +/*! howler.js v2.2.4 | (c) 2013-2020, James Simpson of GoldFire Studios | MIT License | howlerjs.com */ +!function(){"use strict";var e=function(){this.init()};e.prototype={init:function(){var e=this||n;return e._counter=1e3,e._html5AudioPool=[],e.html5PoolSize=10,e._codecs={},e._howls=[],e._muted=!1,e._volume=1,e._canPlayEvent="canplaythrough",e._navigator="undefined"!=typeof window&&window.navigator?window.navigator:null,e.masterGain=null,e.noAudio=!1,e.usingWebAudio=!0,e.autoSuspend=!0,e.ctx=null,e.autoUnlock=!0,e._setup(),e},volume:function(e){var o=this||n;if(e=parseFloat(e),o.ctx||_(),void 0!==e&&e>=0&&e<=1){if(o._volume=e,o._muted)return o;o.usingWebAudio&&o.masterGain.gain.setValueAtTime(e,n.ctx.currentTime);for(var t=0;t=0;o--)e._howls[o].unload();return e.usingWebAudio&&e.ctx&&void 0!==e.ctx.close&&(e.ctx.close(),e.ctx=null,_()),e},codecs:function(e){return(this||n)._codecs[e.replace(/^x-/,"")]},_setup:function(){var e=this||n;if(e.state=e.ctx?e.ctx.state||"suspended":"suspended",e._autoSuspend(),!e.usingWebAudio)if("undefined"!=typeof Audio)try{var o=new Audio;void 0===o.oncanplaythrough&&(e._canPlayEvent="canplay")}catch(n){e.noAudio=!0}else e.noAudio=!0;try{var o=new Audio;o.muted&&(e.noAudio=!0)}catch(e){}return e.noAudio||e._setupCodecs(),e},_setupCodecs:function(){var e=this||n,o=null;try{o="undefined"!=typeof Audio?new Audio:null}catch(n){return e}if(!o||"function"!=typeof o.canPlayType)return e;var t=o.canPlayType("audio/mpeg;").replace(/^no$/,""),r=e._navigator?e._navigator.userAgent:"",a=r.match(/OPR\/(\d+)/g),u=a&&parseInt(a[0].split("/")[1],10)<33,d=-1!==r.indexOf("Safari")&&-1===r.indexOf("Chrome"),i=r.match(/Version\/(.*?) /),_=d&&i&&parseInt(i[1],10)<15;return e._codecs={mp3:!(u||!t&&!o.canPlayType("audio/mp3;").replace(/^no$/,"")),mpeg:!!t,opus:!!o.canPlayType('audio/ogg; codecs="opus"').replace(/^no$/,""),ogg:!!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),oga:!!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),wav:!!(o.canPlayType('audio/wav; codecs="1"')||o.canPlayType("audio/wav")).replace(/^no$/,""),aac:!!o.canPlayType("audio/aac;").replace(/^no$/,""),caf:!!o.canPlayType("audio/x-caf;").replace(/^no$/,""),m4a:!!(o.canPlayType("audio/x-m4a;")||o.canPlayType("audio/m4a;")||o.canPlayType("audio/aac;")).replace(/^no$/,""),m4b:!!(o.canPlayType("audio/x-m4b;")||o.canPlayType("audio/m4b;")||o.canPlayType("audio/aac;")).replace(/^no$/,""),mp4:!!(o.canPlayType("audio/x-mp4;")||o.canPlayType("audio/mp4;")||o.canPlayType("audio/aac;")).replace(/^no$/,""),weba:!(_||!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/,"")),webm:!(_||!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/,"")),dolby:!!o.canPlayType('audio/mp4; codecs="ec-3"').replace(/^no$/,""),flac:!!(o.canPlayType("audio/x-flac;")||o.canPlayType("audio/flac;")).replace(/^no$/,"")},e},_unlockAudio:function(){var e=this||n;if(!e._audioUnlocked&&e.ctx){e._audioUnlocked=!1,e.autoUnlock=!1,e._mobileUnloaded||44100===e.ctx.sampleRate||(e._mobileUnloaded=!0,e.unload()),e._scratchBuffer=e.ctx.createBuffer(1,1,22050);var o=function(n){for(;e._html5AudioPool.length0?d._seek:t._sprite[e][0]/1e3),s=Math.max(0,(t._sprite[e][0]+t._sprite[e][1])/1e3-_),l=1e3*s/Math.abs(d._rate),c=t._sprite[e][0]/1e3,f=(t._sprite[e][0]+t._sprite[e][1])/1e3;d._sprite=e,d._ended=!1;var p=function(){d._paused=!1,d._seek=_,d._start=c,d._stop=f,d._loop=!(!d._loop&&!t._sprite[e][2])};if(_>=f)return void t._ended(d);var m=d._node;if(t._webAudio){var v=function(){t._playLock=!1,p(),t._refreshBuffer(d);var e=d._muted||t._muted?0:d._volume;m.gain.setValueAtTime(e,n.ctx.currentTime),d._playStart=n.ctx.currentTime,void 0===m.bufferSource.start?d._loop?m.bufferSource.noteGrainOn(0,_,86400):m.bufferSource.noteGrainOn(0,_,s):d._loop?m.bufferSource.start(0,_,86400):m.bufferSource.start(0,_,s),l!==1/0&&(t._endTimers[d._id]=setTimeout(t._ended.bind(t,d),l)),o||setTimeout(function(){t._emit("play",d._id),t._loadQueue()},0)};"running"===n.state&&"interrupted"!==n.ctx.state?v():(t._playLock=!0,t.once("resume",v),t._clearTimer(d._id))}else{var h=function(){m.currentTime=_,m.muted=d._muted||t._muted||n._muted||m.muted,m.volume=d._volume*n.volume(),m.playbackRate=d._rate;try{var r=m.play();if(r&&"undefined"!=typeof Promise&&(r instanceof Promise||"function"==typeof r.then)?(t._playLock=!0,p(),r.then(function(){t._playLock=!1,m._unlocked=!0,o?t._loadQueue():t._emit("play",d._id)}).catch(function(){t._playLock=!1,t._emit("playerror",d._id,"Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction."),d._ended=!0,d._paused=!0})):o||(t._playLock=!1,p(),t._emit("play",d._id)),m.playbackRate=d._rate,m.paused)return void t._emit("playerror",d._id,"Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.");"__default"!==e||d._loop?t._endTimers[d._id]=setTimeout(t._ended.bind(t,d),l):(t._endTimers[d._id]=function(){t._ended(d),m.removeEventListener("ended",t._endTimers[d._id],!1)},m.addEventListener("ended",t._endTimers[d._id],!1))}catch(e){t._emit("playerror",d._id,e)}};"data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA"===m.src&&(m.src=t._src,m.load());var y=window&&window.ejecta||!m.readyState&&n._navigator.isCocoonJS;if(m.readyState>=3||y)h();else{t._playLock=!0,t._state="loading";var g=function(){t._state="loaded",h(),m.removeEventListener(n._canPlayEvent,g,!1)};m.addEventListener(n._canPlayEvent,g,!1),t._clearTimer(d._id)}}return d._id},pause:function(e){var n=this;if("loaded"!==n._state||n._playLock)return n._queue.push({event:"pause",action:function(){n.pause(e)}}),n;for(var o=n._getSoundIds(e),t=0;t=0?o=parseInt(r[0],10):e=parseFloat(r[0])}else r.length>=2&&(e=parseFloat(r[0]),o=parseInt(r[1],10));var a;if(!(void 0!==e&&e>=0&&e<=1))return a=o?t._soundById(o):t._sounds[0],a?a._volume:0;if("loaded"!==t._state||t._playLock)return t._queue.push({event:"volume",action:function(){t.volume.apply(t,r)}}),t;void 0===o&&(t._volume=e),o=t._getSoundIds(o);for(var u=0;u0?t/_:t),l=Date.now();e._fadeTo=o,e._interval=setInterval(function(){var r=(Date.now()-l)/t;l=Date.now(),d+=i*r,d=Math.round(100*d)/100,d=i<0?Math.max(o,d):Math.min(o,d),u._webAudio?e._volume=d:u.volume(d,e._id,!0),a&&(u._volume=d),(on&&d>=o)&&(clearInterval(e._interval),e._interval=null,e._fadeTo=null,u.volume(o,e._id),u._emit("fade",e._id))},s)},_stopFade:function(e){var o=this,t=o._soundById(e);return t&&t._interval&&(o._webAudio&&t._node.gain.cancelScheduledValues(n.ctx.currentTime),clearInterval(t._interval),t._interval=null,o.volume(t._fadeTo,e),t._fadeTo=null,o._emit("fade",e)),o},loop:function(){var e,n,o,t=this,r=arguments;if(0===r.length)return t._loop;if(1===r.length){if("boolean"!=typeof r[0])return!!(o=t._soundById(parseInt(r[0],10)))&&o._loop;e=r[0],t._loop=e}else 2===r.length&&(e=r[0],n=parseInt(r[1],10));for(var a=t._getSoundIds(n),u=0;u=0?o=parseInt(r[0],10):e=parseFloat(r[0])}else 2===r.length&&(e=parseFloat(r[0]),o=parseInt(r[1],10));var d;if("number"!=typeof e)return d=t._soundById(o),d?d._rate:t._rate;if("loaded"!==t._state||t._playLock)return t._queue.push({event:"rate",action:function(){t.rate.apply(t,r)}}),t;void 0===o&&(t._rate=e),o=t._getSoundIds(o);for(var i=0;i=0?o=parseInt(r[0],10):t._sounds.length&&(o=t._sounds[0]._id,e=parseFloat(r[0]))}else 2===r.length&&(e=parseFloat(r[0]),o=parseInt(r[1],10));if(void 0===o)return 0;if("number"==typeof e&&("loaded"!==t._state||t._playLock))return t._queue.push({event:"seek",action:function(){t.seek.apply(t,r)}}),t;var d=t._soundById(o);if(d){if(!("number"==typeof e&&e>=0)){if(t._webAudio){var i=t.playing(o)?n.ctx.currentTime-d._playStart:0,_=d._rateSeek?d._rateSeek-d._seek:0;return d._seek+(_+i*Math.abs(d._rate))}return d._node.currentTime}var s=t.playing(o);s&&t.pause(o,!0),d._seek=e,d._ended=!1,t._clearTimer(o),t._webAudio||!d._node||isNaN(d._node.duration)||(d._node.currentTime=e);var l=function(){s&&t.play(o,!0),t._emit("seek",o)};if(s&&!t._webAudio){var c=function(){t._playLock?setTimeout(c,0):l()};setTimeout(c,0)}else l()}return t},playing:function(e){var n=this;if("number"==typeof e){var o=n._soundById(e);return!!o&&!o._paused}for(var t=0;t=0&&n._howls.splice(a,1);var u=!0;for(t=0;t=0){u=!1;break}return r&&u&&delete r[e._src],n.noAudio=!1,e._state="unloaded",e._sounds=[],e=null,null},on:function(e,n,o,t){var r=this,a=r["_on"+e];return"function"==typeof n&&a.push(t?{id:o,fn:n,once:t}:{id:o,fn:n}),r},off:function(e,n,o){var t=this,r=t["_on"+e],a=0;if("number"==typeof n&&(o=n,n=null),n||o)for(a=0;a=0;a--)r[a].id&&r[a].id!==n&&"load"!==e||(setTimeout(function(e){e.call(this,n,o)}.bind(t,r[a].fn),0),r[a].once&&t.off(e,r[a].fn,r[a].id));return t._loadQueue(e),t},_loadQueue:function(e){var n=this;if(n._queue.length>0){var o=n._queue[0];o.event===e&&(n._queue.shift(),n._loadQueue()),e||o.action()}return n},_ended:function(e){var o=this,t=e._sprite;if(!o._webAudio&&e._node&&!e._node.paused&&!e._node.ended&&e._node.currentTime=0;t--){if(o<=n)return;e._sounds[t]._ended&&(e._webAudio&&e._sounds[t]._node&&e._sounds[t]._node.disconnect(0),e._sounds.splice(t,1),o--)}}},_getSoundIds:function(e){var n=this;if(void 0===e){for(var o=[],t=0;t=0;if(!e.bufferSource)return o;if(n._scratchBuffer&&e.bufferSource&&(e.bufferSource.onended=null,e.bufferSource.disconnect(0),t))try{e.bufferSource.buffer=n._scratchBuffer}catch(e){}return e.bufferSource=null,o},_clearSound:function(e){/MSIE |Trident\//.test(n._navigator&&n._navigator.userAgent)||(e.src="data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA")}};var t=function(e){this._parent=e,this.init()};t.prototype={init:function(){var e=this,o=e._parent;return e._muted=o._muted,e._loop=o._loop,e._volume=o._volume,e._rate=o._rate,e._seek=0,e._paused=!0,e._ended=!0,e._sprite="__default",e._id=++n._counter,o._sounds.push(e),e.create(),e},create:function(){var e=this,o=e._parent,t=n._muted||e._muted||e._parent._muted?0:e._volume;return o._webAudio?(e._node=void 0===n.ctx.createGain?n.ctx.createGainNode():n.ctx.createGain(),e._node.gain.setValueAtTime(t,n.ctx.currentTime),e._node.paused=!0,e._node.connect(n.masterGain)):n.noAudio||(e._node=n._obtainHtml5Audio(),e._errorFn=e._errorListener.bind(e),e._node.addEventListener("error",e._errorFn,!1),e._loadFn=e._loadListener.bind(e),e._node.addEventListener(n._canPlayEvent,e._loadFn,!1),e._endFn=e._endListener.bind(e),e._node.addEventListener("ended",e._endFn,!1),e._node.src=o._src,e._node.preload=!0===o._preload?"auto":o._preload,e._node.volume=t*n.volume(),e._node.load()),e},reset:function(){var e=this,o=e._parent;return e._muted=o._muted,e._loop=o._loop,e._volume=o._volume,e._rate=o._rate,e._seek=0,e._rateSeek=0,e._paused=!0,e._ended=!0,e._sprite="__default",e._id=++n._counter,e},_errorListener:function(){var e=this;e._parent._emit("loaderror",e._id,e._node.error?e._node.error.code:0),e._node.removeEventListener("error",e._errorFn,!1)},_loadListener:function(){var e=this,o=e._parent;o._duration=Math.ceil(10*e._node.duration)/10,0===Object.keys(o._sprite).length&&(o._sprite={__default:[0,1e3*o._duration]}),"loaded"!==o._state&&(o._state="loaded",o._emit("load"),o._loadQueue()),e._node.removeEventListener(n._canPlayEvent,e._loadFn,!1)},_endListener:function(){var e=this,n=e._parent;n._duration===1/0&&(n._duration=Math.ceil(10*e._node.duration)/10,n._sprite.__default[1]===1/0&&(n._sprite.__default[1]=1e3*n._duration),n._ended(e)),e._node.removeEventListener("ended",e._endFn,!1)}};var r={},a=function(e){var n=e._src;if(r[n])return e._duration=r[n].duration,void i(e);if(/^data:[^;]+;base64,/.test(n)){for(var o=atob(n.split(",")[1]),t=new Uint8Array(o.length),a=0;a0?(r[o._src]=e,i(o,e)):t()};"undefined"!=typeof Promise&&1===n.ctx.decodeAudioData.length?n.ctx.decodeAudioData(e).then(a).catch(t):n.ctx.decodeAudioData(e,a,t)},i=function(e,n){n&&!e._duration&&(e._duration=n.duration),0===Object.keys(e._sprite).length&&(e._sprite={__default:[0,1e3*e._duration]}),"loaded"!==e._state&&(e._state="loaded",e._emit("load"),e._loadQueue())},_=function(){if(n.usingWebAudio){try{"undefined"!=typeof AudioContext?n.ctx=new AudioContext:"undefined"!=typeof webkitAudioContext?n.ctx=new webkitAudioContext:n.usingWebAudio=!1}catch(e){n.usingWebAudio=!1}n.ctx||(n.usingWebAudio=!1);var e=/iP(hone|od|ad)/.test(n._navigator&&n._navigator.platform),o=n._navigator&&n._navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/),t=o?parseInt(o[1],10):null;if(e&&t&&t<9){var r=/safari/.test(n._navigator&&n._navigator.userAgent.toLowerCase());n._navigator&&!r&&(n.usingWebAudio=!1)}n.usingWebAudio&&(n.masterGain=void 0===n.ctx.createGain?n.ctx.createGainNode():n.ctx.createGain(),n.masterGain.gain.setValueAtTime(n._muted?0:n._volume,n.ctx.currentTime),n.masterGain.connect(n.ctx.destination)),n._setup()}};"function"==typeof define&&define.amd&&define([],function(){return{Howler:n,Howl:o}}),"undefined"!=typeof exports&&(exports.Howler=n,exports.Howl=o),"undefined"!=typeof global?(global.HowlerGlobal=e,global.Howler=n,global.Howl=o,global.Sound=t):"undefined"!=typeof window&&(window.HowlerGlobal=e,window.Howler=n,window.Howl=o,window.Sound=t)}(); +/*! Spatial Plugin */ +!function(){"use strict";HowlerGlobal.prototype._pos=[0,0,0],HowlerGlobal.prototype._orientation=[0,0,-1,0,1,0],HowlerGlobal.prototype.stereo=function(e){var n=this;if(!n.ctx||!n.ctx.listener)return n;for(var t=n._howls.length-1;t>=0;t--)n._howls[t].stereo(e);return n},HowlerGlobal.prototype.pos=function(e,n,t){var r=this;return r.ctx&&r.ctx.listener?(n="number"!=typeof n?r._pos[1]:n,t="number"!=typeof t?r._pos[2]:t,"number"!=typeof e?r._pos:(r._pos=[e,n,t],void 0!==r.ctx.listener.positionX?(r.ctx.listener.positionX.setTargetAtTime(r._pos[0],Howler.ctx.currentTime,.1),r.ctx.listener.positionY.setTargetAtTime(r._pos[1],Howler.ctx.currentTime,.1),r.ctx.listener.positionZ.setTargetAtTime(r._pos[2],Howler.ctx.currentTime,.1)):r.ctx.listener.setPosition(r._pos[0],r._pos[1],r._pos[2]),r)):r},HowlerGlobal.prototype.orientation=function(e,n,t,r,o,i){var a=this;if(!a.ctx||!a.ctx.listener)return a;var p=a._orientation;return n="number"!=typeof n?p[1]:n,t="number"!=typeof t?p[2]:t,r="number"!=typeof r?p[3]:r,o="number"!=typeof o?p[4]:o,i="number"!=typeof i?p[5]:i,"number"!=typeof e?p:(a._orientation=[e,n,t,r,o,i],void 0!==a.ctx.listener.forwardX?(a.ctx.listener.forwardX.setTargetAtTime(e,Howler.ctx.currentTime,.1),a.ctx.listener.forwardY.setTargetAtTime(n,Howler.ctx.currentTime,.1),a.ctx.listener.forwardZ.setTargetAtTime(t,Howler.ctx.currentTime,.1),a.ctx.listener.upX.setTargetAtTime(r,Howler.ctx.currentTime,.1),a.ctx.listener.upY.setTargetAtTime(o,Howler.ctx.currentTime,.1),a.ctx.listener.upZ.setTargetAtTime(i,Howler.ctx.currentTime,.1)):a.ctx.listener.setOrientation(e,n,t,r,o,i),a)},Howl.prototype.init=function(e){return function(n){var t=this;return t._orientation=n.orientation||[1,0,0],t._stereo=n.stereo||null,t._pos=n.pos||null,t._pannerAttr={coneInnerAngle:void 0!==n.coneInnerAngle?n.coneInnerAngle:360,coneOuterAngle:void 0!==n.coneOuterAngle?n.coneOuterAngle:360,coneOuterGain:void 0!==n.coneOuterGain?n.coneOuterGain:0,distanceModel:void 0!==n.distanceModel?n.distanceModel:"inverse",maxDistance:void 0!==n.maxDistance?n.maxDistance:1e4,panningModel:void 0!==n.panningModel?n.panningModel:"HRTF",refDistance:void 0!==n.refDistance?n.refDistance:1,rolloffFactor:void 0!==n.rolloffFactor?n.rolloffFactor:1},t._onstereo=n.onstereo?[{fn:n.onstereo}]:[],t._onpos=n.onpos?[{fn:n.onpos}]:[],t._onorientation=n.onorientation?[{fn:n.onorientation}]:[],e.call(this,n)}}(Howl.prototype.init),Howl.prototype.stereo=function(n,t){var r=this;if(!r._webAudio)return r;if("loaded"!==r._state)return r._queue.push({event:"stereo",action:function(){r.stereo(n,t)}}),r;var o=void 0===Howler.ctx.createStereoPanner?"spatial":"stereo";if(void 0===t){if("number"!=typeof n)return r._stereo;r._stereo=n,r._pos=[n,0,0]}for(var i=r._getSoundIds(t),a=0;a Date: Sat, 6 Jul 2024 09:24:47 -0300 Subject: [PATCH 082/114] Fix when properties don't exist --- buildSrc/src/main/kotlin/Dependencies.kt | 3 --- settings.gradle.kts | 5 ++++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 76607562..f8bf2250 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -51,8 +51,5 @@ private fun getProperties(): Properties { if(file.exists()) { properties.load(file.inputStream()) } - else { - throw RuntimeException("properties should exist") - } return properties } \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 9acdcaa0..8797bcbc 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -17,8 +17,11 @@ include(":examples:freetype:desktop") include(":examples:freetype:teavm") val file = File("gradle.properties") + val properties = Properties() -properties.load(file.inputStream()) +if(file.exists()) { + properties.load(file.inputStream()) +} val gdxSourcePath = properties.getOrDefault("gdxSourcePath", "") as String val teavmPath = properties.getOrDefault("teavmPath", "") as String From 813bdf2c8a3bd82ea99a9fc204d72138a8d733ae Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 6 Jul 2024 20:41:06 -0300 Subject: [PATCH 083/114] scripts is now at scripts folder --- .../gdx/backends/teavm/config/AssetsCopy.java | 4 ++-- .../gdx/backends/teavm/config/TeaBuilder.java | 24 ++++++++++++++++--- .../backends/teavm/preloader/Preloader.java | 9 ++++--- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java index 287ce847..34a668ff 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java @@ -41,8 +41,8 @@ public Asset(FileHandle file, AssetType type) { } } - public static void copyResources(TeaClassLoader classLoader, List classPathAssetsFiles, String assetsOutputPath, boolean generateTextFile, boolean append) { - copy(classLoader, classPathAssetsFiles, true, null, null, assetsOutputPath, generateTextFile, append); + public static void copyResources(TeaClassLoader classLoader, List classPathAssetsFiles, String assetsOutputPath, AssetFilter filter, boolean generateTextFile, boolean append) { + copy(classLoader, classPathAssetsFiles, true, null, filter, assetsOutputPath, generateTextFile, append); } public static void copy(TeaClassLoader classLoader, List classPathAssetsFiles, ArrayList assetsPaths, AssetFilter filter, String assetsOutputPath, boolean generateTextFile, boolean append) { diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java index 0a0815d1..1c86c86c 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java @@ -6,6 +6,7 @@ import com.github.xpenatan.gdx.backends.teavm.config.plugins.TeaReflectionSupplier; import com.github.xpenatan.gdx.backends.teavm.gen.SkipClass; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetFilter; +import com.github.xpenatan.gdx.backends.teavm.preloader.DefaultAssetFilter; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; @@ -493,6 +494,7 @@ public static void configAssets(TeaClassLoader classLoader, TeaBuildConfiguratio String webappOutputPath = webappDirectory + File.separator + webappName; String assetsOutputPath = webappOutputPath + File.separator + "assets"; + String scriptsOutputPath = webappOutputPath + File.separator + "scripts"; ArrayList assetsPaths = new ArrayList<>(); ArrayList classPathAssetsFiles = new ArrayList<>(); @@ -510,7 +512,23 @@ public static void configAssets(TeaClassLoader classLoader, TeaBuildConfiguratio // Copy assets from resources List resources = TeaVMResourceProperties.getResources(acceptedURL); - AssetsCopy.copyResources(classLoader, resources, assetsOutputPath, true, true); + + List scripts = new ArrayList<>(); + // Filter out scripts + for(int i = 0; i < resources.size(); i++) { + String asset = resources.get(i); + if(asset.endsWith(".js") || asset.endsWith(".wasm")) { + resources.remove(i); + scripts.add(asset); + i--; + } + } + // Copy resources + AssetsCopy.copyResources(classLoader, resources, assetsOutputPath, null, true, true); + + // Copy scripts + AssetsCopy.copyResources(classLoader, scripts, scriptsOutputPath, null, false, false); + TeaBuilder.log(""); } @@ -518,7 +536,7 @@ private static void useDefaultHTMLIndexFile(TeaClassLoader classLoader, TeaBuild ArrayList webappAssetsFiles = new ArrayList<>(); webappAssetsFiles.add(webappName); // Copy webapp folder from resources to destination - AssetsCopy.copyResources(classLoader, webappAssetsFiles, webappDirectory, false, false); + AssetsCopy.copyResources(classLoader, webappAssetsFiles, webappDirectory, null, false, false); TeaBuilder.log(""); File indexFile = new File(webappOutputPath + File.separator + "index.html"); @@ -542,7 +560,7 @@ private static void useDefaultHTMLIndexFile(TeaClassLoader classLoader, TeaBuild if(showLoadingLogo) { ArrayList logoAsset = new ArrayList<>(); logoAsset.add(logo); - AssetsCopy.copyResources(classLoader, logoAsset, webappOutputPath, false, false); + AssetsCopy.copyResources(classLoader, logoAsset, webappOutputPath, null, false, false); } } } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java index 761a9bf5..eb88c0c7 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java @@ -2,7 +2,6 @@ import com.badlogic.gdx.Files.FileType; import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.GdxRuntimeException; import com.badlogic.gdx.utils.StreamUtils; @@ -10,7 +9,6 @@ import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; -import com.github.xpenatan.gdx.backends.teavm.TeaFiles; import com.github.xpenatan.gdx.backends.teavm.dom.DataTransferWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.DragEventWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.EventListenerWrapper; @@ -37,6 +35,7 @@ public class Preloader { public int assetTotal = -1; private static final String ASSET_FOLDER = "assets/"; + private static final String SCRIPTS_FOLDER = "scripts/"; public final String baseUrl; @@ -135,6 +134,10 @@ private String getAssetUrl() { return baseUrl + ASSET_FOLDER; } + private String getScriptUrl() { + return baseUrl + SCRIPTS_FOLDER; + } + public void preload(TeaApplicationConfiguration config, final String assetFileUrl) { AssetDownloader.getInstance().loadText(true, getAssetUrl() + assetFileUrl, new AssetLoaderListener() { @Override @@ -229,7 +232,7 @@ public boolean onSuccess(String url, Object result) { } public void loadScript(boolean async, final String url, final AssetLoaderListener listener) { - AssetDownloader.getInstance().loadScript(async, getAssetUrl() + url, listener); + AssetDownloader.getInstance().loadScript(async, getScriptUrl() + url, listener); } public int getQueue() { From 86bede284fb5a0a2b074b5aef4fbb07312d35327 Mon Sep 17 00:00:00 2001 From: Natan Date: Sun, 7 Jul 2024 13:41:57 -0300 Subject: [PATCH 084/114] Improve copying assets --- .../teavm/config/AssetFileHandle.java | 19 +++ .../gdx/backends/teavm/config/AssetsCopy.java | 129 ++++++++++++------ .../teavm/config/TeaBuildConfiguration.java | 13 +- .../gdx/backends/teavm/config/TeaBuilder.java | 56 +++++--- .../backends/teavm/preloader/AssetFilter.java | 46 +------ .../teavm/preloader/DefaultAssetFilter.java | 7 +- .../backends/teavm/preloader/Preloader.java | 2 - 7 files changed, 156 insertions(+), 116 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetFileHandle.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetFileHandle.java index 4217e0a6..6412d39f 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetFileHandle.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetFileHandle.java @@ -2,12 +2,16 @@ import com.badlogic.gdx.Files.FileType; import com.badlogic.gdx.files.FileHandle; +import com.github.xpenatan.gdx.backends.teavm.preloader.AssetFilter; import java.io.File; public class AssetFileHandle extends FileHandle { FileType copyType; + public String assetsChildDir = ""; + public AssetFilter filter; + public static AssetFileHandle createHandle(String fileName, FileType type) { return new AssetFileHandle(fileName, type, type); } @@ -16,6 +20,21 @@ public static AssetFileHandle createCopyHandle(File file, FileType type) { return new AssetFileHandle(file, FileType.Absolute, type); } + public static AssetFileHandle createCopyHandle(String fileName, FileType type) { + return new AssetFileHandle(fileName, FileType.Absolute, type); + } + + public static AssetFileHandle createCopyHandle(String fileName, FileType type, String assetsChildDir) { + return createCopyHandle(fileName, type, assetsChildDir, null); + } + + public static AssetFileHandle createCopyHandle(String fileName, FileType type, String assetsChildDir, AssetFilter filter) { + AssetFileHandle assetFileHandle = new AssetFileHandle(fileName, FileType.Absolute, type); + assetFileHandle.assetsChildDir = assetsChildDir; + assetFileHandle.filter = filter; + return assetFileHandle; + } + public AssetFileHandle(String fileName) { this(new File(fileName), FileType.Absolute, FileType.Internal); } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java index 34a668ff..90bd94e0 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java @@ -18,11 +18,9 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.Map.Entry; import java.util.stream.Stream; import com.badlogic.gdx.Files.FileType; @@ -31,7 +29,7 @@ */ public class AssetsCopy { - private static class Asset { + public static class Asset { FileHandle file; AssetType type; @@ -41,35 +39,56 @@ public Asset(FileHandle file, AssetType type) { } } - public static void copyResources(TeaClassLoader classLoader, List classPathAssetsFiles, String assetsOutputPath, AssetFilter filter, boolean generateTextFile, boolean append) { - copy(classLoader, classPathAssetsFiles, true, null, filter, assetsOutputPath, generateTextFile, append); + public static ArrayList copyResources(TeaClassLoader classLoader, List classPathAssetsFiles, AssetFilter filter, FileHandle assetsOutputPath) { + return copy(classLoader, classPathAssetsFiles, filter, assetsOutputPath); } - public static void copy(TeaClassLoader classLoader, List classPathAssetsFiles, ArrayList assetsPaths, AssetFilter filter, String assetsOutputPath, boolean generateTextFile, boolean append) { - copy(classLoader, classPathAssetsFiles, false, assetsPaths, filter, assetsOutputPath, generateTextFile, append); + public static ArrayList copyScripts(TeaClassLoader classLoader, List classPathAssetsFiles, FileHandle assetsOutputPath) { + return copy(classLoader, classPathAssetsFiles, null, assetsOutputPath); } - private static void copy(TeaClassLoader classloader, List classPathAssetsFiles, boolean isResources, ArrayList assetsPaths, AssetFilter filter, String assetsOutputPath, boolean generateTextFile, boolean append) { - FileHandle target = new FileHandle(assetsOutputPath); - assetsOutputPath = target.path(); + public static ArrayList copyAssets(AssetFileHandle fileHandle, AssetFilter filter, FileHandle assetsOutputPath) { + return copy(fileHandle, filter, assetsOutputPath); + } + + /** + * Copy assets + */ + private static ArrayList copy(AssetFileHandle assetsPath, AssetFilter filter, FileHandle target) { + String assetsOutputPath = target.path(); ArrayList assets = new ArrayList(); + if(assetsPath.filter != null) { + //Override global filter with the handle filter + filter = assetsPath.filter; + } AssetFilter defaultAssetFilter = filter != null ? filter : new DefaultAssetFilter(); - if(assetsPaths != null && assetsPaths.size() > 0) { + if(assetsPath != null && assetsPath.exists() && assetsPath.isDirectory()) { TeaBuilder.log("Copying assets from:"); - for(int i = 0; i < assetsPaths.size(); i++) { - FileHandle source = assetsPaths.get(i); - String path = source.path(); - TeaBuilder.log(path); - copyDirectory(source, target, defaultAssetFilter, assets); - } + FileHandle source = assetsPath; + String path = source.path(); + TeaBuilder.log(path); + copyDirectory(source, assetsPath.assetsChildDir, target, defaultAssetFilter, assets); TeaBuilder.log("to:"); TeaBuilder.log(assetsOutputPath); } + TeaBuilder.log("to:"); + TeaBuilder.log(assetsOutputPath); + + return assets; + } + + /** + * Copy resources + */ + private static ArrayList copy(TeaClassLoader classloader, List classPathAssetsFiles, AssetFilter filter, FileHandle target) { + String assetsOutputPath = target.path(); + ArrayList assets = new ArrayList(); + AssetFilter defaultAssetFilter = filter != null ? filter : new DefaultAssetFilter(); + if(classloader != null && classPathAssetsFiles != null) { // Copy assets from class package directory - addDirectoryClassPathFiles(classPathAssetsFiles); TeaBuilder.log(""); TeaBuilder.log("Copying assets from:"); @@ -91,7 +110,7 @@ private static void copy(TeaClassLoader classloader, List classPathAsset String destPath = dest.path(); if(!destPath.endsWith(".js") && !destPath.endsWith(".wasm")) { AssetFileHandle dest2 = AssetFileHandle.createCopyHandle(dest.file(), FileType.Classpath); - assets.add(new Asset(dest2, AssetFilter.getType(destPath))); + assets.add(new Asset(dest2, getType(destPath))); } is.close(); } @@ -105,29 +124,18 @@ private static void copy(TeaClassLoader classloader, List classPathAsset TeaBuilder.log("to:"); TeaBuilder.log(assetsOutputPath); - if(generateTextFile == false) return; - HashMap> bundles = new HashMap>(); - for(Asset asset : assets) { - String bundleName = defaultAssetFilter.getBundleName(asset.file.path()); - if(bundleName == null) { - bundleName = "assets"; - } - ArrayList bundleAssets = bundles.get(bundleName); - if(bundleAssets == null) { - bundleAssets = new ArrayList(); - bundles.put(bundleName, bundleAssets); - } - bundleAssets.add(asset); - } + return assets; + } - for(Entry> bundle : bundles.entrySet()) { - StringBuffer buffer = new StringBuffer(); - for(Asset asset : bundle.getValue()) { - setupPreloadAssetFileFormat(asset, buffer, assetsOutputPath); - } - target.child(bundle.getKey() + ".txt").writeString(buffer.toString(), append); + public static void generateAssetsFile(ArrayList assets, FileHandle location, FileHandle assetFile) { + StringBuffer buffer = new StringBuffer(); + String assetsOutputPath = location.path(); + for(int i = 0; i < assets.size(); i++) { + Asset asset = assets.get(i); + setupPreloadAssetFileFormat(asset, buffer, assetsOutputPath); } + assetFile.writeString(buffer.toString(), true); } private static void setupPreloadAssetFileFormat(Asset asset, StringBuffer buffer, String assetsOutputPath) { @@ -246,10 +254,17 @@ private static void addDirectoryClassPathFiles(List classPathFiles) { classPathFiles.addAll(set); } + private static void copyDirectory(FileHandle sourceDir, String assetsChildDir, FileHandle destDir, AssetFilter filter, ArrayList assets) { + if(!assetsChildDir.isEmpty()) { + destDir = destDir.child(assetsChildDir); + } + copyDirectory(sourceDir, destDir, filter, assets); + } + private static void copyFile(FileHandle source, FileHandle dest, AssetFilter filter, ArrayList assets) { if(!filter.accept(dest.path(), false)) return; try { - assets.add(new Asset(dest, AssetFilter.getType(dest.path()))); + assets.add(new Asset(dest, getType(dest.path()))); InputStream read = source.read(); dest.write(read, false); read.close(); @@ -278,4 +293,38 @@ private static void copyDirectory(FileHandle sourceDir, FileHandle destDir, Asse copyFile(srcFile, destFile, filter, assets); } } + + /** + * @param file the file to get the type for + * @return the type of the file, one of {@link AssetType} + */ + @Deprecated + public static AssetType getType(String file) { + String extension = extension(file).toLowerCase(); + if(isImage(extension)) return AssetType.Image; + if(isAudio(extension)) return AssetType.Audio; + if(isText(extension)) return AssetType.Text; + return AssetType.Binary; + } + + private static String extension(String file) { + String name = file; + int dotIndex = name.lastIndexOf('.'); + if(dotIndex == -1) return ""; + return name.substring(dotIndex + 1); + } + + private static boolean isImage(String extension) { + return extension.equals("jpg") || extension.equals("jpeg") || extension.equals("png") || extension.equals("bmp") || extension.equals("gif"); + } + + private static boolean isText(String extension) { + return extension.equals("json") || extension.equals("xml") || extension.equals("txt") || extension.equals("glsl") + || extension.equals("fnt") || extension.equals("pack") || extension.equals("obj") || extension.equals("atlas") + || extension.equals("g3dj"); + } + + private static boolean isAudio(String extension) { + return extension.equals("mp3") || extension.equals("ogg") || extension.equals("wav"); + } } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuildConfiguration.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuildConfiguration.java index e05a31e3..ef6060b1 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuildConfiguration.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuildConfiguration.java @@ -15,6 +15,7 @@ public class TeaBuildConfiguration { public AssetFilter assetFilter = null; public ArrayList assetsPath = new ArrayList<>(); public ArrayList additionalAssetsClasspathFiles = new ArrayList<>(); + public boolean shouldGenerateAssetFile = true; private String mainApplicationClass; @@ -89,9 +90,12 @@ public String getWebAppPath() { return webappPath; } - public boolean assetsPath(ArrayList paths) { - paths.addAll(assetsPath); - return true; + public ArrayList assetsPath() { + return assetsPath; + } + + public boolean shouldGenerateAssetFile() { + return shouldGenerateAssetFile; } public AssetFilter assetFilter() { @@ -114,9 +118,6 @@ public ArrayList getSkipClasses() { return classesToSkip; } - public void assetsClasspath(ArrayList classPaths) { - } - public void setApplicationListener(Class applicationListener) { setApplicationListener(applicationListener.getName()); } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java index 1c86c86c..52c1774b 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java @@ -6,7 +6,6 @@ import com.github.xpenatan.gdx.backends.teavm.config.plugins.TeaReflectionSupplier; import com.github.xpenatan.gdx.backends.teavm.gen.SkipClass; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetFilter; -import com.github.xpenatan.gdx.backends.teavm.preloader.DefaultAssetFilter; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; @@ -492,29 +491,40 @@ public TeaVMProgressFeedback progressReached(int i) { public static void configAssets(TeaClassLoader classLoader, TeaBuildConfiguration configuration, String webappDirectory, String webappName, ArrayList acceptedURL) { TeaBuilder.logHeader("COPYING ASSETS"); - String webappOutputPath = webappDirectory + File.separator + webappName; - String assetsOutputPath = webappOutputPath + File.separator + "assets"; - String scriptsOutputPath = webappOutputPath + File.separator + "scripts"; + FileHandle webappDistFolder = new FileHandle(webappDirectory); + FileHandle webappFolder = webappDistFolder.child(webappName); + FileHandle assetsFolder = webappFolder.child("assets"); + FileHandle scriptsFolder = webappFolder.child("scripts"); + FileHandle assetFile = assetsFolder.child("assets.txt"); - ArrayList assetsPaths = new ArrayList<>(); - ArrayList classPathAssetsFiles = new ArrayList<>(); AssetFilter filter = configuration.assetFilter(); boolean shouldUseDefaultHtmlIndex = configuration.shouldUseDefaultHtmlIndex(); if(shouldUseDefaultHtmlIndex) { - useDefaultHTMLIndexFile(classLoader, configuration, webappDirectory, webappName, webappOutputPath); + useDefaultHTMLIndexFile(classLoader, configuration, webappDistFolder, webappName, webappFolder); } - ArrayList additionalAssetClasspath = configuration.getAdditionalAssetClasspath(); - classPathAssetsFiles.addAll(additionalAssetClasspath); - boolean generateAssetPaths = configuration.assetsPath(assetsPaths); - AssetsCopy.copy(classLoader, classPathAssetsFiles, assetsPaths, filter, assetsOutputPath, generateAssetPaths, false); + if(assetFile.exists()) { + assetFile.delete(); + } + + boolean generateAssetPaths = configuration.shouldGenerateAssetFile(); + + // Copy Assets files + ArrayList assetsPaths = configuration.assetsPath(); + for(int i = 0; i < assetsPaths.size(); i++) { + AssetFileHandle assetFileHandle = assetsPaths.get(i); + ArrayList assets = AssetsCopy.copyAssets(assetFileHandle, filter, assetsFolder); + if(generateAssetPaths) { + AssetsCopy.generateAssetsFile(assets, assetsFolder, assetFile); + } + } // Copy assets from resources List resources = TeaVMResourceProperties.getResources(acceptedURL); List scripts = new ArrayList<>(); - // Filter out scripts + // Filter out javascript for(int i = 0; i < resources.size(); i++) { String asset = resources.get(i); if(asset.endsWith(".js") || asset.endsWith(".wasm")) { @@ -523,24 +533,32 @@ public static void configAssets(TeaClassLoader classLoader, TeaBuildConfiguratio i--; } } + // Copy additional classpath files + ArrayList classPathAssetsFiles = configuration.getAdditionalAssetClasspath(); + ArrayList classpathAssets = AssetsCopy.copyResources(classLoader, classPathAssetsFiles, filter, assetsFolder); + // Copy resources - AssetsCopy.copyResources(classLoader, resources, assetsOutputPath, null, true, true); + ArrayList resourceAssets = AssetsCopy.copyResources(classLoader, resources, filter, assetsFolder); // Copy scripts - AssetsCopy.copyResources(classLoader, scripts, scriptsOutputPath, null, false, false); + ArrayList scriptsAssets = AssetsCopy.copyScripts(classLoader, scripts, scriptsFolder); + + if(generateAssetPaths) { + AssetsCopy.generateAssetsFile(classpathAssets, assetsFolder, assetFile); + AssetsCopy.generateAssetsFile(resourceAssets, assetsFolder, assetFile); + } TeaBuilder.log(""); } - private static void useDefaultHTMLIndexFile(TeaClassLoader classLoader, TeaBuildConfiguration configuration, String webappDirectory, String webappName, String webappOutputPath) { + private static void useDefaultHTMLIndexFile(TeaClassLoader classLoader, TeaBuildConfiguration configuration, FileHandle webappDistFolder, String webappName, FileHandle webappFolder) { ArrayList webappAssetsFiles = new ArrayList<>(); webappAssetsFiles.add(webappName); // Copy webapp folder from resources to destination - AssetsCopy.copyResources(classLoader, webappAssetsFiles, webappDirectory, null, false, false); + AssetsCopy.copyResources(classLoader, webappAssetsFiles, null, webappDistFolder); TeaBuilder.log(""); - File indexFile = new File(webappOutputPath + File.separator + "index.html"); - FileHandle handler = new FileHandle(indexFile); + FileHandle handler = webappFolder.child("index.html"); String indexHtmlStr = handler.readString(); String logo = configuration.getLogoPath(); @@ -560,7 +578,7 @@ private static void useDefaultHTMLIndexFile(TeaClassLoader classLoader, TeaBuild if(showLoadingLogo) { ArrayList logoAsset = new ArrayList<>(); logoAsset.add(logo); - AssetsCopy.copyResources(classLoader, logoAsset, webappOutputPath, null, false, false); + AssetsCopy.copyResources(classLoader, logoAsset, null, webappFolder); } } } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetFilter.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetFilter.java index 09e053e7..36d2d576 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetFilter.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetFilter.java @@ -7,47 +7,7 @@ public interface AssetFilter { /** * @param file the file to filter * @param isDirectory whether the file is a directory - * @return whether to include the file in the war/ folder or not. + * @return whether to include the asset or resources in the assets folder or not. */ - public boolean accept(String file, boolean isDirectory); - - /** - * @param file the file to get the bundle name for - * @return the name of the bundle to which this file should be added - */ - public String getBundleName(String file); - - /** - * @param file the file to get the type for - * @return the type of the file, one of {@link AssetType} - */ - public static AssetType getType(String file) { - String extension = extension(file).toLowerCase(); - if(isImage(extension)) return AssetType.Image; - if(isAudio(extension)) return AssetType.Audio; - if(isText(extension)) return AssetType.Text; - return AssetType.Binary; - } - - private static String extension(String file) { - String name = file; - int dotIndex = name.lastIndexOf('.'); - if(dotIndex == -1) return ""; - return name.substring(dotIndex + 1); - } - - private static boolean isImage(String extension) { - return extension.equals("jpg") || extension.equals("jpeg") || extension.equals("png") || extension.equals("bmp") || extension.equals("gif"); - } - - private static boolean isText(String extension) { - return extension.equals("json") || extension.equals("xml") || extension.equals("txt") || extension.equals("glsl") - || extension.equals("fnt") || extension.equals("pack") || extension.equals("obj") || extension.equals("atlas") - || extension.equals("g3dj"); - } - - private static boolean isAudio(String extension) { - return extension.equals("mp3") || extension.equals("ogg") || extension.equals("wav"); - } - -} + boolean accept(String file, boolean isDirectory); +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/DefaultAssetFilter.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/DefaultAssetFilter.java index b5398454..02878f85 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/DefaultAssetFilter.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/DefaultAssetFilter.java @@ -10,9 +10,4 @@ public boolean accept(String file, boolean isDirectory) { if(file.endsWith(".jar")) return false; return true; } - - @Override - public String getBundleName(String file) { - return "assets"; - } -} +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java index eb88c0c7..630cddbc 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java @@ -79,8 +79,6 @@ private JSPromise getFile(String name, FileWrapper fileWrapper) { FileReaderWrapper fileReader = FileReaderWrapper.create(); fileReader.readAsArrayBuffer(fileWrapper); - AssetType type = AssetFilter.getType(name); - fileReader.addEventListener("load", new EventListenerWrapper() { @Override public void handleEvent(EventWrapper evt) { From 175619cfb1ce6a1fa1e3294771059cef2b6638ab Mon Sep 17 00:00:00 2001 From: Natan Date: Mon, 8 Jul 2024 14:55:12 -0300 Subject: [PATCH 085/114] Clean up asset downloader, preloader and some improvements --- CHANGES.md | 2 + .../gdx/assets/AssetLoadingTaskEmu.java | 173 ++++++++++++ .../gdx/assets/loaders/AssetLoaderEmu.java | 22 -- .../loaders/AsynchronousAssetLoaderEmu.java | 21 -- .../com/badlogic/gdx/graphics/PixmapEmu.java | 5 +- .../gdx/utils/SharedLibraryLoaderEmu.java | 3 +- .../backends/teavm/AssetLoaderListener.java | 3 +- .../gdx/backends/teavm/TeaApplication.java | 10 +- .../teavm/TeaApplicationConfiguration.java | 6 +- .../xpenatan/gdx/backends/teavm/TeaFiles.java | 6 +- .../gdx/backends/teavm/TeaPreferences.java | 32 ++- .../gdx/backends/teavm/config/AssetsCopy.java | 19 +- .../filesystem/types/LocalDBStorage.java | 2 +- .../teavm/preloader/AssetDownloadImpl.java | 267 ++++-------------- .../teavm/preloader/AssetDownloader.java | 19 +- .../backends/teavm/preloader/AssetType.java | 6 +- .../backends/teavm/preloader/Preloader.java | 83 ++++-- .../teavm/launcher/TeaVMTestLauncher.java | 2 +- .../example/tests/imgui/ImGuiTestsApp.java | 26 +- .../graphics/g2d/freetype/FreeTypeEmu.java | 3 +- 20 files changed, 360 insertions(+), 350 deletions(-) create mode 100644 backends/backend-teavm/emu/com/badlogic/gdx/assets/AssetLoadingTaskEmu.java delete mode 100644 backends/backend-teavm/emu/com/badlogic/gdx/assets/loaders/AssetLoaderEmu.java delete mode 100644 backends/backend-teavm/emu/com/badlogic/gdx/assets/loaders/AsynchronousAssetLoaderEmu.java diff --git a/CHANGES.md b/CHANGES.md index 87859d5e..b64f46f8 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,8 @@ - Call dispose when browser closes - Improve clipboard text copy/paste. - Change default sound/music api to howler.js +- add shouldEncodePreference config +- add localStoragePrefix config [1.0.0-b9] - add TeaClassFilter printAllowedClasses() and printExcludedClasses() diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/assets/AssetLoadingTaskEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/assets/AssetLoadingTaskEmu.java new file mode 100644 index 00000000..7087c549 --- /dev/null +++ b/backends/backend-teavm/emu/com/badlogic/gdx/assets/AssetLoadingTaskEmu.java @@ -0,0 +1,173 @@ +package com.badlogic.gdx.assets; + +import com.badlogic.gdx.Files; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.assets.loaders.AssetLoader; +import com.badlogic.gdx.assets.loaders.AsynchronousAssetLoader; +import com.badlogic.gdx.assets.loaders.SynchronousAssetLoader; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.GdxRuntimeException; +import com.badlogic.gdx.utils.Logger; +import com.badlogic.gdx.utils.TimeUtils; +import com.badlogic.gdx.utils.async.AsyncExecutor; +import com.badlogic.gdx.utils.async.AsyncResult; +import com.badlogic.gdx.utils.async.AsyncTask; +import com.github.xpenatan.gdx.backends.teavm.TeaApplication; +import com.github.xpenatan.gdx.backends.teavm.gen.Emulate; +import com.github.xpenatan.gdx.backends.teavm.preloader.AssetType; +import com.github.xpenatan.gdx.backends.teavm.preloader.Preloader; + +@Emulate(AssetLoadingTask.class) +class AssetLoadingTaskEmu implements AsyncTask { + AssetManager manager; + final AssetDescriptor assetDesc; + final AssetLoader loader; + final AsyncExecutor executor; + final long startTime; + + volatile boolean asyncDone; + volatile boolean dependenciesLoaded; + volatile Array dependencies; + volatile AsyncResult depsFuture; + volatile AsyncResult loadFuture; + volatile Object asset; + + int ticks = 0; + volatile boolean cancel; + + public AssetLoadingTaskEmu(AssetManager manager, AssetDescriptor assetDesc, AssetLoader loader, AsyncExecutor threadPool) { + this.manager = manager; + this.assetDesc = assetDesc; + this.loader = loader; + this.executor = threadPool; + startTime = manager.log.getLevel() == Logger.DEBUG ? TimeUtils.nanoTime() : 0; + } + + /** + * Loads parts of the asset asynchronously if the loader is an {@link AsynchronousAssetLoader}. + */ + @Override + public Void call() throws Exception { + if(cancel) return null; + AsynchronousAssetLoader asyncLoader = (AsynchronousAssetLoader)loader; + if(!dependenciesLoaded) { + dependencies = asyncLoader.getDependencies(assetDesc.fileName, resolve(loader, assetDesc), assetDesc.params); + if(dependencies != null) { + removeDuplicates(dependencies); + manager.injectDependencies(assetDesc.fileName, dependencies); + } + else { + // if we have no dependencies, we load the async part of the task immediately. + asyncLoader.loadAsync(manager, assetDesc.fileName, resolve(loader, assetDesc), assetDesc.params); + asyncDone = true; + } + } + else { + asyncLoader.loadAsync(manager, assetDesc.fileName, resolve(loader, assetDesc), assetDesc.params); + asyncDone = true; + } + return null; + } + + /** + * Updates the loading of the asset. In case the asset is loaded with an {@link AsynchronousAssetLoader}, the loaders + * {@link AsynchronousAssetLoader#loadAsync(AssetManager, String, FileHandle, AssetLoaderParameters)} method is first called on + * a worker thread. Once this method returns, the rest of the asset is loaded on the rendering thread via + * {@link AsynchronousAssetLoader#loadSync(AssetManager, String, FileHandle, AssetLoaderParameters)}. + * + * @return true in case the asset was fully loaded, false otherwise + * @throws GdxRuntimeException + */ + public boolean update() { + ticks++; + + // GTW: check if we have a file that was not preloaded and is not done loading yet + Preloader preloader = ((TeaApplication)Gdx.app).getPreloader(); + if(!preloader.isAssetLoaded(Files.FileType.Internal, assetDesc.fileName)) { + preloader.loadAsset(AssetType.Binary, Files.FileType.Internal, assetDesc.fileName); + boolean assetInQueue = preloader.isAssetInQueue(assetDesc.fileName); + // Loader.finishLoading breaks everything + if(!assetInQueue && ticks > 100000) + throw new GdxRuntimeException("File not prefetched, but finishLoading was probably called: " + assetDesc.fileName); + } + else { + if(loader instanceof SynchronousAssetLoader) + handleSyncLoader(); + else + handleAsyncLoader(); + } + return asset != null; + } + + private void handleSyncLoader() { + SynchronousAssetLoader syncLoader = (SynchronousAssetLoader)loader; + if(!dependenciesLoaded) { + dependenciesLoaded = true; + dependencies = syncLoader.getDependencies(assetDesc.fileName, resolve(loader, assetDesc), assetDesc.params); + if(dependencies == null) { + asset = syncLoader.load(manager, assetDesc.fileName, resolve(loader, assetDesc), assetDesc.params); + return; + } + removeDuplicates(dependencies); + manager.injectDependencies(assetDesc.fileName, dependencies); + } + else + asset = syncLoader.load(manager, assetDesc.fileName, resolve(loader, assetDesc), assetDesc.params); + } + + private void handleAsyncLoader() { + AsynchronousAssetLoader asyncLoader = (AsynchronousAssetLoader)loader; + if(!dependenciesLoaded) { + if(depsFuture == null) + depsFuture = executor.submit(this); + else if(depsFuture.isDone()) { + try { + depsFuture.get(); + } catch(Exception e) { + throw new GdxRuntimeException("Couldn't load dependencies of asset: " + assetDesc.fileName, e); + } + dependenciesLoaded = true; + if(asyncDone) + asset = asyncLoader.loadSync(manager, assetDesc.fileName, resolve(loader, assetDesc), assetDesc.params); + } + } + else if(loadFuture == null && !asyncDone) + loadFuture = executor.submit(this); + else if(asyncDone) + asset = asyncLoader.loadSync(manager, assetDesc.fileName, resolve(loader, assetDesc), assetDesc.params); + else if(loadFuture.isDone()) { + try { + loadFuture.get(); + } catch(Exception e) { + throw new GdxRuntimeException("Couldn't load asset: " + assetDesc.fileName, e); + } + asset = asyncLoader.loadSync(manager, assetDesc.fileName, resolve(loader, assetDesc), assetDesc.params); + } + } + + /** + * Called when this task is the task that is currently being processed and it is unloaded. + */ + public void unload() { + if(loader instanceof AsynchronousAssetLoader) + ((AsynchronousAssetLoader)loader).unloadAsync(manager, assetDesc.fileName, resolve(loader, assetDesc), assetDesc.params); + } + + private FileHandle resolve(AssetLoader loader, AssetDescriptor assetDesc) { + if(assetDesc.file == null) assetDesc.file = loader.resolve(assetDesc.fileName); + return assetDesc.file; + } + + private void removeDuplicates(Array array) { + boolean ordered = array.ordered; + array.ordered = true; + for(int i = 0; i < array.size; ++i) { + final String fn = array.get(i).fileName; + final Class type = array.get(i).type; + for(int j = array.size - 1; j > i; --j) + if(type == array.get(j).type && fn.equals(array.get(j).fileName)) array.removeIndex(j); + } + array.ordered = ordered; + } +} diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/assets/loaders/AssetLoaderEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/assets/loaders/AssetLoaderEmu.java deleted file mode 100644 index 04d4eed1..00000000 --- a/backends/backend-teavm/emu/com/badlogic/gdx/assets/loaders/AssetLoaderEmu.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.badlogic.gdx.assets.loaders; - -import com.badlogic.gdx.assets.AssetDescriptor; -import com.badlogic.gdx.assets.AssetLoaderParameters; -import com.badlogic.gdx.files.FileHandle; -import com.badlogic.gdx.utils.Array; -import com.github.xpenatan.gdx.backends.teavm.gen.Emulate; - -@Emulate(AssetLoader.class) -public abstract class AssetLoaderEmu> { - private FileHandleResolver resolver; - - public AssetLoaderEmu (FileHandleResolver resolver) { - this.resolver = resolver; - } - - public FileHandle resolve (String fileName) { - return resolver.resolve(fileName); - } - - public abstract Array getDependencies (String fileName, FileHandle file, P parameter); -} \ No newline at end of file diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/assets/loaders/AsynchronousAssetLoaderEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/assets/loaders/AsynchronousAssetLoaderEmu.java deleted file mode 100644 index 2339e1e8..00000000 --- a/backends/backend-teavm/emu/com/badlogic/gdx/assets/loaders/AsynchronousAssetLoaderEmu.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.badlogic.gdx.assets.loaders; - -import com.badlogic.gdx.assets.AssetLoaderParameters; -import com.badlogic.gdx.assets.AssetManager; -import com.badlogic.gdx.files.FileHandle; -import com.github.xpenatan.gdx.backends.teavm.gen.Emulate; - -@Emulate(AsynchronousAssetLoader.class) -public abstract class AsynchronousAssetLoaderEmu> extends AssetLoader { - - public AsynchronousAssetLoaderEmu (FileHandleResolver resolver) { - super(resolver); - } - - public abstract void loadAsync (AssetManager manager, String fileName, FileHandle file, P parameter); - - public void unloadAsync (AssetManager manager, String fileName, FileHandle file, P parameter) { - } - - public abstract T loadSync (AssetManager manager, String fileName, FileHandle file, P parameter); -} \ No newline at end of file diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java index a076c726..b224075a 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java @@ -81,15 +81,14 @@ public void onFailure(String url) { } @Override - public boolean onSuccess(String url, Blob result) { + public void onSuccess(String url, Blob result) { Int8ArrayWrapper data = result.getData(); byte[] byteArray = TypedArrays.toByteArray(data); Pixmap pixmapEmu = new Pixmap(byteArray, 0, byteArray.length); responseListener.downloadComplete(pixmapEmu); - return false; } }; - AssetDownloader.getInstance().load(true, url, AssetType.Binary, null, listener); + AssetDownloader.getInstance().load(true, url, AssetType.Binary, listener); } public PixmapEmu(FileHandle file) { diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/utils/SharedLibraryLoaderEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/utils/SharedLibraryLoaderEmu.java index 90d767e1..af974f76 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/utils/SharedLibraryLoaderEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/utils/SharedLibraryLoaderEmu.java @@ -14,8 +14,7 @@ public void load (String libraryName) { Preloader preloader = app.getPreloader(); preloader.loadScript(false, libraryName + ".js", new AssetLoaderListener() { @Override - public boolean onSuccess(String url, Object result) { - return true; + public void onSuccess(String url, Object result) { } @Override diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/AssetLoaderListener.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/AssetLoaderListener.java index 348e4985..0cfda2d5 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/AssetLoaderListener.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/AssetLoaderListener.java @@ -10,7 +10,6 @@ public void onProgress(double amount) { public void onFailure(String url) { } - public boolean onSuccess(String url, T result) { - return false; + public void onSuccess(String url, T result) { } } \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java index b831445b..6006135c 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java @@ -423,7 +423,7 @@ public Preferences getPreferences(String name) { Preferences pref = prefs.get(name); if(pref == null) { Storage storage = Storage.getLocalStorage();; - pref = new TeaPreferences(storage, config.storagePrefix + name); + pref = new TeaPreferences(storage, config.storagePrefix + ":" + name, config.shouldEncodePreference); prefs.put(name, pref); } return pref; @@ -481,8 +481,7 @@ public enum AppState { private void initGdx() { preloader.loadScript(true, "gdx.wasm.js", new AssetLoaderListener() { @Override - public boolean onSuccess(String url, Object result) { - return true; + public void onSuccess(String url, Object result) { } }); } @@ -490,9 +489,8 @@ public boolean onSuccess(String url, Object result) { private void initSound() { preloader.loadScript(true, "howler.js", new AssetLoaderListener() { @Override - public boolean onSuccess(String url, Object result) { - return true; + public void onSuccess(String url, Object result) { } }); } -} +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java index d4cb5119..bced0dfa 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplicationConfiguration.java @@ -29,7 +29,11 @@ public class TeaApplicationConfiguration { * browser is not shared between the applications. If you leave the storage prefix at "", all the data * and files stored will be shared between the applications. */ - public String storagePrefix = "db/assets"; + public String storagePrefix = "app"; + + public String localStoragePrefix = "db/assets"; + + public boolean shouldEncodePreference = false; /** * Show download logs. diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java index 1563dca2..1dabdf20 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaFiles.java @@ -17,13 +17,13 @@ public class TeaFiles implements Files { public MemoryFileStorage internalStorage; public MemoryFileStorage classpathStorage; public MemoryFileStorage localStorage; - public String storagePath; + public String localStoragePrefix; public TeaFiles(TeaApplicationConfiguration config, TeaApplication teaApplication) { this.internalStorage = new InternalStorage(); this.classpathStorage = new ClasspathStorage(); this.localStorage = new LocalDBStorage(teaApplication); - storagePath = config.storagePrefix; + localStoragePrefix = config.localStoragePrefix; } public FileDB getFileDB(FileType type) { @@ -91,7 +91,7 @@ public boolean isExternalStorageAvailable() { @Override public String getLocalStoragePath() { - return storagePath; + return localStoragePrefix; } @Override diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaPreferences.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaPreferences.java index 61d65fac..6f926ff3 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaPreferences.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaPreferences.java @@ -23,19 +23,31 @@ public class TeaPreferences implements Preferences { private Storage storage; - public TeaPreferences(Storage storage, String prefix) { + private boolean shouldEncode; + + public TeaPreferences(Storage storage, String prefix, boolean shouldEncode) { this.storage = storage; this.prefix = ID_FOR_PREF + prefix + ":"; + this.shouldEncode = shouldEncode; int prefixLength = this.prefix.length(); try { for(int i = 0; i < storage.getLength(); i++) { String keyEncoded = storage.key(i); - String key = new String(HEXCoder.decode(keyEncoded)); + String key = keyEncoded; + if(shouldEncode) { + key = new String(HEXCoder.decode(keyEncoded)); + } boolean flag = key.startsWith(this.prefix); if(flag) { String value = storage.getItem(keyEncoded); String keyStr = key.substring(prefixLength, key.length() - 1); - Object object = toObject(key, new String(HEXCoder.decode(value))); + Object object; + if(shouldEncode) { + object = toObject(key, new String(HEXCoder.decode(value))); + } + else { + object = toObject(key, value); + } values.put(keyStr, object); } } @@ -68,9 +80,12 @@ public void flush() { // remove all old values for(int i = 0; i < storage.getLength(); i++) { String keyEncoded = storage.key(i); - String key = new String(HEXCoder.decode(keyEncoded)); + String key = keyEncoded; + if(shouldEncode) { + key = new String(HEXCoder.decode(keyEncoded)); + } if(key.startsWith(prefix)) { - storage.removeItem(key); + storage.removeItem(keyEncoded); } } @@ -78,7 +93,12 @@ public void flush() { for(String key : values.keys()) { String storageKey = toStorageKey(key, values.get(key)); String storageValue = "" + values.get(key).toString(); - storage.setItem(HEXCoder.encode(storageKey.getBytes()), HEXCoder.encode(storageValue.getBytes())); + if(shouldEncode) { + storage.setItem(HEXCoder.encode(storageKey.getBytes()), HEXCoder.encode(storageValue.getBytes())); + } + else { + storage.setItem(storageKey, storageValue); + } } } catch(Exception e) { diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java index 90bd94e0..07630d29 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java @@ -301,9 +301,6 @@ private static void copyDirectory(FileHandle sourceDir, FileHandle destDir, Asse @Deprecated public static AssetType getType(String file) { String extension = extension(file).toLowerCase(); - if(isImage(extension)) return AssetType.Image; - if(isAudio(extension)) return AssetType.Audio; - if(isText(extension)) return AssetType.Text; return AssetType.Binary; } @@ -313,18 +310,4 @@ private static String extension(String file) { if(dotIndex == -1) return ""; return name.substring(dotIndex + 1); } - - private static boolean isImage(String extension) { - return extension.equals("jpg") || extension.equals("jpeg") || extension.equals("png") || extension.equals("bmp") || extension.equals("gif"); - } - - private static boolean isText(String extension) { - return extension.equals("json") || extension.equals("xml") || extension.equals("txt") || extension.equals("glsl") - || extension.equals("fnt") || extension.equals("pack") || extension.equals("obj") || extension.equals("atlas") - || extension.equals("g3dj"); - } - - private static boolean isAudio(String extension) { - return extension.equals("mp3") || extension.equals("ogg") || extension.equals("wav"); - } -} +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java index a25c0d01..7aae416d 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/filesystem/types/LocalDBStorage.java @@ -38,7 +38,7 @@ private void setupIndexedDB(TeaApplication teaApplication) { teaApplication.delayInitCount++; IDBFactory instance = IDBFactory.getInstance(); - String databaseName = config.storagePrefix; + String databaseName = config.localStoragePrefix; IDBOpenDBRequest request = instance.open(databaseName, 1); request.setOnUpgradeNeeded(evt -> { diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloadImpl.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloadImpl.java index c8a0571f..075df90f 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloadImpl.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloadImpl.java @@ -2,16 +2,7 @@ import com.badlogic.gdx.utils.GdxRuntimeException; import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; -import com.github.xpenatan.gdx.backends.teavm.dom.DocumentWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.EventHandlerWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.EventListenerWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.EventWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.HTMLElementWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.HTMLImageElementWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.LocationWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.NodeWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.ProgressEventWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.XMLHttpRequestWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.impl.TeaWindow; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; @@ -19,24 +10,19 @@ import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloader.AssetDownload; import org.teavm.jso.ajax.XMLHttpRequest; import org.teavm.jso.browser.Window; +import org.teavm.jso.dom.html.HTMLDocument; +import org.teavm.jso.dom.html.HTMLScriptElement; public class AssetDownloadImpl implements AssetDownload { private int queue; - private boolean useBrowserCache = false; - private boolean useInlineBase64 = false; - - private boolean showLogs = true; + private final boolean showLogs; + private boolean showDownloadProgress; public AssetDownloadImpl(boolean showDownloadLogs) { showLogs = showDownloadLogs; } - @Override - public boolean isUseBrowserCache() { - return useBrowserCache; - } - @Override public String getHostPageBaseURL() { TeaWindow currentWindow = TeaWindow.get(); @@ -61,20 +47,11 @@ public void addQueue() { } @Override - public void load(boolean async, String url, AssetType type, String mimeType, AssetLoaderListener listener) { + public void load(boolean async, String url, AssetType type, AssetLoaderListener listener) { switch(type) { - case Text: - loadText(async, url, (AssetLoaderListener)listener); - break; - case Image: - loadImage(async, url, mimeType, (AssetLoaderListener)listener); - break; case Binary: loadBinary(async, url, (AssetLoaderListener)listener); break; - case Audio: - loadAudio(async, url, (AssetLoaderListener)listener); - break; case Directory: listener.onSuccess(url, null); break; @@ -83,118 +60,29 @@ public void load(boolean async, String url, AssetType type, String mimeType, Ass } } - @Override - public void loadText(boolean async, String url, AssetLoaderListener listener) { - if(showLogs) - System.out.println("Loading asset : " + url); - - // don't load on main thread - addQueue(); - new Thread() { - public void run() { - final XMLHttpRequestWrapper request = (XMLHttpRequestWrapper)XMLHttpRequest.create(); - request.setOnreadystatechange(new EventHandlerWrapper() { - @Override - public void handleEvent(EventWrapper evt) { - if(request.getReadyState() == XMLHttpRequestWrapper.DONE) { - if(request.getStatus() != 200) { - if ((request.getStatus() != 404) && - (request.getStatus() != 403)) { - // re-try: e.g. failure due to ERR_HTTP2_SERVER_REFUSED_STREAM (too many requests) - try { - Thread.sleep(100); - } - catch (Throwable e) { - // ignored - } - loadText(async, url, listener); - } - else { - listener.onFailure(url); - } - } - else { - if(showLogs) - System.out.println("Asset loaded: " + url); - listener.onSuccess(url, request.getResponseText()); - } - subtractQueue(); - } - } - }); - setOnProgress(request, listener); - request.open("GET", url, async); - request.setRequestHeader("Content-Type", "text/plain; charset=utf-8"); - request.send(); - } - }.start(); - } - @Override public void loadScript(boolean async, String url, AssetLoaderListener listener) { if(showLogs) System.out.println("Loading script : " + url); - // don't load on main thread - addQueue(); - final XMLHttpRequestWrapper request = (XMLHttpRequestWrapper)XMLHttpRequest.create(); - request.setOnreadystatechange(new EventHandlerWrapper() { + loadBinary(async, url, new AssetLoaderListener<>() { @Override - public void handleEvent(EventWrapper evt) { - if(request.getReadyState() == XMLHttpRequestWrapper.DONE) { - if(request.getStatus() != 200) { - if ((request.getStatus() != 404) && - (request.getStatus() != 403)) { - // re-try: e.g. failure due to ERR_HTTP2_SERVER_REFUSED_STREAM (too many requests) - try { - Thread.sleep(100); - } - catch (Throwable e) { - // ignored - } - loadScript(async, url, listener); - } - else { - listener.onFailure(url); - } - } - else { - if(showLogs) - System.out.println("Script loaded: " + url); - NodeWrapper response = request.getResponse(); - TeaWindow currentWindow = TeaWindow.get(); - DocumentWrapper document = currentWindow.getDocument(); - HTMLElementWrapper scriptElement = document.createElement("script"); - scriptElement.appendChild(document.createTextNode(response)); - document.getBody().appendChild(scriptElement); - listener.onSuccess(url, request.getResponseText()); - } - subtractQueue(); - } - } - }); - setOnProgress(request, listener); - request.open("GET", url, async); - request.setRequestHeader("Content-Type", "text/plain; charset=utf-8"); - request.send(); - } - - public void loadAudio(boolean async, final String url, final AssetLoaderListener listener) { - loadBinary(async, url, new AssetLoaderListener() { - @Override - public void onProgress(double amount) { - listener.onProgress(amount); + public void onSuccess(String url, Blob result) { + Int8ArrayWrapper data = result.getData(); + byte[] byteArray = TypedArrays.toByteArray(data); + String script = new String(byteArray); + Window current = Window.current(); + HTMLDocument document = current.getDocument(); + HTMLScriptElement scriptElement = (HTMLScriptElement)document.createElement("script"); + scriptElement.setText(script); + document.getBody().appendChild(scriptElement); + listener.onSuccess(url, script); } @Override public void onFailure(String url) { listener.onFailure(url); } - - @Override - public boolean onSuccess(String url, Blob result) { - return listener.onSuccess(url, null); - } }); } @@ -206,41 +94,41 @@ public void loadBinary(boolean async, final String url, final AssetLoaderListene addQueue(); new Thread() { public void run() { - XMLHttpRequestWrapper request = (XMLHttpRequestWrapper)XMLHttpRequest.create(); - request.setOnreadystatechange(new EventHandlerWrapper() { - @Override - public void handleEvent(EventWrapper evt) { - if(request.getReadyState() == XMLHttpRequestWrapper.DONE) { - if(request.getStatus() != 200) { - if ((request.getStatus() != 404) && - (request.getStatus() != 403)) { - // re-try: e.g. failure due to ERR_HTTP2_SERVER_REFUSED_STREAM (too many requests) - try { - Thread.sleep(100); - } - catch (Throwable e) { - // ignored - } - loadBinary(async, url, listener); + XMLHttpRequest request = new XMLHttpRequest(); + request.setOnReadyStateChange(evt -> { + if(request.getReadyState() == XMLHttpRequest.DONE) { + int status = request.getStatus(); + if(status == 0) { + listener.onFailure(url); + } + else if(status != 200) { + if ((status != 404) && (status != 403)) { + // re-try: e.g. failure due to ERR_HTTP2_SERVER_REFUSED_STREAM (too many requests) + try { + Thread.sleep(100); } - else { - listener.onFailure(url); + catch (Throwable e) { + // ignored } + loadBinary(async, url, listener); } else { - if(showLogs) - System.out.println("Asset loaded: " + url); - - ArrayBufferWrapper response = (ArrayBufferWrapper)request.getResponse(); - Int8ArrayWrapper data = TypedArrays.createInt8Array(response); - listener.onSuccess(url, new Blob(response, data)); + listener.onFailure(url); } - subtractQueue(); } + else { + if(showLogs) + System.out.println("Asset loaded: " + url); + + ArrayBufferWrapper response = (ArrayBufferWrapper)request.getResponse(); + Int8ArrayWrapper data = TypedArrays.createInt8Array(response); + listener.onSuccess(url, new Blob(response, data)); + } + subtractQueue(); } }); - setOnProgress(request, listener); + setOnProgress(request, url, listener); request.open("GET", url, async); if(async) { request.setResponseType("arraybuffer"); @@ -250,68 +138,15 @@ public void handleEvent(EventWrapper evt) { }.start(); } - public void loadImage(boolean async, final String url, final String mimeType, - final AssetLoaderListener listener) { - loadImage(async, url, mimeType, null, listener); - } - - public void loadImage(boolean async, final String url, final String mimeType, final String crossOrigin, - final AssetLoaderListener listener) { - loadBinary(async, url, new AssetLoaderListener() { - @Override - public void onProgress(double amount) { - listener.onProgress(amount); - } - - @Override - public void onFailure(String url) { - listener.onFailure(url); - } - - @Override - public boolean onSuccess(String url, Blob result) { - DocumentWrapper document = (DocumentWrapper)Window.current().getDocument(); - final HTMLImageElementWrapper image = (HTMLImageElementWrapper)document.createElement("img"); - - if(crossOrigin != null) { - image.setAttribute("crossOrigin", crossOrigin); - } - addQueue(); - hookImgListener(image, new EventListenerWrapper() { - @Override - public void handleEvent(EventWrapper evt) { - if(evt.getType().equals("error")) - listener.onFailure(url); - else { - result.setImage(image); - listener.onSuccess(url, result); - } - subtractQueue(); - } - }); - if(useInlineBase64) { - image.setSrc("data:" + mimeType + ";base64," + result.toBase64()); - } - else { - image.setSrc(url); - } - return false; - } - }); - } - - static void hookImgListener(HTMLImageElementWrapper img, final EventListenerWrapper listener) { - img.addEventListener("load", listener, false); - img.addEventListener("error", listener, false); - } - - private void setOnProgress(XMLHttpRequestWrapper req, final AssetLoaderListener listener) { - req.setOnprogress(new EventHandlerWrapper() { - @Override - public void handleEvent(EventWrapper evt) { - ProgressEventWrapper progressEvent = (ProgressEventWrapper)evt; - listener.onProgress(progressEvent.getLoaded()); + private void setOnProgress(XMLHttpRequest req, String url, final AssetLoaderListener listener) { + req.onProgress(evt -> { + int loaded = evt.getLoaded(); + int total = evt.getTotal(); + double percent = (double)loaded / total; + if(showDownloadProgress) { + System.out.println("Total: " + total + " loaded: " + loaded + " URL: " + url); } + listener.onProgress(loaded); }); } -} +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloader.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloader.java index e1999fd1..fb1f4ad9 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloader.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloader.java @@ -19,21 +19,18 @@ public static void setInstance(AssetDownload instance) { AssetDownloader.instance = instance; } - static public interface AssetDownload { - public void load(boolean async, final String url, AssetType type, String mimeType, AssetLoaderListener listener); + public interface AssetDownload { - public void loadText(boolean async, final String url, final AssetLoaderListener listener); + void load(boolean async, final String url, AssetType type, AssetLoaderListener listener); - public void loadScript(boolean async, final String url, final AssetLoaderListener listener); + void loadScript(boolean async, final String url, final AssetLoaderListener listener); - public boolean isUseBrowserCache(); + String getHostPageBaseURL(); - public String getHostPageBaseURL(); + int getQueue(); - public int getQueue(); + void subtractQueue(); - public void subtractQueue(); - - public void addQueue(); + void addQueue(); } -} +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetType.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetType.java index 62d86aa5..e29912cf 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetType.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetType.java @@ -4,11 +4,11 @@ * @author xpenatan */ public enum AssetType { - Image("i"), Audio("a"), Text("t"), Binary("b"), Directory("d"); + Binary("b"), Directory("d"); public final String code; - private AssetType(String code) { + AssetType(String code) { this.code = code; } -} +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java index 630cddbc..f301fe26 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java @@ -2,6 +2,7 @@ import com.badlogic.gdx.Files.FileType; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.GdxRuntimeException; import com.badlogic.gdx.utils.StreamUtils; @@ -24,6 +25,7 @@ import com.github.xpenatan.gdx.backends.teavm.filesystem.FileData; import java.io.IOException; import java.io.OutputStream; +import java.util.HashSet; import org.teavm.jso.core.JSArray; import org.teavm.jso.core.JSArrayReader; import org.teavm.jso.core.JSPromise; @@ -39,9 +41,11 @@ public class Preloader { public final String baseUrl; + private HashSet assetInQueue; + public Preloader(String newBaseURL, HTMLCanvasElementWrapper canvas, TeaApplication teaApplication) { baseUrl = newBaseURL; - + assetInQueue = new HashSet<>(); setupFileDrop(canvas, teaApplication); } @@ -137,19 +141,13 @@ private String getScriptUrl() { } public void preload(TeaApplicationConfiguration config, final String assetFileUrl) { - AssetDownloader.getInstance().loadText(true, getAssetUrl() + assetFileUrl, new AssetLoaderListener() { - @Override - public void onProgress(double amount) { - } - - @Override - public void onFailure(String url) { - System.out.println("ErrorLoading: " + assetFileUrl); - } - + AssetLoaderListener listener = new AssetLoaderListener<>() { @Override - public boolean onSuccess(String url, String result) { - String[] lines = result.split("\n"); + public void onSuccess(String url, Blob result) { + Int8ArrayWrapper data = result.getData(); + byte[] byteArray = TypedArrays.toByteArray(data); + String assets = new String(byteArray); + String[] lines = assets.split("\n"); assetTotal = lines.length; @@ -179,34 +177,62 @@ else if(fileTypeStr.equals("l")) { loadAsset(assetType, fileType, assetUrl); } - return false; } - }); + + @Override + public void onFailure(String url) { + System.out.println("ErrorLoading: " + assetFileUrl); + } + }; + + AssetDownloader.getInstance().load(true, getAssetUrl() + assetFileUrl, AssetType.Binary, listener); } - public void loadAsset(AssetType assetType, FileType fileType, String path1) { - path1 = path1.trim().replace("\\", "/"); - if(path1.startsWith("/")) { - path1 = path1.substring(1); - } + public boolean isAssetInQueue(String path) { + String path1 = fixPath(path); + return assetInQueue.contains(path1); + } + + public boolean isAssetLoaded(FileType fileType, String path) { + String path1 = fixPath(path); + FileHandle fileHandle = Gdx.files.getFileHandle(path1, fileType); + return fileHandle.exists(); + } + + public void loadAsset(AssetType assetType, FileType fileType, String path) { + String path1 = fixPath(path); + if(path1.isEmpty()) { return; } - String path = path1; - AssetDownloader.getInstance().load(true, getAssetUrl() + path, AssetType.Binary, null, new AssetLoaderListener<>() { + + if(assetInQueue.contains(path1)) { + return; + } + + FileHandle fileHandle = Gdx.files.getFileHandle(path1, fileType); + if(fileHandle.exists()) { + // File already exist, don't download it again. + return; + } + + assetInQueue.add(path1); + AssetDownloader.getInstance().load(true, getAssetUrl() + path1, AssetType.Binary, new AssetLoaderListener<>() { @Override public void onProgress(double amount) { } @Override public void onFailure(String url) { + assetInQueue.remove(path1); } @Override - public boolean onSuccess(String url, Object result) { + public void onSuccess(String url, Object result) { + assetInQueue.remove(path1); Blob blob = (Blob)result; AssetType type = AssetType.Binary; - TeaFileHandle internalFile = (TeaFileHandle)Gdx.files.getFileHandle(path, fileType); + TeaFileHandle internalFile = (TeaFileHandle)Gdx.files.getFileHandle(path1, fileType); if(assetType == AssetType.Directory) { internalFile.mkdirsInternal(); } @@ -224,7 +250,6 @@ public boolean onSuccess(String url, Object result) { StreamUtils.closeQuietly(output); } } - return false; } }); } @@ -236,4 +261,12 @@ public void loadScript(boolean async, final String url, final AssetLoaderListene public int getQueue() { return AssetDownloader.getInstance().getQueue(); } + + private String fixPath(String path1) { + path1 = path1.trim().replace("\\", "/"); + if(path1.startsWith("/")) { + path1 = path1.substring(1); + } + return path1; + } } \ No newline at end of file diff --git a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java index 17c4809d..c8545d76 100644 --- a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java +++ b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/TeaVMTestLauncher.java @@ -20,7 +20,7 @@ public static void main(String[] args) { @Override public void create() { TeaFiles files = (TeaFiles)Gdx.files; - files.localStorage.debug = true; + files.localStorage.debug = false; super.create(); } diff --git a/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java b/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java index 946dadc2..1b37ea16 100644 --- a/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java +++ b/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java @@ -2,6 +2,7 @@ import com.badlogic.gdx.Application; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Preferences; import com.badlogic.gdx.Screen; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; @@ -16,8 +17,10 @@ import com.github.xpenatan.imgui.example.tests.frame.GameFrame; import imgui.ImDrawData; import imgui.ImGui; +import imgui.ImGuiCond; import imgui.ImGuiConfigFlags; import imgui.ImGuiIO; +import imgui.ImGuiInternal; import imgui.ImVec2; import imgui.gdx.ImGuiGdxImpl; import imgui.gdx.ImGuiGdxInputMultiplexer; @@ -32,9 +35,8 @@ public class ImGuiTestsApp implements Screen { private ImGuiGdxImpl impl; private ImGuiGdxInputMultiplexer input; - private boolean gdxTestInit = false; - private int selected = -1; + private boolean scrollTo = false; private TeaVMGdxTests.TeaVMInstancer[] testList; @@ -74,17 +76,23 @@ public boolean touchDown (int screenX, int screenY, int pointer, int button) { } }; ((TeaVMInputWrapper)Gdx.input).multiplexer.addProcessor(input); + + Preferences gdxTests = Gdx.app.getPreferences("gdxTests"); + selected = gdxTests.getInteger("selected", selected); + if(selected != -1) { + scrollTo = true; + } } private void drawTestListWindow() { - if(!gdxTestInit) { - gdxTestInit = true; - ImGui.SetNextWindowSize(ImVec2.TMP_1.set(250, 500)); - ImGui.SetNextWindowPos(ImVec2.TMP_1.set(20, 20)); - } + ImGui.SetNextWindowSize(ImVec2.TMP_1.set(250, 500), ImGuiCond.ImGuiCond_FirstUseEver); + ImGui.SetNextWindowPos(ImVec2.TMP_1.set(20, 20), ImGuiCond.ImGuiCond_FirstUseEver); ImGui.Begin("GdxTests"); if(ImGui.Button("Start Test")) { if(selected >= 0 && selected < testList.length) { + Preferences gdxTests = Gdx.app.getPreferences("gdxTests"); + gdxTests.putInteger("selected", selected); + gdxTests.flush(); ((TeaVMInputWrapper)Gdx.input).multiplexer.removeProcessor(input); test = testList[selected].instance(); Gdx.app.log("GdxTest", "Clicked on " + test.getClass().getName()); @@ -102,6 +110,10 @@ private void drawTestListWindow() { selected = i; } } + if(isSelected && scrollTo) { + scrollTo = false; + ImGuiInternal.ScrollToItem(); + } } ImGui.EndChild(); ImGui.End(); diff --git a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java b/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java index dbb1c5d5..74258997 100644 --- a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java +++ b/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java @@ -850,9 +850,8 @@ public static LibraryEmu initFreeType() { Preloader preloader = app.getPreloader(); preloader.loadScript(false, "freetype.js", new AssetLoaderListener() { @Override - public boolean onSuccess(String url, Object result) { + public void onSuccess(String url, Object result) { freeTypeInit = true; - return true; } @Override From fe85b08655eee890a840eea6bfd4201ae8ff0704 Mon Sep 17 00:00:00 2001 From: Natan Date: Mon, 8 Jul 2024 14:57:10 -0300 Subject: [PATCH 086/114] update readme --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index b64f46f8..c15988de 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -7,6 +7,7 @@ - Change default sound/music api to howler.js - add shouldEncodePreference config - add localStoragePrefix config +- AssetManager can now download assets [1.0.0-b9] - add TeaClassFilter printAllowedClasses() and printExcludedClasses() From c080deead4ded7ce7e6473b956218c637aec4a5e Mon Sep 17 00:00:00 2001 From: Natan Date: Mon, 8 Jul 2024 15:42:03 -0300 Subject: [PATCH 087/114] Change preload to interface --- .../gdx/assets/AssetLoadingTaskEmu.java | 2 +- .../com/badlogic/gdx/graphics/PixmapEmu.java | 2 +- .../gdx/utils/SharedLibraryLoaderEmu.java | 4 +- .../gdx/backends/teavm/TeaApplication.java | 15 +- .../gdx/backends/teavm/config/AssetsCopy.java | 1 - .../DefaultAssetFilter.java | 4 +- .../teavm/preloader/AssetDownloadImpl.java | 10 +- .../teavm/preloader/AssetDownloader.java | 2 +- .../gdx/backends/teavm/preloader/Blob.java | 53 +--- .../backends/teavm/preloader/Preloader.java | 270 +--------------- .../teavm/preloader/PreloaderImpl.java | 287 ++++++++++++++++++ .../graphics/g2d/freetype/FreeTypeEmu.java | 4 +- 12 files changed, 331 insertions(+), 323 deletions(-) rename backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/{preloader => config}/DefaultAssetFilter.java (70%) create mode 100644 backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/PreloaderImpl.java diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/assets/AssetLoadingTaskEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/assets/AssetLoadingTaskEmu.java index 7087c549..b4e43f8f 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/assets/AssetLoadingTaskEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/assets/AssetLoadingTaskEmu.java @@ -85,7 +85,7 @@ public boolean update() { // GTW: check if we have a file that was not preloaded and is not done loading yet Preloader preloader = ((TeaApplication)Gdx.app).getPreloader(); if(!preloader.isAssetLoaded(Files.FileType.Internal, assetDesc.fileName)) { - preloader.loadAsset(AssetType.Binary, Files.FileType.Internal, assetDesc.fileName); + preloader.loadAsset(true, assetDesc.fileName, AssetType.Binary, Files.FileType.Internal, null); boolean assetInQueue = preloader.isAssetInQueue(assetDesc.fileName); // Loader.finishLoading breaks everything if(!assetInQueue && ticks > 100000) diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java index b224075a..5785a0c1 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java @@ -82,7 +82,7 @@ public void onFailure(String url) { @Override public void onSuccess(String url, Blob result) { - Int8ArrayWrapper data = result.getData(); + Int8ArrayWrapper data = (Int8ArrayWrapper)result.getData(); byte[] byteArray = TypedArrays.toByteArray(data); Pixmap pixmapEmu = new Pixmap(byteArray, 0, byteArray.length); responseListener.downloadComplete(pixmapEmu); diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/utils/SharedLibraryLoaderEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/utils/SharedLibraryLoaderEmu.java index af974f76..248101e4 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/utils/SharedLibraryLoaderEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/utils/SharedLibraryLoaderEmu.java @@ -12,9 +12,9 @@ public class SharedLibraryLoaderEmu { public void load (String libraryName) { TeaApplication app = (TeaApplication)Gdx.app; Preloader preloader = app.getPreloader(); - preloader.loadScript(false, libraryName + ".js", new AssetLoaderListener() { + preloader.loadScript(false, libraryName + ".js", new AssetLoaderListener<>() { @Override - public void onSuccess(String url, Object result) { + public void onSuccess(String url, String result) { } @Override diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java index 6006135c..46128765 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java @@ -16,15 +16,14 @@ import com.badlogic.gdx.utils.ObjectMap; import com.github.xpenatan.gdx.backends.teavm.agent.TeaAgentInfo; import com.github.xpenatan.gdx.backends.teavm.agent.TeaWebAgent; -import com.github.xpenatan.gdx.backends.teavm.dom.DocumentWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.EventListenerWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.EventWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.HTMLElementWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.impl.TeaWindow; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloadImpl; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloader; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloader.AssetDownload; import com.github.xpenatan.gdx.backends.teavm.preloader.Preloader; +import com.github.xpenatan.gdx.backends.teavm.preloader.PreloaderImpl; import com.github.xpenatan.gdx.backends.teavm.utils.TeaNavigator; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -68,7 +67,7 @@ public static TeaApplication get() { private ApplicationLogger logger; private int logLevel = LOG_ERROR; - private Preloader preloader; + private PreloaderImpl preloader; private ObjectMap prefs = new ObjectMap<>(); @@ -116,7 +115,7 @@ else if(agentInfo.isLinux()) graphics = new TeaGraphics(config); - preloader = new Preloader(hostPageBaseURL, graphics.canvas, this); + preloader = new PreloaderImpl(hostPageBaseURL, graphics.canvas, this); AssetLoaderListener assetListener = new AssetLoaderListener(); input = new TeaInput(this, graphics.canvas); @@ -479,17 +478,17 @@ public enum AppState { // ##################### NATIVE CALLS ##################### private void initGdx() { - preloader.loadScript(true, "gdx.wasm.js", new AssetLoaderListener() { + preloader.loadScript(true, "gdx.wasm.js", new AssetLoaderListener<>() { @Override - public void onSuccess(String url, Object result) { + public void onSuccess(String url, String result) { } }); } private void initSound() { - preloader.loadScript(true, "howler.js", new AssetLoaderListener() { + preloader.loadScript(true, "howler.js", new AssetLoaderListener<>() { @Override - public void onSuccess(String url, Object result) { + public void onSuccess(String url, String result) { } }); } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java index 07630d29..dd53ca9a 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java @@ -5,7 +5,6 @@ import com.github.xpenatan.gdx.backends.teavm.TeaClassLoader; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetFilter; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetType; -import com.github.xpenatan.gdx.backends.teavm.preloader.DefaultAssetFilter; import java.io.IOException; import java.io.InputStream; import java.net.URI; diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/DefaultAssetFilter.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/DefaultAssetFilter.java similarity index 70% rename from backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/DefaultAssetFilter.java rename to backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/DefaultAssetFilter.java index 02878f85..fe7b210a 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/DefaultAssetFilter.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/DefaultAssetFilter.java @@ -1,4 +1,6 @@ -package com.github.xpenatan.gdx.backends.teavm.preloader; +package com.github.xpenatan.gdx.backends.teavm.config; + +import com.github.xpenatan.gdx.backends.teavm.preloader.AssetFilter; /** * @author xpenatan diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloadImpl.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloadImpl.java index 075df90f..f01c7692 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloadImpl.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloadImpl.java @@ -12,6 +12,8 @@ import org.teavm.jso.browser.Window; import org.teavm.jso.dom.html.HTMLDocument; import org.teavm.jso.dom.html.HTMLScriptElement; +import org.teavm.jso.typedarrays.ArrayBuffer; +import org.teavm.jso.typedarrays.Int8Array; public class AssetDownloadImpl implements AssetDownload { @@ -61,14 +63,14 @@ public void load(boolean async, String url, AssetType type, AssetLoaderListener< } @Override - public void loadScript(boolean async, String url, AssetLoaderListener listener) { + public void loadScript(boolean async, String url, AssetLoaderListener listener) { if(showLogs) System.out.println("Loading script : " + url); loadBinary(async, url, new AssetLoaderListener<>() { @Override public void onSuccess(String url, Blob result) { - Int8ArrayWrapper data = result.getData(); + Int8ArrayWrapper data = (Int8ArrayWrapper)result.getData(); byte[] byteArray = TypedArrays.toByteArray(data); String script = new String(byteArray); Window current = Window.current(); @@ -121,8 +123,8 @@ else if(status != 200) { System.out.println("Asset loaded: " + url); ArrayBufferWrapper response = (ArrayBufferWrapper)request.getResponse(); - Int8ArrayWrapper data = TypedArrays.createInt8Array(response); - listener.onSuccess(url, new Blob(response, data)); + Int8Array data = (Int8Array)TypedArrays.createInt8Array(response); + listener.onSuccess(url, new Blob((ArrayBuffer)response, data)); } subtractQueue(); } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloader.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloader.java index fb1f4ad9..4baa6f66 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloader.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloader.java @@ -23,7 +23,7 @@ public interface AssetDownload { void load(boolean async, final String url, AssetType type, AssetLoaderListener listener); - void loadScript(boolean async, final String url, final AssetLoaderListener listener); + void loadScript(boolean async, final String url, final AssetLoaderListener listener); String getHostPageBaseURL(); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Blob.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Blob.java index c6cbcff3..71e4017e 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Blob.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Blob.java @@ -1,41 +1,31 @@ package com.github.xpenatan.gdx.backends.teavm.preloader; -import com.github.xpenatan.gdx.backends.teavm.dom.HTMLImageElementWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; import java.io.IOException; import java.io.InputStream; +import org.teavm.jso.typedarrays.ArrayBuffer; +import org.teavm.jso.typedarrays.Int8Array; /** * @author xpenatan */ public final class Blob { - private ArrayBufferWrapper response; - private final Int8ArrayWrapper data; - private HTMLImageElementWrapper image; + private ArrayBuffer response; + private final Int8Array data; - public Blob(ArrayBufferWrapper response, Int8ArrayWrapper data) { + public Blob(ArrayBuffer response, Int8Array data) { this.data = data; this.response = response; } - public Int8ArrayWrapper getData() { + public Int8Array getData() { return data; } - public ArrayBufferWrapper getResponse() { + public ArrayBuffer getResponse() { return response; } - public HTMLImageElementWrapper getImage() { - return image; - } - - public void setImage(HTMLImageElementWrapper image) { - this.image = image; - } - public int length() { return data.getLength(); } @@ -61,33 +51,4 @@ public int available() { int pos; }; } - - public String toBase64() { - int length = data.getLength(); - String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - StringBuilder encoded = new StringBuilder(length * 4 / 3 + 2); - for(int i = 0; i < length; i += 3) { - if(length - i >= 3) { - int j = ((data.get(i) & 0xff) << 16) + ((data.get(i + 1) & 0xff) << 8) + (data.get(i + 2) & 0xff); - encoded.append(base64code.charAt((j >> 18) & 0x3f)); - encoded.append(base64code.charAt((j >> 12) & 0x3f)); - encoded.append(base64code.charAt((j >> 6) & 0x3f)); - encoded.append(base64code.charAt(j & 0x3f)); - } - else if(length - i >= 2) { - int j = ((data.get(i) & 0xff) << 16) + ((data.get(i + 1) & 0xff) << 8); - encoded.append(base64code.charAt((j >> 18) & 0x3f)); - encoded.append(base64code.charAt((j >> 12) & 0x3f)); - encoded.append(base64code.charAt((j >> 6) & 0x3f)); - encoded.append("="); - } - else { - int j = ((data.get(i) & 0xff) << 16); - encoded.append(base64code.charAt((j >> 18) & 0x3f)); - encoded.append(base64code.charAt((j >> 12) & 0x3f)); - encoded.append("=="); - } - } - return encoded.toString(); - } } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java index f301fe26..dbd825a2 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java @@ -1,272 +1,30 @@ package com.github.xpenatan.gdx.backends.teavm.preloader; import com.badlogic.gdx.Files.FileType; -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.files.FileHandle; -import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.GdxRuntimeException; -import com.badlogic.gdx.utils.StreamUtils; import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; -import com.github.xpenatan.gdx.backends.teavm.TeaApplication; -import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; -import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; -import com.github.xpenatan.gdx.backends.teavm.dom.DataTransferWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.DragEventWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.EventListenerWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.EventWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.FileListWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.FileReaderWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.FileWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.HTMLCanvasElementWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.HTMLDocumentWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; -import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; -import com.github.xpenatan.gdx.backends.teavm.filesystem.FileData; -import java.io.IOException; -import java.io.OutputStream; -import java.util.HashSet; -import org.teavm.jso.core.JSArray; -import org.teavm.jso.core.JSArrayReader; -import org.teavm.jso.core.JSPromise; /** * @author xpenatan */ -public class Preloader { - public int assetTotal = -1; +public interface Preloader { - private static final String ASSET_FOLDER = "assets/"; - private static final String SCRIPTS_FOLDER = "scripts/"; + String getAssetUrl(); - public final String baseUrl; + String getScriptUrl(); - private HashSet assetInQueue; + boolean isAssetInQueue(String path); - public Preloader(String newBaseURL, HTMLCanvasElementWrapper canvas, TeaApplication teaApplication) { - baseUrl = newBaseURL; - assetInQueue = new HashSet<>(); - setupFileDrop(canvas, teaApplication); - } + boolean isAssetLoaded(FileType fileType, String path); - private void setupFileDrop(HTMLCanvasElementWrapper canvas, TeaApplication teaApplication) { - TeaApplicationConfiguration config = teaApplication.getConfig(); - if(config.windowListener != null) { - HTMLDocumentWrapper document = canvas.getOwnerDocument(); - document.addEventListener("dragenter", new EventListenerWrapper() { - @Override - public void handleEvent(EventWrapper evt) { - evt.preventDefault(); - } - }, false); - document.addEventListener("dragover", new EventListenerWrapper() { - @Override - public void handleEvent(EventWrapper evt) { - evt.preventDefault(); - } - }, false); - document.addEventListener("drop", new EventListenerWrapper() { - @Override - public void handleEvent(EventWrapper evt) { - evt.preventDefault(); - DragEventWrapper event = (DragEventWrapper)evt; - DataTransferWrapper dataTransfer = event.getDataTransfer(); - FileListWrapper files = dataTransfer.getFiles(); - downloadDroppedFile(config, files); - } - }); - } - } + /** + * Load asset and add to FileHandle system + */ + void loadAsset(boolean async, String path, AssetType assetType, FileType fileType, AssetLoaderListener listener); - private JSPromise getFile(String name, FileWrapper fileWrapper) { - JSPromise success = new JSPromise<>((resolve, reject) -> { - FileReaderWrapper fileReader = FileReaderWrapper.create(); - fileReader.readAsArrayBuffer(fileWrapper); + /** + * Load script and attach to html document + */ + void loadScript(boolean async, String path, AssetLoaderListener listener); - fileReader.addEventListener("load", new EventListenerWrapper() { - @Override - public void handleEvent(EventWrapper evt) { - FileReaderWrapper target = (FileReaderWrapper)evt.getTarget(); - ArrayBufferWrapper arrayBuffer = target.getResultAsArrayBuffer(); - Int8ArrayWrapper data = TypedArrays.createInt8Array(arrayBuffer); - byte[] bytes = TypedArrays.toByteArray(data); - FileData fielData = new FileData(name, bytes); - resolve.accept(fielData); - } - }); - }); - - return success; - } - - private void downloadDroppedFile(TeaApplicationConfiguration config, FileListWrapper files) { - int totalDraggedFiles = files.getLength(); - if(totalDraggedFiles > 0) { - Array droppedFiles = new Array<>(); - var promises = new JSArray>(); - for(int i = 0; i < totalDraggedFiles; i++) { - FileWrapper fileWrapper = files.get(i); - String name = fileWrapper.getName(); - - if(config.windowListener.acceptFileDropped(name)) { - JSPromise promiss = getFile(name, fileWrapper); - promises.push(promiss); - } - } - - JSPromise> all = JSPromise.all(promises); - all.then(array -> { - int length = array.getLength(); - FileData [] arr = new FileData[length]; - for(int i = 0; i < length; i++) { - FileData fileData = array.get(i); - arr[i] = fileData; - } - config.windowListener.filesDropped(arr); - return "success"; - }, reason -> { - return "failure"; - }).onSettled(() -> { - return null; - }); - } - } - - private String getAssetUrl() { - return baseUrl + ASSET_FOLDER; - } - - private String getScriptUrl() { - return baseUrl + SCRIPTS_FOLDER; - } - - public void preload(TeaApplicationConfiguration config, final String assetFileUrl) { - AssetLoaderListener listener = new AssetLoaderListener<>() { - @Override - public void onSuccess(String url, Blob result) { - Int8ArrayWrapper data = result.getData(); - byte[] byteArray = TypedArrays.toByteArray(data); - String assets = new String(byteArray); - String[] lines = assets.split("\n"); - - assetTotal = lines.length; - - for(String line : lines) { - String[] tokens = line.split(":"); - if(tokens.length != 4) { - throw new GdxRuntimeException("Invalid assets description file."); - } - - String assetUrl = tokens[2].trim(); - assetUrl = assetUrl.trim(); - if(assetUrl.isEmpty()) { - continue; - } - String fileTypeStr = tokens[0]; - String assetTypeStr = tokens[1]; - - FileType fileType = FileType.Internal; - if(fileTypeStr.equals("c")) { - fileType = FileType.Classpath; - } - else if(fileTypeStr.equals("l")) { - fileType = FileType.Local; - } - AssetType assetType = AssetType.Binary; - if(assetTypeStr.equals("d")) assetType = AssetType.Directory; - - loadAsset(assetType, fileType, assetUrl); - } - } - - @Override - public void onFailure(String url) { - System.out.println("ErrorLoading: " + assetFileUrl); - } - }; - - AssetDownloader.getInstance().load(true, getAssetUrl() + assetFileUrl, AssetType.Binary, listener); - } - - public boolean isAssetInQueue(String path) { - String path1 = fixPath(path); - return assetInQueue.contains(path1); - } - - public boolean isAssetLoaded(FileType fileType, String path) { - String path1 = fixPath(path); - FileHandle fileHandle = Gdx.files.getFileHandle(path1, fileType); - return fileHandle.exists(); - } - - public void loadAsset(AssetType assetType, FileType fileType, String path) { - String path1 = fixPath(path); - - if(path1.isEmpty()) { - return; - } - - if(assetInQueue.contains(path1)) { - return; - } - - FileHandle fileHandle = Gdx.files.getFileHandle(path1, fileType); - if(fileHandle.exists()) { - // File already exist, don't download it again. - return; - } - - assetInQueue.add(path1); - AssetDownloader.getInstance().load(true, getAssetUrl() + path1, AssetType.Binary, new AssetLoaderListener<>() { - @Override - public void onProgress(double amount) { - } - - @Override - public void onFailure(String url) { - assetInQueue.remove(path1); - } - - @Override - public void onSuccess(String url, Object result) { - assetInQueue.remove(path1); - Blob blob = (Blob)result; - AssetType type = AssetType.Binary; - TeaFileHandle internalFile = (TeaFileHandle)Gdx.files.getFileHandle(path1, fileType); - if(assetType == AssetType.Directory) { - internalFile.mkdirsInternal(); - } - else { - Int8ArrayWrapper data = blob.getData(); - byte[] byteArray = TypedArrays.toByteArray(data); - OutputStream output = internalFile.write(false, 4096); - try { - output.write(byteArray); - } - catch(IOException ex) { - throw new GdxRuntimeException("Error writing file: " + internalFile + " (" + internalFile.type() + ")", ex); - } - finally { - StreamUtils.closeQuietly(output); - } - } - } - }); - } - - public void loadScript(boolean async, final String url, final AssetLoaderListener listener) { - AssetDownloader.getInstance().loadScript(async, getScriptUrl() + url, listener); - } - - public int getQueue() { - return AssetDownloader.getInstance().getQueue(); - } - - private String fixPath(String path1) { - path1 = path1.trim().replace("\\", "/"); - if(path1.startsWith("/")) { - path1 = path1.substring(1); - } - return path1; - } + int getQueue(); } \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/PreloaderImpl.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/PreloaderImpl.java new file mode 100644 index 00000000..53c855cb --- /dev/null +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/PreloaderImpl.java @@ -0,0 +1,287 @@ +package com.github.xpenatan.gdx.backends.teavm.preloader; + +import com.badlogic.gdx.Files.FileType; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.GdxRuntimeException; +import com.badlogic.gdx.utils.StreamUtils; +import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; +import com.github.xpenatan.gdx.backends.teavm.TeaApplication; +import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; +import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; +import com.github.xpenatan.gdx.backends.teavm.dom.DataTransferWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.DragEventWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.EventListenerWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.EventWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.FileListWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.FileReaderWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.FileWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.HTMLCanvasElementWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.HTMLDocumentWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; +import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; +import com.github.xpenatan.gdx.backends.teavm.filesystem.FileData; +import java.io.IOException; +import java.io.OutputStream; +import java.util.HashSet; +import org.teavm.jso.core.JSArray; +import org.teavm.jso.core.JSArrayReader; +import org.teavm.jso.core.JSPromise; + +/** + * @author xpenatan + */ +public class PreloaderImpl implements Preloader { + public int assetTotal = -1; + + private static final String ASSET_FOLDER = "assets/"; + private static final String SCRIPTS_FOLDER = "scripts/"; + + public final String baseUrl; + + private HashSet assetInQueue; + + public PreloaderImpl(String newBaseURL, HTMLCanvasElementWrapper canvas, TeaApplication teaApplication) { + baseUrl = newBaseURL; + assetInQueue = new HashSet<>(); + setupFileDrop(canvas, teaApplication); + } + + private void setupFileDrop(HTMLCanvasElementWrapper canvas, TeaApplication teaApplication) { + TeaApplicationConfiguration config = teaApplication.getConfig(); + if(config.windowListener != null) { + HTMLDocumentWrapper document = canvas.getOwnerDocument(); + document.addEventListener("dragenter", new EventListenerWrapper() { + @Override + public void handleEvent(EventWrapper evt) { + evt.preventDefault(); + } + }, false); + document.addEventListener("dragover", new EventListenerWrapper() { + @Override + public void handleEvent(EventWrapper evt) { + evt.preventDefault(); + } + }, false); + document.addEventListener("drop", new EventListenerWrapper() { + @Override + public void handleEvent(EventWrapper evt) { + evt.preventDefault(); + DragEventWrapper event = (DragEventWrapper)evt; + DataTransferWrapper dataTransfer = event.getDataTransfer(); + FileListWrapper files = dataTransfer.getFiles(); + downloadDroppedFile(config, files); + } + }); + } + } + + private JSPromise getFile(String name, FileWrapper fileWrapper) { + JSPromise success = new JSPromise<>((resolve, reject) -> { + FileReaderWrapper fileReader = FileReaderWrapper.create(); + fileReader.readAsArrayBuffer(fileWrapper); + + fileReader.addEventListener("load", new EventListenerWrapper() { + @Override + public void handleEvent(EventWrapper evt) { + FileReaderWrapper target = (FileReaderWrapper)evt.getTarget(); + ArrayBufferWrapper arrayBuffer = target.getResultAsArrayBuffer(); + Int8ArrayWrapper data = TypedArrays.createInt8Array(arrayBuffer); + byte[] bytes = TypedArrays.toByteArray(data); + FileData fielData = new FileData(name, bytes); + resolve.accept(fielData); + } + }); + }); + + return success; + } + + private void downloadDroppedFile(TeaApplicationConfiguration config, FileListWrapper files) { + int totalDraggedFiles = files.getLength(); + if(totalDraggedFiles > 0) { + Array droppedFiles = new Array<>(); + var promises = new JSArray>(); + for(int i = 0; i < totalDraggedFiles; i++) { + FileWrapper fileWrapper = files.get(i); + String name = fileWrapper.getName(); + + if(config.windowListener.acceptFileDropped(name)) { + JSPromise promiss = getFile(name, fileWrapper); + promises.push(promiss); + } + } + + JSPromise> all = JSPromise.all(promises); + all.then(array -> { + int length = array.getLength(); + FileData [] arr = new FileData[length]; + for(int i = 0; i < length; i++) { + FileData fileData = array.get(i); + arr[i] = fileData; + } + config.windowListener.filesDropped(arr); + return "success"; + }, reason -> { + return "failure"; + }).onSettled(() -> { + return null; + }); + } + } + + @Override + public String getAssetUrl() { + return baseUrl + ASSET_FOLDER; + } + + @Override + public String getScriptUrl() { + return baseUrl + SCRIPTS_FOLDER; + } + + public void preload(TeaApplicationConfiguration config, final String assetFileUrl) { + AssetLoaderListener listener = new AssetLoaderListener<>() { + @Override + public void onSuccess(String url, Blob result) { + Int8ArrayWrapper data = (Int8ArrayWrapper)result.getData(); + byte[] byteArray = TypedArrays.toByteArray(data); + String assets = new String(byteArray); + String[] lines = assets.split("\n"); + + assetTotal = lines.length; + + for(String line : lines) { + String[] tokens = line.split(":"); + if(tokens.length != 4) { + throw new GdxRuntimeException("Invalid assets description file."); + } + + String assetUrl = tokens[2].trim(); + assetUrl = assetUrl.trim(); + if(assetUrl.isEmpty()) { + continue; + } + String fileTypeStr = tokens[0]; + String assetTypeStr = tokens[1]; + + FileType fileType = FileType.Internal; + if(fileTypeStr.equals("c")) { + fileType = FileType.Classpath; + } + else if(fileTypeStr.equals("l")) { + fileType = FileType.Local; + } + AssetType assetType = AssetType.Binary; + if(assetTypeStr.equals("d")) assetType = AssetType.Directory; + + loadAsset(true, assetUrl, assetType, fileType, null); + } + } + + @Override + public void onFailure(String url) { + System.out.println("ErrorLoading: " + assetFileUrl); + } + }; + + AssetDownloader.getInstance().load(true, getAssetUrl() + assetFileUrl, AssetType.Binary, listener); + } + + @Override + public boolean isAssetInQueue(String path) { + String path1 = fixPath(path); + return assetInQueue.contains(path1); + } + + @Override + public boolean isAssetLoaded(FileType fileType, String path) { + String path1 = fixPath(path); + FileHandle fileHandle = Gdx.files.getFileHandle(path1, fileType); + return fileHandle.exists(); + } + + @Override + public void loadAsset(boolean async, String path, AssetType assetType, FileType fileType, AssetLoaderListener listener) { + String path1 = fixPath(path); + + if(path1.isEmpty()) { + return; + } + + if(assetInQueue.contains(path1)) { + return; + } + + FileHandle fileHandle = Gdx.files.getFileHandle(path1, fileType); + if(fileHandle.exists()) { + // File already exist, don't download it again. + return; + } + + assetInQueue.add(path1); + AssetDownloader.getInstance().load(async, getAssetUrl() + path1, AssetType.Binary, new AssetLoaderListener() { + @Override + public void onProgress(double amount) { + if(listener != null) { + listener.onProgress(amount); + } + } + + @Override + public void onFailure(String url) { + assetInQueue.remove(path1); + if(listener != null) { + listener.onFailure(path1); + } + } + + @Override + public void onSuccess(String url, Blob result) { + assetInQueue.remove(path1); + AssetType type = AssetType.Binary; + TeaFileHandle fileHandle = (TeaFileHandle)Gdx.files.getFileHandle(path1, fileType); + if(assetType == AssetType.Directory) { + fileHandle.mkdirsInternal(); + } + else { + Int8ArrayWrapper data = (Int8ArrayWrapper)result.getData(); + byte[] byteArray = TypedArrays.toByteArray(data); + OutputStream output = fileHandle.write(false, 4096); + try { + output.write(byteArray); + } + catch(IOException ex) { + throw new GdxRuntimeException("Error writing file: " + fileHandle + " (" + fileHandle.type() + ")", ex); + } + finally { + StreamUtils.closeQuietly(output); + } + } + if(listener != null) { + listener.onSuccess(path1, result); + } + } + }); + } + + @Override + public void loadScript(boolean async, String url, AssetLoaderListener listener) { + AssetDownloader.getInstance().loadScript(async, getScriptUrl() + url, listener); + } + + @Override + public int getQueue() { + return AssetDownloader.getInstance().getQueue(); + } + + private String fixPath(String path1) { + path1 = path1.trim().replace("\\", "/"); + if(path1.startsWith("/")) { + path1 = path1.substring(1); + } + return path1; + } +} \ No newline at end of file diff --git a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java b/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java index 74258997..4b003b2c 100644 --- a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java +++ b/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java @@ -848,9 +848,9 @@ public static LibraryEmu initFreeType() { if(!freeTypeInit) { TeaApplication app = (TeaApplication)Gdx.app; Preloader preloader = app.getPreloader(); - preloader.loadScript(false, "freetype.js", new AssetLoaderListener() { + preloader.loadScript(false, "freetype.js", new AssetLoaderListener<>() { @Override - public void onSuccess(String url, Object result) { + public void onSuccess(String url, String result) { freeTypeInit = true; } From 660009d4e8015004c86c5c73a7bb53f99b42d1ae Mon Sep 17 00:00:00 2001 From: Natan Date: Mon, 8 Jul 2024 15:57:51 -0300 Subject: [PATCH 088/114] Add preloader instance --- .../gdx/assets/AssetLoadingTaskEmu.java | 2 +- .../gdx/utils/SharedLibraryLoaderEmu.java | 2 +- .../gdx/backends/teavm/TeaApplication.java | 9 ++-- .../{PreloaderImpl.java => PreloadImpl.java} | 4 +- .../backends/teavm/preloader/Preloader.java | 43 +++++++++++++------ .../graphics/g2d/freetype/FreeTypeEmu.java | 3 +- 6 files changed, 39 insertions(+), 24 deletions(-) rename backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/{PreloaderImpl.java => PreloadImpl.java} (98%) diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/assets/AssetLoadingTaskEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/assets/AssetLoadingTaskEmu.java index b4e43f8f..675cf845 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/assets/AssetLoadingTaskEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/assets/AssetLoadingTaskEmu.java @@ -83,7 +83,7 @@ public boolean update() { ticks++; // GTW: check if we have a file that was not preloaded and is not done loading yet - Preloader preloader = ((TeaApplication)Gdx.app).getPreloader(); + Preloader.Preload preloader = Preloader.getInstance(); if(!preloader.isAssetLoaded(Files.FileType.Internal, assetDesc.fileName)) { preloader.loadAsset(true, assetDesc.fileName, AssetType.Binary, Files.FileType.Internal, null); boolean assetInQueue = preloader.isAssetInQueue(assetDesc.fileName); diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/utils/SharedLibraryLoaderEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/utils/SharedLibraryLoaderEmu.java index 248101e4..b888865a 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/utils/SharedLibraryLoaderEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/utils/SharedLibraryLoaderEmu.java @@ -11,7 +11,7 @@ public class SharedLibraryLoaderEmu { public void load (String libraryName) { TeaApplication app = (TeaApplication)Gdx.app; - Preloader preloader = app.getPreloader(); + Preloader.Preload preloader = Preloader.getInstance(); preloader.loadScript(false, libraryName + ".js", new AssetLoaderListener<>() { @Override public void onSuccess(String url, String result) { diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java index 46128765..e6af094f 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java @@ -23,7 +23,7 @@ import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloader; import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloader.AssetDownload; import com.github.xpenatan.gdx.backends.teavm.preloader.Preloader; -import com.github.xpenatan.gdx.backends.teavm.preloader.PreloaderImpl; +import com.github.xpenatan.gdx.backends.teavm.preloader.PreloadImpl; import com.github.xpenatan.gdx.backends.teavm.utils.TeaNavigator; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -67,7 +67,7 @@ public static TeaApplication get() { private ApplicationLogger logger; private int logLevel = LOG_ERROR; - private PreloaderImpl preloader; + private PreloadImpl preloader; private ObjectMap prefs = new ObjectMap<>(); @@ -115,7 +115,8 @@ else if(agentInfo.isLinux()) graphics = new TeaGraphics(config); - preloader = new PreloaderImpl(hostPageBaseURL, graphics.canvas, this); + preloader = new PreloadImpl(hostPageBaseURL, graphics.canvas, this); + Preloader.setInstance(preloader); AssetLoaderListener assetListener = new AssetLoaderListener(); input = new TeaInput(this, graphics.canvas); @@ -309,7 +310,7 @@ public void setApplicationListener(ApplicationListener applicationListener) { this.queueAppListener = applicationListener; } - public Preloader getPreloader() { + public Preloader.Preload getPreloader() { return preloader; } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/PreloaderImpl.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/PreloadImpl.java similarity index 98% rename from backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/PreloaderImpl.java rename to backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/PreloadImpl.java index 53c855cb..8a35fca6 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/PreloaderImpl.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/PreloadImpl.java @@ -33,7 +33,7 @@ /** * @author xpenatan */ -public class PreloaderImpl implements Preloader { +public class PreloadImpl implements Preloader.Preload { public int assetTotal = -1; private static final String ASSET_FOLDER = "assets/"; @@ -43,7 +43,7 @@ public class PreloaderImpl implements Preloader { private HashSet assetInQueue; - public PreloaderImpl(String newBaseURL, HTMLCanvasElementWrapper canvas, TeaApplication teaApplication) { + public PreloadImpl(String newBaseURL, HTMLCanvasElementWrapper canvas, TeaApplication teaApplication) { baseUrl = newBaseURL; assetInQueue = new HashSet<>(); setupFileDrop(canvas, teaApplication); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java index dbd825a2..4613aa80 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java @@ -6,25 +6,40 @@ /** * @author xpenatan */ -public interface Preloader { +public class Preloader { - String getAssetUrl(); + private static Preload instance; - String getScriptUrl(); + private Preloader() { + } - boolean isAssetInQueue(String path); + public static Preload getInstance() { + return Preloader.instance; + } - boolean isAssetLoaded(FileType fileType, String path); + public static void setInstance(Preload instance) { + Preloader.instance = instance; + } - /** - * Load asset and add to FileHandle system - */ - void loadAsset(boolean async, String path, AssetType assetType, FileType fileType, AssetLoaderListener listener); + public interface Preload { + String getAssetUrl(); - /** - * Load script and attach to html document - */ - void loadScript(boolean async, String path, AssetLoaderListener listener); + String getScriptUrl(); - int getQueue(); + boolean isAssetInQueue(String path); + + boolean isAssetLoaded(FileType fileType, String path); + + /** + * Load asset and add to FileHandle system + */ + void loadAsset(boolean async, String path, AssetType assetType, FileType fileType, AssetLoaderListener listener); + + /** + * Load script and attach to html document + */ + void loadScript(boolean async, String path, AssetLoaderListener listener); + + int getQueue(); + } } \ No newline at end of file diff --git a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java b/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java index 4b003b2c..0e9dd363 100644 --- a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java +++ b/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java @@ -846,8 +846,7 @@ private static int encode(char a, char b, char c, char d) { public static LibraryEmu initFreeType() { if(!freeTypeInit) { - TeaApplication app = (TeaApplication)Gdx.app; - Preloader preloader = app.getPreloader(); + Preloader.Preload preloader = Preloader.getInstance(); preloader.loadScript(false, "freetype.js", new AssetLoaderListener<>() { @Override public void onSuccess(String url, String result) { From a7fc8187f151e16fd288fd69d32a59a7c9124659 Mon Sep 17 00:00:00 2001 From: Natan Date: Mon, 8 Jul 2024 16:08:38 -0300 Subject: [PATCH 089/114] Rename Preloader to AssetLoader --- .../gdx/assets/AssetLoadingTaskEmu.java | 21 ++++++-------- .../com/badlogic/gdx/graphics/PixmapEmu.java | 6 ++-- .../gdx/utils/SharedLibraryLoaderEmu.java | 6 ++-- .../gdx/backends/teavm/TeaApplication.java | 28 ++++++++----------- .../AssetDownloadImpl.java | 4 +-- .../AssetDownloader.java | 2 +- .../AssetFilter.java | 2 +- .../AssetLoader.java} | 18 ++++++------ .../AssetLoadmpl.java} | 6 ++-- .../{preloader => assetloader}/AssetType.java | 2 +- .../{preloader => assetloader}/Blob.java | 2 +- .../teavm/config/AssetFileHandle.java | 2 +- .../gdx/backends/teavm/config/AssetsCopy.java | 4 +-- .../teavm/config/DefaultAssetFilter.java | 2 +- .../teavm/config/TeaBuildConfiguration.java | 3 +- .../gdx/backends/teavm/config/TeaBuilder.java | 2 +- .../teavm/launcher/LoadingTestLauncher.java | 9 +++--- .../graphics/g2d/freetype/FreeTypeEmu.java | 8 ++---- 18 files changed, 59 insertions(+), 68 deletions(-) rename backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/{preloader => assetloader}/AssetDownloadImpl.java (97%) rename backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/{preloader => assetloader}/AssetDownloader.java (92%) rename backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/{preloader => assetloader}/AssetFilter.java (84%) rename backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/{preloader/Preloader.java => assetloader/AssetLoader.java} (66%) rename backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/{preloader/PreloadImpl.java => assetloader/AssetLoadmpl.java} (97%) rename backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/{preloader => assetloader}/AssetType.java (75%) rename backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/{preloader => assetloader}/Blob.java (94%) diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/assets/AssetLoadingTaskEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/assets/AssetLoadingTaskEmu.java index 675cf845..ee9b1cf3 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/assets/AssetLoadingTaskEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/assets/AssetLoadingTaskEmu.java @@ -1,8 +1,6 @@ package com.badlogic.gdx.assets; import com.badlogic.gdx.Files; -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.assets.loaders.AssetLoader; import com.badlogic.gdx.assets.loaders.AsynchronousAssetLoader; import com.badlogic.gdx.assets.loaders.SynchronousAssetLoader; import com.badlogic.gdx.files.FileHandle; @@ -13,16 +11,15 @@ import com.badlogic.gdx.utils.async.AsyncExecutor; import com.badlogic.gdx.utils.async.AsyncResult; import com.badlogic.gdx.utils.async.AsyncTask; -import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.gen.Emulate; -import com.github.xpenatan.gdx.backends.teavm.preloader.AssetType; -import com.github.xpenatan.gdx.backends.teavm.preloader.Preloader; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetType; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetLoader; @Emulate(AssetLoadingTask.class) class AssetLoadingTaskEmu implements AsyncTask { AssetManager manager; final AssetDescriptor assetDesc; - final AssetLoader loader; + final com.badlogic.gdx.assets.loaders.AssetLoader loader; final AsyncExecutor executor; final long startTime; @@ -36,7 +33,7 @@ class AssetLoadingTaskEmu implements AsyncTask { int ticks = 0; volatile boolean cancel; - public AssetLoadingTaskEmu(AssetManager manager, AssetDescriptor assetDesc, AssetLoader loader, AsyncExecutor threadPool) { + public AssetLoadingTaskEmu(AssetManager manager, AssetDescriptor assetDesc, com.badlogic.gdx.assets.loaders.AssetLoader loader, AsyncExecutor threadPool) { this.manager = manager; this.assetDesc = assetDesc; this.loader = loader; @@ -83,10 +80,10 @@ public boolean update() { ticks++; // GTW: check if we have a file that was not preloaded and is not done loading yet - Preloader.Preload preloader = Preloader.getInstance(); - if(!preloader.isAssetLoaded(Files.FileType.Internal, assetDesc.fileName)) { - preloader.loadAsset(true, assetDesc.fileName, AssetType.Binary, Files.FileType.Internal, null); - boolean assetInQueue = preloader.isAssetInQueue(assetDesc.fileName); + AssetLoader.AssetLoad assetLoader = AssetLoader.getInstance(); + if(!assetLoader.isAssetLoaded(Files.FileType.Internal, assetDesc.fileName)) { + assetLoader.loadAsset(true, assetDesc.fileName, AssetType.Binary, Files.FileType.Internal, null); + boolean assetInQueue = assetLoader.isAssetInQueue(assetDesc.fileName); // Loader.finishLoading breaks everything if(!assetInQueue && ticks > 100000) throw new GdxRuntimeException("File not prefetched, but finishLoading was probably called: " + assetDesc.fileName); @@ -154,7 +151,7 @@ public void unload() { ((AsynchronousAssetLoader)loader).unloadAsync(manager, assetDesc.fileName, resolve(loader, assetDesc), assetDesc.params); } - private FileHandle resolve(AssetLoader loader, AssetDescriptor assetDesc) { + private FileHandle resolve(com.badlogic.gdx.assets.loaders.AssetLoader loader, AssetDescriptor assetDesc) { if(assetDesc.file == null) assetDesc.file = loader.resolve(assetDesc.fileName); return assetDesc.file; } diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java index 5785a0c1..b47423c8 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java @@ -14,9 +14,9 @@ import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Uint8ArrayWrapper; import com.github.xpenatan.gdx.backends.teavm.gen.Emulate; -import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloader; -import com.github.xpenatan.gdx.backends.teavm.preloader.AssetType; -import com.github.xpenatan.gdx.backends.teavm.preloader.Blob; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetDownloader; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetType; +import com.github.xpenatan.gdx.backends.teavm.assetloader.Blob; import java.nio.ByteBuffer; @Emulate(Pixmap.class) diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/utils/SharedLibraryLoaderEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/utils/SharedLibraryLoaderEmu.java index b888865a..b98f1a9f 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/utils/SharedLibraryLoaderEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/utils/SharedLibraryLoaderEmu.java @@ -4,15 +4,15 @@ import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.gen.Emulate; -import com.github.xpenatan.gdx.backends.teavm.preloader.Preloader; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetLoader; @Emulate(SharedLibraryLoader.class) public class SharedLibraryLoaderEmu { public void load (String libraryName) { TeaApplication app = (TeaApplication)Gdx.app; - Preloader.Preload preloader = Preloader.getInstance(); - preloader.loadScript(false, libraryName + ".js", new AssetLoaderListener<>() { + AssetLoader.AssetLoad assetLoader = AssetLoader.getInstance(); + assetLoader.loadScript(false, libraryName + ".js", new AssetLoaderListener<>() { @Override public void onSuccess(String url, String result) { } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java index e6af094f..db117c00 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java @@ -19,11 +19,11 @@ import com.github.xpenatan.gdx.backends.teavm.dom.EventListenerWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.EventWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.impl.TeaWindow; -import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloadImpl; -import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloader; -import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloader.AssetDownload; -import com.github.xpenatan.gdx.backends.teavm.preloader.Preloader; -import com.github.xpenatan.gdx.backends.teavm.preloader.PreloadImpl; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetDownloadImpl; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetDownloader; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetDownloader.AssetDownload; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetLoader; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetLoadmpl; import com.github.xpenatan.gdx.backends.teavm.utils.TeaNavigator; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -67,7 +67,7 @@ public static TeaApplication get() { private ApplicationLogger logger; private int logLevel = LOG_ERROR; - private PreloadImpl preloader; + private AssetLoadmpl assetLoader; private ObjectMap prefs = new ObjectMap<>(); @@ -115,8 +115,8 @@ else if(agentInfo.isLinux()) graphics = new TeaGraphics(config); - preloader = new PreloadImpl(hostPageBaseURL, graphics.canvas, this); - Preloader.setInstance(preloader); + assetLoader = new AssetLoadmpl(hostPageBaseURL, graphics.canvas, this); + AssetLoader.setInstance(assetLoader); AssetLoaderListener assetListener = new AssetLoaderListener(); input = new TeaInput(this, graphics.canvas); @@ -204,7 +204,7 @@ public void handleEvent(EventWrapper evt) { }); } - preloader.preload(config, "assets.txt"); + assetLoader.preload(config, "assets.txt"); window.requestAnimationFrame(this); } @@ -232,7 +232,7 @@ public void run() { } else { // update progress bar once we know the total number of assets that are loaded - int total = preloader.assetTotal; + int total = assetLoader.assetTotal; if (total > 0) { // we have the actual total and can update the progress bar int minPercentage = 25; @@ -310,10 +310,6 @@ public void setApplicationListener(ApplicationListener applicationListener) { this.queueAppListener = applicationListener; } - public Preloader.Preload getPreloader() { - return preloader; - } - public TeaApplicationConfiguration getConfig() { return config; } @@ -479,7 +475,7 @@ public enum AppState { // ##################### NATIVE CALLS ##################### private void initGdx() { - preloader.loadScript(true, "gdx.wasm.js", new AssetLoaderListener<>() { + assetLoader.loadScript(true, "gdx.wasm.js", new AssetLoaderListener<>() { @Override public void onSuccess(String url, String result) { } @@ -487,7 +483,7 @@ public void onSuccess(String url, String result) { } private void initSound() { - preloader.loadScript(true, "howler.js", new AssetLoaderListener<>() { + assetLoader.loadScript(true, "howler.js", new AssetLoaderListener<>() { @Override public void onSuccess(String url, String result) { } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloadImpl.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloadImpl.java similarity index 97% rename from backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloadImpl.java rename to backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloadImpl.java index f01c7692..1a4a07e0 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloadImpl.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloadImpl.java @@ -1,4 +1,4 @@ -package com.github.xpenatan.gdx.backends.teavm.preloader; +package com.github.xpenatan.gdx.backends.teavm.assetloader; import com.badlogic.gdx.utils.GdxRuntimeException; import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; @@ -7,7 +7,7 @@ import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; -import com.github.xpenatan.gdx.backends.teavm.preloader.AssetDownloader.AssetDownload; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetDownloader.AssetDownload; import org.teavm.jso.ajax.XMLHttpRequest; import org.teavm.jso.browser.Window; import org.teavm.jso.dom.html.HTMLDocument; diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloader.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloader.java similarity index 92% rename from backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloader.java rename to backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloader.java index 4baa6f66..11787201 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetDownloader.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloader.java @@ -1,4 +1,4 @@ -package com.github.xpenatan.gdx.backends.teavm.preloader; +package com.github.xpenatan.gdx.backends.teavm.assetloader; import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetFilter.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetFilter.java similarity index 84% rename from backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetFilter.java rename to backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetFilter.java index 36d2d576..20b9fc66 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetFilter.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetFilter.java @@ -1,4 +1,4 @@ -package com.github.xpenatan.gdx.backends.teavm.preloader; +package com.github.xpenatan.gdx.backends.teavm.assetloader; /** * @author xpenatan diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetLoader.java similarity index 66% rename from backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java rename to backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetLoader.java index 4613aa80..a5a203d3 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Preloader.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetLoader.java @@ -1,4 +1,4 @@ -package com.github.xpenatan.gdx.backends.teavm.preloader; +package com.github.xpenatan.gdx.backends.teavm.assetloader; import com.badlogic.gdx.Files.FileType; import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; @@ -6,22 +6,22 @@ /** * @author xpenatan */ -public class Preloader { +public class AssetLoader { - private static Preload instance; + private static AssetLoad instance; - private Preloader() { + private AssetLoader() { } - public static Preload getInstance() { - return Preloader.instance; + public static AssetLoad getInstance() { + return AssetLoader.instance; } - public static void setInstance(Preload instance) { - Preloader.instance = instance; + public static void setInstance(AssetLoad instance) { + AssetLoader.instance = instance; } - public interface Preload { + public interface AssetLoad { String getAssetUrl(); String getScriptUrl(); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/PreloadImpl.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetLoadmpl.java similarity index 97% rename from backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/PreloadImpl.java rename to backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetLoadmpl.java index 8a35fca6..cec72df8 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/PreloadImpl.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetLoadmpl.java @@ -1,4 +1,4 @@ -package com.github.xpenatan.gdx.backends.teavm.preloader; +package com.github.xpenatan.gdx.backends.teavm.assetloader; import com.badlogic.gdx.Files.FileType; import com.badlogic.gdx.Gdx; @@ -33,7 +33,7 @@ /** * @author xpenatan */ -public class PreloadImpl implements Preloader.Preload { +public class AssetLoadmpl implements AssetLoader.AssetLoad { public int assetTotal = -1; private static final String ASSET_FOLDER = "assets/"; @@ -43,7 +43,7 @@ public class PreloadImpl implements Preloader.Preload { private HashSet assetInQueue; - public PreloadImpl(String newBaseURL, HTMLCanvasElementWrapper canvas, TeaApplication teaApplication) { + public AssetLoadmpl(String newBaseURL, HTMLCanvasElementWrapper canvas, TeaApplication teaApplication) { baseUrl = newBaseURL; assetInQueue = new HashSet<>(); setupFileDrop(canvas, teaApplication); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetType.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetType.java similarity index 75% rename from backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetType.java rename to backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetType.java index e29912cf..4928806b 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/AssetType.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetType.java @@ -1,4 +1,4 @@ -package com.github.xpenatan.gdx.backends.teavm.preloader; +package com.github.xpenatan.gdx.backends.teavm.assetloader; /** * @author xpenatan diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Blob.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/Blob.java similarity index 94% rename from backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Blob.java rename to backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/Blob.java index 71e4017e..2645b69a 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/preloader/Blob.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/Blob.java @@ -1,4 +1,4 @@ -package com.github.xpenatan.gdx.backends.teavm.preloader; +package com.github.xpenatan.gdx.backends.teavm.assetloader; import java.io.IOException; import java.io.InputStream; diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetFileHandle.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetFileHandle.java index 6412d39f..66c60d54 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetFileHandle.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetFileHandle.java @@ -2,7 +2,7 @@ import com.badlogic.gdx.Files.FileType; import com.badlogic.gdx.files.FileHandle; -import com.github.xpenatan.gdx.backends.teavm.preloader.AssetFilter; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetFilter; import java.io.File; public class AssetFileHandle extends FileHandle { diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java index dd53ca9a..57dc004b 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java @@ -3,8 +3,8 @@ import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.GdxRuntimeException; import com.github.xpenatan.gdx.backends.teavm.TeaClassLoader; -import com.github.xpenatan.gdx.backends.teavm.preloader.AssetFilter; -import com.github.xpenatan.gdx.backends.teavm.preloader.AssetType; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetFilter; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetType; import java.io.IOException; import java.io.InputStream; import java.net.URI; diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/DefaultAssetFilter.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/DefaultAssetFilter.java index fe7b210a..b09bcf12 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/DefaultAssetFilter.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/DefaultAssetFilter.java @@ -1,6 +1,6 @@ package com.github.xpenatan.gdx.backends.teavm.config; -import com.github.xpenatan.gdx.backends.teavm.preloader.AssetFilter; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetFilter; /** * @author xpenatan diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuildConfiguration.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuildConfiguration.java index ef6060b1..dc3fe1fa 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuildConfiguration.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuildConfiguration.java @@ -1,9 +1,8 @@ package com.github.xpenatan.gdx.backends.teavm.config; import com.badlogic.gdx.ApplicationListener; -import com.badlogic.gdx.files.FileHandle; import com.github.xpenatan.gdx.backends.teavm.TeaLauncher; -import com.github.xpenatan.gdx.backends.teavm.preloader.AssetFilter; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetFilter; import java.net.URL; import java.util.ArrayList; diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java index 52c1774b..627d949e 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java @@ -5,7 +5,7 @@ import com.github.xpenatan.gdx.backends.teavm.config.plugins.TeaClassTransformer; import com.github.xpenatan.gdx.backends.teavm.config.plugins.TeaReflectionSupplier; import com.github.xpenatan.gdx.backends.teavm.gen.SkipClass; -import com.github.xpenatan.gdx.backends.teavm.preloader.AssetFilter; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetFilter; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; diff --git a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/LoadingTestLauncher.java b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/LoadingTestLauncher.java index 3aabb53f..0db1a226 100644 --- a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/LoadingTestLauncher.java +++ b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/launcher/LoadingTestLauncher.java @@ -15,7 +15,7 @@ import com.badlogic.gdx.utils.viewport.Viewport; import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; -import com.github.xpenatan.gdx.backends.teavm.preloader.Preloader; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetLoader; import com.github.xpenatan.gdx.examples.tests.LoadingTest; import com.github.xpenatan.gdx.examples.utils.LoadingBar; @@ -50,7 +50,7 @@ enum STEPS { private Actor loadingBar; private TeaApplication teaApplication; - private Preloader preloader; + private AssetLoader.AssetLoad assetLoader; // Using manager just to load scene2d assets after downloading. private AssetManager manager; @@ -60,7 +60,8 @@ enum STEPS { @Override public void create() { teaApplication = TeaApplication.get(); - preloader = teaApplication.getPreloader(); + + assetLoader = AssetLoader.getInstance(); stage = new Stage(); stage.setViewport(new ScreenViewport()); @@ -83,7 +84,7 @@ public void resize(int width, int height) { public void render() { Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT); - int queue = preloader.getQueue(); + int queue = assetLoader.getQueue(); if(steps == STEPS.LOADING_GAME_ASSETS) { float progress = (assetsCount - queue) / assetsCount; diff --git a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java b/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java index 0e9dd363..8e91d98e 100644 --- a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java +++ b/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java @@ -1,6 +1,5 @@ package com.badlogic.gdx.graphics.g2d.freetype; -import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Pixmap; @@ -10,12 +9,11 @@ import com.badlogic.gdx.utils.LongMap; import com.badlogic.gdx.utils.StreamUtils; import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; -import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; import com.github.xpenatan.gdx.backends.teavm.gen.Emulate; -import com.github.xpenatan.gdx.backends.teavm.preloader.Preloader; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetLoader; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; @@ -846,8 +844,8 @@ private static int encode(char a, char b, char c, char d) { public static LibraryEmu initFreeType() { if(!freeTypeInit) { - Preloader.Preload preloader = Preloader.getInstance(); - preloader.loadScript(false, "freetype.js", new AssetLoaderListener<>() { + AssetLoader.AssetLoad assetLoader = AssetLoader.getInstance(); + assetLoader.loadScript(false, "freetype.js", new AssetLoaderListener<>() { @Override public void onSuccess(String url, String result) { freeTypeInit = true; From 23dd8569676076d12d0af8c47ff49b34c97762d6 Mon Sep 17 00:00:00 2001 From: Natan Date: Mon, 8 Jul 2024 16:21:35 -0300 Subject: [PATCH 090/114] move asset filter --- .../xpenatan/gdx/backends/teavm/config/AssetFileHandle.java | 1 - .../gdx/backends/teavm/{assetloader => config}/AssetFilter.java | 2 +- .../github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java | 1 - .../xpenatan/gdx/backends/teavm/config/DefaultAssetFilter.java | 2 -- .../gdx/backends/teavm/config/TeaBuildConfiguration.java | 1 - .../github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java | 1 - 6 files changed, 1 insertion(+), 7 deletions(-) rename backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/{assetloader => config}/AssetFilter.java (84%) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetFileHandle.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetFileHandle.java index 66c60d54..18653090 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetFileHandle.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetFileHandle.java @@ -2,7 +2,6 @@ import com.badlogic.gdx.Files.FileType; import com.badlogic.gdx.files.FileHandle; -import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetFilter; import java.io.File; public class AssetFileHandle extends FileHandle { diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetFilter.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetFilter.java similarity index 84% rename from backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetFilter.java rename to backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetFilter.java index 20b9fc66..3f4ed2b8 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetFilter.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetFilter.java @@ -1,4 +1,4 @@ -package com.github.xpenatan.gdx.backends.teavm.assetloader; +package com.github.xpenatan.gdx.backends.teavm.config; /** * @author xpenatan diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java index 57dc004b..93ed78ba 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/AssetsCopy.java @@ -3,7 +3,6 @@ import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.GdxRuntimeException; import com.github.xpenatan.gdx.backends.teavm.TeaClassLoader; -import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetFilter; import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetType; import java.io.IOException; import java.io.InputStream; diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/DefaultAssetFilter.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/DefaultAssetFilter.java index b09bcf12..3f586c19 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/DefaultAssetFilter.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/DefaultAssetFilter.java @@ -1,7 +1,5 @@ package com.github.xpenatan.gdx.backends.teavm.config; -import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetFilter; - /** * @author xpenatan */ diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuildConfiguration.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuildConfiguration.java index dc3fe1fa..40eb1a0d 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuildConfiguration.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuildConfiguration.java @@ -2,7 +2,6 @@ import com.badlogic.gdx.ApplicationListener; import com.github.xpenatan.gdx.backends.teavm.TeaLauncher; -import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetFilter; import java.net.URL; import java.util.ArrayList; diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java index 627d949e..1e2d7c0c 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java @@ -5,7 +5,6 @@ import com.github.xpenatan.gdx.backends.teavm.config.plugins.TeaClassTransformer; import com.github.xpenatan.gdx.backends.teavm.config.plugins.TeaReflectionSupplier; import com.github.xpenatan.gdx.backends.teavm.gen.SkipClass; -import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetFilter; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; From e385d499476be86c1f9d2e7bff483cf0c0273b1a Mon Sep 17 00:00:00 2001 From: Natan Date: Mon, 8 Jul 2024 16:25:33 -0300 Subject: [PATCH 091/114] Move asset loader to a new module --- backends/backend-teavm/build.gradle.kts | 1 + .../com/badlogic/gdx/graphics/PixmapEmu.java | 2 +- .../gdx/utils/SharedLibraryLoaderEmu.java | 2 +- .../gdx/backends/teavm/TeaApplication.java | 1 + .../teavm/assetloader/AssetDownloadImpl.java | 1 - .../teavm/assetloader/AssetLoadmpl.java | 1 - build.gradle.kts | 3 ++- extensions/asset-loader/build.gradle.kts | 20 +++++++++++++++++++ .../teavm/assetloader/AssetDownloader.java | 3 --- .../teavm/assetloader/AssetLoader.java | 1 - .../assetloader}/AssetLoaderListener.java | 2 +- .../backends/teavm/assetloader/AssetType.java | 0 .../gdx/backends/teavm/assetloader/Blob.java | 0 .../graphics/g2d/freetype/FreeTypeEmu.java | 2 +- settings.gradle.kts | 1 + 15 files changed, 29 insertions(+), 11 deletions(-) create mode 100644 extensions/asset-loader/build.gradle.kts rename {backends/backend-teavm => extensions/asset-loader}/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloader.java (91%) rename {backends/backend-teavm => extensions/asset-loader}/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetLoader.java (93%) rename {backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm => extensions/asset-loader/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader}/AssetLoaderListener.java (78%) rename {backends/backend-teavm => extensions/asset-loader}/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetType.java (100%) rename {backends/backend-teavm => extensions/asset-loader}/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/Blob.java (100%) diff --git a/backends/backend-teavm/build.gradle.kts b/backends/backend-teavm/build.gradle.kts index 66202e27..27eb03b7 100644 --- a/backends/backend-teavm/build.gradle.kts +++ b/backends/backend-teavm/build.gradle.kts @@ -18,6 +18,7 @@ compileJavaTask.mustRunAfter("clean") dependencies { implementation("org.reflections:reflections:${LibExt.reflectionVersion}") implementation("com.badlogicgames.gdx:gdx:${LibExt.gdxVersion}") + api(project(":extensions:asset-loader")) api("org.teavm:teavm-tooling:${LibExt.teaVMVersion}") api("org.teavm:teavm-core:${LibExt.teaVMVersion}") diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java index b47423c8..1be22bc3 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java @@ -6,7 +6,7 @@ import com.badlogic.gdx.utils.BufferUtils; import com.badlogic.gdx.utils.Disposable; import com.badlogic.gdx.utils.GdxRuntimeException; -import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetLoaderListener; import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/utils/SharedLibraryLoaderEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/utils/SharedLibraryLoaderEmu.java index b98f1a9f..915d5f94 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/utils/SharedLibraryLoaderEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/utils/SharedLibraryLoaderEmu.java @@ -1,7 +1,7 @@ package com.badlogic.gdx.utils; import com.badlogic.gdx.Gdx; -import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetLoaderListener; import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.gen.Emulate; import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetLoader; diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java index db117c00..2477835e 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java @@ -16,6 +16,7 @@ import com.badlogic.gdx.utils.ObjectMap; import com.github.xpenatan.gdx.backends.teavm.agent.TeaAgentInfo; import com.github.xpenatan.gdx.backends.teavm.agent.TeaWebAgent; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetLoaderListener; import com.github.xpenatan.gdx.backends.teavm.dom.EventListenerWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.EventWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.impl.TeaWindow; diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloadImpl.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloadImpl.java index 1a4a07e0..ce8b083b 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloadImpl.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloadImpl.java @@ -1,7 +1,6 @@ package com.github.xpenatan.gdx.backends.teavm.assetloader; import com.badlogic.gdx.utils.GdxRuntimeException; -import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; import com.github.xpenatan.gdx.backends.teavm.dom.LocationWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.impl.TeaWindow; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferWrapper; diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetLoadmpl.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetLoadmpl.java index cec72df8..fb8a3bbc 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetLoadmpl.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetLoadmpl.java @@ -6,7 +6,6 @@ import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.GdxRuntimeException; import com.badlogic.gdx.utils.StreamUtils; -import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; import com.github.xpenatan.gdx.backends.teavm.TeaFileHandle; diff --git a/build.gradle.kts b/build.gradle.kts index 3190f447..b615c6ed 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -33,7 +33,8 @@ subprojects { var libProjects = mutableSetOf( project(":backends:backend-teavm"), - project(":extensions:gdx-freetype-teavm") + project(":extensions:gdx-freetype-teavm"), + project(":extensions:asset-loader") ) configure(libProjects) { diff --git a/extensions/asset-loader/build.gradle.kts b/extensions/asset-loader/build.gradle.kts new file mode 100644 index 00000000..3695739c --- /dev/null +++ b/extensions/asset-loader/build.gradle.kts @@ -0,0 +1,20 @@ +val moduleName = "asset-loader" + +dependencies { + implementation("com.badlogicgames.gdx:gdx:${LibExt.gdxVersion}") + + implementation("org.teavm:teavm-core:${LibExt.teaVMVersion}") + implementation("org.teavm:teavm-classlib:${LibExt.teaVMVersion}") + implementation("org.teavm:teavm-jso:${LibExt.teaVMVersion}") + implementation("org.teavm:teavm-jso-apis:${LibExt.teaVMVersion}") + implementation("org.teavm:teavm-jso-impl:${LibExt.teaVMVersion}") +} + +publishing { + publications { + create("maven") { + artifactId = moduleName + from(components["java"]) + } + } +} \ No newline at end of file diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloader.java b/extensions/asset-loader/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloader.java similarity index 91% rename from backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloader.java rename to extensions/asset-loader/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloader.java index 11787201..58f05f24 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloader.java +++ b/extensions/asset-loader/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloader.java @@ -1,7 +1,5 @@ package com.github.xpenatan.gdx.backends.teavm.assetloader; -import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; - /** * @author xpenatan */ @@ -20,7 +18,6 @@ public static void setInstance(AssetDownload instance) { } public interface AssetDownload { - void load(boolean async, final String url, AssetType type, AssetLoaderListener listener); void loadScript(boolean async, final String url, final AssetLoaderListener listener); diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetLoader.java b/extensions/asset-loader/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetLoader.java similarity index 93% rename from backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetLoader.java rename to extensions/asset-loader/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetLoader.java index a5a203d3..edfd987a 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetLoader.java +++ b/extensions/asset-loader/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetLoader.java @@ -1,7 +1,6 @@ package com.github.xpenatan.gdx.backends.teavm.assetloader; import com.badlogic.gdx.Files.FileType; -import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; /** * @author xpenatan diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/AssetLoaderListener.java b/extensions/asset-loader/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetLoaderListener.java similarity index 78% rename from backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/AssetLoaderListener.java rename to extensions/asset-loader/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetLoaderListener.java index 0cfda2d5..02eb22a8 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/AssetLoaderListener.java +++ b/extensions/asset-loader/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetLoaderListener.java @@ -1,4 +1,4 @@ -package com.github.xpenatan.gdx.backends.teavm; +package com.github.xpenatan.gdx.backends.teavm.assetloader; /** * @author xpenatan diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetType.java b/extensions/asset-loader/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetType.java similarity index 100% rename from backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetType.java rename to extensions/asset-loader/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetType.java diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/Blob.java b/extensions/asset-loader/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/Blob.java similarity index 100% rename from backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/Blob.java rename to extensions/asset-loader/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/Blob.java diff --git a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java b/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java index 8e91d98e..5dd3f533 100644 --- a/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java +++ b/extensions/gdx-freetype-teavm/src/main/java/com/badlogic/gdx/graphics/g2d/freetype/FreeTypeEmu.java @@ -8,7 +8,7 @@ import com.badlogic.gdx.utils.GdxRuntimeException; import com.badlogic.gdx.utils.LongMap; import com.badlogic.gdx.utils.StreamUtils; -import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetLoaderListener; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferViewWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; diff --git a/settings.gradle.kts b/settings.gradle.kts index 8797bcbc..62e83173 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,6 +2,7 @@ import java.util.* include(":backends:backend-teavm") +include(":extensions:asset-loader") include(":extensions:gdx-freetype-teavm") //include(":tools:generator:core") From 000df65f82ff29ef2e3624f80e51909bcc23c634 Mon Sep 17 00:00:00 2001 From: Natan Date: Mon, 8 Jul 2024 16:28:00 -0300 Subject: [PATCH 092/114] Remove unused dependencies --- extensions/asset-loader/build.gradle.kts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/extensions/asset-loader/build.gradle.kts b/extensions/asset-loader/build.gradle.kts index 3695739c..dec3354f 100644 --- a/extensions/asset-loader/build.gradle.kts +++ b/extensions/asset-loader/build.gradle.kts @@ -2,12 +2,7 @@ val moduleName = "asset-loader" dependencies { implementation("com.badlogicgames.gdx:gdx:${LibExt.gdxVersion}") - - implementation("org.teavm:teavm-core:${LibExt.teaVMVersion}") implementation("org.teavm:teavm-classlib:${LibExt.teaVMVersion}") - implementation("org.teavm:teavm-jso:${LibExt.teaVMVersion}") - implementation("org.teavm:teavm-jso-apis:${LibExt.teaVMVersion}") - implementation("org.teavm:teavm-jso-impl:${LibExt.teaVMVersion}") } publishing { From 4debbe429e9ea598922764fc4f265a9189e52420 Mon Sep 17 00:00:00 2001 From: Natan Date: Mon, 8 Jul 2024 16:50:59 -0300 Subject: [PATCH 093/114] Download log fix --- .../teavm/assetloader/AssetDownloadImpl.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloadImpl.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloadImpl.java index ce8b083b..ee2abb4e 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloadImpl.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloadImpl.java @@ -51,7 +51,7 @@ public void addQueue() { public void load(boolean async, String url, AssetType type, AssetLoaderListener listener) { switch(type) { case Binary: - loadBinary(async, url, (AssetLoaderListener)listener); + loadBinary(async, url, (AssetLoaderListener)listener, true); break; case Directory: listener.onSuccess(url, null); @@ -63,8 +63,9 @@ public void load(boolean async, String url, AssetType type, AssetLoaderListener< @Override public void loadScript(boolean async, String url, AssetLoaderListener listener) { - if(showLogs) + if(showLogs) { System.out.println("Loading script : " + url); + } loadBinary(async, url, new AssetLoaderListener<>() { @Override @@ -77,6 +78,10 @@ public void onSuccess(String url, Blob result) { HTMLScriptElement scriptElement = (HTMLScriptElement)document.createElement("script"); scriptElement.setText(script); document.getBody().appendChild(scriptElement); + + if(showLogs) { + System.out.println("Script loaded: " + url); + } listener.onSuccess(url, script); } @@ -84,12 +89,13 @@ public void onSuccess(String url, Blob result) { public void onFailure(String url) { listener.onFailure(url); } - }); + }, false); } - public void loadBinary(boolean async, final String url, final AssetLoaderListener listener) { - if(showLogs) - System.out.println("Loading asset : " + url); + private void loadBinary(boolean async, final String url, final AssetLoaderListener listener, boolean showLogs) { + if(showLogs) { + System.out.println("Loading asset: " + url); + } // don't load on main thread addQueue(); @@ -111,15 +117,16 @@ else if(status != 200) { catch (Throwable e) { // ignored } - loadBinary(async, url, listener); + loadBinary(async, url, listener, showLogs); } else { listener.onFailure(url); } } else { - if(showLogs) + if(showLogs) { System.out.println("Asset loaded: " + url); + } ArrayBufferWrapper response = (ArrayBufferWrapper)request.getResponse(); Int8Array data = (Int8Array)TypedArrays.createInt8Array(response); From 6c0ff04fc4ab0b610832bc090dcc5dc5979e5935 Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 9 Jul 2024 08:51:14 -0300 Subject: [PATCH 094/114] add retry attempt --- .github/workflows/build_and_upload.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_and_upload.yml b/.github/workflows/build_and_upload.yml index e7203e4e..0957d4f8 100644 --- a/.github/workflows/build_and_upload.yml +++ b/.github/workflows/build_and_upload.yml @@ -44,8 +44,12 @@ jobs: run: ./gradlew build - name: Upload to repository - if: ${{ inputs.shouldUpload }} - run: ./gradlew publish + uses: nick-fields/retry@v3 + with: + max_attempts: 3 + timeout_minutes: 10 + retry_on: error + command: ./gradlew publish env: USER: ${{ secrets.USER }} PASSWORD: ${{ secrets.PASSWORD }} From 4e50cc519c374a406a82730aa37b35a5d5f5d620 Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 9 Jul 2024 08:55:25 -0300 Subject: [PATCH 095/114] Improvements --- .../gdx/assets/AssetLoadingTaskEmu.java | 24 ++++++++----- .../gdx/backends/teavm/TeaApplication.java | 5 +++ .../teavm/assetloader/AssetDownloadImpl.java | 35 ++++++++++++++----- 3 files changed, 46 insertions(+), 18 deletions(-) diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/assets/AssetLoadingTaskEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/assets/AssetLoadingTaskEmu.java index ee9b1cf3..0663e7b4 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/assets/AssetLoadingTaskEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/assets/AssetLoadingTaskEmu.java @@ -30,9 +30,10 @@ class AssetLoadingTaskEmu implements AsyncTask { volatile AsyncResult loadFuture; volatile Object asset; - int ticks = 0; volatile boolean cancel; + int count = 0; + public AssetLoadingTaskEmu(AssetManager manager, AssetDescriptor assetDesc, com.badlogic.gdx.assets.loaders.AssetLoader loader, AsyncExecutor threadPool) { this.manager = manager; this.assetDesc = assetDesc; @@ -77,16 +78,21 @@ public Void call() throws Exception { * @throws GdxRuntimeException */ public boolean update() { - ticks++; - // GTW: check if we have a file that was not preloaded and is not done loading yet AssetLoader.AssetLoad assetLoader = AssetLoader.getInstance(); - if(!assetLoader.isAssetLoaded(Files.FileType.Internal, assetDesc.fileName)) { - assetLoader.loadAsset(true, assetDesc.fileName, AssetType.Binary, Files.FileType.Internal, null); - boolean assetInQueue = assetLoader.isAssetInQueue(assetDesc.fileName); - // Loader.finishLoading breaks everything - if(!assetInQueue && ticks > 100000) - throw new GdxRuntimeException("File not prefetched, but finishLoading was probably called: " + assetDesc.fileName); + + String path = resolve(loader, assetDesc).path(); + + if(!assetLoader.isAssetLoaded(Files.FileType.Internal, path)) { + if(!assetLoader.isAssetInQueue(path)) { + count++; + if(count == 2) { + cancel = true; + } + else { + assetLoader.loadAsset(true, path, AssetType.Binary, Files.FileType.Internal, null); + } + } } else { if(loader instanceof SynchronousAssetLoader) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java index 2477835e..40306898 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/TeaApplication.java @@ -28,6 +28,7 @@ import com.github.xpenatan.gdx.backends.teavm.utils.TeaNavigator; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.teavm.jso.JSBody; import org.teavm.jso.browser.Storage; import org.teavm.jso.browser.Window; import org.teavm.jso.dom.html.HTMLElement; @@ -473,6 +474,10 @@ public enum AppState { APP_LOOP } + // Testing code only + @JSBody(params = "text", script = "console.log(text);" ) + public static native void print(String text); + // ##################### NATIVE CALLS ##################### private void initGdx() { diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloadImpl.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloadImpl.java index ee2abb4e..b46554e0 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloadImpl.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloadImpl.java @@ -1,12 +1,12 @@ package com.github.xpenatan.gdx.backends.teavm.assetloader; import com.badlogic.gdx.utils.GdxRuntimeException; +import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetDownloader.AssetDownload; import com.github.xpenatan.gdx.backends.teavm.dom.LocationWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.impl.TeaWindow; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.ArrayBufferWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.Int8ArrayWrapper; import com.github.xpenatan.gdx.backends.teavm.dom.typedarray.TypedArrays; -import com.github.xpenatan.gdx.backends.teavm.assetloader.AssetDownloader.AssetDownload; import org.teavm.jso.ajax.XMLHttpRequest; import org.teavm.jso.browser.Window; import org.teavm.jso.dom.html.HTMLDocument; @@ -16,6 +16,8 @@ public class AssetDownloadImpl implements AssetDownload { + private static final int MAX_DOWNLOAD_ATTEMPT = 3; + private int queue; private final boolean showLogs; private boolean showDownloadProgress; @@ -51,7 +53,7 @@ public void addQueue() { public void load(boolean async, String url, AssetType type, AssetLoaderListener listener) { switch(type) { case Binary: - loadBinary(async, url, (AssetLoaderListener)listener, true); + loadBinary(async, url, (AssetLoaderListener)listener, 0, true); break; case Directory: listener.onSuccess(url, null); @@ -89,13 +91,19 @@ public void onSuccess(String url, Blob result) { public void onFailure(String url) { listener.onFailure(url); } - }, false); + }, 0, false); } - private void loadBinary(boolean async, final String url, final AssetLoaderListener listener, boolean showLogs) { + private void loadBinary(boolean async, final String url, final AssetLoaderListener listener, int count, boolean showLogs) { if(showLogs) { System.out.println("Loading asset: " + url); } + if(count == MAX_DOWNLOAD_ATTEMPT) { + if(listener != null) { + listener.onFailure(url); + } + return; + } // don't load on main thread addQueue(); @@ -106,7 +114,9 @@ public void run() { if(request.getReadyState() == XMLHttpRequest.DONE) { int status = request.getStatus(); if(status == 0) { - listener.onFailure(url); + if(listener != null) { + listener.onFailure(url); + } } else if(status != 200) { if ((status != 404) && (status != 403)) { @@ -117,10 +127,13 @@ else if(status != 200) { catch (Throwable e) { // ignored } - loadBinary(async, url, listener, showLogs); + int newCount = count + 1; + loadBinary(async, url, listener, newCount, showLogs); } else { - listener.onFailure(url); + if(listener != null) { + listener.onFailure(url); + } } } else { @@ -130,7 +143,9 @@ else if(status != 200) { ArrayBufferWrapper response = (ArrayBufferWrapper)request.getResponse(); Int8Array data = (Int8Array)TypedArrays.createInt8Array(response); - listener.onSuccess(url, new Blob((ArrayBuffer)response, data)); + if(listener != null) { + listener.onSuccess(url, new Blob((ArrayBuffer)response, data)); + } } subtractQueue(); } @@ -154,7 +169,9 @@ private void setOnProgress(XMLHttpRequest req, String url, final AssetLoaderList if(showDownloadProgress) { System.out.println("Total: " + total + " loaded: " + loaded + " URL: " + url); } - listener.onProgress(loaded); + if(listener != null) { + listener.onProgress(loaded); + } }); } } \ No newline at end of file From f3cbc472096ad519731c63e2d4c3cc859a647fcb Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 9 Jul 2024 11:51:59 -0300 Subject: [PATCH 096/114] update workflow --- .github/workflows/build_and_upload.yml | 30 +++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build_and_upload.yml b/.github/workflows/build_and_upload.yml index 0957d4f8..44a444f4 100644 --- a/.github/workflows/build_and_upload.yml +++ b/.github/workflows/build_and_upload.yml @@ -43,8 +43,17 @@ jobs: - name: Build run: ./gradlew build + - name: Get version + uses: madhead/read-java-properties@latest + id: version + with: + file: "./gradle.properties" + property: version + default: 0.0.1 + - name: Upload to repository uses: nick-fields/retry@v3 + if: ${{ success() && inputs.shouldUpload == 'true' }} with: max_attempts: 3 timeout_minutes: 10 @@ -54,4 +63,23 @@ jobs: USER: ${{ secrets.USER }} PASSWORD: ${{ secrets.PASSWORD }} SIGNING_KEY: ${{ secrets.PGP_SECRET }} - SIGNING_PASSWORD: ${{ secrets.PGP_PASSPHRASE }} \ No newline at end of file + SIGNING_PASSWORD: ${{ secrets.PGP_PASSPHRASE }} + + - name: Create Git tag + uses: actions/github-script@v7 + if: ${{ success() && inputs.isRelease == 'true' }} + with: + script: | + const versionOutputs = ${{ toJSON(steps.version.outputs) }}; + + var version = versionOutputs.value; + + console.log("Version: " + version); + + var ref = "refs/tags/" + version + github.rest.git.createRef({ + owner: context.repo.owner, + repo: context.repo.repo, + ref: ref, + sha: context.sha + }); \ No newline at end of file From a00a156f8906f97ff0dd173e85c18b30dcea0560 Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 9 Jul 2024 11:52:44 -0300 Subject: [PATCH 097/114] Check if object is null --- .../gdx/backends/teavm/assetloader/AssetDownloadImpl.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloadImpl.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloadImpl.java index b46554e0..e3ab4490 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloadImpl.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/assetloader/AssetDownloadImpl.java @@ -84,12 +84,16 @@ public void onSuccess(String url, Blob result) { if(showLogs) { System.out.println("Script loaded: " + url); } - listener.onSuccess(url, script); + if(listener != null) { + listener.onSuccess(url, script); + } } @Override public void onFailure(String url) { - listener.onFailure(url); + if(listener != null) { + listener.onFailure(url); + } } }, 0, false); } From 9823a10320bcaccf0a0f3bb8192cd01eb6b3cbba Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 9 Jul 2024 11:52:58 -0300 Subject: [PATCH 098/114] Add internal test to gdx tests --- examples/gdx-tests/core/build.gradle.kts | 3 + .../com/badlogic/gdx/tests/TeaVMGdxTests.java | 74 +++++++++++++++++-- 2 files changed, 70 insertions(+), 7 deletions(-) diff --git a/examples/gdx-tests/core/build.gradle.kts b/examples/gdx-tests/core/build.gradle.kts index fa56f816..49cee03b 100644 --- a/examples/gdx-tests/core/build.gradle.kts +++ b/examples/gdx-tests/core/build.gradle.kts @@ -3,6 +3,9 @@ plugins { } dependencies { + implementation(project(":examples:core:core")) + implementation(project(":examples:freetype:core")) + // Required implementation("com.badlogicgames.gdx:gdx-platform:${LibExt.gdxVersion}:natives-desktop") implementation("com.badlogicgames.gdx:gdx-backend-lwjgl3:${LibExt.gdxVersion}") diff --git a/examples/gdx-tests/core/src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java b/examples/gdx-tests/core/src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java index 9ff85778..012ff003 100644 --- a/examples/gdx-tests/core/src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java +++ b/examples/gdx-tests/core/src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java @@ -1,5 +1,6 @@ package com.badlogic.gdx.tests; +import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.tests.bench.TiledMapBench; import com.badlogic.gdx.tests.conformance.AudioSoundAndMusicIsolationTest; import com.badlogic.gdx.tests.conformance.DisplayModeTest; @@ -65,15 +66,26 @@ import com.badlogic.gdx.tests.superkoalio.SuperKoalio; import com.badlogic.gdx.tests.utils.GdxTest; import com.badlogic.gdx.tests.utils.IssueTest; +import com.github.xpenatan.gdx.examples.tests.GearsDemo; +import com.github.xpenatan.gdx.examples.tests.PixelTest; +import com.github.xpenatan.gdx.examples.tests.ReadPixelsTest; +import com.github.xpenatan.gdx.examples.tests.TeaVMInputTest; import java.util.ArrayList; public class TeaVMGdxTests { public static TeaVMInstancer[] getTestList() { - ArrayList tests = new ArrayList<>(); - // QUICK TEST ################################### + // TEAVM TESTS ################################### + add(tests, GearsDemo::new); + add(tests, PixelTest::new); + add(tests, ReadPixelsTest::new); + add(tests, ReflectionTest::new); + add(tests, TeaVMInputTest::new); + add(tests, FilesTest::new); + + // QUICK TESTS ################################### add(tests, PixmapBlendingTest::new); add(tests, PixmapPackerTest::new); add(tests, PixmapPackerIOTest::new); @@ -323,21 +335,69 @@ public static TeaVMInstancer[] getTestList() { } private static void add(ArrayList tests, GdxRunnable instance) { - tests.add(new TeaVMInstancer() { + add(tests, false, instance); + } + + private static void add(ArrayList tests, boolean isTeaVMTest, GdxRunnable instance) { + TeaVMInstancer teaVMInstancer = new TeaVMInstancer() { public GdxTest instance() { - return instance.run(); + return new GdxTestWrapper(instance.run()); } - }); + }; + tests.add(teaVMInstancer); } public interface GdxRunnable { - GdxTest run(); + ApplicationListener run(); } public abstract static class TeaVMInstancer implements AbstractTestWrapper.Instancer { + private String name = null; public String getSimpleName() { - return instance().getClass().getSimpleName(); + if(name == null) { + name = instance().toString(); + } + return name; + } + } + + public static class GdxTestWrapper extends GdxTest { + private ApplicationListener applicationListener; + String className; + + public GdxTestWrapper(ApplicationListener applicationListener) { + this.applicationListener = applicationListener; + className = applicationListener.getClass().getSimpleName(); + } + + public void create() { + applicationListener.create(); + } + + public void resume() { + applicationListener.resume(); + } + + public void render() { + applicationListener.render(); + } + + public void resize(int width, int height) { + applicationListener.resize(width, height); + } + + public void pause() { + applicationListener.pause(); + } + + public void dispose() { + applicationListener.dispose(); + } + + @Override + public String toString() { + return className; } } } From d5fd79354f1b62d133779ef360cff13dfea1749f Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 9 Jul 2024 12:19:33 -0300 Subject: [PATCH 099/114] update workflow --- .github/workflows/build_and_upload.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build_and_upload.yml b/.github/workflows/build_and_upload.yml index 44a444f4..8a60f3ba 100644 --- a/.github/workflows/build_and_upload.yml +++ b/.github/workflows/build_and_upload.yml @@ -26,6 +26,14 @@ jobs: - name: Checkout code uses: actions/checkout@v4 + - name: Get version + uses: madhead/read-java-properties@latest + id: version + with: + file: "./gradle.properties" + property: version + default: 0.0.1 + - name: Set up JDK 11 uses: actions/setup-java@v4 with: @@ -43,17 +51,9 @@ jobs: - name: Build run: ./gradlew build - - name: Get version - uses: madhead/read-java-properties@latest - id: version - with: - file: "./gradle.properties" - property: version - default: 0.0.1 - - name: Upload to repository uses: nick-fields/retry@v3 - if: ${{ success() && inputs.shouldUpload == 'true' }} + if: ${{ inputs.shouldUpload }} with: max_attempts: 3 timeout_minutes: 10 @@ -67,7 +67,7 @@ jobs: - name: Create Git tag uses: actions/github-script@v7 - if: ${{ success() && inputs.isRelease == 'true' }} + if: ${{ inputs.isRelease }} with: script: | const versionOutputs = ${{ toJSON(steps.version.outputs) }}; From c47966c58458eb253f9dd86168e4a6d378ff9948 Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 9 Jul 2024 13:03:12 -0300 Subject: [PATCH 100/114] Fix badge --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 51166eea..ba73c336 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ![Build](https://github.com/xpenatan/gdx-html5-tools/workflows/Build/badge.svg) -[![Sonatype Nexus (Snapshots)](https://img.shields.io/nexus/r/com.github.xpenatan.gdx-teavm/backend-teavm?nexusVersion=2&server=https%3A%2F%2Foss.sonatype.org&label=release)](https://repo.maven.apache.org/maven2/com/github/xpenatan/gdx-teavm/) -[![Sonatype Nexus (Snapshots)](https://img.shields.io/nexus/s/com.github.xpenatan.gdx-teavm/backend-teavm?server=https%3A%2F%2Foss.sonatype.org&label=snapshot)](https://oss.sonatype.org/content/repositories/snapshots/com/github/xpenatan/gdx-teavm/) +[![Sonatype Nexus (Snapshots)](https://img.shields.io/nexus/releases/com.github.xpenatan.gdx-teavm/backend-teavm?nexusVersion=2&server=https%3A%2F%2Foss.sonatype.org&label=release)](https://repo.maven.apache.org/maven2/com/github/xpenatan/gdx-teavm/) +[![Static Badge](https://img.shields.io/badge/snapshot---SNAPSHOT-red)](https://oss.sonatype.org/content/repositories/snapshots/com/github/xpenatan/gdx-teavm/) gdx-teavm is a backend solution for running [libgdx](https://github.com/libgdx/libgdx) games in a web browser. It uses [TeaVM](https://github.com/konsoletyper/teavm) behind the scene to convert Java/Kotlin bytecode to Javascript. From ce54e3d868b831176c610735488a7a213ae19dd4 Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 9 Jul 2024 13:04:47 -0300 Subject: [PATCH 101/114] Fix badge --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ba73c336..55ba07f9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -![Build](https://github.com/xpenatan/gdx-html5-tools/workflows/Build/badge.svg) +![Build](https://github.com/xpenatan/gdx-teavm/actions/workflows/release.yml/badge.svg) +![Build](https://github.com/xpenatan/gdx-teavm/actions/workflows/snapshot.yml/badge.svg) [![Sonatype Nexus (Snapshots)](https://img.shields.io/nexus/releases/com.github.xpenatan.gdx-teavm/backend-teavm?nexusVersion=2&server=https%3A%2F%2Foss.sonatype.org&label=release)](https://repo.maven.apache.org/maven2/com/github/xpenatan/gdx-teavm/) [![Static Badge](https://img.shields.io/badge/snapshot---SNAPSHOT-red)](https://oss.sonatype.org/content/repositories/snapshots/com/github/xpenatan/gdx-teavm/) From 20717cbdb2e432c84303d4c0efb46ab206c0bc83 Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 9 Jul 2024 13:11:29 -0300 Subject: [PATCH 102/114] fix readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 55ba07f9..7e9ea1f9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ +## gdx-teavm + ![Build](https://github.com/xpenatan/gdx-teavm/actions/workflows/release.yml/badge.svg) ![Build](https://github.com/xpenatan/gdx-teavm/actions/workflows/snapshot.yml/badge.svg) - [![Sonatype Nexus (Snapshots)](https://img.shields.io/nexus/releases/com.github.xpenatan.gdx-teavm/backend-teavm?nexusVersion=2&server=https%3A%2F%2Foss.sonatype.org&label=release)](https://repo.maven.apache.org/maven2/com/github/xpenatan/gdx-teavm/) [![Static Badge](https://img.shields.io/badge/snapshot---SNAPSHOT-red)](https://oss.sonatype.org/content/repositories/snapshots/com/github/xpenatan/gdx-teavm/) From b1706a530786f58e4a1d10052da5481a6bd0721c Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 9 Jul 2024 13:43:20 -0300 Subject: [PATCH 103/114] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7e9ea1f9..03e576a1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -## gdx-teavm +# gdx-teavm ![Build](https://github.com/xpenatan/gdx-teavm/actions/workflows/release.yml/badge.svg) ![Build](https://github.com/xpenatan/gdx-teavm/actions/workflows/snapshot.yml/badge.svg) From 2c054e76255210aa78e204ef6a75c2dffb4e2b88 Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 9 Jul 2024 14:10:45 -0300 Subject: [PATCH 104/114] update example --- .../data => assets/custom}/badlogic.jpg | Bin .../assets/data => assets/custom}/cube.mtl | 0 .../assets/data => assets/custom}/cube.obj | 0 .../data => assets/custom}/g3d/ship/ship.mtl | 0 .../data => assets/custom}/g3d/ship/ship.obj | 0 .../data => assets/custom}/g3d/ship/ship.png | Bin .../data => assets/custom}/lsans-15.fnt | 0 .../data => assets/custom}/lsans-15.png | Bin .../data => assets/custom}/lsans-15_00.png | Bin .../custom}/reflection/reflectionClass.json | 0 .../gdx/examples/tests/ArtemisTest.java | 19 -- .../gdx/examples/tests/FilesTest.java | 10 +- .../gdx/examples/tests/LoadingTest.java | 4 +- .../gdx/examples/tests/ReadPixelsTest.java | 2 +- examples/core/desktop/assets/awesome.png | Bin 44826 -> 0 bytes .../core/desktop/assets/data/arial-15.fnt | 237 ------------------ .../core/desktop/assets/data/arial-15_00.png | Bin 13326 -> 0 bytes .../core/desktop/assets/data/arial-italic.ttf | Bin 553284 -> 0 bytes examples/core/desktop/assets/data/arial.ttf | Bin 778552 -> 0 bytes .../desktop/assets/data/badlogicsmall.jpg | Bin 1787 -> 0 bytes examples/core/desktop/assets/data/default.fnt | 101 -------- examples/core/desktop/assets/data/default.png | Bin 26179 -> 0 bytes .../core/desktop/assets/data/jsonTest.json | 5 - .../desktop/assets/data/loading/loading.pack | 89 ------- .../desktop/assets/data/loading/loading.png | Bin 59042 -> 0 bytes examples/core/desktop/assets/data/pack.atlas | 40 --- examples/core/desktop/assets/data/pack1.png | Bin 32898 -> 0 bytes .../assets/data/premultiplied_alpha_test.png | Bin 1609 -> 0 bytes examples/core/desktop/assets/data/shotgun.ogg | Bin 9437 -> 0 bytes .../core/desktop/assets/data/uiskin.atlas | 200 --------------- examples/core/desktop/assets/data/uiskin.json | 186 -------------- examples/core/desktop/assets/data/uiskin.png | Bin 28299 -> 0 bytes .../core/desktop/assets/data/walkanim.png | Bin 2387 -> 0 bytes examples/core/desktop/build.gradle.kts | 2 +- .../xpenatan/gdx/examples/desktop/Main.java | 12 +- .../examples/teavm/BuildTeaVMTestDemo.java | 4 +- .../teavm/launcher/TeaVMTestLauncher.java | 23 +- examples/gdx-tests/desktop/build.gradle.kts | 2 + 38 files changed, 26 insertions(+), 910 deletions(-) rename examples/core/{desktop/assets/data => assets/custom}/badlogic.jpg (100%) rename examples/core/{desktop/assets/data => assets/custom}/cube.mtl (100%) rename examples/core/{desktop/assets/data => assets/custom}/cube.obj (100%) rename examples/core/{desktop/assets/data => assets/custom}/g3d/ship/ship.mtl (100%) rename examples/core/{desktop/assets/data => assets/custom}/g3d/ship/ship.obj (100%) rename examples/core/{desktop/assets/data => assets/custom}/g3d/ship/ship.png (100%) rename examples/core/{desktop/assets/data => assets/custom}/lsans-15.fnt (100%) rename examples/core/{desktop/assets/data => assets/custom}/lsans-15.png (100%) rename examples/core/{desktop/assets/data => assets/custom}/lsans-15_00.png (100%) rename examples/core/{desktop/assets => assets/custom}/reflection/reflectionClass.json (100%) delete mode 100644 examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/ArtemisTest.java delete mode 100644 examples/core/desktop/assets/awesome.png delete mode 100644 examples/core/desktop/assets/data/arial-15.fnt delete mode 100644 examples/core/desktop/assets/data/arial-15_00.png delete mode 100644 examples/core/desktop/assets/data/arial-italic.ttf delete mode 100644 examples/core/desktop/assets/data/arial.ttf delete mode 100644 examples/core/desktop/assets/data/badlogicsmall.jpg delete mode 100644 examples/core/desktop/assets/data/default.fnt delete mode 100644 examples/core/desktop/assets/data/default.png delete mode 100644 examples/core/desktop/assets/data/jsonTest.json delete mode 100644 examples/core/desktop/assets/data/loading/loading.pack delete mode 100644 examples/core/desktop/assets/data/loading/loading.png delete mode 100644 examples/core/desktop/assets/data/pack.atlas delete mode 100644 examples/core/desktop/assets/data/pack1.png delete mode 100644 examples/core/desktop/assets/data/premultiplied_alpha_test.png delete mode 100644 examples/core/desktop/assets/data/shotgun.ogg delete mode 100644 examples/core/desktop/assets/data/uiskin.atlas delete mode 100644 examples/core/desktop/assets/data/uiskin.json delete mode 100644 examples/core/desktop/assets/data/uiskin.png delete mode 100644 examples/core/desktop/assets/data/walkanim.png diff --git a/examples/core/desktop/assets/data/badlogic.jpg b/examples/core/assets/custom/badlogic.jpg similarity index 100% rename from examples/core/desktop/assets/data/badlogic.jpg rename to examples/core/assets/custom/badlogic.jpg diff --git a/examples/core/desktop/assets/data/cube.mtl b/examples/core/assets/custom/cube.mtl similarity index 100% rename from examples/core/desktop/assets/data/cube.mtl rename to examples/core/assets/custom/cube.mtl diff --git a/examples/core/desktop/assets/data/cube.obj b/examples/core/assets/custom/cube.obj similarity index 100% rename from examples/core/desktop/assets/data/cube.obj rename to examples/core/assets/custom/cube.obj diff --git a/examples/core/desktop/assets/data/g3d/ship/ship.mtl b/examples/core/assets/custom/g3d/ship/ship.mtl similarity index 100% rename from examples/core/desktop/assets/data/g3d/ship/ship.mtl rename to examples/core/assets/custom/g3d/ship/ship.mtl diff --git a/examples/core/desktop/assets/data/g3d/ship/ship.obj b/examples/core/assets/custom/g3d/ship/ship.obj similarity index 100% rename from examples/core/desktop/assets/data/g3d/ship/ship.obj rename to examples/core/assets/custom/g3d/ship/ship.obj diff --git a/examples/core/desktop/assets/data/g3d/ship/ship.png b/examples/core/assets/custom/g3d/ship/ship.png similarity index 100% rename from examples/core/desktop/assets/data/g3d/ship/ship.png rename to examples/core/assets/custom/g3d/ship/ship.png diff --git a/examples/core/desktop/assets/data/lsans-15.fnt b/examples/core/assets/custom/lsans-15.fnt similarity index 100% rename from examples/core/desktop/assets/data/lsans-15.fnt rename to examples/core/assets/custom/lsans-15.fnt diff --git a/examples/core/desktop/assets/data/lsans-15.png b/examples/core/assets/custom/lsans-15.png similarity index 100% rename from examples/core/desktop/assets/data/lsans-15.png rename to examples/core/assets/custom/lsans-15.png diff --git a/examples/core/desktop/assets/data/lsans-15_00.png b/examples/core/assets/custom/lsans-15_00.png similarity index 100% rename from examples/core/desktop/assets/data/lsans-15_00.png rename to examples/core/assets/custom/lsans-15_00.png diff --git a/examples/core/desktop/assets/reflection/reflectionClass.json b/examples/core/assets/custom/reflection/reflectionClass.json similarity index 100% rename from examples/core/desktop/assets/reflection/reflectionClass.json rename to examples/core/assets/custom/reflection/reflectionClass.json diff --git a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/ArtemisTest.java b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/ArtemisTest.java deleted file mode 100644 index cf04e0b6..00000000 --- a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/ArtemisTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.xpenatan.gdx.examples.tests; - -import com.artemis.World; -import com.badlogic.gdx.ApplicationAdapter; -import com.badlogic.gdx.assets.AssetManager; -import com.badlogic.gdx.scenes.scene2d.ui.Skin; - -public class ArtemisTest extends ApplicationAdapter { - - private AssetManager mAssetManager; - private World mEngine; - - @Override - public void create() { - mAssetManager = new AssetManager(); - mAssetManager.load("skin/skin.json", Skin.class); - mAssetManager.finishLoading(); - } -} \ No newline at end of file diff --git a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java index 3e36ca1f..5714ec52 100644 --- a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java +++ b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/FilesTest.java @@ -30,7 +30,7 @@ public class FilesTest implements ApplicationListener { @Override public void create() { Gdx.app.setLogLevel(Application.LOG_DEBUG); - font = new BitmapFont(Gdx.files.internal("data/lsans-15.fnt"), false); + font = new BitmapFont(Gdx.files.internal("custom/lsans-15.fnt"), false); batch = new SpriteBatch(); if(Gdx.files.isExternalStorageAvailable()) { @@ -38,11 +38,11 @@ public void create() { message += "External storage path: " + Gdx.files.getExternalStoragePath() + "\n"; try { - InputStream in = Gdx.files.internal("data/cube.obj").read(); + InputStream in = Gdx.files.internal("custom/cube.obj").read(); StreamUtils.closeQuietly(in); message += "Open internal success\n"; } catch(Throwable e) { - message += "Couldn't open internal data/cube.obj\n" + e.getMessage() + "\n"; + message += "Couldn't open internal custom/cube.obj\n" + e.getMessage() + "\n"; } BufferedWriter out = null; @@ -272,7 +272,7 @@ private void testClasspath() throws IOException { } private void testInternal() throws IOException { - FileHandle handle = Gdx.files.internal("data/badlogic.jpg"); + FileHandle handle = Gdx.files.internal("custom/badlogic.jpg"); if(!handle.exists()) fail("Couldn't find internal file"); if(handle.isDirectory()) fail("Internal file shouldn't be a directory"); try { @@ -291,7 +291,7 @@ private void testInternal() throws IOException { fail(); } catch(Exception ignored) { } - FileHandle dir = Gdx.files.internal("data"); + FileHandle dir = Gdx.files.internal("custom"); if(Gdx.app.getType() != ApplicationType.Android) { if(!dir.exists()) fail(); } diff --git a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/LoadingTest.java b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/LoadingTest.java index dbbcd193..6675e262 100644 --- a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/LoadingTest.java +++ b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/LoadingTest.java @@ -62,10 +62,10 @@ public void show() { viewport = new ScreenViewport(camera); cameraControl = new CameraInputController(camera); - game.manager.load("data/g3d/ship/ship.obj", Model.class); + game.manager.load("custom/g3d/ship/ship.obj", Model.class); game.manager.finishLoading(); - shipModel = game.manager.get("data/g3d/ship/ship.obj", Model.class); + shipModel = game.manager.get("custom/g3d/ship/ship.obj", Model.class); shipModelInstance = new ModelInstance(shipModel); Gdx.input.setInputProcessor(new InputMultiplexer(cameraControl)); diff --git a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/ReadPixelsTest.java b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/ReadPixelsTest.java index c903b81b..3dd3674d 100644 --- a/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/ReadPixelsTest.java +++ b/examples/core/core/src/main/java/com/github/xpenatan/gdx/examples/tests/ReadPixelsTest.java @@ -28,7 +28,7 @@ public void create() { Gdx.input.setCatchKey(Input.Keys.F1, true); batch = new SpriteBatch(); - badlogic = new Texture(Gdx.files.internal("data/badlogic.jpg")); + badlogic = new Texture(Gdx.files.internal("custom/badlogic.jpg")); camera = new OrthographicCamera(); camera.setToOrtho(false); } diff --git a/examples/core/desktop/assets/awesome.png b/examples/core/desktop/assets/awesome.png deleted file mode 100644 index 93f20486183a82186397582d1283ad2824e12524..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44826 zcmV)mK%T#eP)bWBB-E% zfe9!IJp9gianAf_{x6=HXYHA_K6C9_v#;yr20&mr+%F;yW&j`}GCtPcM4#s3>PEvX z06gFXBp?pdeEi~~#Un$K!T+~5p8@EfIV1JYv%vqZ2>t^9q;aEp|gMID+fJO}ZFZTT} z_6v@U06<`P|9YW+@9?kUj@$nTQUT%N0a8x#QgN|CzVWes(jk6+|Fts@hy(V(1n2`P z5CFpWkAQu00`mJk4#a{W;0xmSryr08A^Y7A{2y0*Kyv&)(`bK9nnQe4WPl{iz(7`# z78ylL@`;W0iHuK?q$R`!(0t-)DNzZrw5X&=T5L#MmI*Ps85c&N%=O^8gG-{^$OveZN#U_Vtth z(S+&&pyUD2cjrHvZv_BXj{v~_+%F+E@!uN5zupF5fCMOj1{i?bPb~ou0U1#CPci}~ zzzkRbD_{p4`)TF^+<+JG0UF>3f4tNCW900~`WbARFX>T#yeAgCn2- z6oMjf3>*i=;3PN&NRQb!l6hg3W|Z^padupN`_LQbm$P231vgMP(E}7Duj+g$Dm^9Bvb;G zLFG^dR0Y*Qbx=Lj0G)@Lpcd!?bP;NYE8}tL(fPO*S&|hd51~3dGVGN9e z2`~w!z*LwSW`)^dPM8PggZW`WSQr+A#bHTU8kU0e~hfy3YkI2w+H6W}B`1x|+#!P#&wd>Af(i{Rt%Nw@?) z4OhU`a4lR9H^7Z>GkgKQ2w#Fb;VW=2+z$`HH{oG;1RjO&!Q=1*{0N?gpTe{73-}eh z2)~7w;T8A;{0aU7e}^~VEqEK=f%gzF0)@aL@CXuu0l|b|L9ipZ5WEN)LJ%Q>pd%y^ z(g-<(B0>eBj?hBrAoLMN2vdXw!WvbOVgJ?iBB3ck_hz>+2;tHYgMlK;& zkROoi$nVGv$_?d(@XS6%o8|{YE=HH2E6_FQ zdUPYY72S^RLieJtp$E|;=rQyI^ds~W^c;E~{RaIG{Q

{*K;4|G@wZ5`)8#FjNdH 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

n8x*<8i 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 WU>-%i{`M+tMunPP`2PZ!|DP-X diff --git a/examples/core/desktop/assets/data/arial-italic.ttf b/examples/core/desktop/assets/data/arial-italic.ttf deleted file mode 100644 index eac8b3545474b75cbbf4e6d6eb9a63836b5646c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 553284 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

se_klf=&e^NsbkrFp7BE94fd_0%Uq- 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 z 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 z%0A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 diff --git a/examples/core/desktop/assets/data/arial.ttf b/examples/core/desktop/assets/data/arial.ttf deleted file mode 100644 index abc899cd55086105f439df7a6d01db84168aebb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 778552 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�~L; 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 z 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

%_(Aj7q33!xs4IE+IDaLfo1Ni*OlT3|2Q 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≻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

^0r7XT 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 =6j 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

okG(z1$EL-Iw)0HFW9 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

5T4(J7RUssJ3lH8XDc6u&1)6 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 diff --git a/examples/core/desktop/assets/data/badlogicsmall.jpg b/examples/core/desktop/assets/data/badlogicsmall.jpg deleted file mode 100644 index 148b30bc025eb54f5617cc12a0867439b7f952bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1787 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 Qr5n-JzN%HEY4`Ad0R7Ir&;S4c diff --git a/examples/core/desktop/assets/data/jsonTest.json b/examples/core/desktop/assets/data/jsonTest.json deleted file mode 100644 index f6e32a3e..00000000 --- a/examples/core/desktop/assets/data/jsonTest.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "id": 22, - "first_name": "Anakin", - "have_power": true -} \ No newline at end of file diff --git a/examples/core/desktop/assets/data/loading/loading.pack b/examples/core/desktop/assets/data/loading/loading.pack deleted file mode 100644 index 3b28fbe4..00000000 --- a/examples/core/desktop/assets/data/loading/loading.pack +++ /dev/null @@ -1,89 +0,0 @@ - -loading.png -format: RGBA8888 -filter: Nearest,Nearest -repeat: none -loading-frame - rotate: false - xy: 1, 435 - size: 540, 60 - orig: 540, 60 - offset: 0, 0 - index: -1 -loading-bar-anim - rotate: false - xy: 1, 384 - size: 501, 49 - orig: 501, 49 - offset: 0, 0 - index: 1 -loading-bar-anim - rotate: false - xy: 1, 333 - size: 501, 49 - orig: 501, 49 - offset: 0, 0 - index: 2 -loading-bar-anim - rotate: false - xy: 1, 282 - size: 501, 49 - orig: 501, 49 - offset: 0, 0 - index: 3 -loading-bar-anim - rotate: false - xy: 1, 231 - size: 501, 49 - orig: 501, 49 - offset: 0, 0 - index: 4 -loading-bar-anim - rotate: false - xy: 1, 180 - size: 501, 49 - orig: 501, 49 - offset: 0, 0 - index: 5 -loading-bar1 - rotate: false - xy: 1, 129 - size: 501, 49 - orig: 501, 49 - offset: 0, 0 - index: -1 -loading-bar2 - rotate: false - xy: 1, 78 - size: 501, 49 - orig: 501, 49 - offset: 0, 0 - index: -1 -libgdx-logo - rotate: false - xy: 1, 8 - size: 408, 68 - orig: 408, 68 - offset: 0, 0 - index: -1 -loading-bar-hidden - rotate: false - xy: 543, 441 - size: 33, 54 - orig: 33, 54 - offset: 0, 0 - index: -1 -loading-frame-bg - rotate: false - xy: 504, 428 - size: 5, 5 - orig: 5, 5 - offset: 0, 0 - index: -1 -screen-bg - rotate: false - xy: 1, 1 - size: 5, 5 - orig: 5, 5 - offset: 0, 0 - index: -1 diff --git a/examples/core/desktop/assets/data/loading/loading.png b/examples/core/desktop/assets/data/loading/loading.png deleted file mode 100644 index 9363c7f37bc424a6df92e75ed75147b62d0872b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59042 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