diff options
Diffstat (limited to 'src/classes')
3 files changed, 46 insertions, 11 deletions
diff --git a/src/classes/com/sun/opengl/impl/packrect/BackingStoreManager.java b/src/classes/com/sun/opengl/impl/packrect/BackingStoreManager.java index 0c4636063..2ca5a5a7b 100755 --- a/src/classes/com/sun/opengl/impl/packrect/BackingStoreManager.java +++ b/src/classes/com/sun/opengl/impl/packrect/BackingStoreManager.java @@ -49,6 +49,16 @@ public interface BackingStoreManager { public Object allocateBackingStore(int w, int h); public void deleteBackingStore(Object backingStore); + /** Indication whether this BackingStoreManager supports compaction; + in other words, the allocation of a new backing store and + movement of the contents of the backing store from the old to + the new one. If it does not, then RectanglePacker.add() may + throw an exception if additionFailed() can not make enough room + available. If an implementation returns false, this also implies + that the backing store can not grow, so that preExpand() will + never be called. */ + public boolean canCompact(); + /** Notification that expansion of the backing store is about to be done due to addition of the given rectangle. Gives the manager a chance to do some compaction and potentially remove old entries @@ -64,8 +74,12 @@ public interface BackingStoreManager { /** Notification that addition of the given Rect failed because a maximum size was set in the RectanglePacker and the backing - store could not be expanded. */ - public void additionFailed(Rect cause, int attemptNumber); + store could not be expanded, or because compaction (and, + therefore, implicitly expansion) was not supported. Should + return false if the manager can do nothing more to handle the + failed addition, which will cause a RuntimeException to be + thrown from the RectanglePacker. */ + public boolean additionFailed(Rect cause, int attemptNumber); /** Notification that movement is starting. */ public void beginMovement(Object oldBackingStore, Object newBackingStore); diff --git a/src/classes/com/sun/opengl/impl/packrect/RectanglePacker.java b/src/classes/com/sun/opengl/impl/packrect/RectanglePacker.java index 3a77b3bd1..8520484cf 100755 --- a/src/classes/com/sun/opengl/impl/packrect/RectanglePacker.java +++ b/src/classes/com/sun/opengl/impl/packrect/RectanglePacker.java @@ -102,8 +102,12 @@ public class RectanglePacker { /** Decides upon an (x, y) position for the given rectangle (leaving its width and height unchanged) and places it on the backing - store. May provoke re-layout of other Rects already added. */ - public void add(Rect rect) { + store. May provoke re-layout of other Rects already added. If + the BackingStoreManager does not support compaction, and {@link + BackingStoreManager#preExpand BackingStoreManager.preExpand} + does not clear enough space for the incoming rectangle, then + this method will throw a RuntimeException. */ + public void add(Rect rect) throws RuntimeException { // Allocate backing store if we don't have any yet if (backingStore == null) backingStore = manager.allocateBackingStore(levels.w(), levels.h()); @@ -116,14 +120,21 @@ public class RectanglePacker { if (levels.add(rect)) return; - // Try to allocate with horizontal compaction - if (levels.compactAndAdd(rect, backingStore, manager)) - return; - - // Let the manager have a chance at potentially evicting some entries - tryAgain = manager.preExpand(rect, attemptNumber++); + if (manager.canCompact()) { + // Try to allocate with horizontal compaction + if (levels.compactAndAdd(rect, backingStore, manager)) + return; + // Let the manager have a chance at potentially evicting some entries + tryAgain = manager.preExpand(rect, attemptNumber++); + } else { + tryAgain = manager.additionFailed(rect, attemptNumber++); + } } while (tryAgain); + if (!manager.canCompact()) { + throw new RuntimeException("BackingStoreManager does not support compaction or expansion, and didn't clear space for new rectangle"); + } + compactImpl(rect); // Retry the addition of the incoming rectangle diff --git a/src/classes/com/sun/opengl/util/awt/gl2/GL2TextRenderer.java b/src/classes/com/sun/opengl/util/awt/gl2/GL2TextRenderer.java index 57cced512..0ec232eca 100755 --- a/src/classes/com/sun/opengl/util/awt/gl2/GL2TextRenderer.java +++ b/src/classes/com/sun/opengl/util/awt/gl2/GL2TextRenderer.java @@ -1202,7 +1202,7 @@ public class GL2TextRenderer { return false; } - public void additionFailed(Rect cause, int attemptNumber) { + public boolean additionFailed(Rect cause, int attemptNumber) { // Heavy hammer -- might consider doing something different packer.clear(); stringLocations.clear(); @@ -1212,6 +1212,16 @@ public class GL2TextRenderer { System.err.println( " *** Cleared all text because addition failed ***"); } + + if (attemptNumber == 0) { + return true; + } + + return false; + } + + public boolean canCompact() { + return true; } public void beginMovement(Object oldBackingStore, Object newBackingStore) { |