GdkGlyphVector.java [plain text]
package gnu.java.awt.peer.gtk;
import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.io.InputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.Locale;
import java.util.Map;
import java.util.StringTokenizer;
import java.text.CharacterIterator;
import java.text.AttributedCharacterIterator;
import gnu.classpath.Configuration;
public class GdkGlyphVector extends GlyphVector
{
static
{
if (Configuration.INIT_LOAD_LIBRARY)
{
System.loadLibrary("gtkpeer");
}
if (GtkToolkit.useGraphics2D ())
initStaticState ();
}
native static void initStaticState ();
private final int native_state = GtkGenericPeer.getUniqueInteger ();
private Font font;
private FontRenderContext ctx;
private native void initState (GdkClasspathFontPeer peer, FontRenderContext ctx);
private native void setChars (String s);
private native void setGlyphCodes (int codes[]);
private native void dispose ();
private native int glyphCode (int idx);
private native int numGlyphs ();
private native int glyphCharIndex (int idx);
private native double[] allLogicalExtents ();
private native double[] allInkExtents ();
private native double[] glyphLogicalExtents (int idx);
private native double[] glyphInkExtents (int idx);
private native boolean glyphIsHorizontal (int idx);
private native boolean isEqual (GdkGlyphVector ggv);
public GdkGlyphVector (Font f, GdkClasspathFontPeer peer, FontRenderContext c, String s)
{
font = f;
ctx = c;
initState (peer, ctx);
setChars (s);
}
public GdkGlyphVector (Font f, GdkClasspathFontPeer peer, FontRenderContext c, int codes[])
{
font = f;
ctx = c;
initState (peer, ctx);
setGlyphCodes (codes);
}
protected void finalize ()
{
dispose ();
}
public Font getFont ()
{
return font;
}
public FontRenderContext getFontRenderContext ()
{
return ctx;
}
public int getGlyphCharIndex (int glyphIndex)
{
return glyphCharIndex (glyphIndex);
}
public int[] getGlyphCharIndices (int beginGlyphIndex,
int numEntries,
int[] codeReturn)
{
int ix[] = codeReturn;
if (ix == null)
ix = new int[numEntries];
for (int i = 0; i < numEntries; i++)
ix[i] = glyphCharIndex (beginGlyphIndex + i);
return ix;
}
public int getGlyphCode (int glyphIndex)
{
return glyphCode (glyphIndex);
}
public int[] getGlyphCodes (int beginGlyphIndex, int numEntries,
int[] codeReturn)
{
int ix[] = codeReturn;
if (ix == null)
ix = new int[numEntries];
for (int i = 0; i < numEntries; i++)
ix[i] = glyphCode (beginGlyphIndex + i);
return ix;
}
public Shape getGlyphLogicalBounds (int glyphIndex)
{
double extents[] = glyphLogicalExtents (glyphIndex);
return new Rectangle2D.Double (extents[0], extents[1],
extents[2], extents[3]);
}
public GlyphMetrics getGlyphMetrics (int glyphIndex)
{
double extents[] = glyphLogicalExtents (glyphIndex);
Rectangle2D log_bounds = new Rectangle2D.Double (extents[0], extents[1],
extents[2], extents[3]);
extents = glyphInkExtents (glyphIndex);
Rectangle2D ink_bounds = new Rectangle2D.Double (extents[0], extents[1],
extents[2], extents[3]);
boolean is_horizontal = glyphIsHorizontal (glyphIndex);
return new GlyphMetrics (is_horizontal,
(float)(log_bounds.getWidth() + log_bounds.getX()),
(float)(log_bounds.getHeight() + log_bounds.getY()),
ink_bounds, GlyphMetrics.STANDARD);
}
public Shape getGlyphOutline (int glyphIndex)
{
throw new UnsupportedOperationException ();
}
public Shape getGlyphOutline (int glyphIndex, float x, float y)
{
throw new UnsupportedOperationException ();
}
public Rectangle getGlyphPixelBounds (int glyphIndex,
FontRenderContext renderFRC,
float x, float y)
{
double extents[] = glyphInkExtents(glyphIndex);
return new Rectangle ((int)x, (int)y, (int)extents[2], (int)extents[3]);
}
public Point2D getGlyphPosition (int glyphIndex)
{
float[] ret = new float[2 * (glyphIndex + 1)];
getGlyphPositions (0, glyphIndex + 1, ret);
return new Point2D.Float (ret[2 * glyphIndex],
ret[2 * glyphIndex + 1]);
}
public float[] getGlyphPositions (int beginGlyphIndex,
int numEntries,
float[] positionReturn)
{
float fx[] = positionReturn;
if (fx == null)
fx = new float[numEntries * 2];
float x = 0.0f;
float y = 0.0f;
for (int i = 0; i < numEntries; ++i)
{
boolean is_horizontal = glyphIsHorizontal (beginGlyphIndex + i);
double log_extents[] = glyphLogicalExtents (beginGlyphIndex + i);
fx[2*i] = x + (float)log_extents[0]; fx[2*i + 1] = y + (float)log_extents[1]; if (is_horizontal)
x += (float)log_extents[2]; else
y += (float)log_extents[3]; }
return fx;
}
public AffineTransform getGlyphTransform (int glyphIndex)
{
return null;
}
public Shape getGlyphVisualBounds (int glyphIndex)
{
double extents[] = glyphInkExtents (glyphIndex);
return new Rectangle2D.Double (extents[0], extents[1],
extents[2], extents[3]);
}
public int getLayoutFlags ()
{
return 0;
}
public Rectangle2D getLogicalBounds ()
{
double extents[] = allLogicalExtents ();
return new Rectangle2D.Double (extents[0], extents[1],
extents[2], extents[3]);
}
public int getNumGlyphs ()
{
return numGlyphs ();
}
public Shape getOutline ()
{
throw new UnsupportedOperationException ();
}
public Rectangle getPixelBounds (FontRenderContext renderFRC,
float x, float y)
{
double extents[] = allInkExtents();
return new Rectangle ((int)x, (int)y,
(int)extents[2], (int)extents[3]);
}
public Rectangle2D getVisualBounds ()
{
double extents[] = allInkExtents();
return new Rectangle2D.Double (extents[0], extents[1],
extents[2], extents[3]);
}
public void performDefaultLayout ()
{
}
public void setGlyphPosition (int glyphIndex, Point2D newPos)
{
throw new UnsupportedOperationException ();
}
public void setGlyphTransform (int glyphIndex,
AffineTransform newTX)
{
throw new UnsupportedOperationException ();
}
public boolean equals(GlyphVector gv)
{
if (gv == null)
return false;
if (! (gv instanceof GdkGlyphVector))
return false;
GdkGlyphVector ggv = (GdkGlyphVector)gv;
return isEqual(ggv);
}
public GlyphJustificationInfo getGlyphJustificationInfo(int idx)
{
throw new UnsupportedOperationException ();
}
public Shape getOutline(float x, float y)
{
throw new UnsupportedOperationException ();
}
}