2006-06-11 Sven de Marothy <[EMAIL PROTECTED]>
* java/awt/font/TextLayout.java
(getLogicalHighlightShape): Add check.
* gnu/java/awt/peer/gtk/FreetypeGlyphVector.java
(getLogicalBounds, getGlyphPositions): Cache bounds, positions.
Index: gnu/java/awt/peer/gtk/FreetypeGlyphVector.java
===================================================================
RCS file: /sources/classpath/classpath/gnu/java/awt/peer/gtk/FreetypeGlyphVector.java,v
retrieving revision 1.4
diff -U3 -r1.4 FreetypeGlyphVector.java
--- gnu/java/awt/peer/gtk/FreetypeGlyphVector.java 9 Jun 2006 20:23:55 -0000 1.4
+++ gnu/java/awt/peer/gtk/FreetypeGlyphVector.java 11 Jun 2006 03:03:04 -0000
@@ -56,6 +56,9 @@
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 void performDefaultLayout()
{
+ logicalBounds = null; // invalidate caches.
+ glyphPositions = null;
+
whiteSpace = new boolean[ nGlyphs ];
glyphTransforms = new AffineTransform[ nGlyphs ];
double x = 0;
@@ -303,6 +309,9 @@
public float[] getGlyphPositions(int beginGlyphIndex, int numEntries,
float[] positionReturn)
{
+ if( glyphPositions != null )
+ return glyphPositions;
+
float[] rval;
if( positionReturn == null )
@@ -317,6 +326,7 @@
rval[i * 2 + 1] = (float)p.getY();
}
+ glyphPositions = rval;
return rval;
}
@@ -344,6 +354,8 @@
{
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 @@
rect = rect.createUnion( r2 );
}
+ logicalBounds = rect;
return rect;
}
@@ -413,6 +426,8 @@
// FIXME: Scaling, etc.?
glyphTransforms[ glyphIndex ].setToTranslation( newPos.getX(),
newPos.getY() );
+ logicalBounds = null;
+ glyphPositions = null;
}
/**
@@ -421,5 +436,7 @@
public void setGlyphTransform(int glyphIndex, AffineTransform newTX)
{
glyphTransforms[ glyphIndex ].setTransform( newTX );
+ logicalBounds = null;
+ glyphPositions = null;
}
}
Index: java/awt/font/TextLayout.java
===================================================================
RCS file: /sources/classpath/classpath/java/awt/font/TextLayout.java,v
retrieving revision 1.9
diff -U3 -r1.9 TextLayout.java
--- java/awt/font/TextLayout.java 9 Jun 2006 20:48:02 -0000 1.9
+++ java/awt/font/TextLayout.java 11 Jun 2006 03:03:06 -0000
@@ -391,11 +391,12 @@
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 )