/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @author Ilya S. Okomin * @version $Revision$ */ package java.awt.font; import java.awt.Font; import java.awt.font.FontRenderContext; import java.awt.font.GlyphJustificationInfo; import java.awt.font.GlyphMetrics; import java.awt.Rectangle; import java.awt.Shape; import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; /** * The GlyphVector class contains a collection of glyphs with geometric * information and each glyph's location. Each GlyphVector can be associated * with only one Font. GlyphVector contains the following properties for each * glyph: * <ul> * <li>the glyph position;</li> * <li>the transform of the glyph;</li> * <li>the metrics of the glyph in the context of the GlyphVector.</li> * </ul> * * @since Android 1.0 */ public abstract class GlyphVector implements Cloneable { /** * The Constant FLAG_HAS_TRANSFORMS indicates that this GlyphVector has * per-glyph transforms. */ public static final int FLAG_HAS_TRANSFORMS = 1; /** * The Constant FLAG_HAS_POSITION_ADJUSTMENTS indicates that the GlyphVector * has per-glyph position adjustments. */ public static final int FLAG_HAS_POSITION_ADJUSTMENTS = 2; /** * The Constant FLAG_RUN_RTL indicates that this GlyphVector has a right to * left run direction. */ public static final int FLAG_RUN_RTL = 4; /** * The Constant FLAG_COMPLEX_GLYPHS indicates that this GlyphVector has a * complex glyph to char mapping. */ public static final int FLAG_COMPLEX_GLYPHS = 8; /** * The Constant FLAG_MASK indicates a mask for supported flags from * getLayoutFlags. */ public static final int FLAG_MASK = 15; // (|) mask of other flags /** * Instantiates a new GlyphVector. */ public GlyphVector() { } /** * Gets the pixel bounds of the GlyphVector when rendered at the specified * location with the specified FontRenderContext. * * @param frc * the FontRenderContext. * @param x * the X coordinate of the GlyphVector's location. * @param y * the Y coordinate of the GlyphVector's location. * @return the pixel bounds */ public Rectangle getPixelBounds(FontRenderContext frc, float x, float y) { // default implementation - integer Rectangle, that encloses visual // bounds rectangle Rectangle2D visualRect = getVisualBounds(); int minX = (int)Math.floor(visualRect.getMinX() + x); int minY = (int)Math.floor(visualRect.getMinY() + y); int width = (int)Math.ceil(visualRect.getMaxX() + x) - minX; int height = (int)Math.ceil(visualRect.getMaxY() + y) - minY; return new Rectangle(minX, minY, width, height); } /** * Gets the pixel bounds of the glyph with the specified index in this * GlyphVector which is rendered with the specified FontRenderContext at the * specified location. * * @param index * the glyph index in this GlyphVector. * @param frc * the FontRenderContext. * @param x * the X coordinate of the GlyphVector's location. * @param y * the Y coordinate of the GlyphVector's location. * @return a Rectangle bounds. */ public Rectangle getGlyphPixelBounds(int index, FontRenderContext frc, float x, float y) { Rectangle2D visualRect = getGlyphVisualBounds(index).getBounds2D(); int minX = (int)Math.floor(visualRect.getMinX() + x); int minY = (int)Math.floor(visualRect.getMinY() + y); int width = (int)Math.ceil(visualRect.getMaxX() + x) - minX; int height = (int)Math.ceil(visualRect.getMaxY() + y) - minY; return new Rectangle(minX, minY, width, height); } /** * Gets the visual bounds of the GlyphVector. * * @return the visual bounds of the GlyphVector. */ public abstract Rectangle2D getVisualBounds(); /** * Gets the logical bounds of the GlyphVector. * * @return the logical bounds of the GlyphVector. */ public abstract Rectangle2D getLogicalBounds(); /** * Sets the position of the specified glyph in this GlyphVector. * * @param glyphIndex * the glyph index in this GlyphVector. * @param newPos * the new position of the glyph at the specified glyphIndex. */ public abstract void setGlyphPosition(int glyphIndex, Point2D newPos); /** * Gets the position of the specified glyph in this GlyphVector. * * @param glyphIndex * the glyph index in this GlyphVector. * @return the position of the specified glyph in this GlyphVector. */ public abstract Point2D getGlyphPosition(int glyphIndex); /** * Sets the affine transform to a glyph with the specified index in this * GlyphVector. * * @param glyphIndex * the glyth index in this GlyphVector. * @param trans * the AffineTransform to be assigned to the specified glyph. */ public abstract void setGlyphTransform(int glyphIndex, AffineTransform trans); /** * Gets the transform of the specified glyph in this GlyphVector. * * @param glyphIndex * the glyph index in this GlyphVector. * @return the new transform of the glyph. */ public abstract AffineTransform getGlyphTransform(int glyphIndex); /** * Compares this GlyphVector with the specified GlyphVector objects. * * @param glyphVector * the GlyphVector object to be compared. * @return true, if this GlyphVector is equal to the specified GlyphVector * object, false otherwise. */ public abstract boolean equals(GlyphVector glyphVector); /** * Gets the metrics of the glyph with the specified index in this * GlyphVector. * * @param glyphIndex * index in this GlyphVector. * @return the metrics of the glyph with the specified index in this * GlyphVector. */ public abstract GlyphMetrics getGlyphMetrics(int glyphIndex); /** * Gets the justification information of the glyph whose index is specified. * * @param glyphIndex * the glyph index. * @return the GlyphJustificationInfo for the specified glyph. */ public abstract GlyphJustificationInfo getGlyphJustificationInfo(int glyphIndex); /** * Gets the FontRenderContext of this GlyphVector. * * @return the FontRenderContext of this GlyphVector. */ public abstract FontRenderContext getFontRenderContext(); /** * Gets a Shape object which defines the visual representation of the * specified glyph in this GlyphVector, translated a distance of x in the X * direction and y in the Y direction. * * @param glyphIndex * the glyth index in this GlyphVector. * @param x * the distance in the X direction to translate the shape object * before returning it. * @param y * the distance in the Y direction to translate the shape object * before returning it. * @return a Shape object which represents the visual representation of the * specified glyph in this GlyphVector - glyph outline. */ public Shape getGlyphOutline(int glyphIndex, float x, float y) { Shape initialShape = getGlyphOutline(glyphIndex); AffineTransform trans = AffineTransform.getTranslateInstance(x, y); return trans.createTransformedShape(initialShape); } /** * Gets the visual bounds of the specified glyph in the GlyphVector. * * @param glyphIndex * the glyph index in this GlyphVector. * @return the glyph visual bounds of the glyph with the specified index in * the GlyphVector. */ public abstract Shape getGlyphVisualBounds(int glyphIndex); /** * Gets a Shape object which defines the visual representation of the * specified glyph in this GlyphVector. * * @param glyphIndex * the glyth index in this GlyphVector. * @return a Shape object which represents the visual representation of the * specified glyph in this GlyphVector - glyph outline. */ public abstract Shape getGlyphOutline(int glyphIndex); /** * Gets the logical bounds of the specified glyph in the GlyphVector. * * @param glyphIndex * the index in this GlyphVector of the glyph from which to * retrieve its logical bounds * @return the logical bounds of the specified glyph in the GlyphVector. */ public abstract Shape getGlyphLogicalBounds(int glyphIndex); /** * Gets the visual representation of this GlyphVector rendered in x, y * location as a Shape object. * * @param x * the x coordinate of the GlyphVector. * @param y * the y coordinate of the GlyphVector. * @return the visual representation of this GlyphVector as a Shape object. */ public abstract Shape getOutline(float x, float y); /** * Gets the visual representation of this GlyphVector as a Shape object. * * @return the visual representation of this GlyphVector as a Shape object. */ public abstract Shape getOutline(); /** * Gets the font of this GlyphVector. * * @return the font of this GlyphVector. */ public abstract Font getFont(); /** * Gets an array of the glyph codes of the specified glyphs. * * @param beginGlyphIndex * the index into this GlyphVector at which to start retrieving * glyph codes. * @param numEntries * the number of glyph codes. * @param codeReturn * the array into which the resulting glyphcodes will be written. * @return the array of the glyph codes. */ public abstract int[] getGlyphCodes(int beginGlyphIndex, int numEntries, int[] codeReturn); /** * Gets an array of the character indices of the specified glyphs. * * @param beginGlyphIndex * the index of the first glyph to return information for. * @param numEntries * the number of glyph indices to return. * @param codeReturn * the array into which the resulting character indices will be * written. * @return an array of character indices for the specifies glyphs. */ public int[] getGlyphCharIndices(int beginGlyphIndex, int numEntries, int[] codeReturn) { if (codeReturn == null) { codeReturn = new int[numEntries]; } for (int i = 0; i < numEntries; i++) { codeReturn[i] = getGlyphCharIndex(i + beginGlyphIndex); } return codeReturn; } /** * Gets an array of the positions of the specified glyphs in this * GlyphVector. * * @param beginGlyphIndex * the index of the first glyph to return information for. * @param numEntries * the number of glyphs to return information for. * @param positionReturn * the array where the result will be stored. * @return an array of glyph positions. */ public abstract float[] getGlyphPositions(int beginGlyphIndex, int numEntries, float[] positionReturn); /** * Gets the glyph code of the specified glyph. * * @param glyphIndex * the index in this GlyphVector which corresponds to the glyph * from which to retrieve the glyphcode. * @return the glyphcode of the specified glyph. */ public abstract int getGlyphCode(int glyphIndex); /** * Gets the first logical character's index of the specified glyph. * * @param glyphIndex * the glyph index. * @return the the first logical character's index. */ public int getGlyphCharIndex(int glyphIndex) { // default implemetation one-to-one return glyphIndex; } /** * Sets default layout to this GlyphVector. */ public abstract void performDefaultLayout(); /** * Gets the number of glyphs in the GlyphVector. * * @return the number of glyphs in the GlyphVector. */ public abstract int getNumGlyphs(); /** * Gets flags which describe the global state of the GlyphVector. The * default implementation returns 0. * * @return the layout flags */ public int getLayoutFlags() { // default implementation - returned value is 0 return 0; } }