Single Photo displayed on LPC4088

Dependencies:   DMBasicGUI DMSupport

Revision:
0:9140ec6aa604
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/easyGUIFixed/GuiLib.c	Fri Jul 28 14:19:12 2017 +0000
@@ -0,0 +1,4965 @@
+/* ************************************************************************ */
+/*                                                                          */
+/*                     (C)2004-2015 IBIS Solutions ApS                      */
+/*                            sales@easyGUI.com                             */
+/*                             www.easyGUI.com                              */
+/*                                                                          */
+/*                               v6.0.9.005                                 */
+/*                                                                          */
+/* ************************************************************************ */
+
+
+
+//------------------------------------------------------------------------------
+
+#include "GuiConst.h"
+#include "GuiLib.h"
+#include "GuiLibStruct.h"
+#ifdef GuiConst_VNC_REMOTE_SUPPORT_ON
+#include "GuiVnc.h"
+#endif
+#include <string.h>
+#include <stdlib.h>
+
+#ifndef GuiConst_PC_V6_0_9
+If your compiler sees this text you are using a wrong version of the easyGUI
+library. Version numbers of the easyGUI PC application and c library must match.
+Only exception is GuiDisplay.c/h (your display driver), which can be kept from
+version to version.
+#endif
+
+#define WANT_DOUBLE_BUFFERING // Also in GuiGraph16.h, GuiDisplay.c - *** all three must match ***
+
+
+#define GuiLib_CHR_PSLEFT_OFS              0
+#define GuiLib_CHR_PSRIGHT_OFS             5
+#define GuiLib_CHR_XLEFT_OFS               10
+#define GuiLib_CHR_XWIDTH_OFS              11
+#define GuiLib_CHR_YTOP_OFS                12
+#define GuiLib_CHR_YHEIGHT_OFS             13
+#define GuiLib_CHR_LINECTRL_OFS            14
+#define GuiLib_CHR_PS_TOP_OFS              0
+#define GuiLib_CHR_PS_MID_OFS              1
+#define GuiLib_CHR_PS_MIDBASE_OFS          2
+#define GuiLib_CHR_PS_BASE_OFS             3
+#define GuiLib_CHR_PS_BOTTOM_OFS           4
+
+
+
+#ifdef GuiConst_ARAB_CHARS_INUSE
+#define GuiLib_ARAB_LIGATURES_CNT          4
+const GuiConst_INT16U GuiLib_ARAB_LIGATURES[GuiLib_ARAB_LIGATURES_CNT][3] =
+   {{0x0644, 0x0622, 0xFEF5},
+    {0x0644, 0x0623, 0xFEF7},
+    {0x0644, 0x0625, 0xFEF9},
+    {0x0644, 0x0627, 0xFEFB}};
+
+#define GuiLib_ARAB_CHAR_PRI_MIN           0x0622
+#define GuiLib_ARAB_CHAR_PRI_MAX           0x06D6
+#define GuiLib_ARAB_CHAR_SEC_MIN           0xFB50
+#define GuiLib_ARAB_CHAR_SEC_MAX           0xFEF4
+#define GuiLib_ARAB_CHAR_TYPE_ISO          0
+#define GuiLib_ARAB_CHAR_TYPE_FIN          1
+#define GuiLib_ARAB_CHAR_TYPE_INI          2
+#define GuiLib_ARAB_CHAR_TYPE_MED          3
+#define GuiLib_ARAB_CHAR_ISOFIN            0x02
+#define GuiLib_ARAB_CHAR_ISOFININIMED      0x04
+#define GuiLib_ARAB_CHAR_DIACRITIC         0x0A
+#define GuiLib_ARAB_CHAR_CONVERT_CNT       83
+
+const GuiConst_INT16U GuiLib_ARAB_CHAR_CONVERT[GuiLib_ARAB_CHAR_CONVERT_CNT][3] =
+   {{0x0622, 0xFE81, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x0623, 0xFE83, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x0624, 0xFE85, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x0625, 0xFE87, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x0626, 0xFE89, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0627, 0xFE8D, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x0628, 0xFE8F, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0629, 0xFE93, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x062A, 0xFE95, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x062B, 0xFE99, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x062C, 0xFE9D, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x062D, 0xFEA1, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x062E, 0xFEA5, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x062F, 0xFEA9, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x0630, 0xFEAB, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x0631, 0xFEAD, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x0632, 0xFEAF, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x0633, 0xFEB1, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0634, 0xFEB5, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0635, 0xFEB9, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0636, 0xFEBD, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0637, 0xFEC1, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0638, 0xFEC5, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0639, 0xFEC9, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x063A, 0xFECD, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0641, 0xFED1, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0642, 0xFED5, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0643, 0xFED9, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0644, 0xFEDD, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0645, 0xFEE1, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0646, 0xFEE5, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0647, 0xFEE9, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0648, 0xFEED, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x0649, 0xFEEF, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x064A, 0xFEF1, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x064E, 0xFE76, GuiLib_ARAB_CHAR_DIACRITIC},
+    {0x064F, 0xFE78, GuiLib_ARAB_CHAR_DIACRITIC},
+    {0x0650, 0xFE7A, GuiLib_ARAB_CHAR_DIACRITIC},
+    {0x0651, 0xFE7C, GuiLib_ARAB_CHAR_DIACRITIC},
+    {0x0652, 0xFE7E, GuiLib_ARAB_CHAR_DIACRITIC},
+    {0x0671, 0xFB50, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x0679, 0xFB66, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x067A, 0xFB5E, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x067B, 0xFB52, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x067E, 0xFB56, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x067F, 0xFB62, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0680, 0xFB5A, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0683, 0xFB76, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0684, 0xFB72, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0686, 0xFB7A, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0687, 0xFB7E, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x0688, 0xFB88, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x068C, 0xFB84, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x068D, 0xFB82, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x068E, 0xFB86, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x0691, 0xFB8C, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x0698, 0xFB8A, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x06A4, 0xFB6A, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x06A6, 0xFB6E, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x06A9, 0xFB8E, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x06AD, 0xFBD3, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x06AF, 0xFB92, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x06B1, 0xFB9A, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x06B3, 0xFB96, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x06BA, 0xFB9E, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x06BB, 0xFBA0, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x06BE, 0xFBAA, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x06C0, 0xFBA4, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x06C1, 0xFBA6, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x06C5, 0xFBE0, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x06C6, 0xFBD9, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x06C7, 0xFBD7, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x06C8, 0xFBDB, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x06C9, 0xFBE2, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x06CB, 0xFBDE, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x06CC, 0xFBFC, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x06D0, 0xFBE4, GuiLib_ARAB_CHAR_ISOFININIMED},
+    {0x06D2, 0xFBAE, GuiLib_ARAB_CHAR_ISOFIN},
+    {0x06D3, 0xFBB0, GuiLib_ARAB_CHAR_ISOFIN},
+    {     0, 0xFEF5, GuiLib_ARAB_CHAR_ISOFIN},
+    {     0, 0xFEF7, GuiLib_ARAB_CHAR_ISOFIN},
+    {     0, 0xFEF9, GuiLib_ARAB_CHAR_ISOFIN},
+    {     0, 0xFEFB, GuiLib_ARAB_CHAR_ISOFIN}};
+#endif
+
+//------------------------------------------------------------------------------
+//----------------------X-----------------------
+
+GuiLib_DisplayLineRec GuiLib_DisplayRepaint[GuiConst_BYTE_LINES];
+#ifdef GuiConst_VNC_REMOTE_SUPPORT_ON
+GuiLib_DisplayLineRec GuiLib_VncRepaint[GuiConst_BYTE_LINES];
+#endif // GuiConst_VNC_REMOTE_SUPPORT_ON
+
+#ifdef GuiConst_REMOTE_DATA
+void (*GuiLib_RemoteDataReadBlock) (
+      GuiConst_INT32U SourceOffset,
+      GuiConst_INT32U SourceSize,
+      GuiConst_INT8U * TargetAddr);
+#endif // GuiConst_REMOTE_DATA
+#ifdef GuiConst_REMOTE_TEXT_DATA
+void (*GuiLib_RemoteTextReadBlock) (
+      GuiConst_INT32U SourceOffset,
+      GuiConst_INT32U SourceSize,
+      void * TargetAddr);
+#endif // GuiConst_REMOTE_TEXT_DATA
+
+#ifdef GuiConst_CURSOR_SUPPORT_ON
+GuiConst_INT16S GuiLib_ActiveCursorFieldNo;
+#endif
+#ifdef GuiConst_ALLOW_UPSIDEDOWN_AT_RUNTIME
+GuiConst_INT8U GuiLib_DisplayUpsideDown;
+#endif
+
+GuiConst_INT16S GuiLib_CurStructureNdx;
+GuiConst_INT16S GuiLib_LanguageIndex;
+
+PrefixLocate GuiLib_GLOBAL gl;
+static PrefixLocate GuiLib_STATIC sgl;
+
+
+//==============================================================================
+#ifdef GuiConst_ALLOW_UPSIDEDOWN_AT_RUNTIME
+  #define GuiLib_COORD_ADJUST(X, Y)                                            \
+  {                                                                            \
+    if (GuiLib_DisplayUpsideDown)                                              \
+    {                                                                          \
+      X = GuiConst_DISPLAY_WIDTH_HW - 1 - sgl.CoordOrigoX - X;                 \
+      Y = GuiConst_DISPLAY_HEIGHT_HW - 1 - sgl.CoordOrigoY - Y;                \
+    }                                                                          \
+    else                                                                       \
+    {                                                                          \
+      X = sgl.CoordOrigoX + X;                                                 \
+      Y = sgl.CoordOrigoY + Y;                                                 \
+    }                                                                          \
+  }
+
+  #define GuiLib_MIRROR_BITS(B)                                                \
+  {                                                                            \
+    B = (((B & 0x80) >> 7) | ((B & 0x40) >> 5) |                               \
+         ((B & 0x20) >> 3) | ((B & 0x10) >> 1) |                               \
+         ((B & 0x08) << 1) | ((B & 0x04) << 3) |                               \
+         ((B & 0x02) << 5) | ((B & 0x01) << 7));                               \
+  }
+#else
+  #ifdef GuiConst_ROTATED_OFF
+    #ifdef GuiConst_MIRRORED_HORIZONTALLY
+      #ifdef GuiConst_MIRRORED_VERTICALLY
+        #define GuiLib_COORD_ADJUST(X, Y)                                      \
+        {                                                                      \
+          X = GuiConst_DISPLAY_WIDTH_HW - 1 - sgl.CoordOrigoX - X;             \
+          Y = GuiConst_DISPLAY_HEIGHT_HW - 1 - sgl.CoordOrigoY - Y;            \
+        }
+      #else
+        #define GuiLib_COORD_ADJUST(X, Y)                                      \
+        {                                                                      \
+          X = GuiConst_DISPLAY_WIDTH_HW - 1 - sgl.CoordOrigoX - X;             \
+          Y = sgl.CoordOrigoY + Y;                                             \
+        }
+      #endif
+    #else
+      #ifdef GuiConst_MIRRORED_VERTICALLY
+        #define GuiLib_COORD_ADJUST(X, Y)                                      \
+        {                                                                      \
+          X = sgl.CoordOrigoX + X;                                             \
+          Y = GuiConst_DISPLAY_HEIGHT_HW - 1 - sgl.CoordOrigoY - Y;            \
+        }
+      #else
+        #define GuiLib_COORD_ADJUST(X, Y)                                      \
+        {                                                                      \
+          X = sgl.CoordOrigoX + X;                                             \
+          Y = sgl.CoordOrigoY + Y;                                             \
+        }
+      #endif
+    #endif
+  #endif
+  #ifdef GuiConst_ROTATED_90DEGREE_RIGHT
+    #ifdef GuiConst_MIRRORED_HORIZONTALLY
+      #ifdef GuiConst_MIRRORED_VERTICALLY
+        #define GuiLib_COORD_ADJUST(X, Y)                                      \
+        {                                                                      \
+          X = sgl.CoordOrigoX + X;                                             \
+          Y = GuiConst_DISPLAY_WIDTH_HW - 1 - sgl.CoordOrigoY - Y;             \
+          SwapCoord(&X, &Y);                                                   \
+        }
+      #else
+        #define GuiLib_COORD_ADJUST(X, Y)                                      \
+        {                                                                      \
+          X = sgl.CoordOrigoX + X;                                             \
+          Y = sgl.CoordOrigoY + Y;                                             \
+          SwapCoord(&X, &Y);                                                   \
+        }
+      #endif
+    #else
+      #ifdef GuiConst_MIRRORED_VERTICALLY
+        #define GuiLib_COORD_ADJUST(X, Y)                                      \
+        {                                                                      \
+          X = GuiConst_DISPLAY_HEIGHT_HW - 1 - sgl.CoordOrigoX - X;            \
+          Y = GuiConst_DISPLAY_WIDTH_HW - 1 - sgl.CoordOrigoY - Y;             \
+          SwapCoord(&X, &Y);                                                   \
+        }
+      #else
+        #define GuiLib_COORD_ADJUST(X, Y)                                      \
+        {                                                                      \
+          X = GuiConst_DISPLAY_HEIGHT_HW - 1 - sgl.CoordOrigoX - X;            \
+          Y = sgl.CoordOrigoY + Y;                                             \
+          SwapCoord(&X, &Y);                                                   \
+        }
+      #endif
+    #endif
+  #endif
+  #ifdef GuiConst_ROTATED_UPSIDEDOWN
+    #ifdef GuiConst_MIRRORED_HORIZONTALLY
+      #ifdef GuiConst_MIRRORED_VERTICALLY
+        #define GuiLib_COORD_ADJUST(X, Y)                                      \
+        {                                                                      \
+          X = sgl.CoordOrigoX + X;                                             \
+          Y = sgl.CoordOrigoY + Y;                                             \
+        }
+      #else
+        #define GuiLib_COORD_ADJUST(X, Y)                                      \
+        {                                                                      \
+          X = sgl.CoordOrigoX + X;                                             \
+          Y = GuiConst_DISPLAY_HEIGHT_HW - 1 - sgl.CoordOrigoY - Y;            \
+        }
+      #endif
+    #else
+      #ifdef GuiConst_MIRRORED_VERTICALLY
+        #define GuiLib_COORD_ADJUST(X, Y)                                      \
+        {                                                                      \
+          X = GuiConst_DISPLAY_WIDTH_HW - 1 - sgl.CoordOrigoX - X;             \
+          Y = sgl.CoordOrigoY + Y;                                             \
+        }
+      #else
+        #define GuiLib_COORD_ADJUST(X, Y)                                      \
+        {                                                                      \
+          X = GuiConst_DISPLAY_WIDTH_HW - 1 - sgl.CoordOrigoX - X;             \
+          Y = GuiConst_DISPLAY_HEIGHT_HW - 1 - sgl.CoordOrigoY - Y;            \
+        }
+      #endif
+    #endif
+  #endif
+  #ifdef GuiConst_ROTATED_90DEGREE_LEFT
+    #ifdef GuiConst_MIRRORED_HORIZONTALLY
+      #ifdef GuiConst_MIRRORED_VERTICALLY
+        #define GuiLib_COORD_ADJUST(X, Y)                                      \
+        {                                                                      \
+          X = GuiConst_DISPLAY_HEIGHT_HW - 1 - sgl.CoordOrigoX - X;            \
+          Y = sgl.CoordOrigoY + Y;                                             \
+          SwapCoord(&X, &Y);                                                   \
+        }
+      #else
+        #define GuiLib_COORD_ADJUST(X, Y)                                      \
+        {                                                                      \
+          X = GuiConst_DISPLAY_HEIGHT_HW - 1 - sgl.CoordOrigoX - X;            \
+          Y = GuiConst_DISPLAY_WIDTH_HW - 1 - sgl.CoordOrigoY - Y;             \
+          SwapCoord(&X, &Y);                                                   \
+        }
+      #endif
+    #else
+      #ifdef GuiConst_MIRRORED_VERTICALLY
+        #define GuiLib_COORD_ADJUST(X, Y)                                      \
+        {                                                                      \
+          X = sgl.CoordOrigoX + X;                                             \
+          Y = sgl.CoordOrigoY + Y;                                             \
+          SwapCoord(&X, &Y);                                                   \
+        }
+      #else
+        #define GuiLib_COORD_ADJUST(X, Y)                                      \
+        {                                                                      \
+          X = sgl.CoordOrigoX + X;                                             \
+          Y = GuiConst_DISPLAY_WIDTH_HW - 1 - sgl.CoordOrigoY - Y;             \
+          SwapCoord(&X, &Y);                                                   \
+        }
+      #endif
+    #endif
+  #endif
+#endif
+
+#define GuiLib_FONT_MID_Y(BaseLine, TopLine) ((BaseLine - TopLine + 1) / 2)
+
+#ifdef GuiConst_COLOR_DEPTH_1
+#define GuiLib_COLOR_ADJUST(C)  C &= 0x01;
+#endif
+#ifdef GuiConst_COLOR_DEPTH_2
+#define GuiLib_COLOR_ADJUST(C)  C &= 0x03;
+#endif
+#ifdef GuiConst_COLOR_DEPTH_4
+#define GuiLib_COLOR_ADJUST(C)  C &= 0x0F;
+#endif
+#ifdef GuiConst_COLOR_DEPTH_5
+#define GuiLib_COLOR_ADJUST(C)  C = (C & 0x1F) << 3;
+#endif
+#ifndef GuiLib_COLOR_ADJUST
+#define GuiLib_COLOR_ADJUST_TRANSP(C)
+#define GuiLib_COLOR_ADJUST(C)
+#else
+#define GuiLib_COLOR_ADJUST_TRANSP(C) if (C != -1)  GuiLib_COLOR_ADJUST(C)
+#endif
+//----------------------X-----------------------
+#define GuiLib_GET_MIN(A, B) ((A) > (B) ? (B) : (A))
+#define GuiLib_GET_MAX(A, B) ((A) > (B) ? (A) : (B))
+#define GuiLib_GET_MINMAX(X, A, B) ((X) > (A) ? (GuiLib_GET_MIN(X,B)) : (A))
+#define GuiLib_LIMIT_MIN(X, A) if (X < A) X = A
+#define GuiLib_LIMIT_MAX(X, B) if (X > B) X = B
+#define GuiLib_LIMIT_MINMAX(X, A, B)                                           \
+{                                                                              \
+  if (X < A)                                                                   \
+    X = A;                                                                     \
+  else if ((B < A) && (X > A))                                                 \
+    X = A;                                                                     \
+  else if ((B >= A) && (X > B))                                                \
+    X = B;                                                                     \
+}
+
+//==============================================================================
+
+//------------------------------------------------------------------------------
+static GuiConst_INT16S CopyBytes(GuiConst_INT8U *dst, GuiConst_INT8U *src, GuiConst_INT32S size)
+{
+  GuiConst_INT32S i;
+  GuiConst_INT8U *d, *s;
+
+  if (size < 0)
+    return -1;
+
+  if (size > GuiConst_DISPLAY_BYTES)
+    return -1;
+
+  d = (GuiConst_INT8U *)dst;
+  s = (GuiConst_INT8U *)src;
+
+  for (i=0;i<size;i++)
+    *d++ = *s++;
+
+  return 0;
+}
+//------------------------------------------------------------------------------
+static void SwapCoord(
+   GuiConst_INT16S * X1,
+   GuiConst_INT16S * X2)
+{
+  GuiConst_INT16S Tmp;
+
+  Tmp = *X1;
+  *X1 = *X2;
+  *X2 = Tmp;
+}
+
+//------------------------------------------------------------------------------
+static GuiConst_INT8U OrderCoord(
+   GuiConst_INT16S * X1,
+   GuiConst_INT16S * X2)
+{
+  if (*X1 > *X2)
+  {
+    SwapCoord (X1, X2);
+    return (1);
+  }
+  else
+    return (0);
+}
+
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+//------------------------------------------------------------------------------
+static GuiConst_INT8U CheckRect(
+   GuiConst_INT16S * X1,
+   GuiConst_INT16S * Y1,
+   GuiConst_INT16S * X2,
+   GuiConst_INT16S * Y2)
+{
+  if (sgl.ClippingTotal ||
+     (*X1 > sgl.ClippingX2) || (*X2 < sgl.ClippingX1) ||
+     (*Y1 > sgl.ClippingY2) || (*Y2 < sgl.ClippingY1))
+    return (0);
+  else
+  {
+    if (*X1 < sgl.ClippingX1)
+      *X1 = sgl.ClippingX1;
+    if (*X2 > sgl.ClippingX2)
+      *X2 = sgl.ClippingX2;
+    if (*Y1 < sgl.ClippingY1)
+      *Y1 = sgl.ClippingY1;
+    if (*Y2 > sgl.ClippingY2)
+      *Y2 = sgl.ClippingY2;
+    return (1);
+  }
+}
+#endif
+
+//==============================================================================
+
+#ifdef GuiConst_COLOR_DEPTH_1
+  #ifdef GuiConst_BYTE_HORIZONTAL
+    #include "GuiGraph1H.c"
+  #else
+    #include "GuiGraph1V.c"
+  #endif
+#endif
+#ifdef GuiConst_COLOR_DEPTH_2
+  #ifdef GuiConst_BYTE_HORIZONTAL
+    #ifdef GuiConst_COLOR_PLANES_2
+      #include "GuiGraph2H2P.c"
+    #else
+      #include "GuiGraph2H.c"
+    #endif
+  #else
+    #ifdef GuiConst_COLOR_PLANES_2
+      #include "GuiGraph2V2P.c"
+    #else
+      #include "GuiGraph2V.c"
+    #endif
+  #endif
+#endif
+#ifdef GuiConst_COLOR_DEPTH_4
+  #ifdef GuiConst_BYTE_HORIZONTAL
+    #include "GuiGraph4H.c"
+  #else
+    #include "GuiGraph4V.c"
+  #endif
+#endif
+#ifdef GuiConst_COLOR_DEPTH_5
+  #include "GuiGraph5.c"
+#endif
+#ifdef GuiConst_COLOR_DEPTH_8
+  #include "GuiGraph8.c"
+#endif
+#ifdef GuiConst_COLOR_DEPTH_12
+  #include "GuiGraph16.c"
+#endif
+#ifdef GuiConst_COLOR_DEPTH_15
+  #include "GuiGraph16.c"
+#endif
+#ifdef GuiConst_COLOR_DEPTH_16
+  #include "GuiGraph16.h"
+#endif
+#ifdef GuiConst_COLOR_DEPTH_18
+  #include "GuiGraph24.c"
+#endif
+#ifdef GuiConst_COLOR_DEPTH_24
+  #include "GuiGraph24.h"
+#endif
+#ifdef GuiConst_COLOR_DEPTH_32
+  #include "GuiGraph32.c"
+#endif
+
+#include "GuiGraph.h"
+#ifdef GuiConst_ADV_GRAPHICS_ON
+//#include "GuiGraphAdv.c"
+#endif
+
+//==============================================================================
+static void DrawStructure(GuiLib_StructPtr Structure, GuiConst_INT8U ColorInvert) PrefixReentrant;
+
+#ifdef GuiConst_CURSOR_SUPPORT_ON
+static void DrawCursorItem(GuiConst_INT8U CursorVisible);
+#endif
+
+#ifdef GuiConst_ITEM_SCROLLBOX_INUSE
+static void ScrollBox_DrawScrollLine(GuiConst_INT8U ScrollBoxIndex, GuiConst_INT16S LineNdx);
+#endif
+
+#ifdef GuiConst_ITEM_GRAPHICS_LAYER_FILTER_INUSE
+static GuiConst_INT16S IndexOfGraphicsLayer(GuiConst_INT16S GraphicsLayerIndex);
+static GuiConst_INT8U GraphicsLayer_Push(GuiConst_INT8U GraphicsLayerIndex);
+static GuiConst_INT8U GraphicsLayer_Pop(GuiConst_INT16S GraphicsLayerIndex);
+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);
+#endif
+
+//==============================================================================
+
+//------------------------------------------------------------------------------
+static void ResetLayerBufPtr(void)
+{
+#ifdef GuiConst_DISPLAY_BUFFER_EASYGUI
+#ifdef GuiLib_COLOR_UNIT_16
+  sgl.CurLayerBufPtr = &(GuiLib_DisplayBuf.Bytes[0][0]);
+#else
+  #ifdef GuiConst_COLOR_DEPTH_2
+    #ifdef GuiConst_BYTE_HORIZONTAL
+      #ifdef GuiConst_COLOR_PLANES_2
+  sgl.CurLayerBufPtr = &(GuiLib_DisplayBuf[0][0][0]);
+      #else
+  sgl.CurLayerBufPtr = &(GuiLib_DisplayBuf[0][0]);
+      #endif
+    #else // GuiConst_BYTE_HORIZONTAL
+      #ifdef GuiConst_COLOR_PLANES_2
+  sgl.CurLayerBufPtr = &(GuiLib_DisplayBuf[0][0][0]);
+      #else
+  sgl.CurLayerBufPtr = &(GuiLib_DisplayBuf[0][0]);
+      #endif
+    #endif // GuiConst_BYTE_HORIZONTAL
+  #else // GuiConst_COLOR_DEPTH_2
+  sgl.CurLayerBufPtr = &(GuiLib_DisplayBuf[0][0]);
+  #endif // GuiConst_COLOR_DEPTH_2
+#endif // GuiLib_COLOR_UNIT_16
+#else // GuiConst_DISPLAY_BUFFER_EASYGUI
+  sgl.CurLayerBufPtr = 0;
+#endif // GuiConst_DISPLAY_BUFFER_EASYGUI
+
+  sgl.CurLayerLineSize = GuiConst_BYTES_PR_LINE;
+  sgl.CurLayerWidth = GuiConst_DISPLAY_WIDTH_HW;
+  sgl.CurLayerHeight = GuiConst_DISPLAY_HEIGHT_HW;
+  sgl.CurLayerBytes = GuiConst_DISPLAY_BYTES;
+  sgl.BaseLayerDrawing = 1;
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_Init(void)
+{
+  sgl.RefreshClock = 0;
+
+  ResetLayerBufPtr();
+
+  AutoRedraw_Init();
+
+#ifdef GuiConst_DISPLAY_ACTIVE_AREA
+#ifdef GuiConst_DISPLAY_ACTIVE_AREA_COO_REL
+  sgl.DisplayOrigoX = GuiConst_DISPLAY_ACTIVE_AREA_X1;
+  sgl.DisplayOrigoY = GuiConst_DISPLAY_ACTIVE_AREA_Y1;
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+  sgl.DisplayActiveAreaX1 = 0;
+  sgl.DisplayActiveAreaY1 = 0;
+#endif // GuiConst_CLIPPING_SUPPORT_ON
+#ifdef GuiConst_DISPLAY_ACTIVE_AREA_CLIPPING
+  sgl.DisplayActiveAreaX2 =
+     GuiConst_DISPLAY_ACTIVE_AREA_X2 - GuiConst_DISPLAY_ACTIVE_AREA_X1;
+  sgl.DisplayActiveAreaY2 =
+     GuiConst_DISPLAY_ACTIVE_AREA_Y2 - GuiConst_DISPLAY_ACTIVE_AREA_Y1;
+#else // GuiConst_DISPLAY_ACTIVE_AREA_CLIPPING
+  sgl.DisplayActiveAreaX2 =
+     GuiConst_DISPLAY_WIDTH - GuiConst_DISPLAY_ACTIVE_AREA_X1 - 1;
+  sgl.DisplayActiveAreaY2 =
+     GuiConst_DISPLAY_HEIGHT - GuiConst_DISPLAY_ACTIVE_AREA_Y1 - 1;
+#endif // GuiConst_DISPLAY_ACTIVE_AREA_CLIPPING
+#else // GuiConst_DISPLAY_ACTIVE_AREA_COO_REL
+  sgl.DisplayOrigoX = 0;
+  sgl.DisplayOrigoY = 0;
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+#ifdef GuiConst_DISPLAY_ACTIVE_AREA_CLIPPING
+  sgl.DisplayActiveAreaX1 = GuiConst_DISPLAY_ACTIVE_AREA_X1;
+  sgl.DisplayActiveAreaY1 = GuiConst_DISPLAY_ACTIVE_AREA_Y1;
+  sgl.DisplayActiveAreaX2 = GuiConst_DISPLAY_ACTIVE_AREA_X2;
+  sgl.DisplayActiveAreaY2 = GuiConst_DISPLAY_ACTIVE_AREA_Y2;
+#else // GuiConst_DISPLAY_ACTIVE_AREA_CLIPPING
+  sgl.DisplayActiveAreaX1 = 0;
+  sgl.DisplayActiveAreaY1 = 0;
+  sgl.DisplayActiveAreaX2 = GuiConst_DISPLAY_WIDTH - 1;
+  sgl.DisplayActiveAreaY2 = GuiConst_DISPLAY_HEIGHT - 1;
+#endif // GuiConst_DISPLAY_ACTIVE_AREA_CLIPPING
+#endif // GuiConst_CLIPPING_SUPPORT_ON
+#endif // GuiConst_DISPLAY_ACTIVE_AREA_COO_REL
+#else // GuiConst_DISPLAY_ACTIVE_AREA
+  sgl.DisplayOrigoX = 0;
+  sgl.DisplayOrigoY = 0;
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+  sgl.DisplayActiveAreaX1 = 0;
+  sgl.DisplayActiveAreaY1 = 0;
+  sgl.DisplayActiveAreaX2 = GuiConst_DISPLAY_WIDTH - 1;
+  sgl.DisplayActiveAreaY2 = GuiConst_DISPLAY_HEIGHT - 1;
+#endif // GuiConst_CLIPPING_SUPPORT_ON
+#endif // GuiConst_DISPLAY_ACTIVE_AREA
+
+#ifdef GuiConst_ADV_GRAPHICS_ON
+//  GuiLib_AG_Init();
+#endif
+
+  GuiDisplay_Init();
+
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+  GuiLib_ResetClipping();
+#endif
+  GuiLib_ResetDisplayRepaint();
+  GuiLib_Clear();
+
+  sgl.DisplayWriting = 1;
+  sgl.InitialDrawing = 0;
+  sgl.TopLevelStructure = 0;
+  sgl.SwapColors = 0;
+  GuiLib_SetLanguage(0);
+#ifdef GuiConst_BLINK_SUPPORT_ON
+  sgl.BlinkBoxRate = 0;
+#endif
+  sgl.InvertBoxOn = 0;
+  sgl.DrawingLevel = 0;
+  GuiLib_CurStructureNdx = -1;
+#ifdef GuiConst_ITEM_TOUCHAREA_INUSE
+  GuiLib_TouchAdjustReset();
+#endif
+#ifdef GuiConst_ITEM_BUTTON_INUSE
+  sgl.ButtonColorOverride = GuiLib_FALSE;
+  sgl.DisabledButtonColor = 0;
+#endif
+#ifdef GuiConst_REMOTE_DATA
+  GuiLib_RemoteDataReadBlock = 0;
+  #ifdef GuiConst_REMOTE_TEXT_DATA
+  GuiLib_RemoteTextReadBlock = 0;
+  sgl.CurRemoteText = -1;
+  sgl.RemoteTextTableOfs = -1;
+  #endif
+  #ifdef GuiConst_REMOTE_FONT_DATA
+  sgl.CurRemoteFont = -1;
+  #endif
+  #ifdef GuiConst_REMOTE_BITMAP_DATA
+  sgl.CurRemoteBitmap = -1;
+  #endif
+#endif
+
+#ifdef GuiConst_VNC_REMOTE_SUPPORT_ON
+  GuiVnc_Init();
+#endif
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_Clear(void)
+{
+  GuiConst_INT16S I;
+#ifdef GuiConst_ITEM_GRAPHICS_LAYER_FILTER_INUSE
+  GuiConst_INT16S N;
+#endif
+
+  GuiLib_ClearDisplay();
+
+  GuiLib_CurStructureNdx = -1;
+
+  AutoRedraw_Destroy();
+
+#ifdef GuiConst_CURSOR_SUPPORT_ON
+  sgl.CursorInUse = 0;
+  GuiLib_ActiveCursorFieldNo = -1;
+#endif
+#ifdef GuiConst_BLINK_SUPPORT_ON
+#ifndef GuiConst_BLINK_FIELDS_OFF
+  for (I = 0; I < GuiConst_BLINK_FIELDS_MAX; I++)
+  {
+    sgl.BlinkTextItems[I].InUse = 0;
+    sgl.BlinkTextItems[I].Active = 0;
+  }
+#endif
+#endif
+#ifdef GuiConst_ITEM_TOUCHAREA_INUSE
+  sgl.TouchAreaCnt = 0;
+#endif
+
+#ifdef GuiConst_TEXTBOX_FIELDS_ON
+  for (I = 0; I < GuiConst_TEXTBOX_FIELDS_MAX; I++)
+    sgl.TextBoxScrollPositions[I].index = -1;
+#endif
+
+  sgl.LayerOrigoX = 0;
+  sgl.LayerOrigoY = 0;
+
+  sgl.CoordOrigoX = sgl.DisplayOrigoX + sgl.LayerOrigoX;
+  sgl.CoordOrigoY = sgl.DisplayOrigoY + sgl.LayerOrigoY;
+
+#ifdef GuiConst_ITEM_SCROLLBOX_INUSE
+  sgl.NextScrollLineReading = 0;
+  sgl.GlobalScrollBoxIndex = 0;
+  for (I = 0; I < GuiConst_SCROLLITEM_BOXES_MAX; I++)
+  {
+    sgl.ScrollBoxesAry[I].X1 = 0;
+    sgl.ScrollBoxesAry[I].Y1 = 0;
+    sgl.ScrollBoxesAry[I].InUse = GuiLib_SCROLL_STRUCTURE_UNDEF;
+    sgl.ScrollBoxesAry[I].ScrollTopLine = 0;
+    sgl.ScrollBoxesAry[I].LastScrollTopLine = 0;
+    sgl.ScrollBoxesAry[I].LastMarkerLine = 0;
+    sgl.ScrollBoxesAry[I].ScrollActiveLine = 0;
+    sgl.ScrollBoxesAry[I].NumberOfLines = 0;
+  }
+#endif
+
+#ifdef GuiConst_ITEM_GRAPH_INUSE
+  sgl.GlobalGraphIndex = 0;
+  for (I = 0; I < GuiConst_GRAPH_MAX; I++)
+  {
+    sgl.GraphAry[I].InUse = GuiLib_GRAPH_STRUCTURE_UNDEF;
+    sgl.GraphAry[I].GraphAxesCnt[GuiLib_GRAPHAXIS_X] = 0;
+    sgl.GraphAry[I].GraphAxesCnt[GuiLib_GRAPHAXIS_Y] = 0;
+    sgl.GraphAry[I].GraphDataSetCnt = 0;
+  }
+#endif
+
+#ifdef GuiConst_ITEM_GRAPHICS_LAYER_FILTER_INUSE
+  GraphicsLayer_Pop(GuiLib_GRAPHICS_LAYER_BASE);
+  for (I = 0; I < GuiConst_GRAPHICS_LAYER_MAX; I++)
+    sgl.GraphicsLayerLifo[I] = -1;
+  sgl.GraphicsLayerLifoCnt = 0;
+  sgl.GlobalGraphicsLayerIndex = 0;
+  for (I = 0; I < GuiConst_GRAPHICS_LAYER_MAX; I++)
+  {
+    sgl.GraphicsLayerList[I].InUse = GuiLib_GRAPHICS_LAYER_UNDEF;
+    sgl.GraphicsLayerList[I].SizeMode = 0;
+    sgl.GraphicsLayerList[I].InitMode = 0;
+  }
+  sgl.GlobalGraphicsFilterIndex = 0;
+  for (I = 0; I < GuiConst_GRAPHICS_FILTER_MAX; I++)
+  {
+    sgl.GraphicsFilterList[I].InUse = GuiLib_GRAPHICS_FILTER_UNDEF;
+    sgl.GraphicsFilterList[I].GraphicsFilterFunc = 0;
+    sgl.GraphicsFilterList[I].SourceLayerIndexNo = GuiLib_GRAPHICS_LAYER_BASE;
+    sgl.GraphicsFilterList[I].DestLayerIndexNo = GuiLib_GRAPHICS_LAYER_BASE;
+    sgl.GraphicsFilterList[I].ContAtLayerIndexNo = GuiLib_GRAPHICS_LAYER_BASE;
+    for (N = 0; N <= 9; N++)
+    {
+      sgl.GraphicsFilterList[I].ParVarType[N] = 0;
+      sgl.GraphicsFilterList[I].ParVarPtr[N] = 0;
+      sgl.GraphicsFilterList[I].ParValueNum[N] = 0;
+    }
+  }
+#endif
+
+#ifdef GuiConst_BITMAP_SUPPORT_ON
+  sgl.GlobalBackgrBitmapIndex = 0;
+  for (I = 0; I < GuiConst_MAX_BACKGROUND_BITMAPS; I++)
+  {
+    sgl.BackgrBitmapAry[I].InUse = 0;
+    sgl.BackgrBitmapAry[I].Index = 0;
+    sgl.BackgrBitmapAry[I].X = 0;
+    sgl.BackgrBitmapAry[I].Y = 0;
+  }
+#endif
+
+  GuiLib_ClearPositionCallbacks();
+}
+
+// Groupstart CHARS
+
+#ifdef GuiConst_CHARMODE_UNICODE
+//------------------------------------------------------------------------------
+GuiConst_INT16U GuiLib_UnicodeStrLen(
+   GuiConst_TEXT PrefixLocate *S)
+{
+  GuiConst_INT16U StrLen;
+
+  StrLen = 0;
+  while (*S != 0)
+  {
+    StrLen++;
+    S++;
+  }
+  return (StrLen);
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_StrAnsiToUnicode(
+   GuiConst_TEXT PrefixLocate *S2,
+   GuiConst_CHAR PrefixLocate *S1)
+{
+  do
+  {
+    *S2 = (GuiConst_TEXT)(*S1);
+    *S2 &= 0x00ff;
+    if (*S1 == 0)
+      return;
+    S1++;
+    S2++;
+  }
+  while (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT16S GuiLib_UnicodeStrCmp(
+   GuiConst_TEXT PrefixLocate *S1,
+   GuiConst_TEXT PrefixLocate *S2)
+{
+  do
+  {
+    if ((*S1 == 0) && (*S2 == 0))
+      return (0);
+
+    else if (*S1 == 0)
+      return (-1);
+    else if (*S2 == 0)
+      return (1);
+    else if (*S1 < *S2)
+      return (-1);
+    else if (*S1 > *S2)
+      return (1);
+    S1++;
+    S2++;
+  }
+  while (1);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT16S GuiLib_UnicodeStrNCmp(
+   GuiConst_TEXT PrefixLocate *S1,
+   GuiConst_TEXT PrefixLocate *S2,
+   GuiConst_INT16U StrLen)
+{
+  while (StrLen > 0)
+  {
+    if ((*S1 == 0) && (*S2 == 0))
+      return (0);
+    else if (*S1 == 0)
+      return (-1);
+    else if (*S2 == 0)
+      return (1);
+    else if (*S1 < *S2)
+      return (-1);
+    else if (*S1 > *S2)
+      return (1);
+    S1++;
+    S2++;
+    StrLen--;
+  }
+  return (0);
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_UnicodeStrCpy(
+   GuiConst_TEXT PrefixLocate *S2,
+   GuiConst_TEXT PrefixLocate *S1)
+{
+  do
+  {
+    *S2 = *S1;
+    if (*S1 == 0)
+      return;
+    S1++;
+    S2++;
+  }
+  while (1);
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_UnicodeStrNCpy(
+   GuiConst_TEXT PrefixLocate *S2,
+   GuiConst_TEXT PrefixLocate *S1,
+   GuiConst_INT16U StrLen)
+{
+  while (StrLen > 0)
+  {
+    *S2 = *S1;
+    if (*S1 != 0)
+      S1++;
+    S2++;
+    StrLen--;
+  }
+}
+#endif // GuiConst_CHARMODE_UNICODE
+
+//------------------------------------------------------------------------------
+static void ConvertIntToStr(
+   GuiConst_INT32U num,
+   GuiConst_CHAR PrefixLocate *string,
+   GuiConst_INT32U base)
+{
+  #define BUFFER_SIZE 11
+
+  GuiConst_INT8U digits[16] =
+     { 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70 };
+  GuiConst_CHAR buffer[BUFFER_SIZE];
+  GuiConst_INT8U bufferLen;
+  GuiConst_INT8U i;
+
+  bufferLen = 0;
+  do
+  {
+    i = num % base;
+    buffer[bufferLen++] = digits[i];
+    num /= base;
+  }
+  while ((num != 0) && (bufferLen < BUFFER_SIZE));
+
+  if (bufferLen <= GuiConst_MAX_VARNUM_TEXT_LEN)
+    while (bufferLen-- > 0)
+      *string++ = buffer[bufferLen];
+
+  *string = '\0';
+}
+
+//------------------------------------------------------------------------------
+static GuiConst_INT16S CharDist(
+   GuiConst_INT16U ChPos1,
+   GuiConst_INT16U ChPos2,
+   GuiConst_INT8U Ps)
+{
+  GuiConst_INT16S Result, D;
+#ifndef GuiConst_REMOTE_FONT_DATA
+  GuiConst_INT8U PrefixRom *Ps1;
+  GuiConst_INT8U PrefixRom *Ps2;
+#endif
+#ifdef GuiConst_REMOTE_FONT_DATA
+  GuiConst_INT8U CharHeader1[GuiLib_CHR_LINECTRL_OFS];
+  GuiConst_INT8U CharHeader2[GuiLib_CHR_LINECTRL_OFS];
+#endif
+
+#ifdef GuiConst_REMOTE_FONT_DATA
+  if (Ps == GuiLib_PS_OFF)
+    return (sgl.CurFont->XSize);
+  else if ((Ps == GuiLib_PS_ON) || (Ps == GuiLib_PS_NUM))
+  {
+    GuiLib_RemoteDataReadBlock(
+       (GuiConst_INT32U PrefixRom)GuiFont_ChPtrList[sgl.TextCharNdx[ChPos1]],
+       GuiLib_CHR_LINECTRL_OFS, CharHeader1);
+    GuiLib_RemoteDataReadBlock(
+       (GuiConst_INT32U PrefixRom)GuiFont_ChPtrList[sgl.TextCharNdx[ChPos2]],
+       GuiLib_CHR_LINECTRL_OFS, CharHeader2);
+    if ((Ps == GuiLib_PS_ON) || (sgl.TextPsMode[ChPos1] && sgl.TextPsMode[ChPos2]))
+    {
+      Result = CharHeader1[GuiLib_CHR_PSRIGHT_OFS + GuiLib_CHR_PS_TOP_OFS] -
+          CharHeader2[GuiLib_CHR_PSLEFT_OFS + GuiLib_CHR_PS_TOP_OFS];
+      D = CharHeader1[GuiLib_CHR_PSRIGHT_OFS + GuiLib_CHR_PS_MID_OFS] -
+          CharHeader2[GuiLib_CHR_PSLEFT_OFS + GuiLib_CHR_PS_MID_OFS];
+      if (D > Result)
+        Result = D;
+      D = CharHeader1[GuiLib_CHR_PSRIGHT_OFS + GuiLib_CHR_PS_MIDBASE_OFS] -
+          CharHeader2[GuiLib_CHR_PSLEFT_OFS + GuiLib_CHR_PS_MIDBASE_OFS];
+      if (D > Result)
+        Result = D;
+      D = CharHeader1[GuiLib_CHR_PSRIGHT_OFS + GuiLib_CHR_PS_BASE_OFS] -
+          CharHeader2[GuiLib_CHR_PSLEFT_OFS + GuiLib_CHR_PS_BASE_OFS];
+      if (D > Result)
+        Result = D;
+      D = CharHeader1[GuiLib_CHR_PSRIGHT_OFS + GuiLib_CHR_PS_BOTTOM_OFS] -
+          CharHeader2[GuiLib_CHR_PSLEFT_OFS + GuiLib_CHR_PS_BOTTOM_OFS];
+      if (D > Result)
+        Result = D;
+      return (Result + sgl.CurFont->PsSpace + 1);
+    }
+    else if (sgl.TextPsMode[ChPos1])
+    {
+      Result = CharHeader1[GuiLib_CHR_PSRIGHT_OFS + GuiLib_CHR_PS_TOP_OFS];
+      D = CharHeader1[GuiLib_CHR_PSRIGHT_OFS + GuiLib_CHR_PS_MID_OFS];
+      if (D > Result)
+        Result = D;
+      D = CharHeader1[GuiLib_CHR_PSRIGHT_OFS + GuiLib_CHR_PS_MIDBASE_OFS];
+      if (D > Result)
+        Result = D;
+      D = CharHeader1[GuiLib_CHR_PSRIGHT_OFS + GuiLib_CHR_PS_BASE_OFS];
+      if (D > Result)
+        Result = D;
+      D = CharHeader1[GuiLib_CHR_PSRIGHT_OFS + GuiLib_CHR_PS_BOTTOM_OFS];
+      if (D > Result)
+        Result = D;
+      return (Result + sgl.CurFont->PsSpace + 1);
+    }
+    else if (sgl.TextPsMode[ChPos2])
+    {
+      Result = CharHeader2[GuiLib_CHR_PSLEFT_OFS + GuiLib_CHR_PS_TOP_OFS];
+      D = CharHeader2[GuiLib_CHR_PSLEFT_OFS + GuiLib_CHR_PS_MID_OFS];
+      if (D < Result)
+        Result = D;
+      D = CharHeader2[GuiLib_CHR_PSLEFT_OFS + GuiLib_CHR_PS_MIDBASE_OFS];
+      if (D < Result)
+        Result = D;
+      D = CharHeader2[GuiLib_CHR_PSLEFT_OFS + GuiLib_CHR_PS_BASE_OFS];
+      if (D < Result)
+        Result = D;
+      D = CharHeader2[GuiLib_CHR_PSLEFT_OFS + GuiLib_CHR_PS_BOTTOM_OFS];
+      if (D < Result)
+        Result = D;
+      return (sgl.CurFont->PsNumWidth - Result + sgl.CurFont->PsSpace);
+    }
+    else
+      return (sgl.CurFont->PsNumWidth + sgl.CurFont->PsSpace);
+  }
+  else
+    return (0);
+#else
+  if (Ps == GuiLib_PS_OFF)
+    return (ReadByte(sgl.CurFont->XSize));
+  else if ((Ps == GuiLib_PS_ON) || (Ps == GuiLib_PS_NUM))
+  {
+    if ((Ps == GuiLib_PS_ON) || (sgl.TextPsMode[ChPos1] && sgl.TextPsMode[ChPos2]))
+    {
+      Ps1 = sgl.TextCharPtrAry[ChPos1] + GuiLib_CHR_PSRIGHT_OFS;
+      Ps2 = sgl.TextCharPtrAry[ChPos2] + GuiLib_CHR_PSLEFT_OFS;
+      Result = (GuiConst_INT16S)(ReadBytePtr(Ps1 + GuiLib_CHR_PS_TOP_OFS)) -
+         (GuiConst_INT16S)(ReadBytePtr(Ps2 + GuiLib_CHR_PS_TOP_OFS));
+      D = (GuiConst_INT16S)(ReadBytePtr(Ps1 + GuiLib_CHR_PS_MID_OFS)) -
+          (GuiConst_INT16S)(ReadBytePtr(Ps2 + GuiLib_CHR_PS_MID_OFS));
+      if (D > Result)
+        Result = D;
+      D = (GuiConst_INT16S)(ReadBytePtr(Ps1 + GuiLib_CHR_PS_MIDBASE_OFS)) -
+          (GuiConst_INT16S)(ReadBytePtr(Ps2 + GuiLib_CHR_PS_MIDBASE_OFS));
+      if (D > Result)
+        Result = D;
+      D = (GuiConst_INT16S)(ReadBytePtr(Ps1 + GuiLib_CHR_PS_BASE_OFS)) -
+          (GuiConst_INT16S)(ReadBytePtr(Ps2 + GuiLib_CHR_PS_BASE_OFS));
+      if (D > Result)
+        Result = D;
+      D = (GuiConst_INT16S)(ReadBytePtr(Ps1 + GuiLib_CHR_PS_BOTTOM_OFS)) -
+          (GuiConst_INT16S)(ReadBytePtr(Ps2 + GuiLib_CHR_PS_BOTTOM_OFS));
+      if (D > Result)
+        Result = D;
+      return (Result + ReadByte(sgl.CurFont->PsSpace) + 1);
+    }
+    else if (sgl.TextPsMode[ChPos1])
+    {
+      Ps1 = sgl.TextCharPtrAry[ChPos1] + GuiLib_CHR_PSRIGHT_OFS;
+      Result = (GuiConst_INT16S)(ReadBytePtr(Ps1 + GuiLib_CHR_PS_TOP_OFS));
+      D = (GuiConst_INT16S)(ReadBytePtr(Ps1 + GuiLib_CHR_PS_MID_OFS));
+      if (D > Result)
+        Result = D;
+      D = (GuiConst_INT16S)(ReadBytePtr(Ps1 + GuiLib_CHR_PS_MIDBASE_OFS));
+      if (D > Result)
+        Result = D;
+      D = (GuiConst_INT16S)(ReadBytePtr(Ps1 + GuiLib_CHR_PS_BASE_OFS));
+      if (D > Result)
+        Result = D;
+      D = (GuiConst_INT16S)(ReadBytePtr(Ps1 + GuiLib_CHR_PS_BOTTOM_OFS));
+      if (D > Result)
+        Result = D;
+      return (Result + ReadByte(sgl.CurFont->PsSpace) + 1);
+    }
+    else if (sgl.TextPsMode[ChPos2])
+    {
+      Ps2 = sgl.TextCharPtrAry[ChPos2] + GuiLib_CHR_PSLEFT_OFS;
+      Result = (GuiConst_INT16S)(ReadBytePtr(Ps2 + GuiLib_CHR_PS_TOP_OFS));
+      D = (GuiConst_INT16S)(ReadBytePtr(Ps2 + GuiLib_CHR_PS_MID_OFS));
+      if (D < Result)
+        Result = D;
+      D = (GuiConst_INT16S)(ReadBytePtr(Ps2 + GuiLib_CHR_PS_MIDBASE_OFS));
+      if (D < Result)
+        Result = D;
+      D = (GuiConst_INT16S)(ReadBytePtr(Ps2 + GuiLib_CHR_PS_BASE_OFS));
+      if (D < Result)
+        Result = D;
+      D = (GuiConst_INT16S)(ReadBytePtr(Ps2 + GuiLib_CHR_PS_BOTTOM_OFS));
+      if (D < Result)
+        Result = D;
+      return (ReadByte(sgl.CurFont->PsNumWidth) - Result +
+              ReadByte(sgl.CurFont->PsSpace));
+    }
+    else
+      return (ReadByte(sgl.CurFont->PsNumWidth) +
+         ReadByte(sgl.CurFont->PsSpace));
+  }
+  else
+    return (0);
+#endif
+}
+
+//------------------------------------------------------------------------------
+static GuiConst_INT16S TextPixelLength(
+   GuiConst_INT8U Ps,
+   GuiConst_INT16U CharCnt,
+   GuiConst_INT16S *TextXOfs)
+{
+  GuiConst_INT16U P;
+  GuiConst_INT16S L;
+#ifdef GuiConst_REMOTE_FONT_DATA
+  GuiConst_INT8U CharHeader1[GuiLib_CHR_LINECTRL_OFS + 1];
+  GuiConst_INT8U CharHeader2[GuiLib_CHR_LINECTRL_OFS + 1];
+#endif
+
+  if (CharCnt == 0)
+    return (0);
+  else
+  {
+#ifdef GuiConst_REMOTE_FONT_DATA
+    GuiLib_RemoteDataReadBlock(
+       (GuiConst_INT32U PrefixRom)GuiFont_ChPtrList[sgl.TextCharNdx[0]],
+       GuiLib_CHR_LINECTRL_OFS + 1, CharHeader1);
+    GuiLib_RemoteDataReadBlock(
+       (GuiConst_INT32U PrefixRom)GuiFont_ChPtrList[sgl.TextCharNdx[CharCnt - 1]],
+       GuiLib_CHR_LINECTRL_OFS + 1, CharHeader2);
+#endif
+
+    if (sgl.TextPsMode[0])
+    {
+#ifdef GuiConst_REMOTE_FONT_DATA
+      if (CharHeader1[GuiLib_CHR_LINECTRL_OFS] & 0x01)
+        L = -(GuiConst_INT16S)CharHeader1[GuiLib_CHR_PSLEFT_OFS];
+      else
+        L = -(GuiConst_INT16S)CharHeader1[GuiLib_CHR_XLEFT_OFS];
+#else
+      if (ReadBytePtr(sgl.TextCharPtrAry[0] + GuiLib_CHR_LINECTRL_OFS) & 0x01)
+        L = -(GuiConst_INT16S)(ReadBytePtr(sgl.TextCharPtrAry[0] +
+           GuiLib_CHR_PSLEFT_OFS));
+      else
+        L = -(GuiConst_INT16S)(ReadBytePtr(sgl.TextCharPtrAry[0] +
+         GuiLib_CHR_XLEFT_OFS));
+#endif
+    }
+    else
+      L = 0;
+
+    if (TextXOfs != NULL)
+      TextXOfs[0] = L;
+
+    for (P = 0; P < CharCnt - 1; P++)
+    {
+      L += CharDist (P, P + 1, Ps);
+      if (TextXOfs != NULL)
+        TextXOfs[P + 1] = L;
+    }
+
+#ifdef GuiConst_REMOTE_FONT_DATA
+    if (sgl.TextPsMode[CharCnt - 1])
+    {
+      if (CharHeader2[GuiLib_CHR_LINECTRL_OFS] & 0x01)
+        L += (GuiConst_INT16S)CharHeader2[GuiLib_CHR_PSRIGHT_OFS] + 1;
+      else
+        L += (GuiConst_INT16S)CharHeader2[GuiLib_CHR_XLEFT_OFS] +
+             (GuiConst_INT16S)CharHeader2[GuiLib_CHR_XWIDTH_OFS];
+    }
+    else if (Ps == GuiLib_PS_NUM)
+    {
+      if (CharHeader2[GuiLib_CHR_LINECTRL_OFS] & 0x01)
+        L += (GuiConst_INT16S)CharHeader2[GuiLib_CHR_PSRIGHT_OFS] + 1;
+      else
+        L += sgl.CurFont->PsNumWidth + sgl.CurFont->PsSpace;
+    }
+    else
+      L += sgl.CurFont->XSize;
+#else
+    if (sgl.TextPsMode[CharCnt - 1])
+    {
+      if (ReadBytePtr(sgl.TextCharPtrAry[CharCnt - 1] + GuiLib_CHR_LINECTRL_OFS) & 0x01)
+        L += (GuiConst_INT16S)(ReadBytePtr(sgl.TextCharPtrAry[CharCnt - 1] +
+              GuiLib_CHR_PSRIGHT_OFS)) + 1;
+      else
+        L += ReadBytePtr(sgl.TextCharPtrAry[CharCnt - 1] + GuiLib_CHR_XLEFT_OFS) +
+          ReadBytePtr(sgl.TextCharPtrAry[CharCnt - 1] + GuiLib_CHR_XWIDTH_OFS);
+    }
+    else if (Ps == GuiLib_PS_NUM)
+    {
+      if (ReadBytePtr(sgl.TextCharPtrAry[CharCnt - 1] +
+          GuiLib_CHR_LINECTRL_OFS) & 0x01)
+        L += (GuiConst_INT16S)(ReadBytePtr(sgl.TextCharPtrAry[CharCnt - 1] +
+              GuiLib_CHR_PSRIGHT_OFS)) + 1;
+      else
+        L += ReadByte(sgl.CurFont->PsNumWidth) +
+           ReadByte(sgl.CurFont->PsSpace);
+    }
+    else
+      L += ReadByte(sgl.CurFont->XSize);
+#endif
+    if (TextXOfs != NULL)
+      TextXOfs[CharCnt] = L;
+    return (L);
+  }
+}
+
+//------------------------------------------------------------------------------
+static GuiConst_INT16U CalcCharsWidth(
+   GuiConst_INT16U CharPos1,
+   GuiConst_INT16U CharPos2,
+   GuiConst_INT16S *TextXOfs,
+   GuiConst_INT16S *pXStart,
+   GuiConst_INT16S *pXEnd)
+{
+  GuiConst_INT16S X1;
+  GuiConst_INT16S X2;
+
+#ifdef GuiConst_REMOTE_FONT_DATA
+  GuiConst_INT8U CharHeader1[GuiLib_CHR_LINECTRL_OFS+1];
+  GuiConst_INT8U CharHeader2[GuiLib_CHR_LINECTRL_OFS+1];
+
+  GuiLib_RemoteDataReadBlock(
+     (GuiConst_INT32U PrefixRom)GuiFont_ChPtrList[sgl.TextCharNdx[CharPos1]],
+      GuiLib_CHR_LINECTRL_OFS+1, CharHeader1);
+  GuiLib_RemoteDataReadBlock(
+     (GuiConst_INT32U PrefixRom)GuiFont_ChPtrList[sgl.TextCharNdx[CharPos2]],
+      GuiLib_CHR_LINECTRL_OFS+1, CharHeader2);
+
+  if (sgl.TextPsMode[CharPos1])
+  {
+    if (CharHeader1[GuiLib_CHR_LINECTRL_OFS] & 0x01)
+      X1 = TextXOfs[CharPos1] +
+           (GuiConst_INT16S)CharHeader1[GuiLib_CHR_PSLEFT_OFS];
+    else
+      X1 = TextXOfs[CharPos1] +
+           (GuiConst_INT16S)CharHeader1[GuiLib_CHR_XLEFT_OFS];
+  }
+  else
+    X1 = TextXOfs[CharPos1];
+  if (sgl.TextPsMode[CharPos2])
+  {
+    if (CharHeader2[GuiLib_CHR_LINECTRL_OFS] & 0x01)
+      X2 = TextXOfs[CharPos2] +
+           (GuiConst_INT16S)CharHeader2[GuiLib_CHR_PSRIGHT_OFS];
+    else
+      X2 = TextXOfs[CharPos2] +
+           (GuiConst_INT16S)CharHeader1[GuiLib_CHR_XLEFT_OFS] +
+           (GuiConst_INT16S)CharHeader2[GuiLib_CHR_XWIDTH_OFS] - 1;
+  }
+  else
+    X2 = TextXOfs[CharPos2] + sgl.CurFont->XSize - 1;
+#else
+  if (sgl.TextPsMode[CharPos1])
+  {
+    if (ReadBytePtr(sgl.TextCharPtrAry[CharPos1] +
+        GuiLib_CHR_LINECTRL_OFS) & 0x01)
+      X1 = TextXOfs[CharPos1] +
+           (GuiConst_INT16S)(ReadBytePtr(sgl.TextCharPtrAry[CharPos1] +
+            GuiLib_CHR_PSLEFT_OFS));
+    else
+      X1 = TextXOfs[CharPos1] +
+           (GuiConst_INT16S)(ReadBytePtr(sgl.TextCharPtrAry[CharPos1] +
+            GuiLib_CHR_XLEFT_OFS));
+  }
+  else
+    X1 = TextXOfs[CharPos1];
+  if (sgl.TextPsMode[CharPos2])
+  {
+    if (ReadBytePtr(sgl.TextCharPtrAry[CharPos2] +
+        GuiLib_CHR_LINECTRL_OFS) & 0x01)
+      X2 = TextXOfs[CharPos2] +
+           (GuiConst_INT16S)(ReadBytePtr(sgl.TextCharPtrAry[CharPos2] +
+            GuiLib_CHR_PSRIGHT_OFS));
+    else
+      X2 = TextXOfs[CharPos2] +
+           (GuiConst_INT16S)(ReadBytePtr(sgl.TextCharPtrAry[CharPos2] +
+            GuiLib_CHR_XLEFT_OFS)) +
+           (GuiConst_INT16S)(ReadBytePtr(sgl.TextCharPtrAry[CharPos2] +
+            GuiLib_CHR_XWIDTH_OFS)) - 1;
+  }
+  else
+    X2 = TextXOfs[CharPos2] + sgl.CurFont->XSize - 1;
+#endif
+
+  *pXStart = X1;
+  *pXEnd = X2;
+  return(X2 - X1 + 1);
+}
+
+#ifdef GuiConst_CHARMODE_UNICODE
+//------------------------------------------------------------------------------
+static GuiConst_INT32U GetCharNdx(
+   GuiLib_FontRecPtr Font,
+   GuiConst_INT16U CharCode)
+{
+  GuiConst_INT32U CharNdx,CharNdx1,CharNdx2;
+  GuiConst_INT32U ReturnValue;
+
+  CharNdx1 = ReadWord(Font->FirstCharNdx) + 1;
+  CharNdx2 = CharNdx1 + ReadWord(Font->CharCount) - 1;
+
+  ReturnValue = 0;
+
+  do
+  {
+    CharNdx = CharNdx1 + ((CharNdx2 - CharNdx1) >> 1);
+
+    if (ReadWord(GuiFont_ChUnicodeList[CharNdx]) == CharCode)
+    {
+      ReturnValue = CharNdx;
+      break;
+    }
+
+    if (CharNdx1 == CharNdx2)
+    {
+      ReturnValue = ReadWord(Font->FirstCharNdx);
+      break;
+    }
+
+    if (ReadWord(GuiFont_ChUnicodeList[CharNdx]) > CharCode)
+      CharNdx2 = CharNdx - 1;
+    else
+      CharNdx1 = CharNdx + 1;
+
+    if (CharNdx1 > CharNdx2)
+    {
+      ReturnValue = ReadWord(Font->FirstCharNdx);
+      break;
+    }
+  }
+  while (1);
+
+  return ReturnValue;
+}
+#endif
+
+//------------------------------------------------------------------------------
+static void PrepareText(
+   GuiConst_TEXT PrefixGeneric *CharPtr,
+   GuiConst_INT16U CharCnt,
+   GuiConst_INT8U TextNdx)
+{
+  GuiConst_INT16S P;
+#ifdef GuiConst_CHARMODE_ANSI
+  GuiConst_INT8U CharCode;
+#else
+  GuiConst_INT16U CharCode;
+  GuiConst_INT16U CharNdx;
+#endif
+
+  if (CharCnt > GuiConst_MAX_TEXT_LEN)
+    CharCnt = GuiConst_MAX_TEXT_LEN;
+
+  for (P = 0; P < CharCnt; P++)
+  {
+#ifdef GuiConst_CHARMODE_ANSI
+
+#ifdef GuiConst_AVRGCC_COMPILER
+    if (displayVarNow)
+      CharCode = (unsigned GuiConst_CHAR) *CharPtr;
+    else
+      CharCode = (unsigned GuiConst_CHAR) ReadBytePtr(CharPtr);
+#else
+#ifdef GuiConst_ICC_COMPILER
+    if (displayVarNow)
+      CharCode = (unsigned GuiConst_CHAR) *CharPtr;
+    else
+      CharCode = *((GuiConst_INT8U PrefixRom *)CharPtr);
+#else
+#ifdef GuiConst_CODEVISION_COMPILER
+    if (displayVarNow)
+      CharCode = (unsigned GuiConst_CHAR) *CharPtr;
+    else
+      CharCode = *((GuiConst_INT8U PrefixRom *)CharPtr);
+#else
+#ifdef GuiConst_RENESAS_COMPILER_FAR
+    if (displayVarNow)
+      CharCode = (unsigned GuiConst_CHAR) *CharPtr;
+    else
+      CharCode = *((GuiConst_INT8U PrefixRom *)CharPtr);
+#else
+      CharCode = (unsigned GuiConst_TEXT) *CharPtr;
+#endif // GuiConst_RENESAS_COMPILER_FAR
+#endif // GuiConst_CODEVISION_COMPILER
+#endif // GuiConst_ICC_COMPILER
+#endif // GuiConst_AVRGCC_COMPILER
+
+#ifdef GuiConst_REMOTE_FONT_DATA
+    if ((CharCode < sgl.CurFont->FirstChar) ||
+        (CharCode > sgl.CurFont->LastChar))
+      sgl.TextCharNdx[P] = sgl.CurFont->IllegalCharNdx;
+    else
+    {
+      sgl.TextCharNdx[P] =
+         sgl.CurFont->FirstCharNdx + (GuiConst_INT16U)CharCode -
+         (GuiConst_INT16U)sgl.CurFont->FirstChar;
+
+      if ((GuiConst_INT32U PrefixRom)GuiFont_ChPtrList[sgl.TextCharNdx[P] + 1] -
+          (GuiConst_INT32U PrefixRom)GuiFont_ChPtrList[sgl.TextCharNdx[P]] == 0)
+        sgl.TextCharNdx[P] = sgl.CurFont->IllegalCharNdx;
+    }
+#else // GuiConst_REMOTE_FONT_DATA
+    if ((CharCode < ReadByte(sgl.CurFont->FirstChar)) ||
+        (CharCode > ReadByte(sgl.CurFont->LastChar)))
+      sgl.TextCharPtrAry[P] = (GuiConst_INT8U*)ReadWord(
+         GuiFont_ChPtrList[ReadWord(sgl.CurFont->IllegalCharNdx)]);
+    else
+      sgl.TextCharPtrAry[P] = (GuiConst_INT8U*)ReadWord(
+         GuiFont_ChPtrList[ReadWord(sgl.CurFont->FirstCharNdx) +
+         (GuiConst_INT16U)CharCode -
+         (GuiConst_INT16U)ReadByte(sgl.CurFont->FirstChar)]);
+#endif // GuiConst_REMOTE_FONT_DATA
+
+    if (sgl.CurItem.TextPar[TextNdx].Ps == GuiLib_PS_ON)
+      sgl.TextPsMode[P] = 1;
+    else if (sgl.CurItem.TextPar[TextNdx].Ps == GuiLib_PS_NUM)
+    {
+      if (((CharCode >= '0') && (CharCode <= '9')) ||
+         (CharCode == ' ') || (CharCode == '+') || (CharCode == '-') ||
+         (CharCode == '*') || (CharCode == '/') || (CharCode == '='))
+        sgl.TextPsMode[P] = 0;
+      else
+        sgl.TextPsMode[P] = 1;
+    }
+    else
+      sgl.TextPsMode[P] = 0;
+
+#else // GuiConst_CHARMODE_ANSI
+    CharCode = *((PrefixLocate GuiConst_INT16U*)CharPtr);
+    CharNdx = GetCharNdx(sgl.CurFont, CharCode);
+
+#ifdef GuiConst_REMOTE_FONT_DATA
+    sgl.TextCharNdx[P] = CharNdx;
+#else
+    sgl.TextCharPtrAry[P] =
+       (GuiConst_INT8U PrefixRom *)ReadWord(GuiFont_ChPtrList[CharNdx]);
+#endif
+
+    if (sgl.CurItem.TextPar[TextNdx].Ps == GuiLib_PS_ON)
+      sgl.TextPsMode[P] = 1;
+    else if ((sgl.CurItem.TextPar[TextNdx].Ps == GuiLib_PS_NUM) && (CharNdx > 0))
+    {
+      if (((CharCode >= '0') && (CharCode <= '9')) ||
+         (CharCode == ' ') || (CharCode == '+') || (CharCode == '-') ||
+         (CharCode == '*') || (CharCode == '/') || (CharCode == '='))
+        sgl.TextPsMode[P] = 0;
+      else
+        sgl.TextPsMode[P] = 1;
+    }
+    else
+      sgl.TextPsMode[P] = 0;
+#endif // GuiConst_CHARMODE_ANSI
+    CharPtr++;
+  }
+}
+
+#ifdef GuiConst_ARAB_CHARS_INUSE
+//------------------------------------------------------------------------------
+static GuiConst_INT16U ArabicCorrection(
+   GuiConst_TEXT PrefixGeneric *CharPtr,
+   GuiConst_INT16U CharCnt,
+   GuiConst_INT8U RightToLeftWriting)
+{
+  GuiConst_INT16S I, J, P;
+  GuiConst_INT16U CharCode;
+  GuiConst_INT16U CharCode2;
+  GuiConst_TEXT PrefixLocate *CharPtr2;
+  GuiConst_TEXT PrefixLocate *CharPtrA;
+  GuiConst_TEXT PrefixLocate *CharPtrB;
+
+  if (!RightToLeftWriting)
+    return CharCnt;
+
+  CharPtr2 = CharPtr;
+
+  for (P = 0; P < CharCnt; P++)
+  {
+    CharCode = *((GuiConst_INT16U*)CharPtr);
+    switch (CharCode)
+    {
+      case 40:
+        *((GuiConst_INT16U*)CharPtr) = 41;
+        break;
+      case 41:
+        *((GuiConst_INT16U*)CharPtr) = 40;
+        break;
+
+      case 91:
+        *((GuiConst_INT16U*)CharPtr) = 93;
+        break;
+      case 93:
+        *((GuiConst_INT16U*)CharPtr) = 91;
+        break;
+
+      case 123:
+        *((GuiConst_INT16U*)CharPtr) = 125;
+        break;
+      case 125:
+        *((GuiConst_INT16U*)CharPtr) = 123;
+        break;
+    }
+
+    CharPtr++;
+  }
+
+  P = 0;
+  CharPtr = CharPtr2;
+  do
+  {
+    CharCode = *((GuiConst_INT16U*)CharPtr);
+    CharPtrA = CharPtr;
+    CharPtr++;
+    CharCode2 = *((GuiConst_INT16U*)CharPtr);
+
+    for (I = 0; I < GuiLib_ARAB_LIGATURES_CNT; I++)
+      if ((CharCode == GuiLib_ARAB_LIGATURES[I][0]) &&
+          (CharCode2 == GuiLib_ARAB_LIGATURES[I][1]))
+      {
+        *((GuiConst_INT16U*)CharPtrA) = GuiLib_ARAB_LIGATURES[I][2];
+        CharPtrA = CharPtr;
+        CharPtrB = CharPtrA;
+        CharPtrB++;
+        CharCnt--;
+        for (J = P + 1; J < CharCnt; J++)
+        {
+          *((GuiConst_INT16U*)CharPtrA) = *((GuiConst_INT16U*)CharPtrB);
+          CharPtrA++;
+          CharPtrB++;
+        }
+        *((GuiConst_INT16U*)CharPtrA) = 0;
+        break;
+      }
+
+    P++;
+  }
+  while (P < CharCnt - 1);
+
+  CharPtr = CharPtr2;
+  for (P = 0; P < CharCnt; P++)
+  {
+    CharCode = *((GuiConst_INT16U*)CharPtr);
+
+    for (I = 0; I < GuiLib_ARAB_CHAR_CONVERT_CNT; I++)
+      if ((CharCode == GuiLib_ARAB_CHAR_CONVERT[I][0]) && (CharCode > 0))
+      {
+        *((GuiConst_INT16U*)CharPtr) = GuiLib_ARAB_CHAR_CONVERT[I][1];
+        break;
+      }
+
+    CharPtr++;
+  }
+
+  gl.ArabicCharJoiningModeIndex[0] = -1;
+  CharPtr = CharPtr2;
+  for (P = 0; P < CharCnt; P++)
+  {
+    CharCode = *((GuiConst_INT16U*)CharPtr);
+
+    gl.ArabicCharJoiningModeIndex[P + 1] = -1;
+    for (I = 0; I < GuiLib_ARAB_CHAR_CONVERT_CNT; I++)
+      if ((CharCode >= GuiLib_ARAB_CHAR_CONVERT[I][1]) &&
+          (CharCode <= GuiLib_ARAB_CHAR_CONVERT[I][1] +
+          (GuiLib_ARAB_CHAR_CONVERT[I][2] & 7) - 1))
+      {
+        gl.ArabicCharJoiningModeIndex[P + 1] = I;
+        break;
+      }
+
+    CharPtr++;
+  }
+  gl.ArabicCharJoiningModeIndex[CharCnt + 1] = -1;
+
+  for (P = 0; P < CharCnt + 2; P++)
+  {
+    if (gl.ArabicCharJoiningModeIndex[P] == -1)
+      gl.ArabicCharJoiningMode[P] = GuiLib_ARAB_CHAR_TYPE_ISO;
+    else
+      gl.ArabicCharJoiningMode[P] =
+         GuiLib_ARAB_CHAR_CONVERT[gl.ArabicCharJoiningModeIndex[P]][2];
+  }
+
+  CharPtr = CharPtr2;
+  for (P = 0; P < CharCnt; P++)
+  {
+    CharCode = *((GuiConst_INT16U*)CharPtr);
+
+    I = P;
+    while (gl.ArabicCharJoiningMode[I] == GuiLib_ARAB_CHAR_DIACRITIC)
+      I--;
+    gl.ArabicCharJoiningModeBefore = gl.ArabicCharJoiningMode[I];
+    I = P + 2;
+    while (gl.ArabicCharJoiningMode[I] == GuiLib_ARAB_CHAR_DIACRITIC)
+      I++;
+    gl.ArabicCharJoiningModeAfter = gl.ArabicCharJoiningMode[I];
+
+    switch (gl.ArabicCharJoiningMode[P + 1])
+    {
+      case GuiLib_ARAB_CHAR_ISOFIN:
+        if (gl.ArabicCharJoiningModeBefore == GuiLib_ARAB_CHAR_ISOFININIMED)
+          *((GuiConst_INT16U*)CharPtr) =
+             GuiLib_ARAB_CHAR_CONVERT[gl.ArabicCharJoiningModeIndex[P + 1]][1] +
+             GuiLib_ARAB_CHAR_TYPE_FIN;
+        break;
+
+      case GuiLib_ARAB_CHAR_ISOFININIMED:
+        if ((gl.ArabicCharJoiningModeAfter == GuiLib_ARAB_CHAR_ISOFIN) ||
+            (gl.ArabicCharJoiningModeAfter == GuiLib_ARAB_CHAR_ISOFININIMED))
+        {
+          if (gl.ArabicCharJoiningModeBefore == GuiLib_ARAB_CHAR_ISOFININIMED)
+            *((GuiConst_INT16U*)CharPtr) =
+               GuiLib_ARAB_CHAR_CONVERT[gl.ArabicCharJoiningModeIndex[P + 1]][1] +
+               GuiLib_ARAB_CHAR_TYPE_MED;
+          else
+            *((GuiConst_INT16U*)CharPtr) =
+               GuiLib_ARAB_CHAR_CONVERT[gl.ArabicCharJoiningModeIndex[P + 1]][1] +
+               GuiLib_ARAB_CHAR_TYPE_INI;
+        }
+        else if (gl.ArabicCharJoiningModeBefore == GuiLib_ARAB_CHAR_ISOFININIMED)
+          *((GuiConst_INT16U*)CharPtr) =
+             GuiLib_ARAB_CHAR_CONVERT[gl.ArabicCharJoiningModeIndex[P + 1]][1] +
+             GuiLib_ARAB_CHAR_TYPE_FIN;
+        break;
+
+      case GuiLib_ARAB_CHAR_DIACRITIC:
+        if (((gl.ArabicCharJoiningMode[P + 2] == GuiLib_ARAB_CHAR_ISOFIN) ||
+             (gl.ArabicCharJoiningMode[P + 2] == GuiLib_ARAB_CHAR_ISOFININIMED)) &&
+            (gl.ArabicCharJoiningMode[P] == GuiLib_ARAB_CHAR_ISOFININIMED))
+          *((GuiConst_INT16U*)CharPtr) =
+             GuiLib_ARAB_CHAR_CONVERT[gl.ArabicCharJoiningModeIndex[P + 1]][1] + 1;
+        break;
+    }
+
+    CharPtr++;
+  }
+
+  return (CharCnt);
+}
+#endif
+
+// Groupend CHARS
+// Groupstart DRAW
+
+//------------------------------------------------------------------------------
+static void ResetDrawLimits(void)
+{
+  gl.Drawn = 0;
+  gl.DrawnX1 = 0x7FFF;
+  gl.DrawnY1 = 0x7FFF;
+  gl.DrawnX2 = 0x8000;
+  gl.DrawnY2 = 0x8000;
+}
+
+//------------------------------------------------------------------------------
+static void UpdateDrawLimits(
+   GuiConst_INT16S X1,
+   GuiConst_INT16S Y1,
+   GuiConst_INT16S X2,
+   GuiConst_INT16S Y2)
+{
+  sgl.CurItem.Drawn = 1;
+  sgl.CurItem.DrawnX1 = X1;
+  sgl.CurItem.DrawnY1 = Y1;
+  sgl.CurItem.DrawnX2 = X2;
+  sgl.CurItem.DrawnY2 = Y2;
+
+  gl.Drawn = 1;
+  gl.DrawnX1 = GuiLib_GET_MIN(gl.DrawnX1, X1);
+  gl.DrawnY1 = GuiLib_GET_MIN(gl.DrawnY1, Y1);
+  gl.DrawnX2 = GuiLib_GET_MAX(gl.DrawnX2, X2);
+  gl.DrawnY2 = GuiLib_GET_MAX(gl.DrawnY2, Y2);
+}
+
+//------------------------------------------------------------------------------
+static void DrawBorderBox(
+   GuiConst_INT16S X1,
+   GuiConst_INT16S Y1,
+   GuiConst_INT16S X2,
+   GuiConst_INT16S Y2,
+   GuiConst_INTCOLOR BorderColor,
+   GuiConst_INTCOLOR FillColor,
+   GuiConst_INT8U FillTransparent,
+   GuiConst_INT16U BorderThickness)
+{
+  if (BorderThickness == 1)
+    GuiLib_Box(X1, Y1, X2, Y2, BorderColor);
+  else
+  {
+    GuiLib_FillBox(X1, Y1, X1 + BorderThickness - 1, Y2, BorderColor);
+    GuiLib_FillBox(X2 - BorderThickness + 1, Y1, X2, Y2, BorderColor);
+    GuiLib_FillBox(X1, Y1, X2, Y1 + BorderThickness - 1, BorderColor);
+    GuiLib_FillBox(X1, Y2 - BorderThickness + 1, X2, Y2, BorderColor);
+  }
+  if ((!FillTransparent) &&
+     (X2 - X1 >= 2 * BorderThickness) &&
+     (Y2 - Y1 >= 2 * BorderThickness))
+    GuiLib_FillBox(X1 + BorderThickness,
+                   Y1 + BorderThickness,
+                   X2 - BorderThickness,
+                   Y2 - BorderThickness,
+                   FillColor);
+}
+
+//------------------------------------------------------------------------------
+static void SetBackColorBox(
+   GuiConst_INT16S X1,
+   GuiConst_INT16S Y1,
+   GuiConst_INT16S X2,
+   GuiConst_INT16S Y2,
+   GuiConst_INT8U TextNdx)
+{
+  sgl.BbX1 = X1;
+  sgl.BbY1 = Y1;
+  sgl.BbX2 = X2;
+  sgl.BbY2 = Y2;
+
+  if ((sgl.CurItem.TextPar[TextNdx].BackBorderPixels & GuiLib_BBP_LEFT) != 0)
+    sgl.BbX1--;
+  if ((sgl.CurItem.TextPar[TextNdx].BackBorderPixels & GuiLib_BBP_RIGHT) != 0)
+    sgl.BbX2++;
+  if ((sgl.CurItem.TextPar[TextNdx].BackBorderPixels & GuiLib_BBP_TOP) != 0)
+    sgl.BbY1--;
+  if ((sgl.CurItem.TextPar[TextNdx].BackBorderPixels & GuiLib_BBP_BOTTOM) != 0)
+    sgl.BbY2++;
+}
+
+//------------------------------------------------------------------------------
+static void SetBackBox(
+   GuiConst_INT8U TextNdx)
+{
+  GuiConst_INT16S L;
+
+  L = sgl.CurItem.TextPar[TextNdx].BackBoxSizeX;
+  sgl.BbX1 = sgl.CurItem.X1;
+  sgl.BbX2 = sgl.CurItem.X1 + L - 1;
+
+  if (sgl.CurItem.TextPar[TextNdx].Alignment == GuiLib_ALIGN_CENTER)
+  {
+    sgl.BbX1 -= L / 2;
+    sgl.BbX2 -= L / 2;
+  }
+  else if (sgl.CurItem.TextPar[TextNdx].Alignment == GuiLib_ALIGN_RIGHT)
+  {
+    sgl.BbX1 -= L - 1;
+    sgl.BbX2 -= L - 1;
+  }
+
+  if (sgl.CurItem.TextPar[TextNdx].BackBoxSizeY1 > 0)
+    sgl.BbY1 = sgl.CurItem.Y1 - sgl.CurItem.TextPar[TextNdx].BackBoxSizeY1;
+  else
+    sgl.BbY1 = sgl.CurItem.Y1 - ReadByte(sgl.CurFont->BaseLine);
+  if (sgl.CurItem.TextPar[TextNdx].BackBoxSizeY2 > 0)
+    sgl.BbY2 = sgl.CurItem.Y1 + sgl.CurItem.TextPar[TextNdx].BackBoxSizeY2;
+  else
+    sgl.BbY2 = sgl.CurItem.Y1 - ReadByte(sgl.CurFont->BaseLine) +
+       ReadByte(sgl.CurFont->YSize) - 1;
+
+  if ((sgl.CurItem.TextPar[TextNdx].BackBorderPixels & GuiLib_BBP_LEFT) != 0)
+    sgl.BbX1--;
+  if ((sgl.CurItem.TextPar[TextNdx].BackBorderPixels & GuiLib_BBP_RIGHT) != 0)
+    sgl.BbX2++;
+  if ((sgl.CurItem.TextPar[TextNdx].BackBorderPixels & GuiLib_BBP_TOP) != 0)
+    sgl.BbY1--;
+  if ((sgl.CurItem.TextPar[TextNdx].BackBorderPixels & GuiLib_BBP_BOTTOM) != 0)
+    sgl.BbY2++;
+}
+
+//------------------------------------------------------------------------------
+static void DrawBackBox(
+   GuiConst_INTCOLOR BoxColor,
+   GuiConst_INT8U Transparent,
+   GuiConst_INT8U TextNdx)
+{
+  SetBackBox(TextNdx);
+
+  if (!Transparent)
+    GuiLib_FillBox(sgl.BbX1, sgl.BbY1, sgl.BbX2, sgl.BbY2, BoxColor);
+}
+
+//------------------------------------------------------------------------------
+#ifdef GuiConst_CHARMODE_ANSI
+  #ifdef GuiConst_ICC_COMPILER
+#define DRAW_ROM_TEXT(ChPtr, ChCnt, TxtNdx, FColor, BColor, Transparent)       \
+        DrawText((GuiConst_TEXT *)ChPtr,                                       \
+                  ChCnt,                                                       \
+                  TxtNdx,                                                      \
+                  FColor,                                                      \
+                  BColor,                                                      \
+                  Transparent);
+  #else
+  #ifdef GuiConst_CODEVISION_COMPILER
+#define DRAW_ROM_TEXT(ChPtr, ChCnt, TxtNdx, FColor, BColor, Transparent)       \
+        DrawText((GuiConst_TEXT *)ChPtr,                                       \
+                  ChCnt,                                                       \
+                  TxtNdx,                                                      \
+                  FColor,                                                      \
+                  BColor,                                                      \
+                  Transparent);
+  #else
+  #ifdef GuiConst_RENESAS_COMPILER_FAR
+#define DRAW_ROM_TEXT(ChPtr, ChCnt, TxtNdx, FColor, BColor, Transparent)       \
+        DrawText((GuiConst_TEXT PrefixLocate *)ChPtr,                         \
+                  ChCnt,                                                       \
+                  TxtNdx,                                                      \
+                  FColor,                                                      \
+                  BColor,                                                      \
+                  Transparent);
+  #else
+#define DRAW_ROM_TEXT(ChPtr, ChCnt, TxtNdx, FColor, BColor, Transparent)       \
+        DrawText((GuiConst_TEXT PrefixRom *)ChPtr,                             \
+                  ChCnt,                                                       \
+                  TxtNdx,                                                      \
+                  FColor,                                                      \
+                  BColor,                                                      \
+                  Transparent);
+  #endif
+  #endif
+  #endif
+#else
+  #ifdef GuiConst_ICC_COMPILER
+#define DRAW_ROM_TEXT(ChPtr, ChCnt, TxtNdx, FColor, BColor, Transparent)       \
+        ExtractUnicodeString((GuiConst_INT8U *)ChPtr, ChCnt);                  \
+        DrawText((GuiConst_TEXT *)&sgl.UnicodeTextBuf,                         \
+                  ChCnt,                                                       \
+                  TxtNdx,                                                      \
+                  FColor,                                                      \
+                  BColor,                                                      \
+                  Transparent);
+  #else
+  #ifdef GuiConst_CODEVISION_COMPILER
+#define DRAW_ROM_TEXT(ChPtr, ChCnt, TxtNdx, FColor, BColor, Transparent)       \
+        ExtractUnicodeString((GuiConst_INT8U *)ChPtr, ChCnt);                  \
+        DrawText((GuiConst_TEXT *)sgl.UnicodeTextBuf,                          \
+                  ChCnt,                                                       \
+                  TxtNdx,                                                      \
+                  FColor,                                                      \
+                  BColor,                                                      \
+                  Transparent);
+  #else
+  #ifdef GuiConst_RENESAS_COMPILER_FAR
+#define DRAW_ROM_TEXT(ChPtr, ChCnt, TxtNdx, FColor, BColor, Transparent)       \
+        ExtractUnicodeString((GuiConst_INT8U PrefixLocate *)ChPtr, ChCnt);    \
+        DrawText((GuiConst_TEXT PrefixLocate *)sgl.UnicodeTextBuf,            \
+                  ChCnt,                                                       \
+                  TxtNdx,                                                      \
+                  FColor,                                                      \
+                  BColor,                                                      \
+                  Transparent);
+  #else
+#define DRAW_ROM_TEXT(ChPtr, ChCnt, TxtNdx, FColor, BColor, Transparent)       \
+        ExtractUnicodeString((GuiConst_INT8U PrefixRom *)ChPtr, ChCnt);        \
+        DrawText((GuiConst_TEXT *)&sgl.UnicodeTextBuf,                         \
+                  ChCnt,                                                       \
+                  TxtNdx,                                                      \
+                  FColor,                                                      \
+                  BColor,                                                      \
+                  Transparent);
+  #endif
+  #endif
+#endif
+#endif
+
+//------------------------------------------------------------------------------
+static void DrawText(
+   GuiConst_TEXT PrefixGeneric *CharPtr,
+   GuiConst_INT16U CharCount,
+   GuiConst_INT8U TextNdx,
+   GuiConst_INTCOLOR ForeColor,
+   GuiConst_INTCOLOR BackColor,
+   GuiConst_INT8U Transparent)
+{
+  GuiConst_INT16S P, N;
+  GuiConst_INT16U CharCnt;
+#ifdef GuiConst_REMOTE_FONT_DATA
+  GuiConst_INT32U PrefixRom TempOfs;
+#else
+  GuiConst_INT8U PrefixRom * TempPtr;
+#endif
+  GuiConst_INT8U  TempPsMode;
+  GuiConst_INT16S TextPixelLen;
+  GuiConst_INT16S X1, Y1, X2, Y2;
+  GuiConst_INT16S  TextXOfs[GuiConst_MAX_TEXT_LEN + 2];
+
+#ifdef GuiConst_ARAB_CHARS_INUSE
+  CharCnt = ArabicCorrection(CharPtr,
+                             CharCount,
+                            (sgl.CurItem.TextPar[TextNdx].BitFlags &
+               GuiLib_BITFLAG_REVERSEWRITING) > 0);
+#else
+  CharCnt = CharCount;
+#endif
+  PrepareText(CharPtr, CharCnt, TextNdx);
+
+  if (sgl.CurItem.TextPar[TextNdx].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
+      TempPsMode = sgl.TextPsMode[N];
+      sgl.TextPsMode[N] = sgl.TextPsMode[CharCnt - 1 - N];
+      sgl.TextPsMode[CharCnt - 1 - N] = TempPsMode;
+    }
+  }
+
+  TextPixelLen = TextPixelLength(sgl.CurItem.TextPar[TextNdx].Ps,
+                                 CharCnt,
+                                 TextXOfs);
+
+  X1 = sgl.CurItem.X1;
+  switch (sgl.CurItem.TextPar[TextNdx].Alignment)
+  {
+    case GuiLib_ALIGN_CENTER:
+      if (CharCnt > 0)
+        X1 -= TextPixelLen / 2;
+      break;
+
+    case GuiLib_ALIGN_RIGHT:
+      X1 -= TextPixelLen - 1;
+      break;
+  }
+  Y1 = sgl.CurItem.Y1 - ReadByte(sgl.CurFont->BaseLine);
+  X2 = X1 + TextPixelLen - 1;
+  Y2 = Y1 + ReadByte(sgl.CurFont->YSize) - 1;
+
+  sgl.FontWriteX1 = X1;
+  sgl.FontWriteY1 = Y1;
+  sgl.FontWriteX2 = X2;
+  sgl.FontWriteY2 = Y2;
+
+  if (sgl.DisplayWriting)
+  {
+    if (CharCnt > 0)
+    {
+      if ((Transparent == 0) && (sgl.CurItem.TextPar[TextNdx].BackBoxSizeX == 0))
+      {
+        SetBackColorBox(X1, Y1, X2, Y2, TextNdx);
+        GuiLib_FillBox(sgl.BbX1, sgl.BbY1, sgl.BbX2, sgl.BbY2, BackColor);
+      }
+
+      for (P = 0; P < CharCnt; P++)
+#ifdef GuiConst_REMOTE_FONT_DATA
+        DrawChar(X1 + TextXOfs[P], Y1, sgl.CurFont, sgl.TextCharNdx[P], ForeColor, (Transparent == 2));
+#else
+        DrawChar(X1 + TextXOfs[P], Y1, sgl.CurFont, sgl.TextCharPtrAry[P], ForeColor, (Transparent == 2));
+#endif
+    }
+
+    if ((sgl.CurItem.TextPar[TextNdx].BitFlags & GuiLib_BITFLAG_UNDERLINE) &&
+        (CharCnt > 0))
+      GuiLib_FillBox(X1, Y1 + ReadByte(sgl.CurFont->Underline1), X2,
+         Y1 + ReadByte(sgl.CurFont->Underline2), ForeColor);
+
+    GuiLib_MarkDisplayBoxRepaint(X1, Y1, X2, Y2);
+
+#ifdef GuiConst_BLINK_SUPPORT_ON
+#ifndef GuiConst_BLINK_FIELDS_OFF
+    if ((sgl.CurItem.TextPar[TextNdx].BitFlags & GuiLib_BITFLAG_BLINKTEXTFIELD) &&
+        (sgl.CurItem.BlinkFieldNo < GuiConst_BLINK_FIELDS_MAX))
+    {
+      sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].InUse = 1;
+      sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].BlinkBoxInverted = 0;
+      sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].ItemType = sgl.CurItem.ItemType;
+      sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].CharCnt = CharCnt;
+      sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].TextPar = sgl.CurItem.TextPar[TextNdx];
+      sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].FormatFieldWidth =
+         sgl.CurItem.FormatFieldWidth;
+      sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].FormatDecimals =
+         sgl.CurItem.FormatDecimals;
+      sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].FormatAlignment =
+         sgl.CurItem.FormatAlignment;
+      sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].FormatFormat = sgl.CurItem.FormatFormat;
+      sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].VarType = sgl.CurItem.VarType;
+      sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].XSize =
+      ReadByte(sgl.CurFont->XSize);
+      sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].PsNumWidth =
+      ReadByte(sgl.CurFont->PsNumWidth);
+      sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].PsSpace =
+      ReadByte(sgl.CurFont->PsSpace);
+      if (sgl.CurItem.ItemType == GuiLib_ITEM_TEXT)
+        sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].TextPtr =
+           sgl.CurItem.TextPtr[TextNdx];
+      else
+        sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].TextPtr =
+           (GuiConst_TEXT*)sgl.CurItem.VarPtr;
+      sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].X1 = sgl.CurItem.X1;
+      sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].X2 = sgl.CurItem.X2;
+      if (sgl.CurItem.TextPar[TextNdx].BackBoxSizeX > 0)
+      {
+        if (sgl.CurItem.TextPar[TextNdx].BackBoxSizeY1 > 0)
+          sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].Y1 =
+             sgl.CurItem.Y1 - sgl.CurItem.TextPar[TextNdx].BackBoxSizeY1;
+        else
+          sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].Y1 =
+        sgl.CurItem.Y1 - ReadByte(sgl.CurFont->BaseLine);
+        if (sgl.CurItem.TextPar[TextNdx].BackBoxSizeY1 > 0)
+          sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].Y2 =
+             sgl.CurItem.Y1 + sgl.CurItem.TextPar[TextNdx].BackBoxSizeY2;
+        else
+          sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].Y2 =
+          sgl.CurItem.Y1 - ReadByte(sgl.CurFont->BaseLine) +
+                ReadByte(sgl.CurFont->YSize) - 1;
+      }
+      else
+      {
+        sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].Y1 = Y1;
+        sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].Y2 = Y2;
+      }
+    }
+#endif
+#endif
+  }
+}
+
+#ifdef GuiConst_ITEM_TEXTBLOCK_INUSE
+
+//------------------------------------------------------------------------------
+#ifdef GuiConst_CHARMODE_ANSI
+  #ifdef GuiConst_ICC_COMPILER
+#define DRAW_ROM_TEXTBLOCK(ChPtr, ChCnt, TxtNdx, FColor, BColor, Transparent)  \
+        DrawTextBlock((GuiConst_TEXT *)ChPtr,                                  \
+                       ChCnt,                                                  \
+                       TxtNdx,                                                 \
+                       FColor,                                                 \
+                       BColor,                                                 \
+                       Transparent);
+  #else
+  #ifdef GuiConst_CODEVISION_COMPILER
+#define DRAW_ROM_TEXTBLOCK(ChPtr, ChCnt, TxtNdx, FColor, BColor, Transparent)  \
+        DrawTextBlock((GuiConst_TEXT *)ChPtr,                                  \
+                       ChCnt,                                                  \
+                       TxtNdx,                                                 \
+                       FColor,                                                 \
+                       BColor,                                                 \
+                       Transparent);
+  #else
+  #ifdef GuiConst_RENESAS_COMPILER_FAR
+#define DRAW_ROM_TEXTBLOCK(ChPtr, ChCnt, TxtNdx, FColor, BColor, Transparent)  \
+        DrawTextBlock((GuiConst_TEXT PrefixLocate *)ChPtr,                     \
+                       ChCnt,                                                  \
+                       TxtNdx,                                                 \
+                       FColor,                                                 \
+                       BColor,                                                 \
+                       Transparent);
+  #else
+#define DRAW_ROM_TEXTBLOCK(ChPtr, ChCnt, TxtNdx, FColor, BColor, Transparent)  \
+        DrawTextBlock((GuiConst_TEXT PrefixRom *)ChPtr,                        \
+                       ChCnt,                                                  \
+                       TxtNdx,                                                 \
+                       FColor,                                                 \
+                       BColor,                                                 \
+                       Transparent);
+  #endif
+  #endif
+  #endif
+#else
+  #ifdef GuiConst_ICC_COMPILER
+#define DRAW_ROM_TEXTBLOCK(ChPtr, ChCnt, TxtNdx, FColor, BColor, Transparent)  \
+        ExtractUnicodeString((GuiConst_INT8U *)ChPtr, ChCnt);                  \
+        DrawTextBlock((GuiConst_TEXT *)&sgl.UnicodeTextBuf,                    \
+                       ChCnt,                                                  \
+                       TxtNdx,                                                 \
+                       FColor,                                                 \
+                       BColor,                                                 \
+                       Transparent);
+  #else
+  #ifdef GuiConst_CODEVISION_COMPILER
+#define DRAW_ROM_TEXTBLOCK(ChPtr, ChCnt, TxtNdx, FColor, BColor, Transparent)  \
+        ExtractUnicodeString((GuiConst_INT8U *)ChPtr, ChCnt);                  \
+        DrawTextBlock((GuiConst_TEXT *)sgl.UnicodeTextBuf,                     \
+                       ChCnt,                                                  \
+                       TxtNdx,                                                 \
+                       FColor,                                                 \
+                       BColor,                                                 \
+                       Transparent);
+  #else
+  #ifdef GuiConst_RENESAS_COMPILER_FAR
+#define DRAW_ROM_TEXTBLOCK(ChPtr, ChCnt, TxtNdx, FColor, BColor, Transparent)  \
+        ExtractUnicodeString((GuiConst_INT8U PrefixLocate *)ChPtr, ChCnt);     \
+        DrawTextBlock((GuiConst_TEXT PrefixLocate *)sgl.UnicodeTextBuf,        \
+                       ChCnt,                                                  \
+                       TxtNdx,                                                 \
+                       FColor,                                                 \
+                       BColor,                                                 \
+                       Transparent);
+  #else
+#define DRAW_ROM_TEXTBLOCK(ChPtr, ChCnt, TxtNdx, FColor, BColor, Transparent)  \
+        ExtractUnicodeString((GuiConst_INT8U PrefixRom *)ChPtr, ChCnt);        \
+        DrawTextBlock((GuiConst_TEXT *)&sgl.UnicodeTextBuf,                    \
+                       ChCnt,                                                  \
+                       TxtNdx,                                                 \
+                       FColor,                                                 \
+                       BColor,                                                 \
+                       Transparent);
+  #endif
+  #endif
+#endif
+#endif
+
+//------------------------------------------------------------------------------
+static void DrawTextBlock(
+   GuiConst_TEXT PrefixGeneric *CharPtr,
+   GuiConst_INT16U CharCnt,
+   GuiConst_INT8U TextNdx,
+   GuiConst_INTCOLOR ForeColor,
+   GuiConst_INTCOLOR BackColor,
+   GuiConst_INT8U Transparent)
+{
+  GuiConst_INT16S X1, Y1, X2, Y2;
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+  GuiConst_INT16S CX1, CX2;
+#endif
+  GuiConst_INT16S CY1, CY2;
+  GuiConst_INT16S TextXOfs[GuiConst_MAX_TEXT_LEN + 2];
+  GuiConst_INT16S TextCharLineStart[GuiConst_MAX_PARAGRAPH_LINE_CNT + 1];
+  GuiConst_INT16S TextCharLineEnd[GuiConst_MAX_PARAGRAPH_LINE_CNT + 1];
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+  GuiConst_INT16S RemClipX1, RemClipY1, RemClipX2, RemClipY2;
+#endif
+#ifdef GuiConst_BLINK_SUPPORT_ON
+#ifndef GuiConst_BLINK_FIELDS_OFF
+  GuiConst_INT16S BlinkNo;
+#endif
+#endif
+  GuiConst_INT16S PixWidth;
+  GuiConst_INT16S N, P, M, F;
+  GuiConst_INT16S LineLen;
+  GuiConst_INT16S LineCnt;
+  GuiConst_INT16S LineCnt2;
+  GuiConst_INT16S BlindLinesAtTop;
+  GuiConst_INT16S XPos, YPos;
+  GuiConst_INT16S XStart, XEnd;
+  GuiConst_INT8U  TempPsMode;
+#ifdef GuiConst_REMOTE_FONT_DATA
+  GuiConst_INT32U PrefixRom TempOfs;
+  GuiConst_INT8U CharHeader1[GuiLib_CHR_LINECTRL_OFS];
+  GuiConst_INT8U CharHeader2[GuiLib_CHR_LINECTRL_OFS];
+#else
+  GuiConst_INT8U PrefixRom * TempPtr;
+#endif
+
+  X1 = sgl.CurItem.X1;
+  Y1 = sgl.CurItem.Y1;
+  X2 = sgl.CurItem.X2;
+  Y2 = sgl.CurItem.Y2;
+  sgl.FontWriteX1 = X1;
+  sgl.FontWriteY1 = Y1;
+  sgl.FontWriteX2 = X2;
+  sgl.FontWriteY2 = Y2;
+
+  PixWidth = 0;
+
+  if (sgl.DisplayWriting)
+  {
+    if (!Transparent && (sgl.CurItem.TextPar[TextNdx].BackBoxSizeX == 0))
+    {
+      SetBackColorBox(X1, Y1, X2, Y2, TextNdx);
+      GuiLib_FillBox(sgl.BbX1, sgl.BbY1, sgl.BbX2, sgl.BbY2, BackColor);
+    }
+
+    if (sgl.CurItem.CompPars.CompTextBox.LineDistRelToFont)
+    {
+      sgl.CurItem.CompPars.CompTextBox.LineDist +=sgl.CurFont->YSize;
+      sgl.CurItem.CompPars.CompTextBox.LineDistRelToFont = 0;
+    }
+
+    LineCnt = 0;
+#ifdef GuiConst_TEXTBOX_FIELDS_ON
+    sgl.CurItem.CompPars.CompTextBox.Lines = 1;
+#endif
+    if (CharCnt > 0)
+    {
+      PixWidth = X2 - X1 + 1;
+
+#ifdef GuiConst_ARAB_CHARS_INUSE
+      CharCnt =
+         ArabicCorrection(CharPtr,
+                          CharCnt,
+                          (sgl.CurItem.TextPar[TextNdx].BitFlags &
+                           GuiLib_BITFLAG_REVERSEWRITING) > 0);
+#endif
+      PrepareText(CharPtr, CharCnt, TextNdx);
+      TextPixelLength(sgl.CurItem.TextPar[TextNdx].Ps,
+                      CharCnt,
+                      TextXOfs);
+
+      TextCharLineStart[0] = 0;
+      TextCharLineEnd[0] = -1;
+#ifdef GuiConst_TEXTBOX_FIELDS_ON
+      if (sgl.CurItem.CompPars.CompTextBox.ScrollIndex == 0xFF)
+        BlindLinesAtTop = 0;
+      else
+        BlindLinesAtTop = sgl.CurItem.CompPars.CompTextBox.ScrollPos /
+           sgl.CurItem.CompPars.CompTextBox.LineDist;
+#else
+      BlindLinesAtTop = 0;
+#endif
+      LineCnt = 1 - BlindLinesAtTop;
+      if (LineCnt >= 1)
+        LineCnt = 1;
+      LineCnt2 = 1;
+      P = 0;
+#ifdef GuiConst_REMOTE_FONT_DATA
+      GuiLib_RemoteDataReadBlock(
+         (GuiConst_INT32U PrefixRom)GuiFont_ChPtrList[
+         sgl.TextCharNdx[TextCharLineStart[LineCnt2 - 1]]],
+         GuiLib_CHR_LINECTRL_OFS,
+         CharHeader2);
+#endif
+      while (P < CharCnt)
+      {
+        while ((P < CharCnt - 1) &&
+           !((ReadBytePtr(CharPtr + P) == GuiLib_LINEFEED) ||
+           ((ReadBytePtr(CharPtr + P) != ' ') &&
+           (ReadBytePtr(CharPtr + P + 1) == ' ')) ||
+           ((ReadBytePtr(CharPtr + P) == '-') &&
+           (ReadBytePtr(CharPtr + P + 1) != ' '))))
+          P++;
+
+        F = 0;
+
+        if (CalcCharsWidth(TextCharLineStart[LineCnt2 - 1], P,
+                           TextXOfs, &XStart, &XEnd) > PixWidth)
+        {
+          if (TextCharLineEnd[LineCnt2 - 1] == -1)
+          {
+            if (ReadBytePtr(CharPtr + P) == GuiLib_LINEFEED)
+            {
+              TextCharLineEnd[LineCnt2 - 1] = P - 1;
+              F = 1;
+            }
+            else
+              TextCharLineEnd[LineCnt2 - 1] = P;
+
+            TextCharLineStart[LineCnt2] = P + 1;
+            TextCharLineEnd[LineCnt2] = -1;
+          }
+          else
+          {
+            TextCharLineStart[LineCnt2] = TextCharLineEnd[LineCnt2 - 1] + 1;
+            while ((TextCharLineStart[LineCnt2] < P) &&
+               (ReadBytePtr(CharPtr + TextCharLineStart[LineCnt2]) == ' '))
+              TextCharLineStart[LineCnt2]++;
+            TextCharLineEnd[LineCnt2] = P;
+          }
+          if (LineCnt >= GuiConst_MAX_PARAGRAPH_LINE_CNT)
+          {
+            P = CharCnt;
+            break;
+          }
+          LineCnt++;
+          if (LineCnt > 1)
+            LineCnt2 = LineCnt;
+          else
+          {
+            TextCharLineStart[LineCnt2 - 1] = TextCharLineStart[LineCnt2];
+            TextCharLineEnd[LineCnt2 - 1] = TextCharLineEnd[LineCnt2];
+          }
+#ifdef GuiConst_TEXTBOX_FIELDS_ON
+          sgl.CurItem.CompPars.CompTextBox.Lines++;
+#endif
+        }
+        else
+          TextCharLineEnd[LineCnt2 - 1] = P;
+
+        if ((ReadBytePtr(CharPtr + P) == GuiLib_LINEFEED) &&
+            (F == 0))
+        {
+          TextCharLineEnd[LineCnt2 - 1] = P - 1;
+          TextCharLineStart[LineCnt2] = P + 1;
+          TextCharLineEnd[LineCnt2] = -1;
+
+          if (LineCnt >= GuiConst_MAX_PARAGRAPH_LINE_CNT)
+          {
+            P = CharCnt;
+            break;
+          }
+          LineCnt++;
+          if (LineCnt > 1)
+            LineCnt2 = LineCnt;
+          else
+          {
+            TextCharLineStart[LineCnt2 - 1] = TextCharLineStart[LineCnt2];
+            TextCharLineEnd[LineCnt2 - 1] = TextCharLineEnd[LineCnt2];
+          }
+#ifdef GuiConst_TEXTBOX_FIELDS_ON
+          sgl.CurItem.CompPars.CompTextBox.Lines++;
+#endif
+        }
+
+        P++;
+      }
+    }
+
+    if (LineCnt >= 1)
+    {
+      if (sgl.CurItem.TextPar[TextNdx].BitFlags & GuiLib_BITFLAG_REVERSEWRITING)
+      {
+        for (M = 0; M < LineCnt ; M++)
+        {
+          for (P = TextCharLineStart[M]; P <= (TextCharLineStart[M] +
+             ((TextCharLineEnd[M] - TextCharLineStart[M] + 1) / 2) - 1); P++)
+          {
+#ifdef GuiConst_REMOTE_FONT_DATA
+            TempOfs = sgl.TextCharNdx[P];
+            sgl.TextCharNdx[P] =
+               sgl.TextCharNdx[TextCharLineEnd[M] - (P - TextCharLineStart[M])];
+            sgl.TextCharNdx[TextCharLineEnd[M] - (P - TextCharLineStart[M])] =
+               TempOfs;
+#else
+#ifdef GuiConst_CODEVISION_COMPILER
+            TempPtr = &sgl.TextCharPtrAry[P];
+#else
+            TempPtr = sgl.TextCharPtrAry[P];
+#endif
+            sgl.TextCharPtrAry[P] = (GuiConst_INT8U PrefixRom *)
+               sgl.TextCharPtrAry[TextCharLineEnd[M] - (P - TextCharLineStart[M])];
+            sgl.TextCharPtrAry[TextCharLineEnd[M] - (P - TextCharLineStart[M])] =
+               (GuiConst_INT8U PrefixRom *)TempPtr;
+#endif
+            TempPsMode = sgl.TextPsMode[P];
+            sgl.TextPsMode[P] =
+               sgl.TextPsMode[TextCharLineEnd[M] - (P - TextCharLineStart[M])];
+            sgl.TextPsMode[TextCharLineEnd[M] - (P - TextCharLineStart[M])] =
+               TempPsMode;
+          }
+        }
+        TextPixelLength(sgl.CurItem.TextPar[TextNdx].Ps,
+                        CharCnt,
+                        TextXOfs);
+      }
+
+      CY1 = Y1;
+      CY2 = Y2;
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+      CX1 = X1;
+      CX2 = X2;
+      RemClipX1 = sgl.CurItem.ClipRectX1;
+      RemClipY1 = sgl.CurItem.ClipRectY1;
+      RemClipX2 = sgl.CurItem.ClipRectX2;
+      RemClipY2 = sgl.CurItem.ClipRectY2;
+      if (RemClipX1 > CX1)
+        CX1 = RemClipX1;
+      if (RemClipY1 > CY1)
+        CY1 = RemClipY1;
+      if (RemClipX2 < CX2)
+        CX2 = RemClipX2;
+      if (RemClipY2 < CY2)
+        CY2 = RemClipY2;
+      GuiLib_SetClipping(CX1, CY1, CX2, CY2);
+#endif
+
+#ifdef GuiConst_BLINK_SUPPORT_ON
+#ifndef GuiConst_BLINK_FIELDS_OFF
+      if ((sgl.CurItem.TextPar[TextNdx].BitFlags & GuiLib_BITFLAG_BLINKTEXTFIELD) &&
+          (sgl.CurItem.BlinkFieldNo < GuiConst_BLINK_FIELDS_MAX))
+      {
+        BlinkNo = sgl.CurItem.BlinkFieldNo;
+        sgl.BlinkTextItems[BlinkNo].InUse = 1;
+        sgl.BlinkTextItems[BlinkNo].ItemType = sgl.CurItem.ItemType;
+        sgl.BlinkTextItems[BlinkNo].VarType = sgl.CurItem.VarType;
+        sgl.BlinkTextItems[BlinkNo].CharCnt = CharCnt;
+        sgl.BlinkTextItems[BlinkNo].TextPar = sgl.CurItem.TextPar[TextNdx];
+        sgl.BlinkTextItems[BlinkNo].XSize = sgl.CurFont->XSize;
+        sgl.BlinkTextItems[BlinkNo].YSize = sgl.CurFont->YSize;
+        sgl.BlinkTextItems[BlinkNo].PsNumWidth = sgl.CurFont->PsNumWidth;
+        sgl.BlinkTextItems[BlinkNo].PsSpace = sgl.CurFont->PsSpace;
+        if (sgl.CurItem.ItemType == GuiLib_ITEM_TEXTBLOCK)
+          sgl.BlinkTextItems[BlinkNo].TextPtr = sgl.CurItem.TextPtr[TextNdx];
+        else
+          sgl.BlinkTextItems[BlinkNo].TextPtr = (GuiConst_TEXT*)sgl.CurItem.VarPtr;
+        sgl.BlinkTextItems[BlinkNo].X1 = X1;
+        sgl.BlinkTextItems[BlinkNo].X2 = X2;
+        sgl.BlinkTextItems[BlinkNo].Y1 = Y1;
+        sgl.BlinkTextItems[BlinkNo].Y2 = Y2;
+        sgl.BlinkTextItems[BlinkNo].LineCnt = LineCnt;
+        sgl.BlinkTextItems[BlinkNo].TextBoxLineDist =
+           sgl.CurItem.CompPars.CompTextBox.LineDist;
+        sgl.BlinkTextItems[BlinkNo].BlindLinesAtTop = BlindLinesAtTop;
+        sgl.BlinkTextItems[BlinkNo].FormatFieldWidth = sgl.CurItem.FormatFieldWidth;
+        sgl.BlinkTextItems[BlinkNo].FormatDecimals = sgl.CurItem.FormatDecimals;
+        sgl.BlinkTextItems[BlinkNo].FormatAlignment = sgl.CurItem.FormatAlignment;
+        sgl.BlinkTextItems[BlinkNo].FormatFormat = sgl.CurItem.FormatFormat;
+        sgl.BlinkTextItems[BlinkNo].TextBoxHorzAlignment =
+           sgl.CurItem.CompPars.CompTextBox.HorzAlignment;
+        sgl.BlinkTextItems[BlinkNo].TextBoxVertAlignment =
+           sgl.CurItem.CompPars.CompTextBox.VertAlignment;
+#ifdef GuiConst_TEXTBOX_FIELDS_ON
+        sgl.BlinkTextItems[BlinkNo].TextBoxScrollPos =
+           sgl.CurItem.CompPars.CompTextBox.ScrollPos;
+#endif
+      }
+      else
+        BlinkNo = -1;
+#endif
+#endif
+
+      YPos = Y1;
+#ifdef GuiConst_TEXTBOX_FIELDS_ON
+      if (BlindLinesAtTop < 0)
+        BlindLinesAtTop = 0;
+      YPos -= sgl.CurItem.CompPars.CompTextBox.ScrollPos -
+             (sgl.CurItem.CompPars.CompTextBox.LineDist * BlindLinesAtTop);
+#endif
+
+      N = ReadByte(sgl.CurFont->YSize) +
+         (LineCnt - 1) * sgl.CurItem.CompPars.CompTextBox.LineDist;
+      switch (sgl.CurItem.CompPars.CompTextBox.VertAlignment)
+      {
+        case GuiLib_ALIGN_CENTER:
+          YPos += (Y2 - Y1 + 1 - N) / 2;
+          break;
+
+        case GuiLib_ALIGN_RIGHT:
+          YPos += Y2 - Y1 + 1 - N;
+          break;
+      }
+
+      for (N = 0; N < LineCnt; N++)
+      {
+        if (TextCharLineEnd[N] >= TextCharLineStart[N])
+        {
+          XPos = X1;
+
+          LineLen = CalcCharsWidth(TextCharLineStart[N],
+                                   TextCharLineEnd[N],
+                                   TextXOfs,
+                                   &XStart,
+                                   &XEnd);
+          switch (sgl.CurItem.CompPars.CompTextBox.HorzAlignment)
+          {
+            case GuiLib_ALIGN_CENTER:
+              XPos += (PixWidth - LineLen) / 2;
+              break;
+
+            case GuiLib_ALIGN_RIGHT:
+              XPos += PixWidth - LineLen;
+              break;
+          }
+
+          if (sgl.CurItem.TextPar[TextNdx].BitFlags & GuiLib_BITFLAG_UNDERLINE)
+            GuiLib_FillBox(XPos, YPos + ReadByte(sgl.CurFont->Underline1),
+               XPos + LineLen - 1, YPos + ReadByte(sgl.CurFont->Underline2),
+               ForeColor);
+
+          XPos -= XStart;
+          if ((YPos + sgl.CurFont->YSize >= CY1) && (YPos <= CY2))
+            for (P = TextCharLineStart[N]; P <= TextCharLineEnd[N]; P++)
+#ifdef GuiConst_REMOTE_FONT_DATA
+              DrawChar(
+                 XPos + TextXOfs[P], YPos, sgl.CurFont, sgl.TextCharNdx[P], ForeColor, 0);
+#else
+              DrawChar(XPos + TextXOfs[P], YPos, sgl.CurFont, sgl.TextCharPtrAry[P],
+                 ForeColor, 0);
+#endif
+        }
+        YPos += sgl.CurItem.CompPars.CompTextBox.LineDist;
+      }
+
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+      GuiLib_SetClipping(RemClipX1, RemClipY1, RemClipX2, RemClipY2);
+#endif
+    }
+    GuiLib_MarkDisplayBoxRepaint(X1, Y1, X2, Y2);
+  }
+}
+#endif
+// Groupend DRAW
+
+#ifdef GuiConst_FLOAT_SUPPORT_ON
+static float Floor(float X)
+{
+  GuiConst_INT32S I;
+
+  I = X - 2;
+  while(++I <= X - 1);
+  return I;
+}
+#endif
+
+//------------------------------------------------------------------------------
+static GuiConst_INT32S ReadVar(
+   void PrefixLocate *VarPtr,
+   GuiConst_INT8U VarType)
+{
+#ifdef GuiConst_FLOAT_SUPPORT_ON
+  GuiConst_INT32S tmp;
+  GuiConst_INT8U i;
+  double dfactor;
+  double dx;
+  float ffactor;
+  float fx;
+#endif
+
+  if (VarPtr == 0)
+    return (0);
+  else
+  {
+    if (sgl.CurItem.FormatFormat == GuiLib_FORMAT_EXP)
+    {
+#ifdef GuiConst_FLOAT_SUPPORT_ON
+      if ((VarType == GuiLib_VAR_FLOAT) || (VarType == GuiLib_VAR_DOUBLE))
+        sgl.VarExponent = 0;
+      else
+#endif
+        sgl.CurItem.FormatFormat = GuiLib_FORMAT_DEC;
+    }
+    switch (VarType)
+    {
+      case GuiLib_VAR_BOOL:
+        if (*(GuiConst_INT8U PrefixLocate *) VarPtr == 0)
+          return (0);
+        else
+          return (1);
+
+      case GuiLib_VAR_UNSIGNED_CHAR:
+        return (*(GuiConst_INT8U PrefixLocate *) VarPtr);
+
+      case GuiLib_VAR_SIGNED_CHAR:
+        return (*(GuiConst_INT8S PrefixLocate *) VarPtr);
+
+      case GuiLib_VAR_UNSIGNED_INT:
+        return (*(GuiConst_INT16U PrefixLocate *) VarPtr);
+
+      case GuiLib_VAR_SIGNED_INT:
+        return (*(GuiConst_INT16S PrefixLocate *) VarPtr);
+
+      case GuiLib_VAR_UNSIGNED_LONG:
+        return (*(GuiConst_INT32U PrefixLocate *) VarPtr);
+
+      case GuiLib_VAR_SIGNED_LONG:
+        return (*(GuiConst_INT32S PrefixLocate *) VarPtr);
+
+      case GuiLib_VAR_COLOR:
+        return (*(GuiConst_INTCOLOR PrefixLocate *) VarPtr);
+
+      case GuiLib_VAR_FLOAT:
+#ifdef GuiConst_FLOAT_SUPPORT_ON
+        fx = *(float PrefixLocate *) VarPtr;
+        if (fx < 0)
+          fx = -fx;
+        if ((sgl.CurItem.FormatFormat == GuiLib_FORMAT_EXP) && (fx != 0))
+        {
+          while (Floor(fx + 0.5) > 10)
+          {
+            fx /= 10;
+            sgl.VarExponent++;
+          }
+          while (Floor(fx) < 1)
+          {
+            fx *= 10;
+            sgl.VarExponent--;
+          }
+        }
+        if ((sgl.CurItem.FormatFormat == GuiLib_FORMAT_DEC) ||
+            (sgl.CurItem.FormatFormat == GuiLib_FORMAT_EXP))
+        {
+          ffactor=1.0;
+          for (i = 0; i < sgl.CurItem.FormatDecimals ; i++)
+            ffactor *= 10.0;
+          tmp = (GuiConst_INT32S) (fx * ffactor);
+          ffactor *= 100.0;
+          if (((GuiConst_INT32S) (fx * ffactor) - (tmp * 100)) >= 45)
+            tmp++;
+          if (*(float PrefixLocate *) VarPtr < 0)
+            tmp = -tmp;
+        }
+        else
+          tmp = (GuiConst_INT32S) *(float PrefixLocate *) VarPtr;
+        return (tmp);
+#else
+        return (0);
+#endif
+
+      case GuiLib_VAR_DOUBLE:
+#ifdef GuiConst_FLOAT_SUPPORT_ON
+        dx = *(double PrefixLocate *) VarPtr;
+        if (dx < 0)
+          dx = -dx;
+        if ((sgl.CurItem.FormatFormat == GuiLib_FORMAT_EXP) && (dx != 0))
+        {
+          while (dx > 10)
+          {
+            dx /= 10;
+            sgl.VarExponent++;
+          }
+          while (dx < 1)
+          {
+            dx *= 10;
+            sgl.VarExponent--;
+          }
+        }
+        if ((sgl.CurItem.FormatFormat == GuiLib_FORMAT_DEC) ||
+            (sgl.CurItem.FormatFormat == GuiLib_FORMAT_EXP))
+        {
+          dfactor=1.0;
+          for (i = 0; i < sgl.CurItem.FormatDecimals ; i++)
+            dfactor *= 10.0;
+          tmp = (GuiConst_INT32S) (dx * dfactor);
+          dfactor *= 100.0;
+          if (((GuiConst_INT32S) (dx * dfactor) - (tmp * 100)) >= 45)
+            tmp++;
+          if (*(double PrefixLocate *) VarPtr < 0)
+            tmp = -tmp;
+        }
+        else
+          tmp = (GuiConst_INT32S) dx;
+        return (tmp);
+#else
+        return (0);
+#endif
+
+      default:
+        return (0);
+    }
+  }
+}
+
+//------------------------------------------------------------------------------
+static GuiConst_INT8U DataNumStr(
+   GuiConst_INT32S DataValue,
+   GuiConst_INT8U VarType,
+   GuiConst_INT8U TextNdx)
+{
+  GuiConst_CHAR *S1;
+  GuiConst_INT8U StrLen, L;
+  GuiConst_INT16S I, N, P;
+  GuiConst_INT8U Offset;
+  GuiConst_INT8U Sign;
+  GuiConst_INT8U ShowSign;
+  GuiConst_INT8U ZeroPadding;
+  GuiConst_INT8U TrailingZeros;
+  GuiConst_INT8U ThousandsSeparator;
+  GuiConst_INT8U Time;
+  GuiConst_INT16S TT1, TT2, TT3;
+  GuiConst_INT8U am;
+  GuiConst_INT8U DecimalsPos;
+#ifdef GuiConst_FLOAT_SUPPORT_ON
+  GuiConst_CHAR ExponentStr[5];
+#endif
+
+  sgl.VarNumTextStr[0] = 0;
+  am = 0;
+
+  Sign = 0;
+  switch (VarType)
+  {
+    case GuiLib_VAR_BOOL:
+    case GuiLib_VAR_UNSIGNED_CHAR:
+      if (DataValue > 255)
+        DataValue = 255;
+      else if (DataValue < 0)
+        DataValue = 0;
+      break;
+
+    case GuiLib_VAR_SIGNED_CHAR:
+      if (DataValue > 127)
+        DataValue = 127;
+      else if (DataValue < -128)
+        DataValue = -128;
+      if (DataValue < 0)
+        Sign = 1;
+      break;
+
+    case GuiLib_VAR_UNSIGNED_INT:
+      if (DataValue > 65535)
+        DataValue = 65535;
+      else if (DataValue < 0)
+        DataValue = 0;
+      break;
+
+    case GuiLib_VAR_SIGNED_INT:
+      if (DataValue > 32767)
+        DataValue = 32767;
+      else if (DataValue < -32768)
+        DataValue = -32768;
+      if (DataValue < 0)
+        Sign = 1;
+      break;
+
+    case GuiLib_VAR_SIGNED_LONG:
+    case GuiLib_VAR_FLOAT:
+    case GuiLib_VAR_DOUBLE:
+      if (DataValue < 0)
+        Sign = 1;
+      break;
+
+    case GuiLib_VAR_COLOR:
+      if (DataValue < 0)
+          DataValue = 0;
+#if GuiConst_PIXEL_BYTE_SIZE == 1
+      if (DataValue > 255)
+        DataValue = 255;
+#elif GuiConst_PIXEL_BYTE_SIZE == 2
+      if (DataValue > 65535)
+        DataValue = 65535;
+#elif GuiConst_PIXEL_BYTE_SIZE == 3
+      if (DataValue > 16777215)
+        DataValue = 16777215;
+#endif
+      break;
+  }
+
+  if ((sgl.CurItem.FormatFormat == GuiLib_FORMAT_DEC) ||
+      (sgl.CurItem.FormatFormat == GuiLib_FORMAT_EXP))
+    DecimalsPos = sgl.CurItem.FormatDecimals;
+  else
+    DecimalsPos = 0;
+  Time = ((sgl.CurItem.FormatFormat == GuiLib_FORMAT_TIME_MMSS) ||
+          (sgl.CurItem.FormatFormat == GuiLib_FORMAT_TIME_HHMM_24) ||
+          (sgl.CurItem.FormatFormat == GuiLib_FORMAT_TIME_HHMMSS_24) ||
+          (sgl.CurItem.FormatFormat == GuiLib_FORMAT_TIME_HHMM_12_ampm) ||
+          (sgl.CurItem.FormatFormat == GuiLib_FORMAT_TIME_HHMMSS_12_ampm) ||
+          (sgl.CurItem.FormatFormat == GuiLib_FORMAT_TIME_HHMM_12_AMPM) ||
+          (sgl.CurItem.FormatFormat == GuiLib_FORMAT_TIME_HHMMSS_12_AMPM));
+  if ((sgl.CurItem.FormatFormat == GuiLib_FORMAT_DEC) ||
+      (sgl.CurItem.FormatFormat == GuiLib_FORMAT_EXP))
+    ShowSign = ((sgl.CurItem.TextPar[TextNdx].BitFlags &
+                 GuiLib_BITFLAG_FORMATSHOWSIGN) > 0);
+  else
+  {
+    Sign = 0;
+    ShowSign = 0;
+  }
+  if (sgl.CurItem.FormatAlignment == GuiLib_FORMAT_ALIGNMENT_RIGHT)
+    ZeroPadding = ((sgl.CurItem.TextPar[TextNdx].BitFlags &
+                    GuiLib_BITFLAG_FORMATZEROPADDING) > 0);
+  else
+    ZeroPadding = 0;
+  if ((sgl.CurItem.FormatFormat == GuiLib_FORMAT_DEC) ||
+      (sgl.CurItem.FormatFormat == GuiLib_FORMAT_EXP))
+    TrailingZeros = ((sgl.CurItem.TextPar[TextNdx].BitFlags &
+                      GuiLib_BITFLAG_FORMATTRAILINGZEROS) > 0);
+  else
+    TrailingZeros = 0;
+  if ((sgl.CurItem.FormatFormat == GuiLib_FORMAT_DEC) ||
+      (sgl.CurItem.FormatFormat == GuiLib_FORMAT_HEX_POSTFIX_H) ||
+      (sgl.CurItem.FormatFormat == GuiLib_FORMAT_HEX_PREFIX_0X) ||
+      (sgl.CurItem.FormatFormat == GuiLib_FORMAT_HEX_CLEAN))
+    ThousandsSeparator = ((sgl.CurItem.TextPar[TextNdx].BitFlags &
+                           GuiLib_BITFLAG_FORMATTHOUSANDSSEP) > 0);
+  else
+    ThousandsSeparator = 0;
+
+  if ((sgl.CurItem.FormatFormat == GuiLib_FORMAT_DEC) ||
+      (sgl.CurItem.FormatFormat == GuiLib_FORMAT_EXP))
+  {
+    if (Sign)
+      ConvertIntToStr(-DataValue, sgl.VarNumTextStr, 10);
+    else
+      ConvertIntToStr(DataValue, sgl.VarNumTextStr, 10);
+  }
+
+  else if ((sgl.CurItem.FormatFormat == GuiLib_FORMAT_HEX_POSTFIX_H) ||
+           (sgl.CurItem.FormatFormat == GuiLib_FORMAT_HEX_PREFIX_0X) ||
+           (sgl.CurItem.FormatFormat == GuiLib_FORMAT_HEX_CLEAN))
+  {
+    ConvertIntToStr(DataValue, sgl.VarNumTextStr, 16);
+    S1 = sgl.VarNumTextStr;
+    StrLen = 0;
+    while (*S1 != 0)
+    {
+      if ((*S1 >= 'a') && (*S1 <= 'f'))
+        *S1 -= 32;
+      S1++;
+      StrLen++;
+    }
+    if (DataValue < 0)
+    {
+      while ((StrLen > 1) && (StrLen >= sgl.CurItem.FormatFieldWidth))
+      {
+        if (sgl.VarNumTextStr[0] == 'F')
+        {
+          for (N = 0; N < StrLen; N++)
+            sgl.VarNumTextStr[N] = sgl.VarNumTextStr[N + 1];
+          sgl.VarNumTextStr[StrLen] = 0;
+          StrLen--;
+        }
+        else
+          break;
+      }
+
+    }
+    if (StrLen >= GuiConst_MAX_VARNUM_TEXT_LEN)
+      return (0);
+
+    switch (sgl.CurItem.FormatFormat)
+    {
+      case GuiLib_FORMAT_HEX_POSTFIX_H:
+        if (StrLen < GuiConst_MAX_VARNUM_TEXT_LEN - 1)
+        {
+          #ifdef GuiConst_CODEVISION_COMPILER
+          strcatf(sgl.VarNumTextStr, "h");
+          #else
+          strcat(sgl.VarNumTextStr, "h");
+          #endif
+        }
+        break;
+      case GuiLib_FORMAT_HEX_PREFIX_0X:
+        if (StrLen < GuiConst_MAX_VARNUM_TEXT_LEN - 2)
+        {
+          for (N = StrLen - 1; N >= 0; N--)
+            sgl.VarNumTextStr[N + 2] = sgl.VarNumTextStr[N];
+          sgl.VarNumTextStr[0] = '0';
+          sgl.VarNumTextStr[1] = 'x';
+        }
+        break;
+    }
+  }
+
+  else if (Time)
+  {
+    if ((sgl.CurItem.FormatFormat == GuiLib_FORMAT_TIME_HHMMSS_24) ||
+        (sgl.CurItem.FormatFormat == GuiLib_FORMAT_TIME_HHMMSS_12_ampm) ||
+        (sgl.CurItem.FormatFormat == GuiLib_FORMAT_TIME_HHMMSS_12_AMPM))
+    {
+      DataValue %= 360000;
+      TT1 = DataValue / 3600;
+      TT2 = (DataValue % 3600) / 60;
+      TT3 = DataValue % 60;
+    }
+    else
+    {
+      DataValue %= 6000;
+      TT1 = DataValue / 60;
+      TT2 = DataValue % 60;
+      TT3 = -1;
+    }
+
+    if ((sgl.CurItem.FormatFormat == GuiLib_FORMAT_TIME_HHMM_12_ampm) ||
+        (sgl.CurItem.FormatFormat == GuiLib_FORMAT_TIME_HHMMSS_12_ampm) ||
+        (sgl.CurItem.FormatFormat == GuiLib_FORMAT_TIME_HHMM_12_AMPM) ||
+        (sgl.CurItem.FormatFormat == GuiLib_FORMAT_TIME_HHMMSS_12_AMPM))
+    {
+      am = ((TT1%24) < 12);
+      TT1 %= 12;
+      if (TT1 == 0)
+        TT1 = 12;
+    }
+    else
+      am = 0;   // To avoid compiler warning
+
+    if (ZeroPadding && (TT1 < 10))
+#ifdef GuiConst_CODEVISION_COMPILER
+      strcatf(sgl.VarNumTextStr, "0");
+#else
+      strcat(sgl.VarNumTextStr, "0");
+#endif
+    ConvertIntToStr(TT1, sgl.VarNumTextStr + strlen(sgl.VarNumTextStr), 10);
+
+#ifdef GuiConst_CODEVISION_COMPILER
+    strcatf(sgl.VarNumTextStr, ":");
+#else
+    strcat(sgl.VarNumTextStr, ":");
+#endif
+
+    if (TT2 < 10)
+#ifdef GuiConst_CODEVISION_COMPILER
+      strcatf(sgl.VarNumTextStr, "0");
+#else
+      strcat(sgl.VarNumTextStr, "0");
+#endif
+    ConvertIntToStr(TT2, sgl.VarNumTextStr + strlen(sgl.VarNumTextStr), 10);
+
+    if (TT3 >= 0)
+    {
+#ifdef GuiConst_CODEVISION_COMPILER
+      strcatf(sgl.VarNumTextStr, ":");
+#else
+      strcat(sgl.VarNumTextStr, ":");
+#endif
+
+      if (TT3 < 10)
+#ifdef GuiConst_CODEVISION_COMPILER
+        strcatf(sgl.VarNumTextStr, "0");
+#else
+        strcat(sgl.VarNumTextStr, "0");
+#endif
+      ConvertIntToStr(TT3, sgl.VarNumTextStr + strlen(sgl.VarNumTextStr), 10);
+    }
+
+    if ((sgl.CurItem.FormatFormat == GuiLib_FORMAT_TIME_HHMM_12_ampm) ||
+        (sgl.CurItem.FormatFormat == GuiLib_FORMAT_TIME_HHMMSS_12_ampm))
+    {
+      if (am)
+#ifdef GuiConst_CODEVISION_COMPILER
+        strcatf(sgl.VarNumTextStr, "am");
+#else
+        strcat(sgl.VarNumTextStr, "am");
+#endif
+      else
+#ifdef GuiConst_CODEVISION_COMPILER
+        strcatf(sgl.VarNumTextStr, "pm");
+#else
+        strcat(sgl.VarNumTextStr, "pm");
+#endif
+    }
+    else if ((sgl.CurItem.FormatFormat == GuiLib_FORMAT_TIME_HHMM_12_AMPM) ||
+             (sgl.CurItem.FormatFormat == GuiLib_FORMAT_TIME_HHMMSS_12_AMPM))
+    {
+      if (am)
+#ifdef GuiConst_CODEVISION_COMPILER
+        strcatf(sgl.VarNumTextStr, "AM");
+#else
+        strcat(sgl.VarNumTextStr, "AM");
+#endif
+      else
+#ifdef GuiConst_CODEVISION_COMPILER
+        strcatf(sgl.VarNumTextStr, "PM");
+#else
+        strcat(sgl.VarNumTextStr, "PM");
+#endif
+    }
+  }
+  else
+    return (0);
+
+  StrLen = 0;
+  S1 = sgl.VarNumTextStr;
+  while (*S1 != 0)
+  {
+    StrLen++;
+    S1++;
+  }
+
+  if (DecimalsPos > 0)
+  {
+    L = DecimalsPos + 1;
+    if (StrLen < L)
+    {
+      if (L > GuiConst_MAX_VARNUM_TEXT_LEN)
+        return (0);
+      for (N = 1; N <= StrLen; N++)
+        sgl.VarNumTextStr[L - N] = sgl.VarNumTextStr[StrLen - N];
+      for (N = 0; N < L - StrLen; N++)
+        sgl.VarNumTextStr[N] = '0';
+
+      StrLen = L;
+    }
+
+    if ((!TrailingZeros) && (!Time) && (VarType != GuiLib_VAR_BOOL))
+    {
+      L = StrLen;
+      for (N = L - 1; N > L - sgl.CurItem.FormatDecimals; N--)
+        if (sgl.VarNumTextStr[N] == '0')
+        {
+          DecimalsPos--;
+          StrLen--;
+        }
+        else
+          break;
+    }
+
+    if (StrLen >= GuiConst_MAX_VARNUM_TEXT_LEN)
+      return (0);
+    P = StrLen - DecimalsPos;
+    for (N = StrLen; N > P; N--)
+      sgl.VarNumTextStr[N] = sgl.VarNumTextStr[N - 1];
+    if (ReadByte(GuiFont_DecimalChar[GuiLib_LanguageIndex]) == GuiLib_DECIMAL_PERIOD)
+      sgl.VarNumTextStr[P] = '.';
+    else
+      sgl.VarNumTextStr[P] = ',';
+    StrLen++;
+    sgl.VarNumTextStr[StrLen] = 0;
+  }
+  else
+    P = StrLen;
+
+  if (ThousandsSeparator)
+  {
+    I = 0;
+    while (P > 0)
+    {
+      if ((I > 0) && (I % 3 ==0 ))
+      {
+        for (N = StrLen; N > P; N--)
+          sgl.VarNumTextStr[N] = sgl.VarNumTextStr[N - 1];
+        if (ReadByte(GuiFont_DecimalChar[GuiLib_LanguageIndex]) == GuiLib_DECIMAL_PERIOD)
+          sgl.VarNumTextStr[P] = ',';
+        else
+          sgl.VarNumTextStr[P] = '.';
+        StrLen++;
+        if (StrLen >= GuiConst_MAX_VARNUM_TEXT_LEN)
+          return (0);
+        sgl.VarNumTextStr[StrLen] = 0;
+      }
+      I++;
+      P--;
+    }
+  }
+
+  if (Sign || ShowSign)
+  {
+    if (StrLen > GuiConst_MAX_VARNUM_TEXT_LEN)
+      return (0);
+    for (N = StrLen; N >= 1; N--)
+      sgl.VarNumTextStr[N] = sgl.VarNumTextStr[N - 1];
+    if (Sign)
+      sgl.VarNumTextStr[0] = '-';
+    else
+      sgl.VarNumTextStr[0] = '+';
+    StrLen++;
+    sgl.VarNumTextStr[StrLen] = 0;
+  }
+
+#ifdef GuiConst_FLOAT_SUPPORT_ON
+  if (sgl.CurItem.FormatFormat == GuiLib_FORMAT_EXP)
+  {
+    N = sgl.VarExponent;
+    if (N < 0)
+      N = -N;
+    ConvertIntToStr(N, ExponentStr, 10);
+    S1 = ExponentStr;
+    N = 0;
+    while (*S1 != 0)
+    {
+      S1++;
+      N++;
+    }
+    if (N == 1)
+      I = 2;
+    else
+      I = N;
+    if (StrLen + 2 + I >= GuiConst_MAX_VARNUM_TEXT_LEN)
+      return (0);
+#ifdef GuiConst_CODEVISION_COMPILER
+    strcatf(sgl.VarNumTextStr, "E");
+#else
+    strcat(sgl.VarNumTextStr, "E");
+#endif
+    StrLen++;
+    if (sgl.VarExponent >= 0)
+#ifdef GuiConst_CODEVISION_COMPILER
+      strcatf(sgl.VarNumTextStr, "+");
+#else
+      strcat(sgl.VarNumTextStr, "+");
+#endif
+    else
+#ifdef GuiConst_CODEVISION_COMPILER
+      strcatf(sgl.VarNumTextStr, "-");
+#else
+      strcat(sgl.VarNumTextStr, "-");
+#endif
+    StrLen++;
+    if (N == 1)
+    {
+#ifdef GuiConst_CODEVISION_COMPILER
+      strcatf(sgl.VarNumTextStr, "0");
+#else
+      strcat(sgl.VarNumTextStr, "0");
+#endif
+      StrLen++;
+    }
+    strcat(sgl.VarNumTextStr, ExponentStr);
+    StrLen += N;
+  }
+#endif
+
+  if (sgl.CurItem.FormatFieldWidth > 0)
+  {
+    if (StrLen > sgl.CurItem.FormatFieldWidth)
+    {
+      for (N = 0; N < sgl.CurItem.FormatFieldWidth; N++)
+        sgl.VarNumTextStr[N] = '-';
+    }
+    else
+    {
+      if (sgl.CurItem.FormatFieldWidth > GuiConst_MAX_VARNUM_TEXT_LEN)
+        return (0);
+      if (ZeroPadding && (!Time))
+      {
+        if ((sgl.VarNumTextStr[0] == '-') || (sgl.VarNumTextStr[0] == '+'))
+          Offset = 1;
+        else
+          Offset = 0;
+        for (N = 1; N <= StrLen - Offset; N++)
+          sgl.VarNumTextStr[sgl.CurItem.FormatFieldWidth - N] =
+            sgl.VarNumTextStr[StrLen - N];
+        for (N = 0; N < sgl.CurItem.FormatFieldWidth - StrLen; N++)
+          sgl.VarNumTextStr[N + Offset] = '0';
+      }
+      else if (sgl.CurItem.FormatAlignment == GuiLib_FORMAT_ALIGNMENT_LEFT)
+      {
+        for (N = StrLen; N < sgl.CurItem.FormatFieldWidth; N++)
+          sgl.VarNumTextStr[N] = ' ';
+      }
+      else if (sgl.CurItem.FormatAlignment == GuiLib_FORMAT_ALIGNMENT_CENTER)
+      {
+        Offset = (sgl.CurItem.FormatFieldWidth - StrLen) / 2;
+        if (Offset > 0)
+        {
+          for (N = StrLen - 1; N >= 0; N--)
+            sgl.VarNumTextStr[N + Offset] = sgl.VarNumTextStr[N];
+          for (N = 0; N < Offset; N++)
+            sgl.VarNumTextStr[N] = ' ';
+        }
+        Offset = sgl.CurItem.FormatFieldWidth - StrLen - Offset;
+        if (Offset > 0)
+          for (N = sgl.CurItem.FormatFieldWidth - Offset;
+               N < sgl.CurItem.FormatFieldWidth; N++)
+            sgl.VarNumTextStr[N] = ' ';
+      }
+      else if (sgl.CurItem.FormatAlignment == GuiLib_FORMAT_ALIGNMENT_RIGHT)
+      {
+        for (N = 1; N <= StrLen; N++)
+          sgl.VarNumTextStr[sgl.CurItem.FormatFieldWidth - N] =
+            sgl.VarNumTextStr[StrLen - N];
+        for (N = 0; N < sgl.CurItem.FormatFieldWidth - StrLen; N++)
+          sgl.VarNumTextStr[N] = ' ';
+      }
+    }
+    sgl.VarNumTextStr[sgl.CurItem.FormatFieldWidth] = 0;
+    return (sgl.CurItem.FormatFieldWidth);
+  }
+  else
+  {
+    sgl.VarNumTextStr[StrLen] = 0;
+    return (StrLen);
+  }
+}
+
+#ifdef GuiConst_REMOTE_STRUCT_DATA
+//------------------------------------------------------------------------------
+static GuiLib_StructPtr GetRemoteStructData(
+   GuiConst_INT32S StructIndex)
+{
+  sgl.RemoteStructOffset =
+     (GuiConst_INT32U PrefixRom)GuiStruct_StructPtrList[StructIndex];
+  GuiLib_RemoteDataReadBlock(
+     sgl.RemoteStructOffset,
+     1,
+     sgl.GuiLib_RemoteStructBuffer);
+  sgl.RemoteStructOffset++;
+  return((GuiLib_StructPtr)&sgl.GuiLib_RemoteStructBuffer[0]);
+}
+
+#ifdef GuiConst_REMOTE_TEXT_DATA
+//------------------------------------------------------------------------------
+static GuiConst_INT16U GetRemoteText(
+   GuiConst_INT16U TextIndex)
+{
+  GuiConst_INT32S TextOfs;
+
+  if (TextIndex != sgl.CurRemoteText)
+  {
+    if (sgl.RemoteTextTableOfs == -1)
+      GuiLib_RemoteTextReadBlock(4, 4, &sgl.RemoteTextTableOfs);
+
+    GuiLib_RemoteTextReadBlock(sgl.RemoteTextTableOfs + 6 * TextIndex, 4, &TextOfs);
+    GuiLib_RemoteTextReadBlock(
+       sgl.RemoteTextTableOfs + 6 * TextIndex + 4, 2, &sgl.RemoteTextLen);
+
+#ifdef GuiConst_CHARMODE_ANSI
+    GuiLib_RemoteTextReadBlock(TextOfs, sgl.RemoteTextLen, sgl.GuiLib_RemoteTextBuffer);
+#else
+    GuiLib_RemoteTextReadBlock(TextOfs, 2 * sgl.RemoteTextLen, sgl.GuiLib_RemoteTextBuffer);
+#endif
+    sgl.CurRemoteText = TextIndex;
+  }
+  return(sgl.RemoteTextLen);
+}
+#endif
+
+#endif
+
+#ifdef GuiConst_CHARMODE_UNICODE
+//------------------------------------------------------------------------------
+static void ExtractUnicodeString(
+   GuiConst_INT8U PrefixLocate *ItemTextPtr,
+   GuiConst_INT16U TextLength)
+{
+  GuiConst_INT16U P;
+
+  for (P = 0; P < TextLength; P++)
+    sgl.UnicodeTextBuf[P] = GetItemWord(&ItemTextPtr);
+  sgl.UnicodeTextBuf[TextLength] = 0;
+}
+#endif
+
+//------------------------------------------------------------------------------
+static void SetCurFont(
+   GuiConst_INT8U FontIndex)
+{
+  if (FontIndex >= GuiFont_FontCnt)
+    sgl.CurFont = (GuiLib_FontRecPtr)ReadWord(GuiFont_FontList[0]);
+  else
+    sgl.CurFont = (GuiLib_FontRecPtr)ReadWord(GuiFont_FontList[FontIndex]);
+}
+
+#ifdef GuiConst_BITMAP_SUPPORT_ON
+//------------------------------------------------------------------------------
+static void UpdateBackgroundBitmap(void)
+{
+  GuiConst_INT8U BackgroundOn;
+  GuiConst_INT16U BackgroundX1, BackgroundY1, BackgroundX2, BackgroundY2;
+  GuiConst_INT16S N;
+
+  for (N = 0; N < GuiConst_MAX_BACKGROUND_BITMAPS; N++)
+    if (sgl.BackgrBitmapAry[N].InUse)
+    {
+      BackgroundOn = 0;
+      switch (sgl.CurItem.ItemType)
+      {
+        case GuiLib_ITEM_TEXT:
+        case GuiLib_ITEM_VAR:
+          BackgroundOn = 1;
+          if (sgl.CurItem.TextPar[0].BackBoxSizeX == 0)
+          {
+            BackgroundX1 = sgl.CurItem.DrawnX1;
+            BackgroundY1 = sgl.CurItem.DrawnY1;
+            BackgroundX2 = sgl.CurItem.DrawnX2;
+            BackgroundY2 = sgl.CurItem.DrawnY2;
+          }
+          else
+          {
+            SetCurFont(sgl.CurItem.TextPar[0].FontIndex);
+            SetBackBox(0);
+            BackgroundX1 = sgl.BbX1;
+            BackgroundY1 = sgl.BbY1;
+            BackgroundX2 = sgl.BbX2;
+            BackgroundY2 = sgl.BbY2;
+          }
+          break;
+
+        case GuiLib_ITEM_STRUCTURE:
+        case GuiLib_ITEM_STRUCTARRAY:
+        case GuiLib_ITEM_STRUCTCOND:
+          if (sgl.CurItem.Drawn)
+          {
+            BackgroundOn = 1;
+            BackgroundX1 = sgl.CurItem.DrawnX1;
+            BackgroundY1 = sgl.CurItem.DrawnY1;
+            BackgroundX2 = sgl.CurItem.DrawnX2;
+            BackgroundY2 = sgl.CurItem.DrawnY2;
+          }
+          break;
+
+        case GuiLib_ITEM_TEXTBLOCK:
+        case GuiLib_ITEM_VARBLOCK:
+        case GuiLib_ITEM_CHECKBOX:
+        case GuiLib_ITEM_BUTTON:
+        case GuiLib_ITEM_EDITBOX:
+        case GuiLib_ITEM_PANEL:
+        case GuiLib_ITEM_MEMO:
+        case GuiLib_ITEM_LISTBOX:
+        case GuiLib_ITEM_COMBOBOX:
+        case GuiLib_ITEM_SCROLLBOX:
+        case GuiLib_ITEM_SCROLLAREA:
+        case GuiLib_ITEM_PROGRESSBAR:
+          if (sgl.CurItem.TextPar[0].BitFlags & GuiLib_BITFLAG_TRANSPARENT)
+          {
+            BackgroundOn = 1;
+            SetBackColorBox(sgl.CurItem.X1, sgl.CurItem.Y1,
+                            sgl.CurItem.X2, sgl.CurItem.Y2,
+                            0);
+            BackgroundX1 = sgl.BbX1;
+            BackgroundY1 = sgl.BbY1;
+            BackgroundX2 = sgl.BbX2;
+            BackgroundY2 = sgl.BbY2;
+          }
+          break;
+#ifdef GuiConst_ITEM_RADIOBUTTON_INUSE
+        case GuiLib_ITEM_RADIOBUTTON:
+          if (sgl.CurItem.TextPar[0].BitFlags & GuiLib_BITFLAG_TRANSPARENT)
+          {
+            BackgroundOn = 1;
+            SetBackColorBox(sgl.CurItem.X1,
+                            sgl.CurItem.Y1,
+                            sgl.CurItem.X2,
+                            sgl.CurItem.Y2 +
+                              (sgl.CurItem.CompPars.CompRadioButton.Count - 1) *
+                               sgl.CurItem.CompPars.CompRadioButton.InterDistance,
+                            0);
+            BackgroundX1 = sgl.BbX1;
+            BackgroundY1 = sgl.BbY1;
+            BackgroundX2 = sgl.BbX2;
+            BackgroundY2 = sgl.BbY2;
+          }
+          break;
+#endif
+      }
+      if (BackgroundOn)
+        GuiLib_ShowBitmapArea(sgl.BackgrBitmapAry[N].Index,
+           sgl.BackgrBitmapAry[N].X, sgl.BackgrBitmapAry[N].Y,
+           BackgroundX1, BackgroundY1, BackgroundX2, BackgroundY2, -1);
+    }
+}
+#endif
+
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+//------------------------------------------------------------------------------
+static void StartClipping(
+   GuiConst_INT8U Clipping)
+{
+#ifdef GuiConst_REL_COORD_ORIGO_INUSE
+  sgl.CurItem.ClipRectX1 += sgl.CoordOrigoX;
+  sgl.CurItem.ClipRectY1 += sgl.CoordOrigoY;
+  sgl.CurItem.ClipRectX2 += sgl.CoordOrigoX;
+  sgl.CurItem.ClipRectY2 += sgl.CoordOrigoY;
+#endif
+  if (Clipping)
+  {
+    OrderCoord(&sgl.CurItem.ClipRectX1, &sgl.CurItem.ClipRectX2);
+    OrderCoord(&sgl.CurItem.ClipRectY1, &sgl.CurItem.ClipRectY2);
+    if (sgl.CurItem.ClipRectX1 < sgl.ActiveAreaX1)
+      sgl.CurItem.ClipRectX1 = sgl.ActiveAreaX1;
+    if (sgl.CurItem.ClipRectY1 < sgl.ActiveAreaY1)
+      sgl.CurItem.ClipRectY1 = sgl.ActiveAreaY1;
+    if (sgl.CurItem.ClipRectX2 > sgl.ActiveAreaX2)
+      sgl.CurItem.ClipRectX2 = sgl.ActiveAreaX2;
+    if (sgl.CurItem.ClipRectY2 > sgl.ActiveAreaY2)
+      sgl.CurItem.ClipRectY2 = sgl.ActiveAreaY2;
+  }
+  else
+  {
+    sgl.CurItem.ClipRectX1 = sgl.ActiveAreaX1;
+    sgl.CurItem.ClipRectY1 = sgl.ActiveAreaY1;
+    sgl.CurItem.ClipRectX2 = sgl.ActiveAreaX2;
+    sgl.CurItem.ClipRectY2 = sgl.ActiveAreaY2;
+  }
+#ifdef GuiConst_REL_COORD_ORIGO_INUSE
+  sgl.CurItem.ClipRectX1 -= sgl.CoordOrigoX;
+  sgl.CurItem.ClipRectY1 -= sgl.CoordOrigoY;
+  sgl.CurItem.ClipRectX2 -= sgl.CoordOrigoX;
+  sgl.CurItem.ClipRectY2 -= sgl.CoordOrigoY;
+#endif
+  GuiLib_SetClipping(sgl.CurItem.ClipRectX1, sgl.CurItem.ClipRectY1,
+                     sgl.CurItem.ClipRectX2, sgl.CurItem.ClipRectY2);
+}
+#endif
+
+//------------------------------------------------------------------------------
+static void PrepareInternalStruct(void)
+{
+  sgl.Memory.X[GuiLib_MEMORY_CNT] = sgl.CurItem.X1;
+  sgl.Memory.Y[GuiLib_MEMORY_CNT] = sgl.CurItem.Y1;
+}
+
+//------------------------------------------------------------------------------
+static void DrawSubStruct(
+   GuiConst_INT16U SubStructIndex,
+   GuiConst_INT8U ColorInvert,
+   GuiConst_INT8U SubInt)
+{
+  GuiLib_ItemRec RemCurItem;
+  GuiLib_StructPtr StructToCall;
+  GuiConst_INT8U RemBackBox;
+  GuiConst_INT16S RemBbX1, RemBbX2;
+  GuiConst_INT16S RemBbY1, RemBbY2;
+  GuiConst_INT8U RemDrawn;
+  GuiConst_INT16S RemDrawnX1, RemDrawnY1, RemDrawnX2, RemDrawnY2;
+  GuiConst_INT16S RemAutoRedrawSaveIndex;
+  GuiConst_INT16S RemAutoRedrawParent;
+  GuiConst_INT16S RemAutoRedrawLatest;
+#ifdef GuiConst_REMOTE_STRUCT_DATA
+  GuiConst_INT32U RemRemoteStructOffset;
+#endif
+
+  if (SubStructIndex != 0xFFFF)
+  {
+    RemAutoRedrawParent = sgl.AutoRedrawParent;
+    RemAutoRedrawLatest = sgl.AutoRedrawLatest;
+
+    sgl.AutoRedrawParent = sgl.AutoRedrawLatest;
+
+    if (SubInt)
+      memcpy(&RemCurItem, &sgl.CurItem, sizeof(GuiLib_ItemRec));
+
+#ifdef GuiConst_REMOTE_STRUCT_DATA
+    RemRemoteStructOffset = sgl.RemoteStructOffset;
+#endif
+    RemBackBox = (sgl.CurItem.TextPar[0].BackBoxSizeX);
+    RemBbX1 = sgl.BbX1;
+    RemBbX2 = sgl.BbX2;
+    RemBbY1 = sgl.BbY1;
+    RemBbY2 = sgl.BbY2;
+    RemDrawn = gl.Drawn;
+    RemDrawnX1 = gl.DrawnX1;
+    RemDrawnY1 = gl.DrawnY1;
+    RemDrawnX2 = gl.DrawnX2;
+    RemDrawnY2 = gl.DrawnY2;
+    ResetDrawLimits();
+    RemAutoRedrawSaveIndex = sgl.AutoRedrawSaveIndex;
+
+    sgl.DisplayLevel++;
+    StructToCall =
+#ifdef GuiConst_REMOTE_STRUCT_DATA
+       GetRemoteStructData(SubStructIndex);
+#else
+       (GuiLib_StructPtr)ReadWord(GuiStruct_StructPtrList[SubStructIndex]);
+#endif
+    DrawStructure(StructToCall, ColorInvert);
+    sgl.DisplayLevel--;
+
+    if (RemBackBox)
+    {
+      sgl.CurItem.Drawn = 1;
+      sgl.CurItem.DrawnX1 = RemBbX1;
+      sgl.CurItem.DrawnY1 = RemBbY1;
+      sgl.CurItem.DrawnX2 = RemBbX2;
+      sgl.CurItem.DrawnY2 = RemBbY2;
+
+      gl.DrawnX1 = GuiLib_GET_MIN(sgl.BbX1, RemDrawnX1);
+      gl.DrawnY1 = GuiLib_GET_MIN(sgl.BbY1, RemDrawnY1);
+      gl.DrawnX2 = GuiLib_GET_MAX(sgl.BbX2, RemDrawnX2);
+      gl.DrawnY2 = GuiLib_GET_MAX(sgl.BbY2, RemDrawnY2);
+    }
+    else if (gl.Drawn)
+    {
+      sgl.CurItem.Drawn = 1;
+      sgl.CurItem.DrawnX1 = gl.DrawnX1;
+      sgl.CurItem.DrawnY1 = gl.DrawnY1;
+      sgl.CurItem.DrawnX2 = gl.DrawnX2;
+      sgl.CurItem.DrawnY2 = gl.DrawnY2;
+
+      gl.DrawnX1 = GuiLib_GET_MIN(gl.DrawnX1, RemDrawnX1);
+      gl.DrawnY1 = GuiLib_GET_MIN(gl.DrawnY1, RemDrawnY1);
+      gl.DrawnX2 = GuiLib_GET_MAX(gl.DrawnX2, RemDrawnX2);
+      gl.DrawnY2 = GuiLib_GET_MAX(gl.DrawnY2, RemDrawnY2);
+    }
+    else
+    {
+      gl.Drawn = RemDrawn;
+      gl.DrawnX1 = RemDrawnX1;
+      gl.DrawnY1 = RemDrawnY1;
+      gl.DrawnX2 = RemDrawnX2;
+      gl.DrawnY2 = RemDrawnY2;
+    }
+    sgl.AutoRedrawSaveIndex = RemAutoRedrawSaveIndex;
+
+#ifdef GuiConst_REMOTE_STRUCT_DATA
+    sgl.RemoteStructOffset = RemRemoteStructOffset;
+#endif
+
+    if (SubInt)
+      memcpy(&sgl.CurItem, &RemCurItem, sizeof(GuiLib_ItemRec));
+
+    sgl.AutoRedrawLatest = RemAutoRedrawLatest;
+    sgl.AutoRedrawParent = RemAutoRedrawParent;
+  }
+}
+
+#include "GuiItems.h"
+
+//------------------------------------------------------------------------------
+static void DrawStructure(
+   GuiLib_StructPtr Structure,
+   GuiConst_INT8U ColorInvert) PrefixReentrant
+{
+  GuiConst_INT16S ItemNdx;
+  GuiConst_INT16S X, RemAutoRedrawLatest;
+  void PrefixLocate *XVarPtr;
+  void PrefixLocate *YVarPtr;
+  GuiConst_INT8U ItemCnt;
+  GuiConst_INT8U PrefixLocate *LocalItemDataPtr;
+#ifdef GuiConst_ITEM_GRAPHICS_LAYER_FILTER_INUSE
+  GuiConst_INT16S I;
+#endif
+#ifdef GuiConst_REMOTE_STRUCT_DATA
+  GuiConst_INT8U ItemSizeBuf[2];
+  GuiConst_INT16U ItemSize;
+#endif
+
+#ifdef GuiConst_REMOTE_STRUCT_DATA
+  LocalItemDataPtr = sgl.GuiLib_RemoteStructBuffer;
+#else
+  LocalItemDataPtr = (GuiConst_INT8U PrefixLocate *)Structure;
+#endif
+  ItemCnt = GetItemByte(&LocalItemDataPtr);
+
+  for (ItemNdx = 0; ItemNdx < ItemCnt; ItemNdx++)
+  {
+    RemAutoRedrawLatest = sgl.AutoRedrawLatest;
+
+#ifdef GuiConst_REMOTE_STRUCT_DATA
+    GuiLib_RemoteDataReadBlock(
+       sgl.RemoteStructOffset,
+       2,
+       (GuiConst_INT8U*)&ItemSizeBuf);
+    ItemSize = (256 * (GuiConst_INT16U)ItemSizeBuf[1]) + ItemSizeBuf[0];
+    sgl.RemoteStructOffset += 2;
+    GuiLib_RemoteDataReadBlock(
+       sgl.RemoteStructOffset,
+       ItemSize,
+       sgl.GuiLib_RemoteItemBuffer);
+    sgl.RemoteStructOffset += ItemSize;
+    LocalItemDataPtr = &sgl.GuiLib_RemoteItemBuffer[0];
+#endif
+
+    sgl.ItemDataPtr = LocalItemDataPtr;
+    ReadItem(GuiLib_LanguageIndex);
+    LocalItemDataPtr = sgl.ItemDataPtr;
+
+    if ((sgl.ItemTypeBit1 & (GuiLib_ITEMBIT_CLEARAREA +
+                             GuiLib_ITEMBIT_TEXT +
+                             GuiLib_ITEMBIT_TEXTBLOCK +
+                             GuiLib_ITEMBIT_DOT +
+                             GuiLib_ITEMBIT_LINE +
+                             GuiLib_ITEMBIT_FRAME +
+                             GuiLib_ITEMBIT_BLOCK +
+                             GuiLib_ITEMBIT_CIRCLE +
+                             GuiLib_ITEMBIT_ELLIPSE +
+                             GuiLib_ITEMBIT_BITMAP +
+                             GuiLib_ITEMBIT_BACKGROUND +
+                             GuiLib_ITEMBIT_STRUCTURE +
+                             GuiLib_ITEMBIT_STRUCTARRAY +
+                             GuiLib_ITEMBIT_ACTIVEAREA +
+                             GuiLib_ITEMBIT_CLIPRECT +
+                             GuiLib_ITEMBIT_VAR +
+                             GuiLib_ITEMBIT_VARBLOCK +
+                             GuiLib_ITEMBIT_TOUCHAREA +
+                             GuiLib_ITEMBIT_SCROLLBOX +
+                             GuiLib_ITEMBIT_GRAPH +
+                             GuiLib_ITEMBIT_GRAPHICSLAYER)) ||
+        (sgl.ItemTypeBit2 & (GuiLib_ITEMBIT_ROUNDEDFRAME +
+                             GuiLib_ITEMBIT_ROUNDEDBLOCK +
+                             GuiLib_ITEMBIT_QUARTERCIRCLE +
+                             GuiLib_ITEMBIT_QUARTERELLIPSE +
+                             GuiLib_ITEMBIT_CHECKBOX +
+                             GuiLib_ITEMBIT_RADIOBUTTON +
+                             GuiLib_ITEMBIT_BUTTON +
+                             GuiLib_ITEMBIT_EDITBOX +
+                             GuiLib_ITEMBIT_PANEL +
+                             GuiLib_ITEMBIT_MEMO +
+                             GuiLib_ITEMBIT_LISTBOX +
+                             GuiLib_ITEMBIT_COMBOBOX +
+                             GuiLib_ITEMBIT_SCROLLAREA +
+                             GuiLib_ITEMBIT_PROGRESSBAR +
+                             GuiLib_ITEMBIT_STRUCTCOND +
+                             GuiLib_ITEMBIT_POSCALLBACK)))
+    {
+      if (sgl.CommonByte2 & 0x10)
+      {
+        XVarPtr = (void PrefixLocate *)ReadWord(GuiStruct_VarPtrList[sgl.X1VarIdx]);
+        sgl.X1VarType = ReadByte(GuiStruct_VarTypeList[sgl.X1VarIdx]);
+      }
+      else
+        XVarPtr = 0;
+      if (XVarPtr != 0)
+        sgl.ItemX1 += ReadVar(XVarPtr, sgl.X1VarType);
+      if (sgl.X1MemoryRead > 0)
+        sgl.ItemX1 += sgl.Memory.X[sgl.X1MemoryRead - 1];
+      if (sgl.X1Mode == GuiLib_COOR_REL)
+        sgl.ItemX1 += sgl.CurItem.RX;
+      else if (sgl.X1Mode == GuiLib_COOR_REL_1)
+        sgl.ItemX1 += sgl.CurItem.RX1;
+      else if (sgl.X1Mode == GuiLib_COOR_REL_2)
+        sgl.ItemX1 += sgl.CurItem.RX2;
+      if (sgl.X1MemoryWrite > 0)
+        sgl.Memory.X[sgl.X1MemoryWrite - 1] = sgl.ItemX1;
+      sgl.CurItem.X1 = sgl.ItemX1;
+
+      if (sgl.CommonByte2 & 0x20)
+      {
+        YVarPtr = (void PrefixLocate *)ReadWord(GuiStruct_VarPtrList[sgl.Y1VarIdx]);
+        sgl.Y1VarType = ReadByte(GuiStruct_VarTypeList[sgl.Y1VarIdx]);
+      }
+      else
+        YVarPtr = 0;
+      if (YVarPtr != 0)
+        sgl.ItemY1 += ReadVar(YVarPtr, sgl.Y1VarType);
+      if (sgl.Y1MemoryRead > 0)
+        sgl.ItemY1 += sgl.Memory.Y[sgl.Y1MemoryRead - 1];
+      if (sgl.Y1Mode == GuiLib_COOR_REL)
+        sgl.ItemY1 += sgl.CurItem.RY;
+      else if (sgl.Y1Mode == GuiLib_COOR_REL_1)
+        sgl.ItemY1 += sgl.CurItem.RY1;
+      else if (sgl.Y1Mode == GuiLib_COOR_REL_2)
+        sgl.ItemY1 += sgl.CurItem.RY2;
+      if (sgl.Y1MemoryWrite > 0)
+        sgl.Memory.Y[sgl.Y1MemoryWrite - 1] = sgl.ItemY1;
+      sgl.CurItem.Y1 = sgl.ItemY1;
+
+      sgl.CurItem.RX = sgl.CurItem.X1;
+      sgl.CurItem.RY = sgl.CurItem.Y1;
+    }
+
+#ifdef GuiConst_ITEM_SCROLLBOX_INUSE
+    if (sgl.ItemTypeBit1 & GuiLib_ITEMBIT_SCROLLBOX)
+    {
+      sgl.ScrollBoxesAry[sgl.GlobalScrollBoxIndex].X1 = sgl.CurItem.X1;
+      sgl.ScrollBoxesAry[sgl.GlobalScrollBoxIndex].Y1 = sgl.CurItem.Y1;
+      sgl.ScrollBoxesAry[sgl.GlobalScrollBoxIndex].BackColor = sgl.CurItem.BackColor;
+
+#ifndef GuiConst_SCROLLITEM_BAR_NONE
+      if ((sgl.ScrollBoxesAry[sgl.GlobalScrollBoxIndex].BarMode & 0x03) ==
+         GuiLib_COOR_REL)
+        sgl.ScrollBoxesAry[sgl.GlobalScrollBoxIndex].BarPositionX += sgl.CurItem.X1;
+      if (((sgl.ScrollBoxesAry[sgl.GlobalScrollBoxIndex].BarMode >> 2) & 0x03) ==
+         GuiLib_COOR_REL)
+        sgl.ScrollBoxesAry[sgl.GlobalScrollBoxIndex].BarPositionY += sgl.CurItem.Y1;
+#endif
+#ifndef GuiConst_SCROLLITEM_INDICATOR_NONE
+      if ((sgl.ScrollBoxesAry[sgl.GlobalScrollBoxIndex].IndicatorMode & 0x03) ==
+         GuiLib_COOR_REL)
+        sgl.ScrollBoxesAry[sgl.GlobalScrollBoxIndex].IndicatorPositionX += sgl.CurItem.X1;
+      if (((sgl.ScrollBoxesAry[sgl.GlobalScrollBoxIndex].IndicatorMode >> 2) & 0x03) ==
+         GuiLib_COOR_REL)
+        sgl.ScrollBoxesAry[sgl.GlobalScrollBoxIndex].IndicatorPositionY += sgl.CurItem.Y1;
+#endif
+    }
+#endif
+
+    if ((sgl.ItemTypeBit1 & (GuiLib_ITEMBIT_CLEARAREA +
+                             GuiLib_ITEMBIT_TEXTBLOCK +
+                             GuiLib_ITEMBIT_VARBLOCK +
+                             GuiLib_ITEMBIT_LINE +
+                             GuiLib_ITEMBIT_FRAME +
+                             GuiLib_ITEMBIT_BLOCK +
+                             GuiLib_ITEMBIT_BITMAP +
+                             GuiLib_ITEMBIT_BACKGROUND +
+                             GuiLib_ITEMBIT_ACTIVEAREA +
+                             GuiLib_ITEMBIT_CLIPRECT +
+                             GuiLib_ITEMBIT_TOUCHAREA +
+                             GuiLib_ITEMBIT_GRAPH +
+                             GuiLib_ITEMBIT_GRAPHICSLAYER)) ||
+        (sgl.ItemTypeBit2 & (GuiLib_ITEMBIT_ROUNDEDFRAME +
+                             GuiLib_ITEMBIT_ROUNDEDBLOCK +
+                             GuiLib_ITEMBIT_BUTTON +
+                             GuiLib_ITEMBIT_EDITBOX +
+                             GuiLib_ITEMBIT_PANEL +
+                             GuiLib_ITEMBIT_MEMO +
+                             GuiLib_ITEMBIT_LISTBOX +
+                             GuiLib_ITEMBIT_COMBOBOX +
+                             GuiLib_ITEMBIT_SCROLLAREA +
+                             GuiLib_ITEMBIT_PROGRESSBAR)))
+    {
+      if (sgl.CommonByte2 & 0x40)
+      {
+        XVarPtr = (void PrefixLocate *)ReadWord(GuiStruct_VarPtrList[sgl.X2VarIdx]);
+        sgl.X2VarType = ReadByte(GuiStruct_VarTypeList[sgl.X2VarIdx]);
+      }
+      else
+        XVarPtr = 0;
+      if (XVarPtr != 0)
+        sgl.ItemX2 += ReadVar(XVarPtr, sgl.X2VarType);
+      if (sgl.X2MemoryRead > 0)
+        sgl.ItemX2 += sgl.Memory.X[sgl.X2MemoryRead - 1];
+      if (sgl.X2Mode == GuiLib_COOR_REL)
+        sgl.ItemX2 += sgl.CurItem.X1;
+      else if (sgl.X2Mode == GuiLib_COOR_REL_1)
+        sgl.ItemX2 += sgl.CurItem.RX1;
+      else if (sgl.X2Mode == GuiLib_COOR_REL_2)
+        sgl.ItemX2 += sgl.CurItem.RX2;
+      if (sgl.X2MemoryWrite > 0)
+        sgl.Memory.X[sgl.X2MemoryWrite - 1] = sgl.ItemX2;
+      sgl.CurItem.X2 = sgl.ItemX2;
+
+      if (sgl.CommonByte2 & 0x80)
+      {
+        YVarPtr = (void PrefixLocate *)ReadWord(GuiStruct_VarPtrList[sgl.Y2VarIdx]);
+        sgl.Y2VarType = ReadByte(GuiStruct_VarTypeList[sgl.Y2VarIdx]);
+      }
+      else
+        YVarPtr = 0;
+      if (YVarPtr != 0)
+        sgl.ItemY2 += ReadVar(YVarPtr, sgl.Y2VarType);
+      if (sgl.Y2MemoryRead > 0)
+        sgl.ItemY2 += sgl.Memory.Y[sgl.Y2MemoryRead - 1];
+      if (sgl.Y2Mode == GuiLib_COOR_REL)
+        sgl.ItemY2 += sgl.CurItem.Y1;
+      else if (sgl.Y2Mode == GuiLib_COOR_REL_1)
+        sgl.ItemY2 += sgl.CurItem.RY1;
+      else if (sgl.Y2Mode == GuiLib_COOR_REL_2)
+        sgl.ItemY2 += sgl.CurItem.RY2;
+      if (sgl.Y2MemoryWrite > 0)
+        sgl.Memory.Y[sgl.Y2MemoryWrite - 1] = sgl.ItemY2;
+      sgl.CurItem.Y2 = sgl.ItemY2;
+    }
+#ifdef GuiConst_ITEM_CHECKBOX_INUSE
+    else if (sgl.ItemTypeBit2 & GuiLib_ITEMBIT_CHECKBOX)
+    {
+      switch (sgl.CurItem.CompPars.CompCheckBox.Style)
+      {
+        case GuiLib_CHECKBOX_FLAT:
+        case GuiLib_CHECKBOX_3D:
+        case GuiLib_CHECKBOX_NONE:
+          sgl.CurItem.X2 = sgl.CurItem.X1 +
+                           sgl.CurItem.CompPars.CompCheckBox.Size - 1;
+          sgl.CurItem.Y2 = sgl.CurItem.Y1 +
+                           sgl.CurItem.CompPars.CompCheckBox.Size - 1;
+          break;
+        case GuiLib_CHECKBOX_ICON:
+          sgl.CurItem.X2 = sgl.CurItem.X1;
+          sgl.CurItem.Y2 = sgl.CurItem.Y1;
+          break;
+        case GuiLib_CHECKBOX_BITMAP:
+          sgl.CurItem.X2 = sgl.CurItem.X1;
+          sgl.CurItem.Y2 = sgl.CurItem.Y1;
+          break;
+      }
+    }
+#endif
+#ifdef GuiConst_ITEM_RADIOBUTTON_INUSE
+    else if (sgl.ItemTypeBit2 & GuiLib_ITEMBIT_RADIOBUTTON)
+    {
+      switch (sgl.CurItem.CompPars.CompRadioButton.Style)
+      {
+        case GuiLib_RADIOBUTTON_FLAT:
+        case GuiLib_RADIOBUTTON_3D:
+          sgl.CurItem.X2 = sgl.CurItem.X1 +
+                           2 * sgl.CurItem.CompPars.CompRadioButton.Size;
+          sgl.CurItem.Y2 = sgl.CurItem.Y1 +
+                           2 * sgl.CurItem.CompPars.CompRadioButton.Size;
+          break;
+        case GuiLib_RADIOBUTTON_ICON:
+          sgl.CurItem.X2 = sgl.CurItem.X1;
+          sgl.CurItem.Y2 = sgl.CurItem.Y1;
+          break;
+        case GuiLib_RADIOBUTTON_BITMAP:
+          sgl.CurItem.X2 = sgl.CurItem.X1;
+          sgl.CurItem.Y2 = sgl.CurItem.Y1;
+          break;
+      }
+    }
+#endif
+#ifdef GuiConst_ITEM_BUTTON_INUSE
+    else if (sgl.ItemTypeBit2 & GuiLib_ITEMBIT_BUTTON)
+    {
+      sgl.CurItem.X2 = sgl.CurItem.X1;
+      sgl.CurItem.Y2 = sgl.CurItem.Y1;
+    }
+#endif
+
+    if ((sgl.ItemTypeBit1 & (GuiLib_ITEMBIT_CIRCLE +
+                             GuiLib_ITEMBIT_ELLIPSE)) ||
+        (sgl.ItemTypeBit2 & (GuiLib_ITEMBIT_ROUNDEDFRAME +
+                             GuiLib_ITEMBIT_ROUNDEDBLOCK +
+                             GuiLib_ITEMBIT_QUARTERCIRCLE +
+                             GuiLib_ITEMBIT_QUARTERELLIPSE +
+                             GuiLib_ITEMBIT_BUTTON +
+                             GuiLib_ITEMBIT_PANEL)))
+    {
+      if (sgl.CommonByte6 & 0x40)
+      {
+        XVarPtr = (void PrefixLocate *)ReadWord(GuiStruct_VarPtrList[sgl.R1VarIdx]);
+        sgl.R1VarType = ReadByte(GuiStruct_VarTypeList[sgl.R1VarIdx]);
+      }
+      else
+        XVarPtr = 0;
+      if (XVarPtr != 0)
+        sgl.ItemR1 += ReadVar(XVarPtr, sgl.R1VarType);
+      if (sgl.R1MemoryRead > 0)
+        sgl.ItemR1 += sgl.Memory.X[sgl.R1MemoryRead - 1];
+      if (sgl.R1Mode == GuiLib_COOR_REL)
+        sgl.ItemR1 += sgl.CurItem.X1;
+      else if (sgl.R1Mode == GuiLib_COOR_REL_1)
+        sgl.ItemR1 += sgl.CurItem.RX1;
+      else if (sgl.R1Mode == GuiLib_COOR_REL_2)
+        sgl.ItemR1 += sgl.CurItem.RX2;
+      if (sgl.R1MemoryWrite > 0)
+        sgl.Memory.X[sgl.R1MemoryWrite - 1] = sgl.ItemR1;
+      sgl.CurItem.R1 = sgl.ItemR1;
+    }
+
+    if ((sgl.ItemTypeBit1 & (GuiLib_ITEMBIT_ELLIPSE)) ||
+        (sgl.ItemTypeBit2 & (GuiLib_ITEMBIT_QUARTERELLIPSE)))
+    {
+      if (sgl.CommonByte6 & 0x80)
+      {
+        YVarPtr = (void PrefixLocate *)ReadWord(GuiStruct_VarPtrList[sgl.R2VarIdx]);
+        sgl.R2VarType = ReadByte(GuiStruct_VarTypeList[sgl.R2VarIdx]);
+      }
+      else
+        YVarPtr = 0;
+      if (YVarPtr != 0)
+        sgl.ItemR2 += ReadVar(YVarPtr, sgl.R2VarType);
+      if (sgl.R2MemoryRead > 0)
+        sgl.ItemR2 += sgl.Memory.Y[sgl.R2MemoryRead - 1];
+      if (sgl.R2Mode == GuiLib_COOR_REL)
+        sgl.ItemR2 += sgl.CurItem.Y1;
+      else if (sgl.R2Mode == GuiLib_COOR_REL_1)
+        sgl.ItemR2 += sgl.CurItem.RY1;
+      else if (sgl.R2Mode == GuiLib_COOR_REL_2)
+        sgl.ItemR2 += sgl.CurItem.RY2;
+      if (sgl.R2MemoryWrite > 0)
+        sgl.Memory.Y[sgl.R2MemoryWrite - 1] = sgl.ItemR2;
+      sgl.CurItem.R2 = sgl.ItemR2;
+    }
+
+    if ((sgl.ItemTypeBit1 & (GuiLib_ITEMBIT_CLEARAREA +
+                             GuiLib_ITEMBIT_TEXTBLOCK +
+                             GuiLib_ITEMBIT_VARBLOCK +
+                             GuiLib_ITEMBIT_LINE +
+                             GuiLib_ITEMBIT_FRAME +
+                             GuiLib_ITEMBIT_BLOCK +
+                             GuiLib_ITEMBIT_BITMAP +
+                             GuiLib_ITEMBIT_BACKGROUND +
+                             GuiLib_ITEMBIT_ACTIVEAREA +
+                             GuiLib_ITEMBIT_CLIPRECT +
+                             GuiLib_ITEMBIT_TOUCHAREA +
+                             GuiLib_ITEMBIT_GRAPH +
+                             GuiLib_ITEMBIT_GRAPHICSLAYER)) ||
+        (sgl.ItemTypeBit2 & (GuiLib_ITEMBIT_ROUNDEDFRAME +
+                             GuiLib_ITEMBIT_ROUNDEDBLOCK +
+                             GuiLib_ITEMBIT_CHECKBOX +
+                             GuiLib_ITEMBIT_RADIOBUTTON +
+                             GuiLib_ITEMBIT_BUTTON +
+                             GuiLib_ITEMBIT_EDITBOX +
+                             GuiLib_ITEMBIT_PANEL +
+                             GuiLib_ITEMBIT_MEMO +
+                             GuiLib_ITEMBIT_LISTBOX +
+                             GuiLib_ITEMBIT_COMBOBOX +
+                             GuiLib_ITEMBIT_SCROLLAREA +
+                             GuiLib_ITEMBIT_PROGRESSBAR)))
+    {
+      X = sgl.CurItem.X2 - sgl.CurItem.X1;
+      if (sgl.CurItem.TextPar[0].Alignment == GuiLib_ALIGN_CENTER)
+      {
+        sgl.CurItem.X1 -= X / 2;
+        sgl.CurItem.X2 -= X / 2;
+      }
+      else if (sgl.CurItem.TextPar[0].Alignment == GuiLib_ALIGN_RIGHT)
+      {
+        sgl.CurItem.X1 -= X;
+        sgl.CurItem.X2 -= X;
+      }
+    }
+    else if ((sgl.ItemTypeBit1 & (GuiLib_ITEMBIT_CIRCLE +
+                                  GuiLib_ITEMBIT_ELLIPSE)) ||
+             (sgl.ItemTypeBit2 & (GuiLib_ITEMBIT_QUARTERCIRCLE +
+                                  GuiLib_ITEMBIT_QUARTERELLIPSE)))
+    {
+      if (sgl.CurItem.TextPar[0].Alignment == GuiLib_ALIGN_CENTER)
+        sgl.CurItem.X1 -= sgl.CurItem.R1;
+      else if (sgl.CurItem.TextPar[0].Alignment == GuiLib_ALIGN_RIGHT)
+        sgl.CurItem.X1 -= 2 * sgl.CurItem.R1;
+    }
+
+#ifdef GuiConst_ITEM_SCROLLBOX_INUSE
+    if (sgl.ItemTypeBit1 & GuiLib_ITEMBIT_SCROLLBOX)
+      memcpy(&sgl.ScrollBoxesAry[sgl.GlobalScrollBoxIndex].ScrollBoxItem, &sgl.CurItem,
+         sizeof(GuiLib_ItemRec));
+#endif
+
+#ifdef GuiConst_ITEM_GRAPH_INUSE
+    if (sgl.ItemTypeBit1 & GuiLib_ITEMBIT_GRAPH)
+    {
+      memcpy(&sgl.GraphAry[sgl.GlobalGraphIndex].GraphItem, &sgl.CurItem,
+         sizeof(GuiLib_ItemRec));
+      OrderCoord(&sgl.GraphAry[sgl.GlobalGraphIndex].GraphItem.X1,
+                 &sgl.GraphAry[sgl.GlobalGraphIndex].GraphItem.X2);
+      OrderCoord(&sgl.GraphAry[sgl.GlobalGraphIndex].GraphItem.Y1,
+                 &sgl.GraphAry[sgl.GlobalGraphIndex].GraphItem.Y2);
+      sgl.GraphAry[sgl.GlobalGraphIndex].OrigoX =
+         sgl.GraphAry[sgl.GlobalGraphIndex].GraphItem.X1 +
+         sgl.GraphAry[sgl.GlobalGraphIndex].OriginOffsetX;
+      sgl.GraphAry[sgl.GlobalGraphIndex].OrigoY =
+         sgl.GraphAry[sgl.GlobalGraphIndex].GraphItem.Y2 -
+         sgl.GraphAry[sgl.GlobalGraphIndex].OriginOffsetY;
+    }
+#endif
+
+#ifdef GuiConst_ITEM_SCROLLBOX_INUSE
+    if (sgl.NextScrollLineReading)
+      sgl.DisplayWriting = 0;
+    else
+#endif
+      sgl.DisplayWriting = 1;
+    DrawItem(ColorInvert);
+
+    sgl.DisplayWriting = 1;
+
+    switch (sgl.CurItem.ItemType)
+    {
+      case GuiLib_ITEM_TEXT:
+      case GuiLib_ITEM_VAR:
+        sgl.CurItem.RX1 = sgl.FontWriteX1;
+        sgl.CurItem.RY1 = sgl.FontWriteY1;
+        sgl.CurItem.RX2 = sgl.FontWriteX2 + 1;
+        sgl.CurItem.RY2 = sgl.FontWriteY2;
+        break;
+      case GuiLib_ITEM_DOT:
+        sgl.CurItem.RX1 = sgl.CurItem.X1;
+        sgl.CurItem.RY1 = sgl.CurItem.Y1;
+        sgl.CurItem.RX2 = sgl.CurItem.X1 + 1;
+        sgl.CurItem.RY2 = sgl.CurItem.Y1;
+        break;
+      case GuiLib_ITEM_CIRCLE:
+      case GuiLib_ITEM_QUARTERCIRCLE:
+        sgl.CurItem.RX1 = sgl.CurItem.X1;
+        sgl.CurItem.RY1 = sgl.CurItem.Y1 - sgl.CurItem.R1;
+        sgl.CurItem.RX2 = sgl.CurItem.X1 + (2 * sgl.CurItem.R1) + 1;
+        sgl.CurItem.RY2 = sgl.CurItem.Y1 + sgl.CurItem.R1;
+        break;
+      case GuiLib_ITEM_ELLIPSE:
+      case GuiLib_ITEM_QUARTERELLIPSE:
+        sgl.CurItem.RX1 = sgl.CurItem.X1;
+        sgl.CurItem.RY1 = sgl.CurItem.Y1 - sgl.CurItem.R2;
+        sgl.CurItem.RX2 = sgl.CurItem.X1 + (2 * sgl.CurItem.R1) + 1;
+        sgl.CurItem.RY2 = sgl.CurItem.Y1 + sgl.CurItem.R2;
+        break;
+      case GuiLib_ITEM_CLEARAREA:
+      case GuiLib_ITEM_LINE:
+      case GuiLib_ITEM_FRAME:
+      case GuiLib_ITEM_ROUNDEDFRAME:
+      case GuiLib_ITEM_BLOCK:
+      case GuiLib_ITEM_ROUNDEDBLOCK:
+      case GuiLib_ITEM_BITMAP:
+      case GuiLib_ITEM_BACKGROUND:
+      case GuiLib_ITEM_ACTIVEAREA:
+      case GuiLib_ITEM_CLIPRECT:
+      case GuiLib_ITEM_TEXTBLOCK:
+      case GuiLib_ITEM_VARBLOCK:
+      case GuiLib_ITEM_CHECKBOX:
+      case GuiLib_ITEM_BUTTON:
+      case GuiLib_ITEM_EDITBOX:
+      case GuiLib_ITEM_PANEL:
+      case GuiLib_ITEM_MEMO:
+      case GuiLib_ITEM_LISTBOX:
+      case GuiLib_ITEM_COMBOBOX:
+      case GuiLib_ITEM_SCROLLAREA:
+      case GuiLib_ITEM_PROGRESSBAR:
+      case GuiLib_ITEM_TOUCHAREA:
+      case GuiLib_ITEM_SCROLLBOX:
+      case GuiLib_ITEM_GRAPH:
+      case GuiLib_ITEM_GRAPHICSLAYER:
+        sgl.CurItem.RX1 = sgl.CurItem.X1;
+        sgl.CurItem.RY1 = sgl.CurItem.Y1;
+        sgl.CurItem.RX2 = sgl.CurItem.X2 + 1;
+        sgl.CurItem.RY2 = sgl.CurItem.Y2;
+        break;
+      case GuiLib_ITEM_POSCALLBACK:
+        sgl.CurItem.RX1 = sgl.CurItem.X1;
+        sgl.CurItem.RY1 = sgl.CurItem.Y1;
+        sgl.CurItem.RX2 = sgl.CurItem.X1;
+        sgl.CurItem.RY2 = sgl.CurItem.Y1;
+        break;
+#ifdef GuiConst_ITEM_RADIOBUTTON_INUSE
+      case GuiLib_ITEM_RADIOBUTTON:
+        sgl.CurItem.RX1 = sgl.CurItem.X1;
+        sgl.CurItem.RY1 = sgl.CurItem.Y1;
+        sgl.CurItem.RX2 = sgl.CurItem.X2 + 1;
+        sgl.CurItem.RY2 = sgl.CurItem.Y2 +
+                         (sgl.CurItem.CompPars.CompRadioButton.Count - 1) *
+                          sgl.CurItem.CompPars.CompRadioButton.InterDistance;
+        break;
+#endif
+    }
+
+    sgl.AutoRedrawLatest = RemAutoRedrawLatest;
+  }
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_ShowScreen(
+   const GuiConst_INT16U StructureNdx,
+   GuiConst_INT16S CursorFieldToShow,
+   GuiConst_INT8U ResetAutoRedraw)
+{
+#ifdef GuiConst_ITEM_SCROLLBOX_INUSE
+  GuiConst_INT16S M;
+#endif
+  GuiConst_INT16S N;
+  GuiLib_StructPtr StructureToCall;
+
+  GuiDisplay_Lock();
+
+  GuiLib_CurStructureNdx = StructureNdx;
+  StructureToCall =
+#ifdef GuiConst_REMOTE_STRUCT_DATA
+     GetRemoteStructData(StructureNdx);
+#else
+     (GuiLib_StructPtr)ReadWord(GuiStruct_StructPtrList[StructureNdx]);
+#endif
+
+#ifdef GuiConst_CURSOR_SUPPORT_ON
+  sgl.CursorFieldFound = -1;
+  sgl.CursorActiveFieldFound = 0;
+  GuiLib_ActiveCursorFieldNo = CursorFieldToShow;
+  sgl.CursorInUse = (GuiLib_ActiveCursorFieldNo >= 0);
+#else
+  gl.Dummy1_16S = CursorFieldToShow;   // To avoid compiler warning
+#endif
+
+  if ((GuiLib_StructPtr)StructureToCall != 0)
+  {
+    sgl.CurItem.X1 = 0;
+    sgl.CurItem.Y1 = 0;
+    sgl.CurItem.X2 = 0;
+    sgl.CurItem.Y2 = 0;
+    sgl.CurItem.R1 = 0;
+    sgl.CurItem.R2 = 0;
+
+    sgl.CurItem.RX = 0;
+    sgl.CurItem.RY = 0;
+    sgl.CurItem.RX1 = 0;
+    sgl.CurItem.RY1 = 0;
+    sgl.CurItem.RX2 = 0;
+    sgl.CurItem.RY2 = 0;
+
+    for (N = 0; N < 2 * GuiLib_MEMORY_CNT; N++)
+    {
+      sgl.Memory.X[N] = 0;
+      sgl.Memory.Y[N] = 0;
+    }
+    for (N = 0; N < GuiLib_MEMORY_CNT; N++)
+      sgl.Memory.C[N] = 0;
+    sgl.ThicknessMemory = 1;
+
+    sgl.CurItem.ForeColor = GuiConst_PIXEL_ON;
+    sgl.CurItem.BackColor = GuiConst_PIXEL_OFF;
+    sgl.CurItem.BarForeColor = GuiConst_PIXEL_OFF;
+    sgl.CurItem.BarBackColor = GuiConst_PIXEL_ON;
+    sgl.CurItem.ForeColorIndex = 0xFFFF;
+    sgl.CurItem.BackColorIndex = 0xFFFF;
+    sgl.CurItem.BarForeColorIndex = 0xFFFF;
+    sgl.CurItem.BarBackColorIndex = 0xFFFF;
+
+
+    for (N = 0; N < 3; N++)
+    {
+      sgl.CurItem.TextPar[N].BitFlags = GuiLib_BITFLAG_TRANSPARENT;
+      sgl.CurItem.TextPar[N].Alignment = GuiLib_ALIGN_LEFT;
+      sgl.CurItem.TextPar[N].BackBoxSizeX = 0;
+      sgl.CurItem.TextPar[N].FontIndex = 0;
+      sgl.CurItem.TextPar[N].Ps = GuiLib_PS_ON;
+    }
+
+    sgl.CurItem.FormatFieldWidth = 10;
+    sgl.CurItem.FormatDecimals = 0;
+    sgl.CurItem.FormatAlignment = GuiLib_FORMAT_ALIGNMENT_RIGHT;
+    sgl.CurItem.FormatFormat = GuiLib_FORMAT_DEC;
+
+#ifdef GuiConst_BLINK_SUPPORT_ON
+#ifndef GuiConst_BLINK_FIELDS_OFF
+    for (N = 0; N < GuiConst_BLINK_FIELDS_MAX; N++)
+    {
+      sgl.BlinkTextItems[N].InUse = 0;
+      sgl.BlinkTextItems[N].Active = 0;
+    }
+#endif
+#endif
+
+#ifdef GuiConst_ITEM_TOUCHAREA_INUSE
+    sgl.TouchAreaCnt = 0;
+#endif
+
+#ifdef GuiConst_ITEM_SCROLLBOX_INUSE
+    for (M = 0; M < GuiConst_SCROLLITEM_BOXES_MAX; M++)
+    {
+      sgl.ScrollBoxesAry[M].InUse = GuiLib_SCROLL_STRUCTURE_UNDEF;
+      for (N = 0; N < GuiConst_SCROLLITEM_MARKERS_MAX; N++)
+      {
+        sgl.ScrollBoxesAry[M].MarkerColor[N] = GuiConst_PIXEL_ON;
+        sgl.ScrollBoxesAry[M].MarkerColorTransparent[N] = 1;
+      }
+    }
+#endif
+
+#ifdef GuiConst_ITEM_GRAPH_INUSE
+    for (N = 0; N < GuiConst_GRAPH_MAX; N++)
+      sgl.GraphAry[N].InUse = GuiLib_GRAPH_STRUCTURE_UNDEF;
+#endif
+
+    sgl.BaseLayerDrawing = 1;
+#ifdef GuiConst_ITEM_GRAPHICS_LAYER_FILTER_INUSE
+    GraphicsLayer_Pop(GuiLib_GRAPHICS_LAYER_BASE);
+    for (N = 0; N < GuiConst_GRAPHICS_LAYER_MAX; N++)
+    {
+      sgl.GraphicsLayerList[N].InUse = GuiLib_GRAPHICS_LAYER_UNDEF;
+      sgl.GraphicsFilterList[N].InUse = GuiLib_GRAPHICS_FILTER_UNDEF;
+    }
+#endif
+
+#ifdef GuiConst_BITMAP_SUPPORT_ON
+    sgl.GlobalBackgrBitmapIndex = 0;
+    for (N = 0; N < GuiConst_MAX_BACKGROUND_BITMAPS; N++)
+      sgl.BackgrBitmapAry[N].InUse = 0;
+#endif
+
+    if (ResetAutoRedraw)
+      AutoRedraw_Destroy();
+#ifdef GuiConst_CURSOR_SUPPORT_ON
+    else
+      AutoRedraw_ResetCursor();
+#endif
+
+    sgl.DrawingLevel = 0;
+    sgl.TopLevelStructure = 0;
+
+#ifdef GuiConst_TEXTBOX_FIELDS_ON
+    sgl.CurItem.CompPars.CompTextBox.ScrollIndex = 0;
+    sgl.CurItem.CompPars.CompTextBox.ScrollPos = 0;
+    for (N = 0; N < GuiConst_TEXTBOX_FIELDS_MAX; N++)
+      sgl.TextBoxScrollPositions[N].index = -1;
+#endif
+
+    sgl.CoordOrigoX = sgl.DisplayOrigoX + sgl.LayerOrigoX;
+    sgl.CoordOrigoY = sgl.DisplayOrigoY + sgl.LayerOrigoY;
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+    sgl.CurItem.ClipRectX1 = sgl.DisplayActiveAreaX1;
+    sgl.CurItem.ClipRectY1 = sgl.DisplayActiveAreaY1;
+    sgl.CurItem.ClipRectX2 = sgl.DisplayActiveAreaX2;
+    sgl.CurItem.ClipRectY2 = sgl.DisplayActiveAreaY2;
+    sgl.ActiveAreaX1 = sgl.DisplayActiveAreaX1;
+    sgl.ActiveAreaY1 = sgl.DisplayActiveAreaY1;
+    sgl.ActiveAreaX2 = sgl.DisplayActiveAreaX2;
+    sgl.ActiveAreaY2 = sgl.DisplayActiveAreaY2;
+    if (sgl.DisplayWriting)
+    {
+      if ((sgl.DisplayActiveAreaX1 != 0) || (sgl.DisplayActiveAreaY1 != 0) ||
+          (sgl.DisplayActiveAreaX2 != GuiConst_DISPLAY_WIDTH - 1) ||
+          (sgl.DisplayActiveAreaY2 != GuiConst_DISPLAY_HEIGHT - 1))
+        GuiLib_SetClipping(sgl.DisplayActiveAreaX1, sgl.DisplayActiveAreaY1,
+                           sgl.DisplayActiveAreaX2, sgl.DisplayActiveAreaY2);
+      else
+        GuiLib_ResetClipping();
+    }
+#endif
+#ifdef GuiConst_CURSOR_SUPPORT_ON
+    sgl.CurItem.CursorFieldLevel = 0;
+#endif
+    sgl.DisplayLevel = 0;
+    sgl.InitialDrawing = 1;
+    sgl.SwapColors = 0;
+    DrawStructure((GuiLib_StructPtr) StructureToCall,
+                   GuiLib_COL_INVERT_IF_CURSOR);
+    ResetLayerBufPtr();
+    sgl.InitialDrawing = 0;
+    sgl.CoordOrigoX = sgl.DisplayOrigoX + sgl.LayerOrigoX;
+    sgl.CoordOrigoY = sgl.DisplayOrigoY + sgl.LayerOrigoY;
+
+#ifdef GuiConst_CLIPPING_SUPPORT_ON
+    if (sgl.DisplayWriting)
+      GuiLib_ResetClipping();
+#endif
+  }
+
+#ifdef GuiConst_CURSOR_SUPPORT_ON
+  if (sgl.CursorFieldFound == -1)
+  {
+    sgl.CursorInUse = 0;
+    GuiLib_ActiveCursorFieldNo = -1;
+  }
+  else if (sgl.CursorInUse)
+  {
+    if (sgl.CursorActiveFieldFound == 0)
+    {
+      GuiLib_ActiveCursorFieldNo = sgl.CursorFieldFound;
+
+      DrawCursorItem(1);
+    }
+  }
+#endif
+
+#ifdef GuiConst_BLINK_SUPPORT_ON
+  sgl.BlinkBoxInverted = 0;
+#endif
+
+  GuiDisplay_Unlock();
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT16S CheckLanguageIndex(
+   GuiConst_INT16S LanguageIndex)
+{
+  if ((LanguageIndex < 0) || (LanguageIndex > GuiConst_LANGUAGE_CNT - 1))
+    LanguageIndex = 0;
+
+#ifdef GuiConst_LANGUAGE_SOME_ACTIVE
+  if (!ReadByte(GuiFont_LanguageActive[LanguageIndex]))
+    LanguageIndex = GuiConst_LANGUAGE_FIRST;
+#endif
+
+  return(LanguageIndex);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_TEXT PrefixLocate *GuiLib_GetTextLanguagePtr(
+   const GuiConst_INT16U StructureNdx,
+   GuiConst_INT16U TextNo,
+   GuiConst_INT16S LanguageIndex)
+{
+  GuiConst_INT16U I;
+  GuiConst_INT16S ItemNdx;
+  GuiConst_INT8U ItemCnt;
+  GuiLib_StructPtr StructureToCall;
+#ifdef GuiConst_REMOTE_STRUCT_DATA
+  GuiConst_INT8U ItemSizeBuf[2];
+  GuiConst_INT16U ItemSize;
+#endif
+
+  StructureToCall =
+#ifdef GuiConst_REMOTE_STRUCT_DATA
+     GetRemoteStructData(StructureNdx);
+#else
+     (GuiLib_StructPtr)ReadWord(GuiStruct_StructPtrList[StructureNdx]);
+#endif
+
+  if (StructureToCall != 0)
+  {
+    LanguageIndex = CheckLanguageIndex(LanguageIndex);
+
+    sgl.ItemDataPtr = (GuiConst_INT8U PrefixLocate *)StructureToCall;
+    ItemCnt = GetItemByte(&sgl.ItemDataPtr);
+
+    I = 0;
+    for (ItemNdx = 0; ItemNdx < ItemCnt; ItemNdx++)
+    {
+#ifdef GuiConst_REMOTE_STRUCT_DATA
+      GuiLib_RemoteDataReadBlock(
+         sgl.RemoteStructOffset,
+         2,
+         (GuiConst_INT8U*)&ItemSizeBuf);
+      ItemSize = (256 * (GuiConst_INT16U)ItemSizeBuf[1]) + ItemSizeBuf[0];
+      sgl.RemoteStructOffset += 2;
+      GuiLib_RemoteDataReadBlock(
+         sgl.RemoteStructOffset,
+         ItemSize,
+         sgl.GuiLib_RemoteItemBuffer);
+      sgl.RemoteStructOffset += ItemSize;
+      sgl.ItemDataPtr = &sgl.GuiLib_RemoteItemBuffer[0];
+#endif
+
+      ReadItem(LanguageIndex);
+
+      if ((sgl.CurItem.ItemType == GuiLib_ITEM_TEXT) ||
+          (sgl.CurItem.ItemType == GuiLib_ITEM_TEXTBLOCK))
+      {
+        if (I == TextNo)
+        {
+#ifdef GuiConst_CHARMODE_ANSI
+          return (GuiConst_TEXT PrefixLocate *) sgl.CurItem.TextPtr[0];
+#else
+          #ifdef GuiConst_ICC_COMPILER
+          ExtractUnicodeString((GuiConst_INT8U *)sgl.CurItem.TextPtr[0],
+                               sgl.CurItem.TextLength[0]);
+          #else
+          #ifdef GuiConst_CODEVISION_COMPILER
+          ExtractUnicodeString((GuiConst_INT8U *)sgl.CurItem.TextPtr[0],
+                               sgl.CurItem.TextLength[0]);
+          #else
+          ExtractUnicodeString((GuiConst_INT8U PrefixRom *)sgl.CurItem.TextPtr[0],
+                               sgl.CurItem.TextLength[0]);
+          #endif
+          #endif
+
+          return (sgl.UnicodeTextBuf);
+#endif
+        }
+        I++;
+      }
+    }
+  }
+
+  return (0);
+}
+
+//------------------------------------------------------------------------------
+GuiConst_TEXT PrefixLocate *GuiLib_GetTextPtr(
+   const GuiConst_INT16U StructureNdx,
+   GuiConst_INT16U TextNo)
+{
+  return (GuiLib_GetTextLanguagePtr(StructureNdx, TextNo, GuiLib_LanguageIndex));
+}
+
+//------------------------------------------------------------------------------
+GuiConst_INT16U GuiLib_GetTextWidth(
+   GuiConst_TEXT PrefixLocate *String,
+   GuiLib_FontRecConstPtr Font,
+   GuiConst_INT8U PsWriting)
+{
+  GuiLib_ItemRec TextData;
+  GuiConst_INT16U CharCnt;
+
+  if ((String[0] != 0) && (Font != 0))
+  {
+    TextData.TextPar[0].Ps = PsWriting;
+    sgl.CurItem.TextPar[0].Ps = TextData.TextPar[0].Ps;
+#ifdef GuiConst_CHARMODE_ANSI
+    CharCnt = strlen(String);
+#else
+    CharCnt = GuiLib_UnicodeStrLen(String);
+#endif
+    sgl.CurFont = (GuiLib_FontRecPtr)Font;
+#ifdef GuiConst_DISP_VAR_NOW
+    displayVarNow = 1;
+#endif
+
+#ifdef GuiConst_CODEVISION_COMPILER
+    PrepareText((GuiConst_TEXT *)String, CharCnt, 0);
+#else
+#ifdef GuiConst_RENESAS_COMPILER_FAR
+    PrepareText((GuiConst_TEXT PrefixGeneric *)String, CharCnt, 0);
+#else
+    PrepareText(String, CharCnt, 0);
+#endif
+#endif
+#ifdef GuiConst_DISP_VAR_NOW
+    displayVarNow = 0;
+#endif
+
+    return (TextPixelLength(TextData.TextPar[0].Ps, CharCnt, 0));
+  }
+
+  return (0);
+}
+
+//---------------------------------------------------------------
+static GuiConst_TEXT GetCharCode(
+   GuiConst_TEXT PrefixRom * CharPtr,
+   GuiConst_INT16U CharCnt,
+   GuiConst_INT16U CharNo,
+   GuiConst_INT16U OmitCtrlCode)
+{
+  GuiConst_INT16U P;
+  GuiConst_TEXT CharCode, PreviousCharCode;
+
+  if (CharCnt > GuiConst_MAX_TEXT_LEN)
+    CharCnt = GuiConst_MAX_TEXT_LEN;
+
+  if (CharNo > CharCnt)
+    return 0;
+
+  if (CharCnt > GuiConst_MAX_TEXT_LEN)
+    CharCnt = GuiConst_MAX_TEXT_LEN;
+
+  if (OmitCtrlCode)
+  {
+    for (P = 0; P < CharNo + 1; P++)
+    {
+#ifdef GuiConst_CHARMODE_ANSI
+  #ifdef GuiConst_AVRGCC_COMPILER
+      CharCode = (unsigned GuiConst_CHAR) ReadBytePtr(CharPtr);
+  #else
+  #ifdef GuiConst_ICC_COMPILER
+      CharCode = *((GuiConst_INT8U PrefixRom *)CharPtr);
+  #else
+  #ifdef GuiConst_CODEVISION_COMPILER
+      CharCode = *((GuiConst_INT8U PrefixRom *)CharPtr);
+  #else
+      CharCode = (unsigned GuiConst_TEXT) *CharPtr;
+  #endif
+  #endif
+  #endif
+#else
+      CharCode = *((GuiConst_INT16U PrefixLocate *)CharPtr);
+#endif
+
+      if (P)
+      {
+        if ((CharCode == GuiLib_LINEFEED) ||
+           ((CharCode == ' ') && (PreviousCharCode == ' ')) ||
+           ((CharCode == ' ') && (PreviousCharCode == '-')))
+          CharNo++;
+      }
+      PreviousCharCode = CharCode;
+
+      CharPtr++;
+    }
+  }
+  else
+  {
+    CharPtr += CharNo;
+
+#ifdef GuiConst_CHARMODE_ANSI
+  #ifdef GuiConst_AVRGCC_COMPILER
+    CharCode = (unsigned GuiConst_CHAR) ReadBytePtr(CharPtr);
+  #else
+  #ifdef GuiConst_ICC_COMPILER
+    CharCode = *((GuiConst_INT8U PrefixRom *)CharPtr);
+  #else
+  #ifdef GuiConst_CODEVISION_COMPILER
+    CharCode = *((GuiConst_INT8U PrefixRom *)CharPtr);
+  #else
+    CharCode = (unsigned GuiConst_TEXT) *CharPtr;
+  #endif
+  #endif
+  #endif
+#else
+    CharCode = *((GuiConst_INT16U PrefixLocate *)CharPtr);
+#endif
+  }
+
+  return (GuiConst_TEXT)CharCode;
+}
+
+//------------------------------------------------------------------------------
+GuiConst_TEXT GuiLib_GetCharCode(
+   const GuiConst_INT16U StructureNdx,
+   GuiConst_INT16U TextNo,
+   GuiConst_INT16U CharNo,
+   GuiConst_INT16U OmitCtrlCode)
+{
+  GuiConst_TEXT PrefixRom * CharPtr;
+
+  CharPtr = GuiLib_GetTextPtr(StructureNdx, TextNo);
+
+  if (CharPtr == 0) return 0;
+
+#ifdef GuiConst_CHARMODE_ANSI
+  return GetCharCode(CharPtr,
+                     strlen(CharPtr),
+                     CharNo,
+                     OmitCtrlCode);
+#else
+  return GetCharCode(CharPtr,
+                     GuiLib_UnicodeStrLen(CharPtr),
+                     CharNo,
+                     OmitCtrlCode);
+#endif
+}
+
+//------------------------------------------------------------------------------
+#ifdef GuiConst_BLINK_SUPPORT_ON
+GuiConst_TEXT GuiLib_GetBlinkingCharCode(
+   GuiConst_INT16U BlinkFieldNo,
+   GuiConst_INT16U CharNo,
+   GuiConst_INT16U OmitCtrlCode)
+{
+#ifndef GuiConst_BLINK_FIELDS_OFF
+  GuiConst_INT16U StrLen;
+
+  if (BlinkFieldNo >= GuiConst_BLINK_FIELDS_MAX)
+    return 0;
+
+  if (sgl.BlinkTextItems[BlinkFieldNo].InUse)
+  {
+    #ifdef GuiConst_CHARMODE_ANSI
+    StrLen = strlen((GuiConst_TEXT*)sgl.BlinkTextItems[BlinkFieldNo].TextPtr);
+    #else
+    #ifdef GuiConst_CODEVISION_COMPILER
+    StrLen = GuiLib_UnicodeStrLen(
+       (GuiConst_TEXT*)sgl.BlinkTextItems[BlinkFieldNo].TextPtr);
+    #else
+    StrLen = GuiLib_UnicodeStrLen((GuiConst_TEXT*)sgl.BlinkTextItems[BlinkFieldNo].TextPtr);
+    #endif
+    #endif
+
+    return GetCharCode((GuiConst_TEXT PrefixRom *)sgl.BlinkTextItems[BlinkFieldNo].TextPtr,
+                       StrLen,
+                       CharNo,
+                       OmitCtrlCode);
+  }
+  else
+#endif
+    return 0;
+}
+#endif
+
+//------------------------------------------------------------------------------
+void GuiLib_SetLanguage(
+   GuiConst_INT16S NewLanguage)
+{
+  GuiLib_LanguageIndex = CheckLanguageIndex(NewLanguage);
+}
+
+//------------------------------------------------------------------------------
+static void InvertBox(void)
+{
+  if (sgl.DisplayWriting)
+    GuiLib_InvertBox(sgl.InvertBoxX1, sgl.InvertBoxY1, sgl.InvertBoxX2, sgl.InvertBoxY2);
+  sgl.InvertBoxOn = !sgl.InvertBoxOn;
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_InvertBoxStart(
+   GuiConst_INT16S X1,
+   GuiConst_INT16S Y1,
+   GuiConst_INT16S X2,
+   GuiConst_INT16S Y2)
+{
+  GuiLib_InvertBoxStop();
+  sgl.InvertBoxX1 = X1;
+  sgl.InvertBoxY1 = Y1;
+  sgl.InvertBoxX2 = X2;
+  sgl.InvertBoxY2 = Y2;
+  InvertBox();
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_InvertBoxStop(void)
+{
+  if (sgl.InvertBoxOn)
+    InvertBox();
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_Refresh(void)
+{
+#ifdef WANT_DOUBLE_BUFFERING // Otherwise we are writing direct to the display - no need for this code
+  GuiConst_INT16S N, L;
+  GuiConst_INT8U RedrawBottomLevel;
+  ItemMemory     RemMemory;
+  GuiConst_INT8U ColorInvert;
+
+  GuiDisplay_Lock();
+
+  sgl.RefreshClock++;
+
+  RedrawBottomLevel = 0;
+
+  N = AutoRedraw_Reset();
+
+  memcpy(&RemMemory, &sgl.Memory, sizeof(ItemMemory));
+
+  while (N != -1)
+  {
+#ifdef GuiConst_CURSOR_SUPPORT_ON
+    if (!AutoRedraw_IsOnlyCursor(N))
+#endif
+    {
+      if (AutoRedraw_VarChanged(N) != 0)
+      {
+        memcpy(&sgl.CurItem, AutoRedraw_GetItem(N), sizeof(GuiLib_ItemRec));
+        memcpy(&sgl.Memory, AutoRedraw_GetItemMemory(N), sizeof(ItemMemory));
+
+        AutoRedraw_UpdateVar(N);
+
+        ColorInvert = GuiLib_COL_INVERT_IF_CURSOR;
+
+#ifdef GuiConst_CURSOR_SUPPORT_ON
+        if (AutoRedraw_CheckCursorInheritance(N) == 0)
+          ColorInvert = GuiLib_COL_INVERT_ON;
+#endif
+
+        L = AutoRedraw_GetLevel(N);
+
+        if (AutoRedraw_ItemIsStruct(N))
+        {
+          N = AutoRedraw_DeleteStruct(N);
+          sgl.AutoRedrawUpdate = GuiLib_TRUE;
+          if (sgl.AutoRedrawInsertPoint >= 0)
+            N = AutoRedraw_GetNext(N);
+        }
+        else
+        {
+          sgl.AutoRedrawUpdate = GuiLib_FALSE;
+          N = AutoRedraw_GetNext(N);
+        }
+
+#ifdef GuiConst_BITMAP_SUPPORT_ON
+        UpdateBackgroundBitmap();
+#endif
+
+        sgl.DisplayLevel = 0;
+        sgl.SwapColors = 0;
+
+#ifdef GuiConst_BLINK_SUPPORT_ON
+#ifndef GuiConst_BLINK_FIELDS_OFF
+        if ((sgl.CurItem.TextPar[0].BitFlags & GuiLib_BITFLAG_BLINKTEXTFIELD) &&
+            (sgl.CurItem.BlinkFieldNo < GuiConst_BLINK_FIELDS_MAX) &&
+             sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].InUse &&
+             sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].Active &&
+             sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].BlinkBoxInverted)
+           GuiLib_InvertBox(sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].BlinkBoxX1,
+                            sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].BlinkBoxY1,
+                            sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].BlinkBoxX2,
+                            sgl.BlinkTextItems[sgl.CurItem.BlinkFieldNo].BlinkBoxY2);
+#endif
+#endif
+
+        DrawItem(ColorInvert);
+
+        if (L == 0)
+          RedrawBottomLevel = 1;
+
+        sgl.AutoRedrawUpdate = GuiLib_FALSE;
+      }
+      else
+        N = AutoRedraw_GetNext(N);
+    }
+#ifdef GuiConst_CURSOR_SUPPORT_ON
+    else
+      N = AutoRedraw_GetNext(N);
+#endif
+  }
+
+  memcpy(&sgl.Memory, &RemMemory, sizeof(ItemMemory));
+
+
+  if ((sgl.DrawingLevel > 0) && RedrawBottomLevel && (sgl.TopLevelStructure != 0))
+  {
+    sgl.DisplayLevel = 0;
+    sgl.SwapColors = 0;
+    DrawStructure(sgl.TopLevelStructure, GuiLib_COL_INVERT_IF_CURSOR);
+    ResetLayerBufPtr();
+  }
+
+#ifdef GuiConst_BLINK_SUPPORT_ON
+#ifndef GuiConst_BLINK_FIELDS_OFF
+  for (N = 0; N < GuiConst_BLINK_FIELDS_MAX; N++)
+    if (sgl.BlinkTextItems[N].InUse &&
+        sgl.BlinkTextItems[N].Active)
+    {
+      if (sgl.BlinkTextItems[N].BlinkBoxInverted !=
+          sgl.BlinkTextItems[N].BlinkBoxLast)
+      {
+         GuiLib_InvertBox(sgl.BlinkTextItems[N].BlinkBoxX1,
+                          sgl.BlinkTextItems[N].BlinkBoxY1,
+                          sgl.BlinkTextItems[N].BlinkBoxX2,
+                          sgl.BlinkTextItems[N].BlinkBoxY2);
+         sgl.BlinkTextItems[N].BlinkBoxInverted =
+            sgl.BlinkTextItems[N].BlinkBoxLast;
+      }
+      if (sgl.BlinkTextItems[N].BlinkBoxState < 255)
+      {
+        sgl.BlinkTextItems[N].BlinkBoxState--;
+        if (sgl.BlinkTextItems[N].BlinkBoxState == 0)
+        {
+          sgl.BlinkTextItems[N].BlinkBoxState = sgl.BlinkTextItems[N].BlinkBoxRate;
+          if (sgl.DisplayWriting)
+          {
+            GuiLib_InvertBox(sgl.BlinkTextItems[N].BlinkBoxX1,
+                             sgl.BlinkTextItems[N].BlinkBoxY1,
+                             sgl.BlinkTextItems[N].BlinkBoxX2,
+                             sgl.BlinkTextItems[N].BlinkBoxY2);
+            sgl.BlinkTextItems[N].BlinkBoxInverted =
+               !sgl.BlinkTextItems[N].BlinkBoxInverted;
+            sgl.BlinkTextItems[N].BlinkBoxLast =
+               sgl.BlinkTextItems[N].BlinkBoxInverted;
+          }
+        }
+      }
+    }
+  if (sgl.BlinkBoxRate)
+  {
+    if (sgl.BlinkBoxState < 255)
+      sgl.BlinkBoxState--;
+    if (sgl.BlinkBoxState == 0)
+    {
+      sgl.BlinkBoxState = sgl.BlinkBoxRate;
+      BlinkBox();
+    }
+  }
+#endif
+#endif
+
+  GuiDisplay_Unlock();
+
+  GuiDisplay_Refresh();
+#endif // WANT_DOUBLE_BUFFERING 
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_DrawChar(
+   GuiConst_INT16S X,
+   GuiConst_INT16S Y,
+   GuiConst_INT16U FontNo,
+   GuiConst_TEXT Character,
+   GuiConst_INTCOLOR Color)
+{
+  GuiLib_FontRecPtr Font;
+#ifndef GuiConst_REMOTE_FONT_DATA
+  GuiConst_INT8U PrefixRom *CharPtr;
+#endif
+  GuiConst_INT16S X1,Y1,X2,Y2;
+#ifdef GuiConst_REMOTE_FONT_DATA
+  GuiConst_INT32U CharNdx;
+#else
+#ifdef GuiConst_CHARMODE_UNICODE
+  GuiConst_INT32U CharNdx;
+#endif
+#endif
+
+  Font = (GuiLib_FontRecPtr) ReadWord(GuiFont_FontList[FontNo]);
+
+  Y -= ReadByte(Font->BaseLine);
+
+#ifdef GuiConst_CHARMODE_ANSI
+  #ifdef GuiConst_REMOTE_FONT_DATA
+  if ((Character < Font->FirstChar) || (Character > Font->LastChar))
+    CharNdx =
+       (GuiConst_INT32U PrefixRom)GuiFont_ChPtrList[Font->IllegalCharNdx];
+  else
+    CharNdx =
+       (GuiConst_INT32U PrefixRom)GuiFont_ChPtrList[Font->FirstCharNdx +
+       (GuiConst_INT16U)Character - (GuiConst_INT16U)Font->FirstChar];
+  DrawChar(X, Y, Font, CharNdx, Color, 0);
+  #else
+  if ((Character < ReadByte(Font->FirstChar)) ||
+     (Character > ReadByte(Font->LastChar)))
+    CharPtr = (GuiConst_INT8U PrefixRom *)ReadWord(
+       GuiFont_ChPtrList[ReadWord(Font->IllegalCharNdx)]);
+  else
+    CharPtr = (GuiConst_INT8U PrefixRom *)ReadWord(
+       GuiFont_ChPtrList[ReadWord(Font->FirstCharNdx) +
+       (GuiConst_INT16U)Character -
+       (GuiConst_INT16U)ReadByte(Font->FirstChar)]);
+  DrawChar(X, Y, Font, CharPtr, Color, 0);
+  #endif
+#else
+  CharNdx = GetCharNdx(Font, Character);
+  #ifdef GuiConst_REMOTE_FONT_DATA
+  DrawChar(X, Y, Font, CharNdx, Color, 0);
+  #else
+  CharPtr = (GuiConst_INT8U PrefixRom *)ReadWord(GuiFont_ChPtrList[CharNdx]);
+  DrawChar(X, Y, Font, CharPtr, Color, 0);
+  #endif
+#endif
+
+#ifdef GuiConst_REMOTE_FONT_DATA
+  X1 = X + sgl.GuiLib_RemoteFontBuffer[GuiLib_CHR_XLEFT_OFS];
+  X2 = X1 + sgl.GuiLib_RemoteFontBuffer[GuiLib_CHR_XWIDTH_OFS] - 1;
+  Y1 = Y + sgl.GuiLib_RemoteFontBuffer[GuiLib_CHR_YTOP_OFS];
+  Y2 = Y1 + sgl.GuiLib_RemoteFontBuffer[GuiLib_CHR_YHEIGHT_OFS] - 1;
+#else
+  X1 = X + ReadBytePtr(CharPtr + GuiLib_CHR_XLEFT_OFS);
+  X2 = X1 + ReadBytePtr(CharPtr + GuiLib_CHR_XWIDTH_OFS) - 1;
+  Y1 = Y + ReadBytePtr(CharPtr + GuiLib_CHR_YTOP_OFS);
+  Y2 = Y1 + ReadBytePtr(CharPtr + GuiLib_CHR_YHEIGHT_OFS) - 1;
+#endif
+
+  GuiLib_MarkDisplayBoxRepaint(X1,Y1,X2,Y2);
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_DrawStr(
+   GuiConst_INT16S X,
+   GuiConst_INT16S Y,
+   GuiConst_INT16U FontNo,
+   GuiConst_TEXT *String,
+   GuiConst_INT8U Alignment,
+   GuiConst_INT8U PsWriting,
+   GuiConst_INT8U Transparent,
+   GuiConst_INT8U Underlining,
+   GuiConst_INT16S BackBoxSizeX,
+   GuiConst_INT16S BackBoxSizeY1,
+   GuiConst_INT16S BackBoxSizeY2,
+   GuiConst_INT8U BackBorderPixels,
+   GuiConst_INTCOLOR ForeColor,
+   GuiConst_INTCOLOR BackColor)
+{
+  if (FontNo >= GuiFont_FontCnt)
+    return;
+  if (*String == 0)
+    return;
+
+  SetCurFont(FontNo);
+
+#ifdef GuiConst_AVRGCC_COMPILER
+  #ifdef GuiConst_CHARMODE_ANSI
+  sgl.CurItem.TextPtr[0] = (GuiConst_INT8U *)String;
+  #else
+  sgl.CurItem.TextPtr[0] = (GuiConst_INT16U *)String;
+  #endif
+#else
+#ifdef GuiConst_ICC_COMPILER
+  #ifdef GuiConst_CHARMODE_ANSI
+  sgl.CurItem.TextPtr[0] = (GuiConst_INT8U *)String;
+  #else
+  sgl.CurItem.TextPtr[0] = (GuiConst_INT16U *)String;
+  #endif
+#else
+#ifdef GuiConst_CODEVISION_COMPILER
+  #ifdef GuiConst_CHARMODE_ANSI
+  sgl.CurItem.TextPtr[0] = (GuiConst_INT8U *)String;
+  #else
+  sgl.CurItem.TextPtr[0] = (GuiConst_INT16U *)String;
+  #endif
+#else
+#ifdef GuiConst_RENESAS_COMPILER_FAR
+  #ifdef GuiConst_CHARMODE_ANSI
+  sgl.CurItem.TextPtr[0] = (GuiConst_INT8U PrefixLocate *)String;
+  #else
+  sgl.CurItem.TextPtr[0] = (GuiConst_INT16U PrefixLocate *)String;
+  #endif
+#else
+  sgl.CurItem.TextPtr[0] = String;
+#endif
+#endif
+#endif
+#endif
+
+  sgl.CurItem.TextLength[0] = 0;
+  while (*String != 0)
+  {
+    sgl.CurItem.TextLength[0]++;
+    String++;
+  }
+  sgl.CurItem.X1 = X;
+  sgl.CurItem.Y1 = Y;
+  sgl.CurItem.TextPar[0].FontIndex = FontNo;
+  sgl.CurItem.TextPar[0].Alignment = Alignment;
+  sgl.CurItem.TextPar[0].Ps = PsWriting;
+  sgl.CurItem.TextPar[0].BitFlags = 0;
+  if (Underlining)
+    sgl.CurItem.TextPar[0].BitFlags |= GuiLib_BITFLAG_UNDERLINE;
+  sgl.CurItem.TextPar[0].BackBoxSizeX = BackBoxSizeX;
+  sgl.CurItem.TextPar[0].BackBoxSizeY1 = BackBoxSizeY1;
+  sgl.CurItem.TextPar[0].BackBoxSizeY2 = BackBoxSizeY2;
+  sgl.CurItem.TextPar[0].BackBorderPixels = BackBorderPixels;
+  if (sgl.CurItem.TextPar[0].BackBoxSizeX > 0)
+    DrawBackBox(BackColor, Transparent, 0);
+
+#ifdef GuiConst_DISP_VAR_NOW
+  displayVarNow = 1;
+#endif
+
+  DrawText(sgl.CurItem.TextPtr[0],
+           sgl.CurItem.TextLength[0],
+           0,
+           ForeColor,
+           BackColor,
+           Transparent);
+
+#ifdef GuiConst_DISP_VAR_NOW
+  displayVarNow = 0;
+#endif
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_DrawVar(
+   GuiConst_INT16S X,
+   GuiConst_INT16S Y,
+   GuiConst_INT16U FontNo,
+   void PrefixLocate *VarPtr,
+   GuiConst_INT8U VarType,
+   GuiConst_INT8U FormatterFormat,
+   GuiConst_INT8U FormatterFieldWidth,
+   GuiConst_INT8U FormatterAlignment,
+   GuiConst_INT8U FormatterDecimals,
+   GuiConst_INT8U FormatterShowSign,
+   GuiConst_INT8U FormatterZeroPadding,
+   GuiConst_INT8U FormatterTrailingZeros,
+   GuiConst_INT8U FormatterThousandsSeparator,
+   GuiConst_INT8U Alignment,
+   GuiConst_INT8U PsWriting,
+   GuiConst_INT8U Transparent,
+   GuiConst_INT8U Underlining,
+   GuiConst_INT16S BackBoxSizeX,
+   GuiConst_INT16S BackBoxSizeY1,
+   GuiConst_INT16S BackBoxSizeY2,
+   GuiConst_INT8U BackBorderPixels,
+   GuiConst_INTCOLOR ForeColor,
+   GuiConst_INTCOLOR BackColor)
+{
+  GuiConst_INT32S VarValue;
+  GuiConst_INT16U StrLen;
+#ifndef GuiConst_CHARMODE_ANSI
+  GuiConst_INT16U P;
+#endif
+  GuiConst_TEXT PrefixGeneric *CharPtr;
+
+  if (FontNo >= GuiFont_FontCnt)
+    return;
+
+  SetCurFont(FontNo);
+
+  sgl.CurItem.VarPtr = VarPtr;
+  sgl.CurItem.VarType = VarType;
+  sgl.CurItem.FormatFormat = FormatterFormat;
+  sgl.CurItem.FormatFieldWidth = FormatterFieldWidth;
+  sgl.CurItem.FormatAlignment = FormatterAlignment;
+  sgl.CurItem.FormatDecimals = FormatterDecimals;
+  sgl.CurItem.TextPar[0].BitFlags = 0;
+  if (FormatterShowSign)
+    sgl.CurItem.TextPar[0].BitFlags |= GuiLib_BITFLAG_FORMATSHOWSIGN;
+  if (FormatterZeroPadding)
+    sgl.CurItem.TextPar[0].BitFlags |= GuiLib_BITFLAG_FORMATZEROPADDING;
+  if (FormatterTrailingZeros)
+    sgl.CurItem.TextPar[0].BitFlags |= GuiLib_BITFLAG_FORMATTRAILINGZEROS;
+  if (FormatterThousandsSeparator)
+    sgl.CurItem.TextPar[0].BitFlags |= GuiLib_BITFLAG_FORMATTHOUSANDSSEP;
+  sgl.CurItem.X1 = X;
+  sgl.CurItem.Y1 = Y;
+  sgl.CurItem.TextPar[0].FontIndex = FontNo;
+  sgl.CurItem.TextPar[0].Alignment = Alignment;
+  sgl.CurItem.TextPar[0].Ps = PsWriting;
+  if (Underlining)
+    sgl.CurItem.TextPar[0].BitFlags |= GuiLib_BITFLAG_UNDERLINE;
+  sgl.CurItem.TextPar[0].BackBoxSizeX = BackBoxSizeX;
+  sgl.CurItem.TextPar[0].BackBoxSizeY1 = BackBoxSizeY1;
+  sgl.CurItem.TextPar[0].BackBoxSizeY2 = BackBoxSizeY2;
+  sgl.CurItem.TextPar[0].BackBorderPixels = BackBorderPixels;
+  if (sgl.CurItem.TextPar[0].BackBoxSizeX > 0)
+    DrawBackBox(BackColor, Transparent, 0);
+
+#ifdef GuiConst_DISP_VAR_NOW
+  displayVarNow = 1;
+#endif
+
+  if (sgl.CurItem.VarType == GuiLib_VAR_STRING)
+  {
+    CharPtr = (GuiConst_TEXT PrefixLocate *)sgl.CurItem.VarPtr;
+#ifdef GuiConst_CHARMODE_ANSI
+    StrLen = strlen(CharPtr);
+#else
+#ifdef GuiConst_CODEVISION_COMPILER
+    StrLen = GuiLib_UnicodeStrLen((GuiConst_TEXT*)CharPtr);
+#else
+    StrLen = GuiLib_UnicodeStrLen(CharPtr);
+#endif
+#endif
+  }
+  else
+  {
+    VarValue = ReadVar(sgl.CurItem.VarPtr, sgl.CurItem.VarType);
+    StrLen = DataNumStr(VarValue, sgl.CurItem.VarType, 0);
+#ifdef GuiConst_CHARMODE_ANSI
+    CharPtr = (GuiConst_TEXT PrefixGeneric *) sgl.VarNumTextStr;
+#else
+    for (P = 0; P <= StrLen; P++)
+      sgl.VarNumUnicodeTextStr[P] = sgl.VarNumTextStr[P];
+    CharPtr = (GuiConst_TEXT PrefixGeneric *) sgl.VarNumUnicodeTextStr;
+#endif
+  }
+
+  DrawText(CharPtr,
+           StrLen,
+           0,
+           ForeColor,
+           BackColor,
+           Transparent);
+
+#ifdef GuiConst_DISP_VAR_NOW
+  displayVarNow = 0;
+#endif
+}
+
+//------------------------------------------------------------------------------
+void GuiLib_TestPattern(void)
+{
+  GuiLib_HLine(0, 31, 0, GuiConst_PIXEL_ON);
+  GuiLib_VLine(0, 1, 31, GuiConst_PIXEL_ON);
+  GuiLib_HLine(2, 8, 2, GuiConst_PIXEL_ON);
+  GuiLib_HLine(11, 16, 2, GuiConst_PIXEL_ON);
+  GuiLib_VLine(4, 4, 10, GuiConst_PIXEL_ON);
+  GuiLib_VLine(4, 13, 18, GuiConst_PIXEL_ON);
+}
+
+#include "GuiComponents.h"
+
+#ifdef GuiConst_REMOTE_DATA
+//------------------------------------------------------------------------------
+GuiConst_INT8U GuiLib_RemoteCheck(void)
+{
+  union
+  {
+    GuiConst_INT8U Bytes[4];
+    GuiConst_INT32U IdInFile;
+  } RemoteIdUnion;
+  GuiConst_INT8U ok;
+
+  GuiLib_RemoteDataReadBlock(0, 4, RemoteIdUnion.Bytes);
+  ok = (RemoteIdUnion.IdInFile == GuiConst_REMOTE_ID);
+
+#ifdef GuiConst_REMOTE_TEXT_DATA
+  GuiLib_RemoteTextReadBlock(0, 4, RemoteIdUnion.Bytes);
+  ok = ok && (RemoteIdUnion.IdInFile == GuiConst_REMOTE_ID);
+#endif
+
+  return (ok);
+}
+#endif
+
+