/* * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package sun.font; import java.awt.FontFormatException; import java.awt.geom.GeneralPath; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.io.FileInputStream; import java.lang.ref.WeakReference; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public abstract class PhysicalFont extends Font2D { protected String platName; // nativeNames is a String or a (possibly null) String[]. protected Object nativeNames; public boolean equals(Object o) { return (o != null && o.getClass() == this.getClass() && ((Font2D)o).fullName.equals(this.fullName)); } public int hashCode() { return fullName.hashCode(); } /** * Opens the file (temporarily) and does basic verification. * Initializes the CMAP * @throws FontFormatException if the font can't be opened * or fails verification, or there's no usable cmap */ PhysicalFont(String platname, Object nativeNames) throws FontFormatException { handle = new Font2DHandle(this); this.platName = platname; this.nativeNames = nativeNames; } protected PhysicalFont() { handle = new Font2DHandle(this); } /* The following methods are delegated to the font by the strike * for physical fonts as the PhysicalFont holds a shared reference * to the native resource, so all invocations need to be directed * through a synchronization point. Implementations of these methods * will typically be "synchronized native" */ Point2D.Float getGlyphPoint(long pScalerContext, int glyphCode, int ptNumber) { return new Point2D.Float(); } @Override protected boolean isAAT() { return getTableBytes(TrueTypeFont.morxTag) != null || getTableBytes(TrueTypeFont.mortTag) != null; } /* These 3 metrics methods should be implemented to return * values in user space. */ abstract StrikeMetrics getFontMetrics(long pScalerContext); abstract float getGlyphAdvance(long pScalerContext, int glyphCode); abstract void getGlyphMetrics(long pScalerContext, int glyphCode, Point2D.Float metrics); abstract long getGlyphImage(long pScalerContext, int glyphCode); /* These 3 outline methods should be implemented to return * values in device space. Callers need to be aware of this * as typically Java client code will need to have them in user space. */ abstract Rectangle2D.Float getGlyphOutlineBounds(long pScalerContext, int glyphCode); abstract GeneralPath getGlyphOutline(long pScalerContext, int glyphCode, float x, float y); abstract GeneralPath getGlyphVectorOutline(long pScalerContext, int[] glyphs, int numGlyphs, float x, float y); }