| /* |
| * 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 org.apache.harmony.awt.gl.font; |
| |
| import java.awt.Shape; |
| import java.awt.font.GlyphJustificationInfo; |
| import java.awt.font.GlyphMetrics; |
| import java.awt.image.BufferedImage; |
| |
| public abstract class Glyph{ |
| |
| // character of the glyph |
| char glChar; |
| |
| // precise glyph metrics |
| GlyphMetrics glMetrics; |
| |
| // glyph metrics in pixels |
| GlyphMetrics glPointMetrics; |
| |
| // glyph code of this Glyph |
| int glCode; |
| |
| // justification info of this glyph |
| GlyphJustificationInfo glJustInfo; |
| |
| // native font handle of the font corresponding to this glyph |
| long pFont; |
| |
| // size of the font corresponding to this glyph |
| int fontSize; |
| |
| // bitmap representation of the glyph |
| byte[] bitmap = null; |
| |
| // Buffered image representation of the glyph |
| BufferedImage image; |
| |
| // shape that representing the outline of this glyph |
| Shape glOutline = null; |
| |
| /** |
| * image bitmap parameters |
| */ |
| |
| // top side bearing |
| public int bmp_top = 0; |
| |
| // left side bearing |
| public int bmp_left = 0; |
| |
| // number of bytes in row |
| public int bmp_pitch; |
| |
| // number of rows |
| public int bmp_rows; |
| |
| // width of the row |
| public int bmp_width; |
| |
| /** |
| * Retruns handle to Native Font object |
| */ |
| public long getPFont(){ |
| return this.pFont; |
| } |
| |
| /** |
| * Retruns char value of this glyph object |
| */ |
| public char getChar(){ |
| return glChar; |
| } |
| |
| /** |
| * Retruns precise width of this glyph object |
| */ |
| public int getWidth(){ |
| return Math.round((float)glMetrics.getBounds2D().getWidth()); |
| } |
| |
| /** |
| * Retruns precise height of this glyph object |
| */ |
| public int getHeight(){ |
| return Math.round((float)glMetrics.getBounds2D().getHeight()); |
| } |
| |
| /** |
| * Retruns glyph code of this glyph object |
| */ |
| public int getGlyphCode(){ |
| return glCode; |
| } |
| |
| /** |
| * Retruns GlyphMetrics of this glyph object with precise metrics. |
| */ |
| public GlyphMetrics getGlyphMetrics(){ |
| return glMetrics; |
| } |
| |
| /** |
| * Retruns GlyphMetrics of this glyph object in pixels. |
| */ |
| public GlyphMetrics getGlyphPointMetrics(){ |
| return glPointMetrics; |
| } |
| |
| /** |
| * Retruns GlyphJustificationInfo of this glyph object |
| */ |
| public GlyphJustificationInfo getGlyphJustificationInfo(){ |
| return glJustInfo; |
| } |
| |
| /** |
| * Sets JustificationInfo of this glyph object |
| * |
| * @param newJustInfo GlyphJustificationInfo object to set to the Glyph object |
| */ |
| public void setGlyphJustificationInfo(GlyphJustificationInfo newJustInfo){ |
| this.glJustInfo = newJustInfo; |
| } |
| |
| /** |
| * Returns an int array of 3 elements, so-called ABC structure that contains |
| * the width of the character: |
| * 1st element = left side bearing of the glyph |
| * 2nd element = width of the glyph |
| * 3d element = right side bearing of the glyph |
| */ |
| public int[] getABC(){ |
| int[] abc = new int[3]; |
| abc[0] = (int)glMetrics.getLSB(); |
| abc[1] = (int)glMetrics.getBounds2D().getWidth(); |
| abc[2] = (int)glMetrics.getRSB(); |
| |
| return abc; |
| } |
| |
| /** |
| * Sets BufferedImage representation of this glyph to the specified parameter. |
| * |
| * @param newImage new BufferedImage object to be set as BufferedImage |
| * representation. |
| */ |
| public void setImage(BufferedImage newImage){ |
| this.image = newImage; |
| } |
| |
| /** |
| * Returns true if this Glyph and specified object are equal. |
| */ |
| @Override |
| public boolean equals(Object obj){ |
| if (obj == this) { |
| return true; |
| } |
| |
| if (obj != null) { |
| try { |
| Glyph gl = (Glyph)obj; |
| |
| return ((this.getChar() == gl.getChar()) |
| && (this.getGlyphMetrics().equals(gl.getGlyphMetrics())) |
| && (this.getGlyphCode() == gl.getGlyphCode())); |
| } catch (ClassCastException e) { |
| } |
| } |
| |
| return false; |
| } |
| |
| /** |
| * Returns height of the glyph in points. |
| */ |
| public int getPointHeight(){ |
| return (int)glPointMetrics.getBounds2D().getHeight(); |
| } |
| |
| /** |
| * Returns width of the glyph in points. |
| */ |
| public int getPointWidth(){ |
| return (int)glPointMetrics.getBounds2D().getWidth(); |
| } |
| |
| public Shape getShape(){ |
| if (glOutline == null){ |
| glOutline = initOutline(this.glChar); |
| } |
| return glOutline; |
| } |
| |
| /** |
| * Sets BufferedImage representation of this glyph. |
| */ |
| public BufferedImage getImage(){ |
| //!! Implementation classes must override this method |
| return null; |
| } |
| |
| /** |
| * Returns array of bytes, representing image of this glyph |
| */ |
| public abstract byte[] getBitmap(); |
| |
| /** |
| * Returns shape that represents outline of the specified character. |
| * |
| * @param c specified character |
| */ |
| public abstract Shape initOutline(char c); |
| |
| } |
| |
| |