diff options
-rwxr-xr-x | src/classes/com/sun/opengl/util/j2d/TextRenderer.java | 2 | ||||
-rwxr-xr-x | src/classes/com/sun/opengl/util/j2d/TextureRenderer.java | 8 | ||||
-rwxr-xr-x | src/classes/com/sun/opengl/util/texture/Texture.java | 38 |
3 files changed, 47 insertions, 1 deletions
diff --git a/src/classes/com/sun/opengl/util/j2d/TextRenderer.java b/src/classes/com/sun/opengl/util/j2d/TextRenderer.java index 75fc5ae70..e97c31173 100755 --- a/src/classes/com/sun/opengl/util/j2d/TextRenderer.java +++ b/src/classes/com/sun/opengl/util/j2d/TextRenderer.java @@ -310,6 +310,8 @@ public class TextRenderer { g.setColor(Color.WHITE); // Draw the string g.drawString(curStr, strx, stry); + // Sync to the OpenGL texture + getBackingStore().sync(rect.x(), rect.y(), rect.w(), rect.h()); } // OK, now draw the portion of the backing store to the screen diff --git a/src/classes/com/sun/opengl/util/j2d/TextureRenderer.java b/src/classes/com/sun/opengl/util/j2d/TextureRenderer.java index f758e4f6c..360a82b25 100755 --- a/src/classes/com/sun/opengl/util/j2d/TextureRenderer.java +++ b/src/classes/com/sun/opengl/util/j2d/TextureRenderer.java @@ -244,7 +244,12 @@ public class TextureRenderer { boolean canSkipUpdate = ensureTexture(); if (!canSkipUpdate) { - // Update specified region + // Update specified region. + // NOTE that because BufferedImage-based TextureDatas now don't + // do anything to their contents, the coordinate systems for + // OpenGL and Java 2D actually line up correctly for + // updateSubImage calls, so we don't need to do any argument + // conversion here (i.e., flipping the Y coordinate). texture.updateSubImage(textureData, 0, x, y, x, y, width, height); } } @@ -420,6 +425,7 @@ public class TextureRenderer { texture.dispose(); texture = null; } + mustReallocateTexture = false; } if (texture == null) { diff --git a/src/classes/com/sun/opengl/util/texture/Texture.java b/src/classes/com/sun/opengl/util/texture/Texture.java index d22aabc9a..68d8dffe6 100755 --- a/src/classes/com/sun/opengl/util/texture/Texture.java +++ b/src/classes/com/sun/opengl/util/texture/Texture.java @@ -744,6 +744,8 @@ public class Texture { gl.glBindTexture(newTarget, texID); int rowlen = data.getRowLength(); + int dataWidth = data.getWidth(); + int dataHeight = data.getHeight(); if (data.getMipmapData() != null) { // Compute the width, height and row length at the specified mipmap level // Note we do not support specification of the row length for @@ -751,11 +753,47 @@ public class Texture { for (int i = 0; i < mipmapLevel; i++) { width /= 2; height /= 2; + + dataWidth /= 2; + dataHeight /= 2; } rowlen = 0; buffer = data.getMipmapData()[mipmapLevel]; } + // Clip incoming rectangles to what is available both on this + // texture and in the incoming TextureData + if (srcx < 0) { + width += srcx; + srcx = 0; + } + if (srcy < 0) { + height += srcy; + srcy = 0; + } + // NOTE: not sure whether the following two are the correct thing to do + if (dstx < 0) { + width += dstx; + dstx = 0; + } + if (dsty < 0) { + height += dsty; + dsty = 0; + } + + if (srcx + width > dataWidth) { + width = dataWidth - srcx; + } + if (srcy + height > dataHeight) { + height = dataHeight - srcy; + } + if (dstx + width > texWidth) { + width = texWidth - dstx; + } + if (dsty + height > texHeight) { + height = texHeight - dsty; + } + checkCompressedTextureExtensions(data); if (data.isDataCompressed()) { |