blob: 3f4d8e6a67db624c8a2a4b3aaf5c4d69a5fdf1c9 [file] [log] [blame]
/*
* Copyright (c) 1996, 2013, 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.
*/
#ifndef AWT_FONT_H
#define AWT_FONT_H
#include "awt.h"
#include "awt_Object.h"
#include "java_awt_Font.h"
#include "sun_awt_windows_WFontMetrics.h"
#include "sun_awt_FontDescriptor.h"
#include "sun_awt_PlatformFont.h"
/************************************************************************
* AwtFont utilities
*/
extern jboolean IsMultiFont(JNIEnv *env, jobject obj);
#define GET_PLATFORMFONT(font)\
(env->CallObjectMethod(env, font, AwtFont::peerMID))
/************************************************************************
* AwtFont class
*/
class AwtFont : public AwtObject {
public:
/* int[] width field for sun.awt.windows.WFontDescriptor */
static jfieldID widthsID;
/* int fields for sun.awt.windows.WFontDescriptor */
static jfieldID ascentID;
static jfieldID descentID;
static jfieldID leadingID;
static jfieldID heightID;
static jfieldID maxAscentID;
static jfieldID maxDescentID;
static jfieldID maxHeightID;
static jfieldID maxAdvanceID;
/* sun.awt.FontDescriptor fontDescriptor field of sun.awt.CharsetString */
static jfieldID fontDescriptorID;
/* java.lang.String charsetString field of sun.awt.CharsetString */
static jfieldID charsetStringID;
/* java.lang.String nativeName field of sun.awt.FontDescriptor*/
static jfieldID nativeNameID;
/* boolean useUnicode field of sun.awt.FontDescriptor*/
static jfieldID useUnicodeID;
/* long field pData of java.awt.Font */
static jfieldID pDataID;
/* java.awt.peer.FontPeer field peer of java.awt.Font */
static jmethodID peerMID;
/* java.lang.String name field of java.awt.Font */
static jfieldID nameID;
/* int size field of java.awt.Font */
static jfieldID sizeID;
/* int style field of java.awt.Font */
static jfieldID styleID;
/* java.awt.Font peer field of java.awt.FontMetrics */
static jfieldID fontID;
/* sun.awt.FontConfiguration fontConfig field of sun.awt.PlatformFont */
static jfieldID fontConfigID;
/* FontDescriptor[] componentFonts field of sun.awt.PlatformFont */
static jfieldID componentFontsID;
/* String textComponentFontName field of sun.awt.windows.WFontPeer */
static jfieldID textComponentFontNameID;
/* String fontName field of sun.awt.windows.WDefaultFontCharset fields */
static jfieldID fontNameID;
static jmethodID makeConvertedMultiFontStringMID;
/* java.awt.Font methods */
static jmethodID getFontMID;
/* java.awt.FontMetrics methods */
static jmethodID getHeightMID;
/*
* The argument is used to determine how many handles of
* Windows font the instance has.
*/
AwtFont(int num, JNIEnv *env, jobject javaFont);
~AwtFont(); /* Releases all resources */
virtual void Dispose();
/*
* Access methods
*/
INLINE int GetHFontNum() { return m_hFontNum; }
INLINE HFONT GetHFont(int i) {
DASSERT(m_hFont[i] != NULL);
return m_hFont[i];
}
/* Used to keep English version unchanged as much as possiple. */
INLINE HFONT GetHFont() {
DASSERT(m_hFont[0] != NULL);
return m_hFont[0];
}
INLINE int GetInputHFontIndex() { return m_textInput; }
INLINE void SetAscent(int ascent) { m_ascent = ascent; }
INLINE int GetAscent() { return m_ascent; }
INLINE int GetOverhang() { return m_overhang; }
/*
* Font methods
*/
/*
* Returns the AwtFont object associated with the pFontJavaObject.
* If none exists, create one.
*/
static AwtFont* GetFont(JNIEnv *env, jobject font,
jint angle=0, jfloat awScale=1.0f);
/*
* Creates the specified font. name names the font. style is a bit
* vector that describes the style of the font. height is the point
* size of the font.
*/
static AwtFont* Create(JNIEnv *env, jobject font,
jint angle = 0, jfloat awScale=1.0f);
static HFONT CreateHFont(WCHAR* name, int style, int height,
int angle = 0, float awScale=1.0f);
static void Cleanup();
/*
* FontMetrics methods
*/
/*
* Loads the metrics of the associated font. See Font.GetFont for
* purpose of pWS. (Also, client should provide Font java object
* instead of getting it from the FontMetrics instance variable.)
*/
static void LoadMetrics(JNIEnv *env, jobject fontMetrics);
/* Returns the AwtFont associated with this metrics. */
static AwtFont* GetFontFromMetrics(JNIEnv *env, jobject fontMetrics);
/*
* Sets the ascent of the font. This member should be called if
* font->m_nAscent < 0.
*/
static void SetupAscent(AwtFont* font);
/*
* Determines the average dimension of the character in the
* specified font 'font' and multiplies it by the specified number
* of rows and columns. 'font' can be a temporary object.
*/
static SIZE TextSize(AwtFont* font, int columns, int rows);
/*
* If 'font' is NULL, the SYSTEM_FONT is used to compute the size.
* 'font' can be a temporary object.
*/
static int getFontDescriptorNumber(JNIEnv *env, jobject font,
jobject fontDescriptor);
/*
* 'font' is of type java.awt.Font.
*/
static SIZE DrawStringSize_sub(jstring str, HDC hDC, jobject font,
long x, long y, BOOL draw,
UINT codePage = 0);
INLINE static SIZE drawMFStringSize(HDC hDC, jobject font,
jstring str, long x, long y,
UINT codePage = 0)
{
return DrawStringSize_sub(str, hDC, font, x, y, TRUE , codePage);
}
INLINE static SIZE getMFStringSize(HDC hDC, jobject font, jstring str,
UINT codePage = 0)
{
return DrawStringSize_sub(str, hDC, font, 0, 0, FALSE, codePage);
}
INLINE static long getMFStringWidth(HDC hDC, jobject font,
jstring str) {
return getMFStringSize(hDC, font, str).cx;
}
INLINE static void drawMFString(HDC hDC, jobject font, jstring str,
long x, long y, UINT codePage = 0)
{
DrawStringSize_sub(str, hDC, font, x, y, TRUE, codePage);
}
INLINE static jobjectArray GetComponentFonts(JNIEnv *env,
jobject font) {
jobject platformFont = env->CallObjectMethod(font, AwtFont::peerMID);
if (platformFont != NULL) {
jobjectArray result =
(jobjectArray)(env->GetObjectField(platformFont,
AwtFont::componentFontsID));
env->DeleteLocalRef(platformFont);
return result;
}
return NULL;
}
/*
* Variables
*/
private:
/* The array of associated font handles */
HFONT* m_hFont;
/* The number of handles. */
int m_hFontNum;
/* The index of the handle used to be set to AwtTextComponent. */
int m_textInput;
/* The ascent of this font. */
int m_ascent;
/* The overhang, or amount added to a string's width, of this font. */
int m_overhang;
/* angle of text rotation in 10'ths of a degree*/
int textAngle;
/* average width scale factor to be applied */
float awScale;
};
class AwtFontCache {
private:
class Item {
public:
Item(const WCHAR* s, HFONT f, Item* n = NULL);
~Item();
WCHAR* name;
HFONT font;
Item* next;
DWORD refCount; /* The same HFONT can be associated with
multiple Java objects.*/
};
public:
AwtFontCache() { m_head = NULL; }
void Add(WCHAR* name, HFONT font);
HFONT Lookup(WCHAR* name);
BOOL Search(HFONT font);
void Remove(HFONT font);
void Clear();
void IncRefCount(HFONT hFont);
LONG IncRefCount(Item* item);
LONG DecRefCount(Item* item);
Item* m_head;
};
#define GET_FONT(target, OBJ) \
((jobject)env->CallObjectMethod(target, AwtComponent::getFontMID))
#endif /* AWT_FONT_H */