0N/A/*
2362N/A * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/Apackage sun.font;
0N/A
0N/Aimport java.awt.Font;
0N/Aimport java.awt.font.FontRenderContext;
0N/Aimport java.awt.geom.AffineTransform;
1245N/Aimport java.awt.geom.GeneralPath;;
0N/Aimport java.awt.geom.Point2D;
0N/Aimport java.awt.geom.Rectangle2D;
0N/A
0N/A// Right now this class is final to avoid a problem with native code.
0N/A// For some reason the JNI IsInstanceOf was not working correctly
0N/A// so we are checking the class specifically. If we subclass this
0N/A// we need to modify the native code in CFontWrapper.m
0N/Apublic final class CFont extends PhysicalFont {
0N/A
0N/A /* CFontStrike doesn't call these methods so they are unimplemented.
0N/A * They are here to meet the requirements of PhysicalFont, needed
0N/A * because a CFont can sometimes be returned where a PhysicalFont
0N/A * is expected.
0N/A */
0N/A StrikeMetrics getFontMetrics(long pScalerContext) {
0N/A throw new InternalError("Not implemented");
0N/A }
0N/A
0N/A float getGlyphAdvance(long pScalerContext, int glyphCode) {
1245N/A throw new InternalError("Not implemented");
1245N/A }
1245N/A
1245N/A void getGlyphMetrics(long pScalerContext, int glyphCode,
1245N/A Point2D.Float metrics) {
0N/A throw new InternalError("Not implemented");
0N/A }
0N/A
1245N/A long getGlyphImage(long pScalerContext, int glyphCode) {
0N/A throw new InternalError("Not implemented");
0N/A }
1245N/A
1245N/A Rectangle2D.Float getGlyphOutlineBounds(long pScalerContext,
1245N/A int glyphCode) {
0N/A throw new InternalError("Not implemented");
1245N/A }
1245N/A
1245N/A GeneralPath getGlyphOutline(long pScalerContext, int glyphCode,
1245N/A float x, float y) {
1245N/A throw new InternalError("Not implemented");
1245N/A }
1245N/A
1245N/A GeneralPath getGlyphVectorOutline(long pScalerContext,
1245N/A int[] glyphs, int numGlyphs,
1245N/A float x, float y) {
1245N/A throw new InternalError("Not implemented");
1245N/A }
1245N/A
1245N/A private static native long createNativeFont(final String nativeFontName,
1245N/A final int style,
0N/A final boolean isFakeItalic);
0N/A private static native void disposeNativeFont(final long nativeFontPtr);
0N/A
private boolean isFakeItalic;
private String nativeFontName;
private long nativeFontPtr;
// this constructor is called from CFontWrapper.m
public CFont(String name) {
this(name, name);
}
public CFont(String name, String inFamilyName) {
handle = new Font2DHandle(this);
fullName = name;
familyName = inFamilyName;
nativeFontName = inFamilyName;
setStyle();
}
public CFont(CFont other, String logicalFamilyName) {
handle = new Font2DHandle(this);
fullName = logicalFamilyName;
familyName = logicalFamilyName;
nativeFontName = other.nativeFontName;
style = other.style;
isFakeItalic = other.isFakeItalic;
}
public CFont createItalicVariant() {
CFont font = new CFont(this, familyName);
font.fullName =
fullName + (style == Font.BOLD ? "" : "-") + "Italic-Derived";
font.style |= Font.ITALIC;
font.isFakeItalic = true;
return font;
}
protected synchronized long getNativeFontPtr() {
if (nativeFontPtr == 0L) {
nativeFontPtr = createNativeFont(nativeFontName, style, isFakeItalic);
}
return nativeFontPtr;
}
protected synchronized void finalize() {
if (nativeFontPtr != 0) {
disposeNativeFont(nativeFontPtr);
}
nativeFontPtr = 0;
}
protected CharToGlyphMapper getMapper() {
if (mapper == null) {
mapper = new CCharToGlyphMapper(this);
}
return mapper;
}
protected FontStrike createStrike(FontStrikeDesc desc) {
if (isFakeItalic) {
desc = new FontStrikeDesc(desc);
desc.glyphTx.concatenate(AffineTransform.getShearInstance(-0.2, 0));
}
return new CStrike(this, desc);
}
// <rdar://problem/5321707> sun.font.Font2D caches the last used strike,
// but does not check if the properties of the strike match the properties
// of the incoming java.awt.Font object (size, style, etc).
// Simple answer: don't cache.
private static FontRenderContext DEFAULT_FRC =
new FontRenderContext(null, false, false);
public FontStrike getStrike(final Font font) {
return getStrike(font, DEFAULT_FRC);
}
public String toString() {
return "CFont { fullName: " + fullName +
", familyName: " + familyName + ", style: " + style +
" } aka: " + super.toString();
}
}