summaryrefslogtreecommitdiff
path: root/libjava/classpath/gnu/java/awt/font/GNUGlyphVector.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/classpath/gnu/java/awt/font/GNUGlyphVector.java')
-rw-r--r--libjava/classpath/gnu/java/awt/font/GNUGlyphVector.java40
1 files changed, 31 insertions, 9 deletions
diff --git a/libjava/classpath/gnu/java/awt/font/GNUGlyphVector.java b/libjava/classpath/gnu/java/awt/font/GNUGlyphVector.java
index 2f73dce77b0..22f331e15d1 100644
--- a/libjava/classpath/gnu/java/awt/font/GNUGlyphVector.java
+++ b/libjava/classpath/gnu/java/awt/font/GNUGlyphVector.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.java.awt.font;
+import gnu.java.awt.java2d.ShapeWrapper;
+
import java.awt.Font;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphMetrics;
@@ -82,6 +84,10 @@ public class GNUGlyphVector
private AffineTransform[] transforms;
private int layoutFlags;
+ /**
+ * The cached non-transformed outline of this glyph vector.
+ */
+ private Shape cleanOutline;
/**
* Constructs a new GNUGlyphVector.
@@ -257,7 +263,6 @@ public class GNUGlyphVector
*/
public Shape getOutline()
{
- validate();
return getOutline(0.0f, 0.0f);
}
@@ -273,16 +278,33 @@ public class GNUGlyphVector
{
validate();
- GeneralPath outline = new GeneralPath();
- int len = glyphs.length;
- for (int i = 0; i < len; i++)
+ Shape outline;
+ if (cleanOutline == null)
{
- GeneralPath p = new GeneralPath(getGlyphOutline(i));
- outline.append(p, false);
+ GeneralPath path = new GeneralPath();
+ int len = glyphs.length;
+ for (int i = 0; i < len; i++)
+ {
+ GeneralPath p = new GeneralPath(getGlyphOutline(i));
+ path.append(p, false);
+ }
+ // Protect the cached instance from beeing modified by application
+ // code.
+ cleanOutline = new ShapeWrapper(path);
+ outline = cleanOutline;
+ }
+ else
+ {
+ outline = cleanOutline;
+ }
+ if (x != 0 || y != 0)
+ {
+ GeneralPath path = new GeneralPath(outline);
+ AffineTransform t = new AffineTransform();
+ t.translate(x, y);
+ path.transform(t);
+ outline = path;
}
- AffineTransform t = new AffineTransform();
- t.translate(x, y);
- outline.transform(t);
return outline;
}