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

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        : GUIUC1.C
  16. Purpose     : Implementation of character and string services
  17. ----------------------------------------------------------------------
  18. Version-Date---Author-Explanation
  19. ---------------------------END-OF-HEADER------------------------------
  20. */
  21. #include <stddef.h>           /* needed for definition of NULL */
  22. #include "GUI_Private.H"
  23. #if GUI_SUPPORT_UNICODE
  24. /*
  25. ************************************************************
  26. *
  27. *            static functions
  28. *
  29. ************************************************************
  30. */
  31. static int GetLineDistX(const U16 GUI_FAR *s, int Len) {
  32.   int Dist =0;
  33.   if (s) {
  34.     U16 c0;
  35.     while (((c0=*s) !=0) && Len >=0) {
  36.       s++; Len--;
  37.       Dist += GUI_GetCharDistX(c0);
  38.     }
  39.   }
  40.   return Dist;
  41. }
  42. static int GetLineLen(const U16 GUI_FAR *s, int MaxLen) {
  43.   int Len =0;
  44.   if (!s)
  45.     return 0;
  46.   {
  47.     while ((*s !=0) && Len < MaxLen) {
  48.       Len++; s++;
  49.     }
  50.   }
  51.   return Len;
  52. }
  53. static void DispLine_UC(const U16 GUI_FAR *s, int Len, const GUI_RECT *pRect) {
  54.   if (GUI_Context.pClipRect_HL) {
  55.     if (GUI_RectsIntersect(GUI_Context.pClipRect_HL, pRect) == 0)
  56.       return;
  57.   }
  58.   {
  59.     U16 c0;
  60.     while (--Len >=0) {
  61.       c0=*s++;
  62.       GL_DispChar (c0);
  63.     }
  64.   }
  65. }
  66. static void DispLine(const U16 GUI_FAR *s, int Len, const GUI_RECT* pr) {
  67.   GUI_RECT r;
  68.   r = *pr;
  69.   #if GUI_WINSUPPORT
  70.   WM_ADDORG(r.x0,r.y0);
  71.   WM_ADDORG(r.x1,r.y1);
  72.   WM_ITERATE_START(&r) {
  73.   #endif
  74.      GUI_Context.DispPosX = r.x0;
  75.      GUI_Context.DispPosY = r.y0;
  76.      DispLine_UC(s, Len, &r);    /* Do the actual drawing via routine call. */
  77.   #if GUI_WINSUPPORT
  78.   } WM_ITERATE_END();
  79.   WM_SUBORG(GUI_Context.DispPosX, GUI_Context.DispPosY);
  80.   #endif
  81. }
  82. /*
  83. ************************************************************
  84. *
  85. *            UNICODE routines
  86. *
  87. ************************************************************
  88. */
  89. void GUI_DispString_UC(const U16 GUI_FAR *s) {
  90.   int xAdjust, yAdjust, xOrg;
  91.   int FontSizeY;
  92.   if (!s)
  93.     return;
  94.   GUI_LOCK();
  95.   FontSizeY = GUI_Context.pAFont->YSize;
  96.   xOrg = GUI_Context.DispPosX;
  97.  /* Adjust vertical position */
  98.   yAdjust = GUI_GetYAdjust();
  99.   GUI_Context.DispPosY -= yAdjust;
  100.   for (; *s; s++) {
  101.     GUI_RECT r;
  102.     int LineLen= GetLineLen(s,0x7fff);
  103.     int xLineSize = GetLineDistX(s, LineLen);
  104.   /* Check if x-position needs to be changed due to h-alignment */
  105.     switch (GUI_Context.TextAlign & GUI_TA_HORIZONTAL) { 
  106.     case GUI_TA_CENTER: xAdjust= xLineSize/2; break;
  107.     case GUI_TA_RIGHT:  xAdjust= xLineSize; break;
  108.     default:            xAdjust= 0;
  109.     }
  110.     r.x0 = GUI_Context.DispPosX -= xAdjust;
  111.     r.x1 = r.x0 + xLineSize-1;    
  112.     r.y0 = GUI_Context.DispPosY;
  113.     r.y1 = r.y0 + FontSizeY-1;    
  114.     DispLine(s, LineLen, &r);
  115.     GUI_Context.DispPosY = r.y0;
  116.     s += LineLen;
  117.     if (*s=='n') {
  118.       switch (GUI_Context.TextAlign & GUI_TA_HORIZONTAL) { 
  119.       case GUI_TA_CENTER:
  120.       case GUI_TA_RIGHT:
  121.         GUI_Context.DispPosX = xOrg;
  122.         break;
  123.       default:
  124.         GUI_Context.DispPosX = GUI_Context.LBorder;
  125.         break;
  126.       }
  127.       GUI_Context.DispPosY += GUI_GetFontDistY();
  128.     } else {
  129.       GUI_Context.DispPosX = r.x0+xLineSize;
  130.     }
  131.     if (*s==0)    /* end of string (last line) reached ? */
  132.       break;
  133.   }
  134.   GUI_Context.DispPosY += yAdjust;
  135.   GUI_Context.TextAlign &= ~GUI_TA_HORIZONTAL;
  136.   GUI_UNLOCK();
  137. }
  138. #else
  139. void GUIUC1_C(void) {} /* avoid empty object files */
  140. #endif /* GUI_SUPPORT_UNICODE */