diff options
Diffstat (limited to 'libjava/classpath/gnu/java/awt/font/GNUGlyphVector.java')
| -rw-r--r-- | libjava/classpath/gnu/java/awt/font/GNUGlyphVector.java | 40 |
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; } |
