1/*
2 * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26#ifndef AWT_FONT_H
27#define AWT_FONT_H
28
29#include "awt.h"
30#include "awt_Object.h"
31
32#include "java_awt_Font.h"
33#include "sun_awt_windows_WFontMetrics.h"
34#include "sun_awt_FontDescriptor.h"
35#include "sun_awt_PlatformFont.h"
36
37
38/************************************************************************
39 * AwtFont utilities
40 */
41
42extern jboolean IsMultiFont(JNIEnv *env, jobject obj);
43
44#define GET_PLATFORMFONT(font)\
45    (env->CallObjectMethod(env, font, AwtFont::peerMID))
46
47
48/************************************************************************
49 * AwtFont class
50 */
51
52class AwtFont : public AwtObject {
53public:
54
55    /* int[] width field for sun.awt.windows.WFontDescriptor */
56    static jfieldID widthsID;
57
58    /* int fields for sun.awt.windows.WFontDescriptor */
59    static jfieldID ascentID;
60    static jfieldID descentID;
61    static jfieldID leadingID;
62    static jfieldID heightID;
63    static jfieldID maxAscentID;
64    static jfieldID maxDescentID;
65    static jfieldID maxHeightID;
66    static jfieldID maxAdvanceID;
67
68    /* sun.awt.FontDescriptor fontDescriptor field of sun.awt.CharsetString */
69    static jfieldID fontDescriptorID;
70    /* java.lang.String charsetString field of sun.awt.CharsetString */
71    static jfieldID charsetStringID;
72
73    /* java.lang.String nativeName field of sun.awt.FontDescriptor*/
74    static jfieldID nativeNameID;
75    /* boolean useUnicode field of sun.awt.FontDescriptor*/
76    static jfieldID useUnicodeID;
77
78    /* long field pData of java.awt.Font */
79    static jfieldID pDataID;
80    /* java.awt.peer.FontPeer field peer of java.awt.Font */
81    static jmethodID peerMID;
82    /* java.lang.String name field of java.awt.Font */
83    static jfieldID nameID;
84    /* int size field of java.awt.Font */
85    static jfieldID sizeID;
86    /* int style field of java.awt.Font */
87    static jfieldID styleID;
88
89    /* java.awt.Font peer field of java.awt.FontMetrics */
90    static jfieldID fontID;
91
92    /* sun.awt.FontConfiguration fontConfig field of sun.awt.PlatformFont */
93    static jfieldID fontConfigID;
94    /* FontDescriptor[] componentFonts field of sun.awt.PlatformFont */
95    static jfieldID componentFontsID;
96
97    /* String textComponentFontName field of sun.awt.windows.WFontPeer */
98    static jfieldID textComponentFontNameID;
99
100    /* String fontName field of sun.awt.windows.WDefaultFontCharset fields */
101    static jfieldID fontNameID;
102
103    static jmethodID makeConvertedMultiFontStringMID;
104
105    /* java.awt.Font methods */
106    static jmethodID getFontMID;
107
108    /* java.awt.FontMetrics methods */
109    static jmethodID getHeightMID;
110
111    /*
112     * The argument is used to determine how many handles of
113     * Windows font the instance has.
114     */
115    AwtFont(int num, JNIEnv *env, jobject javaFont);
116    ~AwtFont();    /* Releases all resources */
117
118    virtual void Dispose();
119
120    /*
121     * Access methods
122     */
123    INLINE int GetHFontNum()     { return m_hFontNum; }
124    INLINE HFONT GetHFont(int i) {
125        DASSERT(m_hFont[i] != NULL);
126        return m_hFont[i];
127    }
128
129    /* Used to keep English version unchanged as much as possiple. */
130    INLINE HFONT GetHFont() {
131        DASSERT(m_hFont[0] != NULL);
132        return m_hFont[0];
133    }
134    INLINE int GetInputHFontIndex() { return m_textInput; }
135
136    INLINE void SetAscent(int ascent) { m_ascent = ascent; }
137    INLINE int GetAscent()           { return m_ascent; }
138    INLINE int GetOverhang()         { return m_overhang; }
139
140    /*
141     * Font methods
142     */
143
144    /*
145     * Returns the AwtFont object associated with the pFontJavaObject.
146     * If none exists, create one.
147     */
148    static AwtFont* GetFont(JNIEnv *env, jobject font,
149                            jint angle=0, jfloat awScale=1.0f);
150
151    /*
152     * Creates the specified font.  name names the font.  style is a bit
153     * vector that describes the style of the font.  height is the point
154     * size of the font.
155     */
156    static AwtFont* Create(JNIEnv *env, jobject font,
157                           jint angle = 0, jfloat awScale=1.0f);
158    static HFONT CreateHFont(WCHAR* name, int style, int height,
159                             int angle = 0, float awScale=1.0f);
160
161    static void Cleanup();
162
163    /*
164     * FontMetrics methods
165     */
166
167    /*
168     * Loads the metrics of the associated font.  See Font.GetFont for
169     * purpose of pWS.  (Also, client should provide Font java object
170     * instead of getting it from the FontMetrics instance variable.)
171     */
172    static void LoadMetrics(JNIEnv *env, jobject fontMetrics);
173
174    /* Returns the AwtFont associated with this metrics. */
175    static AwtFont* GetFontFromMetrics(JNIEnv *env, jobject fontMetrics);
176
177    /*
178     * Sets the ascent of the font.  This member should be called if
179     * font->m_nAscent < 0.
180     */
181    static void SetupAscent(AwtFont* font);
182
183    /*
184     * Determines the average dimension of the character in the
185     * specified font 'font' and multiplies it by the specified number
186     * of rows and columns.  'font' can be a temporary object.
187     */
188    static SIZE TextSize(AwtFont* font, int columns, int rows);
189
190    /*
191     * If 'font' is NULL, the SYSTEM_FONT is used to compute the size.
192     * 'font' can be a temporary object.
193     */
194    static int getFontDescriptorNumber(JNIEnv *env, jobject font,
195                                       jobject fontDescriptor);
196
197    /*
198     * 'font' is of type java.awt.Font.
199     */
200    static SIZE DrawStringSize_sub(jstring str, HDC hDC, jobject font,
201                                   long x, long y, BOOL draw,
202                                   UINT codePage = 0);
203
204    INLINE static SIZE drawMFStringSize(HDC hDC, jobject font,
205                                        jstring str, long x, long y,
206                                        UINT codePage = 0)
207    {
208        return DrawStringSize_sub(str, hDC, font, x, y, TRUE , codePage);
209    }
210
211
212    INLINE static SIZE getMFStringSize(HDC hDC, jobject font, jstring str,
213                                       UINT codePage = 0)
214    {
215        return DrawStringSize_sub(str, hDC, font, 0, 0, FALSE, codePage);
216    }
217
218
219    INLINE static long getMFStringWidth(HDC hDC, jobject font,
220                                            jstring str) {
221        return getMFStringSize(hDC, font, str).cx;
222    }
223
224    INLINE static void drawMFString(HDC hDC, jobject font, jstring str,
225                                    long x, long y, UINT codePage = 0)
226    {
227        DrawStringSize_sub(str, hDC, font, x, y, TRUE, codePage);
228    }
229
230    INLINE static jobjectArray GetComponentFonts(JNIEnv *env,
231                                                     jobject font) {
232      jobject platformFont = env->CallObjectMethod(font, AwtFont::peerMID);
233      if (platformFont != NULL) {
234          jobjectArray result =
235              (jobjectArray)(env->GetObjectField(platformFont,
236                                                 AwtFont::componentFontsID));
237          env->DeleteLocalRef(platformFont);
238          return result;
239      }
240      return NULL;
241    }
242
243   /*
244    * Variables
245    */
246
247private:
248    /* The array of associated font handles */
249    HFONT* m_hFont;
250    /* The number of handles. */
251    int    m_hFontNum;
252    /* The index of the handle used to be set to AwtTextComponent. */
253    int    m_textInput;
254    /* The ascent of this font. */
255    int m_ascent;
256    /* The overhang, or amount added to a string's width, of this font. */
257    int m_overhang;
258    /* angle of text rotation in 10'ths of a degree*/
259    int textAngle;
260    /* average width scale factor to be applied */
261    float awScale;
262};
263
264
265
266class AwtFontCache {
267private:
268    class Item {
269    public:
270        Item(const WCHAR* s, HFONT f, Item* n = NULL);
271        ~Item();
272
273        WCHAR*      name;
274        HFONT       font;
275        Item*       next;
276        DWORD       refCount;   /*  The same HFONT can be associated with
277                                    multiple Java objects.*/
278    };
279
280public:
281    AwtFontCache() { m_head = NULL; }
282    void    Add(WCHAR* name, HFONT font);
283    HFONT   Lookup(WCHAR* name);
284    BOOL    Search(HFONT font);
285    void    Remove(HFONT font);
286    void    Clear();
287    void    IncRefCount(HFONT hFont);
288    LONG    IncRefCount(Item* item);
289    LONG    DecRefCount(Item* item);
290
291
292    Item* m_head;
293};
294
295#define GET_FONT(target, OBJ) \
296    ((jobject)env->CallObjectMethod(target, AwtComponent::getFontMID))
297
298#endif /* AWT_FONT_H */
299