From e7975f7a82bec36202ee2e09a67c8a3fde610119 Mon Sep 17 00:00:00 2001 From: Kenneth Russel Date: Thu, 22 Feb 2007 01:22:00 +0000 Subject: Fixed Issue 275: Rendering bugs in TextRenderer Fixed problem where during resizing of backing store for TextRenderer we were neglecting to unbind the old texture and bind the new one. This caused attempts to render with an invalid texture, which was probably the cause of crashes and definitely the cause of rendering artifacts. Fixed by calling endRendering() / beginRendering() appropriately on the underlying TextureRenderer during resizing of the backing store of the TextRenderer. git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/svn-server-sync/jogl/trunk@1148 232f8b59-042b-4e1e-8c03-345bb8c30851 --- .../com/sun/opengl/util/j2d/TextRenderer.java | 39 +++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/classes/com/sun/opengl/util/j2d/TextRenderer.java b/src/classes/com/sun/opengl/util/j2d/TextRenderer.java index 88b8301dc..0d3ab73d9 100755 --- a/src/classes/com/sun/opengl/util/j2d/TextRenderer.java +++ b/src/classes/com/sun/opengl/util/j2d/TextRenderer.java @@ -155,6 +155,17 @@ public class TextRenderer { void clearUsed() { used = false; } } + // Need to keep track of whether we're in a beginRendering() / + // endRendering() cycle so we can re-enter the exact same state if + // we have to reallocate the backing store + private boolean inBeginEndPair; + private boolean isOrthoMode; + private int beginRenderingWidth; + private int beginRenderingHeight; + + // For debugging only + private Frame dbgFrame; + /** Class supporting more full control over the process of rendering the bitmapped text. Allows customization of whether the backing store text bitmap is full-color or intensity only, the size of @@ -490,6 +501,9 @@ public class TextRenderer { cachedBackingStore = null; cachedGraphics = null; cachedFontRenderContext = null; + if (dbgFrame != null) { + dbgFrame.dispose(); + } } //---------------------------------------------------------------------- @@ -543,6 +557,10 @@ public class TextRenderer { debug(); } + inBeginEndPair = true; + isOrthoMode = ortho; + beginRenderingWidth = width; + beginRenderingHeight = height; if (ortho) { getBackingStore().beginOrthoRendering(width, height); } else { @@ -561,6 +579,7 @@ public class TextRenderer { } private void endRendering(boolean ortho) throws GLException { + inBeginEndPair = false; if (ortho) { getBackingStore().endOrthoRendering(); } else { @@ -720,6 +739,14 @@ public class TextRenderer { } public void beginMovement(Object oldBackingStore, Object newBackingStore) { + // Exit the begin / end pair if necessary + if (inBeginEndPair) { + if (isOrthoMode) { + ((TextureRenderer) oldBackingStore).endOrthoRendering(); + } else { + ((TextureRenderer) oldBackingStore).end3DRendering(); + } + } TextureRenderer newRenderer = (TextureRenderer) newBackingStore; g = newRenderer.createGraphics(); } @@ -754,6 +781,14 @@ public class TextRenderer { // Sync the whole surface TextureRenderer newRenderer = (TextureRenderer) newBackingStore; newRenderer.sync(0, 0, newRenderer.getWidth(), newRenderer.getHeight()); + // Re-enter the begin / end pair if necessary + if (inBeginEndPair) { + if (isOrthoMode) { + ((TextureRenderer) newBackingStore).beginOrthoRendering(beginRenderingWidth, beginRenderingHeight); + } else { + ((TextureRenderer) newBackingStore).begin3DRendering(); + } + } } } @@ -779,7 +814,7 @@ public class TextRenderer { // private void debug() { - Frame dbgFrame = new Frame("TextRenderer Debug Output"); + dbgFrame = new Frame("TextRenderer Debug Output"); GLCanvas dbgCanvas = new GLCanvas(new GLCapabilities(), null, GLContext.getCurrent(), null); dbgCanvas.addGLEventListener(new DebugListener(dbgFrame)); dbgFrame.add(dbgCanvas); @@ -813,6 +848,8 @@ public class TextRenderer { public void display(GLAutoDrawable drawable) { GL gl = drawable.getGL(); gl.glClear(GL.GL_DEPTH_BUFFER_BIT | GL.GL_COLOR_BUFFER_BIT); + if (packer == null) + return; TextureRenderer rend = getBackingStore(); final int w = rend.getWidth(); final int h = rend.getHeight(); -- cgit v1.2.3