alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Java example source code file (awt_Font.h)

This example Java source code file (awt_Font.h) is included in the alvinalexander.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Learn more about this Java project at its project page.

Java - Java tags/keywords

awt_font_h, awtfont, awtfont\:\:peermid, awtfontcache, bool, dassert, drawstringsize_sub, gethfont, hfont, increfcount, inline, item, null, uint

The awt_Font.h Java example source code

/*
 * 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);
      jobjectArray result =
          (jobjectArray)(env->GetObjectField(platformFont,
                                             AwtFont::componentFontsID));
      env->DeleteLocalRef(platformFont);
      return result;
    }

   /*
    * 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 */

Other Java examples (source code examples)

Here is a short list of links related to this Java awt_Font.h source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.