FreetypeFontScaler.java revision 3909
0N/A/*
0N/A * Copyright (c) 2007, 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
0N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
0N/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 *
0N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
0N/A * or visit www.oracle.com if you need additional information or have any
0N/A * questions.
0N/A */
0N/A
0N/Apackage sun.font;
0N/A
0N/Aimport java.awt.geom.GeneralPath;
0N/Aimport java.awt.geom.Point2D;
0N/Aimport java.awt.geom.Rectangle2D;
0N/Aimport java.lang.ref.WeakReference;
0N/A
0N/A/* This is Freetype based implementation of FontScaler.
0N/A *
0N/A * Note that in case of runtime error it is expected that
0N/A * native code will release all native resources and
0N/A * call invalidateScaler() (that will throw FontScalerException).
0N/A *
0N/A * Note that callee is responsible for releasing native scaler context.
0N/A */
0N/Aclass FreetypeFontScaler extends FontScaler {
0N/A /* constants aligned with native code */
0N/A private static final int TRUETYPE_FONT = 1;
0N/A private static final int TYPE1_FONT = 2;
0N/A
0N/A static {
0N/A /* At the moment fontmanager library depends on freetype library
0N/A and therefore no need to load it explicitly here */
0N/A FontManagerNativeLibrary.load();
0N/A initIDs(FreetypeFontScaler.class);
0N/A }
0N/A
0N/A private static native void initIDs(Class FFS);
0N/A
0N/A private void invalidateScaler() throws FontScalerException {
0N/A nativeScaler = 0;
0N/A font = null;
0N/A throw new FontScalerException();
0N/A }
0N/A
0N/A public FreetypeFontScaler(Font2D font, int indexInCollection,
0N/A boolean supportsCJK, int filesize) {
0N/A int fonttype = TRUETYPE_FONT;
0N/A if (font instanceof Type1Font) {
0N/A fonttype = TYPE1_FONT;
0N/A }
0N/A nativeScaler = initNativeScaler(font,
0N/A fonttype,
0N/A indexInCollection,
0N/A supportsCJK,
0N/A filesize);
0N/A this.font = new WeakReference(font);
0N/A }
0N/A
0N/A synchronized StrikeMetrics getFontMetrics(long pScalerContext)
0N/A throws FontScalerException {
0N/A if (nativeScaler != 0L) {
0N/A return getFontMetricsNative(font.get(),
0N/A pScalerContext,
0N/A nativeScaler);
0N/A }
0N/A return FontScaler.getNullScaler().getFontMetrics(0L);
0N/A }
0N/A
synchronized float getGlyphAdvance(long pScalerContext, int glyphCode)
throws FontScalerException {
if (nativeScaler != 0L) {
return getGlyphAdvanceNative(font.get(),
pScalerContext,
nativeScaler,
glyphCode);
}
return FontScaler.getNullScaler().
getGlyphAdvance(0L, glyphCode);
}
synchronized void getGlyphMetrics(long pScalerContext,
int glyphCode, Point2D.Float metrics)
throws FontScalerException {
if (nativeScaler != 0L) {
getGlyphMetricsNative(font.get(),
pScalerContext,
nativeScaler,
glyphCode,
metrics);
return;
}
FontScaler.getNullScaler().
getGlyphMetrics(0L, glyphCode, metrics);
}
synchronized long getGlyphImage(long pScalerContext, int glyphCode)
throws FontScalerException {
if (nativeScaler != 0L) {
return getGlyphImageNative(font.get(),
pScalerContext,
nativeScaler,
glyphCode);
}
return FontScaler.getNullScaler().
getGlyphImage(0L, glyphCode);
}
synchronized Rectangle2D.Float getGlyphOutlineBounds(
long pScalerContext, int glyphCode)
throws FontScalerException {
if (nativeScaler != 0L) {
return getGlyphOutlineBoundsNative(font.get(),
pScalerContext,
nativeScaler,
glyphCode);
}
return FontScaler.getNullScaler().
getGlyphOutlineBounds(0L,glyphCode);
}
synchronized GeneralPath getGlyphOutline(
long pScalerContext, int glyphCode, float x, float y)
throws FontScalerException {
if (nativeScaler != 0L) {
return getGlyphOutlineNative(font.get(),
pScalerContext,
nativeScaler,
glyphCode,
x, y);
}
return FontScaler.getNullScaler().
getGlyphOutline(0L, glyphCode, x,y);
}
synchronized GeneralPath getGlyphVectorOutline(
long pScalerContext, int[] glyphs, int numGlyphs,
float x, float y) throws FontScalerException {
if (nativeScaler != 0L) {
return getGlyphVectorOutlineNative(font.get(),
pScalerContext,
nativeScaler,
glyphs,
numGlyphs,
x, y);
}
return FontScaler
.getNullScaler().getGlyphVectorOutline(0L, glyphs, numGlyphs, x, y);
}
synchronized long getLayoutTableCache() throws FontScalerException {
return getLayoutTableCacheNative(nativeScaler);
}
public synchronized void dispose() {
if (nativeScaler != 0L) {
disposeNativeScaler(nativeScaler);
nativeScaler = 0L;
}
}
synchronized int getNumGlyphs() throws FontScalerException {
if (nativeScaler != 0L) {
return getNumGlyphsNative(nativeScaler);
}
return FontScaler.getNullScaler().getNumGlyphs();
}
synchronized int getMissingGlyphCode() throws FontScalerException {
if (nativeScaler != 0L) {
return getMissingGlyphCodeNative(nativeScaler);
}
return FontScaler.getNullScaler().getMissingGlyphCode();
}
synchronized int getGlyphCode(char charCode) throws FontScalerException {
if (nativeScaler != 0L) {
return getGlyphCodeNative(nativeScaler, charCode);
}
return FontScaler.getNullScaler().getGlyphCode(charCode);
}
synchronized Point2D.Float getGlyphPoint(long pScalerContext,
int glyphCode, int ptNumber)
throws FontScalerException {
if (nativeScaler != 0L) {
return getGlyphPointNative(font.get(), pScalerContext,
nativeScaler, glyphCode, ptNumber);
}
return FontScaler.getNullScaler().getGlyphPoint(
pScalerContext, glyphCode, ptNumber);
}
synchronized long getUnitsPerEm() {
return getUnitsPerEMNative(nativeScaler);
}
long createScalerContext(double[] matrix, boolean fontType,
int aa, int fm, float boldness, float italic,
boolean disableHinting) {
if (nativeScaler != 0L) {
return createScalerContextNative(nativeScaler, matrix,
fontType, aa, fm, boldness, italic);
}
return NullFontScaler.getNullScalerContext();
}
//Note: native methods can throw RuntimeException if processing fails
private native long initNativeScaler(Font2D font, int type,
int indexInCollection, boolean supportsCJK, int filesize);
private native StrikeMetrics getFontMetricsNative(Font2D font,
long pScalerContext, long pScaler);
private native float getGlyphAdvanceNative(Font2D font,
long pScalerContext, long pScaler, int glyphCode);
private native void getGlyphMetricsNative(Font2D font,
long pScalerContext, long pScaler,
int glyphCode, Point2D.Float metrics);
private native long getGlyphImageNative(Font2D font,
long pScalerContext, long pScaler, int glyphCode);
private native Rectangle2D.Float getGlyphOutlineBoundsNative(Font2D font,
long pScalerContext, long pScaler, int glyphCode);
private native GeneralPath getGlyphOutlineNative(Font2D font,
long pScalerContext, long pScaler,
int glyphCode, float x, float y);
private native GeneralPath getGlyphVectorOutlineNative(Font2D font,
long pScalerContext, long pScaler,
int[] glyphs, int numGlyphs, float x, float y);
native Point2D.Float getGlyphPointNative(Font2D font,
long pScalerContext, long pScaler, int glyphCode, int ptNumber);
private native long getLayoutTableCacheNative(long pScaler);
private native void disposeNativeScaler(long pScaler);
private native int getGlyphCodeNative(long pScaler, char charCode);
private native int getNumGlyphsNative(long pScaler);
private native int getMissingGlyphCodeNative(long pScaler);
private native long getUnitsPerEMNative(long pScaler);
native long createScalerContextNative(long pScaler, double[] matrix,
boolean fontType, int aa, int fm, float boldness, float italic);
/* Freetype scaler context does not contain any pointers that
has to be invalidated if native scaler is bad */
void invalidateScalerContext(long pScalerContext) {}
}