aboutsummaryrefslogtreecommitdiff
path: root/src/share/classes/sun/font/StrikeCache.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/share/classes/sun/font/StrikeCache.java')
-rw-r--r--src/share/classes/sun/font/StrikeCache.java59
1 files changed, 49 insertions, 10 deletions
diff --git a/src/share/classes/sun/font/StrikeCache.java b/src/share/classes/sun/font/StrikeCache.java
index bfcf032db..560be3af2 100644
--- a/src/share/classes/sun/font/StrikeCache.java
+++ b/src/share/classes/sun/font/StrikeCache.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,16 +25,17 @@
package sun.font;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsEnvironment;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
-import java.awt.Font;
-import java.awt.FontFormatException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
import sun.java2d.Disposer;
+import sun.java2d.pipe.BufferedContext;
+import sun.java2d.pipe.RenderQueue;
+import sun.java2d.pipe.hw.AccelGraphicsConfig;
import sun.misc.Unsafe;
/**
@@ -192,13 +193,13 @@ public final class StrikeCache {
recentStrikeIndex = index;
}
- static void disposeStrike(FontStrikeDisposer disposer) {
+ private static final void doDispose(FontStrikeDisposer disposer) {
if (disposer.intGlyphImages != null) {
freeIntMemory(disposer.intGlyphImages,
- disposer.pScalerContext);
+ disposer.pScalerContext);
} else if (disposer.longGlyphImages != null) {
freeLongMemory(disposer.longGlyphImages,
- disposer.pScalerContext);
+ disposer.pScalerContext);
} else if (disposer.segIntGlyphImages != null) {
/* NB Now making multiple JNI calls in this case.
* But assuming that there's a reasonable amount of locality
@@ -207,7 +208,7 @@ public final class StrikeCache {
for (int i=0; i<disposer.segIntGlyphImages.length; i++) {
if (disposer.segIntGlyphImages[i] != null) {
freeIntMemory(disposer.segIntGlyphImages[i],
- disposer.pScalerContext);
+ disposer.pScalerContext);
/* native will only free the scaler context once */
disposer.pScalerContext = 0L;
disposer.segIntGlyphImages[i] = null;
@@ -223,7 +224,7 @@ public final class StrikeCache {
for (int i=0; i<disposer.segLongGlyphImages.length; i++) {
if (disposer.segLongGlyphImages[i] != null) {
freeLongMemory(disposer.segLongGlyphImages[i],
- disposer.pScalerContext);
+ disposer.pScalerContext);
disposer.pScalerContext = 0L;
disposer.segLongGlyphImages[i] = null;
}
@@ -234,6 +235,44 @@ public final class StrikeCache {
}
}
+ static void disposeStrike(final FontStrikeDisposer disposer) {
+ // we need to execute the strike disposal on the rendering thread
+ // because they may be accessed on that thread at the time of the
+ // disposal (for example, when the accel. cache is invalidated)
+
+ // REMIND: this look a bit heavyweight, but should be ok
+ // because strike disposal is a relatively infrequent operation,
+ // more worrisome is the necessity of getting a GC here.
+ RenderQueue rq = null;
+ GraphicsEnvironment ge =
+ GraphicsEnvironment.getLocalGraphicsEnvironment();
+ if (!ge.isHeadless()) {
+ GraphicsConfiguration gc =
+ ge.getDefaultScreenDevice().getDefaultConfiguration();
+ if (gc instanceof AccelGraphicsConfig) {
+ AccelGraphicsConfig agc = (AccelGraphicsConfig)gc;
+ BufferedContext bc = agc.getContext();
+ if (bc != null) {
+ rq = bc.getRenderQueue();
+ }
+ }
+ }
+ if (rq != null) {
+ rq.lock();
+ try {
+ rq.flushAndInvokeNow(new Runnable() {
+ public void run() {
+ doDispose(disposer);
+ }
+ });
+ } finally {
+ rq.unlock();
+ }
+ } else {
+ doDispose(disposer);
+ }
+ }
+
static native void freeIntPointer(int ptr);
static native void freeLongPointer(long ptr);
private static native void freeIntMemory(int[] glyphPtrs, long pContext);