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

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                                uC/GUI
  4. *                        Universal graphic software for embedded applications
  5. *
  6. *                       (c) Copyright 2002, Micrium Inc., Weston, FL
  7. *                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
  8. *
  9. *              礐/GUI is protected by international copyright laws. Knowledge of the
  10. *              source code may not be used to write a similar product. This file may
  11. *              only be used in accordance with a license and should not be redistributed
  12. *              in any way. We appreciate your understanding and fairness.
  13. *
  14. ----------------------------------------------------------------------
  15. File        : LCDPage1bpp.C
  16. Purpose     : Driver for page-organized LCD-controllers with 1bpp
  17. ----------------------------------------------------------------------   
  18. Version-Date---Author-Explanation                                        
  19. ----------------------------------------------------------------------   
  20. 1.00.08 020820 JE     a) Optimized:
  21.                          _DrawBitLine1BPP, _DrawBitLine8BPP
  22. 1.00.06 020814 JE     a) Support for PCF8535 added
  23. 1.00.04 020510 JE     a) Bugfix in LCD_L0_FillRect
  24. 1.00.02 020425 JE     a) LCD_WRITEM_A1 used in optimized routines
  25. 1.00.02 020424 JE     a) Optimized routines added:
  26.                          _DrawBitLine1BPP, LCD_L0_DrawHLine
  27.                          LCD_L0_DrawVLine, LCD_L0_FillRect
  28. 1.00.00 020422 JE     a) First release
  29. ---------------------------END-OF-HEADER------------------------------
  30. */
  31. #include <string.h>           /* memset */
  32. #include "LCD_Private.h"      /* private modul definitions & config */
  33. #include "GUI_Private.h"
  34. #include "GUIDebug.h"
  35. #include "LCD_0.h"            /* Defines for first display */
  36. #if (LCD_CONTROLLER == 8811) || (LCD_CONTROLLER == 8535)
  37.     && (!defined(WIN32) | defined(LCD_SIMCONTROLLER))
  38. /*********************************************************************
  39. *
  40. *       Defines
  41. *
  42. **********************************************************************
  43. */
  44. #ifndef LCD_INIT_CONTROLLER
  45.   #define LCD_INIT_CONTROLLER()
  46. #endif
  47. #ifndef LCD_OPTIMIZE
  48.   #define LCD_OPTIMIZE 1
  49. #endif
  50. #ifndef LCD_CACHE
  51.   #define  LCD_CACHE 1
  52. #endif
  53. /*********************************************
  54. *
  55. *       Macros for MIRROR_, SWAP_ and LUT_
  56. *
  57. **********************************************
  58. */
  59. #if (!defined (LCD_LUT_COM) && !defined(LCD_LUT_SEG))
  60.   #if   (!LCD_MIRROR_X && !LCD_MIRROR_Y && !LCD_SWAP_XY) 
  61.     #define LOG2PHYS_X(x, y) (x)
  62.     #define LOG2PHYS_Y(x, y) (y)
  63.   #elif (!LCD_MIRROR_X && !LCD_MIRROR_Y &&  LCD_SWAP_XY) 
  64.     #define LOG2PHYS_X(x, y) (y)
  65.     #define LOG2PHYS_Y(x, y) (x)
  66.   #elif (!LCD_MIRROR_X &&  LCD_MIRROR_Y && !LCD_SWAP_XY) 
  67.     #define LOG2PHYS_X(x, y) (x)
  68.     #define LOG2PHYS_Y(x, y) (LCD_YSIZE - 1 - (y))
  69.   #elif (!LCD_MIRROR_X &&  LCD_MIRROR_Y &&  LCD_SWAP_XY) 
  70.     #define LOG2PHYS_X(x, y) (LCD_YSIZE - 1 - (y))
  71.     #define LOG2PHYS_Y(x, y) (x)
  72.   #elif ( LCD_MIRROR_X && !LCD_MIRROR_Y && !LCD_SWAP_XY) 
  73.     #define LOG2PHYS_X(x, y) (LCD_XSIZE - 1 - (x))
  74.     #define LOG2PHYS_Y(x, y) (y)
  75.   #elif ( LCD_MIRROR_X && !LCD_MIRROR_Y &&  LCD_SWAP_XY) 
  76.     #define LOG2PHYS_X(x, y) (LCD_YSIZE - 1 - (y))
  77.     #define LOG2PHYS_Y(x, y) (x)
  78.   #elif ( LCD_MIRROR_X &&  LCD_MIRROR_Y && !LCD_SWAP_XY) 
  79.     #define LOG2PHYS_X(x, y) (LCD_XSIZE - 1 - (x))
  80.     #define LOG2PHYS_Y(x, y) (LCD_YSIZE - 1 - (y))
  81.   #elif ( LCD_MIRROR_X &&  LCD_MIRROR_Y &&  LCD_SWAP_XY) 
  82.     #error This combination of mirroring/swapping not yet supported
  83.   #endif
  84. #else
  85.   #if   ( defined (LCD_LUT_COM) && !defined(LCD_LUT_SEG))
  86.     #define LOG2PHYS_X(x, y) (x)
  87.     #define LOG2PHYS_Y(x, y) LCD__aLine2Com0[y]
  88.   #elif (!defined (LCD_LUT_COM) &&  defined(LCD_LUT_SEG))
  89.     #define LOG2PHYS_X(x, y) LCD__aCol2Seg0[x]
  90.     #define LOG2PHYS_Y(x, y) (y)
  91.   #elif ( defined (LCD_LUT_COM) &&  defined(LCD_LUT_SEG))
  92.     #define LOG2PHYS_X(x, y) LCD__aCol2Seg0[x]
  93.     #define LOG2PHYS_Y(x, y) LCD__aLine2Com0[y]
  94.   #endif
  95. #endif
  96. /*********************************************
  97. *
  98. *       Macros for simulation
  99. *
  100. **********************************************
  101. */
  102. #ifdef WIN32
  103.   #undef LCD_WRITE_A0
  104.   #undef LCD_WRITE_A1
  105.   #undef LCD_WRITEM_A1
  106.   #undef LCD_READ_A0
  107.   #undef LCD_READ_A1
  108.   void SIM_WriteA1C0(U8 Data);
  109.   void SIM_WriteMA1C0(U8 * pData, int NumberOfBytes);
  110.   void SIM_WriteA0C0(U8 cmd);
  111.   U8   SIM_ReadA1C0(void);
  112.   U8   SIM_ReadA0C0(void);
  113.   #define LCD_WRITE_A1(Byte)                  SIM_WriteA1C0(Byte)
  114.   #define LCD_WRITEM_A1(pData, NumberOfBytes) SIM_WriteMA1C0(pData, NumberOfBytes)
  115.   #define LCD_WRITE_A0(Byte)                  SIM_WriteA0C0(Byte)
  116.   #define LCD_READ_A1()                       SIM_ReadA1C0()
  117.   #define LCD_READ_A0()                       SIM_ReadA0C0()
  118. #endif
  119. /*********************************************
  120. *
  121. *       Hardware access macros
  122. *
  123. **********************************************
  124. */
  125. #ifndef LCD_CHECK_BUSY
  126.   #define LCD_CHECK_BUSY 0
  127. #endif
  128. #ifndef LCD_XOFF
  129.   #define LCD_XOFF 0
  130. #endif
  131. #if LCD_CHECK_BUSY
  132.   #define CHECK_BUSY() WAIT_WHILE_BUSY()
  133. #else
  134.   #define CHECK_BUSY()
  135. #endif
  136. #ifdef LCD_CACHE
  137.   #if !LCD_CACHE
  138.     #error Using this driver a cache must be defined!
  139.   #endif
  140. #else
  141.   #define LCD_CACHE 1
  142. #endif
  143. #if (LCD_CONTROLLER == 8811) /* PCF8811 */
  144.   #define MAX_PAGE             10
  145.   #define MAX_OFFSET           128
  146.   #define WAIT_WHILE_BUSY()    { U8 Status; do { LCD_READ_A0(Status); } while (Status & (1 << 7)); }
  147.   #define WRITE_DATA(Data)     CHECK_BUSY(); LCD_WRITE_A1(Data); _VRam[_Page][_Offset] = Data
  148.   #define LCD_ON()             CHECK_BUSY(); LCD_WRITE_A0(0xAF)
  149.   #define LCD_OFF()            CHECK_BUSY(); LCD_WRITE_A0(0xAE)
  150.   #define SET_PAGE(Page)       CHECK_BUSY(); LCD_WRITE_A0(Page + 0xB0)
  151.   #define SET_OFFSET(Offset)   CHECK_BUSY(); LCD_WRITE_A0(0x10 + (Offset >> 4)); 
  152.                                CHECK_BUSY(); LCD_WRITE_A0(0x00 + (Offset & 0x0F))
  153.   #ifndef LCD_AUTOINC_Y
  154.     #define LCD_AUTOINC_Y      MAX_OFFSET
  155.   #endif
  156.   #define INCREMENT_XY_VOLATILE
  157. #elif (LCD_CONTROLLER == 8535) /* PCF8535 */
  158.   static U8 _aMirror[256] = {
  159.     ________, X_______, _X______, XX______, __X_____, X_X_____, _XX_____, XXX_____,
  160.     ___X____, X__X____, _X_X____, XX_X____, __XX____, X_XX____, _XXX____, XXXX____,
  161.     ____X___, X___X___, _X__X___, XX__X___, __X_X___, X_X_X___, _XX_X___, XXX_X___,
  162.     ___XX___, X__XX___, _X_XX___, XX_XX___, __XXX___, X_XXX___, _XXXX___, XXXXX___,
  163.     _____X__, X____X__, _X___X__, XX___X__, __X__X__, X_X__X__, _XX__X__, XXX__X__,
  164.     ___X_X__, X__X_X__, _X_X_X__, XX_X_X__, __XX_X__, X_XX_X__, _XXX_X__, XXXX_X__,
  165.     ____XX__, X___XX__, _X__XX__, XX__XX__, __X_XX__, X_X_XX__, _XX_XX__, XXX_XX__,
  166.     ___XXX__, X__XXX__, _X_XXX__, XX_XXX__, __XXXX__, X_XXXX__, _XXXXX__, XXXXXX__,
  167.     ______X_, X_____X_, _X____X_, XX____X_, __X___X_, X_X___X_, _XX___X_, XXX___X_,
  168.     ___X__X_, X__X__X_, _X_X__X_, XX_X__X_, __XX__X_, X_XX__X_, _XXX__X_, XXXX__X_,
  169.     ____X_X_, X___X_X_, _X__X_X_, XX__X_X_, __X_X_X_, X_X_X_X_, _XX_X_X_, XXX_X_X_,
  170.     ___XX_X_, X__XX_X_, _X_XX_X_, XX_XX_X_, __XXX_X_, X_XXX_X_, _XXXX_X_, XXXXX_X_,
  171.     _____XX_, X____XX_, _X___XX_, XX___XX_, __X__XX_, X_X__XX_, _XX__XX_, XXX__XX_,
  172.     ___X_XX_, X__X_XX_, _X_X_XX_, XX_X_XX_, __XX_XX_, X_XX_XX_, _XXX_XX_, XXXX_XX_,
  173.     ____XXX_, X___XXX_, _X__XXX_, XX__XXX_, __X_XXX_, X_X_XXX_, _XX_XXX_, XXX_XXX_,
  174.     ___XXXX_, X__XXXX_, _X_XXXX_, XX_XXXX_, __XXXXX_, X_XXXXX_, _XXXXXX_, XXXXXXX_,
  175.     _______X, X______X, _X_____X, XX_____X, __X____X, X_X____X, _XX____X, XXX____X,
  176.     ___X___X, X__X___X, _X_X___X, XX_X___X, __XX___X, X_XX___X, _XXX___X, XXXX___X,
  177.     ____X__X, X___X__X, _X__X__X, XX__X__X, __X_X__X, X_X_X__X, _XX_X__X, XXX_X__X,
  178.     ___XX__X, X__XX__X, _X_XX__X, XX_XX__X, __XXX__X, X_XXX__X, _XXXX__X, XXXXX__X,
  179.     _____X_X, X____X_X, _X___X_X, XX___X_X, __X__X_X, X_X__X_X, _XX__X_X, XXX__X_X,
  180.     ___X_X_X, X__X_X_X, _X_X_X_X, XX_X_X_X, __XX_X_X, X_XX_X_X, _XXX_X_X, XXXX_X_X,
  181.     ____XX_X, X___XX_X, _X__XX_X, XX__XX_X, __X_XX_X, X_X_XX_X, _XX_XX_X, XXX_XX_X,
  182.     ___XXX_X, X__XXX_X, _X_XXX_X, XX_XXX_X, __XXXX_X, X_XXXX_X, _XXXXX_X, XXXXXX_X,
  183.     ______XX, X_____XX, _X____XX, XX____XX, __X___XX, X_X___XX, _XX___XX, XXX___XX,
  184.     ___X__XX, X__X__XX, _X_X__XX, XX_X__XX, __XX__XX, X_XX__XX, _XXX__XX, XXXX__XX,
  185.     ____X_XX, X___X_XX, _X__X_XX, XX__X_XX, __X_X_XX, X_X_X_XX, _XX_X_XX, XXX_X_XX,
  186.     ___XX_XX, X__XX_XX, _X_XX_XX, XX_XX_XX, __XXX_XX, X_XXX_XX, _XXXX_XX, XXXXX_XX,
  187.     _____XXX, X____XXX, _X___XXX, XX___XXX, __X__XXX, X_X__XXX, _XX__XXX, XXX__XXX,
  188.     ___X_XXX, X__X_XXX, _X_X_XXX, XX_X_XXX, __XX_XXX, X_XX_XXX, _XXX_XXX, XXXX_XXX,
  189.     ____XXXX, X___XXXX, _X__XXXX, XX__XXXX, __X_XXXX, X_X_XXXX, _XX_XXXX, XXX_XXXX,
  190.     ___XXXXX, X__XXXXX, _X_XXXXX, XX_XXXXX, __XXXXXX, X_XXXXXX, _XXXXXXX, XXXXXXXX
  191.   };
  192.   #define MAX_PAGE             9
  193.   #define MAX_OFFSET           133
  194.   #define WAIT_WHILE_BUSY()    { U8 Status; do { LCD_READ_A0(Status); } while (Status & (1 << 7)); }
  195.   #define WRITE_DATA(Data)     CHECK_BUSY();                 
  196.                                LCD_WRITE_A1(_aMirror[Data]); 
  197.                                _VRam[_Page][_Offset] = Data
  198.   #define LCD_ON()
  199.   #define LCD_OFF()
  200.   #define SET_PAGE(Page)       CHECK_BUSY(); LCD_WRITE_A0(0x40 + Page)
  201.   #define SET_OFFSET(Offset)   CHECK_BUSY();                                             
  202.                                LCD_WRITE_A0(0x20 + (((Offset + LCD_XOFF) & 0x80) >> 5)); 
  203.                                LCD_WRITE_A0(0x80 +  ((Offset + LCD_XOFF) & 0x7F))
  204. #endif
  205. #define SET_PAGE_IF_NEEDED(Page)          _SetPageIfNeeded(Page)     /* Function call only in debug version */
  206. #define SET_OFFSET_IF_NEEDED(Offset)      _SetOffsetIfNeeded(Offset) /* Function call only in debug version */
  207. #define WRITE_DATA1(Data)                 _WriteData1(Data)          /* Function call only in debug version */
  208. #define WRITE_DATAM(pData, NumberOfBytes) _WriteDataM(pData, NumberOfBytes)
  209. #define GET_CURRENT_BYTE()                _VRam[_Page][_Offset]
  210. #define GET_BYTE(Page, Offset)            _VRam[Page][Offset]
  211. #if !LCD_CACHE
  212.   #error Not yet supported!
  213. #endif
  214. /*********************************************************************
  215. *
  216. *       Static data
  217. *
  218. **********************************************************************
  219. */
  220. static int _Page, _Offset;
  221. #if LCD_CACHE
  222.   static U8 _VRam[MAX_PAGE][MAX_OFFSET];
  223. #endif
  224. static const LCD_PIXELINDEX _ConversionTable[2] = {0, 1};
  225. /*********************************************************************
  226. *
  227. *       Static functions
  228. *
  229. **********************************************************************
  230. */
  231. #if defined(INCREMENT_XY_VOLATILE)
  232. static int _VolatileOffset, _VolatilePage;
  233. static void _SetPageIfNeeded(int Page) {
  234.   if (_Page == Page)
  235.     return;
  236.   _Page = Page;
  237.   SET_PAGE(_Page);
  238.   _VolatilePage = 0;
  239.   if (_VolatileOffset) {
  240.     SET_OFFSET(_Offset);
  241.     _VolatileOffset = 0;
  242.   }
  243. }
  244. static void _SetOffsetIfNeeded(int Offset) {
  245.   if (_Offset == Offset)
  246.     return;
  247.   _Offset = Offset;
  248.   SET_OFFSET(_Offset);
  249.   _VolatileOffset = 0;
  250.   if (_VolatilePage) {
  251.     SET_PAGE(_Page);
  252.     _VolatilePage = 0;
  253.   }
  254. }
  255. static void _WriteData1(U8 Data) {
  256.   WRITE_DATA(Data);
  257.   _Offset++;
  258.   _VolatileOffset = 1;
  259.   if (_Offset == MAX_OFFSET) {
  260.     _Offset = 0;
  261.     _VolatilePage = 1;
  262.     if (_Page < (MAX_PAGE - 1)) {
  263.       ++_Page;
  264.     } else {
  265.       _Page = 0;
  266.     }
  267.   }
  268. }
  269. static void _WriteDataM(U8 * pData, int NumberOfBytes) {
  270.   LCD_WRITEM_A1(pData, NumberOfBytes);
  271.   _Offset += NumberOfBytes;
  272.   _VolatileOffset = 1;
  273.   if (_Offset == MAX_OFFSET) {
  274.     _Offset = 0;
  275.     _VolatilePage = 1;
  276.     if (_Page < (MAX_PAGE - 1)) {
  277.       ++_Page;
  278.     } else {
  279.       _Page = 0;
  280.     }
  281.   }
  282. }
  283. #elif defined(INCREMENT_XY)
  284. static void _SetPageIfNeeded(int Page) {
  285.   if (_Page == Page)
  286.     return;
  287.   _Page = Page;
  288.   SET_PAGE(_Page);
  289. }
  290. static void _SetOffsetIfNeeded(int Offset) {
  291.   if (_Offset == Offset)
  292.     return;
  293.   _Offset = Offset;
  294.   SET_OFFSET(_Offset);
  295. }
  296. static void _WriteData1(U8 Data) {
  297.   WRITE_DATA(Data);
  298.   _Offset++;
  299.   if (_Offset == MAX_OFFSET) {
  300.     _Offset = 0;
  301.     if (_Page < (MAX_PAGE - 1)) {
  302.       ++_Page;
  303.     } else {
  304.       _Page = 0;
  305.     }
  306.   }
  307. }
  308. static void _WriteDataM(U8 * pData, int NumberOfBytes) {
  309.   LCD_WRITEM_A1(pData, NumberOfBytes);
  310.   _Offset += NumberOfBytes;
  311.   if (_Offset == MAX_OFFSET) {
  312.     _Offset = 0;
  313.     if (_Page < (MAX_PAGE - 1)) {
  314.       ++_Page;
  315.     } else {
  316.       _Page = 0;
  317.     }
  318.   }
  319. }
  320. #else
  321. static void _SetPageIfNeeded(int Page) {
  322.   _Page = Page;
  323.   SET_PAGE(_Page);
  324. }
  325. static void _SetOffsetIfNeeded(int Offset) {
  326.   _Offset = Offset;
  327.   SET_OFFSET(_Offset);
  328. }
  329. static void _WriteData1(U8 Data) {
  330.   WRITE_DATA(Data);
  331. }
  332. static void _WriteDataM(U8 * pData, int NumberOfBytes) {
  333.   while(NumberOfBytes) {
  334.     WRITE_DATA(*pData);
  335.     if (--NumberOfBytes) {
  336.       pData++;
  337.       _Offset++;
  338.       SET_OFFSET(_Offset);
  339.     }
  340.   }
  341. }
  342. #endif
  343. /*********************************************
  344. *
  345. *       Draw Bitmap 1 BPP (optimized)
  346. *
  347. **********************************************
  348. */
  349. #if LCD_OPTIMIZE 
  350.   && !LCD_SWAP_XY 
  351.   && !LCD_MIRROR_X 
  352.   && !LCD_MIRROR_Y
  353. static void _DrawBitLine1BPP(int x, int y, U8 const * pData, int ysize, const LCD_PIXELINDEX * pTrans, int BytesPerLine, U8 DataMask) {
  354.   LCD_PIXELINDEX Index0 = *(pTrans + 0);
  355.   LCD_PIXELINDEX Index1 = *(pTrans + 1);
  356.   U8 PixelMask = 1 << (y & 7);
  357.   int Page = y >> 3;
  358.   U8 Data;
  359.   Data = _VRam[Page][x];
  360.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
  361.     case 0:
  362.       while(ysize--) {
  363.         if (*pData & DataMask) {
  364.           if (Index1) {
  365.             Data |= PixelMask;
  366.           } else {
  367.             Data &= ~PixelMask;
  368.           }
  369.         } else {
  370.           if (Index0) {
  371.             Data |= PixelMask;
  372.           } else {
  373.             Data &= ~PixelMask;
  374.           }
  375.         }
  376.         pData += BytesPerLine;
  377.         PixelMask <<= 1;
  378.         if (!PixelMask || !ysize) {
  379.           _VRam[Page][x] = Data;
  380.           if (ysize) {
  381.             PixelMask = 1;
  382.             Data = _VRam[++Page][x];
  383.           }
  384.         }
  385.       }
  386.       break;
  387.     case LCD_DRAWMODE_TRANS:
  388.       while(ysize--) {
  389.         if (*pData & DataMask) {
  390.           if (Index1) {
  391.             Data |= PixelMask;
  392.           } else {
  393.             Data &= ~PixelMask;
  394.           }
  395.         }
  396.         pData += BytesPerLine;
  397.         PixelMask <<= 1;
  398.         if (!PixelMask || !ysize) {
  399.           _VRam[Page][x] = Data;
  400.           if (ysize) {
  401.             PixelMask = 1;
  402.             Data = _VRam[++Page][x];
  403.           }
  404.         }
  405.       }
  406.       break;
  407.     case LCD_DRAWMODE_XOR:
  408.       while(ysize--) {
  409.         if (*pData & DataMask) {
  410.           Data ^= PixelMask;
  411.         }
  412.         pData += BytesPerLine;
  413.         PixelMask <<= 1;
  414.         if (!PixelMask || !ysize) {
  415.           _VRam[Page][x] = Data;
  416.           if (ysize) {
  417.             PixelMask = 1;
  418.             Data = _VRam[++Page][x];
  419.           }
  420.         }
  421.       }
  422.       break;
  423. }
  424. }
  425. /*********************************************
  426. *
  427. *       Draw Bitmap 1 BPP (not optimized)
  428. *
  429. **********************************************
  430. */
  431. #else
  432. static void _DrawBitLine1BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  433.   LCD_PIXELINDEX Index0 = *(pTrans+0);
  434.   LCD_PIXELINDEX Index1 = *(pTrans+1);
  435.   x += Diff;
  436.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
  437.     case 0:
  438.       do {
  439.         LCD_L0_SetPixelIndex(x++, y, (*p & (0x80 >> Diff)) ? Index1 : Index0);
  440.   if (++Diff == 8) {
  441.           Diff = 0;
  442.   p++;
  443.   }
  444.   } while (--xsize);
  445.       break;
  446.     case LCD_DRAWMODE_TRANS:
  447.       do {
  448.      if (*p & (0x80 >> Diff))
  449.           LCD_L0_SetPixelIndex(x, y, Index1);
  450.         x++;
  451.   if (++Diff == 8) {
  452.           Diff = 0;
  453.   p++;
  454.   }
  455.   } while (--xsize);
  456.       break;
  457.     case LCD_DRAWMODE_XOR:;
  458.       do {
  459.      if (*p & (0x80 >> Diff)) {
  460.           int Pixel = LCD_L0_GetPixelIndex(x, y);
  461.           LCD_L0_SetPixelIndex(x, y, LCD_NUM_COLORS - 1 - Pixel);
  462.         }
  463.         x++;
  464.   if (++Diff == 8) {
  465.           Diff = 0;
  466.   p++;
  467.   }
  468.   } while (--xsize);
  469.       break;
  470. }
  471. }
  472. #endif
  473. /*********************************************
  474. *
  475. *       Draw Bitmap 2 BPP
  476. *
  477. **********************************************
  478. */
  479. #if (LCD_MAX_LOG_COLORS > 2)
  480. static void _DrawBitLine2BPP(int x, int y, U8 const * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) {
  481.   LCD_PIXELINDEX Pixels = *p;
  482.   int CurrentPixel = Diff;
  483.   x += Diff;
  484.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
  485.     case 0:
  486.       do {
  487.         int Shift = (3 - CurrentPixel) << 1;
  488.         int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift;
  489.         LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
  490.         LCD_L0_SetPixelIndex(x++, y, PixelIndex);
  491.         if (++CurrentPixel == 4) {
  492.           CurrentPixel = 0;
  493.           Pixels = *(++p);
  494.         }
  495.   } while (--xsize);
  496.       break;
  497.     case LCD_DRAWMODE_TRANS:
  498.       do {
  499.         int Shift = (3 - CurrentPixel) << 1;
  500.         int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift;
  501.         if (Index) {
  502.           LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
  503.           LCD_L0_SetPixelIndex(x, y, PixelIndex);
  504.         }
  505.         x++;
  506.         if (++CurrentPixel == 4) {
  507.           CurrentPixel = 0;
  508.           Pixels = *(++p);
  509.         }
  510.   } while (--xsize);
  511.       break;
  512.   }
  513. }
  514. #endif
  515. /*********************************************
  516. *
  517. *       Draw Bitmap 4 BPP
  518. *
  519. **********************************************
  520. */
  521. #if (LCD_MAX_LOG_COLORS > 4)
  522. static void _DrawBitLine4BPP(int x, int y, U8 const * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) {
  523.   LCD_PIXELINDEX Pixels = *p;
  524.   int CurrentPixel = Diff;
  525.   x += Diff;
  526.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
  527.     case 0:
  528.       do {
  529.         int Shift = (1 - CurrentPixel) << 2;
  530.         int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift;
  531.         LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
  532.         LCD_L0_SetPixelIndex(x++, y, PixelIndex);
  533.         if (++CurrentPixel == 2) {
  534.           CurrentPixel = 0;
  535.           Pixels = *(++p);
  536.         }
  537.   } while (--xsize);
  538.       break;
  539.     case LCD_DRAWMODE_TRANS:
  540.       do {
  541.         int Shift = (1 - CurrentPixel) << 2;
  542.         int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift;
  543.         if (Index) {
  544.           LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
  545.           LCD_L0_SetPixelIndex(x, y, PixelIndex);
  546.         }
  547.         x++;
  548.         if (++CurrentPixel == 2) {
  549.           CurrentPixel = 0;
  550.           Pixels = *(++p);
  551.         }
  552.   } while (--xsize);
  553.       break;
  554.   }
  555. }
  556. #endif
  557. /*********************************************
  558. *
  559. *       Draw Bitmap 8 BPP (optimized)
  560. *
  561. **********************************************
  562. */
  563. #if (LCD_MAX_LOG_COLORS > 16)
  564. #if LCD_OPTIMIZE 
  565.   && !LCD_SWAP_XY 
  566.   && !LCD_MIRROR_X 
  567.   && !LCD_MIRROR_Y
  568. static void _DrawBitLine8BPP(int x, int y, U8 const * pData, int ysize, const LCD_PIXELINDEX * pTrans, int BytesPerLine) {
  569.   U8 PixelMask = 1 << (y & 7);
  570.   int Page = y >> 3;
  571.   U8 Data = _VRam[Page][x];
  572.   if (!pTrans)
  573.     pTrans = _ConversionTable;
  574.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
  575.     case 0:
  576.       while(ysize--) {
  577.         if (*(pTrans + *pData)) {
  578.           Data |= PixelMask;
  579.         } else {
  580.           Data &= ~PixelMask;
  581.         }
  582.         pData += BytesPerLine;
  583.         PixelMask <<= 1;
  584.         if (!PixelMask || !ysize) {
  585.           _VRam[Page][x] = Data;
  586.           if (ysize) {
  587.             PixelMask = 1;
  588.             Data = _VRam[++Page][x];
  589.           }
  590.         }
  591.       }
  592.       break;
  593.     case LCD_DRAWMODE_TRANS:
  594.       while(ysize--) {
  595.         LCD_PIXELINDEX Pixel = *pData;
  596.         if (Pixel) {
  597.           if (*(pTrans + Pixel)) {
  598.             Data |= PixelMask;
  599.           } else {
  600.             Data &= ~PixelMask;
  601.           }
  602.         }
  603.         pData += BytesPerLine;
  604.         PixelMask <<= 1;
  605.         if (!PixelMask || !ysize) {
  606.           _VRam[Page][x] = Data;
  607.           if (ysize) {
  608.             PixelMask = 1;
  609.             Data = _VRam[++Page][x];
  610.           }
  611.         }
  612.       }
  613.       break;
  614. }
  615. }
  616. /*********************************************
  617. *
  618. *       Draw Bitmap 8 BPP (not optimized)
  619. *
  620. **********************************************
  621. */
  622. #else
  623. static void _DrawBitLine8BPP(int x, int y, U8 const * p, int xsize, const LCD_PIXELINDEX * pTrans) {
  624.   LCD_PIXELINDEX Pixel;
  625.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
  626.     case 0:
  627.       if (pTrans) {
  628.         for (; xsize > 0; xsize--, x++, p++) {
  629.           Pixel = *p;
  630.           LCD_L0_SetPixelIndex(x, y, *(pTrans + Pixel));
  631.         }
  632.       } else {
  633.         for (; xsize > 0; xsize--, x++, p++) {
  634.           LCD_L0_SetPixelIndex(x, y, *p);
  635.         }
  636.       }
  637.       break;
  638.     case LCD_DRAWMODE_TRANS:
  639.       if (pTrans) {
  640.         for (; xsize > 0; xsize--, x++, p++) {
  641.           Pixel = *p;
  642.           if (Pixel) {
  643.             LCD_L0_SetPixelIndex(x, y, *(pTrans + Pixel));
  644.           }
  645.         }
  646.       } else {
  647.         for (; xsize > 0; xsize--, x++, p++) {
  648.           Pixel = *p;
  649.           if (Pixel) {
  650.             LCD_L0_SetPixelIndex(x, y, Pixel);
  651.           }
  652.         }
  653.       }
  654.       break;
  655.   }
  656. }
  657. #endif
  658. #endif
  659. /*********************************************
  660. *
  661. *       Draw Bitmap 16 BPP
  662. *
  663. **********************************************
  664. */
  665. #if (LCD_BITSPERPIXEL > 8)
  666. static void _DrawBitLine16BPP(int x, int y, U16 const * p, int xsize, const LCD_PIXELINDEX * pTrans) {
  667.   LCD_PIXELINDEX Pixel;
  668.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
  669.     case 0:
  670.       if (pTrans) {
  671.         for (; xsize > 0; xsize--, x++, p++) {
  672.           Pixel = *p;
  673.           LCD_L0_SetPixelIndex(x, y, *(pTrans + Pixel));
  674.         }
  675.       } else {
  676.         for (; xsize > 0; xsize--, x++, p++) {
  677.           LCD_L0_SetPixelIndex(x, y, *p);
  678.         }
  679.       }
  680.       break;
  681.     case LCD_DRAWMODE_TRANS:
  682.       if (pTrans) {
  683.         for (; xsize > 0; xsize--, x++, p++) {
  684.           Pixel = *p;
  685.           if (Pixel) {
  686.             LCD_L0_SetPixelIndex(x, y, *(pTrans + Pixel));
  687.           }
  688.         }
  689.       } else {
  690.         for (; xsize > 0; xsize--, x++, p++) {
  691.           Pixel = *p;
  692.           if (Pixel) {
  693.             LCD_L0_SetPixelIndex(x, y, Pixel);
  694.           }
  695.         }
  696.       }
  697.       break;
  698.   }
  699. }
  700. #endif
  701. /*********************************************************************
  702. *
  703. *       Exported functions
  704. *
  705. **********************************************************************
  706. */
  707. /*********************************************
  708. *
  709. *       LCD_L0_SetPixelIndex
  710. *
  711. **********************************************
  712. */
  713. void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) {
  714.   /* Convert logical into physical coordinates (Dep. on LCDConf.h) */
  715.   #if LCD_SWAP_XY | LCD_MIRROR_X | LCD_MIRROR_Y
  716.     int xPhys = LOG2PHYS_X(x, y);
  717.     int yPhys = LOG2PHYS_Y(x, y);
  718.   #else
  719.     #define xPhys x
  720.     #define yPhys y
  721.   #endif
  722.   /* Write into hardware */
  723.   {
  724.     U8 Data = GET_BYTE(yPhys >> 3, xPhys);
  725.     U8 AndMask = ~(1 << (yPhys & 7));
  726.     U8 OrMask  = PixelIndex << (yPhys & 7);
  727.     Data &= AndMask;
  728.     Data |= OrMask;
  729.     SET_PAGE_IF_NEEDED(yPhys >> 3);
  730.     SET_OFFSET_IF_NEEDED(xPhys);
  731.     WRITE_DATA1(Data);
  732.   }
  733. }
  734. /*********************************************
  735. *
  736. *       LCD_L0_GetPixelIndex
  737. *
  738. **********************************************
  739. */
  740. unsigned int LCD_L0_GetPixelIndex(int x, int y) {
  741.   /* Convert logical into physical coordinates (Dep. on LCDConf.h) */
  742.   #if LCD_SWAP_XY | LCD_MIRROR_X| LCD_MIRROR_Y
  743.     int xPhys = LOG2PHYS_X(x, y);
  744.     int yPhys = LOG2PHYS_Y(x, y);
  745.   #else
  746.     #define xPhys x
  747.     #define yPhys y
  748.   #endif
  749.   /* Read from hardware */
  750.   {
  751.     U8 Data = GET_BYTE(yPhys >> 3, xPhys);
  752.     return (Data & (1 << (yPhys & 7))) ? 1 : 0;
  753.   }
  754. }
  755. /*********************************************
  756. *
  757. *       LCD_L0_XorPixel
  758. *
  759. **********************************************
  760. */
  761. void LCD_L0_XorPixel(int x, int y) {
  762.   LCD_PIXELINDEX PixelIndex = LCD_L0_GetPixelIndex(x, y);
  763.   LCD_L0_SetPixelIndex(x, y, LCD_NUM_COLORS - PixelIndex - 1);
  764. }
  765. /*********************************************
  766. *
  767. *       LCD_L0_DrawHLine (optimized)
  768. *
  769. **********************************************
  770. */
  771. #if LCD_OPTIMIZE 
  772.   && !LCD_SWAP_XY 
  773.   && !LCD_MIRROR_X 
  774.   && !LCD_MIRROR_Y
  775. void LCD_L0_DrawHLine  (int x0, int y,  int x1) {
  776.   #if LCD_CACHE
  777.     U8 Mask = 1 << (y & 7);
  778.     int Page = y >> 3;
  779.     U8 * pData = &_VRam[Page][x0];
  780.     int NumberOfBytes = x1 - x0 + 1;
  781.     SET_PAGE_IF_NEEDED(Page);
  782.     SET_OFFSET_IF_NEEDED(x0);
  783.     for (; x0 <= x1; x0++) {
  784.       if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  785.         _VRam[Page][x0] ^= Mask;
  786.       } else {
  787.         if (LCD_COLORINDEX) {
  788.           _VRam[Page][x0] |= Mask;
  789.         } else {
  790.           _VRam[Page][x0] &= ~Mask;
  791.         }
  792.       }
  793.     }
  794.     WRITE_DATAM(pData, NumberOfBytes);
  795.   #else
  796.     U8 Mask = 1 << (y & 7);
  797.     SET_PAGE_IF_NEEDED(y >> 3);
  798.     SET_OFFSET_IF_NEEDED(x0);
  799.     for (; x0 <= x1; x0++) {
  800.       U8 Data = GET_CURRENT_BYTE();
  801.       if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  802.         WRITE_DATA1(Data ^ Mask);
  803.       } else {
  804.         WRITE_DATA1((LCD_COLORINDEX) ? Data | Mask : Data & ~Mask);
  805.       }
  806.     }
  807.   #endif
  808. }
  809. /*********************************************
  810. *
  811. *       LCD_L0_DrawHLine (not optimized)
  812. *
  813. **********************************************
  814. */
  815. #else
  816. void LCD_L0_DrawHLine  (int x0, int y,  int x1) {
  817.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  818.     for (; x0 <= x1; x0++) {
  819.       LCD_L0_XorPixel(x0, y);
  820.     }
  821.   } else {
  822.     for (; x0 <= x1; x0++) {
  823.       LCD_L0_SetPixelIndex(x0, y, LCD_COLORINDEX);
  824.     }
  825.   }
  826. }
  827. #endif
  828. /*********************************************
  829. *
  830. *       LCD_L0_DrawVLine (optimized)
  831. *
  832. **********************************************
  833. */
  834. #if LCD_OPTIMIZE 
  835.   && !LCD_SWAP_XY 
  836.   && !LCD_MIRROR_X 
  837.   && !LCD_MIRROR_Y
  838. void LCD_L0_DrawVLine  (int x, int y0,  int y1) {
  839.   int y0_ = y0 & 7;
  840.   int y1_ = (y1 + 1) & 7;
  841.   if (y0_) {
  842.     U8 Data = GET_BYTE(y0 >> 3, x);
  843.     U8 Mask = 0xff << y0_;
  844.     if ((y0 >> 3) == (y1 >> 3)) {
  845.       Mask &= 0xff >> (7 - (y1 & 7));
  846.     }
  847.     SET_PAGE_IF_NEEDED(y0 >> 3);
  848.     SET_OFFSET_IF_NEEDED(x);
  849.     if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  850.       WRITE_DATA1(Data ^ Mask);
  851.     } else {
  852.       WRITE_DATA1((LCD_COLORINDEX) ? Data | Mask : Data & ~Mask);
  853.     }
  854.     if ((y0 & 0xfff8) == (y1 & 0xfff8)) {
  855.       return;
  856.     }
  857.   }
  858.   {
  859.     int Page     =  ((y0 + 7) & 0xfff8) >> 3;
  860.     int NumPages = (((y1 + 1) & 0xfff8) >> 3) - Page;
  861.     if (NumPages) {
  862.       while (NumPages--) {
  863.         SET_PAGE_IF_NEEDED(Page++);
  864.         SET_OFFSET_IF_NEEDED(x);
  865.         if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  866.           WRITE_DATA1(GET_CURRENT_BYTE() ^ 0xff);
  867.         } else {
  868.           WRITE_DATA1((LCD_COLORINDEX) ? 0xff : 0x00);
  869.         }
  870.       }
  871.     }
  872.   }
  873.   if (y1_) {
  874.     U8 Data = GET_BYTE(y1 >> 3, x);
  875.     U8 Mask = 0xff >> (8 - y1_);
  876.     SET_PAGE_IF_NEEDED(y1 >> 3);
  877.     SET_OFFSET_IF_NEEDED(x);
  878.     if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  879.       WRITE_DATA1(Data ^ Mask);
  880.     } else {
  881.       WRITE_DATA1((LCD_COLORINDEX) ? Data | Mask : Data & ~Mask);
  882.     }
  883.   }
  884. }
  885. /*********************************************
  886. *
  887. *       LCD_L0_DrawVLine (not optimized)
  888. *
  889. **********************************************
  890. */
  891. #else
  892. void LCD_L0_DrawVLine  (int x, int y0,  int y1) {
  893.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  894.     for (; y0 <= y1; y0++) {
  895.       LCD_L0_XorPixel(x, y0);
  896.     }
  897.   } else {
  898.     for (; y0 <= y1; y0++) {
  899.       LCD_L0_SetPixelIndex(x, y0, LCD_COLORINDEX);
  900.     }
  901.   }
  902. }
  903. #endif
  904. /*********************************************
  905. *
  906. *       LCD_L0_FillRect (optimized)
  907. *
  908. **********************************************
  909. */
  910. #if LCD_OPTIMIZE 
  911.   && !LCD_SWAP_XY 
  912.   && !LCD_MIRROR_X 
  913.   && !LCD_MIRROR_Y
  914. void LCD_L0_FillRect(int x0, int y0, int x1, int y1) {
  915.   #if LCD_CACHE
  916.     int y0_ = y0 & 7;
  917.     int y1_ = (y1 + 1) & 7;
  918.     int NumberOfBytes = x1 - x0 + 1;
  919.     if (y0_) {
  920.       U8 * pData;
  921.       int x0_ = x0;
  922.       U8 Mask = 0xff << y0_;
  923.       int Page = y0 >> 3;
  924.       if ((y0 & 0xfff8) == ((y1 + 1) & 0xfff8)) {
  925.         Mask &= 0xff >> (8 - y1_);
  926.       }
  927.       SET_PAGE_IF_NEEDED(Page);
  928.       SET_OFFSET_IF_NEEDED(x0);
  929.       pData = &_VRam[_Page][_Offset];
  930.       for (; x0_ <= x1; x0_++) {
  931.         if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  932.           _VRam[Page][x0_] ^= Mask;
  933.         } else {
  934.           if (LCD_COLORINDEX) {
  935.             _VRam[Page][x0_] |= Mask;
  936.           } else {
  937.             _VRam[Page][x0_] &= ~Mask;
  938.           }
  939.         }
  940.       }
  941.       WRITE_DATAM(pData, NumberOfBytes);
  942.       if ((y0 & 0xfff8) == (y1 & 0xfff8)) {
  943.         return;
  944.       }
  945.     }
  946.     {
  947.       int Page     =  ((y0 + 7) & 0xfff8) >> 3;
  948.       int NumPages = (((y1 + 1) & 0xfff8) >> 3) - Page;
  949.       if (NumPages) {
  950.         while (NumPages--) {
  951.           U8 * pData;
  952.           int x0_ = x0;
  953.           SET_PAGE_IF_NEEDED(Page++);
  954.           SET_OFFSET_IF_NEEDED(x0);
  955.           pData = &_VRam[_Page][_Offset];
  956.           for (; x0_ <= x1; x0_++) {
  957.             if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  958.               _VRam[_Page][x0_] ^= 0xff;
  959.             } else {
  960.               if (LCD_COLORINDEX) {
  961.                 _VRam[_Page][x0_] = 0xff;
  962.               } else {
  963.                 _VRam[_Page][x0_] = 0x00;
  964.               }
  965.             }
  966.           }
  967.           WRITE_DATAM(pData, NumberOfBytes);
  968.         }
  969.       }
  970.     }
  971.     if (y1_) {
  972.       U8 * pData;
  973.       int x0_ = x0;
  974.       U8 Mask = 0xff >> (8 - y1_);
  975.       int Page = y1 >> 3;
  976.       SET_PAGE_IF_NEEDED(Page);
  977.       SET_OFFSET_IF_NEEDED(x0);
  978.       pData = &_VRam[Page][_Offset];
  979.       for (; x0_ <= x1; x0_++) {
  980.         if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  981.           _VRam[Page][x0_] ^= Mask;
  982.         } else {
  983.           if (LCD_COLORINDEX) {
  984.             _VRam[Page][x0_] |= Mask;
  985.           } else {
  986.             _VRam[Page][x0_] &= ~Mask;
  987.           }
  988.         }
  989.       }
  990.       WRITE_DATAM(pData, NumberOfBytes);
  991.     }
  992.   #else
  993.     int y0_ = y0 & 7;
  994.     int y1_ = (y1 + 1) & 7;
  995.     if (y0_) {
  996.       int x0_ = x0;
  997.       U8 Mask = 0xff << y0_;
  998.       if ((y0 & 0xfff8) == (y1 & 0xfff8)) {
  999.         Mask &= 0xff >> (8 - y1_);
  1000.       }
  1001.       SET_PAGE_IF_NEEDED(y0 >> 3);
  1002.       SET_OFFSET_IF_NEEDED(x0);
  1003.       for (; x0_ <= x1; x0_++) {
  1004.         U8 Data = GET_CURRENT_BYTE();
  1005.         if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  1006.           WRITE_DATA1(Data ^ Mask);
  1007.         } else {
  1008.           WRITE_DATA1((LCD_COLORINDEX) ? Data | Mask : Data & ~Mask);
  1009.         }
  1010.       }
  1011.       if ((y0 & 0xfff8) == (y1 & 0xfff8)) {
  1012.         return;
  1013.       }
  1014.     }
  1015.     {
  1016.       int Page     =  ((y0 + 7) & 0xfff8) >> 3;
  1017.       int NumPages = (((y1 + 1) & 0xfff8) >> 3) - Page;
  1018.       if (NumPages) {
  1019.         while (NumPages--) {
  1020.           int x0_ = x0;
  1021.           SET_PAGE_IF_NEEDED(Page++);
  1022.           SET_OFFSET_IF_NEEDED(x0);
  1023.           for (; x0_ <= x1; x0_++) {
  1024.             if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  1025.               WRITE_DATA1(GET_CURRENT_BYTE() ^ 0xff);
  1026.             } else {
  1027.               WRITE_DATA1((LCD_COLORINDEX) ? 0xff : 0x00);
  1028.             }
  1029.           }
  1030.         }
  1031.       }
  1032.     }
  1033.     if (y1_) {
  1034.       int x0_ = x0;
  1035.       U8 Mask = 0xff >> (8 - y1_);
  1036.       SET_PAGE_IF_NEEDED(y1 >> 3);
  1037.       SET_OFFSET_IF_NEEDED(x0);
  1038.       for (; x0_ <= x1; x0_++) {
  1039.         U8 Data = GET_CURRENT_BYTE();
  1040.         if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  1041.           WRITE_DATA1(Data ^ Mask);
  1042.         } else {
  1043.           WRITE_DATA1((LCD_COLORINDEX) ? Data | Mask : Data & ~Mask);
  1044.         }
  1045.       }
  1046.     }
  1047.   #endif
  1048. }
  1049. /*********************************************
  1050. *
  1051. *       LCD_L0_FillRect (not optimized)
  1052. *
  1053. **********************************************
  1054. */
  1055. #else
  1056. void LCD_L0_FillRect(int x0, int y0, int x1, int y1) {
  1057.   for (; y0 <= y1; y0++) {
  1058.     LCD_L0_DrawHLine(x0, y0, x1);
  1059.   }
  1060. }
  1061. #endif
  1062. /*********************************************
  1063. *
  1064. *       LCD_L0_DrawBitmap
  1065. *
  1066. **********************************************
  1067. */
  1068. void LCD_L0_DrawBitmap(int x0, int y0,
  1069.                        int xsize, int ysize,
  1070.                        int BitsPerPixel, 
  1071.                        int BytesPerLine,
  1072.                        const U8* pData, int Diff,
  1073.                        const LCD_PIXELINDEX* pTrans)
  1074. {
  1075.   int i;
  1076.   #if LCD_OPTIMIZE 
  1077.     && !LCD_SWAP_XY 
  1078.     && !LCD_MIRROR_X 
  1079.     && !LCD_MIRROR_Y
  1080.     int Page0 = y0 >> 3;
  1081.     int Page1 = (y0 + ysize - 1) >> 3;
  1082.     int Opt = 0;
  1083.     switch (BitsPerPixel) {
  1084.       case 1:
  1085.         Opt = 1;
  1086.         xsize += Diff & 7;
  1087.         for (i = Diff; i < xsize; i++) {
  1088.           _DrawBitLine1BPP(x0 + i, y0, pData + (i >> 3), ysize, pTrans, BytesPerLine, 0x80 >> (i & 7));
  1089.         }
  1090.         break;
  1091.       case 8:
  1092.         Opt = 1;
  1093.         for (i = Diff; i < xsize; i++) {
  1094.           _DrawBitLine8BPP(x0 + i, y0, pData + i, ysize, pTrans, BytesPerLine);
  1095.         }
  1096.         break;
  1097.     }
  1098.     if (Opt) {
  1099.       for (; Page0 <= Page1; Page0++) {
  1100.         U8 * p = &_VRam[Page0][x0];
  1101.         SET_PAGE_IF_NEEDED(Page0);
  1102.         SET_OFFSET_IF_NEEDED(x0);
  1103.         WRITE_DATAM(p, xsize);
  1104.       }
  1105.       return;
  1106.     }
  1107.   #endif
  1108.   /* Use _DrawBitLineXBPP */
  1109.   for (i=0; i<ysize; i++) {
  1110.     switch (BitsPerPixel) {
  1111.       #if !LCD_OPTIMIZE 
  1112.         || LCD_SWAP_XY 
  1113.         || LCD_MIRROR_X 
  1114.         || LCD_MIRROR_Y
  1115.         case 1:
  1116.           _DrawBitLine1BPP(x0, i + y0, pData, Diff, xsize, pTrans);
  1117.           break;
  1118.       #endif
  1119.       #if (LCD_MAX_LOG_COLORS > 2)
  1120.         case 2:
  1121.           _DrawBitLine2BPP(x0, i + y0, pData, Diff, xsize, pTrans);
  1122.           break;
  1123.       #endif
  1124.       #if (LCD_MAX_LOG_COLORS > 4)
  1125.         case 4:
  1126.           _DrawBitLine4BPP(x0, i + y0, pData, Diff, xsize, pTrans);
  1127.           break;
  1128.       #endif
  1129.       #if (LCD_MAX_LOG_COLORS > 16)
  1130.         #if !LCD_OPTIMIZE 
  1131.           || LCD_SWAP_XY 
  1132.           || LCD_MIRROR_X 
  1133.           || LCD_MIRROR_Y
  1134.           case 8:
  1135.             _DrawBitLine8BPP(x0, i + y0, pData, xsize, pTrans);
  1136.             break;
  1137.         #endif
  1138.       #endif
  1139.       #if (LCD_BITSPERPIXEL > 8)
  1140.         case 16:
  1141.           _DrawBitLine16BPP(x0, i + y0, (const U16 *)pData, xsize, pTrans);
  1142.           break;
  1143.       #endif
  1144.     }
  1145.     pData += BytesPerLine;
  1146.   }
  1147. }
  1148. /*********************************************
  1149. *
  1150. *       LCD_L0_SetOrg
  1151. *
  1152. **********************************************
  1153. */
  1154. void LCD_L0_SetOrg(int x, int y) {
  1155.   GUI_USE_PARA(x);
  1156.   GUI_USE_PARA(y);
  1157. }
  1158. /*********************************************
  1159. *
  1160. *       LCD_On / LCD_Off
  1161. *
  1162. **********************************************
  1163. */
  1164. void LCD_On (void) {
  1165. #ifdef LCD_ON
  1166.   LCD_ON();
  1167. #endif
  1168. }
  1169. void LCD_Off (void) {
  1170. #ifdef LCD_OFF
  1171.   LCD_OFF();
  1172. #endif
  1173. }
  1174. /*********************************************
  1175. *
  1176. *       LCD_L0_Init
  1177. *
  1178. **********************************************
  1179. Purpose:
  1180.   Initialises the LCD-controller.
  1181. */
  1182. int  LCD_L0_Init(void) {
  1183.   #if LCD_CACHE
  1184.     memset(_VRam, 0, sizeof(_VRam));
  1185.   #endif
  1186.   LCD_INIT_CONTROLLER();
  1187.   LCD_ON();
  1188.   /* Clear display RAM */
  1189.   {
  1190.     int x, y;
  1191.     U8 Data = 0x00;
  1192.     for (y = 0; y < ((LCD_YSIZE + 7) >> 3); y++) {
  1193.       SET_PAGE(y);
  1194.       for (x = 0; x < LCD_XSIZE; x++) {
  1195.         SET_OFFSET(x);
  1196.         WRITE_DATA(Data);
  1197.       }
  1198.     }
  1199.   }
  1200.   return 0;
  1201. }
  1202. /*********************************************
  1203. *
  1204. *       LCD_L0_SetLUTEntry
  1205. *
  1206. **********************************************
  1207. */
  1208. void LCD_L0_SetLUTEntry(U8 Pos, LCD_COLOR Color) {
  1209.   GUI_USE_PARA(Pos);
  1210.   GUI_USE_PARA(Color);
  1211. }
  1212. #else
  1213. void LCDPage1bpp(void) { } /* avoid empty object files */
  1214. #endif /* (LCD_CONTROLLER undefined) */