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

📄 gdi.c

📁 这是ARM嵌入式系统的实验教程中的MINIGUI的实验源代码!
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
** $Id: gdi.c,v 1.53 2004/07/08 13:14:24 weiym Exp $
**
** The graphics display interface module of MiniGUI.
**
** Copyright (C) 2003 Feynman Software.
** Copyright (C) 1999 ~ 2002 Wei Yongming.
**
** Current maintainer: Wei Yongming.
**
** Create date: 1999/01/03
*/

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

/*
** TODO:
*/ 

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

#include "common.h"
#include "minigui.h"
#include "gdi.h"
#include "window.h"
#include "cliprect.h"
#include "gal.h"
#include "cursor.h"
#include "internals.h"
#include "ctrlclass.h"
#include "dc.h"
#include "sysfont.h"
#include "devfont.h"
#include "drawtext.h"

/************************* global data define ********************************/
DC __mg_screen_dc;

gal_pixel SysPixelIndex [17];

// This should be the standard EGA palette.
const RGB SysPixelColor [] = {
    {0x00, 0x00, 0x00},     // transparent   --0
    {0x00, 0x00, 0x80},     // dark blue     --1
    {0x00, 0x80, 0x00},     // dark green    --2
    {0x00, 0x80, 0x80},     // dark cyan     --3
    {0x80, 0x00, 0x00},     // dark red      --4
    {0x80, 0x00, 0x80},     // dark magenta  --5
    {0x80, 0x80, 0x00},     // dark yellow   --6
    {0x80, 0x80, 0x80},     // dark gray     --7
    {0xC0, 0xC0, 0xC0},     // light gray    --8
    {0x00, 0x00, 0xFF},     // blue          --9
    {0x00, 0xFF, 0x00},     // green         --10
    {0x00, 0xFF, 0xFF},     // cyan          --11
    {0xFF, 0x00, 0x00},     // red           --12
    {0xFF, 0x00, 0xFF},     // magenta       --13
    {0xFF, 0xFF, 0x00},     // yellow        --14
    {0xFF, 0xFF, 0xFF},     // light white   --15
    {0x00, 0x00, 0x00}      // black         --16
};

// mutex ensuring exclusive access to gdi. 
pthread_mutex_t __mg_gdilock;

/************************* global functions declaration **********************/
// the following functions, which defined in other module
// but used in this module.
extern PGCRINFO GetGCRgnInfo (HWND hWnd);

/**************************** static data ************************************/
// General DC
static DC DCSlot [DCSLOTNUMBER];
// mutex ensuring exclusive access to DC slot. 
static pthread_mutex_t dcslot;

static BLOCKHEAP sg_FreeClipRectList;

/************************* static functions declaration **********************/
static void dc_InitClipRgnInfo (void);
static void dc_InitDC (PDC pdc, HWND hWnd, BOOL bIsClient);
static void dc_Init_ScreenDC (void);

/************************** inline functions *********************************/
inline void WndRect(HWND hWnd, PRECT prc)
{
    PCONTROL pParent;
    PCONTROL pCtrl;

    pParent = pCtrl = (PCONTROL) hWnd;

    if (hWnd == HWND_DESKTOP) {
        *prc = g_rcScr;
        return;
    }

    prc->left = pCtrl->left;
    prc->top  = pCtrl->top;
    prc->right = pCtrl->right;
    prc->bottom = pCtrl->bottom;
    while ((pParent = pParent->pParent)) {
        prc->left += pParent->cl;
        prc->top  += pParent->ct;
        prc->right += pParent->cl;
        prc->bottom += pParent->ct;
    }
}

inline void WndClientRect(HWND hWnd, PRECT prc)
{
    PCONTROL pCtrl;
    PCONTROL pParent;
    pParent = pCtrl = (PCONTROL) hWnd;

    if (hWnd == HWND_DESKTOP) {
        *prc = g_rcScr;
        return;
    }

    prc->left = pCtrl->cl;
    prc->top  = pCtrl->ct;
    prc->right = pCtrl->cr;
    prc->bottom = pCtrl->cb;
    while ((pParent = pParent->pParent)) {
        prc->left += pParent->cl;
        prc->top  += pParent->ct;
        prc->right += pParent->cl;
        prc->bottom += pParent->ct;
    }
}

static void RestrictControlECRGN (CLIPRGN* crgn, PCONTROL pCtrl)
{
    RECT rc;
    PCONTROL pRoot = (PCONTROL) (pCtrl->pMainWin);
    int off_x = 0, off_y = 0;

    do {
        PCONTROL pParent = pCtrl;

        rc.left = pRoot->cl + off_x;
        rc.top  = pRoot->ct + off_y;
        rc.right = pRoot->cr + off_x;
        rc.bottom = pRoot->cb + off_y;
        IntersectClipRect (crgn, &rc);
        if (IsEmptyClipRgn (crgn))
            return;

        if (pRoot == pCtrl->pParent)
            break;

        off_x += pRoot->cl;
        off_y += pRoot->ct;

        while (TRUE) {
            if (pRoot->children == pParent->pParent->children) {
                pRoot = pParent;
                break;
            }
            pParent = pParent->pParent;
        }
    } while (TRUE);
}

/******************* Initialization and termination of GDI *******************/
BOOL InitGDI (void)
{   
    if (!InitTextBitmapBuffer ()) {
        fprintf (stderr, 
            "GDI: Can not initialize text bitmap buffer!\n");
        goto error;
    }

#ifdef _RBF_SUPPORT
#ifdef _INCORE_RES
    if (!InitIncoreRBFonts ()) {
        fprintf (stderr, 
            "GDI: Can not initialize incore RBF fonts!\n");
        goto error;
    }
#endif
#endif

#ifdef _VBF_SUPPORT
    if (!InitIncoreVBFonts ()) {
        fprintf (stderr, 
            "GDI: Can not initialize incore VBF fonts!\n");
        goto error;
    }
#endif

#ifndef _INCORE_RES

#ifdef _RBF_SUPPORT
    if (!InitRawBitmapFonts ()) {
        fprintf (stderr, 
            "GDI: Can not initialize raw bitmap fonts!\n");
        goto error;
    }
#endif

#ifdef _VBF_SUPPORT
    if (!InitVarBitmapFonts ()) {
        fprintf (stderr, 
            "GDI: Can not initialize var bitmap fonts!\n");
        goto error;
    }
#endif

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

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

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

#endif /* !_INCORE_RES */

    /* TODO: add other font support here */

#ifdef _DEBUG
    dumpDevFonts ();
#endif

    if (!InitSysFont ()) {
        fprintf (stderr, 
            "GDI: Can not create system fonts!\n");
        goto error;
    }

    InitFreeClipRectList (&sg_FreeClipRectList, SIZE_CLIPRECTHEAP);
    
    pthread_mutex_init (&__mg_gdilock, NULL);
    pthread_mutex_init (&dcslot, NULL);

    dc_InitClipRgnInfo();

    dc_Init_ScreenDC ();

    return TRUE;

error:
    return FALSE;
}

void TerminateGDI( void )
{
    TermSysFont ();

    /* TODO: add other font support here */

#ifndef _INCORE_RES

#ifdef _TTF_SUPPORT
    TermFreeTypeFonts ();
#endif

#ifdef _TYPE1_SUPPORT
	TermType1Fonts();
#endif

#ifdef _QPF_SUPPORT
    TermQPFonts ();
#endif

#ifdef _VBF_SUPPORT
    TermVarBitmapFonts ();
#endif

#ifdef _RBF_SUPPORT
    TermRawBitmapFonts ();
#endif

#ifdef _VBF_SUPPORT
    TermIncoreVBFonts ();
#endif

#ifdef _RBF_SUPPORT
#ifdef _INCORE_RES
    TermIncoreRBFonts ();
#endif
#endif

#endif /* _INCORE_RES */

    ResetDevFont ();

    TermTextBitmapBuffer ();

    DestroyFreeClipRectList (&sg_FreeClipRectList);

    pthread_mutex_destroy (&__mg_gdilock);
    pthread_mutex_destroy (&dcslot);
}

/*
 * Function: int GUIAPI GetGDCapability( int iItem) 
 *      This Function return DC parameters.
 * Parameters:
 *      The element want to retrive.
 * Return:
 *      The parameter.
 */
unsigned int GUIAPI GetGDCapability (HDC hdc, int iItem )
{
    PDC pdc;
    unsigned int iret = 0xFFFFFFFF;

    pdc = dc_HDC2PDC (hdc);

    pthread_mutex_lock (&__mg_gdilock);

    // set graphics context.
    GAL_SetGC (pdc->gc);

    switch (iItem)
    {
        case GDCAP_DEPTH:
            iret = GAL_BitsPerPixel (pdc->gc);
            break;

        case GDCAP_BPP:
            iret = GAL_BytesPerPixel (pdc->gc);
            break;

        case GDCAP_COLORNUM:
            iret = GAL_Colors (pdc->gc);
            break;
 
        case GDCAP_HPIXEL:
            iret = GAL_Width (pdc->gc);
            break;

        case GDCAP_VPIXEL:
            iret = GAL_Height (pdc->gc);
            break;

        case GDCAP_MAXX:
            iret = GAL_Width (pdc->gc) - 1;
            break;

        case GDCAP_MAXY:
            iret = GAL_Height (pdc->gc) - 1;
            break;
    }

    pthread_mutex_unlock(&__mg_gdilock);
    return iret;
}

// This function init clip region in all DC slots.
static void dc_InitClipRgnInfo(void)
{
    int i;

    for (i=0; i<DCSLOTNUMBER; i++) {
        // Local clip region
        InitClipRgn(&DCSlot[i].lcrgn, &sg_FreeClipRectList);

        // Global clip region info
        DCSlot[i].pGCRInfo = NULL;
        DCSlot[i].oldage = 0;

        // Effective clip region
        InitClipRgn(&DCSlot[i].ecrgn, &sg_FreeClipRectList);
    }
   
}

// This function generates effective clip region from

⌨️ 快捷键说明

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