First draft of a simple application to read a bitmap from a file in QSPI memory, and display it on the LPC4088 using the easyGUI library.

Dependencies:   DMBasicGUI DMSupport

Revision:
0:6db0d96b351d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/easyGUIFixed/GuiComponents.h	Fri Jul 28 14:40:43 2017 +0000
@@ -0,0 +1,4250 @@
+/* ************************************************************************ */
+/*                                                                          */
+/*                     (C)2004-2015 IBIS Solutions ApS                      */
+/*                            sales@easyGUI.com                             */
+/*                             www.easyGUI.com                              */
+/*                                                                          */
+/*                               v6.0.9.005                                 */
+/*                                                                          */
+/*     GuiLib.c include file - do NOT reference it in your linker setup     */
+/*                                                                          */
+/* ************************************************************************ */
+
+//------------------------------------------------------------------------------
+void GuiLib_ClearPositionCallbacks(void)
+{
+  GuiConst_INT16U I;
+
+  for (I = 0; I < GuiConst_POSCALLBACK_CNT; I++)
+    sgl.PosCallbacks[I].InUse = 0;
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_SetPositionCallbackFunc(
+   GuiConst_INT16U IndexNo,
+   void (*PosCallbackFunc) (GuiConst_INT16U IndexNo,
+                            GuiConst_INT16S X,
+                            GuiConst_INT16S Y))
+{
+  GuiConst_INT32S I, J;
+
+  J = -1;
+  for (I = 0; I < GuiConst_POSCALLBACK_CNT; I++)
+    if (sgl.PosCallbacks[I].IndexNo == IndexNo)
+    {
+      J = I;
+      break;
+    }
+  if (J == -1)
+    for (I = 0; I < GuiConst_POSCALLBACK_CNT; I++)
+      if (!sgl.PosCallbacks[I].InUse)
+      {
+        J = I;
+        break;
+      }
+
+  if (J >= 0)
+  {
+    sgl.PosCallbacks[J].InUse = 1;
+    sgl.PosCallbacks[J].PosCallbackFunc = PosCallbackFunc;
+    sgl.PosCallbacks[J].IndexNo = IndexNo;
+  }
+}
+
+#ifdef GuiConst_CURSOR_SUPPORT_ON
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+static void DrawCursorItem(
+   GuiConst_INT8U CursorVisible)
+{
+#ifndef GuiConst_CURSOR_FIELDS_OFF
+  GuiConst_INT16S RemCursorFieldNo, I;
+  PrefixLocate ItemMemory     RemMemory;
+  PrefixLocate ItemMemory  *PrefixLocate CursorMemory;
+  PrefixLocate GuiLib_ItemRec *CursorItem;
+
+  if (sgl.CursorInUse && (GuiLib_ActiveCursorFieldNo >= 0))
+  {
+    I = -1;
+    memcpy(&RemMemory, &sgl.Memory, sizeof(ItemMemory));
+    while ((I = AutoRedraw_GetCursor(GuiLib_ActiveCursorFieldNo, I)) != -1)
+    {
+      CursorItem = AutoRedraw_GetItem(I);
+      CursorMemory = AutoRedraw_GetItemMemory(I);
+
+      if ((CursorItem == NULL) || (CursorMemory == NULL))
+        return;
+
+      memcpy(&sgl.CurItem, CursorItem, sizeof(GuiLib_ItemRec));
+      memcpy(&sgl.Memory, CursorMemory, sizeof(ItemMemory));
+
+
+  #ifdef GuiConst_ITEM_SCROLLBOX_INUSE
+      if ((sgl.CurItem.TextPar[0].BitFlags & GuiLib_BITFLAG_FIELDSCROLLBOX) &&
+          (sgl.ScrollBoxesAry[sgl.CurItem.CursorScrollBoxIndex].ScrollLineDataFunc != 0))
+        sgl.ScrollBoxesAry[sgl.CurItem.CursorScrollBoxIndex].ScrollLineDataFunc(
+           sgl.ScrollBoxesAry[sgl.CurItem.CursorScrollBoxIndex].MarkerStartLine[0]);
+  #endif // GuiConst_ITEM_SCROLLBOX_INUSE
+
+      if (!CursorVisible)
+      {
+        RemCursorFieldNo = GuiLib_ActiveCursorFieldNo;
+        GuiLib_ActiveCursorFieldNo = -1;
+      }
+      else
+        RemCursorFieldNo = 0;
+
+      sgl.SwapColors = 0;
+  #ifdef GuiConst_ITEM_SCROLLBOX_INUSE
+      if (sgl.CurItem.TextPar[0].BitFlags & GuiLib_BITFLAG_FIELDSCROLLBOX)
+        ScrollBox_DrawScrollLine(sgl.CurItem.CursorScrollBoxIndex,
+           sgl.ScrollBoxesAry[sgl.CurItem.CursorScrollBoxIndex].MarkerStartLine[0]);
+      else
+  #endif // GuiConst_ITEM_SCROLLBOX_INUSE
+      {
+  #ifdef GuiConst_BITMAP_SUPPORT_ON
+        UpdateBackgroundBitmap();
+  #endif
+
+        DrawItem(GuiLib_COL_INVERT_IF_CURSOR);
+      }
+
+      if (!CursorVisible)
+        GuiLib_ActiveCursorFieldNo = RemCursorFieldNo;
+    }
+    memcpy(&sgl.Memory, &RemMemory, sizeof(ItemMemory));
+  }
+  #else // GuiConst_CURSOR_FIELDS_OFF
+  CursorVisible = 0;
+  #endif // GuiConst_CURSOR_FIELDS_OFF
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_Cursor_Hide(void)
+{
+#ifndef GuiConst_CURSOR_FIELDS_OFF
+  GuiDisplay_Lock();
+  DrawCursorItem(0);
+  GuiDisplay_Unlock();
+  GuiLib_ActiveCursorFieldNo = -1;
+#endif // GuiConst_CURSOR_FIELDS_OFF
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_IsCursorFieldInUse(
+   GuiConst_INT16S AskCursorFieldNo)
+{
+#ifndef GuiConst_CURSOR_FIELDS_OFF
+  if (AskCursorFieldNo >= 0)
+  {
+    if (AutoRedraw_GetCursor(AskCursorFieldNo, -1) != -1)
+      return 1;
+  }
+
+  return 0;
+#else // GuiConst_CURSOR_FIELDS_OFF
+  return 0;
+#endif // GuiConst_CURSOR_FIELDS_OFF
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Cursor_Select(
+   GuiConst_INT16S NewCursorFieldNo)
+{
+#ifndef GuiConst_CURSOR_FIELDS_OFF
+  if (NewCursorFieldNo == -1)
+  {
+    GuiLib_Cursor_Hide();
+    return 0;
+  }
+  else if (NewCursorFieldNo >= 0)
+  {
+    if (AutoRedraw_GetCursor(NewCursorFieldNo, -1) != -1)
+    {
+      GuiDisplay_Lock();
+
+      DrawCursorItem(0);
+      GuiLib_ActiveCursorFieldNo = NewCursorFieldNo;
+      DrawCursorItem(1);
+
+      GuiDisplay_Unlock();
+
+      return 1;
+    }
+  }
+
+  return 0;
+#else
+  NewCursorFieldNo = 0;
+  return 0;
+#endif
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Cursor_Down(void)
+{
+#ifndef GuiConst_CURSOR_FIELDS_OFF
+  GuiConst_INT16S NewCursorFieldNo, Index;
+
+  Index = AutoRedraw_GetNextCursor(GuiLib_ActiveCursorFieldNo);
+
+  NewCursorFieldNo = AutoRedraw_GetCursorNumber(Index);
+
+#ifdef GuiConst_CURSOR_MODE_WRAP_AROUND
+  if ((NewCursorFieldNo == GuiLib_ActiveCursorFieldNo)
+   || (Index == -1))
+    return GuiLib_Cursor_Home();
+#else
+  if (Index == -1)
+    return 0;
+#endif
+
+  GuiLib_Cursor_Select(NewCursorFieldNo);
+
+  return 1;
+#else
+  return 0;
+#endif
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Cursor_Up(void)
+{
+#ifndef GuiConst_CURSOR_FIELDS_OFF
+  GuiConst_INT16S NewCursorFieldNo, Index;
+
+  Index = AutoRedraw_GetPrevCursor(GuiLib_ActiveCursorFieldNo);
+
+  NewCursorFieldNo = AutoRedraw_GetCursorNumber(Index);
+
+#ifdef GuiConst_CURSOR_MODE_WRAP_AROUND
+  if ((NewCursorFieldNo == GuiLib_ActiveCursorFieldNo)
+   || (Index == -1))
+    return GuiLib_Cursor_End();
+#else
+  if (Index == -1)
+    return 0;
+#endif
+
+  GuiLib_Cursor_Select(NewCursorFieldNo);
+
+  return 1;
+#else
+  return 0;
+#endif
+
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Cursor_Home(void)
+{
+#ifndef GuiConst_CURSOR_FIELDS_OFF
+  GuiConst_INT16S NewCursorFieldNo, Index;
+
+  Index = AutoRedraw_GetFirstCursor();
+
+  NewCursorFieldNo = AutoRedraw_GetCursorNumber(Index);
+
+  if (NewCursorFieldNo == GuiLib_ActiveCursorFieldNo)
+    return 0;
+
+  GuiLib_Cursor_Select(NewCursorFieldNo);
+
+  return 1;
+#else
+  return 0;
+#endif
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Cursor_End(void)
+{
+#ifndef GuiConst_CURSOR_FIELDS_OFF
+  GuiConst_INT16S NewCursorFieldNo, Index;
+
+  Index = AutoRedraw_GetLastCursor();
+
+  NewCursorFieldNo = AutoRedraw_GetCursorNumber(Index);
+
+  if (NewCursorFieldNo == GuiLib_ActiveCursorFieldNo)
+    return 0;
+
+  GuiLib_Cursor_Select(NewCursorFieldNo);
+
+  return 1;
+#else
+  return 0;
+#endif
+}
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+#endif // GuiConst_CURSOR_SUPPORT_ON
+
+#ifdef GuiConst_BLINK_SUPPORT_ON
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+static void BlinkBox(void)
+{
+  if ((sgl.BlinkBoxRate) && (sgl.DisplayWriting))
+    GuiLib_InvertBox(sgl.BlinkBoxX1, sgl.BlinkBoxY1, sgl.BlinkBoxX2, sgl.BlinkBoxY2);
+  sgl.BlinkBoxInverted = !sgl.BlinkBoxInverted;
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_BlinkBoxStart(
+   GuiConst_INT16S X1,
+   GuiConst_INT16S Y1,
+   GuiConst_INT16S X2,
+   GuiConst_INT16S Y2,
+   GuiConst_INT16S Rate)
+{
+  GuiLib_BlinkBoxStop();
+  sgl.BlinkBoxX1 = X1;
+  sgl.BlinkBoxY1 = Y1;
+  sgl.BlinkBoxX2 = X2;
+  sgl.BlinkBoxY2 = Y2;
+  if (Rate < 1)
+    sgl.BlinkBoxRate = 1;
+  else
+    sgl.BlinkBoxRate = Rate;
+  sgl.BlinkBoxState = sgl.BlinkBoxRate;
+  sgl.BlinkBoxInverted = 0;
+  BlinkBox();
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_BlinkBoxStop(void)
+{
+#ifndef GuiConst_BLINK_FIELDS_OFF
+  GuiConst_INT16U I;
+#endif
+
+  if (sgl.BlinkBoxRate && sgl.BlinkBoxInverted)
+    BlinkBox();
+  sgl.BlinkBoxRate = 0;
+
+#ifndef GuiConst_BLINK_FIELDS_OFF
+  for (I = 0; I < GuiConst_BLINK_FIELDS_MAX; I++)
+    if (sgl.BlinkTextItems[I].InUse && sgl.BlinkTextItems[I].Active)
+      GuiLib_BlinkBoxMarkedItemStop(I);
+#endif
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_BlinkBoxMarkedItem(
+   GuiConst_INT16U BlinkFieldNo,
+   GuiConst_INT16U CharNo,
+   GuiConst_INT16S Rate)
+{
+#ifndef GuiConst_BLINK_FIELDS_OFF
+  GuiConst_INT16S TextXOfs[GuiConst_MAX_TEXT_LEN + 2];
+  TextParRec TempTextPar;
+  GuiConst_INT8U TempPs;
+  GuiConst_INT16U CharCnt;
+  GuiConst_INT16U TempTextLength;
+  GuiConst_INT8U TempFormatFieldWidth;
+  GuiConst_INT8U TempFormatDecimals;
+  GuiConst_INT8U TempFormatAlignment;
+  GuiConst_INT8U TempFormatFormat;
+  #ifdef GuiConst_REMOTE_FONT_DATA
+  GuiConst_INT32U PrefixRom TempOfs;
+  GuiConst_INT8U CharHeader[GuiLib_CHR_LINECTRL_OFS];
+  #else // GuiConst_REMOTE_FONT_DATA
+  GuiConst_INT8U PrefixRom * TempPtr;
+  #endif // GuiConst_REMOTE_FONT_DATA
+  #ifdef GuiConst_ITEM_TEXTBLOCK_INUSE
+  GuiConst_INT8U CharHeader1[GuiLib_CHR_LINECTRL_OFS];
+  GuiConst_INT8U CharHeader2[GuiLib_CHR_LINECTRL_OFS];
+  GuiConst_INT16S TextCharLineStart[GuiConst_MAX_PARAGRAPH_LINE_CNT];
+  GuiConst_INT16S TextCharLineEnd[GuiConst_MAX_PARAGRAPH_LINE_CNT];
+  GuiConst_INT16S M;
+  GuiConst_INT16S LineCnt;
+  GuiConst_INT16S LineCnt2;
+  GuiConst_INT16S LineLen;
+  GuiConst_INT16S XStart, XEnd;
+  GuiConst_INT16S P2;
+  #endif // GuiConst_ITEM_TEXTBLOCK_INUSE
+  GuiConst_INT16S N;
+#ifndef GuiConst_CHARMODE_ANSI
+  GuiConst_INT16S P1;
+#endif
+  GuiConst_TEXT PrefixGeneric *CharPtr;
+  GuiConst_INT32S VarValue;
+  GuiConst_INT16S TextPixelLen;
+
+  if ((BlinkFieldNo >= GuiConst_BLINK_FIELDS_MAX) ||
+      !sgl.BlinkTextItems[BlinkFieldNo].InUse)
+    return;
+
+  if (sgl.BlinkTextItems[BlinkFieldNo].Active &&
+      sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxRate &&
+      sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxInverted)
+  {
+    if (sgl.DisplayWriting)
+    {
+      GuiLib_InvertBox(sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1,
+                       sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxY1,
+                       sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX2,
+                       sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxY2);
+      sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxInverted =
+         !sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxInverted;
+      sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxLast =
+         sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxInverted;
+    }
+  }
+
+  sgl.BlinkTextItems[BlinkFieldNo].Active = 0;
+  sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxRate = 0;
+
+  if ((BlinkFieldNo < GuiConst_BLINK_FIELDS_MAX) &&
+       sgl.BlinkTextItems[BlinkFieldNo].InUse)
+  {
+    sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 = sgl.BlinkTextItems[BlinkFieldNo].X1;
+    sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX2 = sgl.BlinkTextItems[BlinkFieldNo].X2;
+    sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxY1 = sgl.BlinkTextItems[BlinkFieldNo].Y1;
+    sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxY2 = sgl.BlinkTextItems[BlinkFieldNo].Y2;
+
+    if (sgl.BlinkTextItems[BlinkFieldNo].InUse)
+    {
+      TempTextPar = sgl.CurItem.TextPar[0];
+      TempTextLength = sgl.CurItem.TextLength[0];
+      TempFormatFieldWidth = sgl.CurItem.FormatFieldWidth;
+      TempFormatDecimals = sgl.CurItem.FormatDecimals;
+      TempFormatAlignment = sgl.CurItem.FormatAlignment;
+      TempFormatFormat = sgl.CurItem.FormatFormat;
+
+      sgl.CurItem.FormatFieldWidth = sgl.BlinkTextItems[BlinkFieldNo].FormatFieldWidth;
+      sgl.CurItem.FormatDecimals = sgl.BlinkTextItems[BlinkFieldNo].FormatDecimals;
+      sgl.CurItem.FormatAlignment = sgl.BlinkTextItems[BlinkFieldNo].FormatAlignment;
+      sgl.CurItem.FormatFormat = sgl.BlinkTextItems[BlinkFieldNo].FormatFormat;
+      sgl.CurItem.TextPar[0] = sgl.BlinkTextItems[BlinkFieldNo].TextPar;
+      CharCnt = sgl.BlinkTextItems[BlinkFieldNo].CharCnt;
+      sgl.CurItem.TextLength[0] = CharCnt;
+
+      SetCurFont(sgl.BlinkTextItems[BlinkFieldNo].TextPar.FontIndex);
+
+      if ((sgl.BlinkTextItems[BlinkFieldNo].ItemType == GuiLib_ITEM_TEXT) ||
+          (sgl.BlinkTextItems[BlinkFieldNo].ItemType == GuiLib_ITEM_TEXTBLOCK))
+      {
+#ifdef GuiConst_CHARMODE_UNICODE
+        ExtractUnicodeString(
+           (GuiConst_INT8U PrefixRom *)sgl.BlinkTextItems[BlinkFieldNo].TextPtr,
+            sgl.CurItem.TextLength[0]);
+  #ifdef GuiConst_ARAB_CHARS_INUSE
+        if (sgl.BlinkTextItems[BlinkFieldNo].TextPar.BitFlags &
+            GuiLib_BITFLAG_REVERSEWRITING)
+        {
+          CharCnt = ArabicCorrection(
+             sgl.UnicodeTextBuf, CharCnt,
+             (sgl.BlinkTextItems[BlinkFieldNo].TextPar.BitFlags &
+              GuiLib_BITFLAG_REVERSEWRITING) > 0);
+        }
+  #endif // GuiConst_ARAB_CHARS_INUSE
+#endif // GuiConst_CHARMODE_UNICODE
+
+#ifdef GuiConst_CHARMODE_UNICODE
+        CharPtr = (GuiConst_TEXT PrefixGeneric *)sgl.UnicodeTextBuf;
+#else // GuiConst_CHARMODE_UNICODE
+        CharPtr = (GuiConst_TEXT PrefixRom *)sgl.BlinkTextItems[BlinkFieldNo].TextPtr;
+#endif // GuiConst_CHARMODE_UNICODE
+        PrepareText(CharPtr,CharCnt,0);
+      }
+      else
+      {
+#ifdef GuiConst_DISP_VAR_NOW
+        displayVarNow = 1;
+#endif
+        if (sgl.BlinkTextItems[BlinkFieldNo].VarType == GuiLib_VAR_STRING)
+        {
+          CharPtr = (GuiConst_TEXT PrefixGeneric *)sgl.BlinkTextItems[BlinkFieldNo].TextPtr;
+#ifdef GuiConst_CHARMODE_ANSI
+          CharCnt = strlen(CharPtr);
+#else
+#ifdef GuiConst_CODEVISION_COMPILER
+          CharCnt = GuiLib_UnicodeStrLen((GuiConst_TEXT*)CharPtr);
+#else // GuiConst_CODEVISION_COMPILER
+          CharCnt = GuiLib_UnicodeStrLen(CharPtr);
+#endif // GuiConst_CODEVISION_COMPILER
+#endif // GuiConst_CHARMODE_ANSI
+        }
+        else
+        {
+          VarValue = ReadVar(sgl.BlinkTextItems[BlinkFieldNo].TextPtr,
+                             sgl.BlinkTextItems[BlinkFieldNo].VarType);
+
+          CharCnt =
+             DataNumStr(VarValue, sgl.BlinkTextItems[BlinkFieldNo].VarType, 0);
+
+#ifdef GuiConst_CHARMODE_ANSI
+          CharPtr = (GuiConst_TEXT PrefixGeneric *) sgl.VarNumTextStr;
+#else // GuiConst_CHARMODE_ANSI
+          for (P1=0; P1<=CharCnt; P1++)
+            sgl.VarNumUnicodeTextStr[P1] = sgl.VarNumTextStr[P1];
+          CharPtr = (GuiConst_TEXT *) sgl.VarNumUnicodeTextStr;
+#endif // GuiConst_CHARMODE_ANSI
+        }
+#ifdef GuiConst_CHARMODE_ANSI
+         strcpy(sgl.AnsiTextBuf, CharPtr);
+#else // GuiConst_CHARMODE_ANSI
+         GuiLib_UnicodeStrCpy(sgl.UnicodeTextBuf, CharPtr);
+#endif // GuiConst_CHARMODE_ANSI
+#ifdef   GuiConst_ARAB_CHARS_INUSE
+         if (sgl.BlinkTextItems[BlinkFieldNo].TextPar.BitFlags &
+             GuiLib_BITFLAG_REVERSEWRITING)
+         {
+           CharCnt = ArabicCorrection(
+              sgl.UnicodeTextBuf, CharCnt,
+             (sgl.BlinkTextItems[BlinkFieldNo].TextPar.BitFlags &
+              GuiLib_BITFLAG_REVERSEWRITING) > 0);
+         }
+#endif // GuiConst_ARAB_CHARS_INUSE
+#ifdef GuiConst_CHARMODE_ANSI
+         CharPtr = sgl.AnsiTextBuf;
+#else // GuiConst_CHARMODE_ANSI
+         CharPtr = sgl.UnicodeTextBuf;
+#endif // GuiConst_CHARMODE_ANSI
+         PrepareText(CharPtr, CharCnt,0);
+
+#ifdef GuiConst_DISP_VAR_NOW
+         displayVarNow = 0;
+#endif
+      }
+
+      if (CharNo > CharCnt)
+      {
+        SetCurFont(sgl.CurItem.TextPar[0].FontIndex);
+        sgl.CurItem.TextPar[0] = TempTextPar;
+        sgl.CurItem.TextLength[0] = TempTextLength;
+        sgl.CurItem.FormatFieldWidth = TempFormatFieldWidth;
+        sgl.CurItem.FormatDecimals = TempFormatDecimals;
+        sgl.CurItem.FormatAlignment = TempFormatAlignment;
+        sgl.CurItem.FormatFormat = TempFormatFormat;
+        return;
+      }
+
+      if(CharNo > 0)
+      {
+#ifdef GuiConst_BLINK_LF_COUNTS
+        if (*(CharPtr + (CharNo - 1)) != GuiLib_LINEFEED)
+#endif
+        {
+          sgl.BlinkTextItems[BlinkFieldNo].Active = 0;
+          sgl.BlinkTextItems[BlinkFieldNo].CharNo = CharNo;
+        }
+      }
+
+#ifdef GuiConst_ITEM_TEXTBLOCK_INUSE
+      if ((sgl.BlinkTextItems[BlinkFieldNo].ItemType == GuiLib_ITEM_TEXTBLOCK)||
+          (sgl.BlinkTextItems[BlinkFieldNo].ItemType == GuiLib_ITEM_VARBLOCK))
+      {
+        if(CharNo > 0)
+        {
+          TextPixelLength(sgl.BlinkTextItems[BlinkFieldNo].TextPar.Ps,
+                          CharCnt, TextXOfs);
+
+          TextCharLineStart[0] = 0;
+          TextCharLineEnd[0] = -1;
+
+          LineCnt = 1 - sgl.BlinkTextItems[BlinkFieldNo].BlindLinesAtTop;
+          if (LineCnt >= 1)
+            LineCnt = 1;
+          LineCnt2 = 1;
+          P2 = 0;
+
+
+#ifdef GuiConst_REMOTE_FONT_DATA
+          GuiLib_RemoteDataReadBlock(
+             (GuiConst_INT32U PrefixRom)GuiFont_ChPtrList[
+              sgl.TextCharNdx[TextCharLineStart[LineCnt2 - 1]]],
+              GuiLib_CHR_LINECTRL_OFS,
+              CharHeader2);
+#endif // GuiConst_REMOTE_FONT_DATA
+
+          while (P2 < CharCnt)
+          {
+            while ((P2 < CharCnt - 1) &&
+                !((ReadBytePtr(CharPtr + P2) == GuiLib_LINEFEED) ||
+                ((ReadBytePtr(CharPtr + P2) != ' ') && (ReadBytePtr(CharPtr + P2 + 1) == ' ')) ||
+                ((ReadBytePtr(CharPtr + P2) == '-') && (ReadBytePtr(CharPtr + P2 + 1) != ' '))))
+              P2++;
+
+            if (CalcCharsWidth(TextCharLineStart[LineCnt2 - 1], P2,
+                               TextXOfs, &XStart, &XEnd) >
+               (sgl.BlinkTextItems[BlinkFieldNo].X2 -
+                sgl.BlinkTextItems[BlinkFieldNo].X1 + 1))
+            {
+              if (TextCharLineEnd[LineCnt2 - 1] == -1)
+              {
+                TextCharLineEnd[LineCnt2 - 1] = P2;
+                TextCharLineStart[LineCnt2] = P2 + 1;
+                TextCharLineEnd[LineCnt2] = -1;
+              }
+              else
+              {
+                TextCharLineStart[LineCnt2] = TextCharLineEnd[LineCnt2 - 1] + 1;
+                while ((TextCharLineStart[LineCnt2] < P2) &&
+                       (ReadBytePtr(CharPtr + TextCharLineStart[LineCnt2]) ==
+                        ' '))
+                  TextCharLineStart[LineCnt2]++;
+                TextCharLineEnd[LineCnt2] = P2;
+              }
+              if (LineCnt >= GuiConst_MAX_PARAGRAPH_LINE_CNT)
+              {
+                P2 = CharCnt;
+                break;
+              }
+              LineCnt++;
+              if (LineCnt > 1)
+                LineCnt2 = LineCnt;
+              else
+                TextCharLineStart[LineCnt2 - 1] = TextCharLineStart[LineCnt2];
+            }
+            else
+              TextCharLineEnd[LineCnt2 - 1] = P2;
+            if (ReadBytePtr(CharPtr + P2) == GuiLib_LINEFEED)
+            {
+              TextCharLineEnd[LineCnt2 - 1] = P2 - 1;
+              TextCharLineStart[LineCnt2] = P2 + 1;
+              TextCharLineEnd[LineCnt2] = -1;
+              if (LineCnt >= GuiConst_MAX_PARAGRAPH_LINE_CNT)
+              {
+                P2 = CharCnt;
+                break;
+              }
+              LineCnt++;
+              if (LineCnt > 1)
+                LineCnt2 = LineCnt;
+              else
+                TextCharLineStart[LineCnt2 - 1] = TextCharLineStart[LineCnt2];
+            }
+            P2++;
+          }
+
+            if (sgl.BlinkTextItems[BlinkFieldNo].TextPar.BitFlags &
+                GuiLib_BITFLAG_REVERSEWRITING)
+            {
+              for (M = 0; M < LineCnt2 ; M++)
+              {
+                for (P2 = TextCharLineStart[M]; P2 <= (TextCharLineStart[M] +
+                   ((TextCharLineEnd[M] - TextCharLineStart[M] + 1) / 2) - 1);
+                     P2++)
+                {
+#ifdef GuiConst_REMOTE_FONT_DATA
+                  TempOfs = sgl.TextCharNdx[P2];
+                  sgl.TextCharNdx[P2] =
+                     sgl.TextCharNdx[TextCharLineEnd[M] - (P2 - TextCharLineStart[M])];
+                  sgl.TextCharNdx[TextCharLineEnd[M] - (P2 - TextCharLineStart[M])] =
+                     TempOfs;
+#else // GuiConst_REMOTE_FONT_DATA
+                  TempPtr = sgl.TextCharPtrAry[P2];
+                  sgl.TextCharPtrAry[P2] =
+                     (GuiConst_INT8U PrefixRom *)sgl.TextCharPtrAry[
+                     TextCharLineEnd[M] - (P2 - TextCharLineStart[M])];
+                  sgl.TextCharPtrAry[TextCharLineEnd[M] - (P2 - TextCharLineStart[M])] =
+                     (GuiConst_INT8U PrefixRom *)TempPtr;
+#endif // GuiConst_REMOTE_FONT_DATA
+                }
+              }
+              TextPixelLength(sgl.BlinkTextItems[BlinkFieldNo].TextPar.Ps,
+                              CharCnt, TextXOfs);
+            }
+
+#ifdef GuiConst_TEXTBOX_FIELDS_ON
+            if (sgl.BlinkTextItems[BlinkFieldNo].BlindLinesAtTop < 0)
+              sgl.BlinkTextItems[BlinkFieldNo].BlindLinesAtTop = 0;
+            sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxY1 -=
+               sgl.BlinkTextItems[BlinkFieldNo].TextBoxScrollPos -
+              (sgl.BlinkTextItems[BlinkFieldNo].TextBoxLineDist *
+               sgl.BlinkTextItems[BlinkFieldNo].BlindLinesAtTop);
+#endif // GuiConst_TEXTBOX_FIELDS_ON
+
+            switch (sgl.BlinkTextItems[BlinkFieldNo].TextBoxVertAlignment)
+            {
+             case GuiLib_ALIGN_CENTER:
+               sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxY1 +=
+                  (sgl.BlinkTextItems[BlinkFieldNo].Y2 -
+                   sgl.BlinkTextItems[BlinkFieldNo].Y1 + 1 -
+                  (sgl.BlinkTextItems[BlinkFieldNo].YSize +
+                  (LineCnt2 - 1) *
+                   sgl.BlinkTextItems[BlinkFieldNo].TextBoxLineDist)) / 2;
+               break;
+
+             case GuiLib_ALIGN_RIGHT:
+               sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxY1 +=
+                  sgl.BlinkTextItems[BlinkFieldNo].Y2 -
+                  sgl.BlinkTextItems[BlinkFieldNo].Y1 + 1 -
+                 (sgl.BlinkTextItems[BlinkFieldNo].YSize +
+                 (LineCnt2 - 1) *
+                  sgl.BlinkTextItems[BlinkFieldNo].TextBoxLineDist);
+               break;
+            }
+
+            for (N = 0; N < LineCnt2; N++)
+            {
+              if (((CharNo - 1) <= TextCharLineEnd[N])
+               && ((CharNo - 1) >= TextCharLineStart[N]))
+              {
+                if (sgl.BlinkTextItems[BlinkFieldNo].TextPar.BitFlags &
+                    GuiLib_BITFLAG_REVERSEWRITING)
+                  CharNo = TextCharLineStart[N] + TextCharLineEnd[N] + 2 - CharNo;
+
+                sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 =
+                   sgl.BlinkTextItems[BlinkFieldNo].X1;
+
+                LineLen = CalcCharsWidth(TextCharLineStart[N],
+                                         TextCharLineEnd[N],
+                                         TextXOfs,
+                                         &XStart,
+                                         &XEnd);
+                switch (sgl.BlinkTextItems[BlinkFieldNo].TextBoxHorzAlignment)
+                {
+                  case GuiLib_ALIGN_CENTER:
+                   sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 +=
+                      (sgl.BlinkTextItems[BlinkFieldNo].X2 -
+                       sgl.BlinkTextItems[BlinkFieldNo].X1 + LineLen - 1) / 2;
+                   break;
+
+                  case GuiLib_ALIGN_RIGHT:
+                   sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 +=
+                      sgl.BlinkTextItems[BlinkFieldNo].X2 -
+                      sgl.BlinkTextItems[BlinkFieldNo].X1 + LineLen - 1;
+                   break;
+                }
+
+                sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 -= XStart;
+                LineLen = CalcCharsWidth(CharNo - 1,
+                                         CharNo - 1,
+                                         TextXOfs,
+                                         &XStart,
+                                         &XEnd);
+                sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX2 =
+                   sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 + XEnd;
+                sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 += XStart;
+                sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxY2 =
+                   sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxY1 +
+                   sgl.BlinkTextItems[BlinkFieldNo].YSize - 1;
+
+                sgl.BlinkTextItems[BlinkFieldNo].Active = 1;
+                break;
+              }
+
+#ifndef GuiConst_BLINK_LF_COUNTS
+              if ((N+1) < LineCnt2)
+                if ((TextCharLineEnd[N]+1) != TextCharLineStart[N+1])
+                  CharNo++;
+#endif
+
+              sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxY1 +=
+                 sgl.BlinkTextItems[BlinkFieldNo].TextBoxLineDist;
+            }
+        }
+        else
+        {
+          sgl.BlinkTextItems[BlinkFieldNo].Active = 1;
+          sgl.BlinkTextItems[BlinkFieldNo].CharNo = CharNo;
+        }
+      }
+      else
+#endif // GuiConst_ITEM_TEXTBLOCK_INUSE
+      {
+        if (sgl.BlinkTextItems[BlinkFieldNo].TextPar.BitFlags &
+            GuiLib_BITFLAG_REVERSEWRITING)
+        {
+          for (N = 0; N < CharCnt / 2; N++)
+          {
+#ifdef GuiConst_REMOTE_FONT_DATA
+            TempOfs = sgl.TextCharNdx[N];
+            sgl.TextCharNdx[N] =
+               sgl.TextCharNdx[CharCnt - 1 - N];
+            sgl.TextCharNdx[CharCnt - 1 - N] =
+               TempOfs;
+#else
+            TempPtr = sgl.TextCharPtrAry[N];
+            sgl.TextCharPtrAry[N] = (GuiConst_INT8U PrefixRom *)
+               sgl.TextCharPtrAry[CharCnt - 1 - N];
+            sgl.TextCharPtrAry[CharCnt - 1 - N] =
+              (GuiConst_INT8U PrefixRom *)TempPtr;
+#endif
+          }
+          CharNo =  CharCnt + 1 - CharNo;
+        }
+
+        TextPixelLen = TextPixelLength(sgl.BlinkTextItems[BlinkFieldNo].TextPar.Ps,
+                          CharCnt, TextXOfs);
+
+        switch (sgl.BlinkTextItems[BlinkFieldNo].TextPar.Alignment)
+        {
+          case GuiLib_ALIGN_CENTER:
+            if (CharCnt > 0)
+                sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 -= TextPixelLen / 2;
+              break;
+          case GuiLib_ALIGN_RIGHT:
+            sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 -= TextPixelLen - 1;
+              break;
+        }
+
+        sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX2 = sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 +
+           TextPixelLen - 1;
+
+        if (CharNo)
+        {
+          if (sgl.BlinkTextItems[BlinkFieldNo].TextPar.Ps == GuiLib_PS_OFF)
+          {
+            sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 =
+               sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 + TextXOfs[CharNo-1] - 1;
+            sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX2 =
+               sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 +
+               sgl.BlinkTextItems[BlinkFieldNo].XSize;
+          }
+          else if ((sgl.BlinkTextItems[BlinkFieldNo].TextPar.Ps == GuiLib_PS_NUM) &&
+                   (sgl.TextPsMode[CharNo - 1] == 0))
+          {
+               sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 =
+                  sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 + TextXOfs[CharNo - 1] - 1;
+               sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX2 =
+                  sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 +
+                  sgl.BlinkTextItems[BlinkFieldNo].PsNumWidth +
+                  sgl.BlinkTextItems[BlinkFieldNo].PsSpace;
+          }
+          else
+          {
+#ifdef GuiConst_REMOTE_FONT_DATA
+            GuiLib_RemoteDataReadBlock((GuiConst_INT32U PrefixRom)
+               GuiFont_ChPtrList[sgl.TextCharNdx[CharNo - 1]],
+               GuiLib_CHR_LINECTRL_OFS, CharHeader);
+            sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 =
+               sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 +
+               TextXOfs[CharNo-1] + CharHeader[GuiLib_CHR_XLEFT_OFS] - 1;
+#else
+            sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 =
+               sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 + TextXOfs[CharNo - 1] +
+               ReadBytePtr(sgl.TextCharPtrAry[CharNo - 1] +
+               GuiLib_CHR_XLEFT_OFS) - 1;
+#endif
+#ifdef GuiConst_REMOTE_FONT_DATA
+          sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX2 =
+             sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 +
+             CharHeader[GuiLib_CHR_XWIDTH_OFS] + 1;
+#else
+          sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX2 =
+             sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1 +
+             ReadBytePtr(sgl.TextCharPtrAry[CharNo - 1] +
+             GuiLib_CHR_XWIDTH_OFS) + 1;
+#endif
+          }
+          sgl.BlinkTextItems[BlinkFieldNo].Active = 1;
+        }
+        else
+        {
+          sgl.BlinkTextItems[BlinkFieldNo].Active = 1;
+          sgl.BlinkTextItems[BlinkFieldNo].CharNo = CharNo;
+        }
+      }
+      SetCurFont(sgl.CurItem.TextPar[0].FontIndex);
+      sgl.CurItem.TextPar[0] = TempTextPar;
+      sgl.CurItem.TextLength[0] = TempTextLength;
+      sgl.CurItem.FormatFieldWidth = TempFormatFieldWidth;
+      sgl.CurItem.FormatDecimals = TempFormatDecimals;
+      sgl.CurItem.FormatAlignment = TempFormatAlignment;
+      sgl.CurItem.FormatFormat = TempFormatFormat;
+
+    }
+
+    if (sgl.BlinkTextItems[BlinkFieldNo].Active)
+    {
+      if (Rate < 1)
+        sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxRate = 1;
+      else
+        sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxRate = Rate;
+      if (sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxRate < 255)
+      {
+        sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxState =
+           sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxRate -
+          (sgl.RefreshClock % sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxRate);
+        sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxInverted =
+           ((sgl.RefreshClock / sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxRate) % 2) ==
+             0;
+        sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxLast =
+           sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxInverted;
+        if (sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxInverted && sgl.DisplayWriting)
+          GuiLib_InvertBox(sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1,
+                           sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxY1,
+                           sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX2,
+                           sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxY2);
+      }
+      else
+      {
+        sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxState =
+             sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxRate;
+        if (sgl.DisplayWriting)
+          GuiLib_InvertBox(sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1,
+                           sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxY1,
+                           sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX2,
+                           sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxY2);
+
+        sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxInverted =
+                        !sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxInverted;
+        sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxLast =
+                        sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxInverted;
+      }
+    }
+  }
+#else // GuiConst_BLINK_FIELDS_OFF
+  gl.Dummy1_16U = BlinkFieldNo;   // To avoid compiler warning
+  gl.Dummy2_16U = CharNo;   // To avoid compiler warning
+  gl.Dummy1_16S = Rate;   // To avoid compiler warning
+#endif // GuiConst_BLINK_FIELDS_OFF
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_BlinkBoxMarkedItemStop(
+   GuiConst_INT16U BlinkFieldNo)
+{
+#ifndef GuiConst_BLINK_FIELDS_OFF
+  if ((BlinkFieldNo >= GuiConst_BLINK_FIELDS_MAX) ||
+      !sgl.BlinkTextItems[BlinkFieldNo].InUse)
+    return;
+
+  if (sgl.BlinkTextItems[BlinkFieldNo].Active &&
+      sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxRate &&
+      sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxInverted)
+  {
+    if (sgl.DisplayWriting)
+    {
+      GuiLib_InvertBox(sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX1,
+                       sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxY1,
+                       sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxX2,
+                       sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxY2);
+      sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxInverted =
+         !sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxInverted;
+      sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxLast =
+         sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxInverted;
+    }
+  }
+  sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxRate = 0;
+  sgl.BlinkTextItems[BlinkFieldNo].Active = 0;
+#else // GuiConst_BLINK_FIELDS_OFF
+  gl.Dummy1_16U = BlinkFieldNo;   // To avoid compiler warning
+#endif // GuiConst_BLINK_FIELDS_OFF
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_BlinkBoxMarkedItemUpdate(
+   GuiConst_INT16U BlinkFieldNo)
+{
+#ifndef GuiConst_BLINK_FIELDS_OFF
+  if ((BlinkFieldNo >= GuiConst_BLINK_FIELDS_MAX) ||
+      !sgl.BlinkTextItems[BlinkFieldNo].InUse)
+    return;
+
+  if (sgl.BlinkTextItems[BlinkFieldNo].Active &&
+     ((sgl.BlinkTextItems[BlinkFieldNo].ItemType == GuiLib_ITEM_VAR) ||
+      (sgl.BlinkTextItems[BlinkFieldNo].ItemType == GuiLib_ITEM_VARBLOCK)))
+    GuiLib_BlinkBoxMarkedItem(
+       BlinkFieldNo,
+       sgl.BlinkTextItems[BlinkFieldNo].CharNo,
+       sgl.BlinkTextItems[BlinkFieldNo].BlinkBoxRate);
+#else // GuiConst_BLINK_FIELDS_OFF
+  gl.Dummy1_16U = BlinkFieldNo;   // To avoid compiler warning
+#endif // GuiConst_BLINK_FIELDS_OFF
+}
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+#endif // GuiConst_BLINK_SUPPORT_ON
+
+#ifdef GuiConst_ITEM_TOUCHAREA_INUSE
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+GuiConst_INT32S GuiLib_TouchCheck(
+   GuiConst_INT16S X,
+   GuiConst_INT16S Y)
+{
+  GuiConst_INT32S TouchSearch;
+  GuiConst_INT32S XX, YY;
+  GuiConst_INT32S XL, XR, YT, YB;
+  GuiConst_INT32S TouchArea;
+
+  if (sgl.TouchAdjustActive)
+  {
+    XX = 10 * (GuiConst_INT32S)X;
+    YY = 10 * (GuiConst_INT32S)Y;
+    XL = sgl.TouchAdjustXTL +
+       (YY - sgl.TouchAdjustYTL) * (sgl.TouchAdjustXBL - sgl.TouchAdjustXTL) /
+       (sgl.TouchAdjustYBL - sgl.TouchAdjustYTL);
+    XR = sgl.TouchAdjustXTR +
+       (YY - sgl.TouchAdjustYTR) * (sgl.TouchAdjustXBR - sgl.TouchAdjustXTR) /
+       (sgl.TouchAdjustYBR - sgl.TouchAdjustYTR);
+    YT = sgl.TouchAdjustYTL +
+       (XX - sgl.TouchAdjustXTL) * (sgl.TouchAdjustYTR - sgl.TouchAdjustYTL) /
+       (sgl.TouchAdjustXTR - sgl.TouchAdjustXTL);
+    YB = sgl.TouchAdjustYBL +
+       (XX - sgl.TouchAdjustXBL) * (sgl.TouchAdjustYBR - sgl.TouchAdjustYBL) /
+       (sgl.TouchAdjustXBR - sgl.TouchAdjustXBL);
+    sgl.TouchConvertX = GuiConst_DISPLAY_WIDTH * (XX - XL) / (XR - XL);
+    sgl.TouchConvertY = GuiConst_DISPLAY_HEIGHT * (YY - YT) / (YB - YT);
+  }
+  else
+  {
+    sgl.TouchConvertX = X;
+    sgl.TouchConvertY = Y;
+  }
+
+  TouchArea = -1;
+  if ((sgl.TouchConvertX >= 0) && (sgl.TouchConvertX < GuiConst_DISPLAY_WIDTH) &&
+      (sgl.TouchConvertY >= 0) && (sgl.TouchConvertY < GuiConst_DISPLAY_HEIGHT))
+    for (TouchSearch = 0; TouchSearch < sgl.TouchAreaCnt; TouchSearch++)
+      if ((sgl.TouchConvertX >= sgl.TouchAreas[TouchSearch].X1) &&
+          (sgl.TouchConvertX <= sgl.TouchAreas[TouchSearch].X2) &&
+          (sgl.TouchConvertY >= sgl.TouchAreas[TouchSearch].Y1) &&
+          (sgl.TouchConvertY <= sgl.TouchAreas[TouchSearch].Y2))
+      {
+        if (TouchArea == -1)
+          TouchArea = sgl.TouchAreas[TouchSearch].IndexNo;
+        else if (sgl.TouchAreas[TouchSearch].IndexNo < TouchArea)
+          TouchArea = sgl.TouchAreas[TouchSearch].IndexNo;
+      }
+  return TouchArea;
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT32S GuiLib_TouchGet(
+   GuiConst_INT16S X,
+   GuiConst_INT16S Y,
+   GuiConst_INT16S* TouchX,
+   GuiConst_INT16S* TouchY)
+{
+  GuiConst_INT32S Result;
+
+  Result = GuiLib_TouchCheck(X, Y);
+
+  *TouchX = sgl.TouchConvertX;
+  *TouchY = sgl.TouchConvertY;
+
+  return (Result);
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_TouchAdjustReset(void)
+{
+  sgl.TouchAdjustActive = 0;
+  sgl.TouchAdjustInUse[0] = 0;
+  sgl.TouchAdjustInUse[1] = 0;
+  sgl.TouchAdjustInUse[2] = 0;
+  sgl.TouchAdjustInUse[3] = 0;
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_TouchAdjustSet(
+   GuiConst_INT16S XTrue,
+   GuiConst_INT16S YTrue,
+   GuiConst_INT16S XMeasured,
+   GuiConst_INT16S YMeasured)
+{
+  GuiConst_INT8U I;
+  GuiConst_INT32S XTL, YTL, XTR, YTR, XBL, YBL, XBR, YBR, XL, XR, YT, YB;
+
+  if (YTrue < GuiConst_DISPLAY_HEIGHT / 2)
+  {
+    if (XTrue < GuiConst_DISPLAY_WIDTH / 2)
+      I = 0;
+    else
+      I = 1;
+  }
+  else
+  {
+    if (XTrue < GuiConst_DISPLAY_WIDTH / 2)
+      I = 2;
+    else
+      I = 3;
+  }
+
+  sgl.TouchAdjustInUse[I] = 1;
+
+  sgl.TouchAdjustXTrue[I] = XTrue;
+  sgl.TouchAdjustYTrue[I] = YTrue;
+  sgl.TouchAdjustXMeasured[I] = XMeasured;
+  sgl.TouchAdjustYMeasured[I] = YMeasured;
+
+  if (sgl.TouchAdjustInUse[0] && sgl.TouchAdjustInUse[3])
+  {
+    sgl.TouchAdjustActive = 1;
+    if (!sgl.TouchAdjustInUse[1])
+    {
+      sgl.TouchAdjustInUse[1] = 1;
+      sgl.TouchAdjustXTrue[1] = sgl.TouchAdjustXTrue[3];
+      sgl.TouchAdjustYTrue[1] = sgl.TouchAdjustYTrue[0];
+      sgl.TouchAdjustXMeasured[1] = sgl.TouchAdjustXMeasured[3];
+      sgl.TouchAdjustYMeasured[1] = sgl.TouchAdjustYMeasured[0];
+    }
+    if (!sgl.TouchAdjustInUse[2])
+    {
+      sgl.TouchAdjustInUse[2] = 1;
+      sgl.TouchAdjustXTrue[2] = sgl.TouchAdjustXTrue[0];
+      sgl.TouchAdjustYTrue[2] = sgl.TouchAdjustYTrue[3];
+      sgl.TouchAdjustXMeasured[2] = sgl.TouchAdjustXMeasured[0];
+      sgl.TouchAdjustYMeasured[2] = sgl.TouchAdjustYMeasured[3];
+    }
+  }
+  else if (sgl.TouchAdjustInUse[1] && sgl.TouchAdjustInUse[2])
+  {
+    sgl.TouchAdjustActive = 1;
+    if (!sgl.TouchAdjustInUse[0])
+    {
+      sgl.TouchAdjustInUse[0] = 1;
+      sgl.TouchAdjustXTrue[0] = sgl.TouchAdjustXTrue[2];
+      sgl.TouchAdjustYTrue[0] = sgl.TouchAdjustYTrue[1];
+      sgl.TouchAdjustXMeasured[0] = sgl.TouchAdjustXMeasured[2];
+      sgl.TouchAdjustYMeasured[0] = sgl.TouchAdjustYMeasured[1];
+    }
+    if (!sgl.TouchAdjustInUse[3])
+    {
+      sgl.TouchAdjustInUse[3] = 1;
+      sgl.TouchAdjustXTrue[3] = sgl.TouchAdjustXTrue[1];
+      sgl.TouchAdjustYTrue[3] = sgl.TouchAdjustYTrue[2];
+      sgl.TouchAdjustXMeasured[3] = sgl.TouchAdjustXMeasured[1];
+      sgl.TouchAdjustYMeasured[3] = sgl.TouchAdjustYMeasured[2];
+    }
+  }
+
+  if (sgl.TouchAdjustActive)
+  {
+    XTL = (10 * sgl.TouchAdjustXMeasured[1]) - ((10 * sgl.TouchAdjustXTrue[1] *
+       (sgl.TouchAdjustXMeasured[1] - sgl.TouchAdjustXMeasured[0])) /
+       (sgl.TouchAdjustXTrue[1] - sgl.TouchAdjustXTrue[0]));
+    XTR = (10 * sgl.TouchAdjustXMeasured[0]) +
+       ((10 * (GuiConst_DISPLAY_WIDTH - sgl.TouchAdjustXTrue[0]) *
+       (sgl.TouchAdjustXMeasured[1] - sgl.TouchAdjustXMeasured[0])) /
+       (sgl.TouchAdjustXTrue[1] - sgl.TouchAdjustXTrue[0]));
+    XBL = (10 * sgl.TouchAdjustXMeasured[3]) - ((10 * sgl.TouchAdjustXTrue[3] *
+       (sgl.TouchAdjustXMeasured[3] - sgl.TouchAdjustXMeasured[2])) /
+       (sgl.TouchAdjustXTrue[3] - sgl.TouchAdjustXTrue[2]));
+    XBR = (10 * sgl.TouchAdjustXMeasured[2]) +
+       ((10 * (GuiConst_DISPLAY_WIDTH - sgl.TouchAdjustXTrue[2]) *
+       (sgl.TouchAdjustXMeasured[3] - sgl.TouchAdjustXMeasured[2])) /
+       (sgl.TouchAdjustXTrue[3] - sgl.TouchAdjustXTrue[2]));
+
+    YT = 5 * (sgl.TouchAdjustYTrue[0] + sgl.TouchAdjustYTrue[1]);
+    YB = 5 * (sgl.TouchAdjustYTrue[2] + sgl.TouchAdjustYTrue[3]);
+
+    sgl.TouchAdjustXTL = XBL - (YB * (XBL - XTL) / (YB - YT));
+    sgl.TouchAdjustXBL =
+       XTL + (((10 * GuiConst_DISPLAY_HEIGHT) - YT) * (XBL - XTL) / (YB - YT));
+    sgl.TouchAdjustXTR = XBR - (YB * (XBR - XTR) / (YB - YT));
+    sgl.TouchAdjustXBR =
+       XTR + (((10 * GuiConst_DISPLAY_HEIGHT) - YT) * (XBR - XTR) / (YB - YT));
+
+    YTL = (10 * sgl.TouchAdjustYMeasured[2]) - ((10 * sgl.TouchAdjustYTrue[2] *
+       (sgl.TouchAdjustYMeasured[2] - sgl.TouchAdjustYMeasured[0])) /
+       (sgl.TouchAdjustYTrue[2] - sgl.TouchAdjustYTrue[0]));
+    YBL = (10 * sgl.TouchAdjustYMeasured[0]) +
+       ((10 * (GuiConst_DISPLAY_HEIGHT - sgl.TouchAdjustYTrue[0]) *
+       (sgl.TouchAdjustYMeasured[2] - sgl.TouchAdjustYMeasured[0])) /
+       (sgl.TouchAdjustYTrue[2] - sgl.TouchAdjustYTrue[0]));
+    YTR = (10 * sgl.TouchAdjustYMeasured[3]) - ((10 * sgl.TouchAdjustYTrue[3] *
+       (sgl.TouchAdjustYMeasured[3] - sgl.TouchAdjustYMeasured[1])) /
+       (sgl.TouchAdjustYTrue[3] - sgl.TouchAdjustYTrue[1]));
+    YBR = (10 * sgl.TouchAdjustYMeasured[1]) +
+       ((10 * (GuiConst_DISPLAY_HEIGHT - sgl.TouchAdjustYTrue[1]) *
+       (sgl.TouchAdjustYMeasured[3] - sgl.TouchAdjustYMeasured[1])) /
+       (sgl.TouchAdjustYTrue[3] - sgl.TouchAdjustYTrue[1]));
+
+    XL = 5 * (sgl.TouchAdjustXTrue[0] + sgl.TouchAdjustXTrue[2]);
+    XR = 5 * (sgl.TouchAdjustXTrue[1] + sgl.TouchAdjustXTrue[3]);
+
+    sgl.TouchAdjustYTL = YTR - (XR * (YTR - YTL) / (XR - XL));
+    sgl.TouchAdjustYTR =
+       YTL + (((10 * GuiConst_DISPLAY_WIDTH) - XL) * (YTR - YTL) / (XR - XL));
+    sgl.TouchAdjustYBL = YBR - (XR * (YBR - YBL) / (XR - XL));
+    sgl.TouchAdjustYBR =
+       YBL + (((10 * GuiConst_DISPLAY_WIDTH) - XL) * (YBR - YBL) / (XR - XL));
+  }
+}
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+#endif // GuiConst_ITEM_TOUCHAREA_INUSE
+
+#ifdef GuiConst_ITEM_SCROLLBOX_INUSE
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+static void ScrollBox_ShowLineStruct(
+   GuiConst_INT8U ScrollBoxIndex,
+   GuiConst_INT16U StructToCallIndex,
+   GuiConst_INT16S X,
+   GuiConst_INT16S Y,
+   GuiConst_INT8U ColorInvert)
+{
+  GuiLib_StructPtr StructToCall;
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+  GuiConst_INT16S RemClippingX1, RemClippingY1, RemClippingX2, RemClippingY2;
+#endif //GuiConst_CLIPPING_SUPPORT_ON
+
+  if (StructToCallIndex != 0xFFFF)
+  {
+    sgl.DisplayLevel++;
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+    RemClippingX1 = sgl.CurItem.ClipRectX1;
+    RemClippingY1 = sgl.CurItem.ClipRectY1;
+    RemClippingX2 = sgl.CurItem.ClipRectX2;
+    RemClippingY2 = sgl.CurItem.ClipRectY2;
+#endif // GuiConst_CLIPPING_SUPPORT_ON
+    memcpy(&sgl.CurItem, &sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollBoxItem,
+       sizeof(GuiLib_ItemRec));
+    sgl.CurItem.RX = X;
+    sgl.CurItem.RY = Y;
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+    sgl.CurItem.ClipRectX1 = RemClippingX1;
+    sgl.CurItem.ClipRectY1 = RemClippingY1;
+    sgl.CurItem.ClipRectX2 = RemClippingX2;
+    sgl.CurItem.ClipRectY2 = RemClippingY2;
+#endif // GuiConst_CLIPPING_SUPPORT_ON
+    StructToCall = (GuiLib_StructPtr)
+#ifdef GuiConst_REMOTE_STRUCT_DATA
+       GetRemoteStructData(StructToCallIndex);
+#else // GuiConst_REMOTE_STRUCT_DATA
+       (GuiLib_StructPtr)ReadWord(GuiStruct_StructPtrList[StructToCallIndex]);
+#endif // GuiConst_REMOTE_STRUCT_DATA
+
+    if (ColorInvert == GuiLib_COL_INVERT_ON)
+    {
+#ifdef GuiConst_CURSOR_SUPPORT_ON
+      if (sgl.ScrollBoxesAry[ScrollBoxIndex].ContainsCursorFields)
+        ColorInvert = GuiLib_COL_INVERT_IF_CURSOR;
+#endif // GuiConst_CURSOR_SUPPORT_ON
+    }
+    else
+    {
+#ifdef GuiConst_BITMAP_SUPPORT_ON
+      UpdateBackgroundBitmap();
+#endif
+    }
+
+    DrawStructure(StructToCall, ColorInvert);
+    ResetLayerBufPtr();
+    sgl.DisplayLevel--;
+  }
+}
+
+//------------------------------------------------------------------------------
+static void ScrollBox_ShowLineBlock(
+   GuiConst_INTCOLOR Color,
+   GuiConst_INT8U Transparent,
+   GuiConst_INT16S X1,
+   GuiConst_INT16S Y1,
+   GuiConst_INT16S X2,
+   GuiConst_INT16S Y2)
+{
+  if (!Transparent)
+    GuiLib_FillBox(X1, Y1, X2, Y2, Color);
+}
+
+//------------------------------------------------------------------------------
+static void ScrollBox_ShowBarBlock(
+   GuiConst_INTCOLOR ForeColor,
+   GuiConst_INTCOLOR BackColor,
+   GuiConst_INT8U Thickness,
+   GuiConst_INT16S X,
+   GuiConst_INT16S Y,
+   GuiConst_INT16S SizeX,
+   GuiConst_INT16S SizeY)
+{
+  GuiConst_INT8U T;
+  GuiConst_INT16S BX1, BY1, BX2, BY2;
+
+  if (Thickness > 0)
+    for (T = 0; T < Thickness; T++)
+    {
+      BX1 = X + T;
+      BY1 = Y + T;
+      BX2 = X + SizeX - 1 - T;
+      BY2 = Y + SizeY - 1 - T;
+      GuiLib_Box(BX1, BY1, BX2, BY2, ForeColor);
+    }
+  BX1 = X + Thickness;
+  BY1 = Y + Thickness;
+  BX2 = X + SizeX - 1 - Thickness;
+  BY2 = Y + SizeY - 1 - Thickness;
+  GuiLib_FillBox(BX1, BY1, BX2, BY2, BackColor);
+}
+
+//------------------------------------------------------------------------------
+static void ScrollBox_SetTopLine(
+   GuiConst_INT8U ScrollBoxIndex)
+{
+    GuiConst_INT16U LowerLimtA=0;
+  if (sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollMode == 0)
+  {
+    sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine =
+       sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] -
+       sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollStartOfs;
+    GuiLib_LIMIT_MINMAX(sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine,
+       LowerLimtA, sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines -
+       sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines);
+  }
+  else
+    sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine =
+       sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] -
+       sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollStartOfs;
+}
+
+//------------------------------------------------------------------------------
+static void ScrollBox_DrawScrollLine(
+   GuiConst_INT8U ScrollBoxIndex,
+   GuiConst_INT16S LineNdx)
+{
+  GuiConst_INT16U N;
+  GuiConst_INT16S SX1, SY1;
+  GuiConst_INT16S X1, Y1, X2, Y2;
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+  GuiConst_INT16S RemClippingX1, RemClippingY1, RemClippingX2, RemClippingY2;
+#endif // GuiConst_CLIPPING_SUPPORT_ON
+
+  if ((LineNdx < sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine) ||
+      (LineNdx >= sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine +
+                  sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines))
+    return;
+
+  X1 = sgl.ScrollBoxesAry[ScrollBoxIndex].X1 +
+       sgl.ScrollBoxesAry[ScrollBoxIndex].LineOffsetX;
+  Y1 = sgl.ScrollBoxesAry[ScrollBoxIndex].Y1 +
+       sgl.ScrollBoxesAry[ScrollBoxIndex].LineOffsetY +
+       (LineNdx - sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine) *
+       sgl.ScrollBoxesAry[ScrollBoxIndex].LineVerticalOffset;
+  X2 = X1 + sgl.ScrollBoxesAry[ScrollBoxIndex].LineSizeX - 1;
+  Y2 = Y1 + sgl.ScrollBoxesAry[ScrollBoxIndex].LineSizeY - 1;
+
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+  RemClippingX1 = sgl.CurItem.ClipRectX1;
+  RemClippingY1 = sgl.CurItem.ClipRectY1;
+  RemClippingX2 = sgl.CurItem.ClipRectX2;
+  RemClippingY2 = sgl.CurItem.ClipRectY2;
+  GuiLib_LIMIT_MINMAX(sgl.CurItem.ClipRectX1, X1, X2);
+  GuiLib_LIMIT_MINMAX(sgl.CurItem.ClipRectY1, Y1, Y2);
+  GuiLib_LIMIT_MINMAX(sgl.CurItem.ClipRectX2, X1, X2);
+  GuiLib_LIMIT_MINMAX(sgl.CurItem.ClipRectY2, Y1, Y2);
+  GuiLib_SetClipping(sgl.CurItem.ClipRectX1, sgl.CurItem.ClipRectY1,
+                     sgl.CurItem.ClipRectX2, sgl.CurItem.ClipRectY2);
+#endif // GuiConst_CLIPPING_SUPPORT_ON
+
+  if ((LineNdx >= 0) &&
+      (LineNdx < sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines))
+  {
+    sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollLineDataFunc(LineNdx);
+
+    SX1 = X1 + sgl.ScrollBoxesAry[ScrollBoxIndex].LineStructOffsetX;
+    SY1 = Y1 + sgl.ScrollBoxesAry[ScrollBoxIndex].LineStructOffsetY;
+    for (N = 0; N <= GuiConst_SCROLLITEM_MARKERS_MAX; N++)
+    {
+      if (N < GuiConst_SCROLLITEM_MARKERS_MAX)
+      {
+        if ((sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[N] >= 0) &&
+            (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerSize[N] >= 1))
+        {
+          if ((LineNdx >= sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[N]) &&
+              (LineNdx <= (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[N] +
+               sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerSize[N] - 1)))
+          {
+            ScrollBox_ShowLineBlock(
+               sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerColor[N],
+               sgl.ScrollBoxesAry[ScrollBoxIndex].
+               MarkerColorTransparent[N], X1, Y1, X2, Y2);
+            switch (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerDrawingOrder[N])
+            {
+              case 0:
+                ScrollBox_ShowLineStruct(ScrollBoxIndex,
+                   sgl.ScrollBoxesAry[ScrollBoxIndex].LineStructIndex, SX1, SY1,
+                   GuiLib_COL_INVERT_ON);
+                if (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStructIndex[N] !=
+                    0xFFFF)
+                  ScrollBox_ShowLineStruct(ScrollBoxIndex,
+                     sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStructIndex[N],
+                     SX1, SY1, GuiLib_COL_INVERT_ON);
+                break;
+
+              case 1:
+                if (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStructIndex[N] !=
+                    0xFFFF)
+                  ScrollBox_ShowLineStruct(ScrollBoxIndex,
+                     sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStructIndex[N],
+                     SX1, SY1, GuiLib_COL_INVERT_ON);
+                ScrollBox_ShowLineStruct(ScrollBoxIndex,
+                   sgl.ScrollBoxesAry[ScrollBoxIndex].LineStructIndex, SX1, SY1,
+                   GuiLib_COL_INVERT_ON);
+                break;
+
+              case 2:
+                ScrollBox_ShowLineStruct(ScrollBoxIndex,
+                   sgl.ScrollBoxesAry[ScrollBoxIndex].LineStructIndex, SX1, SY1,
+                   GuiLib_COL_INVERT_ON);
+                break;
+
+              case 3:
+                if (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStructIndex[N] !=
+                    0xFFFF)
+                  ScrollBox_ShowLineStruct(ScrollBoxIndex,
+                     sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStructIndex[N],
+                     SX1, SY1, GuiLib_COL_INVERT_ON);
+                break;
+            }
+
+            break;
+          }
+        }
+      }
+      else
+      {
+        ScrollBox_ShowLineBlock(
+           sgl.ScrollBoxesAry[ScrollBoxIndex].LineColor,
+           sgl.ScrollBoxesAry[ScrollBoxIndex].LineColorTransparent,
+           X1, Y1, X2, Y2);
+        ScrollBox_ShowLineStruct(ScrollBoxIndex,
+           sgl.ScrollBoxesAry[ScrollBoxIndex].LineStructIndex, SX1, SY1,
+           GuiLib_COL_INVERT_OFF);
+      }
+    }
+  }
+  else
+    ScrollBox_ShowLineBlock(sgl.ScrollBoxesAry[ScrollBoxIndex].LineColor,
+       sgl.ScrollBoxesAry[ScrollBoxIndex].LineColorTransparent,
+       X1, Y1, X2, Y2);
+
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+  sgl.CurItem.ClipRectX1 = RemClippingX1;
+  sgl.CurItem.ClipRectY1 = RemClippingY1;
+  sgl.CurItem.ClipRectX2 = RemClippingX2;
+  sgl.CurItem.ClipRectY2 = RemClippingY2;
+  GuiLib_SetClipping(sgl.CurItem.ClipRectX1, sgl.CurItem.ClipRectY1,
+                     sgl.CurItem.ClipRectX2, sgl.CurItem.ClipRectY2);
+#endif // GuiConst_CLIPPING_SUPPORT_ON
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_ScrollBox_Init(
+   GuiConst_INT8U ScrollBoxIndex,
+   void (*DataFuncPtr) (GuiConst_INT16S LineIndex),
+   GuiConst_INT16S NoOfLines,
+   GuiConst_INT16S ActiveLine)
+{
+  GuiConst_INT16U StructToCallIndex;
+  GuiLib_StructPtr StructToCall;
+  GuiLib_ItemRec RemCurItem;
+#ifdef GuiConst_CURSOR_SUPPORT_ON
+  GuiConst_INT8U RemCursorInUse;
+#endif // GuiConst_CURSOR_SUPPORT_ON
+
+  if ((ScrollBoxIndex >= GuiConst_SCROLLITEM_BOXES_MAX) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].InUse != GuiLib_SCROLL_STRUCTURE_READ) ||
+      (ActiveLine >= NoOfLines))
+    return (0);
+
+  memcpy(&RemCurItem, &sgl.CurItem, sizeof(GuiLib_ItemRec));
+
+  sgl.GlobalScrollBoxIndex = ScrollBoxIndex;
+
+  memcpy(&sgl.CurItem, &sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollBoxItem,
+     sizeof(GuiLib_ItemRec));
+  StructToCallIndex = sgl.ScrollBoxesAry[ScrollBoxIndex].LineStructIndex;
+  if (StructToCallIndex != 0xFFFF)
+  {
+    sgl.DisplayLevel++;
+    StructToCall = (GuiLib_StructPtr)
+#ifdef GuiConst_REMOTE_STRUCT_DATA
+       GetRemoteStructData(StructToCallIndex);
+#else
+       (GuiLib_StructPtr)ReadWord(GuiStruct_StructPtrList[StructToCallIndex]);
+#endif
+    sgl.NextScrollLineReading = 1;
+    sgl.InitialDrawing = 1;
+#ifdef GuiConst_CURSOR_SUPPORT_ON
+    RemCursorInUse = sgl.CursorInUse;
+    sgl.ScrollBoxesAry[ScrollBoxIndex].ContainsCursorFields = 0;
+    sgl.CursorInUse = (GuiLib_ActiveCursorFieldNo >= 0);
+    sgl.CursorFieldFound = -1;
+    sgl.CursorActiveFieldFound = 0;
+#endif // GuiConst_CURSOR_SUPPORT_ON
+    DrawStructure(StructToCall, GuiLib_COL_INVERT_OFF);
+    ResetLayerBufPtr();
+#ifdef GuiConst_CURSOR_SUPPORT_ON
+    sgl.InitialDrawing = 0;
+    if (sgl.CursorFieldFound == -1)
+    {
+      sgl.CursorInUse = 0;
+      GuiLib_ActiveCursorFieldNo = -1;
+    }
+    else
+    {
+      sgl.ScrollBoxesAry[ScrollBoxIndex].ContainsCursorFields = 1;
+      if (sgl.CursorActiveFieldFound == 0)
+      {
+        GuiLib_ActiveCursorFieldNo = sgl.CursorFieldFound;
+
+        DrawCursorItem(1);
+      }
+    }
+    sgl.CursorInUse = sgl.CursorInUse | RemCursorInUse;
+#endif // GuiConst_CURSOR_SUPPORT_ON
+    sgl.NextScrollLineReading = 0;
+    sgl.DisplayLevel--;
+  }
+
+  SetCurFont(sgl.CurItem.TextPar[0].FontIndex);
+  if ((sgl.ScrollBoxesAry[ScrollBoxIndex].LineSizeY == 0) &&
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].LineSizeY2 == 0))
+  {
+    sgl.ScrollBoxesAry[ScrollBoxIndex].LineSizeY = sgl.CurFont->BaseLine;
+    sgl.ScrollBoxesAry[ScrollBoxIndex].LineSizeY2 =
+       sgl.CurFont->YSize - sgl.CurFont->BaseLine - 1;
+  }
+
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+  GuiLib_SetClipping(sgl.CurItem.ClipRectX1,sgl.CurItem.ClipRectY1,
+                     sgl.CurItem.ClipRectX2,sgl.CurItem.ClipRectY2);
+#endif // GuiConst_CLIPPING_SUPPORT_ON
+
+  StructToCallIndex = sgl.ScrollBoxesAry[ScrollBoxIndex].MakeUpStructIndex;
+  if (StructToCallIndex != 0xFFFF)
+  {
+    sgl.DisplayLevel++;
+    memcpy(&sgl.CurItem, &sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollBoxItem,
+       sizeof(GuiLib_ItemRec));
+    sgl.CurItem.RX = sgl.ScrollBoxesAry[sgl.GlobalScrollBoxIndex].X1;
+    sgl.CurItem.RY = sgl.ScrollBoxesAry[sgl.GlobalScrollBoxIndex].Y1;
+    StructToCall = (GuiLib_StructPtr)
+#ifdef GuiConst_REMOTE_STRUCT_DATA
+       GetRemoteStructData(StructToCallIndex);
+#else
+       (GuiLib_StructPtr)ReadWord(GuiStruct_StructPtrList[StructToCallIndex]);
+#endif
+    DrawStructure(StructToCall,GuiLib_COL_INVERT_OFF);
+    ResetLayerBufPtr();
+    sgl.DisplayLevel--;
+  }
+
+  sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollLineDataFunc = DataFuncPtr;
+  sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] = ActiveLine;
+  sgl.ScrollBoxesAry[ScrollBoxIndex].LastMarkerLine = ActiveLine;
+  sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines = NoOfLines;
+  if ((sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollMode == 0) &&
+      (NoOfLines < sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines))
+    sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines = NoOfLines;
+  sgl.ScrollBoxesAry[ScrollBoxIndex].InUse = GuiLib_SCROLL_STRUCTURE_USED;
+  ScrollBox_SetTopLine(ScrollBoxIndex);
+  GuiLib_ScrollBox_Redraw(ScrollBoxIndex);
+  sgl.ScrollBoxesAry[ScrollBoxIndex].LastScrollTopLine = 0xFFFF;
+
+  memcpy(&sgl.CurItem, &RemCurItem, sizeof(GuiLib_ItemRec));
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_ScrollBox_Redraw(
+   GuiConst_INT8U ScrollBoxIndex)
+{
+  GuiConst_INT16S N, ScrollStartLine, ScrollStopLine;
+  GuiLib_ItemRec RemCurItem;
+#ifndef GuiConst_SCROLLITEM_BAR_NONE
+#define GuiLib_SCROLL_REDRAW_VAR
+#else
+#ifndef GuiConst_SCROLLITEM_INDICATOR_NONE
+#define GuiLib_SCROLL_REDRAW_VAR
+#endif
+#endif
+#ifdef GuiLib_SCROLL_REDRAW_VAR
+  GuiLib_StructPtr StructToCall;
+  GuiConst_INT16U StructToCallIndex;
+  GuiConst_INT16S SX1, SY1;
+  GuiConst_INT16S X1, Y1;
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+  GuiConst_INT16S SX2, SY2;
+  GuiConst_INT16S X2, Y2;
+  GuiConst_INT16S RemClippingX1, RemClippingY1, RemClippingX2, RemClippingY2;
+#endif // GuiConst_CLIPPING_SUPPORT_ON
+#endif // GuiLib_SCROLL_REDRAW_VAR
+#ifndef GuiConst_SCROLLITEM_BAR_NONE
+  GuiConst_INT16S BarMarkerY;
+  GuiConst_INT16S BarMarkerHeight;
+  GuiConst_INT16S BarMarkerMovementDY;
+  GuiConst_INT32S N1, N2;
+#endif // GuiConst_SCROLLITEM_BAR_NONE
+  GuiConst_INT32S BackColor;
+
+  if ((ScrollBoxIndex >= GuiConst_SCROLLITEM_BOXES_MAX) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].InUse != GuiLib_SCROLL_STRUCTURE_USED))
+    return (0);
+
+  memcpy(&RemCurItem, &sgl.CurItem, sizeof(GuiLib_ItemRec));
+
+  sgl.GlobalScrollBoxIndex = ScrollBoxIndex;
+
+  ScrollStartLine = sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine;
+  ScrollStopLine = sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine +
+     sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines - 1;
+  if (sgl.ScrollBoxesAry[ScrollBoxIndex].LastScrollTopLine ==
+      sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine)
+  {
+    if ((sgl.ScrollBoxesAry[ScrollBoxIndex].LastMarkerLine == -1) ||
+        (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] == -1))
+    {
+      if (sgl.ScrollBoxesAry[ScrollBoxIndex].LastMarkerLine !=
+          sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0])
+      {
+        if (sgl.ScrollBoxesAry[ScrollBoxIndex].LastMarkerLine == -1)
+        {
+          ScrollStartLine = sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0];
+          ScrollStopLine = sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0];
+        }
+        else
+        {
+          ScrollStartLine = sgl.ScrollBoxesAry[ScrollBoxIndex].LastMarkerLine;
+          ScrollStopLine = sgl.ScrollBoxesAry[ScrollBoxIndex].LastMarkerLine;
+        }
+      }
+    }
+    else if (sgl.ScrollBoxesAry[ScrollBoxIndex].LastMarkerLine <
+             sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0])
+    {
+      ScrollStartLine = sgl.ScrollBoxesAry[ScrollBoxIndex].LastMarkerLine;
+      if (ScrollStartLine < sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine)
+        ScrollStartLine = sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine;
+      ScrollStopLine = sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0];
+    }
+    else if (sgl.ScrollBoxesAry[ScrollBoxIndex].LastMarkerLine >
+             sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0])
+    {
+      ScrollStartLine = sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0];
+      ScrollStopLine = sgl.ScrollBoxesAry[ScrollBoxIndex].LastMarkerLine;
+      GuiLib_LIMIT_MAX(ScrollStartLine,
+         sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine +
+         sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines - 1);
+    }
+  }
+
+  if (sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollLineDataFunc != 0)
+    for (N = ScrollStartLine; N <= ScrollStopLine; N++)
+      ScrollBox_DrawScrollLine(ScrollBoxIndex, N);
+
+  sgl.ScrollBoxesAry[ScrollBoxIndex].LastScrollTopLine =
+     sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine;
+  sgl.ScrollBoxesAry[ScrollBoxIndex].LastMarkerLine =
+     sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0];
+
+#ifndef GuiConst_SCROLLITEM_BAR_NONE
+  if (sgl.ScrollBoxesAry[ScrollBoxIndex].BarType != GuiLib_MARKER_NONE)
+  {
+    SX1 = sgl.ScrollBoxesAry[ScrollBoxIndex].BarPositionX;
+    SY1 = sgl.ScrollBoxesAry[ScrollBoxIndex].BarPositionY;
+    X1 = SX1 + sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerLeftOffset;
+    Y1 = SY1 + sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerTopOffset;
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+    SX2 = SX1 + sgl.ScrollBoxesAry[ScrollBoxIndex].BarSizeX - 1;
+    SY2 = SY1 + sgl.ScrollBoxesAry[ScrollBoxIndex].BarSizeY - 1;
+    X2 = SX2 - sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerRightOffset;
+    Y2 = SY2 - sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerBottomOffset;
+    RemClippingX1 = sgl.CurItem.ClipRectX1;
+    RemClippingY1 = sgl.CurItem.ClipRectY1;
+    RemClippingX2 = sgl.CurItem.ClipRectX2;
+    RemClippingY2 = sgl.CurItem.ClipRectY2;
+    GuiLib_LIMIT_MINMAX(sgl.CurItem.ClipRectX1, SX1, SX2);
+    GuiLib_LIMIT_MINMAX(sgl.CurItem.ClipRectY1, SY1, SY2);
+    GuiLib_LIMIT_MINMAX(sgl.CurItem.ClipRectX2, SX1, SX2);
+    GuiLib_LIMIT_MINMAX(sgl.CurItem.ClipRectY2, SY1, SY2);
+    GuiLib_SetClipping(sgl.CurItem.ClipRectX1, sgl.CurItem.ClipRectY1,
+                       sgl.CurItem.ClipRectX2, sgl.CurItem.ClipRectY2);
+#endif // GuiConst_CLIPPING_SUPPORT_ON
+
+    StructToCallIndex = sgl.ScrollBoxesAry[ScrollBoxIndex].BarStructIndex;
+    if (StructToCallIndex != 0xFFFF)
+    {
+      ScrollBox_ShowBarBlock(
+         sgl.ScrollBoxesAry[ScrollBoxIndex].BarForeColor,
+         sgl.ScrollBoxesAry[ScrollBoxIndex].BarBackColor,
+         0,
+         SX1,
+         SY1,
+         sgl.ScrollBoxesAry[ScrollBoxIndex].BarSizeX,
+         sgl.ScrollBoxesAry[ScrollBoxIndex].BarSizeY);
+
+      sgl.DisplayLevel++;
+      memcpy(&sgl.CurItem,
+             &sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollBoxItem,
+             sizeof(GuiLib_ItemRec));
+      sgl.CurItem.RX = SX1;
+      sgl.CurItem.RY = SY1;
+      StructToCall = (GuiLib_StructPtr)
+#ifdef GuiConst_REMOTE_STRUCT_DATA
+         GetRemoteStructData(StructToCallIndex);
+#else
+         (GuiLib_StructPtr)ReadWord(GuiStruct_StructPtrList[StructToCallIndex]);
+#endif
+      DrawStructure(StructToCall, GuiLib_COL_INVERT_OFF);
+      ResetLayerBufPtr();
+      sgl.DisplayLevel--;
+    }
+    else
+      ScrollBox_ShowBarBlock(
+         sgl.ScrollBoxesAry[ScrollBoxIndex].BarForeColor,
+         sgl.ScrollBoxesAry[ScrollBoxIndex].BarBackColor,
+         sgl.ScrollBoxesAry[ScrollBoxIndex].BarThickness,
+         SX1,
+         SY1,
+         sgl.ScrollBoxesAry[ScrollBoxIndex].BarSizeX,
+         sgl.ScrollBoxesAry[ScrollBoxIndex].BarSizeY);
+
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+    sgl.CurItem.ClipRectX1 = RemClippingX1;
+    sgl.CurItem.ClipRectY1 = RemClippingY1;
+    sgl.CurItem.ClipRectX2 = RemClippingX2;
+    sgl.CurItem.ClipRectY2 = RemClippingY2;
+    GuiLib_SetClipping(sgl.CurItem.ClipRectX1, sgl.CurItem.ClipRectY1,
+                       sgl.CurItem.ClipRectX2, sgl.CurItem.ClipRectY2);
+#endif // GuiConst_CLIPPING_SUPPORT_ON
+
+    if (sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines >
+        sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines)
+    {
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+      RemClippingX1 = sgl.CurItem.ClipRectX1;
+      RemClippingY1 = sgl.CurItem.ClipRectY1;
+      RemClippingX2 = sgl.CurItem.ClipRectX2;
+      RemClippingY2 = sgl.CurItem.ClipRectY2;
+      GuiLib_LIMIT_MINMAX(sgl.CurItem.ClipRectX1, X1, X2);
+      GuiLib_LIMIT_MINMAX(sgl.CurItem.ClipRectY1, Y1, Y2);
+      GuiLib_LIMIT_MINMAX(sgl.CurItem.ClipRectX2, X1, X2);
+      GuiLib_LIMIT_MINMAX(sgl.CurItem.ClipRectY2, Y1, Y2);
+      GuiLib_SetClipping(sgl.CurItem.ClipRectX1, sgl.CurItem.ClipRectY1,
+                         sgl.CurItem.ClipRectX2, sgl.CurItem.ClipRectY2);
+#endif // GuiConst_CLIPPING_SUPPORT_ON
+
+      BarMarkerHeight = 0;
+      BarMarkerMovementDY = sgl.ScrollBoxesAry[ScrollBoxIndex].BarSizeY -
+         sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerBottomOffset -
+         sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerTopOffset;
+
+      switch (sgl.ScrollBoxesAry[ScrollBoxIndex].BarType)
+      {
+        case GuiLib_MARKER_ICON:
+          sgl.CurFont = (GuiLib_FontRecPtr)ReadWord(GuiFont_FontList[
+             sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerIconFont]);
+          BarMarkerHeight = sgl.CurFont->YSize;
+          break;
+
+        case GuiLib_MARKER_BITMAP:
+          BarMarkerHeight =
+             sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerBitmapHeight;
+          break;
+
+        case GuiLib_MARKER_FIXED_BLOCK:
+          BarMarkerHeight =
+             sgl.ScrollBoxesAry[ScrollBoxIndex].BarSizeX -
+             sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerLeftOffset -
+             sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerRightOffset;
+          break;
+
+        case GuiLib_MARKER_VARIABLE_BLOCK:
+          BarMarkerHeight =
+             (((10 * BarMarkerMovementDY *
+             sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines) + 5) /
+             sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines) / 10;
+          GuiLib_LIMIT_MIN(BarMarkerHeight, 4);
+          break;
+      }
+
+      N1 = sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines -
+         sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines;
+      N2 = sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine;
+      GuiLib_LIMIT_MINMAX(N2, 0, N1);
+      BarMarkerY = (((10 * (BarMarkerMovementDY - BarMarkerHeight) *
+         N2) + 5) / N1) / 10;
+
+      switch (sgl.ScrollBoxesAry[ScrollBoxIndex].BarType)
+      {
+        case GuiLib_MARKER_ICON:
+          sgl.CurItem.X1 = X1 + sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerIconOffsetX;
+          sgl.CurItem.Y1 = Y1 + BarMarkerY +
+             sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerIconOffsetY +
+             sgl.CurFont->BaseLine;
+          sgl.CurItem.TextPar[0].FontIndex =
+             sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerIconFont;
+          sgl.CurItem.TextPar[0].Alignment = GuiLib_ALIGN_LEFT;
+          sgl.CurItem.TextPar[0].Ps = GuiLib_PS_OFF;
+          sgl.CurItem.TextPar[0].BitFlags = 0;
+          sgl.CurItem.TextPar[0].BackBoxSizeX = 0;
+          sgl.CurItem.TextPar[0].BackBorderPixels = 0;
+          DrawText(sgl.ScrollBoxesAry[ScrollBoxIndex].BarIconPtr, 1, 0,
+             sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerForeColor,
+             sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerBackColor,
+             sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerTransparent);
+          break;
+
+        case GuiLib_MARKER_BITMAP:
+          if (sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerBitmapIsTransparent)
+            BackColor =
+               sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerBitmapTranspColor;
+          else
+            BackColor = -1;
+          GuiLib_ShowBitmap(sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerBitmapIndex,
+             X1, Y1 + BarMarkerY, BackColor);
+          break;
+
+        case GuiLib_MARKER_FIXED_BLOCK:
+        case GuiLib_MARKER_VARIABLE_BLOCK:
+          if (sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerTransparent)
+            GuiLib_Box(X1, Y1 + BarMarkerY,
+               X1 + sgl.ScrollBoxesAry[ScrollBoxIndex].BarSizeX -
+               sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerLeftOffset -
+               sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerRightOffset - 1,
+               Y1 + BarMarkerY + BarMarkerHeight - 1,
+               sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerForeColor);
+          else
+            GuiLib_BorderBox(X1, Y1 + BarMarkerY,
+               X1 + sgl.ScrollBoxesAry[ScrollBoxIndex].BarSizeX -
+               sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerLeftOffset -
+               sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerRightOffset - 1,
+               Y1 + BarMarkerY + BarMarkerHeight - 1,
+               sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerForeColor,
+               sgl.ScrollBoxesAry[ScrollBoxIndex].BarMarkerBackColor);
+          break;
+      }
+
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+      sgl.CurItem.ClipRectX1 = RemClippingX1;
+      sgl.CurItem.ClipRectY1 = RemClippingY1;
+      sgl.CurItem.ClipRectX2 = RemClippingX2;
+      sgl.CurItem.ClipRectY2 = RemClippingY2;
+      GuiLib_SetClipping(sgl.CurItem.ClipRectX1, sgl.CurItem.ClipRectY1,
+                         sgl.CurItem.ClipRectX2, sgl.CurItem.ClipRectY2);
+#endif // GuiConst_CLIPPING_SUPPORT_ON
+    }
+  }
+#endif
+
+#ifndef GuiConst_SCROLLITEM_INDICATOR_NONE
+  if (sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorType != GuiLib_INDICATOR_NONE)
+  {
+    SX1 = sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorPositionX;
+    SY1 = sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorPositionY;
+    X1 = SX1 + sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorMarkerLeftOffset;
+    Y1 = SY1 + sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorMarkerTopOffset;
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+    SX2 = SX1 + sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorSizeX - 1;
+    SY2 = SY1 + sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorSizeY - 1;
+    X2 = SX2 - sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorMarkerRightOffset;
+    Y2 = SY2 - sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorMarkerBottomOffset;
+    RemClippingX1 = sgl.CurItem.ClipRectX1;
+    RemClippingY1 = sgl.CurItem.ClipRectY1;
+    RemClippingX2 = sgl.CurItem.ClipRectX2;
+    RemClippingY2 = sgl.CurItem.ClipRectY2;
+    GuiLib_LIMIT_MINMAX(sgl.CurItem.ClipRectX1, SX1, SX2);
+    GuiLib_LIMIT_MINMAX(sgl.CurItem.ClipRectY1, SY1, SY2);
+    GuiLib_LIMIT_MINMAX(sgl.CurItem.ClipRectX2, SX1, SX2);
+    GuiLib_LIMIT_MINMAX(sgl.CurItem.ClipRectY2, SY1, SY2);
+    GuiLib_SetClipping(sgl.CurItem.ClipRectX1, sgl.CurItem.ClipRectY1,
+                       sgl.CurItem.ClipRectX2, sgl.CurItem.ClipRectY2);
+#endif // GuiConst_CLIPPING_SUPPORT_ON
+
+    StructToCallIndex = sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorStructIndex;
+    if (StructToCallIndex != 0xFFFF)
+    {
+      ScrollBox_ShowBarBlock(
+         sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorForeColor,
+         sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorBackColor,
+         0,
+         SX1,
+         SY1,
+         sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorSizeX,
+         sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorSizeY);
+
+      sgl.DisplayLevel++;
+      memcpy(&sgl.CurItem,
+             &sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollBoxItem,
+             sizeof(GuiLib_ItemRec));
+      sgl.CurItem.RX = SX1;
+      sgl.CurItem.RY = SY1;
+      StructToCall = (GuiLib_StructPtr)
+#ifdef GuiConst_REMOTE_STRUCT_DATA
+         GetRemoteStructData(StructToCallIndex);
+#else
+         (GuiLib_StructPtr)ReadWord(GuiStruct_StructPtrList[StructToCallIndex]);
+#endif
+      DrawStructure(StructToCall, GuiLib_COL_INVERT_OFF);
+      ResetLayerBufPtr();
+      sgl.DisplayLevel--;
+    }
+    else
+      ScrollBox_ShowBarBlock(
+         sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorForeColor,
+         sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorBackColor,
+         sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorThickness,
+         SX1,
+         SY1,
+         sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorSizeX,
+         sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorSizeY);
+
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+    sgl.CurItem.ClipRectX1 = RemClippingX1;
+    sgl.CurItem.ClipRectY1 = RemClippingY1;
+    sgl.CurItem.ClipRectX2 = RemClippingX2;
+    sgl.CurItem.ClipRectY2 = RemClippingY2;
+    GuiLib_SetClipping(sgl.CurItem.ClipRectX1, sgl.CurItem.ClipRectY1,
+                       sgl.CurItem.ClipRectX2, sgl.CurItem.ClipRectY2);
+#endif // GuiConst_CLIPPING_SUPPORT_ON
+
+    if ((sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorLine >= 0) &&
+        (sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorLine >=
+         sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine) &&
+        (sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorLine <
+        (sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine +
+         sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines)))
+    {
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+      GuiLib_LIMIT_MINMAX(sgl.CurItem.ClipRectX1, X1, X2);
+      GuiLib_LIMIT_MINMAX(sgl.CurItem.ClipRectY1, Y1, Y2);
+      GuiLib_LIMIT_MINMAX(sgl.CurItem.ClipRectX2, X1, X2);
+      GuiLib_LIMIT_MINMAX(sgl.CurItem.ClipRectY2, Y1, Y2);
+      GuiLib_SetClipping(sgl.CurItem.ClipRectX1, sgl.CurItem.ClipRectY1,
+                         sgl.CurItem.ClipRectX2, sgl.CurItem.ClipRectY2);
+#endif // GuiConst_CLIPPING_SUPPORT_ON
+
+      switch (sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorType)
+      {
+        case GuiLib_MARKER_ICON:
+          sgl.CurFont = (GuiLib_FontRecPtr)ReadWord(GuiFont_FontList[
+             sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorMarkerIconFont]);
+          sgl.CurItem.X1 =
+             X1 + sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorMarkerIconOffsetX;
+          sgl.CurItem.Y1 =
+             Y1 + sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorMarkerIconOffsetY +
+             sgl.CurFont->BaseLine +
+             sgl.ScrollBoxesAry[ScrollBoxIndex].LineVerticalOffset *
+             (sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorLine -
+             sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine);
+          sgl.CurItem.TextPar[0].FontIndex =
+             sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorMarkerIconFont;
+          sgl.CurItem.TextPar[0].Alignment = GuiLib_ALIGN_LEFT;
+          sgl.CurItem.TextPar[0].Ps = GuiLib_PS_OFF;
+          sgl.CurItem.TextPar[0].BitFlags = 0;
+          sgl.CurItem.TextPar[0].BackBoxSizeX = 0;
+          sgl.CurItem.TextPar[0].BackBorderPixels = 0;
+          DrawText(sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorIconPtr, 1, 0,
+                   sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorMarkerForeColor,
+                   sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorMarkerBackColor,
+                   sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorMarkerTransparent);
+          break;
+
+        case GuiLib_MARKER_BITMAP:
+          if (sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorMarkerBitmapIsTransparent)
+            BackColor =
+               sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorMarkerBitmapTranspColor;
+          else
+            BackColor = -1;
+          GuiLib_ShowBitmap(
+             sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorMarkerBitmapIndex,
+             X1, Y1 + sgl.ScrollBoxesAry[ScrollBoxIndex].LineVerticalOffset *
+             (sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorLine -
+             sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine), BackColor);
+          break;
+      }
+    }
+  }
+#endif // GuiConst_SCROLLITEM_INDICATOR_NONE
+
+  memcpy(&sgl.CurItem, &RemCurItem, sizeof(GuiLib_ItemRec));
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_ScrollBox_RedrawLine(
+   GuiConst_INT8U ScrollBoxIndex,
+   GuiConst_INT16U ScrollLine)
+{
+  GuiLib_ItemRec RemCurItem;
+
+  if ((ScrollBoxIndex >= GuiConst_SCROLLITEM_BOXES_MAX) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].InUse != GuiLib_SCROLL_STRUCTURE_USED) ||
+      (ScrollLine > (sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines - 1)) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollLineDataFunc == 0))
+    return (0);
+
+  memcpy(&RemCurItem, &sgl.CurItem, sizeof(GuiLib_ItemRec));
+  sgl.GlobalScrollBoxIndex = ScrollBoxIndex;
+
+  ScrollBox_DrawScrollLine(ScrollBoxIndex, ScrollLine);
+
+  memcpy(&sgl.CurItem, &RemCurItem, sizeof(GuiLib_ItemRec));
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_ScrollBox_Close(
+   GuiConst_INT8U ScrollBoxIndex)
+{
+  if ((ScrollBoxIndex >= GuiConst_SCROLLITEM_BOXES_MAX) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].InUse != GuiLib_SCROLL_STRUCTURE_USED))
+    return (0);
+
+  sgl.ScrollBoxesAry[ScrollBoxIndex].InUse = GuiLib_SCROLL_STRUCTURE_READ;
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_ScrollBox_Down(
+   GuiConst_INT8U ScrollBoxIndex)
+{
+  GuiConst_INT16U ScrollBottomLine;
+  GuiConst_INT16S RemScrollTopLine;
+  GuiConst_INT16S RemMarkerStartLine;
+
+  if ((ScrollBoxIndex >= GuiConst_SCROLLITEM_BOXES_MAX) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].InUse != GuiLib_SCROLL_STRUCTURE_USED))
+    return (0);
+
+  RemScrollTopLine = sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine;
+  RemMarkerStartLine = sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0];
+
+  ScrollBottomLine = (sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine +
+     sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines - 1);
+
+  if (sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollBoxType)
+  {
+    if (ScrollBottomLine >= (sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines - 1))
+    {
+      if ((sgl.ScrollBoxesAry[ScrollBoxIndex].WrapMode == 1)
+#ifdef GuiConst_SCROLL_MODE_WRAP_AROUND
+         || (sgl.ScrollBoxesAry[ScrollBoxIndex].WrapMode == 2)
+#endif
+                                                        )
+        sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine = 0;
+    }
+    else
+      sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine++;
+  }
+  else if (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] >= 0)
+  {
+    if (sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollMode == 0)
+    {
+      if (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] ==
+         (sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines - 1))
+      {
+        if ((sgl.ScrollBoxesAry[ScrollBoxIndex].WrapMode == 1)
+#ifdef GuiConst_SCROLL_MODE_WRAP_AROUND
+           || (sgl.ScrollBoxesAry[ScrollBoxIndex].WrapMode == 2)
+#endif
+                                                          )
+        {
+          sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine = 0;
+          sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] = 0;
+        }
+      }
+      else if (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] <
+         ScrollBottomLine - sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollStartOfs)
+        sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0]++;
+      else
+      {
+        sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine++;
+        GuiLib_LIMIT_MAX(sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine,
+           sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines -
+           sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines);
+        sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0]++;
+      }
+    }
+    else
+    {
+      if (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] ==
+         (sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines - 1))
+      {
+        if ((sgl.ScrollBoxesAry[ScrollBoxIndex].WrapMode == 1)
+#ifdef GuiConst_SCROLL_MODE_WRAP_AROUND
+           || (sgl.ScrollBoxesAry[ScrollBoxIndex].WrapMode == 2)
+#endif
+                                                          )
+        {
+          sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine =
+             -sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollStartOfs;
+          sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] = 0;
+        }
+      }
+      else
+      {
+        sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine++;
+        sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0]++;
+      }
+    }
+  }
+
+  if ((sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine != RemScrollTopLine) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] != RemMarkerStartLine))
+  {
+    GuiLib_ScrollBox_Redraw(ScrollBoxIndex);
+    return (1);
+  }
+  else
+    return (0);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_ScrollBox_Up(
+   GuiConst_INT8U ScrollBoxIndex)
+{
+  GuiConst_INT16S RemScrollTopLine;
+  GuiConst_INT16S RemMarkerStartLine;
+
+  if ((ScrollBoxIndex >= GuiConst_SCROLLITEM_BOXES_MAX) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].InUse != GuiLib_SCROLL_STRUCTURE_USED))
+    return (0);
+
+  RemScrollTopLine = sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine;
+  RemMarkerStartLine = sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0];
+
+  if (sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollBoxType)
+  {
+    if (sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine == 0)
+    {
+      if ((sgl.ScrollBoxesAry[ScrollBoxIndex].WrapMode == 1)
+#ifdef GuiConst_SCROLL_MODE_WRAP_AROUND
+         || (sgl.ScrollBoxesAry[ScrollBoxIndex].WrapMode == 2)
+#endif
+                                                        )
+        sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine =
+           sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines -
+           sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines;
+        GuiLib_LIMIT_MIN(sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine, 0);
+    }
+    else
+      sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine--;
+  }
+  else if (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] >= 0)
+  {
+    if (sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollMode == 0)
+    {
+      if (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] == 0)
+      {
+        if ((sgl.ScrollBoxesAry[ScrollBoxIndex].WrapMode == 1)
+#ifdef GuiConst_SCROLL_MODE_WRAP_AROUND
+           || (sgl.ScrollBoxesAry[ScrollBoxIndex].WrapMode == 2)
+#endif
+                                                          )
+        {
+          sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine =
+             sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines -
+             sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines;
+          GuiLib_LIMIT_MIN(sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine, 0);
+          sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] =
+             sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines - 1;
+        }
+      }
+      else if (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] >
+               sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine +
+               sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollStartOfs)
+        sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0]--;
+      else
+      {
+        sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine--;
+        GuiLib_LIMIT_MIN(sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine, 0);
+        sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0]--;
+      }
+    }
+    else
+    {
+      if (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] == 0)
+      {
+        if ((sgl.ScrollBoxesAry[ScrollBoxIndex].WrapMode == 1)
+#ifdef GuiConst_SCROLL_MODE_WRAP_AROUND
+           || (sgl.ScrollBoxesAry[ScrollBoxIndex].WrapMode == 2)
+#endif
+                                                          )
+        {
+          sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine =
+             sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines - 1 -
+             sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollStartOfs;
+          sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] =
+             sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines - 1;
+        }
+      }
+      else
+      {
+        sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine--;
+        sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0]--;
+      }
+    }
+  }
+
+  if ((sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine != RemScrollTopLine) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] != RemMarkerStartLine))
+  {
+    GuiLib_ScrollBox_Redraw(ScrollBoxIndex);
+    return (1);
+  }
+  else
+    return (0);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_ScrollBox_Home(
+   GuiConst_INT8U ScrollBoxIndex)
+{
+  GuiConst_INT16S RemScrollTopLine;
+  GuiConst_INT16S RemMarkerStartLine;
+
+  if ((ScrollBoxIndex >= GuiConst_SCROLLITEM_BOXES_MAX) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].InUse != GuiLib_SCROLL_STRUCTURE_USED))
+    return (0);
+
+  RemScrollTopLine = sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine;
+  RemMarkerStartLine = sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0];
+
+  if (sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollBoxType)
+    sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine = 0;
+  else
+  {
+    if (sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollMode == 0)
+      sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine = 0;
+    else
+      sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine =
+         -sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollStartOfs;
+    if (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] >= 0)
+      sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] = 0;
+  }
+
+  if ((sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine != RemScrollTopLine) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] != RemMarkerStartLine))
+  {
+    GuiLib_ScrollBox_Redraw(ScrollBoxIndex);
+    return (1);
+  }
+  else
+    return (0);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_ScrollBox_End(
+   GuiConst_INT8U ScrollBoxIndex)
+{
+  GuiConst_INT16S RemScrollTopLine;
+  GuiConst_INT16S RemMarkerStartLine;
+
+  if ((ScrollBoxIndex >= GuiConst_SCROLLITEM_BOXES_MAX) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].InUse != GuiLib_SCROLL_STRUCTURE_USED))
+    return (0);
+
+  RemScrollTopLine = sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine;
+  RemMarkerStartLine = sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0];
+
+  if (sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollBoxType)
+    sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine = GuiLib_GET_MAX(
+       sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines -
+       sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines, 0);
+  else
+  {
+    if (sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollMode == 0)
+      sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine = GuiLib_GET_MAX(
+         sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines -
+         sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines, 0);
+    else
+      sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine =
+         sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines - 1 -
+         sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollStartOfs;
+    if (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] >= 0)
+      sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] =
+         sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines - 1;
+  }
+
+  if ((sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine != RemScrollTopLine) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] != RemMarkerStartLine))
+  {
+    GuiLib_ScrollBox_Redraw(ScrollBoxIndex);
+    return (1);
+  }
+  else
+    return (0);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_ScrollBox_To_Line(
+   GuiConst_INT8U ScrollBoxIndex,
+   GuiConst_INT16S NewLine)
+{
+  GuiConst_INT16S RemScrollTopLine;
+  GuiConst_INT16S RemMarkerStartLine;
+  GuiConst_INT16S TopLine;
+  GuiConst_INT16S LowerLimtA = 0;
+
+  if ((ScrollBoxIndex >= GuiConst_SCROLLITEM_BOXES_MAX) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].InUse != GuiLib_SCROLL_STRUCTURE_USED) ||
+      (NewLine >= sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines))
+    return(0);
+
+  RemScrollTopLine = sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine;
+  RemMarkerStartLine = sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0];
+
+  if (sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollBoxType)
+  {
+    TopLine = sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines -
+              sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines;
+    GuiLib_LIMIT_MIN(TopLine, 0);
+    if (NewLine > TopLine)
+      sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine = TopLine;
+    else
+      sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine = NewLine;
+  }
+  else if (sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollMode == 0)
+  {
+    if ((NewLine != -1) &&
+        ((NewLine < sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine) ||
+        (NewLine >= (sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine +
+         sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines))))
+    {
+      if (NewLine > (sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines -
+          sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines +
+          sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollStartOfs))
+        sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine =
+           sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines -
+           sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines;
+      else
+        sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine =
+           NewLine - sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollStartOfs;
+
+      GuiLib_LIMIT_MINMAX(sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine,
+         NewLine - sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines + 1,
+         NewLine + sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines - 1);
+      GuiLib_LIMIT_MINMAX(sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine, LowerLimtA,
+         sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines -
+         sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines);
+    }
+  }
+  else
+    sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine =
+       NewLine - sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollStartOfs;
+  sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] = NewLine;
+
+  if ((sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine != RemScrollTopLine) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[0] != RemMarkerStartLine))
+  {
+    GuiLib_ScrollBox_Redraw(ScrollBoxIndex);
+    return (1);
+  }
+  else
+    return (0);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_ScrollBox_SetLineMarker(
+   GuiConst_INT8U ScrollBoxIndex,
+   GuiConst_INT16U ScrollLineMarkerIndex,
+   GuiConst_INT16S StartLine,
+   GuiConst_INT16U Size)
+{
+  if ((ScrollBoxIndex >= GuiConst_SCROLLITEM_BOXES_MAX) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].InUse != GuiLib_SCROLL_STRUCTURE_USED) ||
+      (ScrollLineMarkerIndex >= GuiConst_SCROLLITEM_MARKERS_MAX) ||
+      (StartLine >= sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines))
+    return (0);
+
+  sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[ScrollLineMarkerIndex] =
+     GuiLib_GET_MINMAX(StartLine, -1,
+     (GuiConst_INT16S)sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines - 1);
+  if ((ScrollLineMarkerIndex == 0) && (Size > 1))
+    Size = 1;
+  sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerSize[ScrollLineMarkerIndex] = Size;
+  if (ScrollLineMarkerIndex == 0)
+    ScrollBox_SetTopLine(ScrollBoxIndex);
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT16S GuiLib_ScrollBox_GetActiveLine(
+   GuiConst_INT8U ScrollBoxIndex,
+   GuiConst_INT16U ScrollLineMarkerIndex)
+{
+  if ((ScrollBoxIndex >= GuiConst_SCROLLITEM_BOXES_MAX) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].InUse != GuiLib_SCROLL_STRUCTURE_USED) ||
+      (ScrollLineMarkerIndex >= GuiConst_SCROLLITEM_MARKERS_MAX))
+    return (-1);
+
+  return (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerStartLine[ScrollLineMarkerIndex]);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT16S GuiLib_ScrollBox_GetActiveLineCount(
+   GuiConst_INT8U ScrollBoxIndex,
+   GuiConst_INT16U ScrollLineMarkerIndex)
+{
+  if ((ScrollBoxIndex >= GuiConst_SCROLLITEM_BOXES_MAX) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].InUse != GuiLib_SCROLL_STRUCTURE_USED) ||
+      (ScrollLineMarkerIndex >= GuiConst_SCROLLITEM_MARKERS_MAX))
+    return (-1);
+
+  return (sgl.ScrollBoxesAry[ScrollBoxIndex].MarkerSize[ScrollLineMarkerIndex]);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_ScrollBox_SetIndicator(
+   GuiConst_INT8U ScrollBoxIndex,
+   GuiConst_INT16S StartLine)
+{
+#ifdef GuiConst_SCROLLITEM_INDICATOR_NONE
+  gl.Dummy1_8U = ScrollBoxIndex;   // To avoid compiler warning
+  gl.Dummy1_16S = StartLine;   // To avoid compiler warning
+  return (0);
+#else
+  if ((ScrollBoxIndex >= GuiConst_SCROLLITEM_BOXES_MAX) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].InUse != GuiLib_SCROLL_STRUCTURE_USED) ||
+      (StartLine >= sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines))
+    return (0);
+
+  sgl.ScrollBoxesAry[ScrollBoxIndex].IndicatorLine = GuiLib_GET_MINMAX(
+     StartLine, -1,
+     (GuiConst_INT16S)sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines - 1);
+
+  return (1);
+#endif
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_ScrollBox_SetTopLine(
+   GuiConst_INT8U ScrollBoxIndex,
+   GuiConst_INT16S TopLine)
+{
+  if ((ScrollBoxIndex >= GuiConst_SCROLLITEM_BOXES_MAX) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].InUse != GuiLib_SCROLL_STRUCTURE_USED) ||
+      (TopLine >= sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines))
+    return (0);
+
+  if (sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollMode == 0)
+    sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine =
+       GuiLib_GET_MINMAX(TopLine, 0,
+       sgl.ScrollBoxesAry[ScrollBoxIndex].NumberOfLines -
+       sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollVisibleLines);
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT16S GuiLib_ScrollBox_GetTopLine(
+   GuiConst_INT8U ScrollBoxIndex)
+{
+  if ((ScrollBoxIndex >= GuiConst_SCROLLITEM_BOXES_MAX) ||
+      (sgl.ScrollBoxesAry[ScrollBoxIndex].InUse != GuiLib_SCROLL_STRUCTURE_USED))
+    return (-1);
+
+  return (sgl.ScrollBoxesAry[ScrollBoxIndex].ScrollTopLine);
+}
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+#endif // GuiConst_ITEM_SCROLLBOX_INUSE
+
+#ifdef GuiConst_ITEM_GRAPH_INUSE
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+//------------------------------------------------------------------------------
+static void Graph_SetClipping(
+   GuiConst_INT8U GraphIndex)
+{
+  GuiLib_SetClipping(sgl.GraphAry[GraphIndex].GraphItem.ClipRectX1,
+                     sgl.GraphAry[GraphIndex].GraphItem.ClipRectY1,
+                     sgl.GraphAry[GraphIndex].GraphItem.ClipRectX2,
+                     sgl.GraphAry[GraphIndex].GraphItem.ClipRectY2);
+}
+
+//------------------------------------------------------------------------------
+static void Graph_ResetClipping(void)
+{
+  GuiLib_ResetClipping();
+}
+#endif // GuiConst_CLIPPING_SUPPORT_ON
+
+//------------------------------------------------------------------------------
+static void Graph_CalcScaleX(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8U AxisIndex)
+{
+  GuiConst_INT32S D1,D2;
+
+  D1 = (sgl.GraphAry[GraphIndex].GraphItem.X2 -
+       sgl.GraphAry[GraphIndex].GraphItem.X1 -
+       sgl.GraphAry[GraphIndex].OriginOffsetX);
+  D1 = D1 * 10000;
+  D2 = (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].NumbersMaxValue -
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].NumbersMinValue);
+  D1 = D1/D2;
+  sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].Scale = D1;
+}
+
+//------------------------------------------------------------------------------
+static void Graph_CalcScaleY(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8U AxisIndex)
+{
+  GuiConst_INT32S D1,D2;
+
+  D1 = (sgl.GraphAry[GraphIndex].GraphItem.Y2 -
+       sgl.GraphAry[GraphIndex].GraphItem.Y1-
+       sgl.GraphAry[GraphIndex].OriginOffsetY);
+  D1 = D1 * 10000;
+  D2 = (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].NumbersMaxValue -
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].NumbersMinValue);
+  D1 = D1/D2;
+  sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].Scale= D1;
+}
+
+//------------------------------------------------------------------------------
+static GuiConst_INT32S Graph_CalcNumbersMaxValue(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8U AxisIndex,
+   GuiConst_INT8U AxisType)
+{
+  GuiConst_INT32S MV;
+
+  MV = sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][AxisType].NumbersMaxValue;
+  if (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][AxisType].TicksMinor)
+    MV -= sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][AxisType].NumbersAtEnd *
+          sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][AxisType].NumbersStepMinor;
+  else if (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][AxisType].TicksMajor)
+    MV -= sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][AxisType].NumbersAtEnd *
+          sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][AxisType].NumbersStepMajor;
+  return(MV);
+}
+
+//------------------------------------------------------------------------------
+static void Graph_DrawXAxis(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8U AxisIndex)
+{
+  GuiConst_INT16S X, Y;
+  GuiConst_INT16S DX, DY;
+  GuiConst_INT32S TX, TY;
+  #ifdef GuiConst_FLOAT_SUPPORT_ON
+  double TDX;
+  #endif
+  GuiConst_INT32S F;
+  GuiConst_INT16S HW;
+  GuiConst_INT32S MV;
+  GuiConst_INT16U StrLen;
+  GuiConst_INT16U I;
+  GuiConst_INT8U Align;
+
+  Y = sgl.GraphAry[GraphIndex].OrigoY +
+      sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].Offset;
+
+  MV = Graph_CalcNumbersMaxValue(GraphIndex, AxisIndex, GuiLib_GRAPHAXIS_X);
+
+  if (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].Line)
+  {
+    X = sgl.GraphAry[GraphIndex].GraphItem.X2 -
+        sgl.GraphAry[GraphIndex].GraphItem.X1 + 1;
+    for (I = 0; I < sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_Y]; I++)
+      if (sgl.GraphAry[GraphIndex].GraphAxes[I][GuiLib_GRAPHAXIS_Y].Offset < X)
+        X = sgl.GraphAry[GraphIndex].GraphAxes[I][GuiLib_GRAPHAXIS_Y].Offset;
+    X += sgl.GraphAry[GraphIndex].OriginOffsetX;
+    if (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+        LineNegative)
+      GuiLib_FillBox(sgl.GraphAry[GraphIndex].GraphItem.X1,
+                     Y,
+                     sgl.GraphAry[GraphIndex].GraphItem.X1 + X - 1,
+                     Y,
+                     sgl.GraphAry[GraphIndex].ForeColor);
+    if ((sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_Y] > 1) &&
+         sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+         LineBetweenAxes)
+      GuiLib_FillBox(sgl.GraphAry[GraphIndex].GraphItem.X1 + X - 1,
+                     Y,
+                     sgl.GraphAry[GraphIndex].GraphItem.X1 +
+                     sgl.GraphAry[GraphIndex].OriginOffsetX,
+                     Y,
+                     sgl.GraphAry[GraphIndex].ForeColor);
+    GuiLib_FillBox(sgl.GraphAry[GraphIndex].GraphItem.X1 +
+                   sgl.GraphAry[GraphIndex].OriginOffsetX,
+                   Y,
+                   sgl.GraphAry[GraphIndex].GraphItem.X2,
+                   Y,
+                   sgl.GraphAry[GraphIndex].ForeColor);
+  }
+
+  if (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].Arrow)
+  {
+    DX = sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+         ArrowLength;
+    HW = sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+         ArrowWidth / 2;
+    for (DY = -HW; DY <= HW; DY++)
+      GuiLib_Line(sgl.GraphAry[GraphIndex].GraphItem.X2 - DX,
+                  Y + DY,
+                  sgl.GraphAry[GraphIndex].GraphItem.X2,
+                  Y,
+                  sgl.GraphAry[GraphIndex].ForeColor);
+  }
+
+  Graph_CalcScaleX(GraphIndex, AxisIndex);
+
+  if (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].TicksMajor)
+  {
+    HW = sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+         TicksMajorWidth / 2;
+    TX = sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+         NumbersMinValue;
+    F = TX % sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+             NumbersStepMajor;
+    if (F != 0)
+    {
+      TX -= F;
+      if (TX < sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+               NumbersMinValue)
+        TX += sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+              NumbersStepMajor;
+    }
+    while (TX <= MV)
+    {
+      DX = sgl.GraphAry[GraphIndex].OrigoX + ((TX -
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+           NumbersMinValue) *
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].Scale) /
+           10000;
+      if (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+          NumbersAtOrigo ||
+         (TX != sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+                NumbersMinValue))
+        GuiLib_FillBox(
+           DX - HW,
+           Y,
+           DX - HW +
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+           TicksMajorWidth - 1,
+           Y + sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+           TicksMajorLength - 1,
+           sgl.GraphAry[GraphIndex].ForeColor);
+      TX += sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+            NumbersStepMajor;
+    }
+  }
+
+  if (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].TicksMinor)
+  {
+    HW = sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+         TicksMinorWidth / 2;
+    TX = sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+         NumbersMinValue;
+    F = TX % sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+             NumbersStepMinor;
+    if (F != 0)
+    {
+      TX -= F;
+      if (TX < sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+               NumbersMinValue)
+        TX += sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+              NumbersStepMinor;
+    }
+    while (TX <= MV)
+    {
+      DX = sgl.GraphAry[GraphIndex].OrigoX + ((TX -
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+           NumbersMinValue) *
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].Scale) /
+           10000;
+      if ((sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+          NumbersAtOrigo ||
+         (TX != sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+                NumbersMinValue)) &&
+         ((!sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+            TicksMajor) ||
+         (TX % sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+               NumbersStepMajor != 0)))
+        GuiLib_FillBox(
+           DX - HW,
+           Y,
+           DX - HW +
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+           TicksMinorWidth - 1,
+           Y + sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+           TicksMinorLength - 1,
+           sgl.GraphAry[GraphIndex].ForeColor);
+      TX += sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+            NumbersStepMinor;
+    }
+  }
+
+  if (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].Numbers)
+  {
+    memcpy(&sgl.CurItem, &sgl.GraphAry[GraphIndex].GraphItem, sizeof(GuiLib_ItemRec));
+
+    DY = Y;
+    if (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+       TicksMajor)
+      DY += sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+         TicksMajorLength;
+    SetCurFont(sgl.GraphAry[GraphIndex].GraphItem.TextPar[0].FontIndex);
+    DY += ReadByte(sgl.CurFont->BaseLine);
+    DY += sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+       NumbersOffset;
+
+    TX = sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+       NumbersMinValue;
+    F = TX % sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+             NumbersStepMajor;
+    if (F != 0)
+    {
+      TX -= F;
+      if (TX < sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+               NumbersMinValue)
+        TX += sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+              NumbersStepMajor;
+    }
+    switch (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].FormatAlignment)
+    {
+      case GuiLib_FORMAT_ALIGNMENT_LEFT:
+        Align = GuiLib_ALIGN_LEFT;
+        break;
+      case GuiLib_FORMAT_ALIGNMENT_CENTER:
+        Align = GuiLib_ALIGN_CENTER;
+        break;
+      case GuiLib_FORMAT_ALIGNMENT_RIGHT:
+        Align = GuiLib_ALIGN_RIGHT;
+        break;
+    }
+    while (TX <= MV)
+    {
+      DX = sgl.GraphAry[GraphIndex].OrigoX + ((TX -
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+           NumbersMinValue) *
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].Scale) /
+           10000;
+      if (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+          NumbersAtOrigo ||
+         (TX != sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+                NumbersMinValue))
+      {
+        #ifdef GuiConst_FLOAT_SUPPORT_ON
+        TDX = TX;
+        #endif
+        GuiLib_DrawVar(
+           DX,
+           DY,
+           sgl.GraphAry[GraphIndex].GraphItem.TextPar[0].FontIndex,
+           #ifdef GuiConst_FLOAT_SUPPORT_ON
+           &TDX,
+           GuiLib_VAR_DOUBLE,
+           #else
+           &TX,
+           GuiLib_VAR_SIGNED_LONG,
+           #endif
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].FormatFormat,
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].FormatFieldWidth,
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].FormatAlignment,
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].FormatDecimals,
+           ((sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+              BitFlags & GuiLib_BITFLAG_FORMATSHOWSIGN) > 0),
+           ((sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+              BitFlags & GuiLib_BITFLAG_FORMATZEROPADDING) > 0),
+           ((sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+              BitFlags & GuiLib_BITFLAG_FORMATTRAILINGZEROS) > 0),
+           ((sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+              BitFlags & GuiLib_BITFLAG_FORMATTHOUSANDSSEP) > 0),
+           Align,
+           sgl.GraphAry[GraphIndex].GraphItem.TextPar[0].Ps,
+           1,   // Transparent
+           ((sgl.GraphAry[GraphIndex].GraphItem.TextPar[0].BitFlags &
+            GuiLib_BITFLAG_UNDERLINE) > 0),
+           0,
+           0,
+           0,
+           0,
+           sgl.GraphAry[GraphIndex].GraphItem.ForeColor,
+           sgl.GraphAry[GraphIndex].GraphItem.BackColor);
+      }
+      TX += sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+         NumbersStepMajor;
+    }
+  }
+}
+
+//------------------------------------------------------------------------------
+static void Graph_DrawYAxis(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8U AxisIndex)
+{
+  GuiConst_INT16S X, Y;
+  GuiConst_INT16S DX, DY;
+  GuiConst_INT32S TX, TY;
+  #ifdef GuiConst_FLOAT_SUPPORT_ON
+  double TDY;
+  #endif
+  GuiConst_INT32S F;
+  GuiConst_INT16S HW;
+  GuiConst_INT32S MV;
+  GuiConst_INT16U StrLen;
+  GuiConst_INT16U I;
+  GuiConst_INT8U Align;
+
+  X = sgl.GraphAry[GraphIndex].OrigoX +
+      sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].Offset;
+
+  MV = Graph_CalcNumbersMaxValue(GraphIndex, AxisIndex, GuiLib_GRAPHAXIS_Y);
+
+  if (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].Line)
+  {
+    Y = 0;
+    for (I = 0; I < sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_X]; I++)
+      if (sgl.GraphAry[GraphIndex].GraphAxes[I][GuiLib_GRAPHAXIS_X].Offset > Y)
+        Y = sgl.GraphAry[GraphIndex].GraphAxes[I][GuiLib_GRAPHAXIS_X].Offset;
+    Y = sgl.GraphAry[GraphIndex].OriginOffsetY - Y;
+    if (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+        LineNegative)
+      GuiLib_FillBox(X,
+                     sgl.GraphAry[GraphIndex].GraphItem.Y2 - Y,
+                     X,
+                     sgl.GraphAry[GraphIndex].GraphItem.Y2,
+                     sgl.GraphAry[GraphIndex].ForeColor);
+    if ((sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_X] > 1) &&
+         sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+         LineBetweenAxes)
+      GuiLib_FillBox(X,
+                     sgl.GraphAry[GraphIndex].GraphItem.Y2 -
+                     sgl.GraphAry[GraphIndex].OriginOffsetY,
+                     X,
+                     sgl.GraphAry[GraphIndex].GraphItem.Y2 - Y,
+                     sgl.GraphAry[GraphIndex].ForeColor);
+    GuiLib_FillBox(X,
+                   sgl.GraphAry[GraphIndex].GraphItem.Y1,
+                   X,
+                   sgl.GraphAry[GraphIndex].GraphItem.Y2 -
+                   sgl.GraphAry[GraphIndex].OriginOffsetY,
+                   sgl.GraphAry[GraphIndex].ForeColor);
+  }
+
+  if (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].Arrow)
+  {
+    DY = sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+         ArrowLength;
+    HW = sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+         ArrowWidth / 2;
+    for (DX = -HW; DX <= HW; DX++)
+      GuiLib_Line(X - DX,
+                  sgl.GraphAry[GraphIndex].GraphItem.Y1 + DY,
+                  X,
+                  sgl.GraphAry[GraphIndex].GraphItem.Y1,
+                  sgl.GraphAry[GraphIndex].ForeColor);
+  }
+
+  Graph_CalcScaleY(GraphIndex, AxisIndex);
+
+  if (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].TicksMajor)
+  {
+    HW = sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+         TicksMajorWidth / 2;
+    TY = sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+         NumbersMinValue;
+    F = TY % sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+             NumbersStepMajor;
+    if (F != 0)
+    {
+      TY -= F;
+      if (TY < sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+               NumbersMinValue)
+        TY += sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+              NumbersStepMajor;
+    }
+    while (TY <= MV)
+    {
+      DY = sgl.GraphAry[GraphIndex].OrigoY - ((TY -
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+           NumbersMinValue) *
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].Scale) /
+           10000;
+      if (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+          NumbersAtOrigo ||
+         (TY != sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+                NumbersMinValue))
+        GuiLib_FillBox(
+           X - sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+           TicksMajorLength + 1,
+           DY - HW,
+           X,
+           DY - HW +
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+           TicksMajorWidth - 1,
+           sgl.GraphAry[GraphIndex].ForeColor);
+      TY += sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+            NumbersStepMajor;
+    }
+  }
+
+  if (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].TicksMinor)
+  {
+    HW = sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+         TicksMinorWidth / 2;
+    TY = sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+         NumbersMinValue;
+    F = TY % sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+             NumbersStepMinor;
+    if (F != 0)
+    {
+      TY -= F;
+      if (TY < sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+               NumbersMinValue)
+        TY += sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+              NumbersStepMinor;
+    }
+    while (TY <= MV)
+    {
+      DY = sgl.GraphAry[GraphIndex].OrigoY - ((TY -
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+           NumbersMinValue) *
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].Scale) /
+           10000;
+      if ((sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+          NumbersAtOrigo ||
+         (TY != sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+                NumbersMinValue)) &&
+         ((!sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+          TicksMajor) ||
+         (TY % sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+               NumbersStepMajor != 0)))
+        GuiLib_FillBox(
+           X - sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+           TicksMinorLength + 1,
+           DY - HW,
+           X,
+           DY - HW +
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+           TicksMinorWidth - 1,
+           sgl.GraphAry[GraphIndex].ForeColor);
+      TY += sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+            NumbersStepMinor;
+    }
+  }
+
+  if (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].Numbers)
+  {
+    memcpy(&sgl.CurItem, &sgl.GraphAry[GraphIndex].GraphItem, sizeof(GuiLib_ItemRec));
+
+    SetCurFont(sgl.GraphAry[GraphIndex].GraphItem.TextPar[0].FontIndex);
+
+    sgl.CurItem.TextPar[0].BitFlags =
+       sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].BitFlags;
+    sgl.CurItem.FormatFieldWidth =
+       sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].FormatFieldWidth;
+    sgl.CurItem.FormatDecimals =
+       sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].FormatDecimals;
+    sgl.CurItem.FormatAlignment =
+       sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].FormatAlignment;
+    sgl.CurItem.FormatFormat =
+       sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].FormatFormat;
+
+    DX = X;
+    if (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+       TicksMajor)
+      DX -= sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+         TicksMajorLength;
+    DX -= sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+       NumbersOffset;
+
+    TY = sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+       NumbersMinValue;
+    F = TY % sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+             NumbersStepMajor;
+    if (F != 0)
+    {
+      TY -= F;
+      if (TY < sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+               NumbersMinValue)
+        TY += sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+              NumbersStepMajor;
+    }
+    switch (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].FormatAlignment)
+    {
+      case GuiLib_FORMAT_ALIGNMENT_LEFT:
+        Align = GuiLib_ALIGN_LEFT;
+        break;
+      case GuiLib_FORMAT_ALIGNMENT_CENTER:
+        Align = GuiLib_ALIGN_CENTER;
+        break;
+      case GuiLib_FORMAT_ALIGNMENT_RIGHT:
+        Align = GuiLib_ALIGN_RIGHT;
+        break;
+    }
+    while (TY <= MV)
+    {
+      DY = sgl.GraphAry[GraphIndex].OrigoY - ((TY -
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+           NumbersMinValue) *
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].Scale) /
+           10000;
+      if (sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+          NumbersAtOrigo ||
+         (TY != sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+                NumbersMinValue))
+      {
+        #ifdef GuiConst_FLOAT_SUPPORT_ON
+        TDY = TY;
+        #endif
+        GuiLib_DrawVar(
+           DX,
+           DY + GuiLib_FONT_MID_Y(ReadByte(sgl.CurFont->BaseLine),
+                                  ReadByte(sgl.CurFont->TopLine)),
+           sgl.GraphAry[GraphIndex].GraphItem.TextPar[0].FontIndex,
+           #ifdef GuiConst_FLOAT_SUPPORT_ON
+           &TDY,
+           GuiLib_VAR_DOUBLE,
+           #else
+           &TY,
+           GuiLib_VAR_SIGNED_LONG,
+           #endif
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].FormatFormat,
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].FormatFieldWidth,
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].FormatAlignment,
+           sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].FormatDecimals,
+           ((sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+              BitFlags & GuiLib_BITFLAG_FORMATSHOWSIGN) > 0),
+           ((sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+              BitFlags & GuiLib_BITFLAG_FORMATZEROPADDING) > 0),
+           ((sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+              BitFlags & GuiLib_BITFLAG_FORMATTRAILINGZEROS) > 0),
+           ((sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+              BitFlags & GuiLib_BITFLAG_FORMATTHOUSANDSSEP) > 0),
+           Align,
+           sgl.GraphAry[GraphIndex].GraphItem.TextPar[0].Ps,
+           1,   // Transparent
+           ((sgl.GraphAry[GraphIndex].GraphItem.TextPar[0].BitFlags &
+              GuiLib_BITFLAG_UNDERLINE) > 0),
+           0,
+           0,
+           0,
+           0,
+           sgl.GraphAry[GraphIndex].GraphItem.ForeColor,
+           sgl.GraphAry[GraphIndex].GraphItem.BackColor);
+      }
+      TY += sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+         NumbersStepMajor;
+    }
+  }
+}
+
+//------------------------------------------------------------------------------
+static void Graph_DrawDataPoint(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8U DataSetIndex,
+   GuiConst_INT16U DataIndex,
+   GuiConst_INT16S X,
+   GuiConst_INT16S Y,
+   GuiConst_INT16S LastX,
+   GuiConst_INT16S LastY)
+{
+  GuiConst_INT16S DX1, DY1;
+  GuiConst_INT16S DX2, DY2;
+  GuiConst_INT16S HW;
+  GuiConst_INT16S AY;
+
+  switch (sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].Representation)
+  {
+    case GuiLib_GRAPH_DATATYPE_DOT:
+      if (sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].Thickness == 0)
+        GuiLib_Circle(
+           X, Y,
+           sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].Width,
+           sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].BackColor,
+           sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].BackColor);
+      else if (sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].
+               Thickness == 1)
+        GuiLib_Circle(
+           X, Y,
+           sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].Width,
+           sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].ForeColor,
+           sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].BackColor);
+      else
+      {
+        GuiLib_Circle(
+           X, Y,
+           sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].Width,
+           sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].ForeColor,
+           sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].ForeColor);
+        GuiLib_Circle(
+           X, Y,
+           sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].Width-
+              sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].Thickness,
+           sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].BackColor,
+           sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].BackColor);
+      }
+      break;
+
+    case GuiLib_GRAPH_DATATYPE_LINE:
+      if (DataIndex ==
+          sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataFirst)
+        GuiLib_Dot(
+           X, Y,
+           sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].ForeColor);
+      else
+        GuiLib_Line(
+           LastX, LastY,
+           X, Y,
+           sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].ForeColor);
+      break;
+
+    case GuiLib_GRAPH_DATATYPE_BAR:
+      AY = sgl.GraphAry[GraphIndex].OrigoY +
+           sgl.GraphAry[GraphIndex].GraphAxes[0][GuiLib_GRAPHAXIS_X].Offset;
+      DX2 = X + (sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].Width / 2);
+      DX1 = DX2 - sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].Width + 1;
+      if (DX1 > DX2)
+        DX1 = DX2;
+      DY1 = AY;
+      DY2 = Y;
+      if (Y < AY)
+        DY1--;
+      if (Y != AY)
+      {
+        if (sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].Thickness == 0)
+        {
+          if (!sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].
+               BackColorTransparent)
+            GuiLib_FillBox(
+               DX1, DY1,
+               DX2, DY2,
+               sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].BackColor);
+        }
+        else
+        {
+          OrderCoord(&DX1, &DX2);
+          OrderCoord(&DY1, &DY2);
+          DrawBorderBox(
+             DX1, DY1,
+             DX2, DY2,
+             sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].ForeColor,
+             sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].BackColor,
+             sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].
+                BackColorTransparent,
+             sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].Thickness);
+        }
+      }
+      break;
+
+    case GuiLib_GRAPH_DATATYPE_CROSS:
+      HW = sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].Width;
+      DX1 = X - HW;
+      DY1 = Y - HW;
+      DX2 = X + HW;
+      DY2 = Y + HW;
+      GuiLib_Line(
+         DX1, Y,
+         DX2, Y,
+         sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].ForeColor);
+      GuiLib_Line(
+         X, DY1,
+         X, DY2,
+         sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].ForeColor);
+      break;
+
+    case GuiLib_GRAPH_DATATYPE_X:
+      HW = sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].Width;
+      DX1 = X - HW;
+      DY1 = Y - HW;
+      DX2 = X + HW;
+      DY2 = Y + HW;
+      GuiLib_Line(
+         DX1, DY1,
+         DX2, DY2,
+         sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].ForeColor);
+      GuiLib_Line(
+         DX1, DY2,
+         DX2, DY1,
+         sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].ForeColor);
+      break;
+  }
+}
+
+//------------------------------------------------------------------------------
+static void Graph_DrawDataSet(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8U DataSetIndex)
+{
+  GuiConst_INT16S DX = 0, DY = 0;
+  GuiConst_INT16S LastDX, LastDY;
+  GuiConst_INT32S TX, TY;
+  GuiConst_INT16U DataIndex;
+  GuiConst_INT16U DataCount;
+
+  Graph_CalcScaleX(GraphIndex,
+                   sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].AxisIndexX);
+  Graph_CalcScaleY(GraphIndex,
+                   sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].AxisIndexY);
+
+  DataIndex = sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataFirst;
+  for (DataCount = 1;
+       DataCount <= sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataCount;
+       DataCount++)
+  {
+    TX =
+       sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataPtr[DataIndex].X;
+    TY =
+       sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataPtr[DataIndex].Y;
+
+    LastDX = DX;
+    LastDY = DY;
+    DX = sgl.GraphAry[GraphIndex].OrigoX + ((TX -
+         sgl.GraphAry[GraphIndex].GraphAxes[
+         sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].AxisIndexX]
+         [GuiLib_GRAPHAXIS_X].NumbersMinValue) *
+         sgl.GraphAry[GraphIndex].GraphAxes[
+         sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].AxisIndexX]
+         [GuiLib_GRAPHAXIS_X].Scale) / 10000;
+    DY = sgl.GraphAry[GraphIndex].OrigoY - ((TY -
+         sgl.GraphAry[GraphIndex].GraphAxes[
+         sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].AxisIndexY]
+         [GuiLib_GRAPHAXIS_Y].NumbersMinValue) *
+         sgl.GraphAry[GraphIndex].GraphAxes[
+         sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].AxisIndexY]
+         [GuiLib_GRAPHAXIS_Y].Scale) / 10000;
+
+    Graph_DrawDataPoint(
+       GraphIndex,
+       DataSetIndex,
+       DataIndex,
+       DX, DY,
+       LastDX, LastDY);
+
+    if (DataIndex >= sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataCount)
+      DataIndex = 0;
+    else
+      DataIndex++;
+  }
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Graph_Close(
+   GuiConst_INT8U GraphIndex)
+{
+  if ((GraphIndex >= GuiConst_GRAPH_MAX) ||
+      (sgl.GraphAry[GraphIndex].InUse != GuiLib_GRAPH_STRUCTURE_USED))
+    return (0);
+
+  sgl.GraphAry[GraphIndex].InUse = GuiLib_GRAPH_STRUCTURE_UNDEF;
+  sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_X] = 0;
+  sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_Y] = 0;
+  sgl.GraphAry[GraphIndex].GraphDataSetCnt = 0;
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Graph_AddDataSet(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8U DataSetIndex,
+   GuiConst_INT8U XAxisIndex,
+   GuiConst_INT8U YAxisIndex,
+   GuiLib_GraphDataPoint *DataPtr,
+   GuiConst_INT16U DataSize,
+   GuiConst_INT16U DataCount,
+   GuiConst_INT16U DataFirst)
+{
+  if ((GraphIndex >= GuiConst_GRAPH_MAX) ||
+      (sgl.GraphAry[GraphIndex].InUse != GuiLib_GRAPH_STRUCTURE_USED))
+    return (0);
+  if ((DataSetIndex >= GuiConst_GRAPH_DATASETS_MAX) ||
+      (DataSetIndex >= sgl.GraphAry[GraphIndex].GraphDataSetCnt))
+    return (0);
+  if (DataCount > DataSize)
+    return (0);
+  if (DataFirst >= DataSize)
+    return (0);
+
+  sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataPtr = DataPtr;
+  sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataSize = DataSize;
+  sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataFirst = DataFirst;
+  sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataCount = DataCount;
+  if ((XAxisIndex >= GuiConst_GRAPH_AXES_MAX) ||
+      (XAxisIndex >= sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_X]))
+    XAxisIndex = 0;
+  sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].AxisIndexX = XAxisIndex;
+  if ((YAxisIndex >= GuiConst_GRAPH_AXES_MAX) ||
+      (YAxisIndex >= sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_Y]))
+    YAxisIndex = 0;
+  sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].AxisIndexY = YAxisIndex;
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Graph_RemoveDataSet(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8U DataSetIndex)
+{
+  if ((GraphIndex >= GuiConst_GRAPH_MAX) ||
+      (sgl.GraphAry[GraphIndex].InUse != GuiLib_GRAPH_STRUCTURE_USED))
+    return (0);
+  if ((DataSetIndex >= GuiConst_GRAPH_DATASETS_MAX) ||
+      (DataSetIndex >= sgl.GraphAry[GraphIndex].GraphDataSetCnt))
+    return (0);
+
+  sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataCount = 0;
+  sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataSize = 0;
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Graph_AddDataPoint(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8U DataSetIndex,
+   GuiConst_INT32S X,
+   GuiConst_INT32S Y)
+{
+  GuiConst_INT16U I;
+
+  if ((GraphIndex >= GuiConst_GRAPH_MAX) ||
+      (sgl.GraphAry[GraphIndex].InUse != GuiLib_GRAPH_STRUCTURE_USED))
+    return (0);
+  if ((DataSetIndex >= GuiConst_GRAPH_DATASETS_MAX) ||
+      (DataSetIndex >= sgl.GraphAry[GraphIndex].GraphDataSetCnt))
+    return (0);
+  if (sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataCount >=
+      sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataSize)
+    return (0);
+
+  I = (sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataFirst +
+       sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataCount) %
+       sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataSize;
+  sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataCount++;
+
+  sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataPtr[I].X = X;
+  sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataPtr[I].Y = Y;
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Graph_ShowDataSet(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8U DataSetIndex)
+{
+  if ((GraphIndex >= GuiConst_GRAPH_MAX) ||
+      (sgl.GraphAry[GraphIndex].InUse != GuiLib_GRAPH_STRUCTURE_USED))
+    return (0);
+  if ((DataSetIndex >= GuiConst_GRAPH_DATASETS_MAX) ||
+      (DataSetIndex >= sgl.GraphAry[GraphIndex].GraphDataSetCnt))
+    return (0);
+
+  sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].Visible = 1;
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Graph_HideDataSet(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8U DataSetIndex)
+{
+  if ((GraphIndex >= GuiConst_GRAPH_MAX) ||
+      (sgl.GraphAry[GraphIndex].InUse != GuiLib_GRAPH_STRUCTURE_USED))
+    return (0);
+  if ((DataSetIndex >= GuiConst_GRAPH_DATASETS_MAX) ||
+      (DataSetIndex >= sgl.GraphAry[GraphIndex].GraphDataSetCnt))
+    return (0);
+
+  sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].Visible = 0;
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Graph_ShowXAxis(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8U AxisIndex)
+{
+  if ((GraphIndex >= GuiConst_GRAPH_MAX) ||
+      (sgl.GraphAry[GraphIndex].InUse != GuiLib_GRAPH_STRUCTURE_USED))
+    return (0);
+  if ((AxisIndex >= GuiConst_GRAPH_AXES_MAX) ||
+      (AxisIndex >= sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_X]))
+    return (0);
+
+  sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].Visible = 1;
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Graph_HideXAxis(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8U AxisIndex)
+{
+  if ((GraphIndex >= GuiConst_GRAPH_MAX) ||
+      (sgl.GraphAry[GraphIndex].InUse != GuiLib_GRAPH_STRUCTURE_USED))
+    return (0);
+  if ((AxisIndex >= GuiConst_GRAPH_AXES_MAX) ||
+      (AxisIndex >= sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_X]))
+    return (0);
+
+  sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].Visible = 0;
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Graph_ShowYAxis(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8U AxisIndex)
+{
+  if ((GraphIndex >= GuiConst_GRAPH_MAX) ||
+      (sgl.GraphAry[GraphIndex].InUse != GuiLib_GRAPH_STRUCTURE_USED))
+    return (0);
+  if ((AxisIndex >= GuiConst_GRAPH_AXES_MAX) ||
+      (AxisIndex >= sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_Y]))
+    return (0);
+
+  sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].Visible = 1;
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Graph_HideYAxis(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8U AxisIndex)
+{
+  if ((GraphIndex >= GuiConst_GRAPH_MAX) ||
+      (sgl.GraphAry[GraphIndex].InUse != GuiLib_GRAPH_STRUCTURE_USED))
+    return (0);
+  if ((AxisIndex >= GuiConst_GRAPH_AXES_MAX) ||
+      (AxisIndex >= sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_Y]))
+    return (0);
+
+  sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].Visible = 0;
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Graph_SetXAxisRange(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8U AxisIndex,
+   GuiConst_INT32S MinValue,
+   GuiConst_INT32S MaxValue)
+{
+  if ((GraphIndex >= GuiConst_GRAPH_MAX) ||
+      (sgl.GraphAry[GraphIndex].InUse != GuiLib_GRAPH_STRUCTURE_USED))
+    return (0);
+  if ((AxisIndex >= GuiConst_GRAPH_AXES_MAX) ||
+      (AxisIndex >= sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_X]))
+    return (0);
+
+  sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+     NumbersMinValue = MinValue;
+  sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_X].
+     NumbersMaxValue = MaxValue;
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Graph_SetYAxisRange(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8U AxisIndex,
+   GuiConst_INT32S MinValue,
+   GuiConst_INT32S MaxValue)
+{
+  if ((GraphIndex >= GuiConst_GRAPH_MAX) ||
+      (sgl.GraphAry[GraphIndex].InUse != GuiLib_GRAPH_STRUCTURE_USED))
+    return (0);
+  if ((AxisIndex >= GuiConst_GRAPH_AXES_MAX) ||
+      (AxisIndex >= sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_Y]))
+    return (0);
+
+  sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+     NumbersMinValue = MinValue;
+  sgl.GraphAry[GraphIndex].GraphAxes[AxisIndex][GuiLib_GRAPHAXIS_Y].
+     NumbersMaxValue = MaxValue;
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Graph_ResetXAxisOrigin(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8S AxisIndex)
+{
+  GuiConst_INT8U AxisIndex1,AxisIndex2;
+  GuiConst_INT8U I;
+
+  if ((GraphIndex >= GuiConst_GRAPH_MAX) ||
+      (sgl.GraphAry[GraphIndex].InUse != GuiLib_GRAPH_STRUCTURE_USED))
+    return (0);
+  if (AxisIndex == -1)
+  {
+    AxisIndex1 = 0;
+    AxisIndex2 = sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_X] - 1;
+  }
+  else if ((AxisIndex >= GuiConst_GRAPH_AXES_MAX) ||
+      (AxisIndex >= sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_X]))
+    return (0);
+  else
+  {
+    AxisIndex1 = AxisIndex;
+    AxisIndex2 = AxisIndex;
+  }
+
+  for (I = AxisIndex1; I <= AxisIndex2; I++)
+  {
+    sgl.GraphAry[GraphIndex].GraphAxes[I][GuiLib_GRAPHAXIS_X].NumbersMinValue =
+       sgl.GraphAry[GraphIndex].GraphAxes[I][GuiLib_GRAPHAXIS_X].NumbersMinValueOrg;
+    sgl.GraphAry[GraphIndex].GraphAxes[I][GuiLib_GRAPHAXIS_X].NumbersMaxValue =
+       sgl.GraphAry[GraphIndex].GraphAxes[I][GuiLib_GRAPHAXIS_X].NumbersMaxValueOrg;
+  }
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Graph_OffsetXAxisOrigin(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8S AxisIndex,
+   GuiConst_INT32S Offset)
+{
+  GuiConst_INT8U AxisIndex1,AxisIndex2;
+  GuiConst_INT8U I;
+
+  if ((GraphIndex >= GuiConst_GRAPH_MAX) ||
+      (sgl.GraphAry[GraphIndex].InUse != GuiLib_GRAPH_STRUCTURE_USED))
+    return (0);
+  if (AxisIndex == -1)
+  {
+    AxisIndex1 = 0;
+    AxisIndex2 = sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_X] - 1;
+  }
+  else if ((AxisIndex >= GuiConst_GRAPH_AXES_MAX) ||
+      (AxisIndex >= sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_X]))
+    return (0);
+  else
+  {
+    AxisIndex1 = AxisIndex;
+    AxisIndex2 = AxisIndex;
+  }
+
+  for (I = AxisIndex1; I <= AxisIndex2; I++)
+  {
+    sgl.GraphAry[GraphIndex].GraphAxes[I][GuiLib_GRAPHAXIS_X].NumbersMinValue += Offset;
+    sgl.GraphAry[GraphIndex].GraphAxes[I][GuiLib_GRAPHAXIS_X].NumbersMaxValue += Offset;
+  }
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Graph_ResetYAxisOrigin(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8S AxisIndex)
+{
+  GuiConst_INT8U AxisIndex1,AxisIndex2;
+  GuiConst_INT8U I;
+
+  if ((GraphIndex >= GuiConst_GRAPH_MAX) ||
+      (sgl.GraphAry[GraphIndex].InUse != GuiLib_GRAPH_STRUCTURE_USED))
+    return (0);
+  if (AxisIndex == -1)
+  {
+    AxisIndex1 = 0;
+    AxisIndex2 = sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_Y] - 1;
+  }
+  else if ((AxisIndex >= GuiConst_GRAPH_AXES_MAX) ||
+      (AxisIndex >= sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_Y]))
+    return (0);
+  else
+  {
+    AxisIndex1 = AxisIndex;
+    AxisIndex2 = AxisIndex;
+  }
+
+  for (I = AxisIndex1; I <= AxisIndex2; I++)
+  {
+    sgl.GraphAry[GraphIndex].GraphAxes[I][GuiLib_GRAPHAXIS_Y].NumbersMinValue =
+       sgl.GraphAry[GraphIndex].GraphAxes[I][GuiLib_GRAPHAXIS_Y].NumbersMinValueOrg;
+    sgl.GraphAry[GraphIndex].GraphAxes[I][GuiLib_GRAPHAXIS_Y].NumbersMaxValue =
+       sgl.GraphAry[GraphIndex].GraphAxes[I][GuiLib_GRAPHAXIS_Y].NumbersMaxValueOrg;
+  }
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Graph_OffsetYAxisOrigin(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8S AxisIndex,
+   GuiConst_INT32S Offset)
+{
+  GuiConst_INT8U AxisIndex1,AxisIndex2;
+  GuiConst_INT8U I;
+
+  if ((GraphIndex >= GuiConst_GRAPH_MAX) ||
+      (sgl.GraphAry[GraphIndex].InUse != GuiLib_GRAPH_STRUCTURE_USED))
+    return (0);
+  if (AxisIndex == -1)
+  {
+    AxisIndex1 = 0;
+    AxisIndex2 = sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_Y] - 1;
+  }
+  else if ((AxisIndex >= GuiConst_GRAPH_AXES_MAX) ||
+      (AxisIndex >= sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_Y]))
+    return (0);
+  else
+  {
+    AxisIndex1 = AxisIndex;
+    AxisIndex2 = AxisIndex;
+  }
+
+  for (I = AxisIndex1; I <= AxisIndex2; I++)
+  {
+    sgl.GraphAry[GraphIndex].GraphAxes[I][GuiLib_GRAPHAXIS_Y].NumbersMinValue += Offset;
+    sgl.GraphAry[GraphIndex].GraphAxes[I][GuiLib_GRAPHAXIS_Y].NumbersMaxValue += Offset;
+  }
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Graph_Redraw(
+   GuiConst_INT8U GraphIndex)
+{
+  GuiConst_INT16S I;
+
+  if ((GraphIndex >= GuiConst_GRAPH_MAX) ||
+      (sgl.GraphAry[GraphIndex].InUse != GuiLib_GRAPH_STRUCTURE_USED))
+    return (0);
+
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+  Graph_SetClipping(GraphIndex);
+#endif
+
+  GuiLib_Graph_DrawAxes(GraphIndex);
+
+  for (I = sgl.GraphAry[GraphIndex].GraphDataSetCnt - 1; I >= 0; I--)
+    GuiLib_Graph_DrawDataSet(GraphIndex, I);
+
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+  Graph_ResetClipping();
+#endif
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Graph_DrawAxes(
+   GuiConst_INT8U GraphIndex)
+{
+  GuiConst_INT16S I;
+
+  if ((GraphIndex >= GuiConst_GRAPH_MAX) ||
+      (sgl.GraphAry[GraphIndex].InUse != GuiLib_GRAPH_STRUCTURE_USED))
+    return (0);
+
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+  Graph_SetClipping(GraphIndex);
+#endif
+
+  if (!(sgl.GraphAry[GraphIndex].GraphItem.TextPar[0].BitFlags &
+        GuiLib_BITFLAG_TRANSPARENT))
+    GuiLib_FillBox(sgl.GraphAry[GraphIndex].GraphItem.X1,
+                   sgl.GraphAry[GraphIndex].GraphItem.Y1,
+                   sgl.GraphAry[GraphIndex].GraphItem.X2,
+                   sgl.GraphAry[GraphIndex].GraphItem.Y2,
+                   sgl.GraphAry[GraphIndex].GraphItem.BackColor);
+
+  for (I = sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_X] - 1;
+       I >= 0; I--)
+    if (sgl.GraphAry[GraphIndex].GraphAxes[I][GuiLib_GRAPHAXIS_X].Visible)
+      Graph_DrawXAxis(GraphIndex, I);
+
+  for (I = sgl.GraphAry[GraphIndex].GraphAxesCnt[GuiLib_GRAPHAXIS_Y] - 1;
+       I >= 0; I--)
+    if (sgl.GraphAry[GraphIndex].GraphAxes[I][GuiLib_GRAPHAXIS_Y].Visible)
+      Graph_DrawYAxis(GraphIndex, I);
+
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+  Graph_ResetClipping();
+#endif
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Graph_DrawDataSet(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8U DataSetIndex)
+{
+  if ((GraphIndex >= GuiConst_GRAPH_MAX) ||
+      (sgl.GraphAry[GraphIndex].InUse != GuiLib_GRAPH_STRUCTURE_USED))
+    return (0);
+  if ((DataSetIndex >= GuiConst_GRAPH_DATASETS_MAX) ||
+      (DataSetIndex >= sgl.GraphAry[GraphIndex].GraphDataSetCnt))
+    return (0);
+  if (!sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].Visible)
+    return (0);
+  if (sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataSize == 0)
+    return (0);
+
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+  Graph_SetClipping(GraphIndex);
+#endif
+
+  Graph_DrawDataSet(GraphIndex, DataSetIndex);
+
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+  Graph_ResetClipping();
+#endif
+
+  return (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_Graph_DrawDataPoint(
+   GuiConst_INT8U GraphIndex,
+   GuiConst_INT8U DataSetIndex,
+   GuiConst_INT16U DataIndex)
+{
+  GuiConst_INT16S Y;
+  GuiConst_INT16S DX, DY;
+  GuiConst_INT16S LastDX, LastDY;
+  GuiConst_INT32S TX, TY;
+
+  if ((GraphIndex >= GuiConst_GRAPH_MAX) ||
+      (sgl.GraphAry[GraphIndex].InUse != GuiLib_GRAPH_STRUCTURE_USED))
+    return (0);
+  if ((DataSetIndex >= GuiConst_GRAPH_DATASETS_MAX) ||
+      (DataSetIndex >= sgl.GraphAry[GraphIndex].GraphDataSetCnt))
+    return (0);
+  if (sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataSize == 0)
+    return (0);
+  if (!sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].Visible)
+    return (0);
+  if (DataIndex >= sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataCount)
+    return (0);
+
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+  Graph_SetClipping(GraphIndex);
+#endif
+
+  Graph_CalcScaleX(GraphIndex,
+                   sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].AxisIndexX);
+  Graph_CalcScaleY(GraphIndex,
+                   sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].AxisIndexY);
+
+  TX = sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataPtr[DataIndex].X;
+  TY = sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataPtr[DataIndex].Y;
+  DX = sgl.GraphAry[GraphIndex].OrigoX + ((TX -
+       sgl.GraphAry[GraphIndex].GraphAxes[
+       sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].AxisIndexX]
+       [GuiLib_GRAPHAXIS_X].NumbersMinValue) *
+       sgl.GraphAry[GraphIndex].GraphAxes[
+       sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].AxisIndexX]
+       [GuiLib_GRAPHAXIS_X].Scale) / 10000;
+  DY = sgl.GraphAry[GraphIndex].OrigoY - ((TY -
+       sgl.GraphAry[GraphIndex].GraphAxes[
+       sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].AxisIndexY]
+       [GuiLib_GRAPHAXIS_Y].NumbersMinValue) *
+       sgl.GraphAry[GraphIndex].GraphAxes[
+       sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].AxisIndexY]
+       [GuiLib_GRAPHAXIS_Y].Scale) / 10000;
+  if (sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].Representation ==
+      GuiLib_GRAPH_DATATYPE_LINE)
+  {
+    if (DataIndex == 0)
+      DataIndex = sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataCount - 1;
+    else
+      DataIndex--;
+
+    TX =
+       sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataPtr[DataIndex].X;
+    TY =
+       sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].DataPtr[DataIndex].Y;
+    LastDX = sgl.GraphAry[GraphIndex].OrigoX + ((TX -
+            sgl.GraphAry[GraphIndex].GraphAxes[
+            sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].AxisIndexX]
+            [GuiLib_GRAPHAXIS_X].NumbersMinValue) *
+            sgl.GraphAry[GraphIndex].GraphAxes[
+            sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].AxisIndexX]
+            [GuiLib_GRAPHAXIS_X].Scale) / 10000;
+    LastDY = sgl.GraphAry[GraphIndex].OrigoY - ((TY -
+             sgl.GraphAry[GraphIndex].GraphAxes[
+             sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].AxisIndexY]
+             [GuiLib_GRAPHAXIS_Y].NumbersMinValue) *
+             sgl.GraphAry[GraphIndex].GraphAxes[
+             sgl.GraphAry[GraphIndex].GraphDataSets[DataSetIndex].AxisIndexY]
+             [GuiLib_GRAPHAXIS_Y].Scale) / 10000;
+  }
+  else
+  {
+    LastDX = DX;
+    LastDY = DY;
+  }
+
+  Graph_DrawDataPoint(
+     GraphIndex,
+     DataSetIndex,
+     DataIndex,
+     DX, DY,
+     LastDX, LastDY);
+
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+  Graph_ResetClipping();
+#endif
+
+  return (1);
+}
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+#endif // GuiConst_ITEM_GRAPH_INUSE
+
+#ifdef GuiConst_ITEM_GRAPHICS_LAYER_FILTER_INUSE
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+static GuiConst_INT16S IndexOfGraphicsLayer(
+   GuiConst_INT16S GraphicsLayerIndex)
+{
+  GuiConst_INT16S I;
+
+  if (GraphicsLayerIndex == GuiLib_GRAPHICS_LAYER_BASE)
+    return(GuiLib_GRAPHICS_LAYER_BASE);
+  else if (GraphicsLayerIndex == GuiLib_GRAPHICS_LAYER_PREVIOUS)
+  {
+    if (sgl.GraphicsLayerLifoCnt <= 1)
+      return(GuiLib_GRAPHICS_LAYER_BASE);
+    else
+      return(sgl.GraphicsLayerLifo[sgl.GraphicsLayerLifoCnt - 2]);
+  }
+  else if (GraphicsLayerIndex == GuiLib_GRAPHICS_LAYER_CURRENT)
+  {
+    if (sgl.GraphicsLayerLifoCnt > 0)
+      return(sgl.GraphicsLayerLifo[sgl.GraphicsLayerLifoCnt - 1]);
+    else
+      return(GuiLib_GRAPHICS_LAYER_BASE);
+  }
+  else if (GraphicsLayerIndex < 0)
+    return(GuiLib_GRAPHICS_LAYER_BASE);
+  else if (sgl.GraphicsLayerLifoCnt <= 1)
+    return(GuiLib_GRAPHICS_LAYER_BASE);
+  for (I = 0; I < sgl.GraphicsLayerLifoCnt; I++)
+    if (sgl.GraphicsLayerLifo[I] == GraphicsLayerIndex)
+      return(GraphicsLayerIndex);
+  return(GuiLib_GRAPHICS_LAYER_BASE);
+}
+
+//------------------------------------------------------------------------------
+static GuiConst_INT8U GraphicsLayer_Push(
+   GuiConst_INT8U GraphicsLayerIndex)
+{
+  GuiConst_INT16S I;
+
+  if (GraphicsLayerIndex >= GuiConst_GRAPHICS_LAYER_MAX)
+    return(0);
+  if (sgl.GraphicsLayerList[GraphicsLayerIndex].InUse != GuiLib_GRAPHICS_LAYER_USED)
+    return(0);
+  if (sgl.GraphicsLayerLifoCnt == GuiConst_GRAPHICS_LAYER_MAX)
+    return(0);
+  for (I = 0; I < sgl.GraphicsLayerLifoCnt; I++)
+    if (sgl.GraphicsLayerLifo[I] == GraphicsLayerIndex)
+      return(0);
+
+  sgl.GraphicsLayerLifo[sgl.GraphicsLayerLifoCnt] = GraphicsLayerIndex;
+  sgl.GraphicsLayerLifoCnt++;
+  sgl.GraphicsLayerList[GraphicsLayerIndex].BaseAddress =
+   &sgl.LayerBuf[(GuiConst_INT32U)ReadWord(
+   GuiStruct_GraphicsLayerOfs[GraphicsLayerIndex])];
+
+  sgl.CurLayerBufPtr = sgl.GraphicsLayerList[GraphicsLayerIndex].BaseAddress;
+  sgl.CurLayerLineSize = sgl.GraphicsLayerList[GraphicsLayerIndex].LineSize;
+  sgl.CurLayerWidth = sgl.GraphicsLayerList[GraphicsLayerIndex].Width;
+  sgl.CurLayerHeight = sgl.GraphicsLayerList[GraphicsLayerIndex].Height;
+  sgl.CurLayerBytes =
+     sgl.GraphicsLayerList[GraphicsLayerIndex].Height *
+     sgl.GraphicsLayerList[GraphicsLayerIndex].LineSize;
+  sgl.BaseLayerDrawing = 0;
+
+  return(1);
+}
+
+//------------------------------------------------------------------------------
+static GuiConst_INT8U GraphicsLayer_Pop(
+   GuiConst_INT16S GraphicsLayerIndex)
+{
+  GuiConst_INT16S I;
+
+  if (GraphicsLayerIndex == GuiLib_GRAPHICS_LAYER_BASE)
+    sgl.GraphicsLayerLifoCnt = 0;
+  else if ((GraphicsLayerIndex == GuiLib_GRAPHICS_LAYER_PREVIOUS) &&
+           (sgl.GraphicsLayerLifoCnt > 0))
+  {
+    sgl.GraphicsLayerLifoCnt--;
+    GraphicsLayerIndex = sgl.GraphicsLayerLifo[sgl.GraphicsLayerLifoCnt - 1];
+  }
+  else if (GraphicsLayerIndex < 0)
+    return(0);
+  else if (sgl.GraphicsLayerLifoCnt <= 1)
+    return(0);
+  else
+  {
+    for (I = sgl.GraphicsLayerLifoCnt - 2; I >= 0; I--)
+      if (sgl.GraphicsLayerLifo[I] == GraphicsLayerIndex)
+      {
+        sgl.GraphicsLayerLifoCnt = I + 1;
+        break;
+      }
+    if (I == -1)
+      return(0);
+  }
+
+  if (sgl.GraphicsLayerLifoCnt == 0)
+    ResetLayerBufPtr();
+  else
+  {
+    sgl.CurLayerBufPtr = sgl.GraphicsLayerList[GraphicsLayerIndex].BaseAddress;
+    sgl.CurLayerLineSize = sgl.GraphicsLayerList[GraphicsLayerIndex].LineSize;
+    sgl.CurLayerWidth = sgl.GraphicsLayerList[GraphicsLayerIndex].Width;
+    sgl.CurLayerHeight = sgl.GraphicsLayerList[GraphicsLayerIndex].Height;
+    sgl.CurLayerBytes =
+       sgl.GraphicsLayerList[GraphicsLayerIndex].Height *
+       sgl.GraphicsLayerList[GraphicsLayerIndex].LineSize;
+    sgl.BaseLayerDrawing = 0;
+  }
+
+  return(1);
+}
+
+//------------------------------------------------------------------------------
+static void GraphicsLayer_Copy(
+   GuiConst_INT8U *DestAddress,
+   GuiConst_INT16U DestLineSize,
+   GuiConst_INT16S DestX,
+   GuiConst_INT16S DestY,
+   GuiConst_INT8U *SourceAddress,
+   GuiConst_INT16U SourceLineSize,
+   GuiConst_INT16S SourceX,
+   GuiConst_INT16S SourceY,
+   GuiConst_INT16U Width,
+   GuiConst_INT16U Height)
+{
+  GuiConst_INT16S LineSize;
+
+  SourceAddress +=
+     SourceY * SourceLineSize + GuiConst_PIXEL_BYTE_SIZE * SourceX;
+  DestAddress += DestY * DestLineSize + GuiConst_PIXEL_BYTE_SIZE * DestX;
+  LineSize = GuiConst_PIXEL_BYTE_SIZE * Width;
+  while (Height > 0)
+  {
+    memcpy(DestAddress, SourceAddress, LineSize);
+    SourceAddress += SourceLineSize;
+    DestAddress += DestLineSize;
+    Height--;
+  }
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_GraphicsFilter_Init(
+   GuiConst_INT8U GraphicsFilterIndex,
+   void (*FilterFuncPtr)
+     (GuiConst_INT8U *DestAddress,
+      GuiConst_INT16U DestLineSize,
+      GuiConst_INT8U *SourceAddress,
+      GuiConst_INT16U SourceLineSize,
+      GuiConst_INT16U Width,
+      GuiConst_INT16U Height,
+      GuiConst_INT32S FilterPars[10]))
+{
+  if (GraphicsFilterIndex >= GuiConst_GRAPHICS_FILTER_MAX)
+    return (0);
+
+  sgl.GraphicsFilterList[GraphicsFilterIndex].GraphicsFilterFunc = FilterFuncPtr;
+
+  return (1);
+}
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+#endif // GuiConst_ITEM_GRAPHICS_LAYER_FILTER_INUSE
+
+#ifdef GuiConst_TEXTBOX_FIELDS_ON
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+GuiConst_INT16S *TextBox_Scroll_GetPosRec(GuiConst_INT8U TextBoxIndex)
+{
+  GuiConst_INT16S I;
+  GuiConst_INT16S *result = NULL;
+
+  for (I=0;I<GuiConst_TEXTBOX_FIELDS_MAX;I++)
+  {
+    if (sgl.TextBoxScrollPositions[I].index == TextBoxIndex)
+    {
+      result = &sgl.TextBoxScrollPositions[I].pos;
+      break;
+    }
+  }
+
+  return result;
+}
+//------------------------------------------------------------------------------
+static GuiConst_INT16S TextBox_Scroll_CalcEndPos(
+   GuiLib_ItemRec PrefixLocate *TextBoxItem,
+   GuiConst_INT8U PerLine)
+{
+  GuiConst_INT16S H;
+
+  H = TextBoxItem->Y2 -
+      TextBoxItem->Y1 + 1;
+  if (PerLine)
+    return (TextBoxItem->CompPars.CompTextBox.LineDist *
+       (TextBoxItem->CompPars.CompTextBox.Lines -
+       (H / TextBoxItem->CompPars.CompTextBox.LineDist)));
+  else
+    return (TextBoxItem->CompPars.CompTextBox.Lines *
+       TextBoxItem->CompPars.CompTextBox.LineDist - H);
+}
+#endif // GuiConst_TEXTBOX_FIELDS_ON
+
+//------------------------------------------------------------------------------
+static GuiConst_INT8U TextBox_Scroll_To(
+   GuiConst_INT8U TextBoxIndex,
+   GuiConst_INT16S NewPos,
+   GuiConst_INT8U PerLine,
+   GuiConst_INT8U AbsoluteMove)
+{
+#ifdef GuiConst_TEXTBOX_FIELDS_ON
+  GuiLib_ItemRec PrefixLocate *TextBoxItem;
+  GuiConst_INT16S TextBox;
+  GuiConst_INT16S PrefixLocate *ScrollPos;
+
+  TextBox = AutoRedraw_GetTextBox(TextBoxIndex, -1);
+
+  if (TextBox == -1)
+    return (0);
+
+  TextBoxItem = AutoRedraw_GetItem(TextBox);
+
+  if (TextBoxItem == NULL)
+    return (0);
+  else
+  {
+    ScrollPos = TextBox_Scroll_GetPosRec(TextBoxIndex);
+
+    if (ScrollPos == NULL)
+      return (0);
+
+    if (PerLine)
+      NewPos *= TextBoxItem->CompPars.CompTextBox.LineDist;
+
+    switch (AbsoluteMove)
+    {
+      case 0:
+        *ScrollPos += NewPos;
+        break;
+
+      case 1:
+        *ScrollPos = NewPos;
+        break;
+
+      case 2:
+        *ScrollPos = TextBox_Scroll_CalcEndPos(TextBoxItem, PerLine);
+        break;
+    }
+
+    TextBoxItem->CompPars.CompTextBox.ScrollPos = *ScrollPos;
+
+    memcpy(&sgl.CurItem, TextBoxItem, sizeof(GuiLib_ItemRec));
+
+    GuiDisplay_Lock();
+
+    sgl.DisplayLevel = 0;
+    sgl.SwapColors = 0;
+    DrawItem(GuiLib_COL_INVERT_OFF);
+
+    GuiDisplay_Unlock();
+    return (1);
+  }
+#else
+  gl.Dummy1_8U = TextBoxIndex;   // To avoid compiler warning
+  gl.Dummy1_16S = NewPos;   // To avoid compiler warning
+  gl.Dummy2_8U = PerLine;   // To avoid compiler warning
+  gl.Dummy3_8U = AbsoluteMove;   // To avoid compiler warning
+  return (0);
+#endif
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_TextBox_Scroll_Up(
+   GuiConst_INT8U TextBoxIndex)
+{
+  return (TextBox_Scroll_To(TextBoxIndex, -1, 1, 0));
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_TextBox_Scroll_Down(
+   GuiConst_INT8U TextBoxIndex)
+{
+  return (TextBox_Scroll_To(TextBoxIndex, 1, 1, 0));
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_TextBox_Scroll_Home(
+   GuiConst_INT8U TextBoxIndex)
+{
+  return (TextBox_Scroll_To(TextBoxIndex, 0, 1, 1));
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_TextBox_Scroll_End(
+   GuiConst_INT8U TextBoxIndex)
+{
+  return (TextBox_Scroll_To(TextBoxIndex, 0, 1, 2));
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_TextBox_Scroll_To_Line(
+   GuiConst_INT8U TextBoxIndex,
+   GuiConst_INT16S NewLine)
+{
+  return (TextBox_Scroll_To(TextBoxIndex, NewLine, 1, 1));
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_TextBox_Scroll_Up_Pixel(
+   GuiConst_INT8U TextBoxIndex)
+{
+  return (TextBox_Scroll_To(TextBoxIndex, -1, 0, 0));
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_TextBox_Scroll_Down_Pixel(
+   GuiConst_INT8U TextBoxIndex)
+{
+  return (TextBox_Scroll_To(TextBoxIndex, 1, 0, 0));
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_TextBox_Scroll_Home_Pixel(
+   GuiConst_INT8U TextBoxIndex)
+{
+  return (TextBox_Scroll_To(TextBoxIndex, 0, 0, 1));
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_TextBox_Scroll_End_Pixel(
+   GuiConst_INT8U TextBoxIndex)
+{
+  return (TextBox_Scroll_To(TextBoxIndex, 0, 0, 2));
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_TextBox_Scroll_To_PixelLine(
+   GuiConst_INT8U TextBoxIndex,
+   GuiConst_INT16S NewPixelLine)
+{
+  return (TextBox_Scroll_To(TextBoxIndex, NewPixelLine, 0, 1));
+}
+
+//------------------------------------------------------------------------------
+static GuiConst_INT8U TextBox_Scroll_Get_Pos(
+   GuiConst_INT8U TextBoxIndex,
+   GuiConst_INT8U PerLine)
+{
+#ifdef GuiConst_TEXTBOX_FIELDS_ON
+  GuiConst_INT16S P;
+  GuiLib_ItemRec PrefixLocate*TextBoxItem;
+  GuiConst_INT16S TextBox;
+  GuiConst_INT16S PrefixLocate *ScrollPos;
+
+  TextBox = AutoRedraw_GetTextBox(TextBoxIndex, -1);
+
+  if (TextBox == -1)
+    return (GuiLib_TEXTBOX_SCROLL_ILLEGAL_NDX);
+
+  TextBoxItem = AutoRedraw_GetItem(TextBox);
+
+  if (TextBoxItem == NULL)
+    return (GuiLib_TEXTBOX_SCROLL_ILLEGAL_NDX);
+
+  ScrollPos = TextBox_Scroll_GetPosRec(TextBoxIndex);
+
+  if (ScrollPos == NULL)
+    return (GuiLib_TEXTBOX_SCROLL_ILLEGAL_NDX);
+
+  P = TextBox_Scroll_CalcEndPos(TextBoxItem, PerLine);
+  if (*ScrollPos == 0)
+    return (GuiLib_TEXTBOX_SCROLL_AT_HOME);
+  else if (*ScrollPos == P)
+    return (GuiLib_TEXTBOX_SCROLL_AT_END);
+  else if (*ScrollPos < 0)
+    return (GuiLib_TEXTBOX_SCROLL_ABOVE_HOME);
+  else if (*ScrollPos > P)
+    return (GuiLib_TEXTBOX_SCROLL_BELOW_END);
+  else
+    return (GuiLib_TEXTBOX_SCROLL_INSIDE_BLOCK);
+
+#else
+  gl.Dummy1_8U = TextBoxIndex;   // To avoid compiler warning
+  gl.Dummy2_8U = PerLine;   // To avoid compiler warning
+  return (GuiLib_TEXTBOX_SCROLL_ILLEGAL_NDX);
+#endif
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_TextBox_Scroll_Get_Pos(
+   GuiConst_INT8U TextBoxIndex)
+{
+  return (TextBox_Scroll_Get_Pos(TextBoxIndex, 1));
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_TextBox_Scroll_Get_Pos_Pixel(
+   GuiConst_INT8U TextBoxIndex)
+{
+  return (TextBox_Scroll_Get_Pos(TextBoxIndex, 0));
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_TextBox_Scroll_FitsInside(
+   GuiConst_INT8U TextBoxIndex)
+{
+#ifdef GuiConst_TEXTBOX_FIELDS_ON
+  GuiLib_ItemRec PrefixLocate *TextBoxItem;
+  GuiConst_INT16S TextBox;
+  GuiConst_INT16S PrefixLocate *ScrollPos;
+
+  TextBox = AutoRedraw_GetTextBox(TextBoxIndex, -1);
+
+  if (TextBox == -1)
+    return (0);
+
+  TextBoxItem = AutoRedraw_GetItem(TextBox);
+
+  if (TextBoxItem == NULL)
+    return (0);
+
+  return (TextBox_Scroll_CalcEndPos(TextBoxItem, 0) < 0);
+#else
+  gl.Dummy1_8U = TextBoxIndex;   // To avoid compiler warning
+  return (0);
+#endif
+}
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+GuiConst_INTCOLOR GuiLib_SetButtonDisabledColor(GuiConst_INTCOLOR PixelColor)
+{
+#ifdef GuiConst_ITEM_BUTTON_INUSE
+  sgl.ButtonColorOverride = GuiLib_TRUE;
+  sgl.DisabledButtonColor = PixelColor;
+#endif
+
+  return PixelColor;
+}
+//------------------------------------------------------------------------------
+