diff g23m/condat/com/src/driver/display_obsolete.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/g23m/condat/com/src/driver/display_obsolete.c	Mon Jun 01 03:24:05 2015 +0000
@@ -0,0 +1,4966 @@
+/*
++-----------------------------------------------------------------------------
+|  Project :
+|  Modul   :  display.c
++-----------------------------------------------------------------------------
+|  Copyright 2002 Texas Instruments Berlin, AG
+|                 All rights reserved.
+|
+|                 This file is confidential and a trade secret of Texas
+|                 Instruments Berlin, AG
+|                 The receipt of or possession of this file does not convey
+|                 any rights to reproduce or disclose its contents or to
+|                 manufacture, use, or sell anything it may describe, in
+|                 whole, or in part, without the specific written consent of
+|                 Texas Instruments Berlin, AG.
++-----------------------------------------------------------------------------
+|  Purpose :
++-----------------------------------------------------------------------------
+*/
+/*
+   
+	July 1, 2005 REF: CRR 32677 - xpradipg
+	Description: Alignmnet of the display for each row. Send the un negated value to LCD driver
+	Solution: The alignment of the display is corrected by decreasing the number of columns by 1.
+			The negated value is corrected and sent to the driver
+
+	June 03, 2005 REF: GSM-ENH-31636 xpradipg
+	Description:	Change the board ID for Isample to 71 and add new defination
+					for the CALLISTO with baord ID 70
+	Solution:		Add the definition of ALLISTO with board ID 70 and change the
+					board Id to 71 for Isample
+   
+	Mar 30, 2005	REF: CRR 29986	xpradipg
+	Description: Optimisation 1: Removal of unused variables and dynamically
+	allocate/ deallocate mbndata
+	Solution: removed the unused variable pictureCopy_col and the static 
+	qualifier so as to be accessed by the ATB module
+
+
+	CRR 28825:  xpradipg - 11 Feb 2005
+	Description:Extension of GDI-for display of ISample and code cleanup
+	Solution: The code replication for D_Sample and E_sample are removed and a 
+	new	flag is added for the ISample. currently the BOARD ID is set to 70 for
+	CALLISTO and 71 for ISample.
+
+GW 31/01/03 -	Added support for 16 bit LCD buffer -
+					Split DSAMPLE_COLOUR code into DSAMPLE_COLOUR32 (original 32bits/pixel)
+					and DSAMPLE_COLOUR16 (16 bits/pixel - untested)
+				Removed CSAMPLE_COLOUR option
+				Removed 'PLOT' option for D-sample - too slow to be useful
+
+*/
+
+#ifndef DRV_DSPL_C
+#define DRV_DSPL_C
+#endif
+
+/*==== INCLUDES ===================================================*/
+#define ENTITY_CST
+
+#include <string.h>
+#if defined (WIN32)
+#include <stdio.h>
+#endif
+
+#include "typedefs.h"
+#include "gdi.h"
+#include "dspl.h"
+#include "font_bitmaps.h"
+#include "vsi.h"
+#include "custom.h"
+#include "gsm.h"
+#include "prim.h"
+#include "p_mmi.h"
+#include "tok.h"
+#include "cst/cst.h"
+#include "os.h"
+
+#include "rvf/rvf_api.h"
+
+#undef R2D_ENABLED
+#ifndef _SIMULATION_
+
+#if (defined(_TARGET_) && (BOARD!=10) && (BOARD!=34)&& (BOARD!=35)&& (BOARD!=46))
+/*
+ * R2D is not supported by EP2 module (BOARD == 10, of customer 6351/36)
+ * and by Avenger2/Perseus1 board (BOARD == 34). (dbachran / 2002-11-27)
+ * and by P2 board (BOARD == 35) and F-sample (BOARD == 46) (rsauer / 2004-05-27)
+ */
+#define R2D_ENABLED
+#endif
+#endif
+
+#ifndef _SIMULATION_
+    #ifdef R2D_ENABLED
+        #include "r2d/r2d.h"
+        #include "r2d/r2d_config.h"
+    #endif
+#endif
+/* GW enable/disable trace using the MMI */
+/* NB. Traces are only for diagnostics while developing and must be removed for code deliveries!*/
+/* defining mmi_trace as <empty> will remove them */
+//#define MMI_TRACE
+#define mmi_trace
+//void mmi_trace(char* str);
+/*==== EXPORT =====================================================*/
+#define ENCODE_OFFSET 24
+//define EASY_TEXT_ENABLED
+
+/************************************************************************
+* The following macros define what hardware we are running on and what 	*
+* drivers are being used to drive the display							*
+* BSAMPLE - 84x48 display												*
+* CSAMPLE - 84x48 display												*
+* CSAMPLE_COLOUR - no longer supported									*
+* DSAMPLE - 176x220 display which can be driven as 16 bit colour or b+w	*
+*      DSAMPLE_COLOUR - colour display 									*
+*           DSAMPLE_COLOUR16 - 16 bits per pixel displayed 				*
+*                              NB. This has not been tested at all - it	*
+*                              may not display correctly or may crash	*
+*                              although it does not crash when enabled 	*
+*                              with the 32bit drivers)                	*
+*                                                                       *
+*           DSAMPLE_COLOUR32 - 32 bits per pixel displayed (16 bits are	*
+*								 zero and have no effect)				*
+*      DSAMPLE_LITE - 1 bit per pixel (b+w display)                    	*
+* GW SPR#1840 25/03/03													*
+* Also, the compiler switches have been added to allow us to develop  	*
+* the MMI for a different final format (b+w/smaller display).			*
+* COLOURDISPLAY - If not defined - all output is to be b+w				*
+* LSCREEN - If not defined - screen is 'small' - use the 8x6 font 		*
+*************************************************************************/
+#if (defined(_TARGET_))
+//#if (BOARD==33)
+#if ((BOARD == 8) || (BOARD == 9))
+#define CSAMPLE
+#elif ((BOARD == 40) || (BOARD == 41))
+#define DSAMPLE
+#elif (BOARD == 43)
+#define ESAMPLE
+//June 03, 2005 REF: GSM-ENH-31636 xpradipg
+#elif (BOARD == 70)
+#define CALLISTO
+//CRR 28825:  xpradipg - 11 Feb 2005
+#elif (BOARD == 71)  // LCD enabling of ISAMPLE
+#define ISAMPLE
+#else
+//Other board type
+#define BSAMPLE
+#endif
+#else
+//_TARGET_ not defined
+//Not running on hardware - select the hw for simulation purposes.
+#define BSAMPLE
+
+//Also, if not already disabled - disable trace code
+#ifdef MMI_TRACE
+#undef MMI_TRACE
+#endif
+#endif
+//June 03, 2005 REF: GSM-ENH-31636 xpradipg
+//CRR 28825:  xpradipg - 11 Feb 2005
+#if (defined(DSAMPLE) || defined(ESAMPLE) || defined(ISAMPLE) || defined(CALLISTO))
+  /* For a start, we use exactly the same definitions for E-Sample as we do
+     for D-Sample. IMPORTANT: If the E-Sample LCD differs from D-Sample, the
+     following lines must be properly adapted!
+  */
+  #if (R2D_LCD_DISPLAY == R2D_COLOR)
+    #define DSAMPLE_COLOUR
+    #if (R2D_PIXEL_POS_TO_BIT_POS == 5)
+      #define DSAMPLE_COLOUR32
+    #endif
+    #if (R2D_PIXEL_POS_TO_BIT_POS == 4)
+      #define DSAMPLE_COLOUR16
+    #endif
+  #else
+    #define DSAMPLE_LITE
+    #undef COLOURDISPLAY
+  #endif
+#endif /* ESAMPLE */
+
+
+//Ensure that if the H/W does not support colour, the compiler option is overridden
+//- we can display b+w only on a colour display but not the other way round
+#ifndef DSAMPLE_COLOUR
+#ifdef COLOURDISPLAY
+#undef COLOURDISPLAY
+#endif
+#endif
+
+
+/*
+USE_PLOT -	Defined if we are to use r2d_draw_point to output a display
+			This method will always produce a display (of sorts) but can be very slow
+USE_BLIT_RECT - Defined if we provide a 24 bit colour display and allow the riviera code to
+				translate into the LCD format.
+USE_BUFFER - 	This must be defined if USE_BLIT_RECT is being used. This will require an image
+				of the colour display to be stored in local memory.
+
+If neither are defined then we must create our buffer in the same format as the LCD.
+NB if 'USE_BLIT_RECT' is not defined, any changes to the h/w or driver software will have an
+impact on the code below.
+
+*/
+
+/*==== CONSTANTS ==================================================*/
+//	Mar 30, 2005	REF: CRR 29986	xpradipg
+//	removed the static qualifier to be accessed by the ATB module.
+#ifdef FF_MMI_OPTIM
+const int translation_ascii_2_unicode[256] = {
+#else
+static const int translation_ascii_2_unicode[256] = {
+#endif
+	0x0000, 0x00A4, 0x00d8, 0xFFFF, 0x0394, 0x03A8, 0x00BF, 0x00F8, 0xFFFF, 0xFFFF, 0x000A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
+	0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
+	0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026,0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+	0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+	0x0040,0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, /* SPR#2034 - SH */
+	0xFFFF, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+	0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
+
+	0xFFFF, 0x00C7, 0x00FC, 0x00E9, 0x00E4, 0x00E0, 0x00E5, 0xFFFF, 0xFFFF, 0xFFFF, 0x00E8, 0xFFFF, 0xFFFF, 0x00EC, 0x00C4, 0x00C5, 
+	0x00C9, 0x00E6, 0x00C6, 0xFFFF, 0x00F6, 0x00F2, 0xFFFF, 0x00F9, 0xFFFF, 0x00D6, 0x00DC, 0xFFFF, 0x00A3, 0x00A5, 0xFFFF, 0xFFFF,
+	0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x00F1, 0x00D1, 0xFFFF, 0xFFFF, 0x00A7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x00A1, 0xFFFF, 0xFFFF,
+	0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
+	0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
+	0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
+	0xFFFF, 0x00DF, 0x0393, 0x03A0, 0x03A3, 0xFFFF, 0xFFFF, 0xFFFF, 0x03A6, 0x0398, 0x03A9, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x039B, 
+	0x039E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF
+	
+	};
+/*==== VARIABLES ==================================================*/
+//EXTERN UBYTE        extDisplay;          /* external display ? */
+EXTERN UBYTE        extDisplay;          /* external display ? */
+GLOBAL UBYTE dspl_char_type;
+
+
+/*
+ * We don't need display.c with ACI-only builds, but CST references extDisplay
+ * above, so we need to keep that one for now.
+ * Only process this file, if MMI is set to 1 (SMI) or 2 (BMI).
+ */
+#if (MMI != 0)
+
+GLOBAL dspl_DevCaps displayData;
+#if defined (NEW_FRAME)
+EXTERN T_HANDLE       hCommL1;
+#else
+EXTERN T_VSI_CHANDLE  hCommL1;
+#endif
+
+static int scrEnabled = 0;              /* screen update enable     */
+static int txtInvert = 0;         //Text invert
+
+static T_HANDLE mmi_handle;
+static T_HANDLE hCommMMI = VSI_ERROR;
+
+/*==== FUNCTIONS ==================================================*/
+/*
+ * send to external Display
+ */
+LOCAL void dspl_SendDisplayReq (USHORT x, USHORT y, char *text);
+GLOBAL void kbd_test (UBYTE key);
+
+/*
+ * TI driver functions
+ */
+extern void LCD_SetPower        (void);
+extern void LCD_Reset           (void);
+extern void LCD_Enable          (int);
+extern void LCD_Clear           (void);
+extern void LCD_WriteString     (int y, int x, char *s);
+extern void LCD_PixBlt          (int x, int y, int w, int h, char *bmp);
+extern void LCD_DrawIcon        (int x, int y, char id);
+extern void LCD_TranslateBitmap (int w, int h, char *bo, char *bt);
+extern void LCD_Cursor          (int row, int col);
+
+GLOBAL void rt_ExtPrimitive ( USHORT TaskHandle, USHORT DestComHandle,
+                              char *ExtDest, OS_QDATA *Msg );
+/*
+ * Internal Functions for Graphic Driver (Workaround)
+ */
+LOCAL  void scrInit      (void);
+LOCAL  void scrExit      (void);
+LOCAL  void scrSize      (int *x, int *y);
+#if (!CUST)//JVJE #if (CUST==1)
+
+LOCAL  void scrClear     (void);
+#endif
+LOCAL  void scrClearRect (int px, int py, int sx, int sy);
+LOCAL  void scrText      (int x, int y, char *txt);
+LOCAL  void scrText_Unicode      (int x, int y, USHORT *txt);
+LOCAL  void scrLine      (int px, int py, int sx, int sy);
+LOCAL  void scrRect      (int px, int py, int sx, int sy);
+LOCAL  int  scrFntSelect (int font);
+LOCAL  int  scrFntHeight (void);
+LOCAL  int  scrFntGetFit (char *tp, int lineWidth);
+LOCAL  int  scrFntGetLen (char *tp, int nChars);
+LOCAL  int  scrBmpDraw   (int px, int py, int sx, int sy,
+                          int ix, char *bm, int mode);
+LOCAL  void scrCurType   (int type);
+LOCAL  void scrCursor    (int x, int y);
+//accessible from outside e.g 3th application MMS
+void scrPoint     (int px, int py, int col);
+LOCAL  int  scrUpdate    (int onOff);
+
+LOCAL  void scrText_Invert_Unicode (int x, int y, USHORT *txt); /*kk*/
+
+LOCAL int checkPixelColour(int px, int py, U32 col);
+LOCAL void scrLCDUpdate (void);
+
+void scrText_Invert (int x, int y, char *txt);
+
+void scrDrawFilledRect (int px, int py, int sx, int sy, U32 col);
+
+int scrGetRealLength(char *str, int* totChar, int* totPixel);
+
+LOCAL void scrUnfocusDisplay(void);
+
+
+
+
+void dspl_show_bitmap(int x, int y,t_font_bitmap* current_bitmap,U32 attr );
+
+
+
+
+GLOBAL UBYTE dspl_SetWindow(USHORT   in_X1,
+                         USHORT   in_Y1,
+                         USHORT   in_X2,
+                         USHORT   in_Y2);
+
+
+
+
+
+
+
+/*==== CONSTANTS ==================================================*/
+
+/*******************************************************************
+ *                                                                 *
+ * PART I: Driver Interface                                        *
+ *                                                                 *
+ *******************************************************************/
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_Init                  |
++--------------------------------------------------------------------+
+
+  PURPOSE : The function initializes the driverīs internal data. The
+            function returns DRV_INITIALIZED if the driver has already
+            been initialized and is ready to be used or already in use.
+            In case of an initialization failure, which means that the
+            driver cannot be used, the function returns DRV_INITFAILURE.
+
+*/
+
+GLOBAL UBYTE dspl_Init (void)
+{
+  /*
+   * Default is character Display
+   */
+  displayData.DisplayType = DSPL_TYPE_CHARACTER;
+
+  if (!extDisplay)                /* use internal display */
+  {
+#if defined (SIMULATE_LCD)
+    LCD_Reset  ();                /* use character oriented display */
+    LCD_Enable (1);
+    LCD_Clear  ();
+  scrInit();          /* we need this also for glob vars, kk 14.02.2000*/
+#else
+    scrInit();                    /* use graphic display */
+#endif
+  }
+  else
+#if defined (SIMULATE_LCD)
+  LCD_Enable (0);
+#else
+  scrExit();
+#endif
+
+  return DRV_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_Exit                  |
++--------------------------------------------------------------------+
+
+  PURPOSE : The function is called when the driver functionality is
+            not longer needed. The function "de-allocates" all
+            allocated resources and finalizes the driver.
+
+*/
+
+GLOBAL void dspl_Exit (void)
+{
+  scrExit();
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_Clear                 |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to clear a specific region of the
+            display using the current background colour. The region
+            is specified by the upper left corner (X1, Y1) and the
+            lower right corner (X2, Y2) inclusive. The background
+            color can be set using dspl_SetBkgColor () function.
+
+*/
+
+GLOBAL UBYTE dspl_Clear (USHORT   in_X1,
+                         USHORT   in_Y1,
+                         USHORT   in_X2,
+                         USHORT   in_Y2)
+{
+  scrClearRect ((int)in_X1,(int)in_Y1,(int)(in_X2-in_X1+1),(int)(in_Y2-in_Y1+1));
+
+  return DRV_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_Clear                 |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to clear a specific region of the
+            display using the current background colour. The region
+            is specified by the upper left corner (X1, Y1) and the
+            lower right corner (X2, Y2) inclusive. The background
+            color can be set using dspl_SetBkgColor () function.
+
+*/
+
+GLOBAL UBYTE dspl_ClearAll (void)
+{
+#if (!CUST)
+  scrClear ();
+#endif
+
+  return DRV_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : SMI_WM                   |
+| STATE   : code                  ROUTINE : dspl_UnfocusDisplay      |
++--------------------------------------------------------------------+
+
+  PURPOSE : Calls the function that will cause the entire display to appear much 
+  			darker, allowing the pop-up dialog to be more clearly the focus 
+  			especially the softkeys.
+GW #2294 23/07/03 - Created
+*/
+GLOBAL UBYTE dspl_unfocusDisplay (void)
+{
+	scrUnfocusDisplay();
+	return DRV_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_Enable                |
++--------------------------------------------------------------------+
+
+  PURPOSE : The function is used to turn the display on or off. While
+            a display is switched off, it is possible to perform any
+            drawing function.
+
+*/
+
+GLOBAL UBYTE dspl_Enable (UBYTE   in_Enable)
+{
+  return scrUpdate (in_Enable);
+}
+
+/*
+xreddymn Apr-07-2005 MMI-SPR-29655: Added function to update region
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_Enable_Region         |
++--------------------------------------------------------------------+
+
+  PURPOSE : The function is used to update a region on the screen
+
+*/
+
+void dspl_Enable_Region(INT16 x1, INT16 y1, INT16 x2, INT16 y2)
+{
+#ifdef R2D_ENABLED
+	r2d_flush_region(x1, y1, x2, y2);
+#endif
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_GetDeviceCaps         |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to retrieve the capabilities of the
+            display device including the dimensions of the display and
+            the logical unit in which the dimensions is measured.
+
+*/
+
+GLOBAL void dspl_GetDeviceCaps (dspl_DevCaps * out_DeviceCapsPtr)
+{
+  int x,y;
+
+  scrSize (&x, &y);
+
+  out_DeviceCapsPtr->Height = (USHORT)y;
+  out_DeviceCapsPtr->Width  = (USHORT)x;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_SetDeviceCaps         |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to set the capabilities of the
+            display device including the dimensions of the display and
+            the logical unit in which the dimensions is measured.
+
+*/
+
+GLOBAL void dspl_SetDeviceCaps (dspl_DevCaps * in_DeviceCapsPtr)
+{
+  displayData.DisplayType = in_DeviceCapsPtr->DisplayType;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_GetIconImage          |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to copy the image of a driver
+            internal icon into an application specific icon buffer.
+            The icon may modify the icon. In case of a successful
+            completion the function returns DRV_OK. In case the
+            size of the buffer where the icon image shall be copied
+            is too small the driver returns DRV_INVALID_PARAMS. In
+            case a specific driver implementation does not support
+            this functionality the driver returns DSPL_FCT_NOTSUPPORTED.
+
+*/
+
+GLOBAL UBYTE dspl_GetIconImage (UBYTE     in_Icon,
+                                USHORT    in_Size,
+                                UBYTE   * out_IconImagePtr)
+{
+  return DSPL_FCT_NOTSUPPORTED;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_SetCursor             |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to change the current cursor settings.
+            These settings include the type of cursor and the mode
+            (e.g. static cursor, not flashing). A set of standard
+            types and modes is defined.
+
+*/
+
+GLOBAL UBYTE dspl_SetCursor (UBYTE in_CursorType,
+                             UBYTE in_CursorMode)
+{
+  return DRV_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_SetCursorPos          |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to set the current cursor position.
+            If the function succeeds, the cursor is set to the new
+            position. If one of the values is out of range, the function
+            returns DRV_INVALID_PARAMS. The number of rows and columns
+            the display supports can be retrieved using the function
+            dspl_GetDevCaps(). The upper left corner has the coordinates
+            0,0. The values in_X and in_Y are measured in logical units
+            depending on the capabilities of the device. The means a
+            graphical display will use pixels.
+
+GW 05/09/01 Added size x and size y parameters to allow for chinese chars.
+*/
+
+GLOBAL UBYTE dspl_SetCursorPos (USHORT   in_X,
+                                USHORT   in_Y,
+                USHORT   in_SizeX,
+                USHORT   in_SizeY
+                )
+{
+  if (displayData.DisplayType EQ DSPL_TYPE_CHARACTER)
+  {
+     LCD_Cursor (in_Y, in_X);               /* set cursor position */
+     if (extDisplay)                        /* if external display */
+       dspl_SendDisplayReq (in_X, in_Y, NULL);
+  }
+  else
+     scrLine(in_X,in_Y+in_SizeY-1,in_X+in_SizeX-1,in_Y+in_SizeY-1);
+  return DRV_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_ShowCursor            |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to change the status of the cursor.
+            The cursor can be visible or invisible. The function returns
+            the previous status of the cursor.
+
+*/
+
+GLOBAL UBYTE dspl_ShowCursor (UBYTE in_Show)
+{
+  return DSPL_CURSOR_VISIBLE;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_SetBkgColor           |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to change the color used for
+            background painting. If the color is out of range, the
+            driver returns DRV_INVALID_PARAMS and leaves the color
+            unchanged.
+
+*/
+
+GLOBAL UBYTE dspl_SetBkgColor (UBYTE in_Color)
+{
+  return DRV_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_SetFrgColor           |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to change the color used for
+            foreground painting, e.g. text color. If the color is
+            out of range, the driver returns DRV_INVALID_PARAMS and
+            leaves the color unchanged.
+            set a call-back function which
+
+*/
+
+GLOBAL UBYTE dspl_SetFrgColor (UBYTE in_Color)
+{
+  return DSPL_FCT_NOTSUPPORTED;
+}
+
+enum
+{
+	COL_TYPE_FGD =0,
+	COL_TYPE_BGD,
+	COL_TYPE_HIGHLIGHT,
+	COL_TYPE_BORDER,
+	COL_TYPE_SHADOW,
+	MAX_COL_TYPE
+};
+enum
+{
+	COL_CMD_INIT,
+	COL_CMD_GET,
+	COL_CMD_SET,
+	COL_CMD_SETSHADOW,
+	COL_CMD_RESTORECOL,
+	MAX_COL_CMD
+};
+
+//This definition allows us to have a transparent colour in 256 colour bitmaps.
+//We lose the colour nearly-black gray but I don't think it will be missed!
+//Better to lose white than gray but will require all icons to be updated!
+#define TRANSPARENT_256_COL 0x25
+
+//This definition allows us to have a transparent colour in 16bit LCD colour bitmaps.
+//We lose almost white R=0xF8 G=0xFC B=0xF8. NB word is inverted
+#define TRANSPARENT_16BIT_COL 0x0020
+
+//using ARGB format, transparent = 0xFFxxxxxx
+#define TRANSPARENT_32BIT_COLOUR 0xFF000000
+
+//Hide colours
+LOCAL U32 colour_class (int cmd, int colId, U32 inColour)
+{
+static U32 g_col[MAX_COL_TYPE];
+static U32 g_colOld[MAX_COL_TYPE];
+	switch (cmd)
+	{
+		case COL_CMD_INIT:
+			colour_class(COL_CMD_SET,	COL_TYPE_FGD,			0x00404040	);
+			colour_class(COL_CMD_SET,	COL_TYPE_BGD,			0x00FFFFFF	); //white
+			colour_class(COL_CMD_SET,	COL_TYPE_HIGHLIGHT,		0x00FF00FF	);
+			colour_class(COL_CMD_SET,	COL_TYPE_BORDER,		0x00FFFFFF	);
+			colour_class(COL_CMD_SET,	COL_TYPE_SHADOW,		0x40010101	); //50% translucency
+			return (0);
+			break;
+		case COL_CMD_SET:
+			if (inColour != 0)
+			{
+				g_colOld[colId]	=	g_col[colId];
+				g_col[colId]	=	inColour;
+			}
+			return(g_colOld[colId]);
+			break;
+		case COL_CMD_GET:
+#ifdef COLOURDISPLAY
+#ifdef DSAMPLE_COLOUR
+			return(g_col[colId]);
+#endif
+#else
+			switch (colId)
+			{
+				case COL_TYPE_FGD:			return (0x00FFFFFF);
+				case COL_TYPE_BGD:			return (0x00000000);
+				case COL_TYPE_HIGHLIGHT:	return (0x00000000);
+				case COL_TYPE_BORDER:		return (0x00000000);
+				case COL_TYPE_SHADOW:		return (0x00000000);
+				default:					return (0);
+			}
+#endif
+			break;
+		case COL_CMD_SETSHADOW:
+			g_colOld[colId]	=	g_col[colId];//currently we dont really need to save the old value
+			// set shadow to 50% black
+			g_col[colId] = 0x40010101;// | ((inColour >> 2) & 0x003F3F3F);
+			return(0x40010101);
+			break;
+		case COL_CMD_RESTORECOL:
+			g_col[colId] = g_colOld[colId];
+			return (0);
+			break;
+		default:
+			break;
+	}
+	return (0);
+}
+
+GLOBAL U32 dspl_SetFgdColour (U32 inColour)			{	return (colour_class(COL_CMD_SET,		COL_TYPE_FGD,		inColour));	}
+GLOBAL U32 dspl_SetBgdColour (U32 inColour)			{	return (colour_class(COL_CMD_SET,		COL_TYPE_BGD,		inColour));	}
+GLOBAL U32 dspl_SetHighlightColour (U32 inColour)	{	return (colour_class(COL_CMD_SET,		COL_TYPE_HIGHLIGHT,	inColour));	}
+GLOBAL U32 dspl_SetBorderColour (U32 inColour)		{	return (colour_class(COL_CMD_SET,		COL_TYPE_BORDER,  	inColour));	}
+GLOBAL U32 dspl_SetShadowColour (U32 inColour)		{	return (colour_class(COL_CMD_SETSHADOW,	COL_TYPE_SHADOW,  	inColour));	}
+
+GLOBAL U32 dspl_GetFgdColour ( void )				{	return (colour_class(COL_CMD_GET,		COL_TYPE_FGD,		0));	}
+GLOBAL U32 dspl_GetBgdColour ( void )				{	return (colour_class(COL_CMD_GET,		COL_TYPE_BGD,		0));	}
+GLOBAL U32 dspl_GetHighlightColour ( void )			{	return (colour_class(COL_CMD_GET,		COL_TYPE_HIGHLIGHT,	0));	}
+GLOBAL U32 dspl_GetBorderColour ( void )			{	return (colour_class(COL_CMD_GET,		COL_TYPE_BORDER,	0));	}
+GLOBAL U32 dspl_GetShadowColour (void)				{	return (colour_class(COL_CMD_GET,		COL_TYPE_SHADOW,  	0));	}
+
+GLOBAL void dspl_InitColour (void)
+{
+	colour_class(COL_CMD_INIT,	0,	0);
+}
+GLOBAL void dspl_RestoreColour (void)
+{
+	colour_class(COL_CMD_RESTORECOL,	COL_TYPE_FGD,	0);
+	colour_class(COL_CMD_RESTORECOL,	COL_TYPE_BGD,	0);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_DrawIcon              |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to draw a driver internal icon.
+            The origin of the icon is the upper left corner, defined
+            by the parameters in_X/in_Y.
+
+*/
+
+GLOBAL UBYTE dspl_DrawIcon (UBYTE  in_IconID,
+                            USHORT in_X,
+                            USHORT in_Y)
+{
+  return DSPL_FCT_NOTSUPPORTED;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_DrawLine              |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to draw a line from a specific
+            location defined by the parameters in_X1/in_Y1, to a
+            specific location defined by the parameters in_X2/in_Y2.
+            The displayīs origin is the upper left corner with the
+            co-ordinates (0,0). The function uses the current
+            foreground color, which can be set using the
+            dspl_SetFrgColor (), to draw the line.
+
+*/
+
+GLOBAL UBYTE dspl_DrawLine (USHORT in_X1,
+                            USHORT in_Y1,
+                            USHORT in_X2,
+                            USHORT in_Y2)
+{
+    scrLine(in_X1,in_Y1,in_X2,in_Y2);
+
+    return DRV_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_DrawRect              |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to draw a rectangle. The upper left
+            corner of the rectangle is defined by the parameters
+            in_X1/in_Y1. The lower right corner of the rectangle is
+            defined by the parameters in_X2/in_Y2.
+            The displayīs origin is the upper left corner with the
+            co-ordinates (0,0). The function uses the current
+            foreground color, which can be set using the
+            dspl_SetFrgColor (), to draw the rectangle.
+
+*/
+
+GLOBAL UBYTE dspl_roundRectFill (int px,
+                            	int  py,
+                            	int sx,
+                            	int sy,
+                            	int border)
+{
+	int i,j,col;
+	col = dspl_GetBgdColour();
+	scrDrawFilledRect(px-border,py,	sx+border*2,sy, col );
+	scrDrawFilledRect(px,py-border,	sx,sy+border*2, col );
+
+	for (i=0;i<border;i++)
+		for (j=0;j<border-i;j++)
+		{
+			scrPoint(px-i,		py-j,col);
+			scrPoint(px+sx+i,	py-j,col);
+			scrPoint(px+sx+i,	py+sy+j,col);
+			scrPoint(px-i,		py+sy+j,col);
+		}
+
+  return DRV_OK;
+}
+GLOBAL UBYTE dspl_roundRect (int px,
+                            	int  py,
+                            	int sx,
+                            	int sy,
+                            	int border)
+{
+    scrLine(px ,py-border,		px+sx,py-border);
+    scrLine(px,py+sy+border,	px+sx,py+sy+border);
+    scrLine(px-border ,py,		px-border,py+sy);
+    scrLine(px+sx+border,py,	px+sx+border,py+sy);
+
+    scrLine(px ,py-border,		px-border ,py				);
+    scrLine(px,py+sy+border,	px-border,py+sy			);
+    scrLine(px+sx,py+sy+border,	px+sx+border,py+sy			);
+    scrLine(px+sx+border,py,	px+sx,py-border		);
+
+  return DRV_OK;
+}
+
+GLOBAL UBYTE dspl_DrawRect (USHORT in_X1,
+                            USHORT in_Y1,
+                            USHORT in_X2,
+                            USHORT in_Y2)
+{
+  scrRect(in_X1,in_Y1,in_X2-in_X1,in_Y2-in_Y1);
+
+  return DRV_OK;
+}
+
+GLOBAL UBYTE dspl_DrawFilledRect (USHORT in_X1,
+								  USHORT in_Y1,
+								  USHORT in_X2,
+								  USHORT in_Y2)
+{
+  scrDrawFilledRect(in_X1,in_Y1,in_X2-in_X1,in_Y2-in_Y1, dspl_GetFgdColour() );
+  return DRV_OK;
+}
+GLOBAL UBYTE dspl_DrawFilledBgdRect (USHORT in_X1,
+								  USHORT in_Y1,
+								  USHORT in_X2,
+								  USHORT in_Y2)
+{
+  scrDrawFilledRect(in_X1,in_Y1,in_X2-in_X1,in_Y2-in_Y1, dspl_GetBgdColour() );
+  return DRV_OK;
+}
+GLOBAL UBYTE dspl_DrawFilledColRect (USHORT in_X1,
+								  USHORT in_Y1,
+								  USHORT in_X2,
+								  USHORT in_Y2,
+								  U32 Col)
+{
+  scrDrawFilledRect(in_X1,in_Y1,in_X2-in_X1,in_Y2-in_Y1, Col );
+  return DRV_OK;
+}
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_DrawEllipse           |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to draw an ellipse. The center of
+            the ellipse is the center of the bounding rectangle
+            specified by the parameters.
+            The displayīs origin is the upper left corner with the
+            co-ordinates (0,0). The function uses the current
+            foreground color, which can be set using the
+            dspl_SetFrgColor (), to draw the ellipse.
+
+*/
+
+GLOBAL UBYTE dspl_DrawEllipse (USHORT in_X1,
+                               USHORT in_Y1,
+                               USHORT in_X2,
+                               USHORT in_Y2)
+{
+  return DSPL_FCT_NOTSUPPORTED;
+}
+
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_BitBlt                |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to display a bitmap at the
+            specified location using the raster operation provided.
+            The bitmap format is customer specific but must include
+            the size of the bitmap.
+
+
+*/
+
+GLOBAL UBYTE dspl_BitBlt2(short in_X,
+                          short in_Y,
+                          USHORT in_Width,
+                          USHORT in_Height,
+                          void * in_BmpPtr,
+                          USHORT in_index,
+                          int bmpFormat)
+{
+	t_font_bitmap current_bitmap;
+	char *bmpPtr;
+	int bmpSize;
+	int fScale = 1;
+	int attr = SHOWBITMAP_NORMAL;
+	bmpPtr = (char *)in_BmpPtr;
+	if (bmpFormat == BMP_FORMAT_256_COLOUR)
+	{
+		bmpSize = in_Height*in_Width; //bitmaps are 256 colour
+		bmpPtr = &bmpPtr[bmpSize*in_index]; //for bitmaps that have multiple states
+	}
+	else if (bmpFormat == BMP_FORMAT_32BIT_COLOUR)
+	{
+		bmpSize = in_Height*in_Width; //bitmaps are 256 colour
+		bmpPtr = &bmpPtr[bmpSize*in_index]; //for bitmaps that have multiple states
+	}
+	else if (bmpFormat == BMP_FORMAT_16BIT_LCD_COLOUR)
+	{
+#ifdef DSAMPLE_COLOUR32
+		fastCopyBitmap(in_X,in_Y, 					// start position of bitmap
+						in_Width,	in_Height,		//size of bitmap
+						(char*)	in_BmpPtr,
+						in_X,in_Y, 					// start position of output area
+						in_Width,	in_Height,		//size of output area
+						dspl_GetBgdColour(), bmpFormat);
+		return DRV_OK;
+#else
+		bmpSize = in_Height*in_Width*4; //bitmaps are 16bit colour
+		bmpPtr = &bmpPtr[bmpSize*in_index]; //for bitmaps that have multiple states
+#endif
+	}
+	else if (bmpFormat == BMP_FORMAT_16BIT_LCD_COMPRESSED_COLOUR)
+	{
+#ifdef DSAMPLE_COLOUR16
+		fastCopyBitmap(in_X,in_Y, 					// start position of bitmap
+						in_Width,	in_Height,		//size of bitmap
+						(char*)	in_BmpPtr,
+						in_X,in_Y, 					// start position of output area
+						in_Width,	in_Height,		//size of output area
+						dspl_GetBgdColour(), bmpFormat);
+		return DRV_OK;
+#else
+		bmpSize = in_Height*in_Width*2; //bitmaps are 16bit colour
+		bmpPtr = &bmpPtr[bmpSize*in_index]; //for bitmaps that have multiple states
+#endif
+	}
+	else //b+w image
+	{
+		#ifdef MMI_TRACE
+		mmi_trace("b+w image");
+		#endif
+		if (bmpFormat == BMP_FORMAT_BW_2x4 )
+		{
+			//Temp fix to display larger b+w bitmaps (160x124)
+			attr = SHOWBITMAP_SCALE_2x4;
+			in_Width = in_Width /2;
+			in_Height = in_Height /4;
+			#ifdef MMI_TRACE
+			mmi_trace("Icontype = scale 2x4");
+			#endif
+		}
+
+		bmpSize = in_Height*((in_Width+7) >> 3); //bitmaps are unpacked
+		bmpPtr = &bmpPtr[bmpSize*in_index]; //for bitmaps that have multiple states
+
+	}
+	current_bitmap.height	= in_Height;
+	current_bitmap.width	= in_Width;
+	current_bitmap.bitmapSize = 0;// bmpSize;
+	current_bitmap.bitmap	= bmpPtr;
+	current_bitmap.format	= bmpFormat;
+	dspl_show_bitmap(in_X,in_Y, &current_bitmap, attr);
+
+  return DRV_OK;
+
+}
+
+GLOBAL UBYTE dspl_BitBlt (USHORT in_X,
+                          USHORT in_Y,
+                          USHORT in_Width,
+                          USHORT in_Height,
+                          USHORT in_Index,
+                          void * in_BmpPtr,
+                          USHORT in_Rop)
+{
+#ifdef BSAMPLE
+//Use old procedure
+  scrBmpDraw ((int)in_X, (int) in_Y, (int) in_Width,
+              (int)in_Height, (int)in_Index,
+              (char *)in_BmpPtr, (int)in_Rop);
+  return DRV_OK;
+#else
+  return (dspl_BitBlt2( (short) in_X, (short) in_Y, in_Width, in_Height, in_BmpPtr, in_Index, BMP_FORMAT_BW_UNPACKED));
+#endif
+
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_SelectFontbyID        |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to select a font used for
+            displaying text. Text can be displayed using the
+            functions dspl_TextOut_Cmode.
+            Driver specific fonts are identified be a font ID
+            (parameter in_Font). The definition of fonts and font
+            identifiers is not in scope of G23. Fonts and font
+            identifiers have to be defined by the customer. The
+            specific implementation of the display driver and the MMI
+            using the driver have the knowledge about the available
+            fonts, their identification and how to use them.
+
+*/
+
+GLOBAL UBYTE dspl_SelectFontbyID (UBYTE in_Font)
+{
+  return DSPL_FCT_NOTSUPPORTED;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_SelectFontbyImage     |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to select a font used for
+            displaying text. Text can be displayed using the
+            functions dspl_TextOut_Cmode.
+            Application specific fonts are identified by the parameter
+            in_FontPtr, the address of the buffer containing the
+            application specific font. The structure of the font image
+            in not in the scope of G23. The structure of the font images
+            have to be defined by the customer implementing the driver.
+
+*/
+
+GLOBAL UBYTE dspl_SelectFontbyImage (UBYTE * in_FontPtr)
+{
+  return DSPL_FCT_NOTSUPPORTED;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_GetFontImage          |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to copy the image of a font into an
+            application specific font buffer. The application may modify
+            the font. In case of a successful completion the function
+            returns DRV_OK. In case the size of the buffer where the
+            font image shall be copied to is too small the driver returns
+            DRV_INVALID_PARAMS. In case a specific driver implementation
+            does not support this functionality the driver returns
+            DSPL_FCT_NOTSUPPORTED.
+
+*/
+
+GLOBAL UBYTE dspl_GetFontImage (UBYTE    in_Font,
+                                USHORT   in_Size,
+                                UBYTE *  out_FontPtr)
+{
+  return DSPL_FCT_NOTSUPPORTED;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_GetFontHeight         |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to retrieve the vertical size of
+            the currently selected font. The function returns the
+            height measured in logical units depending on the device
+            capabilities (e.g. pixels or multiple of characters). Call
+            the function dspl_SelectFont() to select a font.
+
+*/
+
+GLOBAL UBYTE dspl_GetFontHeight (void)
+{
+  return scrFntHeight();
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_GetTextExtent         |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to calculate the size of a 0-terminated
+            string, to which the parameter in_Text points. The function
+            returns the size needed to display the text. The value of
+            the size is measured in units depending on the device
+            capabilities (e.g. pixels or multiple of characters). Call
+            the function dspl_SelectFont() to select a font.
+
+*/
+
+GLOBAL USHORT dspl_GetTextExtent_old (char * in_Text, USHORT in_Length)
+{
+ if (displayData.DisplayType EQ DSPL_TYPE_CHARACTER)
+   return in_Length;
+ else
+   return scrFntGetLen ( in_Text, ( int ) in_Length );
+}
+
+
+GLOBAL USHORT dspl_GetTextExtent (char * in_Text, USHORT in_Length)
+{
+	int nPixel=0;
+	int nChar = in_Length;
+	if (in_Text==NULL)
+		return(0);
+
+ 	if (displayData.DisplayType EQ DSPL_TYPE_CHARACTER )
+   	{
+   		return in_Length;
+   	}
+	scrGetRealLength(in_Text, &nChar, &nPixel);
+
+	return (nPixel);
+}
+
+
+
+
+
+int dspl_GetTextExtent2 (char * in_Text, USHORT in_Length)
+{
+	return (dspl_GetTextExtent ( in_Text, in_Length));
+
+}
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_GetNcharToFit         |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to calculate the number of characters of the input
+  string that will fit into the specified width.
+
+*/
+/*SPR 1541, added function*/
+//Calculate number of chars that fit in the available space.
+GLOBAL USHORT dspl_GetNcharToFit (char * in_Text, USHORT pixelWidth)
+{
+        int nPixel=pixelWidth;
+        int nChar= 0;
+        if (in_Text==NULL)
+                return(0);
+
+        scrGetRealLength(in_Text, &nChar, &nPixel);
+
+        return (nChar);
+}
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_GetMaxTextLen         |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to calculate the sub-string
+            (number of characters) of a 0-terminated string (in_Text)
+            that can be displayed in the region given by the parameter
+            in_HSize. The value of in_HSize is measured in logical
+            units (e.g. pixels or multiple of characters). Call
+            the function dspl_SelectFont() to select a font.
+
+*/
+
+GLOBAL USHORT dspl_GetMaxTextLen (char  * in_Text,
+                                  USHORT   in_HSize)
+{
+  if (displayData.DisplayType EQ DSPL_TYPE_CHARACTER)
+    return strlen (in_Text);
+  else
+    return scrFntGetFit ( in_Text, ( int ) in_HSize );
+}
+
+
+
+
+GLOBAL void dspl_set_char_type(UBYTE char_type){
+  dspl_char_type = char_type;
+}
+
+GLOBAL UBYTE dspl_get_char_type(void){
+  return dspl_char_type;
+}
+
+int dspl_getDisplayType( void )
+{
+
+#ifndef COLOURDISPLAY
+	return (DSPL_BW);
+#endif
+
+#ifdef R2D_ENABLED
+	if (R2D_LCD_DISPLAY == R2D_COLOR)
+		return (DSPL_COLOUR);
+	else
+#endif
+		return (DSPL_BW);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_TextOut_Cmode               |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to display a text at the given
+            location in_X/in_Y uding the defined attributes (in_Attrib)
+            and the currently selected color (foreground and background).
+            The cursor position is left unchanged. The driver will not
+            take the displays bounding rectangle into consideration and
+            therefore text may be cut off.
+            Linefeeds and carriage returns are not supported and there-
+            fore must be handled by upper layers.
+
+GW 14/02/03 - SPR#1736 Modified code to call 'dspl_ScrText' to allow a border to be drawn
+						round chinese characters.
+
+*/
+
+
+GLOBAL UBYTE dspl_TextOut_Cmode (USHORT  in_X,
+                           USHORT  in_Y,
+                           UBYTE   in_Attrib,
+                           char * in_Text)
+{
+  int in_X_signed;
+  int in_Y_signed;
+	int txtStyle=0;
+  // SH - If we want signed coordinates (i.e. if x and y can have negative numbers)
+  // we need to convert the unsigned values into two's complement.
+
+   if (in_Attrib & DSPL_TXTATTR_SIGNED_COORDS)
+    {
+    in_X_signed = (SHORT)in_X;
+    in_Y_signed = (SHORT)in_Y;
+    }
+   else
+    {
+    in_X_signed = in_X;
+    in_Y_signed = in_Y;
+    }
+
+#if defined (WIN32)
+   if (scrEnabled)
+   {
+     if (in_Attrib & DSPL_TXTATTR_INVERS)
+     {
+       scrText_Invert(in_X, in_Y, in_Text);
+     }
+     else
+     {
+       scrText(in_X, in_Y, in_Text);
+     }
+   }
+   else
+     LCD_WriteString (in_Y, in_X, (UBYTE *) in_Text);
+#else
+   if (displayData.DisplayType EQ DSPL_TYPE_CHARACTER)
+   {
+     if (in_Attrib & DSPL_TXTATTR_INVERS)
+   	   {
+    if (dspl_char_type == DSPL_TYPE_ASCII)
+      scrText_Invert(6 * in_X + 2, 8 * in_Y, in_Text);
+    else
+      scrText_Invert_Unicode(12 * in_X + 2, 12 * in_Y,(USHORT*) in_Text);
+     }
+     else
+     {
+    if (dspl_char_type == DSPL_TYPE_ASCII)
+      scrText(6 * in_X_signed + 2, 8 * in_Y_signed, in_Text);
+    else
+      scrText_Unicode(12 * in_X_signed + 2, 12 * in_Y_signed, (USHORT*)in_Text);
+     }
+   }
+   else
+   {
+   		txtStyle = 0;
+   		if (in_Attrib & DSPL_TXTATTR_INVERS)
+   			txtStyle = TXT_STYLE_INVERT;
+   		else
+   			txtStyle = TXT_STYLE_NORMAL;
+		if (dspl_char_type != DSPL_TYPE_ASCII)
+   			txtStyle = txtStyle  | TXT_STYLE_UNICODE;
+   	 	dspl_ScrText( in_X_signed,in_Y_signed,in_Text, txtStyle);
+//      		scrText_Unicode(in_X_signed,in_Y_signed, (USHORT*)in_Text);
+
+   }
+#endif
+   /*
+    * if an external display simulation is used and switched on with the
+    * EXT_DISPLAY config primitive - send a MMI_DISPLAY_REQ primitive.
+    */
+   if (extDisplay)
+     dspl_SendDisplayReq (in_X, in_Y, in_Text);
+
+  return DRV_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_TextOut                 |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to display a text at the given
+            location in_X/in_Y using the defined attributes (in_Attrib)
+			It calls dspl_ScrText to actually display the text
+
+GW 14/02/03 - SPR#1736 Modified code to call 'dspl_ScrText' to allow a border to be drawn
+						round chinese characters.
+*/
+
+GLOBAL UBYTE dspl_TextOut(USHORT  in_X,
+                           USHORT  in_Y,
+                           UBYTE   in_Attrib,
+                           char * in_Text)
+{
+	UBYTE temp;
+	int in_X_signed;
+	int in_Y_signed;
+	int txtStyle=0;
+	char* op_str;
+
+	/*MC SPR 1319*/
+	if (in_Text == NULL)
+		return DRV_OK;
+	/*MC end*/
+
+	op_str = in_Text;
+
+#if defined (WIN32)
+	if (!scrEnabled)
+	{
+		LCD_WriteString (in_Y, in_X, (UBYTE *) in_Text);
+	}
+	else
+#endif
+	{
+
+		if (in_Attrib & DSPL_TXTATTR_SIGNED_COORDS)
+		{
+			in_X_signed = (SHORT)in_X;
+			in_Y_signed = (SHORT)in_Y;
+		}
+		else
+		{
+			in_X_signed = in_X;
+			in_Y_signed = in_Y;
+		}
+
+		/*Mc SPR 1526, we no longer check for current mode*/
+		if (in_Attrib & DSPL_TXTATTR_INVERS)
+			txtStyle = TXT_STYLE_INVERT;
+		else
+			txtStyle = TXT_STYLE_NORMAL;
+
+
+		if ((in_Attrib&DSPL_TXTATTR_UNICODE) || (in_Text[0] ==0x80))
+		{
+			txtStyle = txtStyle | TXT_STYLE_UNICODE;
+			if (op_str[0] ==0x80)//if unicode tag at beginning of string
+				op_str = &op_str[2];
+		}
+		if (displayData.DisplayType EQ DSPL_TYPE_CHARACTER)
+		{
+			/* the following is only accurate for a fixed-width font*/
+			if (txtStyle & TXT_STYLE_UNICODE)
+			{
+				in_X_signed = in_X_signed*12+2;
+				in_Y_signed = in_Y_signed*12;
+			}
+			else
+			{
+				in_X_signed = in_X_signed*6+2;
+				in_Y_signed = in_Y_signed*8;
+			}
+		}
+
+   	 	dspl_ScrText( in_X_signed,in_Y_signed,op_str, txtStyle);
+	}
+   /*
+    * if an external display simulation is used and switched on with the
+    * EXT_DISPLAY config primitive - send a MMI_DISPLAY_REQ primitive.
+    */
+   if (extDisplay)
+     dspl_SendDisplayReq (in_X, in_Y, in_Text);
+
+	return DRV_OK;
+}
+/**/
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_SetWorkShadow         |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to define the address of the
+            shadow RAM for drawing operations.
+
+*/
+
+GLOBAL UBYTE dspl_SetWorkShadow (UBYTE * in_ShadowPtr)
+{
+  return DSPL_FCT_NOTSUPPORTED;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_SetDisplayShadow      |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to define the address of the
+            shadow RAM for displaying operations.
+
+*/
+
+GLOBAL UBYTE dspl_SetDisplayShadow (UBYTE * in_ShadowPtr)
+{
+  return DSPL_FCT_NOTSUPPORTED;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : SMI_WM                   |
+| STATE   : code                  ROUTINE : dspl_SendDisplayReq      |
++--------------------------------------------------------------------+
+
+  PURPOSE : sends an MMI_DISPLAY_REQ primitive to write
+            the text at position X,Y to PL. If the parameter
+            text is NULL only the cursor position
+            should change. If in this case the X and Y value
+            is 0xffff the cursor will be hide.
+
+*/
+LOCAL void dspl_SendDisplayReq (USHORT x, USHORT y, char *text)
+{
+#ifdef NEW_FRAME
+T_QMSG Msg;
+T_VOID_STRUCT *prim;
+#endif
+
+  USHORT sdu_len = (text NEQ NULL) ? strlen (text) : 0;
+  PALLOC_SDU (mmi_display_req, MMI_DISPLAY_REQ, (USHORT)(sdu_len<<3));
+
+  mmi_display_req->c_x = x;
+  mmi_display_req->c_y = y;
+
+  if (text NEQ NULL)
+  {
+    /*
+     * text output
+     */
+    mmi_display_req->attrib.content = CON_TEXT;
+    mmi_display_req->attrib.control = CTL_NORMAL;
+    mmi_display_req->sdu.o_buf = 0;
+    mmi_display_req->sdu.l_buf = (sdu_len<<3);
+    memcpy (mmi_display_req->sdu.buf, text, sdu_len);
+  }
+  else
+  {
+    /*
+     * change the cursor position
+     */
+    mmi_display_req->attrib.content = CON_CURSOR;
+    mmi_display_req->attrib.control = ((x EQ 0xffff) ? CTL_HIDDEN : CTL_NORMAL);
+    mmi_display_req->sdu.o_buf = 0;
+    mmi_display_req->sdu.l_buf = 0;
+  }
+
+#if defined NEW_FRAME
+    if ( hCommMMI == VSI_ERROR )
+    {
+      mmi_handle = vsi_e_handle ( 0, "MMI" );
+      hCommMMI = vsi_c_open ( 0, "MMI" );
+      prim = vsi_c_pnew ( 100, 0x8000 FILE_LINE_MACRO );
+      strcpy ((char*)prim, "REDIRECT MMI 0000111000001010 PAN");
+      vsi_c_primitive ( mmi_handle, D2P(prim) );
+    }
+    PSEND(hCommMMI,mmi_display_req);
+
+#else
+    ext_primitive (D2P(mmi_display_req), "CST", "PAN",
+                   sizeof (T_PRIM_HEADER) +
+                   sizeof (T_MMI_DISPLAY_REQ) +
+                   sdu_len);
+    PFREE (mmi_display_req);
+#endif
+}
+
+GLOBAL UBYTE dspl_DrawWin (USHORT px, USHORT py, USHORT sx, USHORT sy, int format, t_font_bitmap *bgdBmp)
+{
+	USHORT x1,y1,x2,y2;
+	int xOfs,yOfs;
+
+	if (bgdBmp == NULL)
+	{
+		scrDrawFilledRect( px+3,py+3, sx, sy, 0x00010101 ); //shadow
+		scrDrawFilledRect( px,py, sx, sy, dspl_GetBgdColour() );
+
+		scrRect( px-1,py-1, sx+1, sy+1);
+	}
+	else
+	{
+		xOfs = (sx-bgdBmp->width)/2;
+		yOfs = (sy-bgdBmp->height)/2;
+
+		dspl_GetWindow(&x1,&y1,&x2,&y2 );
+
+		switch (format)
+		{
+			case DSPL_WIN_NORMAL:
+					dspl_show_bitmap(px, py, bgdBmp, SHOWBITMAP_NORMAL );
+					break;
+			case DSPL_WIN_CENTRE:
+					dspl_show_bitmap(px+xOfs, py+yOfs, bgdBmp, SHOWBITMAP_NORMAL );
+					break;
+			case DSPL_WIN_CLIP:
+					dspl_SetWindow(px,py,px+sx,px+sy );
+					dspl_show_bitmap(px, py, bgdBmp, SHOWBITMAP_NORMAL );
+					break;
+			case DSPL_WIN_CENTRE_CLIP:
+					dspl_SetWindow(px,py,px+sx,px+sy );
+					dspl_show_bitmap(px+xOfs, py+yOfs, bgdBmp, SHOWBITMAP_NORMAL );
+					break;
+			case DSPL_WIN_TILE:
+					dspl_SetWindow(px,py,px+sx,px+sy );
+					yOfs=0;
+					while(yOfs < sy)
+					{
+						xOfs=0;
+						while (xOfs < sx)
+						{
+							dspl_show_bitmap(px+xOfs, py+yOfs, bgdBmp, SHOWBITMAP_NORMAL );
+							xOfs=xOfs+bgdBmp->width;
+						}
+						yOfs=yOfs+bgdBmp->height;
+					}
+					break;
+		}
+		dspl_SetWindow(x1,y1,x2,y2 );
+	}
+
+/*	switch (format)
+	{
+		case 0:
+		default:
+		break;
+	}*/
+	return DRV_OK;
+}
+static int win_x1, win_x2, win_y1, win_y2;
+
+//Set-up area to be drawn in - limit window to the size of the screen
+//Inputs in_x1/y1 - first column/row that can be drawn on
+//		in_x2/y2 - last column/row
+//NB:-	inputs are the same as used to clear/draw rectangles BUT
+//		values stored in win_x2/y2 are +1 to ensure values are treated the same as scrX/Y
+GLOBAL UBYTE dspl_SetWindow(USHORT   in_X1,
+                         USHORT   in_Y1,
+                         USHORT   in_X2,
+                         USHORT   in_Y2)
+{
+int sizeX,sizeY;
+
+	scrSize (&sizeX, &sizeY);
+	if (in_X1>0)
+		win_x1 = in_X1;
+	else
+		win_x1 = 0;
+	if (in_Y1>0)
+		win_y1 = in_Y1;
+	else
+		win_y1 = 0;
+	if (in_X2<sizeX)
+		win_x2 = in_X2+1;
+	else
+		win_x2 = sizeX;
+	if (in_Y2<sizeY)
+		win_y2 = in_Y2+1;
+	else
+		win_y2 = sizeY;
+	return DRV_OK;
+
+}
+
+GLOBAL UBYTE dspl_ResetWindow( void )
+{
+	win_x1 = 0;
+	win_y1 = 0;
+	scrSize (&win_x2, &win_y2);
+
+	return DRV_OK;
+
+}
+
+GLOBAL UBYTE dspl_GetWindow(USHORT* x1,USHORT* y1,USHORT* x2,USHORT* y2 )
+{
+	*x1= win_x1;
+	*x2= win_x2;
+	*y1= win_y1;
+	*y2= win_y2;
+	return DRV_OK;
+	
+}
+
+
+/*******************************************************************
+ *                                                                 *
+ * PART II: Workaround for Graphical Displays                      *
+ *                                                                 *
+ *******************************************************************/
+//June 03, 2005 REF: GSM-ENH-31636 xpradipg
+//CRR 28825:  xpradipg - 11 Feb 2005
+#if (defined(DSAMPLE) || defined(ESAMPLE) || defined(ISAMPLE) || defined(CALLISTO))
+/*GW 21/02/03 - There is an unused long word at the end of each line for the new drivers for some good reason I'm sure.*/
+#ifdef DSAMPLE_COLOUR16
+#define LCD_COL   (R2D_WIDTH+1)                      /* display size+32 bits    */
+#else
+#define LCD_COL   (R2D_WIDTH)                      /* display size             */
+#endif
+#define LCD_ROW 	(R2D_HEIGHT)
+#define HEADER_INFO (3)
+#define DISPLAY_SIZE (LCD_ROW*LCD_ROW_NUM_LWORDS)
+/* static char scratch [100];      *//* command buffer - does not support output of new display  */
+#ifndef DSAMPLE_LITE
+unsigned char bgdColourArray[LCD_COL*4];
+#endif
+#endif
+
+#ifdef CSAMPLE
+#define LCD_COL 84                      /* display size             */
+#define LCD_ROW 48
+#define LCD_COL_NUM_LWORDS ((LCD_ROW+31)/32) /* col size in longwords         */
+#endif //CSAMPLE
+
+#ifdef BSAMPLE
+#define LCD_COL 84                     /* display size             */
+#define LCD_COL_B ((LCD_COL+7)/8)       /* row size in byte         */
+#define LCD_ROW 48
+#define DISPL_DIV 4
+#endif
+
+/*
+LCD_ROW_NUM_LWORDS - number of long words used to store a row of pixels
+BYTEPERPIXEL - number of bytes used to store apixel on-screen
+*/
+
+#define CHECK_LIMITS /*Add bounds checks to code */
+/*******************************************************************************
+ $Macro:    	DSPL_SET_BITCOLOUR
+ $Description:	This macro sets the colour of the bit at the provided long word address
+ $Returns:		None.
+ $Arguments:	x - x position of pixel (may be unused)
+ 				j - 32 bit offset within array of the pixel to be set
+ 				col - colour (in LCD format) of the pixel to be set
+ 				txt - debug text for traces - used if 'j' is bounds checked first.
+*******************************************************************************/
+/*******************************************************************************
+ $Macro:    	DSPL_GET_LWORD
+ $Description:	This macro
+ $Returns:		The 32bit offset of the word containing the pixel
+ $Arguments:	px - x position of pixel
+ 				py - y position of pixel
+*******************************************************************************/
+/*******************************************************************************
+ $Macro:    	DSPL_GET_BYTE
+ $Description:	This macro
+ $Returns:		The 8bit offset of the word containing the pixel
+ $Arguments:	px - x position of pixel
+ 				py - y position of pixel
+*******************************************************************************/
+/*******************************************************************************
+ $Macro:    	DSPL_GET_BITCOLOUR
+ $Description:	This macro
+ $Returns:		The colour in LCD format of the RGB input
+ $Arguments:	col - 32 bit RGB colour value
+*******************************************************************************/
+/*******************************************************************************
+ $Macro:    	DSPL_SET_XYBIT_COLOUR
+ $Description:	This macro
+ $Returns:		None
+ $Arguments:	x,y - posiiton of pixel to be set
+ 				col - 0 =clear bixel, anything else - set pixel
+ 				txt - trace for debug (if position is out-of-range)
+*******************************************************************************/
+#ifdef DSAMPLE_LITE
+#define LCD_ROW_NUM_LWORDS ((LCD_COL+31)/32) /* col size in longwords         */
+#define BYTEPERPIXEL (1/8 - unused)
+#ifdef CHECK_LIMITS
+#define DSPL_SET_BITCOLOUR(x,j,col,txt) \
+{\
+if (((j)>=0) && ((j)<DISPLAY_SIZE)) \
+{\
+	int m_px = 1 << (x & 0x1F);\
+	if (col)  picture_col[j] = picture_col[j] | (m_px);\
+	else    picture_col[j] = picture_col[j]  & (~m_px);\
+}else {mmi_trace(txt);}\
+}
+#define DSPL_SET_XYBIT_COLOUR(x,y,col,txt) \
+{\
+	int m_px = 1 << (x & 0x1F);\
+	int word = DSPL_GET_LWORD(x,y);\
+	if (((word)>=0) && ((word)<DISPLAY_SIZE)) \
+	{\
+		if (col) word = word | m_px;\
+		else word = word & (~m_px);\
+	}\
+}
+
+#else
+#define DSPL_SET_BITCOLOUR(x,j,col,txt) \
+{\
+	int m_px = 1 << (x & 0x1F);\
+	if (col) picture_col[j] = picture_col[j] | (m_px);\
+	else  picture_col[j] = picture_col[j]  & (~m_px);\
+}
+#define DSPL_SET_XYBIT_COLOUR(x,y,col,txt) \
+{\
+	int m_px = 1 << (x & 0x1F);\
+	int word = DSPL_GET_LWORD(x,y);\
+	if (col) word = word | m_px;\
+	else word = word & (~m_px);\
+}
+
+#endif
+#define DSPL_GET_LWORD(px,py) ((py)*LCD_ROW_NUM_LWORDS + ((px)/32))
+#define DSPL_GET_BYTE(px,py) (((py)*4)*LCD_ROW_NUM_LWORDS + ((px)/8))
+#define DSPL_GET_BITCOLOUR(col32) (not used!)
+#define DSPL_GET_PIXELCOLOUR(col32) (not used!)
+#endif //DSAMPLE_LITE
+
+
+
+
+#ifdef DSAMPLE_COLOUR32
+#define LCD_ROW_NUM_LWORDS (LCD_COL) /* col size in longwords         */
+#define BYTEPERPIXEL 4
+#ifdef CHECK_LIMITS
+//safe version-includes trace for errors
+#define DSPL_SET_BITCOLOUR(x,j,col,txt) {if (((j)>=0) && ((j)<DISPLAY_SIZE)) picture_col[j] = (col); else {mmi_trace(txt);}}
+#else
+#define DSPL_SET_BITCOLOUR(x,j,col,txt) {picture_col[j] = (col);}//faster version - no bounds check
+#endif
+#define DSPL_GET_LWORD(px,py) ((py)*LCD_ROW_NUM_LWORDS + (px))
+#define DSPL_GET_BYTE(px,py) (((py)*4)*LCD_ROW_NUM_LWORDS + ((px)*4))
+#define DSPL_GET_BITCOLOUR(col32) (~(((((col32) &0x00F80000)  >> 8) | (((col32) &0x0000FC00)	>> 5) | (((col32) &0x000000F8)	>> 3))))
+#define DSPL_GET_PIXELCOLOUR(col32) (((((col32)<<8) &0x00F80000) | (((col32)<<5) &0x0000FC00) | (((col32)<<3) &0x000000F8)))
+#endif
+
+#ifdef DSAMPLE_COLOUR16
+//	July 1, 2005 REF: CRR 32677 - xpradipg
+//	the extra word padding is not required for the ISAMPLE AND CALLISTO
+#if (defined(ISAMPLE) || defined(CALLISTO))
+#define LCD_ROW_NUM_LWORDS ((LCD_COL)/2) /* col size in longwords         */
+#else
+#define LCD_ROW_NUM_LWORDS ((LCD_COL+1)/2) /* col size in longwords         */
+#endif
+#define BYTEPERPIXEL 2
+#ifdef PIXEL_0_IN_LSW
+#ifdef CHECK_LIMITS
+#define DSPL_SET_BITCOLOUR(x,j,col,txt) \
+{\
+if (((j)>=0) && ((j)<DISPLAY_SIZE)) \
+{	if ((x)&0x01)\
+		picture_col[j] = (picture_col[j] & 0xFFFF0000) | (col & 0x0000FFFF);\
+	else\
+		picture_col[j] = (picture_col[j] & 0x0000FFFF) | ((col <<16) & 0xFFFF0000);\
+}else {mmi_trace(txt);}\
+}
+#else
+#define DSPL_SET_BITCOLOUR(x,j,col,txt) \
+{	if ((x)&0x01)\
+		picture_col[j] = (picture_col[j] & 0xFFFF0000) | (col & 0x0000FFFF);\
+	else\
+		picture_col[j] = (picture_col[j] & 0x0000FFFF) | ((col <<16) & 0xFFFF0000);\
+}
+#endif
+#else
+#ifdef CHECK_LIMITS
+#define DSPL_SET_BITCOLOUR(x,j,col,txt) \
+{\
+if (((j)>=0) && ((j)<DISPLAY_SIZE)) \
+{	if ((x)&0x01)\
+		picture_col[j] = (picture_col[j] & 0x0000FFFF) | ((col <<16) & 0xFFFF0000);\
+	else\
+		picture_col[j] = (picture_col[j] & 0xFFFF0000) | (col & 0x0000FFFF);\
+}else {mmi_trace(txt);}\
+}
+#else
+#define DSPL_SET_BITCOLOUR(x,j,col,txt) \
+{	if ((x)&0x01)\
+		picture_col[j] = (picture_col[j] & 0x0000FFFF) | ((col <<16) & 0xFFFF0000);\
+	else\
+		picture_col[j] = (picture_col[j] & 0xFFFF0000) | (col & 0x0000FFFF);\
+}
+#endif
+
+#endif
+//GW Added () round 'px' in definition below
+#define DSPL_GET_LWORD(px,py) ((py)*LCD_ROW_NUM_LWORDS + ((px)/2))
+#define DSPL_GET_BYTE(px,py) (((py)*4)*LCD_ROW_NUM_LWORDS + ((px)*2))
+//	July 1, 2005 REF: CRR 32677 - xpradipg
+//	the value is not negated here since the LCD driver expects without negation
+#if (defined(ISAMPLE) || defined(CALLISTO))
+#define DSPL_GET_BITCOLOUR(col32) (((((col32) &0x00F80000)  >> 8) | (((col32) &0x0000FC00)	>> 5) | (((col32) &0x000000F8)	>> 3)))
+#else
+#define DSPL_GET_BITCOLOUR(col32) (~(((((col32) &0x00F80000)  >> 8) | (((col32) &0x0000FC00)	>> 5) | (((col32) &0x000000F8)	>> 3))))
+#endif
+#define DSPL_GET_PIXELCOLOUR(col32) (((((col32)<<8) &0x00F80000) | (((col32)<<5) &0x0000FC00) | (((col32)<<3) &0x000000F8)))
+#endif
+
+// 3 words of header info for 'pictures'
+#ifdef DSAMPLE_LITE
+static UINT32*  picture_bw    = NULL;//Pointer to data in display.
+static UINT32*  pictureCopy_bw= NULL;//Pointer to data in display.
+#endif//DSAMPLE_LITE
+
+#ifdef DSAMPLE_COLOUR
+static UINT32*  picture_col    = NULL;//Pointer to data in display.
+//	Mar 30, 2005	REF: CRR 29986	xpradipg
+//	removed the unused variable
+#ifndef FF_MMI_OPTIM
+static UINT32*  pictureCopy_col= NULL;//Pointer to data in display.
+#endif
+#endif
+
+#ifdef CSAMPLE
+#define HEADER_INFO (3)
+#define DISPLAY_SIZE (LCD_COL*LCD_COL_NUM_LWORDS)
+static UINT32 	display_bw [DISPLAY_SIZE+HEADER_INFO+10];
+#ifdef USE_PLOT
+static UINT32 	displayCopy_bw [DISPLAY_SIZE+HEADER_INFO+1];   /* copy to flag differences */
+#endif
+static UINT32*  picture_bw=NULL;//Pointer to data in display.
+static UINT32*  pictureCopy_bw= NULL;//Pointer to data in display.
+/* static char scratch [100];      */ /* command buffer - does not support output of new display  */
+#endif //CSAMPLE
+
+#ifdef BSAMPLE
+static UBYTE displayScr [LCD_ROW][LCD_COL_B];   /* display buffer           */
+static UBYTE displayCopy [LCD_ROW][LCD_COL_B];   /* copy to flag differences */
+/* static char scratch [LCD_ROW*LCD_COL_B*2+100]; */     /* command buffer           */
+#endif //BSAMPLE
+
+
+
+static int mobEnabled = 1;              /* mobile simulation disabled      */
+
+extern int mfwExtOut (char *cmd);       /* forward to ext. display  */
+UBYTE lcd_output_ready  = TRUE;
+UBYTE lcd_output_needed = FALSE;
+
+#define scrHlen 18
+static const char *scrHeader = "CONFIG MFWMOB SCR ";
+
+static int scrX, scrY;                  /* display size             */
+#if defined (WIN32)
+static int mtkEnabled = 0;              /* MMI Toolkit              */
+#endif
+
+static int internal = 0;                /* internal use only        */
+
+static int xIndex;                      /* data transfer index      */
+
+//accessible from outside e.g 3th application MMS
+void scrPoint (int px, int py, int col);
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6103)       MODULE  : DRV_DSPL                   |
+| STATE   : code                ROUTINE : dspl_BitBlt                |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function is used to display a bitmap at the
+            specified location using the raster operation provided.
+            The bitmap format MUST be the same as the display and
+            cannot contain any transparent colours
+            If the bitmap does not cover the entire screen area, the rest of the
+            area is drawn in the background colour provided.
+
+*/
+#ifdef DSAMPLE_COLOUR
+void fastCopyBitmap(int startX, 	int startY, 	// start position of bitmap
+						int bmpSx,	int bmpSy,		//size of bitmap
+						char*	srcBitmap,
+						int posX,   	int posY,   	// start of area to be copied into
+						int sx,     	int sy,     	// size of area to be copied into
+						U32 bgd_col,	int bmpFormat)
+{
+	char * image;
+	int image_sx,image_x;
+	int bgd_sx_left;
+	int bgd_sx_right;
+	int i,y;
+	char *screen = (char*)picture_col;
+	U32 bgdColour;
+
+	if (posX < win_x1)
+	{
+		sx = sx - (win_x1-posX);
+		posX = win_x1;
+	}
+	if (posX+sx >win_x2)
+	{
+		sx = win_x2 - posX;
+	}
+	if (posY < win_y1)
+	{
+		sy = sy - (win_y1-posY);
+		posY = win_y1;
+	}
+	if (posY+sy >win_y2)
+	{
+		sy = win_y2 - posY;
+	}
+{
+	char trc[80];
+	sprintf(trc,"%d,%d,%d,%d,%d,%d",sx,sy,win_x1,win_y1,win_x2,win_y2);
+	mmi_trace(trc);
+}
+#ifdef DSAMPLE_COLOUR32
+	if (bmpFormat != BMP_FORMAT_16BIT_LCD_COLOUR)
+#endif
+#ifdef DSAMPLE_COLOUR16
+	if (bmpFormat != BMP_FORMAT_16BIT_LCD_COMPRESSED_COLOUR)
+#endif
+	{
+		int maxY;
+		//Either display as much of the image as possible or as much as will fit.
+		if (bmpSy > sy)
+			maxY = sy;
+		else
+			maxY = bmpSy;
+		dspl_Clear(posX,posY,(U16)(posX+sx-1),(U16)(posY+sy-1));
+		dspl_BitBlt2((short) posX,(short)posY,(USHORT)bmpSx,(USHORT)maxY,
+					(void *)srcBitmap,0, bmpFormat);
+		return;
+	}
+
+	bgdColour = DSPL_GET_BITCOLOUR(bgd_col);
+	bgdColourArray[0] = (bgdColour & 0x000000FF);
+	bgdColourArray[1] = (bgdColour & 0x0000FF00) >>8;
+	bgdColourArray[2] = (bgdColour & 0x00FF0000) >>16;
+	bgdColourArray[3] = (bgdColour & 0xFF000000) >>24;
+	for (i=BYTEPERPIXEL;i<LCD_COL*BYTEPERPIXEL;i++)
+		bgdColourArray[i] = bgdColourArray[i-BYTEPERPIXEL];
+	bgd_sx_left = (startX- posX);
+
+	if (srcBitmap)
+	{
+		image_x = posX - startX;
+		image_sx = bmpSx;
+		if (image_x < 0)
+		{
+			image_x = 0;
+		}
+		else
+			image_sx = image_sx - image_x;
+	}
+	else
+	{
+		image_sx = 0;
+		image_x  = 0;
+	}
+	if (bgd_sx_left <0)
+		bgd_sx_left=0;
+	if ((image_sx + bgd_sx_left) > sx)
+	{
+		image_sx = sx - bgd_sx_left;
+		bgd_sx_right = 0;
+	}
+	else
+	{
+		bgd_sx_right = sx-(image_sx+bgd_sx_left);
+	}
+	if (bgd_sx_right <0)
+		bgd_sx_right=0;
+	bgd_sx_right = bgd_sx_right*BYTEPERPIXEL;
+	bgd_sx_left  = bgd_sx_left*BYTEPERPIXEL;
+	if (image_sx > 0)
+		image_sx = image_sx*BYTEPERPIXEL;
+	else
+		image_sx = 0;
+	if (image_x > 0)
+		image_x = image_x*BYTEPERPIXEL;
+	else
+		image_x = 0;
+	if (posY+sy > LCD_ROW)
+		sy = LCD_ROW - posY;
+	for (y=posY; y<posY+sy; y++)
+	{
+		int yOfs = DSPL_GET_BYTE(posX,y);
+		if ((yOfs >=0) && (yOfs<DISPLAY_SIZE*4))
+		{
+		if (((srcBitmap) && (y>startY) && (y <bmpSy+startY) && (image_sx >0)))
+		{
+				image = &srcBitmap[(y-startY)*bmpSx*BYTEPERPIXEL];
+			if (bgd_sx_left >0)
+				memcpy(&screen[yOfs],&bgdColourArray[0],bgd_sx_left);
+			memcpy(&screen[yOfs+bgd_sx_left],&image[image_x],image_sx);
+			if (bgd_sx_right >0)
+				memcpy(&screen[yOfs+bgd_sx_left+image_sx],&bgdColourArray[0],bgd_sx_right);
+
+		}
+		else
+		{
+				memcpy(&screen[yOfs],&bgdColourArray[0],sx*BYTEPERPIXEL);
+			}
+		}
+	}
+}
+#else
+void fastCopyBitmap(int startX, 	int startY, 	// start position of bitmap
+						int bmpSx,	int bmpSy,		//size of bitmap
+						char*	srcBitmap,
+						int posX,   	int posY,   	// start of area to be copied into
+						int sx,     	int sy,     	// size of area to be copied into
+						U32 bgd_col,	int bmpFormat)
+{
+	//Fast copy is currently only required for colour bitmaps
+}
+#endif
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrMobUpdate       |
++--------------------------------------------------------------------+
+
+  PURPOSE : Shadow display to mobile simulation
+
+*/
+
+void scrMobUpdate (void)
+{
+#if defined (WIN32)
+  USHORT x,y;
+  USHORT i;
+  USHORT z;
+
+  if (mtkEnabled)
+  {
+    USHORT   sdu_len;
+
+    switch (mtkEnabled)
+    {
+    case 1: // ASAMPLE
+      z= LCD_ROW;
+      sdu_len = 13 * z; // (100 * z Pixels);
+      {
+        PALLOC_SDU (mmi_display_req, MMI_DISPLAY_REQ, (USHORT)(sdu_len<<3));
+        {
+          mmi_display_req->c_x = LCD_COL;
+          mmi_display_req->c_y = z;
+          i=0;
+          for (y=0;y<z;y++)
+            for (x=0; x < 13; x++)
+              mmi_display_req->sdu.buf[i++] = displayScr[y][x];
+        }
+
+        TRACE_EVENT ("Send Display Content");
+#if defined NEW_FRAME
+        {
+          {
+            T_QMSG Message;
+
+              Message.MsgType = MSG_PRIMITIVE;
+              Message.Msg.Primitive.Prim = D2P(mmi_display_req);
+              Message.Msg.Primitive.PrimLen = sizeof (T_MMI_DISPLAY_REQ) + LCD_COL_B*z;
+            #ifdef MEMORY_SUPERVISION
+              vsi_c_send (VSI_CALLER hCommL1 ,&Message, __FILE__, __LINE__);
+            #else
+              vsi_c_send (VSI_CALLER hCommL1 ,&Message);
+            #endif
+          }
+        }
+#else
+//        vsi_c_send (VSI_CALLER hCommL1, D2P(mmi_display_req), sizeof (T_MMI_DISPLAY_REQ) + LCD_COL_B*z);
+#endif
+      }
+      break;
+
+    case 2: // another target with other dimensions
+      {
+        char buf[40];
+        sprintf (buf, "LCD NEEDED %d READY %d", lcd_output_needed, lcd_output_ready);
+        TRACE_EVENT (buf);
+      }
+      lcd_output_needed = TRUE;
+      if (lcd_output_ready)
+      {
+        lcd_output_needed = FALSE;
+        lcd_output_ready = FALSE;
+
+        sdu_len = 14 * 16 + 20;
+#if (LCD_ROW >= 64)
+        {
+          PALLOC_SDU (mmi_display_req, MMI_DISPLAY_REQ, sdu_len<<3);
+
+          mmi_display_req->c_x = LCD_COL;
+          mmi_display_req->c_y = 16;
+          mmi_display_req->attrib.content = 3;
+          i=0;
+          for (y=48;y<64;y++)
+            for (x=0; x < 13; x++)
+              mmi_display_req->sdu.buf[i++] = displayScr[y][x];
+#if defined NEW_FRAME
+          {
+            T_QMSG Message;
+
+              Message.MsgType = MSG_PRIMITIVE;
+              Message.Msg.Primitive.Prim = D2P(mmi_display_req);
+              Message.Msg.Primitive.PrimLen = sizeof (T_MMI_DISPLAY_REQ) + 14*16+20;
+            #ifdef MEMORY_SUPERVISION
+              vsi_c_send (VSI_CALLER hCommL1 ,&Message, __FILE__, __LINE__);
+            #else
+              vsi_c_send (VSI_CALLER hCommL1 ,&Message);
+            #endif
+          }
+#else
+          vsi_c_send (VSI_CALLER hCommL1, D2P(mmi_display_req), sizeof (T_MMI_DISPLAY_REQ) + 14*16+20);
+#endif
+        }
+#endif
+#if (LCD_ROW >= 48)
+        {
+          PALLOC_SDU (mmi_display_req, MMI_DISPLAY_REQ, (USHORT)(sdu_len<<3));
+
+          mmi_display_req->c_x = LCD_COL;
+          mmi_display_req->c_y = 16;
+          mmi_display_req->attrib.content = 2;
+          i=0;
+          for (y=32;y<48;y++)
+            for (x=0; x < 13; x++)
+              mmi_display_req->sdu.buf[i++] = displayScr[y][x];
+#if defined NEW_FRAME
+          {
+            T_QMSG Message;
+
+              Message.MsgType = MSG_PRIMITIVE;
+              Message.Msg.Primitive.Prim = D2P(mmi_display_req);
+              Message.Msg.Primitive.PrimLen = sizeof (T_MMI_DISPLAY_REQ) + 14*16+20;
+            #ifdef MEMORY_SUPERVISION
+              vsi_c_send (VSI_CALLER hCommL1 ,&Message, __FILE__, __LINE__);
+            #else
+              vsi_c_send (VSI_CALLER hCommL1 ,&Message);
+            #endif
+          }
+#else
+          vsi_c_send (VSI_CALLER hCommL1, D2P(mmi_display_req), sizeof (T_MMI_DISPLAY_REQ) + 14*16+20);
+#endif
+        }
+#endif
+        {
+          PALLOC_SDU (mmi_display_req, MMI_DISPLAY_REQ, (USHORT)(sdu_len<<3));
+
+          mmi_display_req->c_x = LCD_COL;
+          mmi_display_req->c_y = 16;
+          mmi_display_req->attrib.content = 1;
+          i=0;
+          for (y=16;y<32;y++)
+            for (x=0; x < 13; x++)
+              mmi_display_req->sdu.buf[i++] = displayScr[y][x];
+#if defined NEW_FRAME
+          {
+            T_QMSG Message;
+
+              Message.MsgType = MSG_PRIMITIVE;
+              Message.Msg.Primitive.Prim = D2P(mmi_display_req);
+              Message.Msg.Primitive.PrimLen = sizeof (T_MMI_DISPLAY_REQ) + 14*16+20;
+            #ifdef MEMORY_SUPERVISION
+              vsi_c_send (VSI_CALLER hCommL1 ,&Message, __FILE__, __LINE__);
+            #else
+              vsi_c_send (VSI_CALLER hCommL1 ,&Message);
+            #endif
+          }
+#else
+          vsi_c_send (VSI_CALLER hCommL1, D2P(mmi_display_req), sizeof (T_MMI_DISPLAY_REQ) + 14*16+20);
+#endif
+        }
+        {
+          PALLOC_SDU (mmi_display_req, MMI_DISPLAY_REQ, (USHORT)(sdu_len<<3));
+
+          mmi_display_req->c_x = LCD_COL;
+          mmi_display_req->c_y = 16;
+          mmi_display_req->attrib.content = 0;
+          i=0;
+          for (y=0;y<16;y++)
+            for (x=0; x < 13; x++)
+              mmi_display_req->sdu.buf[i++] = displayScr[y][x];
+#if defined NEW_FRAME
+          {
+            T_QMSG Message;
+
+              Message.MsgType = MSG_PRIMITIVE;
+              Message.Msg.Primitive.Prim = D2P(mmi_display_req);
+              Message.Msg.Primitive.PrimLen = sizeof (T_MMI_DISPLAY_REQ) + 14*16+20;
+            #ifdef MEMORY_SUPERVISION
+              vsi_c_send (VSI_CALLER hCommL1 ,&Message, __FILE__, __LINE__);
+            #else
+              vsi_c_send (VSI_CALLER hCommL1 ,&Message);
+            #endif
+          }
+#else
+          vsi_c_send (VSI_CALLER hCommL1, D2P(mmi_display_req), sizeof (T_MMI_DISPLAY_REQ) + 14*16+20);
+#endif
+        }
+        TRACE_EVENT ("Send Display Content");
+      }
+      break;
+    }
+  }
+#endif
+
+#ifdef BSAMPLE
+  if (mobEnabled)
+  {
+/*  ## scratch is not required and function mfwExtOut is 
+      ## not doing anything
+     sprintf(scratch,"%s%s %d",scrHeader,"disp",LCD_COL_B);
+    xIndex = 0;
+    mfwExtOut(scratch);
+    */
+  }
+#endif
+}
+
+
+int dspl_GetContrastColour( int ipCol)
+{
+	switch (ipCol & 0x00808080)
+	{
+		case 0x000000:		return (0x00FFFFFF);
+		case 0x000080:		return (0x00FFFF00);
+		case 0x008000:		return (0x00FF00FF);
+		case 0x008080:		return (0x00FF0000);
+		case 0x800000:		return (0x0000FFFF);
+		case 0x800080:		return (0x0000FF00);
+		case 0x808000:		return (0x000000FF);
+		case 0x808080:		return (0x00000000);
+		default:			return (0x00808080);
+	}
+	return (0x00808080);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrLCDUpdate       |
++--------------------------------------------------------------------+
+
+  PURPOSE : Shadow display to LCD
+
+*/
+
+//GW Procedure/data supplied by new TI Driver V5.3.1
+#ifdef R2D_ENABLED
+
+static T_R2D_SHAPE_PTR	scrDisplayRect = NULL; //rectangle defined as shape of the display
+static T_R2D_GC_PTR		scrPicPtr = NULL; //Pointer to gc with picture in it (b+w and col)
+static T_RVF_MB_ID			mb_id;	//ID of memory bank
+void r2d_refresh(void);
+int riv_err;
+extern T_R2D_GC_PTR r2d_g_lcd_gc;
+#endif // R2D_ENABLED
+static int picInit = 0;	//Have we set up the mb id etc yet ?
+
+//Initialises data required for bolck copy of a 'picture'
+void scrRivPictureClear(void)
+{
+#ifdef CSAMPLE
+    memset(display_bw,0,sizeof(display_bw));
+#ifdef USE_PLOT
+    memset(displayCopy_bw,0,sizeof(displayCopy_bw));
+	pictureCopy_bw = &displayCopy_bw[3]; //start of input data
+#endif
+
+	display_bw[0] = LCD_COL;
+	display_bw[1] = LCD_ROW;
+	display_bw[2] = DISPLAY_SIZE;
+	picture_bw = &display_bw[3]; //start of input data
+#endif
+
+#ifdef DSAMPLE_COLOUR
+#ifdef USEBUFFER
+	display_colour[0] = LCD_COL;
+	display_colour[1] = LCD_ROW;
+	display_colour[2] = DISPLAY_SIZE;
+	picture_col = &display_colour[3]; //start of input data
+#else
+	picture_col = r2d_get_pixmap(r2d_g_lcd_gc);
+#endif
+	{
+		U32 lWord,bitCol;
+		int j,y;
+		//GW When clearing screen - do not allow transparent background colours!
+		int bgdCol = dspl_GetBgdColour();
+		int fgdCol = dspl_GetFgdColour();
+		if (((bgdCol & 0x00F0F0F0) == (fgdCol  & 0x00F0F0F0)) ||
+		    ((bgdCol & 0xFF000000) == TRANSPARENT_32BIT_COLOUR))
+		{
+			/*Foreground and background colours are the same (or near enough) */
+			/* or background colour is transparent                            */
+			/*Select a colour that will contrast with the current foreground colour */
+			bgdCol = dspl_GetContrastColour(fgdCol);
+		}
+		bitCol = (DSPL_GET_BITCOLOUR(bgdCol)) & 0x00FFFFFF;
+
+#ifdef DSAMPLE_COLOUR32
+		bgdColourArray[0] = (bitCol & 0x000000FF);
+		bgdColourArray[1] = (bitCol & 0x0000FF00) >>8;
+		bgdColourArray[2] = (bitCol & 0x00FF0000) >>16;
+		bgdColourArray[3] = (bitCol & 0xFF000000) >>24;
+		for (j=4;j<LCD_COL*4;j++)
+			bgdColourArray[j] = bgdColourArray[j-4];
+		for (y=0; y<LCD_ROW; y++)
+		{
+			int yOfs = (y*LCD_ROW_NUM_LWORDS);
+			memcpy(&picture_col[yOfs] ,bgdColourArray,LCD_COL*4);
+		}
+#endif
+#ifdef DSAMPLE_COLOUR16
+		bgdColourArray[0] = (bitCol & 0x000000FF);
+		bgdColourArray[1] = (bitCol & 0x0000FF00) >>8;
+		for (j=2;j<LCD_COL*2;j++)
+			bgdColourArray[j] = bgdColourArray[j-2];
+		for (y=0; y<LCD_ROW; y++)
+		{
+			int yOfs = (y*LCD_ROW_NUM_LWORDS);
+			memcpy(&picture_col[yOfs] ,bgdColourArray,LCD_COL*2);
+		}
+#endif
+	}
+
+#endif
+
+#ifdef DSAMPLE_LITE
+	picture_bw = r2d_get_pixmap(r2d_g_lcd_gc);
+	memset(picture_bw,0,DISPLAY_SIZE*4);
+#endif
+
+
+}
+void scrRivPictureInit( void )
+{
+	static int err = -1;
+	T_RVF_MB_NAME 		mb_name;
+	T_RVF_MB_PARAM 		mb_param;
+	//Ensure data is only created once.
+#ifdef R2D_ENABLED
+	if (picInit != 0)
+		return;
+	picInit = 1; //int underway.
+	scrRivPictureClear();
+#endif
+
+#ifdef CSAMPLE
+	strcpy(mb_name, "FRED");
+	mb_param.size = 256;
+	mb_param.watermark = 128;
+	riv_err = rvf_create_mb( mb_name, mb_param, &mb_id);
+
+	if (riv_err == 0)
+	{
+		scrPicPtr = r2d_new_picture_context(mb_id, display_bw,R2D_LCD_KIND);
+		scrDisplayRect = r2d_new_rectangle(mb_id,0,0,LCD_COL-1,LCD_ROW-1);
+	}
+	else
+	{
+		scrPicPtr = NULL;
+		scrDisplayRect  = NULL;
+	}
+#endif
+
+#ifdef DSAMPLE_COLOUR
+#ifdef USEBUFFER
+	strcpy(mb_name, "FRED");
+	mb_param.size = 256;
+	mb_param.watermark = 128;
+	err = rvf_create_mb( mb_name, mb_param, &mb_id);
+	if (err == 0)
+	{
+		scrPicPtr = r2d_new_picture_context(mb_id, display_colourPtr,R2D_FULL_KIND);// R2D_LCD_KIND);
+		scrDisplayRect = r2d_new_rectangle(mb_id,0,0,LCD_COL+1,LCD_ROW+1);
+	}
+	else
+#endif
+	{
+		scrPicPtr = NULL;
+		scrDisplayRect  = NULL;
+	}
+#endif
+
+}
+
+//GW Change the display to  
+#ifdef DSAMPLE_COLOUR
+#ifdef DSAMPLE_COLOUR32
+#define TOP_BITS_SET 0xC618
+#endif
+#ifdef DSAMPLE_COLOUR16
+#define TOP_BITS_SET 0xC618C618
+#endif
+#endif
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : SMI_WM                   |
+| STATE   : code                  ROUTINE : scrUnfocusDisplay      |
++--------------------------------------------------------------------+
+
+  PURPOSE : Causes the entire display to appear much darker, allowing the pop-up 
+  			dialog to be more clearly the focus especially the softkeys.
+
+GW #2294 23/07/03 - Created
+*/
+void scrUnfocusDisplay(void)
+{
+#ifndef _SIMULATION_  // Turn off this BMI Schnickschnack ...
+	int x,y;
+	UINT32 *picPtr;
+#ifndef DSAMPLE_COLOUR
+	UINT32 mask;
+#endif
+#ifdef DSAMPLE_COLOUR
+	picPtr = picture_col;
+#else
+	picPtr = picture_bw;
+#endif
+	if (picPtr != NULL)
+	{
+		for (y=0;y<LCD_ROW;y++)
+		{
+#ifndef DSAMPLE_COLOUR
+			if (y & 0x01)
+				mask = 0xAAAAAAAA;
+			else
+				mask = 0x55555555;
+#endif
+			for (x=0;x<LCD_ROW_NUM_LWORDS;x++)
+			{
+#ifdef DSAMPLE_COLOUR
+				//We Want to reduce colour by 50% (shift left) and set top bits to bits to 0
+				//Since picture colours are inverted, set top bits.
+				//Also, colouris very bright - reduce by 75%
+				if ((*picPtr & TOP_BITS_SET) != TOP_BITS_SET)
+					*picPtr = ((*picPtr) >> 2) | TOP_BITS_SET;
+#else
+				//B+W display - blank every second pixel
+				*picPtr = (*picPtr) & mask;
+#endif
+				picPtr++;
+			}
+		}
+	}
+#endif /* _SIMULATION_ */
+}
+
+
+//Set colour (only when different from last time)
+void scrSetR2DFgdCol(UINT32 col)
+{
+	U16 opCol_a,opCol_r,opCol_g,opCol_b;
+	static UINT32 oldCol = 0xFFFFFFFF;
+	if (col != oldCol)
+	{
+#ifdef DSAMPLE_COLOUR
+		opCol_a = 0xFF; // ((col & 0x0000FF00) >> 16);
+		opCol_r = ((col & 0x0000F800) >>  8);
+		opCol_g = ((col & 0x000007E0) >>  3);
+		opCol_b = ((col & 0x0000001F) <<  3);
+#else
+		opCol_a = 0xFF; // ((col & 0x0000FF00) >> 16);
+		opCol_r = ((col & 0x000000E0)       );
+		opCol_g = ((col & 0x0000001C) <<  3);
+		opCol_b = ((col & 0x00000003) <<  6);
+		if (opCol_r == 0)	opCol_r = 0x80;
+		if (opCol_g == 0)	opCol_g = 0x40;
+#endif
+#ifdef R2D_ENABLED
+		r2d_set_foreground_color_with_argb(r2d_g_lcd_gc, opCol_a, opCol_r, opCol_g, opCol_b );
+		oldCol = col;
+#endif
+	}
+}
+//Set colour (only when different from last time)
+void scrSetR2DBgdCol(UINT32 col)
+{
+	U16 opCol_a,opCol_r,opCol_g,opCol_b;
+	static UINT32 oldCol = 0xFFFFFFFF;
+	if (col != oldCol)
+	{
+#ifdef DSAMPLE_COLOUR
+		opCol_a = 0xFF; // ((col & 0x0000FF00) >> 16);
+		opCol_r = ((col & 0x0000F800) >>  8);
+		opCol_g = ((col & 0x000007E0) >>  3);
+		opCol_b = ((col & 0x0000001F) <<  3);
+#else
+		opCol_a = 0xFF; // ((col & 0x0000FF00) >> 16);
+		opCol_r = ((col & 0x000000E0)       );
+		opCol_g = ((col & 0x0000001C) <<  3);
+		opCol_b = ((col & 0x00000003) <<  6);
+		if (opCol_r == 0)	opCol_r = 0x80;
+		if (opCol_g == 0)	opCol_g = 0x40;
+#endif
+#ifdef R2D_ENABLED
+		r2d_set_background_color_with_argb(r2d_g_lcd_gc, opCol_a, opCol_r, opCol_g, opCol_b );
+		oldCol = col;
+#endif
+	}
+}
+//GW Procedure/data supplied by new TI Driver V5.3.1
+//length of array (32bit words) to hold a copy of the screen (maybe)
+#ifdef R2D_ENABLED
+extern T_R2D_GC_PTR r2d_g_lcd_gc;
+#endif
+/*  */
+void scrPlotR2DPoint(U32 col, INT16 x, INT16 y)
+{
+#ifdef R2D_ENABLED
+	static U32 fCol=0xFFFFFFFF;
+	static U32 bCol=0xFFFFFFFF;
+	static U32 flip=0;
+	if (fCol==col)
+	{
+		scrSetR2DFgdCol(col );
+		r2d_draw_point(r2d_g_lcd_gc,x,y);
+	}
+	else if (bCol == col)
+	{
+		scrSetR2DBgdCol(col );
+		r2d_erase_point(r2d_g_lcd_gc,x,y);
+	}
+	else if (flip)
+	{
+		flip = 0;
+		scrSetR2DBgdCol(col );
+
+		r2d_erase_point(r2d_g_lcd_gc,x,y);
+		bCol = col;
+	}
+	else
+	{
+		flip = 1;
+		scrSetR2DFgdCol(col );
+		r2d_draw_point(r2d_g_lcd_gc,x,y);
+		fCol = col;
+	}
+#endif
+}
+
+#ifdef BSAMPLE
+void scrLCDUpdate (void)
+{
+#ifdef USE_PLOT
+	int nPlots=0;
+
+	int row,rowstart;
+	int kstart,kend,k;
+	UBYTE *bcopy;
+	int i,j;
+	UBYTE m;
+	UBYTE  *bm;
+#else
+	int i;
+#endif
+
+#if defined (WIN32_SIM)
+    return;
+#endif
+    if (!scrEnabled)
+        return;
+
+#ifdef USE_PLOT
+	bm   = &displayScr[0][0];
+    bcopy = &displayCopy[0][0];
+    m = 0x80;
+    for (j = 0; j < LCD_ROW; j++)
+    {
+        for (k = 0; k < (LCD_COL+7)/8; k++)
+        {
+          //Only plot data if it has changed since last time
+          if (*bm != *bcopy)
+          {
+            m = 0x80;
+            kstart = k*8;
+            kend = k*8+8;
+            if (kend>LCD_COL)
+              kend = LCD_COL;
+            for (i = kstart; i < kend; i++)
+            {
+#ifdef R2D_ENABLED
+                if ((*bm) & m)
+
+					r2d_draw_point(r2d_g_lcd_gc,i,j);
+                else
+					r2d_erase_point(r2d_g_lcd_gc,j,i);
+#endif
+                m >>= 1;
+            }
+            *bcopy = *bm;//Update value
+          }
+          bm++;
+          bcopy++;
+        }
+    }
+
+#else
+    //* work around limitations of TI driver !                       *
+    for (i = 0; i < LCD_ROW; i++)
+    {
+        displayScr[i][LCD_COL_B-1] &= 0xF0;
+        displayScr[i][LCD_COL_B-1] |= (UBYTE) ((displayScr[i][6] >> 2) & 0x0F);
+    }
+
+    LCD_PixBlt(0,0,LCD_COL_B*8,8,(char*)&displayScr[0][0]);
+    LCD_PixBlt(0,8,LCD_COL_B*8,8,(char*)(&(displayScr[8][0])));
+    LCD_PixBlt(0,16,LCD_COL_B*8,8,(char*)(&(displayScr[16][0])));
+    LCD_PixBlt(0,24,LCD_COL_B*8,8,(char*)(&(displayScr[24][0])));
+#if (!CUST)//JVJE #if (CUST==1)
+	LCD_PixBlt(0,32,LCD_COL_B*8,8,(char*)(&(displayScr[32][0])));
+	LCD_PixBlt(0,40,LCD_COL_B*8,8,(char*)(&(displayScr[40][0])));
+#endif
+#endif
+
+}
+#endif
+
+
+
+
+#ifdef CSAMPLE
+void scrLCDUpdate (void)
+{
+int kstart,kend,k;
+int row,rowstart;
+int   i,j;
+INT16 x1,y1;
+UINT32  m;
+UINT32  *bm;
+UINT32  *bcopy;
+static UINT32 col=0;
+int count;
+int nPlots=0;
+
+#if defined (WIN32_SIM)
+    return;
+#endif
+    if (!scrEnabled)
+        return;
+
+#ifdef USE_PLOT
+
+	bm   = picture_bw;
+    bcopy = pictureCopy_bw;
+	for (j = 0; j < DISPLAY_SIZE; j++)
+	{
+		if (*bm != *bcopy)
+	    {
+        	//Only plot data if it has changed since last time
+		    m = 0x80000000;
+
+		    x1 = j / LCD_COL_NUM_LWORDS;
+		    y1 = j % LCD_COL_NUM_LWORDS;
+		    y1 = y1 << 5;
+		    y1 = (y1 + 16);
+		    x1 = (scrX-1)-x1;
+		    kstart = y1;
+		    kend = y1+32;
+		    for (i = kstart; i < kend; i++)
+        	{
+				nPlots++;
+#ifdef R2D_ENABLED
+				if ((*bm) & m)
+					r2d_draw_point(r2d_g_lcd_gc,x1,(i%64));
+            	else
+
+					r2d_erase_point(r2d_g_lcd_gc,x1,(i%64));
+#endif
+				m >>= 1;
+			}
+ 			*bcopy = *bm;//Update value
+       	}
+      	bm++;
+      	bcopy++;
+      	if (nPlots > MAX_NUMBER_PLOTS)
+      			return;
+    }
+#else
+	if (scrPicPtr != NULL)
+	{
+#ifdef R2D_ENABLED
+		r2d_fast_blit(scrPicPtr,r2d_g_lcd_gc);
+#endif
+		vsi_t_sleep(VSI_CALLER (20));
+	}
+#endif //old/new
+}
+#endif //CSAMPLE
+
+//June 03, 2005 REF: GSM-ENH-31636 xpradipg
+//CRR 28825:  xpradipg - 11 Feb 2005
+#if (defined(DSAMPLE) || defined(ESAMPLE) || defined(ISAMPLE) || defined(CALLISTO))// changes for flag cleanup and addition for ISAMPLE
+void scrLCDUpdate (void)
+{
+
+#if defined (WIN32_SIM)
+    return;
+#endif
+    if (!scrEnabled)
+        return;
+
+#ifdef R2D_ENABLED
+	r2d_flush();
+#endif
+}
+#endif//D-sample
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrMobCommand      |
++--------------------------------------------------------------------+
+
+  PURPOSE : Command string from mobile simulation
+
+*/
+
+
+void scrMobCommand (char *s)
+{
+#ifdef BSAMPLE
+    char *p;
+    unsigned char *q;
+    int i;
+    char scratch [LCD_ROW*LCD_COL_B*2+100];     /* command buffer           */	
+
+    if (strstr(s,"ena") == s)
+    {
+        mobEnabled = 1;
+        return;
+    }
+    if (strstr(s,"dis") == s)
+    {
+        mobEnabled = 0;
+        return;
+    }
+    if (strstr(s,"ok") == s)
+    {
+        if (xIndex < 0)
+            return;
+        strcpy(scratch,scrHeader);
+        if (xIndex >= sizeof(displayScr))
+        {
+            strcat(scratch,"done");
+            mfwExtOut(scratch);
+            return;
+        }
+        strcat(scratch,"data ");
+        p = scratch + strlen(scratch);
+        sprintf(p,"%04d %04d ",xIndex,LCD_COL_B*LCD_ROW/DISPL_DIV);
+        p = scratch + strlen(scratch);
+        q = (UBYTE *) displayScr;
+        for (i = 0; i < LCD_COL_B * LCD_ROW / DISPL_DIV; i++)
+        {
+            sprintf(p,"%02x",q[xIndex++]);
+            p += 2;
+        }
+        *p = '\0';
+        mfwExtOut(scratch);
+        return;
+    }
+    #endif
+}
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrInit            |
++--------------------------------------------------------------------+
+
+  PURPOSE : initialize screen driver
+
+*/
+
+void scrInit (void)
+{
+    LCD_SetPower(); /* ES!! */
+    LCD_Reset();
+    LCD_Enable(1);
+	dspl_InitColour ();
+
+#ifdef LSCREEN
+	font_initFont(1);
+#else
+	font_initFont(0);
+#endif
+
+#ifdef BSAMPLE
+    memset(displayScr,0,sizeof(displayScr));
+    memset(displayCopy,0,sizeof(displayCopy));
+#else
+	scrRivPictureInit();
+#endif
+#ifdef R2D_ENABLED
+	r2d_erase( r2d_g_lcd_gc );
+#endif
+    mobEnabled = 0;
+    scrEnabled = 1;
+    internal = 0;
+    scrX = LCD_COL;
+    scrY = LCD_ROW;
+    xIndex = -1;
+	displayData.DisplayType = DSPL_TYPE_GRAPHIC;
+	 //GW Set display window to full screen
+	dspl_ResetWindow();
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrExit            |
++--------------------------------------------------------------------+
+
+  PURPOSE : finalize screen driver
+
+*/
+
+void scrExit (void)
+{
+    LCD_Enable(0);
+    mobEnabled = 0;
+    scrEnabled = 0;
+    xIndex = -1;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrUpdate          |
++--------------------------------------------------------------------+
+
+  PURPOSE : set screen update mode
+
+GW 18/09/01 clear text invert flag whenever display is enabled/disabled.
+*/
+//GW mmi_trace is a call to the MMI to provide timings for MMI updates -
+//REMOVE FROM FINAL BUILD (if I forget!)
+int scrUpdate (int onOff)
+{
+    int ena = scrEnabled;
+	txtInvert = 0;	//clear text invert flag whenever display is enabled/disabled.
+    scrEnabled = onOff;
+    if (scrEnabled)
+    {
+#ifdef MMI_TRACE
+mmi_trace("scrupdate() enable start");
+#endif
+        scrLCDUpdate();
+        scrMobUpdate();
+#ifdef MMI_TRACE
+mmi_trace("scrupdate() enable end");
+#endif
+    }
+    else
+	{
+#ifdef MMI_TRACE
+mmi_trace("scrupdate() disabled");
+#endif
+	}
+    return ena;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrSize            |
++--------------------------------------------------------------------+
+
+  PURPOSE : retrieve display size
+
+*/
+
+void scrSize (int *x, int *y)
+{
+    *x = scrX;
+    *y = scrY;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrOnOff           |
++--------------------------------------------------------------------+
+
+  PURPOSE : switch display On/Off
+
+*/
+
+void scrOnOff (int on)
+{
+//kk to be checked
+/*  ## scratch is not required and function mfwExtOut is 
+      ## not doing anything
+   sprintf(scratch,"%sscrOnOff:%d",scrHeader,on);
+   mfwExtOut(scratch);
+   */
+}
+
+#if (!CUST)//JVJE #if (CUST==1)
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrLight           |
++--------------------------------------------------------------------+
+
+  PURPOSE : switch display backlight On/Off
+
+*/
+
+void scrLight (int on)
+{
+//kk to be checked
+/*  ## scratch is not required and function mfwExtOut is 
+      ## not doing anything
+    sprintf(scratch,"%sscrLight:%d",scrHeader,on);
+   mfwExtOut(scratch);
+ */
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrClear           |
++--------------------------------------------------------------------+
+
+  PURPOSE : clear display
+
+*/
+
+void scrClear (void)
+{
+
+#ifdef BSAMPLE
+    memset(displayScr,0,sizeof(displayScr));
+#else
+	scrRivPictureClear();
+#endif
+
+    if (scrEnabled)
+    {
+        LCD_Clear();                    /* TI driver function       */
+        scrMobUpdate();                 /* update mobile simulation */
+    }
+}
+#endif //CUST==1
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrClearRect       |
++--------------------------------------------------------------------+
+
+  PURPOSE : clear display area
+
+*/
+#ifdef DSAMPLE_LITE
+
+void scrDrawFilledRect (int px, int py, int sx, int sy, U32 col)
+{
+	int i,j;
+	U32 opCol;
+	int word;
+
+	//Limit rectangle to the size of the screen.
+	if ((px >= scrX) || (py >= scrY))
+		return;
+
+	if ((col& 0xFF000000) == TRANSPARENT_32BIT_COLOUR)
+		return; //Background colour is transparent
+
+	//Allow -ve sizes but change data round
+	if (sx <0)
+	{
+		px = px+sx;
+		sx = -sx;
+	}
+	if (sy <0)
+	{
+		py = py+sy;
+		sy = -sy;
+	}
+	//Limit rectangle to size of window
+	if (px<win_x1)
+	{
+		sx = sx - win_x1;
+		px = win_x1;
+	}
+	if (py<win_y1)
+	{
+		sy = sy - win_y1;
+		py = win_y1;
+	}
+
+	if (px+sx >=win_x2)
+		sx = win_x2 - px-1;
+	if (py+sy >=win_y2)
+		sy = win_y2 - py-1;
+	if ((sx <= 0) || (sy<=0))
+		return;//cannot draw zero width rectangle.
+
+	opCol = col;
+	{
+		U32 maskL, maskR;
+		int skipBits,startWord,endWord;
+		maskL = 0xFFFFFFFF;
+		skipBits = px & 0x1F;
+		maskL = maskL << skipBits;
+		startWord = px >> 5;
+		maskR = 0xFFFFFFFF;
+		skipBits = (px+sx) & 0x1F;
+		maskR = ~(maskR << skipBits);
+		endWord = (px+sx) >> 5;
+		if (startWord == endWord)
+		{
+			maskL = maskL & maskR;
+			maskR = maskL;
+		}
+
+		if (col == 0)
+		{	//Set bgd colour to Black (0)
+		    for (j = py; j < py + sy; j++)
+		    {
+				word = DSPL_GET_LWORD(px,j);
+				picture_bw[word] = picture_bw[word] & (~maskL);
+				word++;
+				for (i = startWord+1; i < endWord; i++)
+				{
+					picture_bw[word] = 0;
+					word++;
+				}
+				word = DSPL_GET_LWORD(px+sx,j);
+				picture_bw[word] = picture_bw[word] & (~maskR);
+		    }
+		}
+		else
+		{	//Set bgd colour to White (1)
+		    for (j = py; j < py + sy; j++)
+		    {
+				word = DSPL_GET_LWORD(px,j);
+				picture_bw[word] = picture_bw[word] | (maskL);
+				word++;
+				for (i = startWord+1; i < endWord; i++)
+				{
+					picture_bw[word] = 0xFFFFFFFF;
+					word++;
+				}
+				word = DSPL_GET_LWORD(px+sx,j);
+				picture_bw[word] = picture_bw[word] | (maskR);
+		    }
+		}
+	}
+}
+#endif
+
+#ifdef DSAMPLE_COLOUR
+
+void scrDrawFilledRect (int px, int py, int sx, int sy, U32 col)
+{
+	int i,j;
+	U32 opCol;
+	char* screen;
+
+	//Limit rectangle to the size of the screen.
+	if ((px >= scrX) || (py >= scrY))
+		return;
+
+	if ((col& 0xFF000000) == TRANSPARENT_32BIT_COLOUR)
+		return; //Background colour is transparent
+
+	//Allow -ve sizes but change data round
+	if (sx <0)
+	{
+		px = px+sx;
+		sx = -sx;
+	}
+	if (sy <0)
+	{
+		py = py+sy;
+		sy = -sy;
+	}
+	//Limit rectangle to size of window
+	if (px<win_x1)
+	{
+		sx = sx - win_x1;
+		px = win_x1;
+	}
+	if (py<win_y1)
+	{
+		sy = sy - win_y1;
+		py = win_y1;
+	}
+
+	if (px+sx > win_x2)
+		sx = win_x2 - px;
+	if (py+sy > win_y2)
+		sy = win_y2 - py;
+	if ((sx <= 0) || (sy<=0))
+		return;//cannot draw zero width rectangle.
+
+	opCol = col;
+	//GW Fix - invert colour
+#ifdef USE_PLOT
+    for (j = py; j < py + sy; j++)
+    {
+		for (i = px; i < px+sx; i++)
+			scrPoint(i,j,opCol);
+    }
+#else
+	{
+		U32 lWord,bgdColour;
+		int y;
+		screen = (char*)picture_col;
+		bgdColour = DSPL_GET_BITCOLOUR(col);
+		bgdColourArray[0] = (bgdColour & 0x000000FF);
+		bgdColourArray[1] = (bgdColour & 0x0000FF00) >>8;
+		bgdColourArray[2] = (bgdColour & 0x00FF0000) >>16;
+		bgdColourArray[3] = (bgdColour & 0xFF000000) >>24;
+		for (i=BYTEPERPIXEL;i<sx*BYTEPERPIXEL;i++)
+			bgdColourArray[i] = bgdColourArray[i-BYTEPERPIXEL];
+		for (y=py; y<py+sy; y++)
+		{
+//			int yOfs = (y*LCD_COL+px);
+			int yOfs = DSPL_GET_BYTE(px,y);
+			memcpy(&screen[yOfs] ,bgdColourArray,sx*BYTEPERPIXEL);
+		}
+	}
+#endif//use plot
+}
+#endif
+
+
+#ifdef BSAMPLE
+void scrDrawFilledRect (int px, int py, int sx, int sy, U32 col)
+{
+	scrClearRect (px, py, sx, sy);
+}
+#endif
+#ifdef CSAMPLE
+void scrDrawFilledRect (int px, int py, int sx, int sy, U32 col)
+{
+	scrClearRect (px, py, sx, sy);
+}
+#endif
+
+void scrClearRect (int px, int py, int sx, int sy)
+{
+
+#ifdef BSAMPLE
+	int i,j;
+    int x1, x2;
+    UBYTE m1, m2;
+#endif
+
+#ifdef CSAMPLE
+	int x1;
+	int i,j;
+    int y1s, y2s;
+    int y1f, y2f;
+	U32 m1s,m2s;
+	U32 m1f,m2f;
+
+    int y1, y2;
+	U32 m1,m2;
+#endif
+
+    if (px < 0 || py < 0 || px >= scrX || py >= scrY
+                                       || sx < 0 || sy < 0)
+        return;
+    if (px + sx > scrX)
+        sx = scrX - px;
+    if (py + sy > scrY)
+        sy = scrY - py;
+
+	//Limit rectangle to size of window
+	if (px<win_x1)
+      {
+		sx = sx - win_x1;
+		px = win_x1;
+      }
+	if (py<win_y1)
+	{
+		sy = sy - win_y1;
+		py = win_y1;
+	}
+
+	if (px+sx >win_x2)
+		sx = win_x2 - px;
+	if (py+sy >win_y2)
+		sy = win_y2 - py;
+	if ((sx <= 0) || (sy<=0))
+		return;//cannot draw zero width rectangle.
+
+#ifdef BSAMPLE
+    x1 = px / 8;                        /* first x offset           */
+    x2 = (px + sx) / 8;                 /* last x offset            */
+    m1 = m2 = 0xff;
+    m1 = (UBYTE) ~(m1 >> (px & 7));        /* left mask                */
+    m2 = (UBYTE) (m2 >> ((px + sx) & 7));  /* right mask               */
+    if (x1 == x2)
+        m1 = m2 = m1 | m2;              /* combined masks           */
+    for (j = py; j < py + sy; j++)
+    {
+        displayScr[j][x1] &= m1;
+        for (i = x1 + 1; i < x2; i++)
+            displayScr[j][i] = '\0';
+        displayScr[j][x2] &= m2;
+    }
+#endif
+
+#ifdef CSAMPLE
+    for (i=0;i<sx;i++)
+    	for (j=0;j<sy;j++)
+    		scrPoint(px+i,py+j,0);
+#endif
+
+//June 03, 2005 REF: GSM-ENH-31636 xpradipg
+//CRR 28825:  xpradipg - 11 Feb 2005
+#if (defined(DSAMPLE) || defined(ESAMPLE) || defined(ISAMPLE) || defined(CALLISTO)) //clean up of flag and addition for ISAMPLE
+	scrDrawFilledRect ( px, py, sx, sy, dspl_GetBgdColour());
+#endif
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr              |
+| STATE   : code                        ROUTINE : scrText_Unicode      |
++--------------------------------------------------------------------+
+
+  PURPOSE : draw text
+
+*/
+
+void scrText_Unicode (int x, int y, USHORT *txt)
+{
+  UBYTE current_width=0;
+  USHORT current_code,first_byte_code,second_byte_code;
+  t_font_bitmap* current_bitmap,*error_bitmap;
+
+    if ( y > scrY)
+        return;
+
+    while ((*txt) && (x <= scrX))
+    {
+    current_code = (USHORT)((*txt)<<8)+(USHORT)((*txt)>>8);/*The USHORT is inverted, therefore we have to apply this simple change*/
+    current_bitmap = get_bitmap(current_code);
+		if (!current_bitmap)	/*ASCII codes will be represented*/
+    {
+			first_byte_code = (USHORT)((*txt)&0xFF);
+      error_bitmap = get_bitmap(first_byte_code);
+      if (error_bitmap)
+      {
+        dspl_show_bitmap(x,y,error_bitmap,SHOWBITMAP_INVERT);
+            x += error_bitmap->width;
+      }
+      second_byte_code = (USHORT)((*txt)>>8);
+      error_bitmap = get_bitmap(second_byte_code);
+      if (error_bitmap)
+      {
+        dspl_show_bitmap(x,y,error_bitmap,SHOWBITMAP_INVERT);
+            x += error_bitmap->width;
+      }
+    }
+    else
+    {
+      dspl_show_bitmap(x,y,current_bitmap,SHOWBITMAP_NORMAL);
+          x += current_bitmap->width;
+    }
+      txt++;
+  }
+
+}
+
+
+#ifndef DSAMPLE_COLOUR
+//Should work for DSAMPLE_LITE
+void dspl_show_bitmap(int x,int y,t_font_bitmap* current_bitmap,U32 attr )
+{
+ 	USHORT i, j,a,b;
+	int bmpWidthBytes;
+	bmpWidthBytes = (current_bitmap->width + 0x07) >> 3;
+
+	for (i = 0; i < current_bitmap->height; i++)
+    	for (j = 0; j < current_bitmap->width; j++)
+ 		{
+			a = (j&(0x07));
+			b = i*(bmpWidthBytes)+((j&0xF8)>>3);
+			if ((attr & SHOWBITMAP_SCALE_2x4) == 0)
+			{
+				if ((attr & SHOWBITMAP_NORMAL_MASK) == SHOWBITMAP_NORMAL)
+					scrPoint(x+j,y+i,current_bitmap->bitmap[b]&(0x80>>a));
+				else
+					scrPoint(x+j,y+i,((UBYTE)~(current_bitmap->bitmap[b]))&(0x80>>a));
+			}
+			else
+			{
+				int x1,y1;
+				int px = (current_bitmap->bitmap[b]&(0x80>>a));
+				for (x1 = x+j*2;x1 < x+j*2+2; x1++)
+					for (y1 = y+i*4; y1<y+i*4+4; y1++)
+						scrPoint(x1,y1,px);
+			}
+		}
+}
+
+#endif
+
+#ifdef DSAMPLE_COLOUR
+void dspl_show_bitmap(int x,int y,t_font_bitmap* current_bitmap,U32 attr )
+{
+	int i, j;
+	int bmpByte;		// which byte in bitmap we are looking at
+	UBYTE bmpMask;		// which bit in the (b+w) bitmap we are looking at
+	UBYTE bitSet;		// is the bit set or clear.
+	U32 bitCol;			// colour of bit in a colour bitmap
+	U32 fCol,bCol, col;/*MC SPR 1526*/
+	int step;
+	int lWord;
+
+	if (current_bitmap==NULL)
+		return;
+	switch (current_bitmap->format)
+	{
+	case BMP_FORMAT_BW_UNPACKED:
+	case BMP_FORMAT_BW_PACKED:
+		//b+w bitmap - deal with both packed and unpacked.
+		bmpMask = 0x80;
+		bmpByte = 0;
+		if (attr & SHOWBITMAP_INVERT) //invert
+		{
+			fCol = dspl_GetBgdColour();
+			bCol = dspl_GetFgdColour();
+		}
+		else
+		{
+			fCol = dspl_GetFgdColour();
+			bCol = dspl_GetBgdColour();
+		}
+		if (fCol==bCol)
+		{
+			fCol = 0x000000FF;
+			bCol =0x00FFFF00;
+		}
+		for (i = 0; i < current_bitmap->height; i++)
+		{
+			for (j = 0; j < current_bitmap->width; j++)
+		    {
+				/*	a = (j&(0x07));
+					b = i*((current_bitmap->bitmapSize)/(current_bitmap->height))+((j&0xF8)>>3);
+					bitSet = current_bitmap->bitmap[b]&(0x80>>a);*/
+		    	bitSet = current_bitmap->bitmap[bmpByte]&(bmpMask);
+
+				/*MC SPR 1526*/
+				if (bitSet)
+					col = fCol;
+				else
+					col = bCol;
+				if (col!=TRANSPARENT_32BIT_COLOUR)/*if colour transparent, don't draw point*/
+				{
+					scrPoint(x+j,y+i,col);
+				}
+				/*MC 1526 end*/
+
+				if (bmpMask <= 1)
+				{
+					bmpMask = 0x80;
+					bmpByte++;
+				}
+				else
+					bmpMask = bmpMask >>1;
+			}
+			// If we have an unpacked bitmaps and we are not already on a new byte, we move to a new byte
+			if ((current_bitmap->format == BMP_FORMAT_BW_UNPACKED) && (bmpMask != 0x80))
+			{
+				bmpMask = 0x80;
+				bmpByte++;
+			}
+		}
+		break;
+	case BMP_FORMAT_256_COLOUR:
+	  //bitmap is 256 colour bitmap - ignore 'attr'
+		bmpByte = 0;
+
+		for (i = 0; i < current_bitmap->height; i++)
+		{
+			for (j = 0; j < current_bitmap->width; j++)
+		    {
+		    	UINT32 col;
+		    	UINT32 colR,colG,colB;
+		    	col = current_bitmap->bitmap[bmpByte];
+				if (col!=TRANSPARENT_256_COL)
+				{
+				bitCol = (((col &0xE0)   <<16) |
+						  ((col &0x1C)	<<11) |
+						  ((col &0x03)	<< 6));/**/
+					//assume 16 bit colour
+					scrPoint(x+j,   y+i,bitCol);
+				}
+				bmpByte = bmpByte+1; //move to next byte
+
+			}
+		}
+		break;
+	case BMP_FORMAT_32BIT_COLOUR:
+	  //bitmap is a 32 bit colour bitmap - ignore 'attr'
+		bmpByte = 0;
+		for (i = 0; i < current_bitmap->height; i++)
+		{
+			for (j = 0; j < current_bitmap->width; j++)
+		    {
+		    	//32 bit bitmap - data is in bytes
+				//bmpByte = (i*current_bitmap->width+j)*4;
+				bitCol = ((current_bitmap->bitmap[bmpByte]   	<<24) |
+						(current_bitmap->bitmap[bmpByte+1]	<<16) |
+						(current_bitmap->bitmap[bmpByte+2]	<<8)  |
+						(current_bitmap->bitmap[bmpByte+3]));
+		    	if ((bitCol & 0xFF000000)!=TRANSPARENT_32BIT_COLOUR)
+					scrPoint(x+j,y+i,bitCol);
+				bmpByte = bmpByte+4; //move to next 32bit word
+			}
+		}
+		break;
+	case BMP_FORMAT_16BIT_LCD_COLOUR:				 //32 bits only first 2 bytes used
+	case BMP_FORMAT_16BIT_LCD_COMPRESSED_COLOUR: //16 bits
+		bmpByte = 0;
+		if (current_bitmap->format == BMP_FORMAT_16BIT_LCD_COMPRESSED_COLOUR)
+			step = 2;
+		else
+			step = 4;
+		for (i = 0; i < current_bitmap->height; i++)
+		{
+			for (j = 0; j < current_bitmap->width; j++)
+		    {
+		    	//32 bit bitmap - data is in bytes
+				//bmpByte = (i*current_bitmap->width+j)*4;
+				bitCol = ((current_bitmap->bitmap[bmpByte+1]     <<8) |
+						(current_bitmap->bitmap[bmpByte]));
+		    	if ((bitCol & 0x0000FFFF)!=TRANSPARENT_16BIT_COL)
+		    	{
+
+					lWord = DSPL_GET_LWORD(x+j,y+i);
+//	July 1, 2005 REF: CRR 32677 - xpradipg
+//	The data present of all 16bit images are in the negated format hence we 
+//    renegate to get it in the right format
+#if (defined(ISAMPLE) ||defined(CALLISTO))
+					bitCol = ~bitCol;
+#endif
+		    		DSPL_SET_BITCOLOUR(x+j,lWord,bitCol,"dsplShowbitmap");
+}
+		    	bmpByte = bmpByte+step; //move to next 32/16bit word
+			}
+		}
+
+		break;
+	default: //Unknown format
+		break;
+	}
+}
+#endif
+
+
+#define NO_COLOUR 0xFF123456
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr             |
+| STATE   : code                        ROUTINE : dspl_setBorderWidth  |
++--------------------------------------------------------------------+
+
+  PURPOSE : sets current border width
+
+GW 10/02/03 SPR#1721 - Created
+*/
+static int txtBorder=0;
+int dspl_setBorderWidth(int borderSize)
+{
+	int oldBorder;
+	oldBorder = txtBorder;
+	if ((borderSize >=0) && (borderSize <=4))
+		txtBorder = borderSize;
+	return (oldBorder);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr             |
+| STATE   : code                        ROUTINE : dspl_getBorderWidth   |
++--------------------------------------------------------------------+
+
+  PURPOSE : returns current border width
+
+GW 10/02/03 SPR#1721 - Created
+
+*/
+int dspl_getBorderWidth(void)
+{
+	return(txtBorder);
+}
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr             |
+| STATE   : code                        ROUTINE : scrCharBorderOutput  |
++--------------------------------------------------------------------+
+
+  PURPOSE : draw text with a border
+
+GW 10/02/03 SPR#1721 - Created
+*/
+void scrCharBorderOutput(t_font_bitmap* chrBmp,
+						unsigned int fgdCol,unsigned int bgdCol,unsigned int borderCol,
+						int bWidth,
+						int px,int py
+						)
+{
+	int x,y,i;
+	int line[10];
+	int ofs;
+	int bgdLine;
+	int col;
+	int emask,pmask;
+	int init_emask = (0x01 << (28+bWidth));
+	int init_pmask = (0x01 << (28+bWidth));
+/*
+
+*/
+	for (i=0;i<10;i++)
+		line[i] = 0;
+
+	//trace("col=",fgdCol, bgdCol,borderCol,0x13);
+
+	//set up border mask
+	for (i=1;i<bWidth*2;i++)
+	{
+		init_emask = init_emask |  (init_pmask >> i) |  (init_pmask << i);
+	}
+	//trace("masks=",init_emask,init_pmask,0,0x12);
+
+	for (y=-bWidth;y<chrBmp->height+bWidth;y++)
+	{
+		//trace("y,ht,bWidth",y,chrBmp->height,bWidth, 0x03);
+		for (i=0;i<bWidth*2;i++)
+			line[i]=line[i+1];
+		line[bWidth*2] =0;
+
+		if (y+bWidth<chrBmp->height)
+		{
+			//work out where we want to display background
+			bgdLine = 0x0FFFFFF0;
+			bgdLine = bgdLine & (bgdLine << (24-chrBmp->width));
+			//Assume bitmaps are unpacked
+			switch((chrBmp->width+7) & (0xF8))
+			{
+			case 0x00:	//no data
+					break;
+			case 0x08: // 1 byte/char
+				ofs = y+bWidth;
+				line[bWidth*2] = ((unsigned int)chrBmp->bitmap[ofs]) << 20;
+				break;
+			case 0x10: // 2 bytes/char
+				ofs = (y+bWidth)*2;
+				line[bWidth*2] = (((unsigned int)chrBmp->bitmap[ofs]) << 20) |
+								(((unsigned int)chrBmp->bitmap[ofs+1]) << 12) ;
+				break;
+			case 0x18: // 3 bytes/char
+				ofs = (y+bWidth)*3;
+				line[bWidth*2] = (((unsigned int)chrBmp->bitmap[ofs]) << 20) |
+								(((unsigned int)chrBmp->bitmap[ofs+1]) << 12)  |
+								(((unsigned int)chrBmp->bitmap[ofs+2]) << 4) ;
+				break;
+			default:// unable to handle bitmaps > 24 pixels wide
+				//output checkerboard pattern as an error
+				if (y &0x01)
+					line[bWidth*2] = 0x0CCCCCC0;
+				else
+					line[bWidth*2] = 0x05555550;
+				break;
+			}
+		}
+		else
+		{
+			line[bWidth*2] = 0x00000000;
+			bgdLine = 0x00;
+		}
+		//trace("line=",line[0],line[1], line[2], 0x13);
+
+		emask = init_emask; // if any of the 3 pixels are set - erase point
+		pmask = init_pmask; // only when pixel is set - plot point.
+
+		for (x=-bWidth;x<chrBmp->width+bWidth;x++)
+		{
+			col = NO_COLOUR;
+			if (line[bWidth] & pmask)
+			{
+				//pixel is in fgd colour
+				col = fgdCol;
+			}
+			else
+			{
+				for (i=0;i<bWidth*2+1;i++)
+				{
+					if (line[i] & emask)
+						col = borderCol;
+				}
+				if ((bgdLine & pmask) && (col == NO_COLOUR))
+				{
+					col = bgdCol;
+				}
+			}
+			if ((col != NO_COLOUR) && (col != TRANSPARENT_32BIT_COLOUR))
+				scrPoint(px+x,py+y,col);
+			emask = emask>>1;
+			pmask = pmask>>1;
+//			trace("masks=",emask,pmask,col,0x13);
+		}
+	}
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr             |
+| STATE   : code                        ROUTINE : scrFastCharOutput    |
++--------------------------------------------------------------------+
+
+  PURPOSE : draw text avoiding using scrPoint
+
+GW 10/02/03 SPR#1736 - Created
+*/
+#ifdef DSAMPLE_COLOUR
+
+void scrFastCharOutput(t_font_bitmap* chrBmp,
+						unsigned int fColconv,unsigned int bColconv,
+						int x,int y
+						)
+{
+	int fHeight = dspl_GetFontHeight();
+	int ofs = chrBmp->height - fHeight;
+	int width = chrBmp->width;
+	int i,j,k = 0;
+	int sx,sy,ex,ey,lWord;
+	int bitSet;
+	UBYTE mask;
+	int ofsj,nbytes;
+	unsigned int col;
+	//ensure that the data is never wiritten 'off-screen'
+	if (x+width > win_x2)
+		ex = win_x2-x;
+	else
+		ex = width;
+	if (y+fHeight > win_y2)
+		ey = win_y2-y;
+	else
+		ey = fHeight;
+	if (x < win_x1)
+		sx = win_x1-x;
+	else
+		sx = 0;
+	if (y < win_y1)
+		sy = win_y1-y;
+	else
+		sy = 0;
+
+	nbytes = (width+7) >>3;
+	ofs = ofs + sy;
+	for (i=sy;i<ey;i++)
+	{
+		mask = 0x80 >> (sx & 0x07);
+		ofsj = sx >> 3;
+		for (j=sx;j<ex;j++)
+		{
+			//Have we data for the bitmap ?. If not, output a blank line.
+			if (ofs >=0)
+				bitSet = chrBmp->bitmap[ofs*nbytes+ofsj]&(mask);
+			else
+				bitSet = 0;
+
+			if (bitSet)
+				col = fColconv;
+			else
+				col = bColconv;
+			if (col!=TRANSPARENT_32BIT_COLOUR)
+			{
+			    lWord = DSPL_GET_LWORD(j+x,i+y);
+			    DSPL_SET_BITCOLOUR(j+x,lWord,col,"scrFastCharOutput");
+			}
+			mask = mask >> 1;
+			if (mask==0)
+			{
+				ofsj++;
+				mask = 0x80;
+			}
+		}
+		ofs++;
+	}
+}
+#endif
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr              |
+| STATE   : code                        ROUTINE : scrCharOutput        |
++--------------------------------------------------------------------+
+
+  PURPOSE : draw text
+
+GW 10/02/03 SPR#1736 - Created
+*/
+void scrCharOutput(t_font_bitmap* chrBmp,
+						unsigned int fCol,unsigned int bCol,
+						int x,int y,
+						int wChar, int hChar
+						)
+{
+	int fHeight = dspl_GetFontHeight();
+	int ofs = chrBmp->height - fHeight;
+	int width = chrBmp->width;
+	int i,j,k = 0;
+	int bitSet;
+	UBYTE mask;
+	int ofsj,nbytes;
+	unsigned int col;
+	int shiftj;
+	ofs = chrBmp->height - fHeight;
+	width = chrBmp->width;
+	k = 0;
+	for (i=0;i<fHeight;i++)
+	{
+		k = 0;
+		nbytes = (width+7) >>3;
+		for (j=0;j<width;j++)
+		{
+			shiftj= j & 0x07;
+			ofsj = j >> 3;
+			//Have we data for the bitmap ?. If not, output a blank line.
+			if (ofs >=0)
+				bitSet = chrBmp->bitmap[ofs*nbytes+ofsj]&(0x80>>shiftj);
+			else
+				bitSet = 0;
+
+			if (bitSet)
+				col = fCol;
+			else
+				col = bCol;
+			if (col!=TRANSPARENT_32BIT_COLOUR)
+			{
+				if (!hChar)
+					scrPoint(k+x,i+y,col);
+				else
+				{
+					scrPoint(k+x,i*2+y,col);
+					scrPoint(k+x,i*2+1+y,col);
+				}
+				if (wChar)
+				{
+					if ((j>=1) && (j<=wChar))
+					{	//for j=1,2,3 - plot 2 pixels
+						k++;
+						if (!hChar)
+							scrPoint(k+x,i+y,col);
+						else
+						{
+							scrPoint(k+x,i*2+y,col);
+							scrPoint(k+x,i*2+1+y,col);
+						}
+					}
+				}
+			}
+			k++;
+		}
+		ofs++;
+	}
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr              |
+| STATE   : code                        ROUTINE : dspl_ScrText         |
++--------------------------------------------------------------------+
+
+  PURPOSE : draw a line of ascii/unicode text
+
+GW 18/09/01 - Made invert flag local to file not procedure
+GW 10/02/03 SPR#1721	Added code to call separate procedure if a border is required.
+						Removed existing 'border' code.
+GW 14/02/03 SPR#1736 - Split code into separate procedures
+						Modified error display code to output ascii characters of the code if no
+						matching bitmap is found.
+*/
+void dspl_ScrText (int x, int y, char *txt, int style)
+{
+	int nChar = 0;
+    int i, j, k;
+	t_font_bitmap* chrBmp;
+	t_font_bitmap* errBmp[2] = {NULL,NULL};
+	int str1, str2;
+	int border = 0;
+	int shadow = 0;
+	int fHeight;
+	int wChar,hChar,shadowHt;
+	unsigned int fCol,bCol,borderCol,shadowCol,fColconv,bColconv;
+	unsigned int col;
+	int startX;
+    USHORT code;
+
+	startX = x;
+	shadowCol = 0;
+	borderCol = 0;
+	border = dspl_getBorderWidth();
+	//default to wide chars (for the moment)
+	if (style & TXT_STYLE_WIDECHAR)
+		wChar = 3;
+	else
+		wChar = 0;
+	if (style & TXT_STYLE_HIGHCHAR)
+		hChar = 1;
+	else
+		hChar = 0;
+
+	//Set-up default colours
+	fCol = dspl_GetFgdColour();
+	bCol = dspl_GetBgdColour();
+	switch (style & TXT_STYLE_MASK)
+    {
+	case TXT_STYLE_NORMAL:	//Normal
+	default:
+		break;
+	case TXT_STYLE_INVERT:	//Invert
+		fCol = dspl_GetBgdColour();
+		bCol = dspl_GetFgdColour();
+		break;
+	case TXT_STYLE_HIGHLIGHT:	//highlight - colour background of selected item in differently.
+		bCol = dspl_GetHighlightColour();
+		break;
+	case TXT_STYLE_BORDER:	// 1 pixelborder
+		if (border==0)
+			border = 1;
+		break;
+	case TXT_STYLE_2PIXEL_BORDER:	// 2 pixelborder
+		if (border==0)
+			border = 2;
+		break;
+	case TXT_STYLE_3PIXEL_BORDER:	// 3 pixelborder
+		if (border==0)
+			border = 3;
+		break;
+	case TXT_STYLE_4PIXEL_BORDER:	// 4 pixelborder
+		if (border==0)
+			border = 4;
+		break;
+	case TXT_STYLE_SHADOW1: //shadow
+		shadow = 1;
+		break;
+	case TXT_STYLE_SHADOW2: //deeper shadow
+		shadow = 2;
+		break;
+	}
+
+	if (fCol==bCol)
+	{
+		fCol = 0x00FF0000;
+		bCol = 0x0000FFFF;
+	}
+	if (border)
+	{
+		borderCol = dspl_GetBorderColour();
+		if (borderCol == fCol)
+		{	//A border colour the same as the text colour - get a contrasting colour
+			borderCol = dspl_GetContrastColour(fCol);
+		}
+	}
+	else
+		borderCol = 0;
+
+	if (shadow)
+		shadowCol = dspl_GetShadowColour();
+	else
+		shadowCol = 0;
+
+	//	SH - modified because it doesn't allow text to start off the screen
+	// GW - allow text to start off-screen but finish if completely off-screen
+    if (y > scrY)
+        return;
+	if (txt ==NULL)
+		return;
+
+	fHeight = dspl_GetFontHeight();
+	if (hChar)
+		shadowHt = fHeight*2;
+	else
+		shadowHt = fHeight;
+
+	//For faster operation - precalculate colours
+#ifdef DSAMPLE_COLOUR
+	if (fCol!=TRANSPARENT_32BIT_COLOUR)
+		fColconv = DSPL_GET_BITCOLOUR(fCol);
+	else
+		fColconv = fCol;
+	if (bCol!=TRANSPARENT_32BIT_COLOUR)
+		bColconv = DSPL_GET_BITCOLOUR(bCol);
+	else
+		bColconv = bCol;
+#endif
+	code = 0xFFFF;
+    while ((code !=0) &&(x <= scrX))
+    {
+    	nChar++;
+	    /*mc SPR 1319*/
+    	if (style &TXT_STYLE_UNICODE)
+    	{
+    		str1 = *txt;
+    		str2 = *(txt+1);
+    		code = ((str1<<8)&0xFF00) | (str2&0x00ff);
+    	}
+    	else/*mc end*/
+    	{
+    		str1 = *txt;
+    		str2 = 0x00;
+    		/*SPR 1508, convert ASCII char to unicode before drawing it*/
+    		code = translation_ascii_2_unicode[*txt];
+    	}
+    	if (code != 0)
+		{
+			chrBmp = get_bitmap(code);
+			if (chrBmp == NULL)
+			{
+				errBmp[0] = get_bitmap(str1);
+				errBmp[1] = get_bitmap(str2);
+			}
+#ifdef MMI_TRACE
+			{
+				char bfr[40];
+				if ((chrBmp==NULL) || (chrBmp->code==0xFFFF))
+				{
+					sprintf(bfr,"Undefined bitmap for 0x%04X",code);
+					mmi_trace(bfr);
+				}
+			}
+#endif
+		}
+    	else //end of string reached
+			chrBmp =NULL;
+		if (chrBmp != NULL)
+		{
+			if (border)
+			{
+				scrCharBorderOutput(chrBmp,fCol,bCol,borderCol,border,x,y);
+			}
+#ifdef DSAMPLE_COLOUR
+			else if ((!hChar) && (!wChar))
+			{	//GW 28/11/02 - for speed, don't use 'scrPoint'
+				//NB Code is only correct for a D-sample
+				scrFastCharOutput(chrBmp,fColconv,bColconv,x,y);
+			}
+#endif //DSAMPLE_COLOUR
+			else
+			{
+				scrCharOutput(chrBmp,fCol,bCol,x,y,wChar,hChar);
+			}
+		    x = x + chrBmp->width + wChar; //add 3 for 'wide' chars
+		    //If there is a pixel border between chars at the moment -
+		    x = x+border;
+		}
+		else if (code!=0)
+		{	//We have no bitmap - display ascii equivalent
+			for (i=0;i<2;i++)
+			{	if (errBmp[i]!= NULL)
+				{
+					scrCharOutput(errBmp[i],fCol,bCol,x,y,wChar,hChar);
+				    x = x + errBmp[i]->width + wChar;
+				    errBmp[i] = NULL;
+				}
+			}
+		}
+		/*MC SPR 1319*/
+		if (style &TXT_STYLE_UNICODE)
+			txt+=2;
+		else
+		/*mc end*/
+			txt++;
+	}
+    if (shadow)
+	{
+		for (i=0;i<shadowHt;i++)
+		{
+			for (k=0;k<shadow;k++)
+				scrPoint(x+k,i+y+k,shadowCol);
+		}
+		for (j=startX;j<x;j++)
+		{
+			for (k=0;k<shadow;k++)
+				scrPoint(j+1+k,shadowHt+y+k, shadowCol);
+		}
+	}
+#ifdef MMI_TRACE
+
+	{
+		char bfr[40];
+		sprintf(bfr,"Nchr=%d (%d,%d)",nChar,x,y);
+		mmi_trace(bfr);
+	}
+#endif
+}
+
+
+void scrText (int x, int y, char *txt)
+{
+	//Display non-inverted text
+	dspl_ScrText (x,y, txt, TXT_STYLE_NORMAL);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrText_Invert_Unicode|
++--------------------------------------------------------------------+
+
+  PURPOSE : draw text inverted
+
+*/
+
+void scrText_Invert_Unicode (int x, int y, USHORT *txt)
+{
+  UBYTE current_width=0;
+  USHORT current_code,first_byte_code,second_byte_code;
+  t_font_bitmap* current_bitmap,*error_bitmap;
+    if (x < 0 || y < 0 || y + 12 > scrY)
+        return;
+
+
+
+    while ((*txt) && (x + current_width <= scrX))
+    {
+    current_code = (USHORT)((*txt)<<8)+(USHORT)((*txt)>>8);/*The USHORT is inverted, therefore we have to apply this simple change*/
+    current_bitmap = get_bitmap(current_code);
+		if (!current_bitmap)	/*ASCII codes will be represented*/
+    {
+      first_byte_code = (USHORT)((*txt)&0xFF);
+      error_bitmap = get_bitmap(first_byte_code);
+      if (error_bitmap)
+      {
+        dspl_show_bitmap(x,y,error_bitmap,SHOWBITMAP_INVERT);
+            x += error_bitmap->width;
+      }
+      second_byte_code = (USHORT)((*txt)>>8);
+      error_bitmap = get_bitmap(second_byte_code);
+      if (error_bitmap)
+      {
+        dspl_show_bitmap(x,y,error_bitmap,SHOWBITMAP_INVERT);
+            x += error_bitmap->width;
+      }
+
+    }
+    else
+    {
+      dspl_show_bitmap(x,y,current_bitmap,SHOWBITMAP_INVERT);
+          x += current_bitmap->width;
+    }
+      txt++;
+  }
+
+}
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrText_Invert     |
++--------------------------------------------------------------------+
+
+  PURPOSE : draw text inverted
+
+*/
+
+void scrText_Invert (int x, int y, char *txt)
+{
+	//Display inverted text
+	dspl_ScrText (x,y, txt, TXT_STYLE_INVERT);
+}
+
+
+EXTERN UBYTE   dspl_str_length(char * str)
+{
+  UBYTE count=0;
+  USHORT* current;
+
+  if (dspl_get_char_type() == DSPL_TYPE_ASCII)
+        return (strlen(str));
+  else
+  {
+    current = (USHORT*) str;
+    while (*current)
+    {
+      count++;
+      current++;
+    }
+    return count;
+  }
+}
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrLine            |
++--------------------------------------------------------------------+
+
+  PURPOSE : draw line
+
+*/
+
+void scrLine (int x1, int y1, int x2, int y2)
+{
+    int x, y, dx, dy, c1, c2, err, swap = 0;
+	U32 fCol;
+
+    if (x1 < 0 || x1 >= scrX || x2 < 0 || x2 >= scrX ||
+        y1 < 0 || y1 >= scrY || y2 < 0 || y2 >= scrY)
+        return;
+	fCol = dspl_GetFgdColour();
+    dx = x2 - x1; dy = y2 - y1;
+    if (((dx < 0) ? -dx : dx) < ((dy < 0) ? -dy : dy))
+    {
+        swap = 1;                       /* take the long way        */
+        x = x1; x1 = y1; y1 = x;
+        x = x2; x2 = y2; y2 = x;
+    }
+    if (x1 > x2)
+    {
+        x = x1; x1 = x2; x2 = x;        /* always move to the right */
+        y = y1; y1 = y2; y2 = y;
+    }
+
+    dx = x2 - x1; dy = y2 - y1;
+    c1 = dy * 2; dy = 1;
+    if (c1 < 0)
+    {
+        c1 = -c1;
+        dy = -1;
+    }
+    err = c1 - dx; c2 = err - dx;
+    x = x1; y = y1;
+    while (x <= x2)
+    {
+        scrPoint(swap?y:x,swap?x:y,fCol);
+        x++;
+        if (err < 0)
+            err += c1;
+        else
+        {
+            y += dy;
+            err += c2;
+        }
+    }
+
+    if (internal)
+        return;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrRect            |
++--------------------------------------------------------------------+
+
+  PURPOSE : draw rectangle
+
+*/
+
+void scrRect (int px, int py, int sx, int sy)
+{
+    internal = 1;
+    scrLine(px,py,px+sx,py);
+    scrLine(px,py+sy,px+sx,py+sy);
+    scrLine(px,py,px,py+sy);
+    internal = 0;
+    scrLine(px+sx,py,px+sx,py+sy);
+}
+
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrFntSelect       |
++--------------------------------------------------------------------+
+
+  PURPOSE : select the current font
+
+*/
+
+int scrFntSelect (int font)
+{
+    return 1;                           /* always OK                */
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrFntHeight       |
++--------------------------------------------------------------------+
+
+  PURPOSE : get height of current font
+
+*/
+
+int scrFntHeight (void)
+{
+#ifdef LSCREEN
+	return 16;
+#endif
+
+  if (dspl_char_type == DSPL_TYPE_ASCII)
+    return 8;
+  else
+    return 12;
+}
+
+
+
+//Really get information about
+//	(1) how many chars we can have on a line
+//  (2) how many pixels are in a string
+//GW SPR#1721 - Include a border in the calculations
+int scrGetRealLength(char *str, int* totChar, int* totPixel)
+{
+	int nChar=0;
+	int nPixel=0;
+	int maxChar,maxPixel;
+	t_font_bitmap* bmp;
+	int strEnd;
+	USHORT str16,str1,str2;
+	UBYTE current_display_char_type = dspl_char_type;/*mc SPR 1319*/
+	int border;
+
+	//Calculate extra pixels allowed for the border
+	border = dspl_getBorderWidth();
+
+	if (*totChar<=0) //assume full str required.
+		maxChar = 256; //stop after 256 chars
+	else
+		maxChar = *totChar; //stop after 256 chars
+	if (*totPixel<=0)// assume no limit to len - limit at 2x screen
+		maxPixel = 2*scrX;
+	else
+		maxPixel = *totPixel;
+	strEnd = FALSE;
+	/*MC SPR 1319, char type is unicode if unicode tag*/
+	if(str[0] == 0x80)
+	{	current_display_char_type = DSPL_TYPE_UNICODE;
+		str+=2; /*ignore first char SPR 1442*/
+		nChar+=2;/*MC*/
+	}
+	else /*SPR 1526, assume if no unicode tag, we're in ASCII*/
+		current_display_char_type = DSPL_TYPE_ASCII;
+	/*MC 1526, end*/
+	while (!strEnd)
+	{
+		if (current_display_char_type == DSPL_TYPE_ASCII)
+		{
+			str16 = *str;
+			str++;
+		}
+		else
+		{
+			str1 = *str;
+			str++;
+			str2 = *str;
+			str++;
+			str16 = ((str1 << 8) & 0xFF00) + (str2 & 0x00FF);/*MC, fixed bitmask 1319*/
+
+		}
+		if (str16 == 0)
+		{	//reached end of string.
+			strEnd = TRUE;
+			bmp = NULL;
+		}
+		else
+			bmp = get_bitmap(str16);
+		if (bmp!= NULL)
+		{
+			if (nPixel +bmp->width < maxPixel)
+			{
+				nPixel = nPixel + bmp->width+border;
+				if (current_display_char_type == DSPL_TYPE_ASCII)
+					nChar++;
+				else
+					nChar+=2;
+				if (nChar >= maxChar)
+					strEnd = TRUE;
+			}
+			else
+				strEnd=TRUE;
+		}
+	}
+	*totChar = nChar;
+	*totPixel = nPixel;
+
+	return (nPixel);
+}
+
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrFntGetFit       |
++--------------------------------------------------------------------+
+
+  PURPOSE : number of string chars that fit into the line
+
+*/
+
+
+int scrFntGetFit (char *tp, int lineWidth)
+{
+	int totChar = 0;
+
+//	scrGetRealLength(tp, &totChar, &lineWidth);
+//	return (totChar);
+
+
+  if (dspl_char_type == DSPL_TYPE_ASCII)
+    return (lineWidth /6);
+  else
+      return (lineWidth / 12);
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrFntGetLen       |
++--------------------------------------------------------------------+
+
+  PURPOSE : number of pixel used by first n string chars
+
+*/
+
+
+
+
+int scrFntGetLen(char *tp, int nChars)
+{
+	int lineWidth = 0;
+
+
+  int count=0;
+
+  if (dspl_char_type == DSPL_TYPE_ASCII)
+      return (nChars * 6);
+  else
+  {
+    USHORT* temp = (USHORT*)tp;
+
+    while (*temp)
+    {
+      UBYTE first_byte = (UBYTE)(*temp);
+      if (first_byte)
+        count+=12;
+      else
+        count+=6;
+      temp++;
+    }
+      return count;
+  }
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrBmpDraw         |
++--------------------------------------------------------------------+
+
+  PURPOSE : draw bitmap
+
+*/
+
+int scrBmpDraw (int px, int py, int sx, int sy,
+                    int ix, char *bm, int mode)
+{
+    int i, j;
+    unsigned char m;
+
+    if (px < 0 || px >= scrX || py < 0 || py >= scrY
+                                       || sx < 0 || sy < 0)
+        return 0;
+    if (px + sx > scrX)
+        sx = scrX - px;
+    if (py + sy > scrY)
+        sy = scrY - py;
+
+    m = 0x80;
+    bm += (sx * sy * ix) / 8;
+    for (j = 0; j < sy; j++)
+    {
+        for (i = 0; i < sx; i++)
+        {
+            scrPoint(px+i,py+j,*bm & m);
+            m >>= 1;
+            if (!m)
+            {
+                m = 0x80;
+                bm++;
+            }
+        }
+        if (m != 0x80)
+        {
+            m = 0x80;
+            bm++;
+        }
+    }
+
+    return 0;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrCurType         |
++--------------------------------------------------------------------+
+
+  PURPOSE : set cursor type (0 = no cursor)
+
+*/
+
+void scrCurType (int type)
+{
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrCursor          |
++--------------------------------------------------------------------+
+
+  PURPOSE : set cursor at specified position
+
+*/
+
+void scrCursor (int x, int y)
+{
+    scrLine(x,y+7,x+5,y+7);
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : ti1_scr            |
+| STATE   : code                        ROUTINE : scrPoint           |
++--------------------------------------------------------------------+
+
+  PURPOSE : draw point
+
+*/
+
+//Return colour of pixel at point (px,py) or zero if not on screen.
+static int getScrPoint (int px, int py)
+{
+#ifdef BSAMPLE
+    unsigned char m = 0x80;
+#endif //BSAMPLE
+#ifdef CSAMPLE
+	U32 m2;
+#endif //CSAMPLE
+	int x1,y1;
+	int lWord; // index for colour word
+	U32 opWord; //olour word
+	U32 op_col;
+	U32 picCol;
+
+    if (px < 0 || py < 0 || px >= scrX || py >= scrY)
+        return (0);
+
+#ifdef BSAMPLE
+    m >>= px & 7;                       // mask
+    px >>= 3; // x offset
+	if (displayScr[py][px] & m)
+		return (0x00FFFFFF);
+	else
+		return (0x00000000);
+
+#endif //BSAMPLE
+
+#ifdef CSAMPLE
+    //Display plots data from Right to Left
+    // - reverse x-coordinate
+    //Also display seems to be 16 pixels down the screen -
+    //plot points at y=(y-16) mod 64
+    x1 = (scrX-1)-px;
+    y1 = (py+48) & 63; //(py-16) ;
+    //Display is in columns for TI drivers
+	m2 = 0x80000000;
+    m2 = m2 >> (y1 & 31); //shift m2 by 0-31
+    y1 = y1 >> 5; // 32bits/word
+	return (picture_bw[lWord] & m2);
+#endif //CSAMPLE
+
+#ifdef DSAMPLE_COLOUR
+	//i/p colour is 32 bit - reduce to 16
+    x1 = px;
+    y1 = py;
+    lWord = y1*LCD_ROW_NUM_LWORDS + x1;
+    //GW invert pic bits
+	opWord = ~picture_col[lWord];
+
+	//Change from 16(8) bits to 32(24) bits
+#ifdef DSAMPLE_COLOUR32
+	opWord = opWord & 0x0000FFFF;
+#endif //DSAMPLE_COLOUR32
+#ifdef DSAMPLE_COLOUR16
+#ifdef PIXEL_0_IN_LSW
+	if (lWord & 0x01)
+		opWord = ((opWord >>16) & 0x0000FFFF);
+	else
+		opWord = ((opWord     ) & 0x0000FFFF);
+#else
+	if (lWord & 0x01)
+		opWord = ((opWord     ) & 0x0000FFFF);
+	else
+		opWord = ((opWord >>16) & 0x0000FFFF);
+#endif
+#endif //DSAMPLE_COLOUR16
+	return(DSPL_GET_PIXELCOLOUR(opWord));
+#endif //DSAMPLE_COLOUR
+
+#ifdef DSAMPLE_LITE
+	//i/p colour is 32 bit - reduce to 16
+    {
+    	int xmask;
+    	x1 = px;
+    	y1 = py;
+    	lWord = DSPL_GET_LWORD(x1,y1); //y1*LCD_ROW_NUM_LWORDS + x1 >> 5;
+    	xmask = 0x01 << (x1 & 0x1F);
+    	//GW invert pic bits
+		if (picture_bw[lWord] & xmask)
+			opWord = 0x00FFFFFF;
+		else
+			opWord = 0x00000000;
+		//Change from 16(8) bits to 32(24) bits
+	}
+	return (opWord);
+#endif //DSAMPLE_LITE
+
+}
+
+
+static int checkPixelColour(int px, int py, U32 col)
+{
+	U32 currCol;
+
+	currCol = getScrPoint (px, py);
+	if ((currCol & 0x00F8FCF8) == (col & 0x00F8FCF8))//16bit colour
+		return (1); //colours match
+	else
+		return (0); //colours are different
+}
+
+unsigned int translucence(unsigned int ipCol,unsigned int picCol)
+{
+	int trans1,trans2;
+	U32 col_red1,col_green1,col_blue1;
+	U32 col_red2,col_green2,col_blue2;
+	U32 rmerge,gmerge,bmerge;
+	U32 opCol;
+
+	//0xFF=transparent	(col=picCol)
+	//0x00=solid 		(col=ipCol)
+	trans1 = (ipCol >>24) & 0xFF;
+	trans2 = 255-trans1;
+	if (trans1 == 0x00)
+		return (ipCol);
+	else if (trans1 == 0xFF)
+		return (picCol);
+
+	//Read in colour from 24 bits
+	col_red1  	= (ipCol & 0x00FF0000) >> 8;
+	col_green1	= (ipCol & 0x0000FF00) >> 8;
+	col_blue1	= (ipCol & 0x000000FF);
+
+	//Read in colour from 8 bits
+	col_red2  	= (picCol & 0x00FF0000) >> 8;
+	col_green2	= (picCol & 0x0000FF00) >> 8;
+	col_blue2	= (picCol & 0x000000FF);
+	//red = 0x0000xx00, green = 0x000000xx, blue = 0x000000xx (256x higher than it should be)
+
+	//Round values up
+//	rmerge = (col_red1  *trans1+col_red2  *trans2+0x0FFFF)      & 0x00FF0000;
+//	gmerge = (col_green1*trans1+col_green2*trans2+0x000FF)      & 0x0000FF00;
+//	bmerge =((col_blue1 *trans1+col_blue2 *trans2+0x000FF) >> 8)& 0x000000FF;
+	rmerge = (col_red1  *trans2+col_red2  *trans1+0x1F0000)      & 0x00FF0000;
+	gmerge = (col_green1*trans2+col_green2*trans1+0x001000)      & 0x0000FF00;
+	bmerge =((col_blue1 *trans2+col_blue2 *trans1+0x001000) >> 8)& 0x000000FF;
+
+	opCol = rmerge|gmerge|bmerge;
+	return (opCol);
+}
+
+
+#ifdef BSAMPLE
+static void scrPoint (int px, int py, int col)
+{
+    unsigned char m = 0x80;
+
+    //GW Do not plot if outside of the defined window
+    if (px < win_x1 || py < win_y1 || px >= win_x2 || py >= win_y2)
+        return;
+
+    m >>= px & 7;                       // mask
+    px >>= 3;                           // x offset
+
+    if (col)
+		displayScr[py][px] |= m;
+    else
+    	displayScr[py][px] &= (UBYTE) ~m;
+}
+#endif //BSAMPLE
+
+#ifdef CSAMPLE
+static void scrPoint (int px, int py, int col)
+{
+	U32 m2;
+	int x1,y1;
+	int lWord; // index for colour word
+    if (px < win_x1 || py < win_y1 || px >= win_x2 || py >= win_y2)
+        return;
+    //Display plots data from Right to Left
+    // - reverse x-coordinate
+    //Also display seems to be 16 pixels down the screen -
+    //plot points at y=(y-16) mod 64
+    x1 = (scrX-1)-px;
+    y1 = (py+48) & 63; //(py-16) ;
+    //Display is in columns for TI drivers
+	m2 = 0x80000000;
+    m2 = m2 >> (y1 & 31); //shift m2 by 0-31
+    y1 = y1 >> 5; // 32bits/word
+    lWord = x1*LCD_COL_NUM_LWORDS+y1;
+	if (col)
+		picture_bw[lWord] |= m2;
+	else
+		picture_bw[lWord] &= (U32)(~m2);
+}
+#endif //CSAMPLE
+
+#ifdef DSAMPLE_COLOUR
+void scrPoint (int px, int py, int col)
+{
+	int lWord; // index for colour word
+	U32 bitCol;
+	//i/p colour is 32 bit
+    if (px < win_x1 || py < win_y1 || px >= win_x2 || py >= win_y2)
+        return;
+    lWord = DSPL_GET_LWORD(px,py);
+	bitCol = DSPL_GET_BITCOLOUR(col);
+
+    DSPL_SET_BITCOLOUR(px,lWord,bitCol,"plot");
+}
+#endif //DSAMPLE_COLOUR
+
+#ifdef DSAMPLE_LITE
+void scrPoint (int px, int py, int col)
+{
+	int m_px;
+	int word ;
+	//i/p colour is 32 bit
+    if (px < win_x1 || py < win_y1 || px >= win_x2 || py >= win_y2)
+        return;
+
+	m_px = 1 << (px & 0x1F);
+	word = DSPL_GET_LWORD(px,py);
+	if (col)
+		picture_bw[word] = picture_bw[word] | m_px;
+	else
+		picture_bw[word] = picture_bw[word] & (~m_px);
+}
+#endif //DSAMPLE_LITE
+
+
+
+/*******************************************************************
+ *                                                                 *
+ * PART III: LCD Simulation for Windows                            *
+ *                                                                 *
+ *******************************************************************/
+#if defined (WIN32)
+
+#define LCDE_COL 20
+#define LCDE_ROW 4
+static int screensize_x = 16;	
+static int screensize_y = 4;
+
+#define NULL_TERM   '\0'  /* string termination                   */
+
+static CHAR lcd_screen [LCDE_ROW+2][LCDE_COL+3];
+static CHAR cursor_line[LCDE_COL+3];
+
+static int lcd_cursX, lcd_cursY, lcd_enabled = FALSE;
+
+LOCAL void LCD_Refresh (void)
+{
+  int i;
+  CHAR buf[100];
+
+  for (i=0; i<screensize_y+2; i++)
+  {
+    sprintf (buf, "~LCD~%s", &lcd_screen[i][0]);
+#if defined NEW_FRAME
+    vsi_o_ttrace (0, 0xffff, buf);
+#else
+#endif
+    if (lcd_cursY+1 EQ i)
+    {
+      cursor_line[lcd_cursX+1] = '^';
+      sprintf (buf, "~LCD~%s", cursor_line);
+#if defined NEW_FRAME
+      vsi_o_ttrace (0, 0xffff, buf);
+#else
+#endif
+      cursor_line[lcd_cursX+1] = ' ';
+    }
+    else
+    {
+      if (i < screensize_y+1)
+      {
+        sprintf (buf, "~LCD~%s", cursor_line);
+#if defined NEW_FRAME
+        vsi_o_ttrace (0, 0xffff, buf);
+#else
+#endif
+      }
+    }
+  }
+}
+
+GLOBAL void LCD_Enable (int on)
+{
+  lcd_enabled = (on EQ 1);
+}
+
+GLOBAL void LCD_Clear (void)
+{
+  int r, c;
+
+  if (lcd_enabled)
+  {
+    lcd_cursX = lcd_cursY = 0;
+
+    for (r=1; r<screensize_y+1; r++)
+      for (c=1; c<screensize_x+1; c++)
+        lcd_screen[r][c] = ' ';
+
+    LCD_Refresh ();
+  }
+}
+
+GLOBAL void LCD_Reset (void)
+{
+  int r, c, i;
+
+  memset (cursor_line, ' ', screensize_x+3);
+  cursor_line[0] = cursor_line[screensize_x+1] = '|';
+  cursor_line[screensize_x+2] = NULL_TERM;
+
+  for (r=1; r < screensize_y+1; r++)
+  {
+    lcd_screen[r][0] = '|';
+    lcd_screen[r][screensize_x+1] = '|';
+  }
+  for (c=1; c < screensize_x+1; c++)
+  {
+    lcd_screen[0][c] = '-';
+    lcd_screen[screensize_y+1][c] = '-';
+  }
+
+  lcd_screen[0][0]                 = '+';
+  lcd_screen[screensize_y+1][0]         = '+';
+  lcd_screen[0][screensize_x+1]         = '+';
+  lcd_screen[screensize_y+1][screensize_x+1] = '+';
+
+  for (i=0; i<screensize_y+2; i++)
+    lcd_screen [i][screensize_x+2] = NULL_TERM;
+
+  lcd_enabled = TRUE;
+
+  LCD_Clear ();
+
+  lcd_enabled = FALSE;
+}
+
+GLOBAL void LCD_WriteString (int row, int col, CHAR *s)
+{
+  if (s == NULL)
+  {
+    TRACE_EVENT("LCD_WriteString got NULL Pointer as Text");
+    return;
+  }
+  if (lcd_enabled)
+  {
+    int len = strlen (s);
+
+    if (row < screensize_y AND col < screensize_x)
+    {
+      if ((col + len) > screensize_x)
+      {
+        /* clip the string */
+        s[(len = screensize_x-col)] = NULL_TERM;
+      }
+      memcpy (&lcd_screen[row+1][col+1], s, len);
+      LCD_Refresh ();
+    }
+  }
+}
+
+GLOBAL void LCD_Cursor (int row, int col)
+{
+  if (lcd_enabled)
+  {
+    if (row < screensize_y AND col < screensize_x)
+    {
+      lcd_cursY = row;
+      lcd_cursX = col;
+      LCD_Refresh ();
+    }
+  }
+}
+
+GLOBAL void LCD_SetPower (void)
+{
+}
+
+GLOBAL void LCD_PixBlt (int x, int y, int w, int h, char *bmp)
+{
+}
+
+/*
+ * Stimulation of the lcd driver
+ */
+GLOBAL void lcd_test (UBYTE mode)
+{
+  TRACE_EVENT ("Display Redirection activated");
+  mtkEnabled = mode;
+  scrInit();
+  if (mtkEnabled EQ 2)
+  {
+    scrY = 64;
+ }
+}
+#endif /* WIN32 */
+
+
+#endif /* MMI != 0 */