⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 devfont.c

📁 MiniGUI for uCOS 移植实验全部源码
💻 C
字号:
/*
** $Id: devfont.c,v 1.25 2004/02/25 02:34:49 weiym Exp $
** 
** defont.c: Device fonts management.
**
** Copyright (C) 2003 Feynman Software.
** Copyright (C) 2000 ~ 2002 Wei Yongming.
**
** Current maintainer: Wei Yongming.
** 
** Create Date: 2000/07/07
*/

/*
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program 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 for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "common.h"
#include "minigui.h"
#include "gdi.h"

#include "sysfont.h"
#include "charset.h"
#include "devfont.h"
#include "fontname.h"
#include "rawbitmap.h"
#include "varbitmap.h"

#ifdef _LITE_VERSION

static int init_count = 0;
BOOL GUIAPI InitVectorialFonts (void)
{
    if (init_count > 0)
       goto success;

#ifdef _TTF_SUPPORT
    if (!InitFreeTypeFonts ()) {
        fprintf (stderr, 
            "GDI: Can not initialize TrueType fonts!\n");
        return FALSE;
    }
#endif

#ifdef _TYPE1_SUPPORT
    if (!InitType1Fonts ()) {
        fprintf (stderr, 
            "GDI: Can not initialize Type1 fonts!\n");
        goto error;
    }
#endif

success:
    init_count ++;
    return TRUE;

#ifdef _TYPE1_SUPPORT
error:
#endif

#ifdef _TTF_SUPPORT
    TermFreeTypeFonts ();
#endif
    return FALSE;
}

void GUIAPI TermVectorialFonts (void)
{
    init_count --;
    if (init_count != 0)
        return;

#ifdef _TYPE1_SUPPORT
	TermType1Fonts();
#endif

#ifdef _TTF_SUPPORT
    TermFreeTypeFonts ();
#endif
}

#endif /* _LITE_VERSION */

/**************************** Global data ************************************/
static DEVFONT* sb_dev_font_head;
static DEVFONT* mb_dev_font_head;
static int nr_sb_dev_fonts;
static int nr_mb_dev_fonts;

#define devfontAddSBCDevFont(head, new)         \
{                                               \
    if (head == NULL)                           \
        head = new;                             \
    else {                                      \
        DEVFONT* tail;                          \
        tail = head;                            \
        while (tail->sbc_next) tail = tail->sbc_next;   \
        tail->sbc_next = new;                       \
    }                                           \
                                                \
    new->sbc_next = NULL;                           \
}

#define devfontAddMBCDevFont(head, new)         \
{                                               \
    if (head == NULL)                           \
        head = new;                             \
    else {                                      \
        DEVFONT* tail;                          \
        tail = head;                            \
        while (tail->mbc_next) tail = tail->mbc_next;   \
        tail->mbc_next = new;                       \
    }                                           \
                                                \
    new->mbc_next = NULL;                           \
}

void AddSBDevFont (DEVFONT* dev_font)
{
    devfontAddSBCDevFont (sb_dev_font_head, dev_font);
    dev_font->style = fontGetStyleFromName (dev_font->name);
    nr_sb_dev_fonts ++;
}

void AddMBDevFont (DEVFONT* dev_font)
{
    devfontAddMBCDevFont (mb_dev_font_head, dev_font);
    dev_font->style = fontGetStyleFromName (dev_font->name);
    nr_mb_dev_fonts ++;
}

void ResetDevFont (void)
{
    sb_dev_font_head = mb_dev_font_head = NULL;
    nr_sb_dev_fonts = 0;
    nr_mb_dev_fonts = 0;
}

#define MATCHED_TYPE        0x01
#define MATCHED_FAMILY      0x02
#define MATCHED_CHARSET     0x04

DEVFONT* GetMatchedSBDevFont (LOGFONT* log_font)
{
    int i;
    char charset_req [LEN_FONT_NAME + 1];
    int min_error;
    DEVFONT* dev_font;
    DEVFONT* matched_font;

#ifdef HAVE_ALLOCA
    BYTE* match_bits = alloca (nr_sb_dev_fonts);
#else
    BYTE* match_bits = FixStrAlloc (nr_sb_dev_fonts);
#endif

    // is charset requested is a single byte charset?
    if (GetCharsetOps (log_font->charset)->bytes_maxlen_char > 1) {
        fontGetCharsetFromName (g_SysLogFont[0]->sbc_devfont->name, charset_req);
    }
    else
        strcpy (charset_req, log_font->charset);
        
    i = 0;
    dev_font = sb_dev_font_head;
    while (dev_font) {
        int type_req;
        char family [LEN_FONT_NAME + 1];
        
        // clear match_bits first.
        match_bits [i] = 0;

        // does match this font type?
        type_req = fontConvertFontType (log_font->type);
        if (type_req == FONT_TYPE_ALL)
            match_bits [i] |= MATCHED_TYPE;
        else if (type_req == fontGetFontTypeFromName (dev_font->name))
            match_bits [i] |= MATCHED_TYPE;

        // does match this family?
        fontGetFamilyFromName (dev_font->name, family);
        if (strcasecmp (family, log_font->family) == 0) {
#if 0
            fprintf (stderr, "family: %s, requested: %s; ", family, log_font->family);
#endif
            match_bits [i] |= MATCHED_FAMILY;
        }

        // does match this charset 
        if (dev_font->charset_ops == GetCharsetOps (charset_req)) {
#if 0
            fprintf (stderr, "charset: %s, requested: %s.\n", dev_font->charset_ops->name, charset_req);
#endif
            match_bits [i] |= MATCHED_CHARSET;
        }
#if 0
        else {
            if (fontGetCompatibleCharsetFromName (dev_font->name, charset)
                    && GetCharsetOps (charset) == GetCharsetOps (charset_req))
                match_bits [i] |= MATCHED_CHARSET;
        }
#endif

        // FIXME: ignore style

        dev_font = dev_font->sbc_next;
        i ++;
    }

    min_error = FONT_MAX_SIZE;
    matched_font = NULL;
    dev_font = sb_dev_font_head;
    for (i = 0; i < nr_sb_dev_fonts; i++) {
        int error;
        if ((match_bits [i] & MATCHED_TYPE)
                && (match_bits [i] & MATCHED_FAMILY)
                && (match_bits [i] & MATCHED_CHARSET)) {
            error = abs (log_font->size - 
                    (*dev_font->font_ops->get_font_size) (log_font, dev_font, 
                                                          log_font->size));
            if (min_error > error) {
                min_error = error;
                matched_font = dev_font;
            }
        }
        dev_font = dev_font->sbc_next;
    }

    if (matched_font) {
#if 0
        fprintf (stderr, "matched font: %s\n", matched_font->name);
#endif
#ifndef HAVE_ALLOCA
        FreeFixStr (match_bits);
#endif
        return matched_font;
    }

    // check charset here.
    min_error = FONT_MAX_SIZE;
    dev_font = sb_dev_font_head;
    for (i = 0; i < nr_sb_dev_fonts; i++) {
        int error;
        if (match_bits [i] & MATCHED_CHARSET) {
            error = abs (log_font->size - 
                    (*dev_font->font_ops->get_font_size) (log_font, dev_font, log_font->size));
            if (min_error > error) {
                min_error = error;
                matched_font = dev_font;
            }
        }
        dev_font = dev_font->sbc_next;
    }

#if 0
        fprintf (stderr, "select a font: %s\n", matched_font->name);
#endif
#ifndef HAVE_ALLOCA
    FreeFixStr (match_bits);
#endif
    return matched_font;
}

DEVFONT* GetMatchedMBDevFont (LOGFONT* log_font)
{
    DEVFONT* dev_font;
    int i;
    BYTE* match_bits;
    char charset_req [LEN_FONT_NAME + 1];
    int min_error;
    DEVFONT* matched_font;

    // is charset requested is a multiple-byte charset?
    if (GetCharsetOps (log_font->charset)->bytes_maxlen_char < 2)
        return NULL;

    match_bits = FixStrAlloc (nr_mb_dev_fonts);

    strcpy (charset_req, log_font->charset);
        
    i = 0;
    dev_font = mb_dev_font_head;
    while (dev_font) {
        int type_req;
        char family [LEN_FONT_NAME + 1];
        
        // clear match_bits first.
        match_bits [i] = 0;

        // does match this font type?
        type_req = fontConvertFontType (log_font->type);
        if (type_req == FONT_TYPE_ALL)
            match_bits [i] |= MATCHED_TYPE;
        else if (type_req == fontGetFontTypeFromName (dev_font->name))
            match_bits [i] |= MATCHED_TYPE;

        // does match this family?
        fontGetFamilyFromName (dev_font->name, family);
        if (strcasecmp (family, log_font->family) == 0) {
#if 0
            fprintf (stderr, "family: %s, requested: %s; ", family, log_font->family);
#endif
            match_bits [i] |= MATCHED_FAMILY;
        }

        // does match this charset 
        if (dev_font->charset_ops == GetCharsetOps (charset_req)) {
#if 0
            fprintf (stderr, "charset: %s, requested: %s\n", dev_font->charset_ops->name, charset_req);
#endif
            match_bits [i] |= MATCHED_CHARSET;
        }

        // FIXME: ignore style

        dev_font = dev_font->mbc_next;
        i ++;
    }

    matched_font = NULL;
    min_error = FONT_MAX_SIZE;
    dev_font = mb_dev_font_head;
    for (i = 0; i < nr_mb_dev_fonts; i++) {
        int error;
        if ((match_bits [i] & MATCHED_TYPE)
                && (match_bits [i] & MATCHED_FAMILY)
                && (match_bits [i] & MATCHED_CHARSET)) {
            error = abs (log_font->size - 
                    (*dev_font->font_ops->get_font_size) (log_font, dev_font, 
                                                          log_font->size));
            if (min_error > error) {
                min_error = error;
                matched_font = dev_font;
            }
        }
        dev_font = dev_font->mbc_next;
    }

    if (matched_font) {
#if 0
        fprintf (stderr, "matched font: %s\n", matched_font->name);
#endif
        FreeFixStr (match_bits);
        return matched_font;
    }

    min_error = FONT_MAX_SIZE;
    dev_font = mb_dev_font_head;
    for (i = 0; i < nr_mb_dev_fonts; i++) {
        int error;
        if (match_bits [i] & MATCHED_CHARSET) {
            error = abs (log_font->size - 
                    (*dev_font->font_ops->get_font_size) (log_font, dev_font, 
                                                          log_font->size));
            if (min_error > error) {
                min_error = error;
                matched_font = dev_font;
            }
        }
        dev_font = dev_font->mbc_next;
    }

#if 0
        fprintf (stderr, "select a font: %s\n", matched_font->name);
#endif
    FreeFixStr (match_bits);
    return matched_font;
}

const DEVFONT* GUIAPI GetNextDevFont (const DEVFONT* dev_font)
{
    if (dev_font == NULL) {
        return sb_dev_font_head;
    }
    else if (dev_font->charset_ops->bytes_per_char == 1) {
        dev_font = dev_font->sbc_next;
        if (dev_font == NULL)
            return mb_dev_font_head;

        return dev_font;
    }

    return dev_font->mbc_next;
}

#ifdef _DEBUG
void dumpDevFonts (void)
{
    int count = 0;
    DEVFONT* devfont;

    fprintf (stderr, "============= SBDevFonts ============\n");
    devfont = sb_dev_font_head;
    while (devfont) {
        fprintf (stderr, "  %d: %s, charsetname: %s, style: %#lx\n", 
                        count, 
                        devfont->name, devfont->charset_ops->name, devfont->style);
        devfont = devfont->sbc_next;
        count++;
    }
    fprintf (stderr, "========== End of SBDevFonts =========\n");

    fprintf (stderr, "\n============= MBDevFonts ============\n");
    devfont = mb_dev_font_head;
    while (devfont) {
        fprintf (stderr, "  %d: %s, charsetname: %s, style: %#lx\n", 
                        count, 
                        devfont->name, devfont->charset_ops->name, devfont->style);
        devfont = devfont->mbc_next;
        count++;
    }
    fprintf (stderr, "========== End of MBDevFonts =========\n");
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -