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