void GUI_DispStringInRect(const char GUI_FAR *s, GUI_RECT* pRect, int TextAlign) { #if (GUI_WINSUPPORT) const GUI_RECT *pClipRect_Old = NULL; #else GUI_RECT Rect_Old; #endif if (s) { GUI_LOCK(); if (pRect) { #if (GUI_WINSUPPORT) pClipRect_Old = WM_SetUserClipRect(pRect); #else Rect_Old = GUI_Context.ClipRect; LCD_SetClipRectEx(pRect); #endif } _DispStringInRect(s, pRect, TextAlign); #if (GUI_WINSUPPORT) WM_SetUserClipRect(pClipRect_Old); #else LCD_SetClipRectEx(&Rect_Old); #endif GUI_UNLOCK(); } }
void GUI_DispStringInRectMax(const char GUI_UNI_PTR *s, GUI_RECT* pRect, int TextAlign, int MaxLen) { GUI_RECT Rect_Old, r; if (s && pRect) { GUI_LOCK(); Rect_Old = GUI_Context.ClipRect[GUI_Context.SelLayer]; GUI__IntersectRects(&r, pRect, &Rect_Old); LCD_SetClipRectEx(&r); GUI__DispStringInRect(s, pRect, TextAlign, MaxLen); LCD_SetClipRectEx(&Rect_Old); GUI_UNLOCK(); } }
int WM__GetNextIVR (void) { #if GUI_SUPPORT_CURSOR static char _CursorHidden; #endif /* If WM is not active, we have no rectangles to return */ if (WM_IsActive==0) return 0; if (ClipContext.EntranceCnt > 1) { ClipContext.EntranceCnt--; return 0; } #if GUI_SUPPORT_CURSOR if (_CursorHidden) { _CursorHidden = 0; (*GUI_CURSOR_pfTempUnhide)(&ClipContext.CurRect); } #endif ++ClipContext.Cnt; /* Find next rectangle and use it as ClipRect */ if (!FindNext_IVR()) { ClipContext.EntranceCnt--; /* This search is over ! */ return 0; /* Could not find an other one ! */ } /* Hide cursor if necessary */ LCD_SetClipRectEx(&ClipContext.CurRect); #if GUI_SUPPORT_CURSOR if (GUI_CURSOR_pfTempHide) { _CursorHidden = 1; (*GUI_CURSOR_pfTempHide) ( &ClipContext.CurRect); } #endif return 1; }
/********************************************************************* * * GUI_DispStringInRectEx */ void GUI_DispStringInRectEx(const char GUI_UNI_PTR *s, GUI_RECT* pRect, int TextAlign, int MaxLen, const GUI_ROTATION * pLCD_Api) { const GUI_ROTATION * pLCD_ApiOld; if (pLCD_Api == GUI_ROTATE_0) { /* Do nothing else but calling GUI_DispStringInRectMax if pLCD_Api == GUI_ROTATE_0 */ GUI_DispStringInRectMax(s, pRect, TextAlign, MaxLen); } else { #if (!GUI_WINSUPPORT) GUI_RECT Rect_Old; #else const GUI_RECT * pOldClipRect = NULL; #endif GUI_RECT rClip, rText = {0}; GUI_LOCK(); /* Set the clip rectangle */ if (pRect) { rText = *pRect; GUI_RectDispString = rText; #if (GUI_WINSUPPORT) pOldClipRect = WM_SetUserClipRect(pRect); if (pOldClipRect) { GUI__IntersectRects(&rClip, pRect, pOldClipRect); WM_SetUserClipRect(&rClip); } #else Rect_Old = GUI_Context.ClipRect; GUI__IntersectRects(&rClip, pRect, &Rect_Old); LCD_SetClipRectEx(&rClip); #endif } pLCD_ApiOld = _SetRotation(pLCD_Api); /* Set the new function pointer for rotating text */ pLCD_Api->pfRect2TextRect(&rText); /* Calculate the text rectangle */ GUI__DispStringInRect(s, &rText, TextAlign, MaxLen); /* Display the string */ /* Restore old clipping rectangle */ #if (GUI_WINSUPPORT) WM_SetUserClipRect(pOldClipRect); #else LCD_SetClipRectEx(&Rect_Old); #endif _SetRotation(pLCD_ApiOld); GUI_UNLOCK(); } }
const GUI_RECT* WM_SetUserClipRect(const GUI_RECT* pRect) { const GUI_RECT* pRectReturn; GUI_RECT r; WM_Obj* pAWin; WM_LOCK(); pRectReturn = GUI_Context.WM__pUserClipRect; GUI_Context.WM__pUserClipRect = pRect; /* Activate it ... */ if (pRect) { r = *pRect; pAWin = WM_HANDLE2PTR(GUI_Context.hAWin); WM__Client2Screen(pAWin, &r); LCD_SetClipRectEx(&r); } else { WM_GetWindowRect(&r); LCD_SetClipRectEx(&r); } WM_UNLOCK(); return pRectReturn; }
void WM__SetMaxClipRect(const WM_Obj* pWin) { WM_LOCK(); LCD_SetClipRectEx(&pWin->Rect); WM_UNLOCK(); }