From 2b34526dd5c5274d14862f23b81f79dc7fbbe469 Mon Sep 17 00:00:00 2001 From: Kenneth Russel Date: Sat, 6 Jan 2007 00:43:17 +0000 Subject: With help from Chris Campbell, fixed incredibly stupid bug on my part where the new Java 2D TextureRenderer was destroying and re-creating the OpenGL texture every frame. This was why the Java 2D Overlay class was so expensive, and why the TextRenderer wasn't as fast as it seemed it should be. Fixed bugs in all of the Java 2D demos which were covered up by this implicit sync, as well as in the TextRenderer class itself where it was missing a key sync operation. Added code to the Texture.updateSubImage() implementation to clip the incoming rectangle to the bounds of the input data and texture, to keep OpenGL from dropping almost-valid updates on the floor. Ran all of the Java 2D integration demos to verify these fixes. git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/../svn-server-sync/jogl-demos/trunk@198 3298f667-5e0e-4b4a-8ed4-a3559d26a5f4 --- src/demos/j2d/TestOverlay.java | 19 +++++++++++-------- src/demos/j2d/TestTextRenderer.java | 2 +- src/demos/j2d/TestTextureRenderer.java | 1 + 3 files changed, 13 insertions(+), 9 deletions(-) (limited to 'src/demos') diff --git a/src/demos/j2d/TestOverlay.java b/src/demos/j2d/TestOverlay.java index 5faa0d5..adc8ba7 100755 --- a/src/demos/j2d/TestOverlay.java +++ b/src/demos/j2d/TestOverlay.java @@ -103,6 +103,8 @@ public class TestOverlay implements GLEventListener { private int frameCount; private DecimalFormat format = new DecimalFormat("####.00"); + private Rectangle fpsBounds; + public void init(GLAutoDrawable drawable) { GL gl = drawable.getGL(); gl.setSwapInterval(0); @@ -134,23 +136,20 @@ public class TestOverlay implements GLEventListener { FontRenderContext frc = g2d.getFontRenderContext(); String fpsString = "FPS: " + format.format(fps); GlyphVector gv = font.createGlyphVector(frc, TEST_STRING); - int x = drawable.getWidth() - 200; + fpsBounds = gv.getPixelBounds(frc, 0, 0); + int x = drawable.getWidth() - fpsBounds.width - 20; int y = drawable.getHeight() - 20; - Rectangle fpsBounds = gv.getPixelBounds(frc, x, y); g2d.setFont(font); g2d.setComposite(AlphaComposite.Src); g2d.setColor(TRANSPARENT_BLACK); - g2d.fillRect(fpsBounds.x, fpsBounds.y, fpsBounds.width, fpsBounds.height); + g2d.fillRect(x + fpsBounds.x, y + fpsBounds.y, fpsBounds.width, fpsBounds.height); g2d.setColor(Color.WHITE); g2d.drawString(fpsString, x, y); - overlay.sync(fpsBounds.x, fpsBounds.y, fpsBounds.width, fpsBounds.height); + overlay.sync(x + fpsBounds.x, y + fpsBounds.y, fpsBounds.width, fpsBounds.height); } time.update(); - // Move down the text bounds - lastTextBounds = textBounds; - g2d.setFont(font); g2d.setComposite(AlphaComposite.Src); if (overlay.contentsLost()) { @@ -191,7 +190,11 @@ public class TestOverlay implements GLEventListener { if (lastTextBounds != null) { union.add(lastTextBounds); } - overlay.sync(union.x, union.y, union.width, union.height); + // Put a little slop around this text due to apparent rounding errors + overlay.sync(union.x, union.y, union.width + 10, union.height + 10); + + // Move down the text bounds + lastTextBounds = textBounds; // Draw the overlay overlay.drawAll(); diff --git a/src/demos/j2d/TestTextRenderer.java b/src/demos/j2d/TestTextRenderer.java index 853009c..0356606 100755 --- a/src/demos/j2d/TestTextRenderer.java +++ b/src/demos/j2d/TestTextRenderer.java @@ -134,7 +134,7 @@ public class TestTextRenderer implements GLEventListener { fpsText = "FPS: " + format.format(fps); if (fpsWidth == 0) { // Place it at a fixed offset wrt the lower right corner - fpsWidth = (int) renderer.getBounds("FPS: 1000.00").getWidth(); + fpsWidth = (int) renderer.getBounds("FPS: 10000.00").getWidth(); } } diff --git a/src/demos/j2d/TestTextureRenderer.java b/src/demos/j2d/TestTextureRenderer.java index 09f3fd8..596115e 100755 --- a/src/demos/j2d/TestTextureRenderer.java +++ b/src/demos/j2d/TestTextureRenderer.java @@ -151,6 +151,7 @@ public class TestTextureRenderer implements GLEventListener { g2d.fillRect(fpsBounds.x, fpsBounds.y, fpsBounds.width, fpsBounds.height); g2d.setColor(Color.WHITE); g2d.drawString(fpsString, 10, 100); + renderer.sync(fpsBounds.x, fpsBounds.y, fpsBounds.width, fpsBounds.height); } time.update(); -- cgit v1.2.3