From 7ce09f624beda0cde92305089de3dcd44ee52c17 Mon Sep 17 00:00:00 2001 From: Polarix Date: Sun, 1 Dec 2019 23:04:02 +0800 Subject: [PATCH] 2019-12-01: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改文字显示为资源模式。 其他控件同步整理中。 --- DemoProc/inc/DemoResource_ASCII.h | 2 +- DemoProc/src/DemoProc.c | 65 +- DemoProc/src/List.c | 12 +- DemoProc/src/RTCNotice.c | 2 +- DemoProc/src/RealtimeGraph.c | 4 +- DemoProc/src/ScrollingText.c | 2 +- Documents/How to create font data.md | 4 +- Documents/How to transplant a platform.md | 48 +- GUI/inc/SGUI_Basic.h | 3 +- GUI/inc/SGUI_Common.h | 1 + GUI/inc/SGUI_Config.h | 2 +- GUI/inc/SGUI_FlashData.h | 4 +- GUI/inc/SGUI_Interface.h | 1 - GUI/inc/SGUI_List.h | 2 +- GUI/inc/SGUI_Notice.h | 10 +- GUI/inc/SGUI_Text.h | 34 +- GUI/inc/SGUI_Typedef.h | 77 +- GUI/src/SGUI_Basic.c | 55 +- GUI/src/SGUI_Common.c | 32 + GUI/src/SGUI_FlashData.c | 16281 +--------------- GUI/src/SGUI_Interface.c | 84 - GUI/src/SGUI_List.c | 12 +- GUI/src/SGUI_Notice.c | 20 +- GUI/src/SGUI_Text.c | 602 +- VirtualSDK/Frame/src/LCDFrame.cpp | 2 +- .../Project/CodeBlocks/VirtualSDK_wx31.cbp | 30 - 26 files changed, 575 insertions(+), 16816 deletions(-) diff --git a/DemoProc/inc/DemoResource_ASCII.h b/DemoProc/inc/DemoResource_ASCII.h index 3e97689..e2300e4 100644 --- a/DemoProc/inc/DemoResource_ASCII.h +++ b/DemoProc/inc/DemoResource_ASCII.h @@ -4,7 +4,7 @@ /* Screen 1: Multiple lines text. */ /* Start screen scroll text. */ #define DEMO_START_NOTICE (\ -"welcom to SimpleGUI demo process, ti will show you how \ +"Welcom to SimpleGUI demo process, it will show you how \ to use GUI to show and deal some user action with HMI \ interfacce.\n\ This program uses a uart port to simulate user interaction. \ diff --git a/DemoProc/src/DemoProc.c b/DemoProc/src/DemoProc.c index 91640d3..007713e 100644 --- a/DemoProc/src/DemoProc.c +++ b/DemoProc/src/DemoProc.c @@ -24,6 +24,7 @@ //= Static variable declaration. =// //=======================================================================// SGUI_SCR_DEV g_stDeviceInterface; +#if 0 HMI_SCREEN_OBJECT* g_arrpstScreenObjs[] = { &g_stHMIDemo_ScrollingText, @@ -33,6 +34,7 @@ HMI_SCREEN_OBJECT* g_arrpstScreenObjs[] = &g_stHMIDemo_VariableBox, &g_stHMI_DemoRealtimeGraph, }; +#endif HMI_ENGINE_OBJECT g_stDemoEngine; #ifndef _SIMPLE_GUI_IN_VIRTUAL_SDK_ @@ -82,8 +84,8 @@ HMI_ENGINE_RESULT InitializeHMIEngineObj(void) SGUI_SystemIF_MemorySet(&g_stDemoEngine, 0x00, sizeof(HMI_ENGINE_OBJECT)); #ifdef _SIMPLE_GUI_IN_VIRTUAL_SDK_ /* Initialize display size. */ - g_stDeviceInterface.stSize.Width = 128; - g_stDeviceInterface.stSize.Height = 64; + g_stDeviceInterface.stSize.iWidth = 128; + g_stDeviceInterface.stSize.iHeight = 64; /* Initialize interface object. */ g_stDeviceInterface.fnSetPixel = SGUI_SDK_SetPixel; g_stDeviceInterface.fnGetPixel = SGUI_SDK_GetPixel; @@ -91,15 +93,15 @@ HMI_ENGINE_RESULT InitializeHMIEngineObj(void) g_stDeviceInterface.fnSyncBuffer = SGUI_SDK_RefreshDisplay; #else /* Initialize display size. */ - g_stDeviceInterface.stSize.Width = 128; - g_stDeviceInterface.stSize.Height = 64; + g_stDeviceInterface.stSize.iWidth = 128; + g_stDeviceInterface.stSize.iHeight = 64; /* Initialize interface object. */ g_stDeviceInterface.fnSetPixel = OLED_SetPixel; g_stDeviceInterface.fnGetPixel = OLED_GetPixel; g_stDeviceInterface.fnClear = OLED_ClearDisplay; g_stDeviceInterface.fnSyncBuffer = OLED_RefreshScreen; #endif - +#if 0 do { /* Prepare HMI engine object. */ @@ -143,6 +145,9 @@ HMI_ENGINE_RESULT InitializeHMIEngineObj(void) }while(0); return eProcessResult; +#else + return HMI_RET_NORMAL; +#endif } #ifdef _SIMPLE_GUI_IN_VIRTUAL_SDK_ @@ -186,6 +191,11 @@ bool CheckEventFlag(ENV_FLAG_INDEX eIndex) /*****************************************************************************/ void DemoMainProcess(void) { + SGUI_RECT_AREA stDisplayArea = {15, 15, 50, 8}; + SGUI_POINT stInnerPos = {-4, 0}; + SGUI_AREA_SIZE stAreaSize; + char szTempBuffer[100] = {0x00}; + /*----------------------------------*/ /* Initialize */ /*----------------------------------*/ @@ -195,8 +205,52 @@ void DemoMainProcess(void) /*----------------------------------*/ /* Process */ /*----------------------------------*/ + //SGUI_Basic_DrawLine(&g_stDeviceInterface, 2, 2, 40, 40, SGUI_COLOR_FRGCLR); + SGUI_Basic_DrawRectangle(&g_stDeviceInterface, 1, 1, 126, 10, SGUI_COLOR_FRGCLR, SGUI_COLOR_BKGCLR); + stDisplayArea.iPosX = 2; + stDisplayArea.iPosY = 2; + stDisplayArea.iWidth = 124; + stDisplayArea.iHeight = 8; + stInnerPos.iPosX = 0; + stInnerPos.iPosY = 0; + SGUI_Text_DrawText(&g_stDeviceInterface, "This is text form SGUI_DEFAULT_FONT_8", &SGUI_DEFAULT_FONT_8, &stDisplayArea, &stInnerPos, SGUI_DRAW_NORMAL); + + SGUI_Basic_DrawRectangle(&g_stDeviceInterface, 1, 12, 126, 14, SGUI_COLOR_FRGCLR, SGUI_COLOR_BKGCLR); + stDisplayArea.iPosX = 2; + stDisplayArea.iPosY = 13; + stDisplayArea.iWidth = 124; + stDisplayArea.iHeight = 12; + stInnerPos.iPosX = 5; + stInnerPos.iPosY = 0; + SGUI_Text_GetTextExtent("123ABC", &SGUI_DEFAULT_FONT_12, &stAreaSize); + sprintf(szTempBuffer, "Size is (%d, %d).", stAreaSize.iWidth, stAreaSize.iHeight); + SGUI_Text_DrawText(&g_stDeviceInterface, szTempBuffer, &SGUI_DEFAULT_FONT_12, &stDisplayArea, &stInnerPos, SGUI_DRAW_NORMAL); + + SGUI_Basic_DrawRectangle(&g_stDeviceInterface, 1, 27, 126, 18, SGUI_COLOR_FRGCLR, SGUI_COLOR_BKGCLR); + stDisplayArea.iPosX = 2; + stDisplayArea.iPosY = 28; + stDisplayArea.iWidth = 124; + stDisplayArea.iHeight = 16; + stInnerPos.iPosX = 0; + stInnerPos.iPosY = 0; + SGUI_Text_DrawText(&g_stDeviceInterface, "Pixel 16 font source.", &SGUI_DEFAULT_FONT_16, &stDisplayArea, &stInnerPos, SGUI_DRAW_NORMAL); + + stDisplayArea.iPosX = -10; + stDisplayArea.iPosY = 0; + stDisplayArea.iWidth = 64; + stDisplayArea.iHeight = 64; + SGUI_Text_DrawMultipleLinesText(&g_stDeviceInterface, DEMO_START_NOTICE, &SGUI_DEFAULT_FONT_8, &stDisplayArea, -0, SGUI_DRAW_NORMAL); + + stDisplayArea.iPosX = 64; + stDisplayArea.iPosY = 0; + stDisplayArea.iWidth = 64; + stDisplayArea.iHeight = 64; + SGUI_Text_DrawMultipleLinesText(&g_stDeviceInterface, DEMO_START_NOTICE, &SGUI_DEFAULT_FONT_8, &stDisplayArea, -0, SGUI_DRAW_NORMAL); + + g_stDeviceInterface.fnSyncBuffer(); while(1) { + /* // Check and process heart-beat timer event. if(true == SysTickTimerTriggered()) { @@ -212,6 +266,7 @@ void DemoMainProcess(void) { RTCEventProc(); } + */ } } diff --git a/DemoProc/src/List.c b/DemoProc/src/List.c index 38c1eb2..76d5664 100644 --- a/DemoProc/src/List.c +++ b/DemoProc/src/List.c @@ -30,7 +30,7 @@ static HMI_ENGINE_RESULT HMI_DemoList_PostProcess(SGUI_SCR_DEV* pstIFObj, HMI_EN //=======================================================================// //= Static variable declaration. =// //=======================================================================// -static SGUI_CSZSTR s_szListTitle = DEMO_LIST_TITLE; +static SGUI_CSZSTR s_szListTitle = NULL;//DEMO_LIST_TITLE; static SGUI_CSZSTR s_arrszNoticeType[] = { DEMO_LIST_ITEM_NOTICE_TEXT, DEMO_LIST_ITEM_NOTICE_TIME}; #ifdef _SIMPLE_GUI_ENABLE_DYNAMIC_MEMORY_ static SGUI_CSZSTR s_arrszEnumedValue[] = { DEMO_LIST_ITEM_ENUM_VALUE1, DEMO_LIST_ITEM_ENUM_VALUE2, DEMO_LIST_ITEM_ENUM_VALUE3}; @@ -87,12 +87,12 @@ HMI_ENGINE_RESULT HMI_DemoList_Initialize(SGUI_SCR_DEV* pstIFObj) // Initialize list data. SGUI_SystemIF_MemorySet(&s_stDemoListObject, 0x00, sizeof(SGUI_List_STRUCT)); // Title and font size must set before initialize list object. - s_stDemoListObject.Data.Rect.PosX = 0; - s_stDemoListObject.Data.Rect.PosY = 0; - s_stDemoListObject.Data.Rect.Width = RECT_WIDTH(pstIFObj->stSize); - s_stDemoListObject.Data.Rect.Height = RECT_HEIGHT(pstIFObj->stSize); + s_stDemoListObject.Data.Rect.PosX = 5; + s_stDemoListObject.Data.Rect.PosY = 5; + s_stDemoListObject.Data.Rect.Width = 96;//RECT_WIDTH(pstIFObj->stSize); + s_stDemoListObject.Data.Rect.Height = 48; //RECT_HEIGHT(pstIFObj->stSize); s_stDemoListObject.Data.Title = s_szListTitle; - s_stDemoListObject.FontSize = SGUI_FONT_SIZE_H12; + s_stDemoListObject.FontRes = &SGUI_DEFAULT_FONT; #ifdef _SIMPLE_GUI_ENABLE_DYNAMIC_MEMORY_ s_stDemoListObject.Data.Items = NULL; s_stDemoListObject.Data.Count = 0; diff --git a/DemoProc/src/RTCNotice.c b/DemoProc/src/RTCNotice.c index 150930a..4b071eb 100644 --- a/DemoProc/src/RTCNotice.c +++ b/DemoProc/src/RTCNotice.c @@ -68,7 +68,7 @@ HMI_ENGINE_RESULT HMI_DemoRTCNotice_RefreshScreen(SGUI_SCR_DEV* pstIFObj, const sprintf(s_szRTCNoticeText, DEMO_RTC_NOTICE_TEXT_FMT, stRTCTime.Year, stRTCTime.Month, stRTCTime.Day, stRTCTime.Hour, stRTCTime.Minute, stRTCTime.Second); - SGUI_Notice_Repaint(pstIFObj, s_szRTCNoticeText, SGUI_FONT_SIZE_H12, 0, SGUI_ICON_INFORMATION); + SGUI_Notice_Repaint(pstIFObj, s_szRTCNoticeText, &SGUI_DEFAULT_FONT, 0, SGUI_ICON_INFORMATION); return HMI_RET_NORMAL; } diff --git a/DemoProc/src/RealtimeGraph.c b/DemoProc/src/RealtimeGraph.c index 511b85e..a15c68e 100644 --- a/DemoProc/src/RealtimeGraph.c +++ b/DemoProc/src/RealtimeGraph.c @@ -78,7 +78,7 @@ HMI_ENGINE_RESULT HMI_DemoRealGraph_RefreshScreen(SGUI_SCR_DEV* pstIFObj, const stTextDisplayArea.Height = 8; stTextDataArea.PosX = 0; stTextDataArea.PosY = 0; - SGUI_Text_DrawSingleLineText(pstIFObj, "Real-time graph", SGUI_FONT_SIZE_H8, &stTextDisplayArea, &stTextDataArea, SGUI_DRAW_NORMAL); + SGUI_Text_DrawSingleLineText(pstIFObj, "Real-time graph", &SGUI_DEFAULT_FONT, &stTextDisplayArea, &stTextDataArea, SGUI_DRAW_NORMAL); // Paint value. SGUI_Common_IntegerToString(s_stRealtimeGraph.Data->ValueArray[s_stRealtimeGraph.Data->ValueCount-1], szTextBuffer, 10, -15, ' '); stTextDisplayArea.PosX = 1; @@ -87,7 +87,7 @@ HMI_ENGINE_RESULT HMI_DemoRealGraph_RefreshScreen(SGUI_SCR_DEV* pstIFObj, const stTextDisplayArea.Height = 8; stTextDataArea.PosX = 0; stTextDataArea.PosY = 0; - SGUI_Text_DrawSingleLineText(pstIFObj, szTextBuffer, SGUI_FONT_SIZE_H8, &stTextDisplayArea, &stTextDataArea, SGUI_DRAW_NORMAL); + SGUI_Text_DrawSingleLineText(pstIFObj, szTextBuffer, &SGUI_DEFAULT_FONT, &stTextDisplayArea, &stTextDataArea, SGUI_DRAW_NORMAL); SGUI_RealtimeGraph_Repaint(pstIFObj, &s_stRealtimeGraph); return HMI_RET_NORMAL; } diff --git a/DemoProc/src/ScrollingText.c b/DemoProc/src/ScrollingText.c index f885a97..516f69d 100644 --- a/DemoProc/src/ScrollingText.c +++ b/DemoProc/src/ScrollingText.c @@ -82,7 +82,7 @@ HMI_SCREEN_OBJECT g_stHMIDemo_ScrollingText = { HMI_ENGINE_RESULT HMI_DemoScrollingText_Initialize(SGUI_SCR_DEV* Interface) { s_iTextOffset = HMI_TEXT_DEMO_FRAME_TEXT_HEIGHT(Interface->stSize); - s_iTextHeight = SGUI_Text_GetMultiLineTextLines(s_szDemoText, (HMI_TEXT_DEMO_FRAME_TEXT_WIDTH(Interface->stSize)/g_stFontSize[SCROLL_TEXT_FONT_SIZE].Width))*g_stFontSize[SCROLL_TEXT_FONT_SIZE].Height; + s_iTextHeight = SGUI_Text_GetMultiLineTextLines(s_szDemoText, (HMI_TEXT_DEMO_FRAME_TEXT_WIDTH(Interface->stSize)/SGUI_DEFAULT_FONT.iHalfWidth))*SGUI_DEFAULT_FONT.iHeight; s_stTextDisplayArea.PosX = HMI_TEXT_DEMO_FRAME_TEXT_POSX; s_stTextDisplayArea.PosY = HMI_TEXT_DEMO_FRAME_TEXT_POSY; s_stTextDisplayArea.Width = HMI_TEXT_DEMO_FRAME_TEXT_WIDTH(Interface->stSize); diff --git a/Documents/How to create font data.md b/Documents/How to create font data.md index e4b2242..2d17cf7 100644 --- a/Documents/How to create font data.md +++ b/Documents/How to create font data.md @@ -50,7 +50,7 @@ ### 3.4. Unicode编码   由于ANSI无法表达特定的编码,在跨地域时乱码的问题几乎无可避免,这就催生了Unicoed,这种一个联合编码集,意在使用一个字符集表达世界上所有语言所包含的所有书面符号(甚至是同一汉字的不同写法,如“户”和“戸”等),且每一个符号都有自己唯一的编码,这样一来,乱码的问题就迎刃而解了。 -  Unicode码使用3字节的长度表达一个字符,最高字节为平面(Panel)索引,范围为0x00\~0x10(十进制17),低两字节为字符码,表达范围为0\~65535。也就是说,Unicode编码的表达范围为0x000000\~0x10FFFF。 +  Unicode码使用3字节的长度表达一个字符,最高字节为平面(Panel)索引,范围为0x00~0x10(十进制17),低两字节为字符码,表达范围为0~65535。也就是说,Unicode编码的表达范围为0x000000~0x10FFFF。   其他Unicode编码的细节,网上有详细介绍,不作详述。 ### 3.5. UTF-8的编码与解码 @@ -261,7 +261,7 @@ SGUI_SIZE SGUI_Text_GetCharacterTableIndex(SGUI_UINT16 uiCharacterCode)   同时,为了方便这个文字提取与重编码的操作,我还编写了一个小工具MinimumFontLib,您可以访问码云上[MinimumFontLib的托管页面](https://gitee.com/Polarix/MinimumFontLib)获取该工具的可执行文件与源码,欢迎您试用和反馈。 ### 5. 联系开发者 -  首先,感谢您对SimpleGUI的赏识与支持。 +  首先,感谢您对SimpleGUI的赏识与支持。   虽然最早仅仅作为一套GUI接口库使用,但我最终希望SimpleGUI能够为您提供一套完整的单色屏GUI及交互设计解决方案,如果您有新的需求、提议亦或想法,欢迎在以下地址留言,或加入[QQ交流群799501887](https://jq.qq.com/?_wv=1027&k=5ahGPvK)留言交流。 >SimpleGUI@开源中国:https://www.oschina.net/p/simplegui >SimpleGUI@码云:https://gitee.com/Polarix/simplegui diff --git a/Documents/How to transplant a platform.md b/Documents/How to transplant a platform.md index e45d685..1444b0d 100644 --- a/Documents/How to transplant a platform.md +++ b/Documents/How to transplant a platform.md @@ -1,10 +1,18 @@ -如何移植SimpleGUI +

目录

+ +* [1. 概述](#1) +* [2. 向STM32F103平台上移植Demo程序](#2) +* [3. 从“Hello world”开始](#3) +* [4. HMI交互模型](#4) +* [5. 联系开发者](#5) --- -## 简介 +

1. 概述

  为了方便大家学习和使用SimpleGUI,我对Demo程序向STM32F103芯片上进行了移植并保留了工程代码,本文将演示如何搭建并使用这个工程。 -## 2. 向STM32F103平台上移植Demo程序。 +<返回到[目录](#0)/[标题](#1)> + +

2. 向STM32F103平台上移植Demo程序

#### 2.1. 概述。 @@ -14,11 +22,9 @@ #### 2.2. 准备工程模板 -  在移植和使用Demo程序之前,请先依照个人习惯,创建一个空白的STM32F103工程。工程中请不要包含诸如串口重定向等的代码实现,以避免意料之外的错误。 +  在移植和使用Demo程序之前,请先依照个人习惯,创建一个空白的STM32F103工程。工程中请不要包含诸如串口重定向等的代码实现,以避免不必要的编译错误。 -  由于演示工程中包含GB2312的字库,所以编译后体积较大,请大家在移植时,最好使用STM32F103VE/ZE芯片,以确保Flash资源的充足。 - -  当然,这并不是硬性需求,如果您确实需要在少资源的芯片中运行,后续将有介绍如何使Demo运行于诸如STM32F103C8这样的资源相对较少的芯片,毕竟SimpleGUI本身对系统资源的消耗并不高。 +  由于演示工程中包含GB2312的字库,所以编译后体积较大,请大家在移植时,最好使用STM32F103VE/ZE芯片,以确保Flash资源的充足。当然,这并不是硬性需求,如果您确实需要在少资源的芯片中运行,后续将有介绍如何使Demo运行于诸如STM32F103C8这样的资源相对较少的芯片,毕竟SimpleGUI本身对系统资源的消耗并不高。 #### 2.3. 移植Demo程序。 @@ -82,13 +88,13 @@ OLED_RST---------PB10 >![05-编译](https://images.gitee.com/uploads/images/2019/0605/230107_a423aca4_769424.png "05-编译.png") -  由于包含有12像素和16像素的中文字库,所以编译的程序比较大,这也就是为什么选用STM32F103VE/ZE这样的大容量芯片运行Demo的原因了。接下来将程序下载到芯片,下载方式请根据用户自己的硬件设备环境决定,下载完成后,OLED显示屏上就可以看到显示内容了。 +  由于包含有12像素和16像素的中文字库,所以编译的程序比较大,这也就是为什么选用STM32F103VE/ZE这样的大容量芯片运行Demo的原因了。接下来将程序下载到芯片,下载完成后,OLED显示屏上就可以看到显示内容了。 >![06-演示程序运行](https://images.gitee.com/uploads/images/2019/0605/230139_ee01cc19_769424.png "06-运行.png") #### 2.4. Demo程序的交互。 -  为了确保所有尝试使用和学习的朋友都能以最快速,最便捷的方式体验和使用SimpleGUI,Demo程序使用串口来模拟键盘进行Demo程序的交互,以此来避免大家在使用不同开发板或最小系统时,因为硬件原因导致交互实现起来困难的尴尬。 +  为了确保所有尝试使用和学习SimpleGUI的朋友都能以最快速,最便捷的方式体验和使用SimpleGUI,Demo程序使用串口来模拟键盘进行Demo程序的交互,以此来避免在使用不同开发板或最小系统时,因为硬件原因导致交互实现起来困难的尴尬。   完成前文描述的移植操作并成功烧录到芯片中运行,在确保芯片的串口正确连接到电脑后,就可以尝试与SimpleGUI的Demo程序进行交互了。在此之前,请准保好一个您习惯使用的串口调试软件,但此软件需要支持发送十六进制数据。   基于前文的操作,确保芯片硬件系统处于上电运行状态,显示屏上滚动显示关于SimpleGUI的简介内容。此时使用串口发送十六进制数据0x0020模拟空格按键操作,此时何以看到,SimpleGUI的Demo程序已经显示列表画面了。 @@ -146,9 +152,29 @@ OLED_RST---------PB10 >![10-相同的代码在C8T6上运行](https://images.gitee.com/uploads/images/2019/0605/230244_a3bd94d4_769424.png "10-精简代码在C8T6上运行.png")   为了兼容在VirtualSDK中运行、片上全字库运行和片上精简字库运行等多种情况,Demo程序中使用了DemoResource_UTF8.h、DemoResource_GB2312.h和DemoResource_ASCII.h三个文件作为显示用的资源文件,Demo程序中显示的文字均为同名不同内容的宏定义,在不同环境下根据不同的宏开关、引用不同的文件来实现切换不同显示内容的效果。 -  为了避免不同情况下的乱码,在VirtualSDK中运行时,使用的资源文件是DemoResource_UTF8.h,运行时通过iconv转换库将字符串转换为GB2312编码再进行解码和显示。 而由于在芯片上运行全字库时,由于没有足够的资源保存转码库的资源,所以使用DemoResource_GB2312.h文件,此文件本身就以GB2312形式保存无需转码,壳直接解码,而使用精简字库时,由于只有ASCII文字,所以使用DemoResource_ASCII.h文件,使界面显示英语,不使用中文字库。 +  为了避免不同情况下的乱码,在VirtualSDK中运行时,使用的资源文件是DemoResource_UTF8.h,运行时通过iconv转换库将字符串转换为GB2312编码再进行解码和显示。 而由于在芯片上运行全字库时,由于没有足够的资源保存转码库的资源,所以使用DemoResource_GB2312.h文件,此文件本身就以GB2312形式保存,无需转码。而使用精简字库时,由于只有ASCII文字,所以使用DemoResource_ASCII.h文件,使界面显示英语,不使用中文字库。 + +<返回到[目录](#0)/[标题](#2)> + +

3. 从“Hello world”开始

+ +#### 3.1准备驱动程序 +  由于SimpleGUI本身不提供屏幕设备的驱动程序,而是借助既有的硬件设备接口组织基础的绘制操作,所以在使用SimpleGUI之前,需要开发者自行准备好屏幕设备的驱动函数。至少准备好“初始化”、“读像素”和“写像素”两个函数,函数的原型需要严格按照以下形式声明和定义。 +``` +void OLED_Initialize(void); +void OLED_SetPixel(int iPosX, int iPosY, int iColor); +int OLED_GetPixel(int iPosX, int iPosY); +``` +   + +<返回到[目录](#0)/[标题](#3)> + +

4. HMI交互模型

+ +<返回到[目录](#0)/[标题](#4)> + +

5. 联系开发者

-### 4. 联系开发者   首先,感谢您对SimpleGUI的赏识与支持。   虽然最早仅仅作为一套GUI接口库使用,但我最终希望SimpleGUI能够为您提供一套完整的单色屏GUI及交互设计解决方案,如果您有新的需求、提议亦或想法,欢迎在以下地址留言,或加入[QQ交流群799501887](https://jq.qq.com/?_wv=1027&k=5ahGPvK)留言交流。 >SimpleGUI@开源中国:https://www.oschina.net/p/simplegui diff --git a/GUI/inc/SGUI_Basic.h b/GUI/inc/SGUI_Basic.h index 49d25e8..b5f525a 100644 --- a/GUI/inc/SGUI_Basic.h +++ b/GUI/inc/SGUI_Basic.h @@ -18,6 +18,7 @@ #define BASIC_FONT_WIDTH (6) #define BASIC_FONT_CHAR_DATA_SIZE (((BASIC_FONT_HEIGHT-1)/8)+1)*BASIC_FONT_WIDTH #define BASIC_FONT_DATA (SGUI_BASIC_FONT_H8) +#define SGUI_USED_BYTE(V) (((V-1)/8)+1) //Bitmap(include font) data bit operation #define SGUI_SET_PAGE_BIT(PAGE, Bit) ((PAGE) = (PAGE) | (0x01 << (Bit))) @@ -39,6 +40,6 @@ void SGUI_Basic_DrawLine(SGUI_SCR_DEV* pstIFObj, SGUI_INT uiStartX, SGUI_INT void SGUI_Basic_DrawRectangle(SGUI_SCR_DEV* pstIFObj, SGUI_UINT uiStartX, SGUI_UINT uiStartY, SGUI_UINT uiWidth, SGUI_UINT uiHeight, SGUI_COLOR eEdgeColor, SGUI_COLOR eFillColor); void SGUI_Basic_DrawCircle(SGUI_SCR_DEV* pstIFObj, SGUI_UINT uiCx, SGUI_UINT uiCy, SGUI_UINT uiRadius, SGUI_COLOR eEdgeColor, SGUI_COLOR eFillColor); void SGUI_Basic_ReverseBlockColor(SGUI_SCR_DEV* pstIFObj, SGUI_UINT uiStartX, SGUI_UINT uiStartY, SGUI_UINT uiWidth, SGUI_UINT uiHeight); -void SGUI_Basic_DrawBitMap(SGUI_SCR_DEV* pstIFObj, SGUI_RECT_AREA* pstDisplayArea, SGUI_RECT_AREA* pstDataArea, SGUI_FLASH_DATA_SOURCE eDataSource, SGUI_ROM_ADDRESS adDataStartAddr, SGUI_DRAW_MODE eDrawMode); +void SGUI_Basic_DrawBitMap(SGUI_SCR_DEV* pstIFObj, SGUI_RECT_AREA* pstDisplayArea, SGUI_POINT* pstDataArea, SGUI_BMP_RES* pstBitmapData, SGUI_DRAW_MODE eDrawMode); #endif diff --git a/GUI/inc/SGUI_Common.h b/GUI/inc/SGUI_Common.h index 31afd98..0315fdb 100644 --- a/GUI/inc/SGUI_Common.h +++ b/GUI/inc/SGUI_Common.h @@ -26,6 +26,7 @@ //=======================================================================// //= Public function declaration. =// //=======================================================================// +void SGUI_Common_AdaptDisplayInfo(SGUI_RECT_AREA* pstDisplayArea, SGUI_POINT* pstInnerPos); SGUI_SIZE SGUI_Common_IntegerToStringWithDecimalPoint(SGUI_INT iInteger, SGUI_UINT uiDecimalPlaces, SGUI_SZSTR pszStringBuffer, SGUI_INT iAlignment, SGUI_CHAR cFillCharacter); SGUI_SIZE SGUI_Common_IntegerToString(SGUI_INT iInteger, SGUI_SZSTR pszStringBuffer, SGUI_UINT uiBase, SGUI_INT iAlignment, SGUI_CHAR cFillCharacter); SGUI_UINT SGUI_Common_ConvertStringToUnsignedInteger(SGUI_SZSTR szString, SGUI_CHAR** ppcEndPointer, SGUI_UINT uiBase); diff --git a/GUI/inc/SGUI_Config.h b/GUI/inc/SGUI_Config.h index 7f71959..178a15f 100644 --- a/GUI/inc/SGUI_Config.h +++ b/GUI/inc/SGUI_Config.h @@ -20,6 +20,6 @@ //=======================================================================// //= Used for SimpleGUI demo process. =// //=======================================================================// -#define _SIMPLE_GUI_NON_ASCII_ +//#define _SIMPLE_GUI_NON_ASCII_ #endif // _INCLUDE_SIMPLE_GUI_CONFIG_H_ diff --git a/GUI/inc/SGUI_FlashData.h b/GUI/inc/SGUI_FlashData.h index 11a8fc0..9a7ebef 100644 --- a/GUI/inc/SGUI_FlashData.h +++ b/GUI/inc/SGUI_FlashData.h @@ -8,11 +8,13 @@ //=======================================================================// //= Public variable declaration. =// //=======================================================================// +extern const SGUI_FONT_RES SGUI_DEFAULT_FONT_8; +extern const SGUI_FONT_RES SGUI_DEFAULT_FONT_12; +extern const SGUI_FONT_RES SGUI_DEFAULT_FONT_16; //#ifdef _SIMPLE_GUI_VIRTUAL_ENVIRONMENT_SIMULATOR_ extern const SGUI_CBYTE SGUI_FONT_H8[]; extern const SGUI_CBYTE SGUI_FONT_H12[]; extern const SGUI_CBYTE SGUI_FONT_H16[]; -extern const SGUI_CBYTE SGUI_FONT_H32[]; extern const SGUI_CBYTE SGUI_NOTICE_ICON_DATA[]; //#endif diff --git a/GUI/inc/SGUI_Interface.h b/GUI/inc/SGUI_Interface.h index a4c1712..f18509c 100644 --- a/GUI/inc/SGUI_Interface.h +++ b/GUI/inc/SGUI_Interface.h @@ -49,6 +49,5 @@ SGUI_SIZE SGUI_SystemIF_StringLength(SGUI_CSZSTR szString); SGUI_SZSTR SGUI_SystemIF_StringCopy(SGUI_SZSTR szDest, SGUI_CSZSTR szSrc); SGUI_SZSTR SGUI_SystemIF_StringLengthCopy(SGUI_SZSTR szDest, SGUI_CSZSTR szSrc, SGUI_SIZE sSize); void SGUI_SystemIF_GetNowTime(SGUI_TIME* pstTime); -SGUI_SIZE SGUI_SystemIF_GetFlashData(SGUI_SCR_DEV* pstIFObj, SGUI_FLASH_DATA_SOURCE eDataSource, SGUI_ROM_ADDRESS adStartAddr, SGUI_SIZE sReadSize); #endif // __INCLUDED_SGUI_INTERFACE_H__ diff --git a/GUI/inc/SGUI_List.h b/GUI/inc/SGUI_List.h index 517328b..e79a9dc 100644 --- a/GUI/inc/SGUI_List.h +++ b/GUI/inc/SGUI_List.h @@ -74,7 +74,7 @@ typedef struct SGUI_List_DATA Data; SGUI_List_CONTROL ControlVariable; SGUI_List_SUBELEMENT SubElement; - SGUI_FONT_SIZE FontSize; + const SGUI_FONT_RES* FontRes; }SGUI_List_STRUCT; //=======================================================================// diff --git a/GUI/inc/SGUI_Notice.h b/GUI/inc/SGUI_Notice.h index c6dbad4..a329565 100644 --- a/GUI/inc/SGUI_Notice.h +++ b/GUI/inc/SGUI_Notice.h @@ -15,18 +15,10 @@ //=======================================================================// //= Data type definition. =// //=======================================================================// -typedef enum -{ - SGUI_ICON_ERROR = 0, - SGUI_ICON_INFORMATION, - SGUI_ICON_QUESTION, - SGUI_ICON_WARNING, - SGUI_ICON_NONE, -}SGUI_NOTICE_ICON_IDX; //=======================================================================// //= Public function declaration. =// //=======================================================================// -SGUI_SIZE SGUI_Notice_Repaint(SGUI_SCR_DEV* pstIFObj, SGUI_CSZSTR szNoticeText, SGUI_FONT_SIZE iFontSize, SGUI_INT uiTextOffset, SGUI_NOTICE_ICON_IDX eIcon); +SGUI_SIZE SGUI_Notice_Repaint(SGUI_SCR_DEV* pstIFObj, SGUI_CSZSTR szNoticeText, const SGUI_FONT_RES* pstFontRes, SGUI_INT uiTextOffset, SGUI_NOTICE_ICON_IDX eIcon); #endif // __INCLUDE_GUI_NOTICE_H__ diff --git a/GUI/inc/SGUI_Text.h b/GUI/inc/SGUI_Text.h index 6b2648a..e3e97b4 100644 --- a/GUI/inc/SGUI_Text.h +++ b/GUI/inc/SGUI_Text.h @@ -10,47 +10,27 @@ //= User Macro definition. =// //=======================================================================// #define FONT_LIB_ADDR 0X00000 -#define FONT_LIB_OFFSET_ASCII (-32) -#define FONT_LIB_OFFSET_GB2312_SYMBOL (95) -#define FONT_LIB_OFFSET_GB2312_CHARL1 (659) // Max font size is 64 pix, maximum of font data size is 64 * 8 = 512 Bytes. -#define FONT_DATA_BUFFER_SIZE (512) #define TEXT_NUMBER_STR_LENGTH_MAX (12) #define TEXT_PLACEHOLDER_CHARACTER ('*') +#define SGUI_IS_VISIBLE_CHAR(C) ((C>0x1F) && (C<0x7F)) //=======================================================================// //= Data type definition. =// //=======================================================================// -typedef struct -{ - const SGUI_UINT16 Size; - const SGUI_UINT16 Width; - const SGUI_UINT16 Height; - const SGUI_UINT16 HalfCharDataSize; -}SGUI_FONT_SIZE_STRUCT; - -typedef enum -{ - SGUI_FONT_SIZE_H6 = 0, - SGUI_FONT_SIZE_H8, - SGUI_FONT_SIZE_H12, - SGUI_FONT_SIZE_H16, - SGUI_FONT_SIZE_H24, - SGUI_FONT_SIZE_H32, - SGUI_FONT_SIZE_MAX, -}SGUI_FONT_SIZE; //=======================================================================// //= Public variable declaration. =// //=======================================================================// -extern const SGUI_FONT_SIZE_STRUCT g_stFontSize[]; //=======================================================================// //= Public function declaration. =// //=======================================================================// -void SGUI_Text_DrawSingleLineText(SGUI_SCR_DEV* pstIFObj, SGUI_CSZSTR szTextBuffer, SGUI_FONT_SIZE eFontSize, SGUI_RECT_AREA* pstDisplayArea, SGUI_RECT_AREA* pstStringDataArea, SGUI_DRAW_MODE eFontMode); -SGUI_SIZE SGUI_Text_DrawMultipleLinesText(SGUI_SCR_DEV* pstIFObj, SGUI_CSZSTR szTextBuffer, SGUI_FONT_SIZE eFontSize, SGUI_RECT_AREA* pstDisplayArea, SGUI_INT iTopOffset, SGUI_DRAW_MODE eFontMode); -SGUI_SIZE SGUI_Text_GetTextGraphicsWidth(SGUI_CSZSTR szText, SGUI_FONT_SIZE eFontSize); -SGUI_SIZE SGUI_Text_GetMultiLineTextLines(SGUI_CSZSTR szNoticeText, SGUI_SIZE uiHalfWidthCharInLine); +void SGUI_Text_GetTextExtent(SGUI_CSZSTR cszTextBuffer, const SGUI_FONT_RES* pstFontRes, SGUI_AREA_SIZE* pstTextExtent); +void SGUI_Text_DrawText(SGUI_SCR_DEV* pstIFObj, SGUI_CSZSTR cszTextBuffer, const SGUI_FONT_RES* pstFontRes, SGUI_RECT_AREA* pstDisplayArea, SGUI_POINT* pstInnerPos, SGUI_DRAW_MODE eFontMode); +SGUI_SIZE SGUI_Text_DrawMultipleLinesText(SGUI_SCR_DEV* pstIFObj, SGUI_CSZSTR szTextBuffer, const SGUI_FONT_RES* pstFontRes, SGUI_RECT_AREA* pstDisplayArea, SGUI_INT iTopOffset, SGUI_DRAW_MODE eFontMode); +SGUI_SIZE SGUI_Text_GetTextGraphicsWidth(SGUI_CSZSTR szText, const SGUI_FONT_RES* pstFontRes); +SGUI_SIZE SGUI_Text_GetMultiLineTextLines(SGUI_CSZSTR cszText, const SGUI_FONT_RES* pstFontRes, SGUI_SIZE uiDisplayAreaWidth); +SGUI_SIZE SGUI_Text_GetCharacterData(const SGUI_FONT_RES* pstFontRes, SGUI_UINT32 uiCode, SGUI_BYTE* pDataBuffer, SGUI_SIZE sBufferSize); #endif diff --git a/GUI/inc/SGUI_Typedef.h b/GUI/inc/SGUI_Typedef.h index a706975..0f9754a 100644 --- a/GUI/inc/SGUI_Typedef.h +++ b/GUI/inc/SGUI_Typedef.h @@ -10,14 +10,14 @@ //=======================================================================// //= User Macro definition. =// //=======================================================================// -#define RECT_X_START(ST) ((ST).PosX) -#define RECT_X_END(ST) (((ST).PosX + (ST).Width - 1)) -#define RECT_Y_START(ST) ((ST).PosY) -#define RECT_Y_END(ST) (((ST).PosY + (ST).Height - 1)) -#define RECT_WIDTH(ST) ((ST).Width) -#define RECT_HEIGHT(ST) ((ST).Height) -#define RECT_VALID_WIDTH(ST) ((RECT_X_START(ST)>0)?RECT_WIDTH(ST):(RECT_WIDTH(ST)+RECT_X_START(ST))) -#define RECT_VALID_HEIGHT(ST) ((RECT_Y_START(ST)>0)?RECT_HEIGHT(ST):(RECT_HEIGHT(ST)+RECT_Y_START(ST))) +#define RECT_X_START(ST) ((ST).iPosX) +#define RECT_X_END(RC, POS) (((POS).iPosX + (RC).iWidth - 1)) +#define RECT_Y_START(ST) ((ST).iPosY) +#define RECT_Y_END(RC, POS) (((POS).iPosY + (RC).iHeight - 1)) +#define RECT_WIDTH(ST) ((ST).iWidth) +#define RECT_HEIGHT(ST) ((ST).iHeight) +#define RECT_VALID_WIDTH(DATA, POS) ((RECT_X_START(POS)>0)?RECT_WIDTH(DATA):(RECT_WIDTH(DATA)+RECT_X_START(POS))) +#define RECT_VALID_HEIGHT(DATA, POS) ((RECT_Y_START(POS)>0)?RECT_HEIGHT(DATA):(RECT_HEIGHT(DATA)+RECT_Y_START(POS))) #define SGUI_DEVPF_IF_DEFINE(R, FN, PARAM) typedef R(*FN)PARAM #define SGUI_BMP_DATA_BUFFER_SIZE (512) @@ -57,22 +57,22 @@ typedef SGUI_UINT32 SGUI_ROM_ADDRESS; typedef struct { - SGUI_INT PosX; - SGUI_INT PosY; - SGUI_INT Width; - SGUI_INT Height; + SGUI_INT iPosX; + SGUI_INT iPosY; + SGUI_INT iWidth; + SGUI_INT iHeight; }SGUI_RECT_AREA; typedef struct { - SGUI_INT Width; - SGUI_INT Height; + SGUI_INT iWidth; + SGUI_INT iHeight; }SGUI_AREA_SIZE; typedef struct { - SGUI_INT PosX; - SGUI_INT PosY; + SGUI_INT iPosX; + SGUI_INT iPosY; }SGUI_POINT; typedef struct @@ -98,25 +98,6 @@ typedef enum SGUI_DRAW_REVERSE = 1, }SGUI_DRAW_MODE; -// Declare data source flag here. -typedef enum -{ - SGUI_FONT_SRC_NONE = 0, - SGUI_FONT_SRC_H6, - SGUI_FONT_SRC_H8, - SGUI_FONT_SRC_H12, - SGUI_FONT_SRC_H16, - SGUI_NOTICE_ICON, - SGUI_FONT_SRC_UNKNOWN, -}SGUI_FLASH_DATA_SOURCE; - -typedef struct -{ - SGUI_FLASH_DATA_SOURCE Source; - SGUI_ROM_ADDRESS StartAddr; - SGUI_SIZE Length; -}SGUI_BMP_DATA; - // Screen device operation interface type declare. SGUI_DEVPF_IF_DEFINE(SGUI_INT, SGUI_FN_IF_INITIALIZE, (void)); SGUI_DEVPF_IF_DEFINE(void, SGUI_FN_IF_CLEAR, (void)); @@ -128,8 +109,10 @@ SGUI_DEVPF_IF_DEFINE(void, SGUI_FN_IF_REFRESH, (void)); // System function interface type declare. SGUI_DEVPF_IF_DEFINE(void, SGUI_FN_IF_GET_RTC, (SGUI_INT iYear, SGUI_INT iMounth, SGUI_INT iDay, SGUI_INT iWeekDay, SGUI_INT iHour, SGUI_INT iMinute, SGUI_INT iSecond)); -SGUI_DEVPF_IF_DEFINE(SGUI_SIZE, SGUI_FN_IF_READ_FLASH, (SGUI_INT iSourceID, SGUI_ROM_ADDRESS adStartAddr, SGUI_SIZE sReadSize, SGUI_BYTE* pOutputBuffer)); -SGUI_DEVPF_IF_DEFINE(SGUI_INT, SGUI_FN_IF_GET_CHAR_INDEX, (SGUI_CSZSTR cszSrc)); +SGUI_DEVPF_IF_DEFINE(SGUI_INT, SGUI_FN_IF_GET_CHAR_INDEX, (SGUI_UINT32 uiCode)); +SGUI_DEVPF_IF_DEFINE(SGUI_CSZSTR, SGUI_FN_IF_STEP_NEXT, (SGUI_CSZSTR cszSrc, SGUI_UINT32* puiCode)); +SGUI_DEVPF_IF_DEFINE(SGUI_SIZE, SGUI_FN_IF_GET_DATA, (SGUI_SIZE sStartAddr, SGUI_BYTE* pDataBuffer, SGUI_SIZE sReadSize)); +SGUI_DEVPF_IF_DEFINE(SGUI_BOOL, SGUI_FN_IF_IS_FULL_WIDTH, (SGUI_UINT32 uiCode)); typedef struct { @@ -149,4 +132,24 @@ typedef struct SGUI_FN_IF_REFRESH fnSyncBuffer; }SGUI_SCR_DEV; +typedef struct +{ + SGUI_INT iHeight; + SGUI_INT iHalfWidth; + SGUI_INT iFullWidth; + //SGUI_INT iHorizontalSpacing; + //SGUI_INT iVerticalSpacing; + SGUI_FN_IF_GET_CHAR_INDEX fnGetIndex; + SGUI_FN_IF_GET_DATA fnGetData; + SGUI_FN_IF_STEP_NEXT fnStepNext; + SGUI_FN_IF_IS_FULL_WIDTH fnIsFullWidth; +}SGUI_FONT_RES; + +typedef struct +{ + SGUI_INT iHeight; + SGUI_INT iWidth; + SGUI_BYTE* pData; +}SGUI_BMP_RES; + #endif // _INCLUDE_GUI_TYPEDEF_H_ diff --git a/GUI/src/SGUI_Basic.c b/GUI/src/SGUI_Basic.c index 35d384e..02a5104 100644 --- a/GUI/src/SGUI_Basic.c +++ b/GUI/src/SGUI_Basic.c @@ -153,6 +153,7 @@ void SGUI_Basic_ClearScreen(SGUI_SCR_DEV* pstIFObj) } else { + /* Draw a blank rectangle for clean screen when clean function is not supposed. */ SGUI_Basic_DrawRectangle(pstIFObj, 0, 0, RECT_WIDTH(pstIFObj->stSize), RECT_HEIGHT(pstIFObj->stSize), SGUI_COLOR_BKGCLR, SGUI_COLOR_BKGCLR); } } @@ -439,13 +440,13 @@ void SGUI_Basic_ReverseBlockColor(SGUI_SCR_DEV* pstIFObj, SGUI_UINT uiStartX, SG /** Params: **/ /** @ pstIFObj[in]: SimpleGUI object pointer. **/ /** @ pstDisplayArea[in]: Display area position and size. **/ -/** @ pstDataArea[in]: Data area size and display offset. **/ -/** @ pDataBuffer[in]: Bit map data buffer. **/ +/** @ pstInnerPos[in]: Data area size and display offset. **/ +/** @ pstBitmapData[in]: Bitmap object, include size and data. **/ /** @ eDrawMode[in] Bit map display mode(normal or reverse color). **/ /** Return: None. **/ /** Notice: None. **/ /*************************************************************************/ -void SGUI_Basic_DrawBitMap(SGUI_SCR_DEV* pstIFObj, SGUI_RECT_AREA* pstDisplayArea, SGUI_RECT_AREA* pstDataArea, SGUI_FLASH_DATA_SOURCE eDataSource, SGUI_ROM_ADDRESS adDataStartAddr, SGUI_DRAW_MODE eDrawMode) +void SGUI_Basic_DrawBitMap(SGUI_SCR_DEV* pstIFObj, SGUI_RECT_AREA* pstDisplayArea, SGUI_POINT* pstInnerPos, SGUI_BMP_RES* pstBitmapData, SGUI_DRAW_MODE eDrawMode) { /*----------------------------------*/ /* Variable Declaration */ @@ -454,8 +455,7 @@ void SGUI_Basic_DrawBitMap(SGUI_SCR_DEV* pstIFObj, SGUI_RECT_AREA* pstDisplayAre SGUI_INT iBmpPixX, iBmpPixY; SGUI_UINT uiDrawnWidthIndex, uiDrawnHeightIndex; SGUI_UINT uiPixIndex; - SGUI_BYTE* pData; - SGUI_SIZE sBitmapDataSize; + SGUI_BYTE* pData; /*----------------------------------*/ /* Initialize */ @@ -468,66 +468,51 @@ void SGUI_Basic_DrawBitMap(SGUI_SCR_DEV* pstIFObj, SGUI_RECT_AREA* pstDisplayAre /*----------------------------------*/ // Only draw in visible area of screen. if( (RECT_X_START(*pstDisplayArea) < RECT_WIDTH(pstIFObj->stSize)) && (RECT_Y_START(*pstDisplayArea) < RECT_HEIGHT(pstIFObj->stSize)) && - (RECT_X_END(*pstDisplayArea) > 0) && (RECT_Y_END(*pstDisplayArea) > 0)) + (RECT_X_END(*pstDisplayArea, *pstDisplayArea) > 0) && (RECT_Y_END(*pstDisplayArea, *pstDisplayArea) > 0)) { - // Recalculate display area and data area. - if(RECT_X_START(*pstDisplayArea) < 0) - { - RECT_X_START(*pstDataArea) += RECT_X_START(*pstDisplayArea); - RECT_WIDTH(*pstDisplayArea) += RECT_X_START(*pstDisplayArea); - RECT_X_START(*pstDisplayArea) = 0; - } - if(RECT_Y_START(*pstDisplayArea) < 0) - { - RECT_Y_START(*pstDataArea) += RECT_Y_START(*pstDisplayArea); - RECT_HEIGHT(*pstDisplayArea) += RECT_Y_START(*pstDisplayArea); - RECT_Y_START(*pstDisplayArea) = 0; - } + // Adapt text display area and data area. + SGUI_Common_AdaptDisplayInfo(pstDisplayArea, pstInnerPos); // Only process drawing when valid display data existed - if((RECT_VALID_WIDTH(*pstDataArea) > 0) && (RECT_VALID_HEIGHT(*pstDataArea) > 0)) + if((RECT_VALID_WIDTH(*pstBitmapData, *pstInnerPos) > 0) && (RECT_VALID_HEIGHT(*pstBitmapData, *pstInnerPos) > 0)) { - // Calculate bitmap data size. - sBitmapDataSize = pstDataArea->Width * ((pstDataArea->Height-1)/8+1); - // Read flash data. - SGUI_SystemIF_GetFlashData(pstIFObj, eDataSource, adDataStartAddr, sBitmapDataSize); // Set loop start parameter of x coordinate iDrawPixX = RECT_X_START(*pstDisplayArea); iBmpPixX = 0; - if(RECT_X_START(*pstDataArea) > 0) + if(RECT_X_START(*pstInnerPos) > 0) { - iDrawPixX += RECT_X_START(*pstDataArea); + iDrawPixX += RECT_X_START(*pstInnerPos); } else { - iBmpPixX -= RECT_X_START(*pstDataArea); + iBmpPixX -= RECT_X_START(*pstInnerPos); } uiDrawnWidthIndex = iBmpPixX; // Loop for x coordinate; - while((uiDrawnWidthIndexstSize))) + while((uiDrawnWidthIndexstSize))) { // Redirect to data array for column. - pData = pstIFObj->arrBmpDataBuffer + iBmpPixX; + pData = pstBitmapData->pData+iBmpPixX; // Set loop start parameter of y coordinate iDrawPixY = RECT_Y_START(*pstDisplayArea); iBmpPixY = 0; - if(RECT_Y_START(*pstDataArea) > 0) + if(RECT_Y_START(*pstInnerPos) > 0) { - iDrawPixY += RECT_Y_START(*pstDataArea); + iDrawPixY += RECT_Y_START(*pstInnerPos); } else { - iBmpPixY -= RECT_Y_START(*pstDataArea); + iBmpPixY -= RECT_Y_START(*pstInnerPos); } uiDrawnHeightIndex = iBmpPixY; uiPixIndex = iBmpPixY % 8; - pData += (iBmpPixY / 8) * RECT_WIDTH(*pstDataArea); + pData += (iBmpPixY / 8) * RECT_WIDTH(*pstBitmapData); // Loop for y coordinate; - while((uiDrawnHeightIndexstSize))) + while((uiDrawnHeightIndexstSize))) { if(uiPixIndex == 8) { uiPixIndex = 0; - pData += RECT_WIDTH(*pstDataArea); + pData += RECT_WIDTH(*pstBitmapData); } if(SGUI_GET_PAGE_BIT(*pData, uiPixIndex) != eDrawMode) { diff --git a/GUI/src/SGUI_Common.c b/GUI/src/SGUI_Common.c index 6657df4..87163b5 100644 --- a/GUI/src/SGUI_Common.c +++ b/GUI/src/SGUI_Common.c @@ -14,6 +14,38 @@ //=======================================================================// //= Function define. =// //=======================================================================// +/*************************************************************************/ +/** Function Name: SGUI_Common_AdaptDisplayInfo **/ +/** Purpose: Adapt display area data and internal position data **/ +/** order by display area position and screen size. **/ +/** Params: **/ +/** @ pstDisplayArea[in/out]: Display area info. **/ +/** @ pstInnerPos[in/out]: Display position info in display rectangular **/ +/** area . **/ +/** Return: None. **/ +/** Notice: This function will reset display information on **/ +/** given data, make sure the display area is within **/ +/** the screen area. **/ +/*************************************************************************/ +void SGUI_Common_AdaptDisplayInfo(SGUI_RECT_AREA* pstDisplayArea, SGUI_POINT* pstInnerPos) +{ + if((NULL != pstDisplayArea) && (NULL != pstInnerPos)) + { + if(RECT_X_START(*pstDisplayArea) < 0) + { + RECT_X_START(*pstInnerPos) += RECT_X_START(*pstDisplayArea); + RECT_WIDTH(*pstDisplayArea) += RECT_X_START(*pstDisplayArea); + RECT_X_START(*pstDisplayArea) = 0; + } + if(RECT_Y_START(*pstDisplayArea) < 0) + { + RECT_Y_START(*pstInnerPos) += RECT_Y_START(*pstDisplayArea); + RECT_HEIGHT(*pstDisplayArea) += RECT_Y_START(*pstDisplayArea); + RECT_Y_START(*pstDisplayArea) = 0; + } + } +} + /*************************************************************************/ /** Function Name: SGUI_Common_IntegerToStringWithDecimalPoint **/ /** Purpose: Convert number to a string and insert decimal point.**/ diff --git a/GUI/src/SGUI_FlashData.c b/GUI/src/SGUI_FlashData.c index 760dc22..60bc255 100644 --- a/GUI/src/SGUI_FlashData.c +++ b/GUI/src/SGUI_FlashData.c @@ -11,6 +11,78 @@ #include "SGUI_Common.h" #include "SGUI_FlashData.h" +//=======================================================================// +//= User Macro definition. =// +//=======================================================================// +#define SGUI_FONT_RES_DECLARE(NAME) SGUI_SIZE SGUI_Resource_GetFontData_##NAME(SGUI_SIZE sStartAddr, SGUI_BYTE* pDataBuffer, SGUI_SIZE sReadSize) +#define SGUI_FONT_RES_DEFINE(NAME, SRC) SGUI_SIZE SGUI_Resource_GetFontData_##NAME(SGUI_SIZE sStartAddr, SGUI_BYTE* pDataBuffer, SGUI_SIZE sReadSize)\ + {\ + SGUI_SIZE sReadCount;\ + const SGUI_BYTE* pSrc = SRC+sStartAddr;\ + SGUI_BYTE* pDest = pDataBuffer;\ + if(NULL != pDataBuffer)\ + {\ + for(sReadCount=0; sReadCount 0x19) && (uiCode < 0x7F)) + { + iIndex = uiCode - (0x20); + } + return iIndex; +} + +SGUI_CSZSTR SGUI_Resource_StepNext(SGUI_CSZSTR cszSrc, SGUI_UINT32* puiCode) +{ + /*----------------------------------*/ + /* Variable Declaration */ + /*----------------------------------*/ + const SGUI_CHAR* pcNextChar; + + /*----------------------------------*/ + /* Initialize */ + /*----------------------------------*/ + pcNextChar = cszSrc; + + /*----------------------------------*/ + /* Process */ + /*----------------------------------*/ + if(NULL != pcNextChar) + { + *puiCode = *pcNextChar; + pcNextChar++; + } + + return pcNextChar; +} + +SGUI_BOOL SGUI_Resource_IsFullWidth_ASCII(SGUI_UINT32 uiCode) +{ + return SGUI_FALSE; +} + +SGUI_FONT_RES_DEFINE(8, SGUI_FONT_H8); +SGUI_FONT_RES_DEFINE(12, SGUI_FONT_H12); +SGUI_FONT_RES_DEFINE(16, SGUI_FONT_H16); diff --git a/GUI/src/SGUI_Interface.c b/GUI/src/SGUI_Interface.c index 42b0fff..222f87b 100644 --- a/GUI/src/SGUI_Interface.c +++ b/GUI/src/SGUI_Interface.c @@ -449,87 +449,3 @@ SGUI_SZSTR SGUI_SystemIF_StringCopy(SGUI_SZSTR szDest, SGUI_CSZSTR szSrc) return pcDestPtr; } - -/*****************************************************************************/ -/** Function Name: SGUI_FlashData_GetFilash **/ -/** Purpose: Read a byte array form ROM(ex. flash). **/ -/** Params: **/ -/** @ pstIFObj[in]: SimpleGUI device interface object pointer. **/ -/** @ eDataSource[in]: Data source. **/ -/** @ adStartAddr[in]: Read data array start address in source. **/ -/** @ sReadSize[in]: Number of data want to read. **/ -/** Return: None. **/ -/** Notice: You can specify a data source by eDataSource parameter, **/ -/** and it always used when your data is in different ROM **/ -/** space yet. For example, Font data is in external flash **/ -/** and bitmap data is in chip. **/ -/** Text paint and bitmap paint in SimpleGUI are processed **/ -/** as bitmap yet, so tt is necessary to distinguish data **/ -/** sources in some cases. **/ -/** This function will be re-write when use in different **/ -/** hardware PF. **/ -/*****************************************************************************/ -SGUI_SIZE SGUI_SystemIF_GetFlashData(SGUI_SCR_DEV* pstIFObj, SGUI_FLASH_DATA_SOURCE eDataSource, SGUI_ROM_ADDRESS adStartAddr, SGUI_SIZE sReadSize) -{ - /*----------------------------------*/ - /* Variable Declaration */ - /*----------------------------------*/ - SGUI_ROM_ADDRESS adBaseAddr; - SGUI_BYTE* pOutPutDataPtr; - SGUI_CBYTE* pDataSource; - SGUI_SIZE sReadBytes; - - /*----------------------------------*/ - /* Initialize */ - /*----------------------------------*/ - adBaseAddr = adStartAddr; - pOutPutDataPtr = pstIFObj->arrBmpDataBuffer; - pDataSource = NULL; - - sReadBytes = 0; - - /*----------------------------------*/ - /* Process */ - /*----------------------------------*/ - if((eDataSource > SGUI_FONT_SRC_NONE) && (eDataSource < SGUI_FONT_SRC_UNKNOWN) && (sReadSize > 0)) - { - switch(eDataSource) - { - case SGUI_FONT_SRC_H8: - { - pDataSource = SGUI_FONT_H8; - break; - } - case SGUI_FONT_SRC_H12: - { - pDataSource = SGUI_FONT_H12; - break; - } - case SGUI_FONT_SRC_H16: - { - pDataSource = SGUI_FONT_H16; - break; - } - - case SGUI_NOTICE_ICON: - { - pDataSource = SGUI_NOTICE_ICON_DATA; - break; - } - default: - { - /* no valid data. */ - break; - } - } - - if(NULL != pDataSource) - { - for(sReadBytes=0; sReadBytesData); pstSubElement = &(pstList->SubElement); // Initialize visible area control parameter. - pstListControl->ListTitleHeight = LIST_TITLE_HEIGHT(pstList->FontSize); // List title height, Include border. + pstListControl->ListTitleHeight = LIST_TITLE_HEIGHT(pstList->FontRes->iHeight); // List title height, Include border. pstListControl->PageStartIndex = 0; pstListControl->SelectIndex = 0; pstListControl->ItemPosYOffSet = 0; pstListControl->FirstVisibleItemPosY = LIST_RECT_START_Y(pstListData->Rect)+LIST_EDGE_SIZE; - pstListControl->ListItemHeight = g_stFontSize[pstList->FontSize].Height + (LIST_ITEM_TEXT_BLANK_EDGEY*2); + pstListControl->ListItemHeight = pstList->FontRes->iHeight + (LIST_ITEM_TEXT_BLANK_EDGEY*2); pstListControl->VisibleItemsAreaHeight = LIST_RECT_HEIGHT(pstListData->Rect)-LIST_EDGE_SIZE*2; // Reset list items display area when title is existed. if(NULL != pstList->Data.Title) @@ -211,7 +211,7 @@ void SGUI_List_Repaint(SGUI_SCR_DEV* pstIFObj, SGUI_List_STRUCT* pstList) stTitleTextDisplayArea.Width = pstListData->Rect.Width - 4; stTitleTextDisplayArea.Height = g_stFontSize[pstList->FontSize].Height; - SGUI_Text_DrawSingleLineText(pstIFObj, pstListData->Title, pstList->FontSize, + SGUI_Text_DrawSingleLineText(pstIFObj, pstListData->Title, SGUI_DEFAULT_FONT, &stTitleTextDisplayArea, &stTitleTextDataArea, SGUI_DRAW_NORMAL); } // Draw list items @@ -413,7 +413,7 @@ void SGUI_List_DrawItem(SGUI_SCR_DEV* pstIFObj, SGUI_List_STRUCT* pstList, SGUI_ // Draw list item text. SGUI_Text_DrawSingleLineText( pstIFObj, - pstListItemPointer->Text, pstList->FontSize, + pstListItemPointer->Text, SGUI_DEFAULT_FONT, &stItemTextDisplayArea, &stItemTextDataArea, SGUI_DRAW_NORMAL); // Prepare draw parameter text. @@ -470,7 +470,7 @@ void SGUI_List_DrawItem(SGUI_SCR_DEV* pstIFObj, SGUI_List_STRUCT* pstList, SGUI_ } } // Draw parameter text. - SGUI_Text_DrawSingleLineText(pstIFObj, szParameterStringBuffer, pstList->FontSize, &stItemTextDisplayArea, &stItemTextDataArea, SGUI_DRAW_NORMAL); + SGUI_Text_DrawSingleLineText(pstIFObj, szParameterStringBuffer, SGUI_DEFAULT_FONT, &stItemTextDisplayArea, &stItemTextDataArea, SGUI_DRAW_NORMAL); } } } diff --git a/GUI/src/SGUI_Notice.c b/GUI/src/SGUI_Notice.c index f90fbb7..31dd7bf 100644 --- a/GUI/src/SGUI_Notice.c +++ b/GUI/src/SGUI_Notice.c @@ -33,8 +33,8 @@ #define NOTICE_TEXT_POSX_NOICON (NOTICE_BOX_POSX+NOTICE_BOX_MARGIN*2) #define NOTICE_TEXT_POSX (NOTICE_TEXT_POSX_NOICON+NOTICE_ICON_SIZE+NOTICE_BOX_MARGIN*2) #define NOTICE_TEXT_POSY(SCR_OBJ, HEIGHT) (NOTICE_BOX_POSY(SCR_OBJ, HEIGHT)+NOTICE_BOX_MARGIN) -#define NOTICE_TEXT_LINES_MAX(SCR_OBJ, FONT_SIZE) (NOTICE_TEXT_AREA_WIDTH(SCR_OBJ)/g_stFontSize[FONT_SIZE].Width) -#define NOTICE_TEXT_LINES_MAX_NOICON(SCR_OBJ, FONT_SIZE) (NOTICE_TEXT_AREA_WIDTH_NOICON(SCR_OBJ)/g_stFontSize[FONT_SIZE].Width) +#define NOTICE_TEXT_LINES_MAX(SCR_OBJ, FONT_WIDTH) (NOTICE_TEXT_AREA_WIDTH(SCR_OBJ)/FONT_WIDTH) +#define NOTICE_TEXT_LINES_MAX_NOICON(SCR_OBJ, FONT_WIDTH) (NOTICE_TEXT_AREA_WIDTH_NOICON(SCR_OBJ)/FONT_WIDTH) //=======================================================================// //= Function define. =// @@ -52,7 +52,7 @@ /** Return: Remaining text height display. **/ /** Notice: None. **/ /*************************************************************************/ -SGUI_SIZE SGUI_Notice_Repaint(SGUI_SCR_DEV* pstIFObj, SGUI_CSZSTR szNoticeText, SGUI_FONT_SIZE iFontSize, SGUI_INT uiTextOffset, SGUI_NOTICE_ICON_IDX eIcon) +SGUI_SIZE SGUI_Notice_Repaint(SGUI_SCR_DEV* pstIFObj, SGUI_CSZSTR szNoticeText, const SGUI_FONT_RES* pstFontRes, SGUI_INT uiTextOffset, SGUI_NOTICE_ICON_IDX eIcon) { /*----------------------------------*/ /* Variable Declaration */ @@ -62,7 +62,8 @@ SGUI_SIZE SGUI_Notice_Repaint(SGUI_SCR_DEV* pstIFObj, SGUI_CSZSTR szNoticeText, SGUI_SIZE uiTextLines; SGUI_RECT_AREA stTextDisplayArea; SGUI_RECT_AREA stIconDisplayArea, stIconDataArea; - SGUI_CSZSTR pszNoticeTextPtr; + SGUI_CSZSTR pszNoticeTextPtr; + SGUI_SIZE sIconDataAddr; /*----------------------------------*/ /* Process */ @@ -72,11 +73,11 @@ SGUI_SIZE SGUI_Notice_Repaint(SGUI_SCR_DEV* pstIFObj, SGUI_CSZSTR szNoticeText, // Get max line of notice text. if(SGUI_ICON_NONE != eIcon) { - uiLineCount = SGUI_Text_GetMultiLineTextLines(pszNoticeTextPtr, NOTICE_TEXT_LINES_MAX(*pstIFObj, iFontSize)); + uiLineCount = SGUI_Text_GetMultiLineTextLines(pszNoticeTextPtr, NOTICE_TEXT_LINES_MAX(*pstIFObj, pstFontRes->iHalfWidth)); } else { - uiLineCount = SGUI_Text_GetMultiLineTextLines(pszNoticeTextPtr, NOTICE_TEXT_LINES_MAX_NOICON(*pstIFObj, iFontSize)); + uiLineCount = SGUI_Text_GetMultiLineTextLines(pszNoticeTextPtr, NOTICE_TEXT_LINES_MAX_NOICON(*pstIFObj, pstFontRes->iHalfWidth)); } if(uiLineCount < 2) { @@ -100,7 +101,12 @@ SGUI_SIZE SGUI_Notice_Repaint(SGUI_SCR_DEV* pstIFObj, SGUI_CSZSTR szNoticeText, stIconDataArea.PosY = 0; stIconDataArea.Width = NOTICE_ICON_SIZE; stIconDataArea.Height = NOTICE_ICON_SIZE; - SGUI_Basic_DrawBitMap(pstIFObj, &stIconDisplayArea, &stIconDataArea, SGUI_NOTICE_ICON, eIcon*(NOTICE_ICON_SIZE*(NOTICE_ICON_SIZE/8)), SGUI_DRAW_NORMAL); + + sIconDataAddr = (NOTICE_ICON_SIZE*NOTICE_ICON_SIZE/8)*eIcon; + + SGUI_SystemIF_GetFlashData(pstIFObj, SGUI_NOTICE_ICON, sIconDataAddr, NOTICE_ICON_SIZE*NOTICE_ICON_SIZE); + + SGUI_Basic_DrawBitMap(pstIFObj, &stIconDisplayArea, &stIconDataArea, pstIFObj->arrBmpDataBuffer, SGUI_DRAW_NORMAL); } // Draw text; if(SGUI_ICON_NONE != eIcon) diff --git a/GUI/src/SGUI_Text.c b/GUI/src/SGUI_Text.c index 6d4eb15..9c7dda8 100644 --- a/GUI/src/SGUI_Text.c +++ b/GUI/src/SGUI_Text.c @@ -14,503 +14,317 @@ //=======================================================================// //= Static variable declaration. =// //=======================================================================// -const SGUI_FONT_SIZE_STRUCT g_stFontSize[SGUI_FONT_SIZE_MAX] = { {6, 4, 6, 4}, - {8, 6, 8, 6}, - {12, 6, 12, 12}, - {16, 8, 16, 16}, - {24, 12, 24, 36}, - {32, 16, 32, 64}}; //=======================================================================// //= Static function declaration. =// //=======================================================================// -static SGUI_SIZE SGUI_Text_GetCharacterTableIndex(SGUI_UINT16 uiCharacterCode); -static SGUI_FLASH_DATA_SOURCE SGUI_Text_GetFontResource(SGUI_FONT_SIZE eFontSize); //=======================================================================// //= Function define. =// //=======================================================================// +/*************************************************************************/ +/** Function Name: SGUI_Text_GetTextExtent **/ +/** Purpose: Get the area size if show given text completely. **/ +/** Params: **/ +/** @ szText[in]: Text array pointer. **/ +/** @ pstFontRes[in]: Font resource, improve font size info. **/ +/** @ pstTextExtent[out]: Text extent size. **/ +/** Return: Next character X coordinate in current line. **/ +/** Limitation: None. **/ +/*************************************************************************/ +void SGUI_Text_GetTextExtent(SGUI_CSZSTR cszText, const SGUI_FONT_RES* pstFontRes, SGUI_AREA_SIZE* pstTextExtent) +{ + /*----------------------------------*/ + /* Variable Declaration */ + /*----------------------------------*/ + const SGUI_CHAR* pcChar; + SGUI_UINT32 uiCharacterCode; + + /*----------------------------------*/ + /* Initialize */ + /*----------------------------------*/ + pcChar = cszText; + + /*----------------------------------*/ + /* Process */ + /*----------------------------------*/ + if((NULL != pcChar) && (NULL != pstTextExtent)) + { + pstTextExtent->iHeight = pstFontRes->iHeight; + pstTextExtent->iWidth=0; + while('\0' != *pcChar) + { + uiCharacterCode = 0; + pcChar = pstFontRes->fnStepNext(pcChar, &uiCharacterCode); + if(SGUI_IS_VISIBLE_CHAR(uiCharacterCode)) + { + pstTextExtent->iWidth+=(pstFontRes->fnIsFullWidth(uiCharacterCode)?pstFontRes->iFullWidth:pstFontRes->iHalfWidth); + } + } + } +} /*************************************************************************/ /** Function Name: SGUI_Text_DrawSingleLineText **/ /** Purpose: Write a single line text in a fixed area. **/ /** Params: **/ -/** @szText[in]: Text array pointer. **/ -/** @eFontSize[in]: Font size. **/ -/** @pstDisplayArea[in]: Display area size. **/ -/** @pstTextDataArea[in]: Text area size. **/ -/** @eFontMode[in] Character display mode(normal or reverse color).**/ -/** Return: Next character X coordinate in current line. **/ -/** Limitation: None. **/ +/** @ pstIFObj[in]: SimpleGUI object pointer. **/ +/** @ cszText[in]: Text array pointer. **/ +/** @ pstFontRes[in]: Font resource object. **/ +/** @ pstDisplayArea[in]: Display area size. **/ +/** @ pstInnerPos[in]: Text paint position in display area. **/ +/** @ eFontMode[in] Character display mode(normal or reverse color). **/ +/** Return: None. **/ /*************************************************************************/ -void SGUI_Text_DrawSingleLineText(SGUI_SCR_DEV* pstIFObj, SGUI_CSZSTR szText, SGUI_FONT_SIZE eFontSize, SGUI_RECT_AREA* pstDisplayArea, SGUI_RECT_AREA* pstTextDataArea, SGUI_DRAW_MODE eFontMode) +void SGUI_Text_DrawText(SGUI_SCR_DEV* pstIFObj, SGUI_CSZSTR cszText, const SGUI_FONT_RES* pstFontRes, SGUI_RECT_AREA* pstDisplayArea, SGUI_POINT* pstInnerPos, SGUI_DRAW_MODE eFontMode) { + /*----------------------------------*/ /* Variable Declaration */ /*----------------------------------*/ - SGUI_SZSTR pcTextPointer; // Text character pointer. - SGUI_UINT16 uiCodeHighByte, uiCodeLowByte, uiCharacterCode; // Character byte, might be tow bytes. - SGUI_UINT16 uiFontWidth, uiFontHeight, uiCharacterWidth; // Font size and character graphics width. - SGUI_UINT32 uiCharacterDataSize; - SGUI_RECT_AREA stCharacterDataArea = {0}; + const SGUI_CHAR* pcChar; // Text character pointer. + SGUI_UINT32 uiCharacterCode; // Character byte, might be tow bytes. SGUI_COLOR eBackColor; - SGUI_FLASH_DATA_SOURCE eFontResource; - SGUI_ROM_ADDRESS adFontDataAddr; - SGUI_INT iFontDataIndex; + SGUI_BMP_RES stCharBitmap; + SGUI_POINT stPaintPos; /*----------------------------------*/ /* Initialize */ /*----------------------------------*/ // Initialize variable. - pcTextPointer = (SGUI_SZSTR)ENCODE(szText); - uiCharacterCode = 0x0000; + pcChar = cszText; + uiCharacterCode = 0x00000000; eBackColor = (eFontMode == SGUI_DRAW_NORMAL)?SGUI_COLOR_BKGCLR:SGUI_COLOR_FRGCLR; - // Get font graphics size. - uiFontWidth = g_stFontSize[eFontSize].Width; - uiFontHeight = g_stFontSize[eFontSize].Height; - uiCharacterDataSize = (((uiFontHeight-1)/8)+1)*uiFontWidth; - eFontResource = SGUI_Text_GetFontResource(eFontSize); + /*----------------------------------*/ /* Process */ /*----------------------------------*/ - if((szText != NULL) && (RECT_X_START(*pstDisplayArea) < RECT_WIDTH(pstIFObj->stSize)) && (SGUI_FONT_SRC_UNKNOWN != eFontResource)) - { - // Recalculate text display area and data area. - if(RECT_X_START(*pstDisplayArea) < 0) - { - RECT_X_START(*pstTextDataArea) += RECT_X_START(*pstDisplayArea); - RECT_WIDTH(*pstDisplayArea) += RECT_X_START(*pstDisplayArea); - RECT_X_START(*pstDisplayArea) = 0; - } - if(RECT_Y_START(*pstDisplayArea) < 0) - { - RECT_Y_START(*pstTextDataArea) += RECT_Y_START(*pstDisplayArea); - RECT_HEIGHT(*pstDisplayArea) += RECT_Y_START(*pstDisplayArea); - RECT_Y_START(*pstDisplayArea) = 0; - } + if((NULL != pcChar) && (RECT_X_START(*pstDisplayArea) < RECT_WIDTH(pstIFObj->stSize))) + { + // Adapt text display area and data area. + SGUI_Common_AdaptDisplayInfo(pstDisplayArea, pstInnerPos); // Clear text area. SGUI_Basic_DrawRectangle(pstIFObj, RECT_X_START(*pstDisplayArea), RECT_Y_START(*pstDisplayArea), RECT_WIDTH(*pstDisplayArea), RECT_HEIGHT(*pstDisplayArea), eBackColor, eBackColor); // Initialize drawing area data. - RECT_X_START(stCharacterDataArea) = RECT_X_START(*pstTextDataArea); - RECT_Y_START(stCharacterDataArea) = RECT_Y_START(*pstTextDataArea); - RECT_HEIGHT(stCharacterDataArea) = uiFontHeight; + RECT_X_START(stPaintPos) = RECT_X_START(*pstInnerPos); + RECT_Y_START(stPaintPos) = RECT_Y_START(*pstInnerPos); + RECT_HEIGHT(stCharBitmap) = pstFontRes->iHeight; + stCharBitmap.pData = pstIFObj->arrBmpDataBuffer; + // Loop for Each char. - while(((NULL != pcTextPointer) && ('\0' != *pcTextPointer)) && (RECT_X_START(stCharacterDataArea) < RECT_WIDTH(*pstDisplayArea))) + while(((NULL != pcChar) && ('\0' != *pcChar)) && (RECT_X_START(stPaintPos) < RECT_WIDTH(*pstDisplayArea))) { - // Get character. - uiCodeHighByte = 0x00; - uiCodeLowByte = 0x00; - // Process with ASCII code. - if((SGUI_BYTE)(*pcTextPointer) < 0x7F) + uiCharacterCode = 0; + pcChar = pstFontRes->fnStepNext(pcChar, &uiCharacterCode); + if(SGUI_IS_VISIBLE_CHAR(uiCharacterCode)) { - uiCodeLowByte = (SGUI_BYTE)(*pcTextPointer); - uiCharacterWidth = uiFontWidth; - pcTextPointer++; + RECT_WIDTH(stCharBitmap) = pstFontRes->fnIsFullWidth(uiCharacterCode)?pstFontRes->iFullWidth:pstFontRes->iHalfWidth; + if(RECT_X_END(stCharBitmap, stPaintPos) >= 0) + { + SGUI_Text_GetCharacterData(pstFontRes, uiCharacterCode, pstIFObj->arrBmpDataBuffer, SGUI_BMP_DATA_BUFFER_SIZE); + SGUI_Basic_DrawBitMap(pstIFObj, pstDisplayArea, &stPaintPos, &stCharBitmap, eFontMode); + } + RECT_X_START(stPaintPos) += RECT_WIDTH(stCharBitmap); } - // Process with GB2312. - else if(((SGUI_BYTE)(*pcTextPointer) >= 0xA1) && ((SGUI_BYTE)(*pcTextPointer) <= 0xF7)) - { - uiCodeHighByte = (SGUI_BYTE)*pcTextPointer++; - uiCodeLowByte = (SGUI_BYTE)*pcTextPointer++; - uiCharacterWidth = uiFontWidth << 1; //uiCharacterWidth = uiFontWidth * 2; for full-width character; - } - // Invalid character - else - { - uiCharacterWidth = 0; - pcTextPointer++; - continue; - } - uiCharacterCode = uiCodeHighByte; - uiCharacterCode = uiCharacterCode << 8; - uiCharacterCode = uiCharacterCode | uiCodeLowByte; - - RECT_WIDTH(stCharacterDataArea) = uiCharacterWidth; - - if(RECT_X_END(stCharacterDataArea) >= 0) - { - iFontDataIndex = SGUI_Text_GetCharacterTableIndex(uiCharacterCode); - adFontDataAddr = iFontDataIndex * uiCharacterDataSize; - SGUI_Basic_DrawBitMap(pstIFObj, pstDisplayArea, &stCharacterDataArea, eFontResource, adFontDataAddr, eFontMode); - } - RECT_X_START(stCharacterDataArea) += uiCharacterWidth; } } } - -/*****************************************************************************/ -/** Function Name: GUI_DrawMultipleLinesText **/ -/** Purpose: Write a mulitiplt line text in a rectangular area. **/ -/** Params: **/ -/** @szText[in]: Text array pointer. **/ -/** @eFontSize[in]: Font size. **/ -/** @pstDisplayArea[in]: Display area size. **/ -/** @eFontMode[in]: Character display mode(normal or reverse color). **/ -/** Return: Next character X coordinate in current line. **/ -/** Notice: None. **/ -/*****************************************************************************/ -SGUI_SIZE SGUI_Text_DrawMultipleLinesText(SGUI_SCR_DEV* pstIFObj, SGUI_CSZSTR szText, SGUI_FONT_SIZE eFontSize, SGUI_RECT_AREA* pstDisplayArea, SGUI_INT iTopOffset, SGUI_DRAW_MODE eFontMode) +/*************************************************************************/ +/** Function Name: GUI_DrawMultipleLinesText **/ +/** Purpose: Write a mulitiplt line text in a rectangular area. **/ +/** Params: **/ +/** @ pstIFObj[in]: SimpleGUI object pointer. **/ +/** @ cszText[in]: Text array pointer. **/ +/** @ pstFontRes[in]: Font resource object. **/ +/** @ pstDisplayArea[in]: Display area size. **/ +/** @ iTopOffset[in]: Text paint offset in vertical. **/ +/** @ eFontMode[in]: Character display mode(normal or reverse color). **/ +/** Return: Used line count. **/ +/** Notice: None. **/ +/*************************************************************************/ +SGUI_SIZE SGUI_Text_DrawMultipleLinesText(SGUI_SCR_DEV* pstIFObj, SGUI_CSZSTR cszText, const SGUI_FONT_RES* pstFontRes, SGUI_RECT_AREA* pstDisplayArea, SGUI_INT iTopOffset, SGUI_DRAW_MODE eFontMode) { /*----------------------------------*/ /* Variable Declaration */ /*----------------------------------*/ - SGUI_SZSTR pcTextPointer; - SGUI_UINT16 uiCodeHighByte, uiCodeLowByte, uiCharacterCode; - SGUI_UINT16 uiFontWidth, uiFontHeight; - SGUI_UINT32 uiCharacterDataSize; + const SGUI_CHAR* pcChar; + SGUI_UINT32 uiCharacterCode; SGUI_SIZE uiLines; - SGUI_RECT_AREA stCharacterDataArea = {0}; SGUI_COLOR eBackColor; - SGUI_FLASH_DATA_SOURCE eFontResource; - SGUI_ROM_ADDRESS adFontDataAddr; - SGUI_INT iFontDataIndex; + SGUI_BMP_RES stCharBitmap; + SGUI_POINT stPaintPos; + SGUI_INT iStartOffsetX; /*----------------------------------*/ /* Initialize */ /*----------------------------------*/ - pcTextPointer = (SGUI_SZSTR)ENCODE(szText); - uiCharacterCode = 0x0000; + pcChar = cszText; + uiCharacterCode = 0; uiLines = 0; eBackColor = (eFontMode == SGUI_DRAW_NORMAL)?SGUI_COLOR_BKGCLR:SGUI_COLOR_FRGCLR; - // Get font graphics size. - uiFontWidth = g_stFontSize[eFontSize].Width; - uiFontHeight = g_stFontSize[eFontSize].Height; - uiCharacterDataSize = (((uiFontHeight-1)/8)+1)*uiFontWidth; - eFontResource = SGUI_Text_GetFontResource(eFontSize); /*----------------------------------*/ /* Process */ /*----------------------------------*/ - if((szText != NULL) && (RECT_X_START(*pstDisplayArea) < RECT_WIDTH(pstIFObj->stSize))) + if((cszText != NULL) && (RECT_X_START(*pstDisplayArea) < RECT_WIDTH(pstIFObj->stSize))) { - // Recalculate text display area and data area. - if(RECT_X_START(*pstDisplayArea) < 0) - { - RECT_X_START(stCharacterDataArea) += RECT_X_START(*pstDisplayArea); - RECT_WIDTH(*pstDisplayArea) += RECT_X_START(*pstDisplayArea); - RECT_X_START(*pstDisplayArea) = 0; - } - if(RECT_Y_START(*pstDisplayArea) < 0) - { - RECT_Y_START(stCharacterDataArea) += RECT_Y_START(*pstDisplayArea); - RECT_HEIGHT(*pstDisplayArea) += RECT_Y_START(*pstDisplayArea); - RECT_Y_START(*pstDisplayArea) = 0; - } + // Initialize drawing position. + RECT_X_START(stPaintPos) = 0; + RECT_Y_START(stPaintPos) = iTopOffset; + // Adapt text display area and data area. + SGUI_Common_AdaptDisplayInfo(pstDisplayArea, &stPaintPos); + iStartOffsetX = stPaintPos.iPosX; // Clear text area. SGUI_Basic_DrawRectangle(pstIFObj, RECT_X_START(*pstDisplayArea), RECT_Y_START(*pstDisplayArea), RECT_WIDTH(*pstDisplayArea), RECT_HEIGHT(*pstDisplayArea), eBackColor, eBackColor); - // Initialize drawing area data. - RECT_X_START(stCharacterDataArea) = 0; - RECT_Y_START(stCharacterDataArea) = iTopOffset; - RECT_HEIGHT(stCharacterDataArea) = uiFontHeight; - uiLines = 1; + RECT_HEIGHT(stCharBitmap) = pstFontRes->iHeight; + uiLines = 1; + stCharBitmap.pData = pstIFObj->arrBmpDataBuffer; // Loop for each word in display area. - if(NULL != pcTextPointer) - { - while(*pcTextPointer != '\0') - { - uiCodeHighByte = 0x00; - uiCodeLowByte = 0x00; - // Judge change line symbol. - if(*pcTextPointer == '\n') - { - if(RECT_X_START(stCharacterDataArea) == 0) - { - // Ignore change lines in line start. - } - else - { - // Change lines. - RECT_X_START(stCharacterDataArea) = 0; - RECT_Y_START(stCharacterDataArea) += uiFontHeight; - uiLines ++; - } - pcTextPointer++; - continue; - } - // Process with ASCII code. - if(((SGUI_BYTE)(*pcTextPointer) < 0x7F) && ((SGUI_BYTE)(*pcTextPointer) >= 0x20)) - { - uiCodeLowByte = (SGUI_BYTE)*pcTextPointer++; - RECT_WIDTH(stCharacterDataArea) = uiFontWidth; - } - // Process with GB2312. - else if(((SGUI_BYTE)(*pcTextPointer) >= 0xA1) && ((SGUI_BYTE)(*pcTextPointer) <= 0xF7)) - { - uiCodeHighByte = (SGUI_BYTE)*pcTextPointer++; - uiCodeLowByte = (SGUI_BYTE)*pcTextPointer++; - RECT_WIDTH(stCharacterDataArea) = uiFontWidth << 1; - } - // Invalid character - else - { - pcTextPointer++; - RECT_WIDTH(stCharacterDataArea) = 0; - continue; - } - uiCharacterCode = uiCodeHighByte; - uiCharacterCode = uiCharacterCode << 8; - uiCharacterCode = uiCharacterCode | uiCodeLowByte; + while(((NULL != pcChar) && ('\0' != *pcChar))) + { + uiCharacterCode = 0; + pcChar = pstFontRes->fnStepNext(pcChar, &uiCharacterCode); - // Judge change line - if(RECT_X_END(stCharacterDataArea) >= RECT_WIDTH(*pstDisplayArea)) - { - // Change lines. - RECT_X_START(stCharacterDataArea) = 0; - RECT_Y_START(stCharacterDataArea) += uiFontHeight; - uiLines ++; - } - // Draw characters. - if((RECT_Y_END(stCharacterDataArea) >= 0) && (RECT_Y_START(stCharacterDataArea) < RECT_HEIGHT(*pstDisplayArea))) - { - // Draw character. - iFontDataIndex = SGUI_Text_GetCharacterTableIndex(uiCharacterCode); - adFontDataAddr = iFontDataIndex * uiCharacterDataSize; - SGUI_Basic_DrawBitMap(pstIFObj, pstDisplayArea, &stCharacterDataArea, eFontResource, adFontDataAddr, eFontMode); + // Judge change line symbol. + if(uiCharacterCode == '\n') + { + // Change lines. + RECT_X_START(stPaintPos) = iStartOffsetX; + RECT_Y_START(stPaintPos) += pstFontRes->iHeight; + uiLines ++; + continue; + } + // Get character width; + RECT_WIDTH(stCharBitmap) = pstFontRes->fnIsFullWidth(uiCharacterCode)?pstFontRes->iFullWidth:pstFontRes->iHalfWidth; - } - else - { - // character is not in visible area, ignore. - } - RECT_X_START(stCharacterDataArea) += RECT_WIDTH(stCharacterDataArea); - } - } + // Judge change line + if(RECT_X_END(stCharBitmap, stPaintPos) >= RECT_WIDTH(*pstDisplayArea)) + { + // Change lines. + RECT_X_START(stPaintPos) = iStartOffsetX; + RECT_Y_START(stPaintPos) += pstFontRes->iHeight; + uiLines ++; + } + // Draw characters. + if((RECT_Y_END(stCharBitmap, stPaintPos) >= 0) && (RECT_Y_START(stPaintPos) < RECT_HEIGHT(*pstDisplayArea))) + { + // Draw character. + SGUI_Text_GetCharacterData(pstFontRes, uiCharacterCode, pstIFObj->arrBmpDataBuffer, SGUI_BMP_DATA_BUFFER_SIZE); + SGUI_Basic_DrawBitMap(pstIFObj, pstDisplayArea, &stPaintPos, &stCharBitmap, eFontMode); + } + else + { + // character is not in visible area, ignore. + } + RECT_X_START(stPaintPos) += RECT_WIDTH(stCharBitmap); + } } return uiLines; } -/*****************************************************************************/ -/** Function Name: SGUI_Text_GetCharacterTableIndex **/ -/** Purpose: Get character index in font mode table. **/ -/** Params: **/ -/** @uiCharacterCode[in]: Data buffer pointer of read font data. **/ -/** Return: Font mode data index in table. **/ -/** Limitation: This function need to override when use external flash **/ -/** ROM data, user must redefine the data offset by the **/ -/** actual data. **/ -/*****************************************************************************/ -SGUI_SIZE SGUI_Text_GetCharacterTableIndex(SGUI_UINT16 uiCharacterCode) +/*************************************************************************/ +/** Function Name: SGUI_Text_GetMultiLineTextLines **/ +/** Purpose: Get a string's lines in a fixed width area. **/ +/** Resources: None. **/ +/** Params: **/ +/** @ cszText[in]: Text array pointer. **/ +/** @ pstFontRes[in]: Font resource object. **/ +/** @ uiDisplayAreaWidth[in]: Display area width. **/ +/** Return: String lines. **/ +/*************************************************************************/ +SGUI_SIZE SGUI_Text_GetMultiLineTextLines(SGUI_CSZSTR cszText, const SGUI_FONT_RES* pstFontRes, SGUI_SIZE uiDisplayAreaWidth) { /*----------------------------------*/ /* Variable Declaration */ /*----------------------------------*/ - SGUI_UINT16 uiCharacterCodeHighByte; - SGUI_UINT16 uiCharacterCodeLowByte; - SGUI_SIZE uiFontTableIndex; + SGUI_SIZE uiLineNumber, uiLineLength; + SGUI_UINT32 uiCharacterCode; + SGUI_UINT16 uiCharWidth; + SGUI_CSZSTR pcChar; /*----------------------------------*/ /* Initialize */ /*----------------------------------*/ - uiCharacterCodeHighByte = (uiCharacterCode >> 8) & 0x00FF; - uiCharacterCodeLowByte = uiCharacterCode & 0x00FF; + uiLineLength = 0; + uiLineNumber = 1; + pcChar = cszText; /*----------------------------------*/ /* Process */ /*----------------------------------*/ - // ASCII code. - if((0 == uiCharacterCodeHighByte) && (uiCharacterCodeLowByte < 128)) + while('\0' != *pcChar) { - uiFontTableIndex = (uiCharacterCodeLowByte + FONT_LIB_OFFSET_ASCII); - } - // GB2312 punctuation - else if((0xAA > uiCharacterCodeHighByte) && (0xA0 < uiCharacterCodeHighByte)) - { - uiFontTableIndex = ((((uiCharacterCodeHighByte-0xA1)*94 + (uiCharacterCodeLowByte-0xA1))*2) + FONT_LIB_OFFSET_GB2312_SYMBOL); - } - // GB2312 level one character. - else if((0xF8 > uiCharacterCodeHighByte) && (0xAF < uiCharacterCodeHighByte)) - { - uiFontTableIndex = ((((uiCharacterCodeHighByte-0xB0)*94 + (uiCharacterCodeLowByte-0xA1))*2) + FONT_LIB_OFFSET_GB2312_CHARL1); - } - // Other to return full width space. - else - { - uiFontTableIndex = FONT_LIB_OFFSET_GB2312_SYMBOL; // Full-size space. - } - - return uiFontTableIndex; -} - -/*****************************************************************************/ -/** Function Name: SGUI_Text_GetTextGraphicsWidth **/ -/** Purpose: Get text displayed full width. **/ -/** Params: **/ -/** @szText[in]: Text pointer. **/ -/** @eFontSize[in]: Font size, usually means font height. **/ -/** Return: None. **/ -/** Notice: Only used with Equal-width characters. **/ -/*****************************************************************************/ -SGUI_SIZE SGUI_Text_GetTextGraphicsWidth(SGUI_CSZSTR szText, SGUI_FONT_SIZE eFontSize) -{ - /*----------------------------------*/ - /* Variable Declaration */ - /*----------------------------------*/ - SGUI_SIZE uiTextHalfCharLength; - SGUI_UINT16 uiHalfFontWidth; - SGUI_SIZE uiTextGraphicsWidth; - /*----------------------------------*/ - /* Initialize */ - /*----------------------------------*/ - uiTextHalfCharLength = 0; - uiTextGraphicsWidth = 0; - /*----------------------------------*/ - /* Process */ - /*----------------------------------*/ - if(NULL != szText) - { - uiTextHalfCharLength = SGUI_SystemIF_StringLength(ENCODE(szText)); - uiHalfFontWidth = g_stFontSize[eFontSize].Width; - uiTextGraphicsWidth = uiHalfFontWidth * uiTextHalfCharLength; - } - return uiTextGraphicsWidth; -} - - -/*****************************************************************************/ -/** Function Name: SGUI_Text_GetMultiLineTextLines **/ -/** Purpose: Get a string's lines in a fixed width area. **/ -/** Resources: None. **/ -/** Params: **/ -/** @szNoticeText[in]: Notice text resource. **/ -/** @uiHalfWidthCharInLine[in]: Max number of half-width character in each **/ -/** line. **/ -/** Return: String lines. **/ -/** Notice: None. **/ -/*****************************************************************************/ -SGUI_SIZE SGUI_Text_GetMultiLineTextLines(SGUI_CSZSTR szNoticeText, SGUI_SIZE uiHalfWidthCharInLine) -{ - /*----------------------------------*/ - /* Variable Declaration */ - /*----------------------------------*/ - SGUI_SIZE uiLineCount, uiLineByteCount; - SGUI_CSZSTR pcCur; - - /*----------------------------------*/ - /* Initialize */ - /*----------------------------------*/ - uiLineByteCount = 0; - uiLineCount = 1; - pcCur = ENCODE(szNoticeText); - - /*----------------------------------*/ - /* Process */ - /*----------------------------------*/ - if(NULL != pcCur) - { - while('\0' != *pcCur) + uiCharacterCode = 0; + pcChar = pstFontRes->fnStepNext(pcChar, &uiCharacterCode); + if('\n' == uiCharacterCode) { - if(*pcCur == '\n') + uiLineNumber++; + uiLineLength = 0; + } + else + { + uiCharWidth = pstFontRes->fnIsFullWidth(uiCharacterCode)?pstFontRes->iFullWidth:pstFontRes->iHalfWidth; + if((uiLineLength+uiCharWidth)>uiDisplayAreaWidth) { - if(uiLineByteCount > 0) - { - // Change lines. - uiLineCount ++; - uiLineByteCount = 0; - } - else - { - // Ignore change lines in line start. - } - pcCur++; - continue; + uiLineNumber++; + uiLineLength = uiCharWidth; } - - if((uint8_t)(*pcCur) < 0x7F) - { - if(uiLineByteCount= 0xA1) && ((uint8_t)(*pcCur) <= 0xF7)) - { - //GB2312 - if((uiHalfWidthCharInLine-uiLineByteCount)>2) - { - uiLineByteCount+=2; - } - else - { - uiLineByteCount = 2; - uiLineCount++; - } - pcCur+=2; - } - // Invalid character else { - pcCur++; + uiLineLength+=uiCharWidth; } } } - return uiLineCount; + return uiLineNumber; } /*****************************************************************************/ -/** Function Name: SGUI_Text_GetFontResource **/ -/** Purpose: Get character index in font mode table. **/ +/** Function Name: SGUI_Text_GetCharacterData **/ +/** Purpose: Get character data form font resource by char code. **/ /** Params: **/ -/** @ eFontSize[in]: Get font resource ID by font size. **/ -/** Return: Font data resource ID. **/ -/** Limitation: This function will be used when user data is in differ- **/ -/** end media, like flash on chip or external flash. user **/ -/** can distinguish many different resources by ID, and **/ -/** this function will read data form different media with **/ -/** different parameter. **/ +/** @ pstFontRes[in]: Font resource structure pointer. **/ +/** @ uiCode[in]: Character code. **/ +/** @ pDataBuffer[out]: Buffer for output char data. **/ +/** @ sBufferSize[in]: Output buffer size. **/ +/** Return: Number of read data, return 0 when error occurred. **/ /*****************************************************************************/ -SGUI_FLASH_DATA_SOURCE SGUI_Text_GetFontResource(SGUI_FONT_SIZE eFontSize) +SGUI_SIZE SGUI_Text_GetCharacterData(const SGUI_FONT_RES* pstFontRes, SGUI_UINT32 uiCode, SGUI_BYTE* pDataBuffer, SGUI_SIZE sBufferSize) { - /*----------------------------------*/ + /*----------------------------------*/ /* Variable Declaration */ /*----------------------------------*/ - SGUI_FLASH_DATA_SOURCE eResourceID; + SGUI_SIZE sGetDataSize; + SGUI_SIZE sReadDataSize; + SGUI_SIZE sDataBlockSize; + SGUI_SIZE sCharIndex; + SGUI_BOOL bIsFullWidth; + + /*----------------------------------*/ + /* Initialize */ + /*----------------------------------*/ + sGetDataSize = 0; + bIsFullWidth = SGUI_FALSE; /*----------------------------------*/ /* Process */ /*----------------------------------*/ - switch(eFontSize) - { - case SGUI_FONT_SIZE_H6: - { - eResourceID = SGUI_FONT_SRC_H6; - break; - } - case SGUI_FONT_SIZE_H8: - { - eResourceID = SGUI_FONT_SRC_H8; - break; - } - case SGUI_FONT_SIZE_H12: - { - eResourceID = SGUI_FONT_SRC_H12; - break; - } - case SGUI_FONT_SIZE_H16: - { - eResourceID = SGUI_FONT_SRC_H16; - break; - } - default: - { - eResourceID = SGUI_FONT_SRC_UNKNOWN; - break; - } - } + if((NULL != pstFontRes) && (NULL != pDataBuffer) && (0 != sBufferSize)) + { + sCharIndex = pstFontRes->fnGetIndex(uiCode); + if(SGUI_INVALID_INDEX != sCharIndex) + { + sDataBlockSize = SGUI_USED_BYTE(pstFontRes->iHeight) * pstFontRes->iHalfWidth; + sReadDataSize = bIsFullWidth?(sDataBlockSize*2):sDataBlockSize; + sGetDataSize = pstFontRes->fnGetData(sCharIndex*sDataBlockSize, pDataBuffer, sReadDataSize>sBufferSize?sBufferSize:sReadDataSize); + } + } - return eResourceID; + return sGetDataSize; } - diff --git a/VirtualSDK/Frame/src/LCDFrame.cpp b/VirtualSDK/Frame/src/LCDFrame.cpp index a001674..296a474 100644 --- a/VirtualSDK/Frame/src/LCDFrame.cpp +++ b/VirtualSDK/Frame/src/LCDFrame.cpp @@ -649,7 +649,7 @@ wxThread::ExitCode LCDFrame::Entry(void) while(false == bExit) { bExit = pclsThread->TestDestroy(); - lExitCode = (wxThread::ExitCode)SGUI_SDK_DummyMainProc(); + lExitCode = reinterpret_cast(SGUI_SDK_DummyMainProc()); } } diff --git a/VirtualSDK/Project/CodeBlocks/VirtualSDK_wx31.cbp b/VirtualSDK/Project/CodeBlocks/VirtualSDK_wx31.cbp index 6efebff..e4929b8 100644 --- a/VirtualSDK/Project/CodeBlocks/VirtualSDK_wx31.cbp +++ b/VirtualSDK/Project/CodeBlocks/VirtualSDK_wx31.cbp @@ -97,24 +97,6 @@ - - - - - - - - - - - - @@ -140,27 +122,15 @@ - - - - - - - -