| /* |
| * 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.geom.Rectangle2D; |
| |
| /** |
| * The GlyphMetrics class provides information about the size and shape of a |
| * single glyph. Each glyph has information to specify whether its baseline is |
| * horizontal or vertical as well as information on how it interacts with other |
| * characters in a text, given as one of the following types: STANDARD, |
| * LIGATURE, COMBINING, or COMPONENT. |
| * |
| * @since Android 1.0 |
| */ |
| public final class GlyphMetrics { |
| |
| // advance width of the glyph character cell |
| /** |
| * The advance x. |
| */ |
| private float advanceX; |
| |
| // advance height of the glyph character cell |
| /** |
| * The advance y. |
| */ |
| private float advanceY; |
| |
| // flag if the glyph horizontal |
| /** |
| * The horizontal. |
| */ |
| private boolean horizontal; |
| |
| // glyph type code |
| /** |
| * The glyph type. |
| */ |
| private byte glyphType; |
| |
| // bounding box for outline of the glyph |
| /** |
| * The bounds. |
| */ |
| private Rectangle2D.Float bounds; |
| |
| /** |
| * The Constant STANDARD indicates a glyph that represents a single |
| * character. |
| */ |
| public static final byte STANDARD = 0; |
| |
| /** |
| * The Constant LIGATURE indicates a glyph that represents multiple |
| * characters as a ligature. |
| */ |
| public static final byte LIGATURE = 1; |
| |
| /** |
| * The Constant COMBINING indicates a glyph which has no caret position |
| * between glyphs (for example umlaut). |
| */ |
| public static final byte COMBINING = 2; |
| |
| /** |
| * The Constant COMPONENT indicates a glyph with no corresponding character |
| * in the backing store. |
| */ |
| public static final byte COMPONENT = 3; |
| |
| /** |
| * The Constant WHITESPACE indicates a glyph without visual representation. |
| */ |
| public static final byte WHITESPACE = 4; |
| |
| /** |
| * Instantiates a new GlyphMetrics object with the specified parameters. |
| * |
| * @param horizontal |
| * specifies if metrics are for a horizontal baseline (true |
| * value), or a vertical baseline (false value). |
| * @param advanceX |
| * the X component of the glyph's advance. |
| * @param advanceY |
| * the Y component of the glyph's advance. |
| * @param bounds |
| * the glyph's bounds. |
| * @param glyphType |
| * the glyph's type. |
| */ |
| public GlyphMetrics(boolean horizontal, float advanceX, float advanceY, Rectangle2D bounds, |
| byte glyphType) { |
| this.horizontal = horizontal; |
| this.advanceX = advanceX; |
| this.advanceY = advanceY; |
| |
| this.bounds = new Rectangle2D.Float(); |
| this.bounds.setRect(bounds); |
| |
| this.glyphType = glyphType; |
| } |
| |
| /** |
| * Instantiates a new horizontal GlyphMetrics with the specified parameters. |
| * |
| * @param advanceX |
| * the X component of the glyph's advance. |
| * @param bounds |
| * the glyph's bounds. |
| * @param glyphType |
| * the glyph's type. |
| */ |
| public GlyphMetrics(float advanceX, Rectangle2D bounds, byte glyphType) { |
| this.advanceX = advanceX; |
| this.advanceY = 0; |
| |
| this.horizontal = true; |
| |
| this.bounds = new Rectangle2D.Float(); |
| this.bounds.setRect(bounds); |
| |
| this.glyphType = glyphType; |
| } |
| |
| /** |
| * Gets the glyph's bounds. |
| * |
| * @return glyph's bounds. |
| */ |
| public Rectangle2D getBounds2D() { |
| return (Rectangle2D.Float)this.bounds.clone(); |
| } |
| |
| /** |
| * Checks if this glyph is whitespace or not. |
| * |
| * @return true, if this glyph is whitespace, false otherwise. |
| */ |
| public boolean isWhitespace() { |
| return ((this.glyphType & 4) == WHITESPACE); |
| } |
| |
| /** |
| * Checks if this glyph is standard or not. |
| * |
| * @return true, if this glyph is standard, false otherwise. |
| */ |
| public boolean isStandard() { |
| return ((this.glyphType & 3) == STANDARD); |
| } |
| |
| /** |
| * Checks if this glyph is ligature or not. |
| * |
| * @return true, if this glyph is ligature, false otherwise. |
| */ |
| public boolean isLigature() { |
| return ((this.glyphType & 3) == LIGATURE); |
| } |
| |
| /** |
| * Checks if this glyph is component or not. |
| * |
| * @return true, if this glyph is component, false otherwise. |
| */ |
| public boolean isComponent() { |
| return ((this.glyphType & 3) == COMPONENT); |
| } |
| |
| /** |
| * Checks if this glyph is combining or not. |
| * |
| * @return true, if this glyph is combining, false otherwise. |
| */ |
| public boolean isCombining() { |
| return ((this.glyphType & 3) == COMBINING); |
| } |
| |
| /** |
| * Gets the glyph's type. |
| * |
| * @return the glyph's type. |
| */ |
| public int getType() { |
| return this.glyphType; |
| } |
| |
| /** |
| * Gets the distance from the right (for horizontal) or bottom (for |
| * vertical) of the glyph bounds to the advance. |
| * |
| * @return the distance from the right (for horizontal) or bottom (for |
| * vertical) of the glyph bounds to the advance. |
| */ |
| public float getRSB() { |
| if (this.horizontal) { |
| return this.advanceX - this.bounds.x - (float)this.bounds.getWidth(); |
| } |
| return this.advanceY - this.bounds.y - (float)this.bounds.getHeight(); |
| } |
| |
| /** |
| * Gets the distance from 0, 0 to the left (for horizontal) or top (for |
| * vertical) of the glyph bounds. |
| * |
| * @return the distance from 0, 0 to the left (for horizontal) or top (for |
| * vertical) of the glyph bounds. |
| */ |
| public float getLSB() { |
| if (this.horizontal) { |
| return this.bounds.x; |
| } |
| return this.bounds.y; |
| } |
| |
| /** |
| * Gets the Y component of the glyph's advance. |
| * |
| * @return the Y component of the glyph's advance. |
| */ |
| public float getAdvanceY() { |
| return this.advanceY; |
| } |
| |
| /** |
| * Gets the X component of the glyph's advance. |
| * |
| * @return the X component of the glyph's advance. |
| */ |
| public float getAdvanceX() { |
| return this.advanceX; |
| } |
| |
| /** |
| * Gets the glyph's advance along the baseline. |
| * |
| * @return the glyph's advance. |
| */ |
| public float getAdvance() { |
| if (this.horizontal) { |
| return this.advanceX; |
| } |
| return this.advanceY; |
| } |
| |
| } |