/** * @brief callback for Full Screen window * @param pMsg: pointer to a data structure of type WM_MESSAGE * @retval None */ static void _cbFullScreen(WM_MESSAGE * pMsg) { GUI_RECT r; const GUI_PID_STATE * pState; switch (pMsg->MsgId) { case WM_PAINT: WM_GetInsideRect(&r); GUI_ClearRectEx(&r); break; case WM_TOUCH: pState = (const GUI_PID_STATE *)pMsg->Data.p; if (pState) { if (pState->Pressed == 1) { _CloseFullScreen(); WM_DeleteWindow(pMsg->hWin); } } break; default: WM_DefaultProc(pMsg); } }
/******************************************************************* * * _ShowComments * * Shows all comments of a GIF file */ static void _ShowComments(const char * pFile, int FileSize) { GUI_RECT Rect = {80, 100, 239, 199}; char acBuffer[256] = {0}; int CommentCnt; /* Display sample information */ GUI_SetFont(&GUI_Font8x16); GUI_ClearRect(0, 40, 319, 59); GUI_DispStringHCenterAt("Show all comments of a GIF file", 160, 40); /* Show all comments */ GUI_ClearRect(0, 60, 319, 239); /* Clear the image area */ CommentCnt = 0; while (!GUI_GIF_GetComment(pFile, FileSize, (unsigned char *)acBuffer, sizeof(acBuffer), CommentCnt)) { char acNumber[12] = "Comment #0:"; acNumber[9] = '0' + CommentCnt; GUI_DispStringHCenterAt(acNumber, 160, 80); GUI_SetBkColor(GUI_BLACK); GUI_SetColor(GUI_WHITE); GUI_ClearRectEx(&Rect); GUI_DispStringInRectWrap(acBuffer, &Rect, GUI_TA_HCENTER | GUI_TA_VCENTER, GUI_WRAPMODE_WORD); GUI_SetBkColor(GUI_WHITE); GUI_SetColor(GUI_BLACK); GUI_Delay(4000); /* Wait a while */ CommentCnt++; } }
/********************************************************************* * * _OnPaint */ static void _OnPaint(LISTBOX_Handle hObj, LISTBOX_Obj* pObj, WM_MESSAGE* pMsg) { WIDGET_ITEM_DRAW_INFO ItemInfo; GUI_RECT RectInside, RectItem, ClipRect; int ItemDistY, NumItems, i; NumItems = LISTBOX__GetNumItems(pObj); GUI_SetFont(pObj->Props.pFont); /* Calculate clipping rectangle */ ClipRect = *(const GUI_RECT*)pMsg->Data.p; GUI_MoveRect(&ClipRect, -pObj->Widget.Win.Rect.x0, -pObj->Widget.Win.Rect.y0); WM_GetInsideRectExScrollbar(hObj, &RectInside); GUI__IntersectRect(&ClipRect, &RectInside); RectItem.x0 = ClipRect.x0; RectItem.x1 = ClipRect.x1; /* Fill item info structure */ ItemInfo.Cmd = WIDGET_ITEM_DRAW; ItemInfo.hWin = hObj; ItemInfo.x0 = RectInside.x0 - pObj->ScrollStateH.v; ItemInfo.y0 = RectInside.y0; /* Do the drawing */ for (i = pObj->ScrollStateV.v; i < NumItems; i++) { RectItem.y0 = ItemInfo.y0; /* Break when all other rows are outside the drawing area */ if (RectItem.y0 > ClipRect.y1) { break; } ItemDistY = _GetItemSizeY(hObj, pObj, i); RectItem.y1 = RectItem.y0 + ItemDistY - 1; /* Make sure that we draw only when row is in drawing area */ if (RectItem.y1 >= ClipRect.y0) { /* Set user clip rect */ WM_SetUserClipArea(&RectItem); /* Fill item info structure */ ItemInfo.ItemIndex = i; /* Draw item */ if (pObj->pfDrawItem) { pObj->pfDrawItem(&ItemInfo); } else { LISTBOX_OwnerDraw(&ItemInfo); } } ItemInfo.y0 += ItemDistY; } WM_SetUserClipArea(NULL); /* Calculate & clear 'data free' area */ RectItem.y0 = ItemInfo.y0; RectItem.y1 = RectInside.y1; LCD_SetBkColor(pObj->Props.aBackColor[0]); GUI_ClearRectEx(&RectItem); /* Draw the 3D effect (if configured) */ WIDGET__EFFECT_DrawDown(&pObj->Widget); }
/** * @brief callback for video window * @param pMsg: pointer to a data structure of type WM_MESSAGE * @retval None */ static void _cbVideoWindow(WM_MESSAGE * pMsg) { GUI_RECT r; switch (pMsg->MsgId) { case WM_PAINT: WM_GetInsideRect(&r); GUI_ClearRectEx(&r); break; default: WM_DefaultProc(pMsg); } }
/******************************************************************* * * _cbWindow */ static void _cbWindow(WM_MESSAGE* pMsg) { GUI_RECT Rect; switch (pMsg->MsgId) { case WM_PAINT: WM_GetInsideRect(&Rect); GUI_SetBkColor(GUI_RED); GUI_SetColor(GUI_YELLOW); GUI_ClearRectEx(&Rect); GUI_DrawRectEx(&Rect); GUI_SetColor(GUI_BLACK); GUI_SetFont(&GUI_Font8x16); GUI_DispStringHCenterAt("Foreground window", 75, 40); break; default: WM_DefaultProc(pMsg); } }
/** * @brief Callback function of the Camera frame * @param pMsg: pointer to data structure of type WM_MESSAGE * @retval None */ static void _cbCameraWindow(WM_MESSAGE * pMsg) { GUI_RECT r; switch (pMsg->MsgId) { case WM_CREATE: CAMERA_Init(); break; case WM_PAINT: if(IsFrameAvailable() > 0) { GUI_DrawBitmap(&frame0, 0, 0); } else { WM_GetInsideRect(&r); GUI_ClearRectEx(&r); if(CAMERA_GetState() == CAMERA_ERROR) { GUI_DispStringAt("Error while Initializing Camera Interface", 45, 120); GUI_DispStringAt("Please, check if the camera module is mounted.", 35, 140); } } break; case WM_POST_PAINT: if(IsFrameAvailable() > 0) { if(camera_disabled == 0) { CAMERA_Resume(); } } break; default: WM_DefaultProc(pMsg); } }
/******************************************************************* * * _cbChild */ static void _cbChild(WM_MESSAGE* pMsg) { GUI_RECT Rect; int x, y; switch (pMsg->MsgId) { case WM_PAINT: WM_GetInsideRect(&Rect); GUI_SetBkColor(_ChildColor); GUI_SetColor(_ChildFrame); GUI_ClearRectEx(&Rect); GUI_DrawRectEx(&Rect); GUI_SetColor(GUI_RED); GUI_SetFont(&GUI_Font24_ASCII); x = WM_GetWindowSizeX(pMsg->hWin); y = WM_GetWindowSizeY(pMsg->hWin); GUI_DispStringHCenterAt("Child window", x / 2, (y / 2) - 12); break; default: WM_DefaultProc(pMsg); } }
/******************************************************************* * * _cbWindow2 */ static void _cbWindow2(WM_MESSAGE * pMsg) { GUI_RECT Rect; int x; int y; switch (pMsg->MsgId) { case WM_PAINT: WM_GetInsideRect(&Rect); GUI_SetBkColor(_WindowColor2); GUI_SetColor(_FrameColor2); GUI_ClearRectEx(&Rect); GUI_DrawRectEx(&Rect); GUI_SetColor(GUI_WHITE); GUI_SetFont(&GUI_Font24_ASCII); x = WM_GetWindowSizeX(pMsg->hWin); y = WM_GetWindowSizeY(pMsg->hWin); GUI_DispStringHCenterAt("Window 2", x / 2, (y / 4) - 12); break; default: WM_DefaultProc(pMsg); } }
/** * @brief Callback function of the image frame * @param pMsg: pointer to data structure of type WM_MESSAGE * @retval None */ static void _cbImageWindow(WM_MESSAGE * pMsg) { WM_HWIN hItem; GUI_RECT r; int Id; const GUI_PID_STATE * pState; switch (pMsg->MsgId) { case WM_TOUCH: pState = (const GUI_PID_STATE *)pMsg->Data.p; if(pImageList->ptr > 0) { if (pState) { if (pState->Pressed == 1) { IMAGE_Enlarge ^= 1; if (IMAGE_Enlarge) { WM_AttachWindowAt(pMsg->hWin, WM_HBKWIN, 0, 0); WM_SetSize(pMsg->hWin, LCD_GetXSize(), LCD_GetYSize()); } else { WM_AttachWindowAt(pMsg->hWin, IMAGE_hWin, 6, 6); WM_SetSize(pMsg->hWin, 220, 134); } WM_InvalidateWindow(pMsg->hWin); } } } break; case WM_PAINT: WM_GetInsideRect(&r); GUI_ClearRectEx(&r); if (pImageList->ptr > 0) { if(_DrawImage(&Image_File, IMAGE_Enlarge, IMAGE_Type) > 0) { f_close(&Image_File); GUI_ClearRectEx(&r); GUI_DispStringAt("Error : Image cannot be displayed", 20, 80); if(hTimerTime != 0) { slideshow_state = OFF; hItem = WM_GetDialogItem(IMAGE_hWin, ID_SLIDE_BUTTON); WM_InvalidateWindow(hItem); WM_Update(hItem); WM_DeleteTimer(hTimerTime); hTimerTime = 0; } } } break; case WM_TIMER: Id = WM_GetTimerId(pMsg->Data.v); if(Id == ID_SLIDER_TIMER) { if(pImageList->ptr > 1) { if (file_pos < (pImageList->ptr - 1)) { file_pos++; } else if (file_pos == (pImageList->ptr - 1)) { file_pos=0; } if((strstr((char *)pImageList->file[file_pos].name, ".bmp")) || (strstr((char *)pImageList->file[file_pos].name, ".BMP"))) { IMAGE_Type = IMAGE_TYPE_BMP; } else if((strstr((char *)pImageList->file[file_pos].name, ".jpg")) || (strstr((char *)pImageList->file[file_pos].name, ".JPG"))) { IMAGE_Type = IMAGE_TYPE_JPG; } f_close(&Image_File); f_open(&Image_File, (char const *)pImageList->file[file_pos].name, FA_OPEN_EXISTING | FA_READ); WM_InvalidateWindow(imFrame); hItem = WM_GetDialogItem(IMAGE_hWin, ID_IMAGE_LIST); LISTBOX_SetSel(hItem, file_pos); } WM_RestartTimer(pMsg->Data.v, (ImSettings.b.ss_timer * 1000)); } else if (Id == ID_PLAYLIST_TIMER) { playlist_select = 0; } break; case WM_DELETE: if(hTimerTime != 0) { WM_DeleteTimer(hTimerTime); hTimerTime = 0; } break; default: WM_DefaultProc(pMsg); } }
/** * @brief Callback function of the MJPEG frame * @param pMsg: pointer to a data structure of type WM_MESSAGE * @retval None */ static void _cbVideoWindow(WM_MESSAGE * pMsg) { char temp[20]; static WM_HTIMER hTimerTime; WM_HWIN hItem; const GUI_PID_STATE * pState; GUI_RECT r; WM_GetInsideRect(&r); switch (pMsg->MsgId) { case WM_TOUCH: if(VideoPlayer_State == VIDEO_PLAY) { pState = (const GUI_PID_STATE *)pMsg->Data.p; if (pState) { if (pState->Pressed == 1) { VIDEO_Enlarge ^= 1; if(VIDEO_Enlarge) { GUI_SetOrientation(GUI_SWAP_XY | GUI_MIRROR_Y); TS_Orientation = 1; WM_AttachWindowAt(pMsg->hWin, WM_GetDesktopWindowEx(1), 0, 0); WM_SetSize(pMsg->hWin, LCD_GetXSize(), LCD_GetYSize()); } else { WM_AttachWindow(pMsg->hWin, bkparent); GUI_SetOrientation(0); TS_Orientation = 0; WM_InvalidateWindow(bkparent); WM_AttachWindowAt(pMsg->hWin, VIDEO_hWin, 5, 16); WM_SetSize(pMsg->hWin,230, 170); do_clear = 1; } } } } break; case WM_CREATE: /* Create timer */ hTimerTime = WM_CreateTimer(pMsg->hWin, 0, 50, 0); break; case WM_TIMER: WM_InvalidateWindow(pMsg->hWin); WM_RestartTimer(pMsg->Data.v, 0); break; case WM_DELETE: WM_DeleteTimer(hTimerTime); break; case WM_PAINT: if(do_clear) { GUI_ClearRectEx(&r); do_clear = 0; } if(VideoPlayer_State == VIDEO_PLAY) { if(_PlayMJPEG(&Video_File) < 0) { VideoPlayer_State = VIDEO_PLAY; ImageOffset = 0; time_start = GUI_GetTime(); f_close(&Video_File); goto_next_file(); hItem = WM_GetDialogItem(WM_GetParent(pMsg->hWin), ID_VIDEO_FILE); TEXT_SetText(hItem, (char *)FILEMGR_FileList.file[FILEMGR_FileList.idx].line); } hItem = WM_GetDialogItem(WM_GetParent(pMsg->hWin), ID_VIDEO_PROGRESS); if (progress_bar == 0) { SLIDER_SetValue(hItem, (ImageOffset * 100 )/ Video_File.fsize); } hItem = WM_GetDialogItem(WM_GetParent(pMsg->hWin), ID_VIDEO_DURATION); duration = (GUI_GetTime() - time_start )/1000; if(duration < 0) duration = 0; sprintf(temp,"%02d:%02d", duration/60, duration%60); TEXT_SetText(hItem, temp); } else if(VideoPlayer_State == VIDEO_IDLE) { GUI_ClearRectEx(&r); } break; default: WM_DefaultProc(pMsg); } }
/********************************************************************* * * _DrawJPEGs * * Function description * Draws the given JPEG image. */ static void _DrawJPEGs(const char * sFileName) { static int i; const char acError[] = "There is possibly not enough memory to display this JPEG image.\n\nPlease assign more memory to emWin in GUIConf.c."; GUI_JPEG_INFO Info; GUI_RECT Rect; HANDLE hFile; DWORD NumBytesRead; DWORD FileSize; char * pFile; int xSize, ySize; int xPos, yPos; int r; xSize = LCD_GetXSize(); ySize = LCD_GetYSize(); // // Display file name. // Rect.x0 = BORDER_SIZE; Rect.y0 = TITLE_HEIGHT; Rect.x1 = xSize - BORDER_SIZE - 1; Rect.y1 = YPOS_IMAGE - 1; GUI_ClearRectEx(&Rect); GUI_SetTextMode(GUI_TM_NORMAL); GUI_SetFont(&GUI_Font8x16); GUI_DispStringInRectWrap(sFileName, &Rect, GUI_TA_HCENTER | GUI_TA_VCENTER, GUI_WRAPMODE_CHAR); // // Clear the area in which the JPEG files are displayed. // Rect.x0 = BORDER_SIZE; Rect.y0 = YPOS_IMAGE; Rect.x1 = xSize - BORDER_SIZE - 1; Rect.y1 = ySize - BORDER_SIZE - 1; GUI_ClearRectEx(&Rect); // // Load image. // hFile = CreateFile(sFileName, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); FileSize = GetFileSize(hFile, NULL); pFile = malloc(FileSize); ReadFile(hFile, pFile, FileSize, &NumBytesRead, NULL); CloseHandle(hFile); // // Check if the current JPEG image fits on the screen. // GUI_JPEG_GetInfo(pFile, FileSize, &Info); xSize -= BORDER_SIZE * 2 + 1; ySize -= YPOS_IMAGE + BORDER_SIZE + 1; // // Display the image centered. // xPos = BORDER_SIZE + (xSize - Info.XSize) / 2; yPos = YPOS_IMAGE + (ySize - Info.YSize) / 2; GUI_SetClipRect(&Rect); r = GUI_JPEG_Draw(pFile, FileSize, xPos, yPos); GUI_SetClipRect(NULL); if (r) { // // The image could not be displayed successfully. Show an error message. // GUI_DispStringInRectWrap(acError, &Rect, GUI_TA_HCENTER | GUI_TA_VCENTER, GUI_WRAPMODE_WORD); } else { GUI_Delay(2000); if ((Info.XSize > xSize) || (Info.YSize > ySize)) { // // Inform the user about the possibility of scaling JPEG images. // if (i == 0) { GUI_ClearRectEx(&Rect); GUI_DispStringInRectWrap("JPEG images can be scaled as it is shown in 2DGL_JPEG_DrawScaled.c.", &Rect, GUI_TA_BOTTOM | GUI_TA_HCENTER, GUI_WRAPMODE_WORD); GUI_Delay(3000); } i++; if (i == NUM_IMAGES_UNTIL_HINT) { i = 0; } } } free(pFile); }