⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 guiuc1.c

📁 uCGUI
💻 C
字号:
/*************************************************************************************************************
                                                   uC/GUI
*                           Universal graphic software for embedded applications

File        : GUIUC1.C
Purpose     : Implementation of character and string services
************************************************************************************************************/
#include <stddef.h>           /* needed for definition of NULL */
#include "GUI_Private.H"

#if GUI_SUPPORT_UNICODE

/*************************************************************************************************************
*            static functions
*************************************************************************************************************/
static int GetLineDistX(const U16 GUI_FAR *s, int Len)
{
  int Dist =0;
  if (s) {
    U16 c0;
    while (((c0=*s) !=0) && Len >=0)
    {
      s++; Len--;
      Dist += GUI_GetCharDistX(c0);
    }
  }
  return Dist;
}

static int GetLineLen(const U16 GUI_FAR *s, int MaxLen)
{
  int Len =0;
  if (!s)
    return 0;
  {
    while ((*s !=0) && Len < MaxLen)
    {
      Len++; s++;
    }
  }
  return Len;
}

static void DispLine_UC(const U16 GUI_FAR *s, int Len, const GUI_RECT *pRect)
{
  if (GUI_Context.pClipRect_HL)
  {
    if (GUI_RectsIntersect(GUI_Context.pClipRect_HL, pRect) == 0)
      return;
  }
  {
    U16 c0;
    while (--Len >=0)
    {
      c0=*s++;
      GL_DispChar (c0);
    }
  }
}

static void DispLine(const U16 GUI_FAR *s, int Len, const GUI_RECT* pr)
{
  GUI_RECT r;
  r = *pr;
  #if GUI_WINSUPPORT
  WM_ADDORG(r.x0,r.y0);
  WM_ADDORG(r.x1,r.y1);
  WM_ITERATE_START(&r)
  {
  #endif
     GUI_Context.DispPosX = r.x0;
     GUI_Context.DispPosY = r.y0;
     DispLine_UC(s, Len, &r);    /* Do the actual drawing via routine call. */
  #if GUI_WINSUPPORT
  } WM_ITERATE_END();
  WM_SUBORG(GUI_Context.DispPosX, GUI_Context.DispPosY);
  #endif
}

/*************************************************************************************************************
*            UNICODE routines
*************************************************************************************************************/
void GUI_DispString_UC(const U16 GUI_FAR *s)
{
  int xAdjust, yAdjust, xOrg;
  int FontSizeY;
  
  if (!s)
    return;
  GUI_LOCK();
  FontSizeY = GUI_Context.pAFont->YSize;
  xOrg = GUI_Context.DispPosX;
 /* Adjust vertical position */
  yAdjust = GUI_GetYAdjust();
  GUI_Context.DispPosY -= yAdjust;
  for (; *s; s++) {
    GUI_RECT r;
    int LineLen= GetLineLen(s,0x7fff);
    int xLineSize = GetLineDistX(s, LineLen);
  /* Check if x-position needs to be changed due to h-alignment */
    switch (GUI_Context.TextAlign & GUI_TA_HORIZONTAL) {
    case GUI_TA_CENTER: xAdjust= xLineSize/2; break;
    case GUI_TA_RIGHT:  xAdjust= xLineSize; break;
    default:            xAdjust= 0;
    }
    r.x0 = GUI_Context.DispPosX -= xAdjust;
    r.x1 = r.x0 + xLineSize-1;
    r.y0 = GUI_Context.DispPosY;
    r.y1 = r.y0 + FontSizeY-1;
    DispLine(s, LineLen, &r);
    GUI_Context.DispPosY = r.y0;
    s += LineLen;
    if (*s=='\n')
    {
      switch (GUI_Context.TextAlign & GUI_TA_HORIZONTAL)
      {
        case GUI_TA_CENTER:
        case GUI_TA_RIGHT:
          GUI_Context.DispPosX = xOrg;
          break;
        default:
          GUI_Context.DispPosX = GUI_Context.LBorder;
          break;
      }
      GUI_Context.DispPosY += GUI_GetFontDistY();
    }
    else
    {
      GUI_Context.DispPosX = r.x0+xLineSize;
    }
    if (*s==0)    /* end of string (last line) reached ? */
      break;
  }
  GUI_Context.DispPosY += yAdjust;
  GUI_Context.TextAlign &= ~GUI_TA_HORIZONTAL;
  GUI_UNLOCK();
}

#else

void GUIUC1_C(void) {} /* avoid empty object files */

#endif /* GUI_SUPPORT_UNICODE */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -