system/lib/lcd/gui/Core/GUI_DispStringInRectEx.c

116 lines
3.8 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 : GUI_DispStringInRectEx.c
Purpose : Implementation of GUI_DispStringInRectEx
---------------------------END-OF-HEADER------------------------------
*/
#include <stddef.h>
#include "GUI_Private.h"
#if GUI_WINSUPPORT
#include "WM.h"
#endif
#if GUI_SUPPORT_ROTATION
/*********************************************************************
*
* Global data
*
**********************************************************************
*/
GUI_RECT GUI_RectDispString; /* Used by LCD_Rotate... */
/*********************************************************************
*
* Static code
*
**********************************************************************
*/
static const GUI_ROTATION * _SetRotation(const GUI_ROTATION* pLCD_Api) {
const GUI_ROTATION * pLCD_ApiOld;
GUI_LOCK();
pLCD_ApiOld = GUI_pLCD_APIList;
if (pLCD_Api) {
GUI_Context.pClipRect_HL = NULL; /* Do not perform high level clipping in rotated mode */
} else {
GUI_Context.pClipRect_HL = &GUI_Context.ClipRect;
}
GUI_pLCD_APIList = pLCD_Api;
GUI_UNLOCK();
return pLCD_ApiOld;
}
/*********************************************************************
*
* Exported code
*
**********************************************************************
*/
/*********************************************************************
*
* 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();
}
}
#else /* Avoid empty object files */
void GUI_DispStringInRectEx_C(void);
void GUI_DispStringInRectEx_C(void) {}
#endif
/*************************** End of file ****************************/