src/java.desktop/macosx/classes/sun/font/CFont.java
author clanger
Fri, 28 Sep 2018 06:39:52 +0100
changeset 52239 80b2fa2bf60b
parent 50348 008f416a79cb
child 54590 98473958d49a
permissions -rw-r--r--
8211218: remove double semicolon in src/java.desktop/macosx/classes/sun/font/CFont.java Reviewed-by: serb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     1
/*
43824
a77cc25713e9 8147002: [macosx] Arabic character cannot be rendered on MacOS X
psadhukhan
parents: 40723
diff changeset
     2
 * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     4
 *
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    10
 *
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    15
 * accompanied this code).
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    16
 *
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    20
 *
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    23
 * questions.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    24
 */
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    25
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    26
package sun.font;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    27
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    28
import java.awt.Font;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    29
import java.awt.font.FontRenderContext;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    30
import java.awt.geom.AffineTransform;
52239
80b2fa2bf60b 8211218: remove double semicolon in src/java.desktop/macosx/classes/sun/font/CFont.java
clanger
parents: 50348
diff changeset
    31
import java.awt.geom.GeneralPath;
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    32
import java.awt.geom.Point2D;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    33
import java.awt.geom.Rectangle2D;
34399
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
    34
import java.util.ArrayList;
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    35
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    36
// Right now this class is final to avoid a problem with native code.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    37
// For some reason the JNI IsInstanceOf was not working correctly
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    38
// so we are checking the class specifically. If we subclass this
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    39
// we need to modify the native code in CFontWrapper.m
34399
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
    40
public final class CFont extends PhysicalFont implements FontSubstitution {
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    41
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    42
    /* CFontStrike doesn't call these methods so they are unimplemented.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    43
     * They are here to meet the requirements of PhysicalFont, needed
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    44
     * because a CFont can sometimes be returned where a PhysicalFont
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    45
     * is expected.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    46
     */
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    47
    StrikeMetrics getFontMetrics(long pScalerContext) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    48
       throw new InternalError("Not implemented");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    49
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    50
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    51
    float getGlyphAdvance(long pScalerContext, int glyphCode) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    52
       throw new InternalError("Not implemented");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    53
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    54
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    55
    void getGlyphMetrics(long pScalerContext, int glyphCode,
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    56
                                  Point2D.Float metrics) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    57
       throw new InternalError("Not implemented");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    58
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    59
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    60
    long getGlyphImage(long pScalerContext, int glyphCode) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    61
       throw new InternalError("Not implemented");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    62
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    63
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    64
    Rectangle2D.Float getGlyphOutlineBounds(long pScalerContext,
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    65
                                                     int glyphCode) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    66
       throw new InternalError("Not implemented");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    67
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    68
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    69
    GeneralPath getGlyphOutline(long pScalerContext, int glyphCode,
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    70
                                         float x, float y) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    71
       throw new InternalError("Not implemented");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    72
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    73
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    74
    GeneralPath getGlyphVectorOutline(long pScalerContext,
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    75
                                               int[] glyphs, int numGlyphs,
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    76
                                               float x, float y) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    77
       throw new InternalError("Not implemented");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    78
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    79
34399
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
    80
    @Override
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
    81
    protected long getLayoutTableCache() {
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
    82
        return getLayoutTableCacheNative(getNativeFontPtr());
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
    83
    }
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
    84
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
    85
    @Override
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
    86
    protected byte[] getTableBytes(int tag) {
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
    87
        return getTableBytesNative(getNativeFontPtr(), tag);
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
    88
    }
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
    89
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
    90
    private native synchronized long getLayoutTableCacheNative(long nativeFontPtr);
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
    91
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
    92
    private native byte[] getTableBytesNative(long nativeFontPtr, int tag);
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
    93
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    94
    private static native long createNativeFont(final String nativeFontName,
28996
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
    95
                                                final int style);
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    96
    private static native void disposeNativeFont(final long nativeFontPtr);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    97
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    98
    private boolean isFakeItalic;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    99
    private String nativeFontName;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   100
    private long nativeFontPtr;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   101
28996
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   102
    private native float getWidthNative(final long nativeFontPtr);
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   103
    private native float getWeightNative(final long nativeFontPtr);
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   104
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   105
    private int fontWidth = -1;
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   106
    private int fontWeight = -1;
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   107
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   108
    @Override
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   109
    public int getWidth() {
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   110
        if (fontWidth == -1) {
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   111
            // Apple use a range of -1 -> +1, where 0.0 is normal
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   112
            // OpenType uses a % range from 50% -> 200% where 100% is normal
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   113
            // and maps these onto the integer values 1->9.
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   114
            // Since that is what Font2D.getWidth() expects, remap to that.
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   115
            float fw = getWidthNative(getNativeFontPtr());
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   116
            if (fw == 0.0) { // short cut the common case
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   117
                fontWidth = Font2D.FWIDTH_NORMAL;
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   118
                return fontWidth;
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   119
            }
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   120
            fw += 1.0; fw *= 100.0;
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   121
            if (fw <= 50.0) {
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   122
                fontWidth = 1;
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   123
            } else if (fw <= 62.5) {
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   124
                fontWidth = 2;
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   125
            } else if (fw <= 75.0) {
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   126
                fontWidth = 3;
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   127
            } else if (fw <= 87.5) {
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   128
                fontWidth = 4;
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   129
            } else if (fw <= 100.0) {
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   130
                fontWidth = 5;
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   131
            } else if (fw <= 112.5) {
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   132
                fontWidth = 6;
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   133
            } else if (fw <= 125.0) {
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   134
                fontWidth = 7;
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   135
            } else if (fw <= 150.0) {
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   136
                fontWidth = 8;
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   137
            } else {
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   138
                fontWidth = 9;
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   139
            }
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   140
        }
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   141
        return fontWidth;
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   142
   }
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   143
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   144
    @Override
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   145
    public int getWeight() {
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   146
        if (fontWeight == -1) {
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   147
            // Apple use a range of -1 -> +1, where 0 is medium/regular
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   148
            // Map this on to the OpenType range of 100->900 where
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   149
            // 500 is medium/regular.
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   150
            // We'll actually map to 0->1000 but that's close enough.
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   151
            float fw = getWeightNative(getNativeFontPtr());
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   152
            if (fw == 0) {
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   153
               return Font2D.FWEIGHT_NORMAL;
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   154
            }
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   155
            fw += 1.0; fw *= 500;
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   156
            fontWeight = (int)fw;
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   157
          }
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   158
          return fontWeight;
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   159
    }
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   160
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   161
    // this constructor is called from CFontWrapper.m
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   162
    public CFont(String name) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   163
        this(name, name);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   164
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   165
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   166
    public CFont(String name, String inFamilyName) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   167
        handle = new Font2DHandle(this);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   168
        fullName = name;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   169
        familyName = inFamilyName;
28996
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   170
        nativeFontName = fullName;
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   171
        setStyle();
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   172
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   173
28996
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   174
    /* Called from CFontManager too */
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   175
    public CFont(CFont other, String logicalFamilyName) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   176
        handle = new Font2DHandle(this);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   177
        fullName = logicalFamilyName;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   178
        familyName = logicalFamilyName;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   179
        nativeFontName = other.nativeFontName;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   180
        style = other.style;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   181
        isFakeItalic = other.isFakeItalic;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   182
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   183
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   184
    public CFont createItalicVariant() {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   185
        CFont font = new CFont(this, familyName);
28996
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   186
        font.nativeFontName = fullName;
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   187
        font.fullName =
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   188
            fullName + (style == Font.BOLD ? "" : "-") + "Italic-Derived";
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   189
        font.style |= Font.ITALIC;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   190
        font.isFakeItalic = true;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   191
        return font;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   192
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   193
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   194
    protected synchronized long getNativeFontPtr() {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   195
        if (nativeFontPtr == 0L) {
28996
4d9228fac01a 8064833: [macosx] Native font lookup uses family+style, not full name/postscript name
prr
parents: 25859
diff changeset
   196
            nativeFontPtr = createNativeFont(nativeFontName, style);
34399
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   197
        }
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   198
        return nativeFontPtr;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   199
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   200
34414
e496a8d8fc8a 8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents: 34399
diff changeset
   201
    private native long getCGFontPtrNative(long ptr);
e496a8d8fc8a 8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents: 34399
diff changeset
   202
e496a8d8fc8a 8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents: 34399
diff changeset
   203
    // This digs the CGFont out of the AWTFont.
e496a8d8fc8a 8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents: 34399
diff changeset
   204
    protected synchronized long getPlatformNativeFontPtr() {
e496a8d8fc8a 8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents: 34399
diff changeset
   205
        return getCGFontPtrNative(getNativeFontPtr());
e496a8d8fc8a 8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents: 34399
diff changeset
   206
    }
e496a8d8fc8a 8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents: 34399
diff changeset
   207
34399
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   208
    static native void getCascadeList(long nativeFontPtr, ArrayList<String> listOfString);
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   209
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   210
    private CompositeFont createCompositeFont() {
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   211
        ArrayList<String> listOfString = new ArrayList<String>();
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   212
        getCascadeList(nativeFontPtr, listOfString);
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   213
50348
008f416a79cb 8191522: Remove Bigelow&Holmes Lucida fonts from JDK sources
prr
parents: 47216
diff changeset
   214
        // In some italic cases the standard Mac cascade list is missing Arabic.
008f416a79cb 8191522: Remove Bigelow&Holmes Lucida fonts from JDK sources
prr
parents: 47216
diff changeset
   215
        listOfString.add("GeezaPro");
34399
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   216
        FontManager fm = FontManagerFactory.getInstance();
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   217
        int numFonts = 1 + listOfString.size();
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   218
        PhysicalFont[] fonts = new PhysicalFont[numFonts];
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   219
        fonts[0] = this;
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   220
        int idx = 1;
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   221
        for (String s : listOfString) {
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   222
            if (s.equals(".AppleSymbolsFB"))  {
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   223
                // Don't know why we get the weird name above .. replace.
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   224
                s = "AppleSymbols";
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   225
            }
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   226
            Font2D f2d = fm.findFont2D(s, Font.PLAIN, FontManager.NO_FALLBACK);
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   227
            if (f2d == null || f2d == this) {
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   228
                continue;
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   229
            }
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   230
            fonts[idx++] = (PhysicalFont)f2d;
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   231
        }
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   232
        if (idx < fonts.length) {
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   233
            PhysicalFont[] orig = fonts;
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   234
            fonts = new PhysicalFont[idx];
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   235
            System.arraycopy(orig, 0, fonts, 0, idx);
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   236
        }
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   237
        CompositeFont compFont = new CompositeFont(fonts);
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   238
        compFont.mapper = new CCompositeGlyphMapper(compFont);
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   239
        return compFont;
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   240
    }
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   241
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   242
    private CompositeFont compFont;
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   243
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   244
    public CompositeFont getCompositeFont2D() {
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   245
        if (compFont == null) {
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   246
           compFont = createCompositeFont();
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   247
        }
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   248
        return compFont;
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   249
    }
7ea60f3aab93 7162125: [macosx] A font has different behaviour for ligatures depending on its creation mod
prr
parents: 28996
diff changeset
   250
44534
a076dffbc2c1 8165641: Deprecate Object.finalize
rriggs
parents: 43824
diff changeset
   251
    @SuppressWarnings("deprecation")
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   252
    protected synchronized void finalize() {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   253
        if (nativeFontPtr != 0) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   254
            disposeNativeFont(nativeFontPtr);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   255
        }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   256
        nativeFontPtr = 0;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   257
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   258
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   259
    protected CharToGlyphMapper getMapper() {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   260
        if (mapper == null) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   261
            mapper = new CCharToGlyphMapper(this);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   262
        }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   263
        return mapper;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   264
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   265
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   266
    protected FontStrike createStrike(FontStrikeDesc desc) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   267
        if (isFakeItalic) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   268
            desc = new FontStrikeDesc(desc);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   269
            desc.glyphTx.concatenate(AffineTransform.getShearInstance(-0.2, 0));
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   270
        }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   271
        return new CStrike(this, desc);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   272
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   273
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   274
    // <rdar://problem/5321707> sun.font.Font2D caches the last used strike,
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   275
    // but does not check if the properties of the strike match the properties
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   276
    // of the incoming java.awt.Font object (size, style, etc).
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   277
    // Simple answer: don't cache.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   278
    private static FontRenderContext DEFAULT_FRC =
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   279
        new FontRenderContext(null, false, false);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   280
    public FontStrike getStrike(final Font font) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   281
        return getStrike(font, DEFAULT_FRC);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   282
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   283
40723
27ae46468527 8139176: [macosx] java.awt.TextLayout does not handle correctly the bolded logical fonts
prr
parents: 34414
diff changeset
   284
    public boolean equals(Object o) {
27ae46468527 8139176: [macosx] java.awt.TextLayout does not handle correctly the bolded logical fonts
prr
parents: 34414
diff changeset
   285
         if (!super.equals(o)) {
27ae46468527 8139176: [macosx] java.awt.TextLayout does not handle correctly the bolded logical fonts
prr
parents: 34414
diff changeset
   286
             return false;
27ae46468527 8139176: [macosx] java.awt.TextLayout does not handle correctly the bolded logical fonts
prr
parents: 34414
diff changeset
   287
         }
27ae46468527 8139176: [macosx] java.awt.TextLayout does not handle correctly the bolded logical fonts
prr
parents: 34414
diff changeset
   288
27ae46468527 8139176: [macosx] java.awt.TextLayout does not handle correctly the bolded logical fonts
prr
parents: 34414
diff changeset
   289
         return ((Font2D)o).getStyle() == this.getStyle();
27ae46468527 8139176: [macosx] java.awt.TextLayout does not handle correctly the bolded logical fonts
prr
parents: 34414
diff changeset
   290
    }
27ae46468527 8139176: [macosx] java.awt.TextLayout does not handle correctly the bolded logical fonts
prr
parents: 34414
diff changeset
   291
27ae46468527 8139176: [macosx] java.awt.TextLayout does not handle correctly the bolded logical fonts
prr
parents: 34414
diff changeset
   292
    public int hashCode() {
27ae46468527 8139176: [macosx] java.awt.TextLayout does not handle correctly the bolded logical fonts
prr
parents: 34414
diff changeset
   293
        return super.hashCode() ^ this.getStyle();
27ae46468527 8139176: [macosx] java.awt.TextLayout does not handle correctly the bolded logical fonts
prr
parents: 34414
diff changeset
   294
    }
27ae46468527 8139176: [macosx] java.awt.TextLayout does not handle correctly the bolded logical fonts
prr
parents: 34414
diff changeset
   295
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   296
    public String toString() {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   297
        return "CFont { fullName: " + fullName +
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   298
            ",  familyName: " + familyName + ", style: " + style +
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   299
            " } aka: " + super.toString();
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   300
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   301
}