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 + -
显示快捷键?