summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven de Marothy <sven@physto.se>2006-06-11 03:09:02 +0000
committerSven de Marothy <sven@physto.se>2006-06-11 03:09:02 +0000
commitb614023129938c90fe4b2f2fa8d2cb94b4d9127d (patch)
treecb64f91164d658efa950b16f859e17c8a1e58fb8
parentb033b5e5056ac2d432b8f32fd3971c5c53f8165f (diff)
downloadclasspath-b614023129938c90fe4b2f2fa8d2cb94b4d9127d.tar.gz
2006-06-11 Sven de Marothy <sven@physto.se>
* java/awt/font/TextLayout.java (getLogicalHighlightShape): Add check. * gnu/java/awt/peer/gtk/FreetypeGlyphVector.java (getLogicalBounds, getGlyphPositions): Cache bounds, positions.
-rw-r--r--ChangeLog7
-rw-r--r--gnu/java/awt/peer/gtk/FreetypeGlyphVector.java17
-rw-r--r--java/awt/font/TextLayout.java11
3 files changed, 30 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 2af899d28..87d05ee7c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2006-06-11 Sven de Marothy <sven@physto.se>
+
+ * java/awt/font/TextLayout.java
+ (getLogicalHighlightShape): Add check.
+ * gnu/java/awt/peer/gtk/FreetypeGlyphVector.java
+ (getLogicalBounds, getGlyphPositions): Cache bounds, positions.
+
2006-06-11 Raif S. Naffah <raif@swiftdsl.com.au>
* gnu/javax/security/auth/login/ConfigFileParser.java (validateClassName):
diff --git a/gnu/java/awt/peer/gtk/FreetypeGlyphVector.java b/gnu/java/awt/peer/gtk/FreetypeGlyphVector.java
index 48ecbc0d2..1f5c455dd 100644
--- a/gnu/java/awt/peer/gtk/FreetypeGlyphVector.java
+++ b/gnu/java/awt/peer/gtk/FreetypeGlyphVector.java
@@ -56,6 +56,9 @@ public class FreetypeGlyphVector extends GlyphVector
private Font font;
private GdkFontPeer peer; // ATTN: Accessed from native code.
+ private Rectangle2D logicalBounds;
+
+ private float[] glyphPositions;
/**
* The string represented by this GlyphVector.
*/
@@ -203,6 +206,9 @@ public class FreetypeGlyphVector extends GlyphVector
*/
public void performDefaultLayout()
{
+ logicalBounds = null; // invalidate caches.
+ glyphPositions = null;
+
whiteSpace = new boolean[ nGlyphs ];
glyphTransforms = new AffineTransform[ nGlyphs ];
double x = 0;
@@ -303,6 +309,9 @@ public class FreetypeGlyphVector extends GlyphVector
public float[] getGlyphPositions(int beginGlyphIndex, int numEntries,
float[] positionReturn)
{
+ if( glyphPositions != null )
+ return glyphPositions;
+
float[] rval;
if( positionReturn == null )
@@ -317,6 +326,7 @@ public class FreetypeGlyphVector extends GlyphVector
rval[i * 2 + 1] = (float)p.getY();
}
+ glyphPositions = rval;
return rval;
}
@@ -344,6 +354,8 @@ public class FreetypeGlyphVector extends GlyphVector
{
if( nGlyphs == 0 )
return new Rectangle2D.Double(0, 0, 0, 0);
+ if( logicalBounds != null )
+ return logicalBounds;
Rectangle2D rect = (Rectangle2D)getGlyphLogicalBounds( 0 );
for( int i = 1; i < nGlyphs; i++ )
@@ -354,6 +366,7 @@ public class FreetypeGlyphVector extends GlyphVector
rect = rect.createUnion( r2 );
}
+ logicalBounds = rect;
return rect;
}
@@ -413,6 +426,8 @@ public class FreetypeGlyphVector extends GlyphVector
// FIXME: Scaling, etc.?
glyphTransforms[ glyphIndex ].setToTranslation( newPos.getX(),
newPos.getY() );
+ logicalBounds = null;
+ glyphPositions = null;
}
/**
@@ -421,5 +436,7 @@ public class FreetypeGlyphVector extends GlyphVector
public void setGlyphTransform(int glyphIndex, AffineTransform newTX)
{
glyphTransforms[ glyphIndex ].setTransform( newTX );
+ logicalBounds = null;
+ glyphPositions = null;
}
}
diff --git a/java/awt/font/TextLayout.java b/java/awt/font/TextLayout.java
index 966718c52..4f8c1c644 100644
--- a/java/awt/font/TextLayout.java
+++ b/java/awt/font/TextLayout.java
@@ -391,11 +391,12 @@ public final class TextLayout implements Cloneable
double advance = 0;
// go to first run
- while( runIndices[i + 1][1] < firstEndpoint )
- {
- advance += runs[i].getLogicalBounds().getWidth();
- i++;
- }
+ if( i > 0 )
+ while( runIndices[i + 1][1] < firstEndpoint )
+ {
+ advance += runs[i].getLogicalBounds().getWidth();
+ i++;
+ }
int j = 0; // index into the run.
if( runIndices[i][1] - runIndices[i][0] > 1 )