blob: a72b774bfad252143f09b7a59234bc797caecaeb [file] [log] [blame]
/*
* 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;
}
}