graphic.c

来自「好记星的控件,包括button,list,对文件操作」· C语言 代码 · 共 1,483 行 · 第 1/5 页

C
1,483
字号
/****************************************************************************/
/*                                                                          */
/*              Copyright (C) 2002 SHENZHEN MEIJIN CO.LTD                   */
/*                                                                          */
/* FILE NAME:   Graphic.c                                                   */
/* MODULE NAME: Graphic                                                     */
/* DESCRIPTION: This module provides developers with a set of functions for */
/*              graphics.Please consult  VIP OS 3.2 Developer Guide2        */
/*              to get further information.                                 */
/*                                                                          */
/****************************************************************************/
/*    DTAE       AUTHOR     VERSION                 REMARKS                 */
/* =========== ==========  =========  ======================================*/
/* 2002-08-10   Qorse      Ver 1.00   Build                                 */
/* 2002-09-14   Qorse      Ver 2.00   for Os3.2 standardization             */
/* 2003-06-13   谢永良     删除函数ID号和模块调用                           */
/****************************************************************************/

/* 谢永良增加 2003.2.21 */
//#define __HANDLE_JPEG__
/***** End 2003.2.21 ****/

#include "kernel.h"
#include "graphin.h"

#define LCD_BUFFER_SIZE		( ( ((LCD_SCREEN_WIDTH*COLOR_LEVEL+31)>>5) << 2)*(LCD_SCREEN_HEIGHT+EXTLCD_SCREEN_UNDISP_HEIGHT+EXTLCD_SCREEN_HEIGHT))
#ifndef WIN32
#if		COLOR_LEVEL ==1
UINT8        g_byLcdBuffer[sizeof(MBitMapInfoHeader)+2*4 +LCD_BUFFER_SIZE];
#elif	COLOR_LEVEL == 4
UINT8        g_byLcdBuffer[sizeof(MBitMapInfoHeader)+16*4 +LCD_BUFFER_SIZE];
#else
UINT8        g_byLcdBuffer[sizeof(MBitMapInfoHeader)+2*4 +LCD_BUFFER_SIZE];
#endif

#endif
BOOL		g_bLcdAlreadyInitFlag = FALSE;//LCD已经初始化

/* 谢永良增加 2003.2.21 */
#ifdef __HANDLE_JPEG__
#include "Image.h"
#include "jinclude.h"
#include "jpeglib.h"
#endif
/***** End 2003.2.21 ****/

/* Global variable */
MDC         g_dcSystemDC;                       /* 系统DC */
UINT32		g_dwTransparentColor;               /*Transparent Color*/

UINT8       g_GraphRefreshFlag;                 /*Enable Lcd refresh flag*/
UINT8       g_uLcdIndex;						/*Lcd logic index*/

NU_DRIVER   *g_pLcdDriver;                      /*Lcd device handle*/
#ifdef __ED928__
NU_DRIVER   *g_pExtLcdDriver;                   /*Extern Lcd device handle*/
#endif
BOOL        g_bFillFade;                        /*Fill With Fade mode*/
UINT        g_GraphErrorCode;                   /*Graphic Module ErrorCode.*/

MTable1To4  g_mTable;               //the table to change mono to gray16



VOID GraphInitialDC(VOID);
BOOL GraphSetActiveLcd(UINT uLcdIndex);
VOID GraphSetErrorCode(UINT errCode);
UINT32 GraphGetBitMapSize(MBitMapInfo *pBitMapInfo);



const char * const GraphErrorMsg[]=
{
	"操作成功!",										/*0x00*/
	"JPG文件格式错误!",									/*0x01*/
	"不支持JFIF版本格式!",								/*0x02*/
	"不能处理JFIF特性文件!",							/*0x03*/
	"不支持超过16bit的量化表!",							/*0x04*/
	"只支持8位精度!",									/*0x05*/
	"只支持真彩色JPG文件!",								/*0x06*/
	"只支持YCbCr格式的JPG文件!",						/*0x07*/
	"无效的SOS制作格式!",								/*0x08*/
	"文件打开失败!",									/*0x09*/
	"无效JPG文件. 没有找到SOS制作格式.",				/*0x0a*/
	"不支持压缩JPG格式!",								/*0x0b*/
	"Y的垂直方向量化因子应该大于或等于Cb,Cr的因子!",	/*0x0c*/
	"Y的水平方向量化因子应该大于或等于Cb,Cr的因子!",	/*0x0d*/
	"Cb量化因子应该为1",								/*0x0e*/
	"Cr量化因子应该为1",								/*0x0f*/
	"内存不足!",										/*0x10*/
	"文件读取失败!",									/*0x11*/
	"文件写失败!",										/*0x12*/
	"Timer申请失败!",									/*0x13*/
	"内存不足,图形整理(翻转)失败!",						/*0x14*/
	"无效的图形文件格式!",								/*0x15*/
	"尚不支持压缩的位图(.bmp)文件格式!"					/*0x16*/
	"提供的位图缓冲不足,需重新申请!",					/*0x17*/
	"尚不支持此种文件格式!",							/*0x18*/

	"图形调整参数错误!",								/*0x19*/
	"无法识别的位图数据!",								/*0x20*/
	"只支持256色的PCX图形!",							/*0x21*/	
	"控件创建时发现参数错误!"							/*0x22*/
};
/*
const UINT32 StdPalette1[2] = {0XFFFFFF, 0};
const UINT32 StdPalette4[16] = {
    0XFFFFFF, 0XEEEEEE, 0XDDDDDD, 0XCCCCCC, 0XBBBBBB, 0XAAAAAA, 0X999999,
    0X888888, 0X777777, 0X666666, 0X555555, 0X444444, 0X333333, 0X222222,
    0X111111, 0
};
*/
const UINT8 maskTable1[8] = {0, 0XFE, 0XFC, 0XF8, 0XF0, 0XE0, 0XC0, 0X80};
const UINT32 maskTable4[8] =
{
    0, 0XF0FFFFFF, 0XFFFFFF, 0XF0FFFF, 0XFFFF, 0XF0FF, 0XFF, 0XF0
};
const struct tagDeviceContext GraphicDefaultDC[] = 
{
    0,0,LCD_SCREEN_WIDTH,LCD_SCREEN_HEIGHT,                            //屏幕缓冲区尺寸,根据项目修改
    {PS_SOLID,{1,0},0x0},                   //实线、一个点宽、黑色,不需修改!!!
    {BS_SOLID,0,HS_DIAGCROSS},               //实心填充、黑色、交叉线(无效),不需修改!!!
    0,0xffffff,   						//前景、背景
	DRMODE_SRCCOPY,                 //绘图模式,不需修改!!!
	FS_NORMAL,						//默认字体样式,不需修改!!!
	SYSTLIB,				                //系统字体
	0                               //位图信息,重新获取
};

const struct tagMBitMapINFOHEADER SysDefaultBMP[] = 
{
    sizeof(MBitMap),						/*结构体长度*/
    LCD_SCREEN_WIDTH,									/*位图宽度*/
    LCD_SCREEN_HEIGHT,									/*位图高度*/
    1,										/*层面数*/
    COLOR_LEVEL,							/*每个点的颜色表示需要的位数*/
    0,										/*压缩参数*/
	0,										/*解压后的大小*/
	0x0ec4,									/*水平分辨率*/
	0x0ec4,									/*垂直分辨率*/
	0,										/*使用的颜色数*/
	0 										/*重要的颜色*/
};
#if   COLOR_LEVEL >= 4 
const UINT32 Std1To4[256] =
{
    0X00000000, 0X0F000000, 0XF0000000, 0XFF000000, 0X000F0000, 0X0F0F0000,
    0XF00F0000, 0XFF0F0000, 0X00F00000, 0X0FF00000, 0XF0F00000, 0XFFF00000,
    0X00FF0000, 0X0FFF0000, 0XF0FF0000, 0XFFFF0000, 0X00000F00, 0X0F000F00,
    0XF0000F00, 0XFF000F00, 0X000F0F00, 0X0F0F0F00, 0XF00F0F00, 0XFF0F0F00,
    0X00F00F00, 0X0FF00F00, 0XF0F00F00, 0XFFF00F00, 0X00FF0F00, 0X0FFF0F00,
    0XF0FF0F00, 0XFFFF0F00, 0X0000F000, 0X0F00F000, 0XF000F000, 0XFF00F000,
    0X000FF000, 0X0F0FF000, 0XF00FF000, 0XFF0FF000, 0X00F0F000, 0X0FF0F000,
    0XF0F0F000, 0XFFF0F000, 0X00FFF000, 0X0FFFF000, 0XF0FFF000, 0XFFFFF000,
    0X0000FF00, 0X0F00FF00, 0XF000FF00, 0XFF00FF00, 0X000FFF00, 0X0F0FFF00,
    0XF00FFF00, 0XFF0FFF00, 0X00F0FF00, 0X0FF0FF00, 0XF0F0FF00, 0XFFF0FF00,
    0X00FFFF00, 0X0FFFFF00, 0XF0FFFF00, 0XFFFFFF00, 0X0000000F, 0X0F00000F,
    0XF000000F, 0XFF00000F, 0X000F000F, 0X0F0F000F, 0XF00F000F, 0XFF0F000F,
    0X00F0000F, 0X0FF0000F, 0XF0F0000F, 0XFFF0000F, 0X00FF000F, 0X0FFF000F,
    0XF0FF000F, 0XFFFF000F, 0X00000F0F, 0X0F000F0F, 0XF0000F0F, 0XFF000F0F,
    0X000F0F0F, 0X0F0F0F0F, 0XF00F0F0F, 0XFF0F0F0F, 0X00F00F0F, 0X0FF00F0F,
    0XF0F00F0F, 0XFFF00F0F, 0X00FF0F0F, 0X0FFF0F0F, 0XF0FF0F0F, 0XFFFF0F0F,
    0X0000F00F, 0X0F00F00F, 0XF000F00F, 0XFF00F00F, 0X000FF00F, 0X0F0FF00F,
    0XF00FF00F, 0XFF0FF00F, 0X00F0F00F, 0X0FF0F00F, 0XF0F0F00F, 0XFFF0F00F,
    0X00FFF00F, 0X0FFFF00F, 0XF0FFF00F, 0XFFFFF00F, 0X0000FF0F, 0X0F00FF0F,
    0XF000FF0F, 0XFF00FF0F, 0X000FFF0F, 0X0F0FFF0F, 0XF00FFF0F, 0XFF0FFF0F,
    0X00F0FF0F, 0X0FF0FF0F, 0XF0F0FF0F, 0XFFF0FF0F, 0X00FFFF0F, 0X0FFFFF0F,
    0XF0FFFF0F, 0XFFFFFF0F, 0X000000F0, 0X0F0000F0, 0XF00000F0, 0XFF0000F0,
    0X000F00F0, 0X0F0F00F0, 0XF00F00F0, 0XFF0F00F0, 0X00F000F0, 0X0FF000F0,
    0XF0F000F0, 0XFFF000F0, 0X00FF00F0, 0X0FFF00F0, 0XF0FF00F0, 0XFFFF00F0,
    0X00000FF0, 0X0F000FF0, 0XF0000FF0, 0XFF000FF0, 0X000F0FF0, 0X0F0F0FF0,
    0XF00F0FF0, 0XFF0F0FF0, 0X00F00FF0, 0X0FF00FF0, 0XF0F00FF0, 0XFFF00FF0,
    0X00FF0FF0, 0X0FFF0FF0, 0XF0FF0FF0, 0XFFFF0FF0, 0X0000F0F0, 0X0F00F0F0,
    0XF000F0F0, 0XFF00F0F0, 0X000FF0F0, 0X0F0FF0F0, 0XF00FF0F0, 0XFF0FF0F0,
    0X00F0F0F0, 0X0FF0F0F0, 0XF0F0F0F0, 0XFFF0F0F0, 0X00FFF0F0, 0X0FFFF0F0,
    0XF0FFF0F0, 0XFFFFF0F0, 0X0000FFF0, 0X0F00FFF0, 0XF000FFF0, 0XFF00FFF0,
    0X000FFFF0, 0X0F0FFFF0, 0XF00FFFF0, 0XFF0FFFF0, 0X00F0FFF0, 0X0FF0FFF0,
    0XF0F0FFF0, 0XFFF0FFF0, 0X00FFFFF0, 0X0FFFFFF0, 0XF0FFFFF0, 0XFFFFFFF0,
    0X000000FF, 0X0F0000FF, 0XF00000FF, 0XFF0000FF, 0X000F00FF, 0X0F0F00FF,
    0XF00F00FF, 0XFF0F00FF, 0X00F000FF, 0X0FF000FF, 0XF0F000FF, 0XFFF000FF,
    0X00FF00FF, 0X0FFF00FF, 0XF0FF00FF, 0XFFFF00FF, 0X00000FFF, 0X0F000FFF,
    0XF0000FFF, 0XFF000FFF, 0X000F0FFF, 0X0F0F0FFF, 0XF00F0FFF, 0XFF0F0FFF,
    0X00F00FFF, 0X0FF00FFF, 0XF0F00FFF, 0XFFF00FFF, 0X00FF0FFF, 0X0FFF0FFF,
    0XF0FF0FFF, 0XFFFF0FFF, 0X0000F0FF, 0X0F00F0FF, 0XF000F0FF, 0XFF00F0FF,
    0X000FF0FF, 0X0F0FF0FF, 0XF00FF0FF, 0XFF0FF0FF, 0X00F0F0FF, 0X0FF0F0FF,
    0XF0F0F0FF, 0XFFF0F0FF, 0X00FFF0FF, 0X0FFFF0FF, 0XF0FFF0FF, 0XFFFFF0FF,
    0X0000FFFF, 0X0F00FFFF, 0XF000FFFF, 0XFF00FFFF, 0X000FFFFF, 0X0F0FFFFF,
    0XF00FFFFF, 0XFF0FFFFF, 0X00F0FFFF, 0X0FF0FFFF, 0XF0F0FFFF, 0XFFF0FFFF,
    0X00FFFFFF, 0X0FFFFFFF, 0XF0FFFFFF, 0XFFFFFFFF
};
#endif

#ifndef WIN32
UINT8  *GetGraphicBuffer(VOID)
{
	return g_byLcdBuffer;
}
#endif
/****************************************************************************/
/* FUNCTION:   GraphSetActiveLcd                                          */
/* DESCRIPTION:Change Active Lcd device                                    */
/* INPUTS:     byDeviceName    new lcd device name                         */
/* OUTPUTS:    BOOL                                                        */
/* RETURN:     Initialize g_dcSystemDC with Lcd device information         */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Qorse       2002-10-03     added for multitask                          */
/****************************************************************************/
BOOL GraphSetActiveLcd(UINT uLcdIndex)
{
    MBitMapInfoHeader   *pBmpHead;
    MRect rc;
    NU_DRIVER_REQUEST   request;                                    /*Device operation request*/
	
	
	if ((g_pLcdDriver = (NU_DRIVER * )GetIODriverFromName(DRV_NAME_LCD))== NULL)   //Get Lcd device handle
    {
        return FALSE;                                               //No default Lcd 
    }
#ifdef __ED928__
	if ((g_pExtLcdDriver = (NU_DRIVER * )GetIODriverFromName(DRV_NAME_EXTLCD))== NULL)   //Get Lcd device handle
    {
        return FALSE;                                               //No default Lcd 
    }
#endif

    g_uLcdIndex = uLcdIndex;  
	memset((UINT8*)&request,0,sizeof(NU_DRIVER_REQUEST));
	request.nu_function = NU_STATUS;                                //Open Lcd
    request.nu_request_info.nu_status.nu_logical_unit = uLcdIndex;
    request.nu_supplemental = LCD_IOCTL_ON;
    if (NU_Request_Driver(g_pLcdDriver, &request) != NU_SUCCESS)
    {
        return FALSE;
    }

#ifdef __ED928__
	memset((UINT8*)&request,0,sizeof(NU_DRIVER_REQUEST));
	request.nu_function = NU_STATUS;                                //Open Lcd
    request.nu_request_info.nu_status.nu_logical_unit = 1;
    request.nu_supplemental = LCD_IOCTL_ON;
    if (NU_Request_Driver(g_pExtLcdDriver, &request) != NU_SUCCESS)
    {
        return FALSE;
    }
#endif

    memset((UINT8*)&request,0,sizeof(NU_DRIVER_REQUEST));
    request.nu_function = NU_STATUS;                                //Open background Light
    request.nu_request_info.nu_status.nu_logical_unit = uLcdIndex;
    request.nu_supplemental = LCD_IOCTL_BLON;
    if (NU_Request_Driver(g_pLcdDriver, &request) != NU_SUCCESS)
    {
        return FALSE;
    }

    GraphInitialDC();
    /***********************************************************/
    
    pBmpHead = (MBitMapInfoHeader*)(g_dcSystemDC.dcBitMapInfo);
    pBmpHead->biSize = sizeof(MBitMapInfoHeader);

    memset((UINT8*)&request,0,sizeof(NU_DRIVER_REQUEST));
    request.nu_function = NU_STATUS;                                //Initialize Bitmap buffer by device
    request.nu_request_info.nu_status.nu_logical_unit = uLcdIndex;
    request.nu_supplemental = LCD_IOCTL_CREATEBMPHEAD;
    request.nu_supplemental_ptr = pBmpHead;
    if (NU_Request_Driver(g_pLcdDriver, &request) != NU_SUCCESS)
    {
        return FALSE;
    }
	
    /* Must  change g_dcSystemDCsizes at the same time*/
    g_dcSystemDC.dcWidth = pBmpHead->biWidth;                       /*DC width*/
    g_dcSystemDC.dcHeight = pBmpHead->biHeight;                     /*DC height*/
/*	g_bHZRevert = FALSE;
	if (pBmpHead->biBitCount == 1 
		&& *(UINT32*)(g_dcSystemDC.dcBitMapInfo->bmpColors)==0x00ffffff)
	{
		g_bHZRevert = TRUE;
	}
*/	
    rc.x = 0;                                                       /*Set device operate area*/
    rc.width = g_dcSystemDC.dcWidth;
    rc.y = 0;
    rc.height = g_dcSystemDC.dcHeight;                              /*Mapping the whole screen*/
    memset((UINT8*)&request,0,sizeof(NU_DRIVER_REQUEST));
	request.nu_function = NU_STATUS;
    request.nu_request_info.nu_status.nu_logical_unit = uLcdIndex;
    request.nu_supplemental = LCD_IOCTL_SETOPRAREA;
    request.nu_supplemental_ptr = &rc;
    NU_Request_Driver(g_pLcdDriver, &request);

	return TRUE;
}

⌨️ 快捷键说明

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