404 lines
13 KiB
Java
404 lines
13 KiB
Java
/*
|
|
* 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;
|
|
}
|
|
|
|
}
|