aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xsrc/classes/com/sun/opengl/impl/packrect/BackingStoreManager.java18
-rwxr-xr-xsrc/classes/com/sun/opengl/impl/packrect/RectanglePacker.java27
-rwxr-xr-xsrc/classes/com/sun/opengl/util/awt/gl2/GL2TextRenderer.java12
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) {