GUI_DispStringInRect.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:3k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                                uC/GUI
  4. *                        Universal graphic software for embedded applications
  5. *
  6. *                       (c) Copyright 2002, Micrium Inc., Weston, FL
  7. *                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
  8. *
  9. *              礐/GUI is protected by international copyright laws. Knowledge of the
  10. *              source code may not be used to write a similar product. This file may
  11. *              only be used in accordance with a license and should not be redistributed
  12. *              in any way. We appreciate your understanding and fairness.
  13. *
  14. ----------------------------------------------------------------------
  15. File        : GUI_DispStringInRect.c
  16. Purpose     : Implementation of GUI_DispStringInRect
  17. ---------------------------END-OF-HEADER------------------------------
  18. */
  19. #include <stddef.h>           /* needed for definition of NULL */
  20. #include <stdio.h>
  21. #include <string.h>
  22. #include "GUI_Private.H"
  23.  
  24. /********************************************************************
  25. *
  26. *                Display String in given rectangle
  27. *
  28. *********************************************************************
  29. */
  30. static void _DispStringInRect(const char GUI_FAR *s, GUI_RECT* pRect, int TextAlign) {
  31.   GUI_RECT r;
  32.   GUI_RECT rLine;
  33.   int y;
  34.   int NumLines;
  35.   const char *sOrg =s;
  36.   int FontYSize;
  37.   int xLine;
  38.   FontYSize = GUI_GetFontSizeY();
  39.   if (pRect) {
  40.     r = *pRect;
  41.   } else {
  42.     GUI_GetClientRect(&r);
  43.   }
  44.   /* Count the number of lines for vertical alignment */
  45.   for (NumLines=1; ;NumLines++) {
  46.     int LineLen= GUI__GetLineLen(s,0x7fff);
  47.     s += LineLen;
  48.     if (GUI__HandleEOLine(&s))
  49.       break;
  50.   }
  51.   /* Do the vertical alignment */
  52.   switch (TextAlign & GUI_TA_VERTICAL) {
  53. case GUI_TA_TOP:
  54. y = r.y0;
  55.     break;
  56. case GUI_TA_BASELINE:
  57. case GUI_TA_BOTTOM:
  58. y = r.y1 -NumLines * FontYSize+1;
  59.     break;
  60. case GUI_TA_VCENTER:
  61. y = r.y0+(r.y1-r.y0+1 -NumLines * FontYSize) /2;
  62.     break;
  63. }
  64.   for (s=sOrg; ;) {
  65.     int LineLen= GUI__GetLineLen(s,0x7fff);
  66.     int xLineSize = GUI_GetLineDistX(s, LineLen);
  67.     switch (TextAlign & GUI_TA_HORIZONTAL) {
  68.     case GUI_TA_HCENTER:
  69.       xLine = r.x0+(r.x1-r.x0-xLineSize)/2; break;
  70.     case GUI_TA_LEFT:
  71.       xLine = r.x0; break;
  72.     case GUI_TA_RIGHT:
  73.       xLine = r.x1 -xLineSize;
  74.     }
  75.     rLine.x0 = GUI_Context.DispPosX = xLine;
  76.     rLine.x1 = rLine.x0 + xLineSize-1;
  77.     rLine.y0 = GUI_Context.DispPosY = y;
  78.     rLine.y1 = y + FontYSize-1;
  79.     GUI__DispLine(s, LineLen, &rLine);
  80.     s += LineLen;
  81.     y += GUI_GetFontDistY();
  82.     if (GUI__HandleEOLine(&s))
  83.       break;
  84.   }
  85. }
  86. void GUI_DispStringInRect(const char GUI_FAR *s, GUI_RECT* pRect, int TextAlign) {
  87.   #if (GUI_WINSUPPORT)
  88.     const GUI_RECT *pClipRect_Old;
  89.   #else
  90.     GUI_RECT Rect_Old;
  91.   #endif
  92.   if (s) {
  93.     GUI_LOCK();
  94.     if (pRect) {
  95.       #if (GUI_WINSUPPORT)
  96.         pClipRect_Old = WM_SetUserClipRect(pRect);
  97.       #else
  98.         Rect_Old = GUI_Context.ClipRect;
  99.         LCD_SetClipRectEx(pRect);
  100.       #endif      
  101.     }
  102.     _DispStringInRect(s, pRect, TextAlign);
  103.     #if (GUI_WINSUPPORT)
  104.       WM_SetUserClipRect(pClipRect_Old);
  105.     #else
  106.       LCD_SetClipRectEx(&Rect_Old);
  107.     #endif      
  108.     GUI_UNLOCK();
  109.   }
  110. }
  111. /***  End of file ***/