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

📄 gdi.h

📁 这是ARM嵌入式系统的实验教程中的MINIGUI的实验源代码!
💻 H
📖 第 1 页 / 共 5 页
字号:
/**
 * \file gdi.h
 * \author Wei Yongming <ymwei@minigui.org>
 * \date 2002/01/06
 * 
 * This file includes graphics device interfaces of MiniGUI.
 *
 \verbatim
    Copyright (C) 1998-2002 Wei Yongming.
    Copyright (C) 2002-2004 Feynman Software.

    This file is part of MiniGUI, a compact cross-platform Graphics 
    User Interface (GUI) support system for real-time embedded systems.

    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

 \endverbatim
 */

/*
 * $Id: gdi.h,v 1.191 2004/10/20 02:06:00 weiym Exp $
 *
 *             MiniGUI for Linux/uClinux, eCos, uC/OS-II, and VxWorks version 1.6.x
 *             Copyright (C) 1998-2002 Wei Yongming.
 *             Copyright (C) 2002-2004 Feynman Software.
 */

#ifndef _MGUI_GDI_H
    #define _MGUI_GDI_H

/* include necessary headers */
#ifndef _LITE_VERSION
#include "pthread.h"
#endif /* !LITE_VERSION */
 
#ifdef __cplusplus
extern "C" {
#endif  /* __cplusplus */

    /**
     * \addtogroup global_vars Global variables
     * @{
     */

    /**
     * \defgroup color_vars System colors and pixel values.
     * @{
     */

/**
 * \var gal_pixel SysPixelIndex []
 * \brief The pre-defined system pixel values.
 *
 * MiniGUI defines some system pixel values when initializing 
 * graphics sub-system. You can access the arrary to get the
 * system pixel values, or just use the following macros:
 *
 *  - PIXEL_black\n
 *    black
 *  - PIXEL_darkred\n
 *    dark red
 *  - PIXEL_darkgreen\n
 *    dark green
 *  - PIXEL_darkyellow\n
 *    dark yellow
 *  - PIXEL_darkblue\n
 *    dark blue
 *  - PIXEL_darkmagenta\n
 *    dark magenta
 *  - PIXEL_darkcyan\n
 *    dark cyan
 *  - PIXEL_lightgray\n
 *    light gray
 *  - PIXEL_darkgray\n
 *    dark gray
 *  - PIXEL_red\n
 *    red
 *  - PIXEL_green\n
 *    green
 *  - PIXEL_yellow\n
 *    yellow
 *  - PIXEL_blue\n
 *    blue
 *  - PIXEL_magenta\n
 *    magenta
 *  - PIXEL_cyan\n
 *    cyan
 *  - PIXEL_lightwhite\n
 *    light white
 */
extern gal_pixel SysPixelIndex [];

/**
 * \var RGB SysPixelColor []
 * \brief The pre-defined system RGB colors.
 *
 * The elements in this array are system colors in RGB triples.
 */
extern const RGB SysPixelColor [];

#define PIXEL_invalid       0
#define PIXEL_transparent   SysPixelIndex[0]
#define PIXEL_darkblue      SysPixelIndex[1]
#define PIXEL_darkgreen     SysPixelIndex[2]
#define PIXEL_darkcyan      SysPixelIndex[3]
#define PIXEL_darkred       SysPixelIndex[4] 
#define PIXEL_darkmagenta   SysPixelIndex[5]
#define PIXEL_darkyellow    SysPixelIndex[6] 
#define PIXEL_darkgray      SysPixelIndex[7] 
#define PIXEL_lightgray     SysPixelIndex[8]
#define PIXEL_blue          SysPixelIndex[9]
#define PIXEL_green         SysPixelIndex[10]
#define PIXEL_cyan          SysPixelIndex[11]
#define PIXEL_red           SysPixelIndex[12]
#define PIXEL_magenta       SysPixelIndex[13]
#define PIXEL_yellow        SysPixelIndex[14]
#define PIXEL_lightwhite    SysPixelIndex[15]
#define PIXEL_black         SysPixelIndex[16]

/* Compatiblity definitions */
#define COLOR_invalid       PIXEL_invalid
#define COLOR_transparent   PIXEL_transparent
#define COLOR_darkred       PIXEL_darkred
#define COLOR_darkgreen     PIXEL_darkgreen
#define COLOR_darkyellow    PIXEL_darkyellow
#define COLOR_darkblue      PIXEL_darkblue
#define COLOR_darkmagenta   PIXEL_darkmagenta
#define COLOR_darkcyan      PIXEL_darkcyan
#define COLOR_lightgray     PIXEL_lightgray
#define COLOR_darkgray      PIXEL_darkgray
#define COLOR_red           PIXEL_red
#define COLOR_green         PIXEL_green
#define COLOR_yellow        PIXEL_yellow
#define COLOR_blue          PIXEL_blue
#define COLOR_magenta       PIXEL_magenta
#define COLOR_cyan          PIXEL_cyan
#define COLOR_lightwhite    PIXEL_lightwhite
#define COLOR_black         PIXEL_black

#define SysColorIndex       SysPixelIndex

    /** @} end of color_vars */

    /** @} end of global_vars */

    /**
     * \addtogroup fns Functions
     * @{
     */

    /**
     * \addtogroup global_fns Global/general functions
     * @{
     */

    /**
     * \defgroup block_heap_fns Block data heap operations
     *
     * MiniGUI maintains some private block data heaps to allocate
     * data blocks which have fixed size, such as the clipping rectangles
     * in a region. By using the private heap, we can avoiding calling
     * \a malloc and \a free function frequently, so will have a slight 
     * performance enhancement.
     *
     * @{
     */

/**
 * MiniGUI's private block data heap.
 *
 * \sa InitBlockDataHeap, DestroyBlockDataHeap
 */
typedef struct _BLOCKHEAP
{
#ifndef _LITE_VERSION
    pthread_mutex_t lock;
#endif
    /**
     * size of one block element.
     */
    size_t          bd_size;
    /**
     * size of the heap in blocks.
     */
    size_t          heap_size;
    /**
     * the first free element in the heap.
     */
    int             free;
    /**
     * pointer to the pre-allocated heap.
     */
    void*           heap;
} BLOCKHEAP;

/**
 * \var typedef BLOCKHEAP* PBLOCKHEAP
 * \brief Data type of the pointer to a BLOCKHEAP.
 *
 * \sa BLOCKHEAP
 */
typedef BLOCKHEAP* PBLOCKHEAP;

/**
 * \fn void InitBlockDataHeap (PBLOCKHEAP heap, size_t bd_size, size_t heap_size)
 * \brief Initializes a private block data heap.
 *
 * This function initializes a block data heap pointed to by \a heap.
 * It will allocate the buffer used by the heap from system heap by using \a malloc(3).
 * Initially, the heap has \a heap_size blocks free, and each is \a bd_size bytes long.
 *
 * \param heap The pointer to the heap structure.
 * \param bd_size The size of one block in bytes.
 * \param heap_size The size of the heap in blocks.
 * \return \a heap->heap will contains a valid pointer on success, NULL on error.
 *
 * \note This function does not return anything. You should check the \a heap
 * field of the \a heap structure.
 *
 * \sa BLOCKHEAP
 */
void InitBlockDataHeap (PBLOCKHEAP heap, size_t bd_size, size_t heap_size);

/**
 * \fn void* BlockDataAlloc (PBLOCKHEAP heap)
 * \brief Allocates a data block from private heap.
 *
 * This function allocates a data block from an initialized 
 * block data heap. The allocated block will have the size of \a heap->bd_size.
 * If there is no free block in the heap, this function will try to allocate
 * the block from the system heap by using \a malloc(3) function.
 *
 * \param heap The pointer to the initialized heap.
 * \return Pointer to the allocated data block, NULL on error.
 *
 * \sa InitBlockDataHeap, BlockDataFree
 */

void* BlockDataAlloc (PBLOCKHEAP heap);

/**
 * \fn void BlockDataFree (PBLOCKHEAP heap, void* data)
 * \brief Frees an allocated data block.
 *
 * This function frees the specified data block pointed to by \a data to the heap \a heap.
 * If the block was allocated by using \a malloc function, this function will
 * free the element by using \a free(3) function. 
 *
 * \param heap The pointer to the heap.
 * \param data The pointer to the element to be freed.
 *
 * \sa InitBlockDataHeap, BlockDataAlloc
 */
void BlockDataFree (PBLOCKHEAP heap, void* data);

/**
 * \fn void DestroyBlockDataHeap (PBLOCKHEAP heap)
 * \brief Destroies a private block data heap.
 *
 * \param heap The pointer to the heap to be destroied.
 *
 * \sa InitBlockDataHeap, BLOCKHEAP
 */
void DestroyBlockDataHeap (PBLOCKHEAP heap);

    /** @} end of block_heap_fns */

    /** @} end of global_fns */

    /**
     * \defgroup gdi_fns GDI functions
     * @{
     */

struct _BITMAP;
typedef struct _BITMAP BITMAP;
typedef BITMAP* PBITMAP;

struct _MYBITMAP;
typedef struct _MYBITMAP MYBITMAP;
typedef struct _MYBITMAP* PMYBITMAP;

   /**
    * \defgroup region_fns Region operations
    *
    * A Region is simply an area, as the name implies, and is implemented as 
    * a "y-x-banded" array of rectangles. To explain: Each Region is made up 
    * of a certain number of rectangles sorted by y coordinate first, 
    * and then by x coordinate.
    *
    * Furthermore, the rectangles are banded such that every rectangle with a
    * given upper-left y coordinate (y1) will have the same lower-right y
    * coordinate (y2) and vice versa. If a rectangle has scanlines in a band, it
    * will span the entire vertical distance of the band. This means that some
    * areas that could be merged into a taller rectangle will be represented as
    * several shorter rectangles to account for shorter rectangles to its left
    * or right but within its "vertical scope".
    *
    * An added constraint on the rectangles is that they must cover as much
    * horizontal area as possible. E.g. no two rectangles in a band are allowed
    * to touch.
    *
    * Whenever possible, bands will be merged together to cover a greater vertical
    * distance (and thus reduce the number of rectangles). Two bands can be merged
    * only if the bottom of one touches the top of the other and they have
    * rectangles in the same places (of the same width, of course). This maintains
    * the y-x-banding that's so nice to have...
    *
    * Example:
    *
    * \include region.c
    *
    * @{
    */

/**
 * Clipping rectangle structure.
 */
typedef struct _CLIPRECT
{
    /**
     * the clipping rectangle itself.
     */
    RECT rc;
    /**
     * the next clipping rectangle.
     */
    struct _CLIPRECT* next;
#ifdef _USE_NEWGAL
    /**
     * the previous clipping rectangle.
     * \note only defined for _USE_NEWGAL.
     */
    struct _CLIPRECT* prev;
#endif
} CLIPRECT;
typedef CLIPRECT* PCLIPRECT;

/* Clipping Region */
#ifdef _USE_NEWGAL
#define NULLREGION      0x00
#define SIMPLEREGION    0x01
#define COMPLEXREGION   0x02
#endif

/**
 * Clipping region structure, alos used for general regions.
 */
typedef struct _CLIPRGN
{
#ifdef _USE_NEWGAL
   /**
    * type of the region, can be one of the following:
    *   - NULLREGION\n
    *     a null region.
    *   - SIMPLEREGION\n
    *     a simple region.
    *   - COMPLEXREGION
    *     a complex region.
    *
    * \note only defined for _USE_NEWGAL.
    */
    BYTE            type;        /* type of region */
   /**
    * reserved for alignment.
    *
    * \note only defined for _USE_NEWGAL.
    */
    BYTE            reserved[3];
#endif
   /**
    * The bounding rect of the region.
    */

⌨️ 快捷键说明

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