system/lib/lcd/gui/GUIDemo/GUIDEMO_Cursor.c

304 lines
7.6 KiB
C

/*
*********************************************************************************************************
* uC/GUI
* Universal graphic software for embedded applications
*
* (c) Copyright 2002, Micrium Inc., Weston, FL
* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
*
* µC/GUI is protected by international copyright laws. Knowledge of the
* source code may not be used to write a similar product. This file may
* only be used in accordance with a license and should not be redistributed
* in any way. We appreciate your understanding and fairness.
*
----------------------------------------------------------------------
File : GUIDEMO_Cursor.c
Purpose : shows Cursor-API
----------------------------------------------------------------------
*/
#include "GUI.h"
#include "GUIDEMO.h"
#if (GUI_SUPPORT_CURSOR & GUI_SUPPORT_TOUCH)
/*********************************************************************
*
* defines
*
**********************************************************************
*/
#define countof(Obj) (sizeof(Obj)/sizeof(Obj[0]))
#if GUIDEMO_LARGE
#define NUM_CURSORS 3
#define XMAX 28
#else
#define NUM_CURSORS 2
#define XMAX 24
#endif
/*********************************************************************
*
* types
*
**********************************************************************
*/
typedef struct {
const GUI_CURSOR* pCursor;
char Size;
} CURSOR_INFO;
typedef struct {
const CURSOR_INFO aCursor[NUM_CURSORS];
const char* pType;
} CURSORTYPE_INFO;
/*********************************************************************
*
* static data
*
**********************************************************************
*/
static const CURSORTYPE_INFO _CursorArrow = {
&GUI_CursorArrowS, 'S',
&GUI_CursorArrowM, 'M',
#if (NUM_CURSORS == 3)
&GUI_CursorArrowL, 'L',
"arrow cursors"
#else
"arrow\ncursors"
#endif
};
#if !(GUIDEMO_TINY)
static const CURSORTYPE_INFO _CursorArrowI = {
&GUI_CursorArrowSI, 'S',
&GUI_CursorArrowMI, 'M',
#if (NUM_CURSORS == 3)
&GUI_CursorArrowLI, 'L',
"inverted arrow cursors"
#else
"inverted\narrow cursors"
#endif
};
#endif
static const CURSORTYPE_INFO _CursorCross = {
&GUI_CursorCrossS, 'S',
&GUI_CursorCrossM, 'M',
#if (NUM_CURSORS == 3)
&GUI_CursorCrossL, 'L',
"cross cursors"
#else
"cross\ncursors"
#endif
};
#if !(GUIDEMO_TINY)
static const CURSORTYPE_INFO _CursorCrossI = {
&GUI_CursorCrossSI, 'S',
&GUI_CursorCrossMI, 'M',
#if (NUM_CURSORS == 3)
&GUI_CursorCrossLI, 'L',
"inverted cross cursors"
#else
"inverted\ncross cursors"
#endif
};
#endif
static const GUI_CURSOR* _aCursor[] = {
&GUI_CursorArrowM,
#if !(GUIDEMO_TINY)
&GUI_CursorArrowMI,
#endif
&GUI_CursorCrossM,
#if !(GUIDEMO_TINY)
&GUI_CursorCrossMI,
#endif
};
/*********************************************************************
*
* static code
*
**********************************************************************
*/
/*********************************************************************
*
* _ShowCursorType
*/
static void _ShowCursorType(const CURSORTYPE_INFO* pCursorType, int x0, int y0) {
const GUI_CURSOR* pCursor;
char Char;
int i, x, y;
int yMax = 0;
int yHot = 0;
/* Calculate height and width of biggest cursor */
for (i = 0; i < NUM_CURSORS; i++) {
pCursor = pCursorType->aCursor[i].pCursor;
if (pCursor->pBitmap->YSize > yMax) {
yMax = pCursor->pBitmap->YSize;
yHot = pCursor->yHot;
}
}
#if ((LCD_YSIZE >= 220) && (LCD_XSIZE >= 300))
GUI_SetFont(&GUI_FontComic18B_ASCII);
#else
GUI_SetFont(&GUI_Font13B_ASCII);
#endif
#if (NUM_CURSORS != 3)
GUI_SetLBorder(x0);
#endif
GUI_DispStringAt(pCursorType->pType, x0, y0);
#if GUIDEMO_LARGE
y0 += GUI_GetFontDistY() + 1;
GUI_SetFont(&GUI_Font13B_ASCII);
#else
#if (LCD_YSIZE < 80)
x0 += 50;
#else
y0 += GUI_GetFontDistY() * 2 + 1;
#endif
GUI_SetFont(&GUI_Font10_ASCII);
#endif
for (i = 0; i < NUM_CURSORS; i++) {
pCursor = pCursorType->aCursor[i].pCursor;
Char = pCursorType->aCursor[i].Size;
y = y0 + yHot - pCursor->yHot;
x = ((pCursor->pBitmap->XSize - GUI_GetCharDistX(Char)) >> 1);
GUI_DrawBitmap(pCursor->pBitmap, x0 + XMAX * i + 5, y);
GUI_DispCharAt(Char, x0 + XMAX * i + 5 + x, y0 + yMax + 2);
}
}
/*********************************************************************
*
* _MoveCursor
*/
static void _MoveCursor(const GUI_CURSOR* Cursor){
int x, y;
int xMax = LCD_XSIZE >> 1;
int yMax = LCD_YSIZE >> 1;
#if !GUIDEMO_LARGE
xMax *= 1.3;
yMax *= 1.3;
#endif
GUI_CURSOR_Select(Cursor);
for(x = y = 0; ((x < xMax) && (y < yMax) && !GUIDEMO_CheckCancel()); x += 6, y += 6) {
if ( x == xMax) {
x = xMax;
}
if ( y == yMax) {
y = yMax;
}
GUI_CURSOR_SetPosition(x, y);
GUIDEMO_Delay(75);
}
}
/*********************************************************************
*
* _DispCursor
*/
static void _DispCursor(void) {
#if !(GUIDEMO_LARGE)
int x0 = 0;
#endif
int y0, dx, dy;
GUI_CURSOR_Hide();
GUI_SetTextMode(GUI_TM_TRANS);
#if GUIDEMO_LARGE
GUI_SetFont(&GUI_FontComic24B_ASCII);
GUI_DispStringAt("Available\n cursors:", 18, 12);
#else
#if GUIDEMO_TINY
GUI_SetFont(&GUI_Font13B_ASCII);
#else
GUI_SetFont(&GUI_FontComic18B_ASCII);
#endif
GUI_DispStringHCenterAt("Available cursors:", LCD_XSIZE >> 1, LCD_YSIZE >> 5);
#endif
/* Display the cursors */
#if GUIDEMO_LARGE
y0 = 68;
dx = LCD_XSIZE / 2.5;
#if (LCD_YSIZE > 240)
dy = LCD_YSIZE / 3.2;
#else
dy = 75;
#endif
#if ((LCD_YSIZE < 220) || (LCD_XSIZE < 300))
y0 -= 3;
dy -= 12;
#endif
_ShowCursorType(&_CursorArrow, 0, y0);
_ShowCursorType(&_CursorCross, 0, y0 + dy);
_ShowCursorType(&_CursorArrowI, dx, y0);
_ShowCursorType(&_CursorCrossI, dx, y0 + dy);
#else
#if GUIDEMO_TINY
y0 = 20;
#else
y0 = 30;
#endif
#if ((LCD_XSIZE < 160) && ((LCD_YSIZE >= 160) || (LCD_YSIZE < 90)))
x0 = 10;
#endif
dx = LCD_XSIZE / 2.2;
dy = LCD_YSIZE / 2.6;
_ShowCursorType(&_CursorArrow, x0, y0);
#if (LCD_YSIZE >= 160)
_ShowCursorType(&_CursorCross, x0, y0 + dy);
#elif (LCD_YSIZE < 90)
GUIDEMO_Delay(2000);
GUI_ClearRect(0, 20, LCD_XSIZE - 1, LCD_YSIZE - 1);
_ShowCursorType(&_CursorCross, x0, y0);
#else
_ShowCursorType(&_CursorCross, dx, y0);
#endif
#if ((LCD_YSIZE >= 160) && (LCD_XSIZE >= 160))
_ShowCursorType(&_CursorArrowI, dx, y0);
_ShowCursorType(&_CursorCrossI, dx, y0 + dy);
#endif
#endif
}
/*********************************************************************
*
* public code
*
**********************************************************************
*/
/*********************************************************************
*
* GUIDEMO_Cursor
*/
void GUIDEMO_Cursor(void) {
int i = 0;
GUIDEMO_ShowIntro("Cursor",
"\nemWin supports"
"\nsoftware cursor");
GUIDEMO_SetBkColor(GUI_BLUE);
GUI_Clear();
_DispCursor();
GUIDEMO_Delay(1500);
GUIDEMO_NotifyStartNext();
GUI_CURSOR_Show();
for ( i = 0;(i < countof(_aCursor) && !GUIDEMO_CheckCancel()); i++) {
_MoveCursor(_aCursor[i]);
}
GUI_CURSOR_SetPosition(0,0);
GUI_CURSOR_Select(&GUI_CursorArrowM);
}
#else
void GUIDEMO_Cursor(void) {}
#endif