Browse Source

updated the window implementation

javasabr 9 years ago
parent
commit
ddfa6e703a
1 changed files with 28 additions and 32 deletions
  1. 28 32
      jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java

+ 28 - 32
jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java

@@ -51,26 +51,20 @@ import org.lwjgl.glfw.GLFWImage;
 import org.lwjgl.glfw.GLFWVidMode;
 import org.lwjgl.glfw.GLFWVidMode;
 import org.lwjgl.glfw.GLFWWindowFocusCallback;
 import org.lwjgl.glfw.GLFWWindowFocusCallback;
 import org.lwjgl.glfw.GLFWWindowSizeCallback;
 import org.lwjgl.glfw.GLFWWindowSizeCallback;
-import org.lwjgl.stb.STBImage;
 
 
 import java.awt.*;
 import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.awt.image.BufferedImage;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.ByteBuffer;
 import java.nio.IntBuffer;
 import java.nio.IntBuffer;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.logging.Level;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.logging.Logger;
 
 
-import javax.imageio.ImageIO;
-
 import static org.lwjgl.glfw.GLFW.GLFW_ALPHA_BITS;
 import static org.lwjgl.glfw.GLFW.GLFW_ALPHA_BITS;
 import static org.lwjgl.glfw.GLFW.GLFW_BLUE_BITS;
 import static org.lwjgl.glfw.GLFW.GLFW_BLUE_BITS;
 import static org.lwjgl.glfw.GLFW.GLFW_CONTEXT_VERSION_MAJOR;
 import static org.lwjgl.glfw.GLFW.GLFW_CONTEXT_VERSION_MAJOR;
 import static org.lwjgl.glfw.GLFW.GLFW_CONTEXT_VERSION_MINOR;
 import static org.lwjgl.glfw.GLFW.GLFW_CONTEXT_VERSION_MINOR;
 import static org.lwjgl.glfw.GLFW.GLFW_DEPTH_BITS;
 import static org.lwjgl.glfw.GLFW.GLFW_DEPTH_BITS;
-import static org.lwjgl.glfw.GLFW.GLFW_DOUBLEBUFFER;
 import static org.lwjgl.glfw.GLFW.GLFW_FALSE;
 import static org.lwjgl.glfw.GLFW.GLFW_FALSE;
 import static org.lwjgl.glfw.GLFW.GLFW_GREEN_BITS;
 import static org.lwjgl.glfw.GLFW.GLFW_GREEN_BITS;
 import static org.lwjgl.glfw.GLFW.GLFW_OPENGL_CORE_PROFILE;
 import static org.lwjgl.glfw.GLFW.GLFW_OPENGL_CORE_PROFILE;
@@ -223,8 +217,6 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable {
 
 
         glfwWindowHint(GLFW_VISIBLE, GL_FALSE);
         glfwWindowHint(GLFW_VISIBLE, GL_FALSE);
         glfwWindowHint(GLFW_RESIZABLE, settings.isResizable() ? GLFW_TRUE : GLFW_FALSE);
         glfwWindowHint(GLFW_RESIZABLE, settings.isResizable() ? GLFW_TRUE : GLFW_FALSE);
-
-        glfwWindowHint(GLFW_DOUBLEBUFFER, GLFW_TRUE);
         glfwWindowHint(GLFW_DEPTH_BITS, settings.getDepthBits());
         glfwWindowHint(GLFW_DEPTH_BITS, settings.getDepthBits());
         glfwWindowHint(GLFW_STENCIL_BITS, settings.getStencilBits());
         glfwWindowHint(GLFW_STENCIL_BITS, settings.getStencilBits());
         glfwWindowHint(GLFW_SAMPLES, settings.getSamples());
         glfwWindowHint(GLFW_SAMPLES, settings.getSamples());
@@ -324,12 +316,24 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable {
             glfwSwapInterval(0);
             glfwSwapInterval(0);
         }
         }
 
 
+        setWindowIcon(settings);
+
+        glfwShowWindow(window);
+
+        allowSwapBuffers = settings.isSwapBuffers();
+    }
+
+    /**
+     * Set custom icons to the window of this application.
+     */
+    private void setWindowIcon(final AppSettings settings) {
+
         final Object[] icons = settings.getIcons();
         final Object[] icons = settings.getIcons();
+        if (icons == null) return;
 
 
-        if (icons != null) {
+        final GLFWImage[] images = imagesToGLFWImages(icons);
 
 
-            final GLFWImage[] images = imagesToGLFWImages(icons);
-            final GLFWImage.Buffer iconSet = GLFWImage.malloc(images.length);
+        try (final GLFWImage.Buffer iconSet = GLFWImage.malloc(images.length)) {
 
 
             for (int i = images.length - 1; i >= 0; i--) {
             for (int i = images.length - 1; i >= 0; i--) {
                 final GLFWImage image = images[i];
                 final GLFWImage image = images[i];
@@ -338,16 +342,11 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable {
 
 
             glfwSetWindowIcon(window, iconSet);
             glfwSetWindowIcon(window, iconSet);
 
 
-            iconSet.free();
-
+        } finally {
             for (final GLFWImage image : images) {
             for (final GLFWImage image : images) {
-                image.free();
+                image.close();
             }
             }
         }
         }
-
-        glfwShowWindow(window);
-
-        allowSwapBuffers = settings.isSwapBuffers();
     }
     }
 
 
     /**
     /**
@@ -388,25 +387,22 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable {
         final IntBuffer h = BufferUtils.createIntBuffer(1);
         final IntBuffer h = BufferUtils.createIntBuffer(1);
         final IntBuffer comp = BufferUtils.createIntBuffer(1);
         final IntBuffer comp = BufferUtils.createIntBuffer(1);
 
 
-        final ByteArrayOutputStream bout = new ByteArrayOutputStream(4096);
-        try {
-            ImageIO.write(image, "png", bout);
-        } catch (final IOException e) {
-            throw new RuntimeException(e);
-        }
+        final ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * 4);
 
 
-        final byte[] bytes = bout.toByteArray();
+        for (int i = 0; i < image.getHeight(); i++) {
+            for (int j = 0; j < image.getWidth(); j++) {
+                int colorSpace = image.getRGB(j, i);
+                buffer.put((byte) ((colorSpace << 8) >> 24));
+                buffer.put((byte) ((colorSpace << 16) >> 24));
+                buffer.put((byte) ((colorSpace << 24) >> 24));
+                buffer.put((byte) (colorSpace >> 24));
+            }
+        }
 
 
-        final ByteBuffer buffer = BufferUtils.createByteBuffer(bytes.length);
-        buffer.put(bytes);
         buffer.flip();
         buffer.flip();
 
 
-        final ByteBuffer pixels = STBImage.stbi_load_from_memory(buffer, h, w, comp, 4);
-
-        BufferUtils.destroyDirectBuffer(buffer);
-
         final GLFWImage result = GLFWImage.create();
         final GLFWImage result = GLFWImage.create();
-        result.set(w.get(0), h.get(0), pixels);
+        result.set(image.getWidth(), image.getHeight(), buffer);
 
 
         return result;
         return result;
     }
     }