updated the window implementation

native-compilation-test
javasabr 9 years ago
parent 190f30afe5
commit ddfa6e703a
  1. 60
      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); try (final GLFWImage.Buffer iconSet = GLFWImage.malloc(images.length)) {
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); final ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * 4);
try {
ImageIO.write(image, "png", bout);
} catch (final IOException e) {
throw new RuntimeException(e);
}
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;
} }

Loading…
Cancel
Save