2019-12-01:

修改文字显示为资源模式。
其他控件同步整理中。
This commit is contained in:
Polarix 2019-12-01 23:04:02 +08:00
parent 02d7fdc004
commit 7ce09f624b
26 changed files with 575 additions and 16816 deletions

View File

@ -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. \

View File

@ -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();
}
*/
}
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);

View File

@ -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的编码与解码

View File

@ -1,10 +1,18 @@
如何移植SimpleGUI
<h1 id="0">目录</h1>
* [1. 概述](#1)
* [2. 向STM32F103平台上移植Demo程序](#2)
* [3. 从“Hello world”开始](#3)
* [4. HMI交互模型](#4)
* [5. 联系开发者](#5)
---
## 简介
<h2 id="1">1. 概述</h2>
&emsp;&emsp;为了方便大家学习和使用SimpleGUI我对Demo程序向STM32F103芯片上进行了移植并保留了工程代码本文将演示如何搭建并使用这个工程。
## 2. 向STM32F103平台上移植Demo程序。
<返回到[目录](#0)/[标题](#1)>
<h2 id="2">2. 向STM32F103平台上移植Demo程序</h2>
#### 2.1. 概述。
@ -14,11 +22,9 @@
#### 2.2. 准备工程模板
&emsp;&emsp;在移植和使用Demo程序之前请先依照个人习惯创建一个空白的STM32F103工程。工程中请不要包含诸如串口重定向等的代码实现以避免意料之外的错误。
&emsp;&emsp;在移植和使用Demo程序之前请先依照个人习惯创建一个空白的STM32F103工程。工程中请不要包含诸如串口重定向等的代码实现以避免不必要的编译错误。
&emsp;&emsp;由于演示工程中包含GB2312的字库所以编译后体积较大请大家在移植时最好使用STM32F103VE/ZE芯片以确保Flash资源的充足。
&emsp;&emsp;当然这并不是硬性需求如果您确实需要在少资源的芯片中运行后续将有介绍如何使Demo运行于诸如STM32F103C8这样的资源相对较少的芯片毕竟SimpleGUI本身对系统资源的消耗并不高。
&emsp;&emsp;由于演示工程中包含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")
&emsp;&emsp;由于包含有12像素和16像素的中文字库所以编译的程序比较大这也就是为什么选用STM32F103VE/ZE这样的大容量芯片运行Demo的原因了。接下来将程序下载到芯片下载方式请根据用户自己的硬件设备环境决定,下载完成后OLED显示屏上就可以看到显示内容了。
&emsp;&emsp;由于包含有12像素和16像素的中文字库所以编译的程序比较大这也就是为什么选用STM32F103VE/ZE这样的大容量芯片运行Demo的原因了。接下来将程序下载到芯片下载完成后OLED显示屏上就可以看到显示内容了。
>![06-演示程序运行](https://images.gitee.com/uploads/images/2019/0605/230139_ee01cc19_769424.png "06-运行.png")
#### 2.4. Demo程序的交互。
&emsp;&emsp;为了确保所有尝试使用和学习的朋友都能以最快速最便捷的方式体验和使用SimpleGUIDemo程序使用串口来模拟键盘进行Demo程序的交互以此来避免大家在使用不同开发板或最小系统时,因为硬件原因导致交互实现起来困难的尴尬。
&emsp;&emsp;为了确保所有尝试使用和学习SimpleGUI的朋友都能以最快速最便捷的方式体验和使用SimpleGUIDemo程序使用串口来模拟键盘进行Demo程序的交互以此来避免在使用不同开发板或最小系统时因为硬件原因导致交互实现起来困难的尴尬。
&emsp;&emsp;完成前文描述的移植操作并成功烧录到芯片中运行在确保芯片的串口正确连接到电脑后就可以尝试与SimpleGUI的Demo程序进行交互了。在此之前请准保好一个您习惯使用的串口调试软件但此软件需要支持发送十六进制数据。
&emsp;&emsp;基于前文的操作确保芯片硬件系统处于上电运行状态显示屏上滚动显示关于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")
&emsp;&emsp;为了兼容在VirtualSDK中运行、片上全字库运行和片上精简字库运行等多种情况Demo程序中使用了DemoResource_UTF8.h、DemoResource_GB2312.h和DemoResource_ASCII.h三个文件作为显示用的资源文件Demo程序中显示的文字均为同名不同内容的宏定义在不同环境下根据不同的宏开关、引用不同的文件来实现切换不同显示内容的效果。
&emsp;&emsp;为了避免不同情况下的乱码在VirtualSDK中运行时使用的资源文件是DemoResource_UTF8.h运行时通过iconv转换库将字符串转换为GB2312编码再进行解码和显示。 而由于在芯片上运行全字库时由于没有足够的资源保存转码库的资源所以使用DemoResource_GB2312.h文件此文件本身就以GB2312形式保存无需转码壳直接解码而使用精简字库时由于只有ASCII文字所以使用DemoResource_ASCII.h文件使界面显示英语不使用中文字库。
&emsp;&emsp;为了避免不同情况下的乱码在VirtualSDK中运行时使用的资源文件是DemoResource_UTF8.h运行时通过iconv转换库将字符串转换为GB2312编码再进行解码和显示。 而由于在芯片上运行全字库时由于没有足够的资源保存转码库的资源所以使用DemoResource_GB2312.h文件此文件本身就以GB2312形式保存无需转码。而使用精简字库时由于只有ASCII文字所以使用DemoResource_ASCII.h文件使界面显示英语不使用中文字库。
<返回到[目录](#0)/[标题](#2)>
<h2 id="3">3. 从“Hello world”开始</h2>
#### 3.1准备驱动程序
&emsp;&emsp;由于SimpleGUI本身不提供屏幕设备的驱动程序而是借助既有的硬件设备接口组织基础的绘制操作所以在使用SimpleGUI之前需要开发者自行准备好屏幕设备的驱动函数。至少准备好“初始化”、“读像素”和“写像素”两个函数函数的原型需要严格按照以下形式声明和定义。
```
void OLED_Initialize(void);
void OLED_SetPixel(int iPosX, int iPosY, int iColor);
int OLED_GetPixel(int iPosX, int iPosY);
```
&emsp;&emsp;
<返回到[目录](#0)/[标题](#3)>
<h2 id="3">4. HMI交互模型</h2>
<返回到[目录](#0)/[标题](#4)>
<h2 id="3">5. 联系开发者</h2>
### 4. 联系开发者
&emsp;&emsp;首先感谢您对SimpleGUI的赏识与支持。
&emsp;&emsp;虽然最早仅仅作为一套GUI接口库使用但我最终希望SimpleGUI能够为您提供一套完整的单色屏GUI及交互设计解决方案如果您有新的需求、提议亦或想法欢迎在以下地址留言或加入[QQ交流群799501887](https://jq.qq.com/?_wv=1027&k=5ahGPvK)留言交流。
>SimpleGUI@开源中国https://www.oschina.net/p/simplegui

View File

@ -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

View File

@ -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);

View File

@ -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_

View File

@ -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

View File

@ -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__

View File

@ -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;
//=======================================================================//

View File

@ -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__

View File

@ -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

View File

@ -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_

View File

@ -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((uiDrawnWidthIndex<RECT_WIDTH(*pstDataArea)) && (iDrawPixX<=RECT_X_END(*pstDisplayArea)) && (iDrawPixX<RECT_WIDTH(pstIFObj->stSize)))
while((uiDrawnWidthIndex<RECT_WIDTH(*pstBitmapData)) && (iDrawPixX<=RECT_X_END(*pstDisplayArea, *pstDisplayArea)) && (iDrawPixX<RECT_WIDTH(pstIFObj->stSize)))
{
// 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((uiDrawnHeightIndex<RECT_HEIGHT(*pstDataArea)) && (iDrawPixY<=RECT_Y_END(*pstDisplayArea)) && (iDrawPixY<RECT_HEIGHT(pstIFObj->stSize)))
while((uiDrawnHeightIndex<RECT_HEIGHT(*pstBitmapData)) && (iDrawPixY<=RECT_Y_END(*pstDisplayArea, *pstDisplayArea)) && (iDrawPixY<RECT_HEIGHT(pstIFObj->stSize)))
{
if(uiPixIndex == 8)
{
uiPixIndex = 0;
pData += RECT_WIDTH(*pstDataArea);
pData += RECT_WIDTH(*pstBitmapData);
}
if(SGUI_GET_PAGE_BIT(*pData, uiPixIndex) != eDrawMode)
{

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -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; sReadBytes<sReadSize; sReadBytes++)
{
*(pOutPutDataPtr+sReadBytes) = *(pDataSource+adBaseAddr+sReadBytes);
}
}
}
return sReadBytes;
}

View File

@ -21,7 +21,7 @@
#define LIST_SCROLLBAR_WIDTH (5)
// Automatic calculation
#define LIST_EDGE_SIZE 1
#define LIST_TITLE_HEIGHT(FONT) (g_stFontSize[FONT].Height+2)
#define LIST_TITLE_HEIGHT(FONT_HEIGH) ((FONT_HEIGH)+2)
#define LIST_RECT_START_X(LIST_RECT) ((LIST_RECT).PosX)
#define LIST_RECT_END_X(LIST_RECT) ((LIST_RECT).PosX+(LIST_RECT).Width-1)
@ -73,12 +73,12 @@ void SGUI_List_Initialize(SGUI_List_STRUCT* pstList)
pstListData = &(pstList->Data);
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);
}
}
}

View File

@ -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)

View File

@ -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<uiHalfWidthCharInLine)
{
uiLineByteCount++;
}
else
{
uiLineByteCount = 1;
uiLineCount++;
}
pcCur++;
}
// Process with GB2312.
else if(((uint8_t)(*pcCur) >= 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;
}

View File

@ -649,7 +649,7 @@ wxThread::ExitCode LCDFrame::Entry(void)
while(false == bExit)
{
bExit = pclsThread->TestDestroy();
lExitCode = (wxThread::ExitCode)SGUI_SDK_DummyMainProc();
lExitCode = reinterpret_cast<wxThread::ExitCode>(SGUI_SDK_DummyMainProc());
}
}

View File

@ -97,24 +97,6 @@
<Unit filename="../../../DemoProc/src/DemoProc.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="../../../DemoProc/src/List.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="../../../DemoProc/src/RTCNotice.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="../../../DemoProc/src/RealtimeGraph.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="../../../DemoProc/src/ScrollingText.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="../../../DemoProc/src/TextNotice.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="../../../DemoProc/src/VariableBox.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="../../../GUI/inc/SGUI_Basic.h" />
<Unit filename="../../../GUI/inc/SGUI_Common.h" />
<Unit filename="../../../GUI/inc/SGUI_Config.h" />
@ -140,27 +122,15 @@
<Unit filename="../../../GUI/src/SGUI_Interface.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="../../../GUI/src/SGUI_List.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="../../../GUI/src/SGUI_Notice.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="../../../GUI/src/SGUI_ProcessBar.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="../../../GUI/src/SGUI_RealtimeGraph.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="../../../GUI/src/SGUI_ScrollBar.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="../../../GUI/src/SGUI_Text.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="../../../GUI/src/SGUI_VariableBox.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="../../../HMI/inc/HMI_Engine.h" />
<Unit filename="../../../HMI/src/HMI_Engine.c">
<Option compilerVar="CC" />