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

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        : LCDWin.C
  16. Purpose     : Driver for Simulator under Windows
  17. ----------------------------------------------------------------------
  18. Version-Date---Author-Explanation
  19. ----------------------------------------------------------------------
  20. 2.00    010402 RS     a) LCD_GetDevCaps removed from driver
  21.                          (now LCD.c)
  22. 1.30c   000529 JE     a) Interface changed
  23. 1.30b   000428 RS     a) DIB class eliminated
  24.                       b) Internal cleanups, support for high color
  25. 1.30a   000417 RS     a) Major cleanup in DIB class
  26. 1.30    000309 RS     a) Interface change for emWIn V1.30
  27.                          (LCD_L0_SetLUTEntry, LCD_GetDevCap)
  28. 1.10a   000121 RS     a) RECTHEIGHT, RECTWIDTH modified in order to
  29.                          fix bug which would at some time prevent
  30.  displaying the first line of the display.
  31. 1.10.00 000110 RS     a) Modifications in order to make it easy to
  32.                          implement driver in any windows program
  33. 1.04.02 991118 RS     a) additional assertion added
  34.                          LCD_MAX_LOG_COLORS
  35. 1.04.01 991018 RS     a) Support for LCD_FIXEDPALETTE added
  36.                          with Anitaliasing enabled
  37. 1.04.00 991013 JE/RS  a) Support for LCD_FIXEDPALETTE added
  38.                       b) Driver now accepts the same LCDConf.h as
  39.    the embedded system
  40. c) Bugfix for ..
  41. 1.02.02 990831 RS     a) Small optimization added for 16-color bitmaps
  42. 1.02.01 990726 RS     a) Transparency support for 16-color bitmpas
  43.                          added
  44. 1.02.00 990212 RS     a) New interface version 1.02 supported
  45. 1.00    990118 RS     First release
  46. ----------------------------------------------------------------------
  47. Known problems or limitations with current version
  48. ----------------------------------------------------------------------
  49. ---------------------------END-OF-HEADER------------------------------
  50. */
  51. #if defined(WIN32) && !defined(LCD_SIMCONTROLLER)
  52. #include <windows.h>
  53. #include "LCD.h"
  54. #include "LCD_Private.h"              /* include LCDConf.h */
  55. #include "LCDSim.h"
  56. #include "GUI_Private.h"
  57. #include "memory.h"
  58. #if LCD_BITSPERPIXEL <= 8
  59.   #define PIXELINDEX U8
  60. #else
  61.   #define PIXELINDEX WORD
  62. #endif
  63. #ifdef WIN32
  64.   #ifndef ASSERT
  65.     #define ASSERT(Val) 
  66.     if (!(Val)) 
  67.       MessageBox(NULL,"...in file "__FILE__,"Assertion failed...",MB_OK);
  68.   #endif
  69. #endif
  70. #ifdef LCD_ASSERT
  71.   #undef LCD_ASSERT
  72. #endif
  73. #define LCD_ASSERT(v) ASSERT(v)
  74. #ifndef LCD_DISPLAY_INDEX
  75.   #define LCD_DISPLAY_INDEX 0
  76. #endif
  77. /*
  78.         *********************************************************
  79.         *                                                       *
  80.         *       Macros for internal use                         *
  81.         *                                                       *
  82.         *********************************************************
  83. */
  84. #define SETPIXEL(x, y, c) LCDSIM_SetPixelIndex(x, y, c)
  85. #define GETPIXEL(x, y)    LCD_GetPixel(x,y)
  86. #define XORPIXEL(x, y)    XorPixel(x,y)
  87. #if LCD_DISPLAY_INDEX == 1     /* Second display in a multi-display configuration */
  88.   #define LCDSIM_SetPixelIndex  LCDSIM_1_SetPixelIndex
  89.   #define LCDSIM_SetLUTEntry    LCDSIM_1_SetLUTEntry
  90. #endif
  91. /*
  92.         *********************************************************
  93.         *                                                       *
  94.         *       ID translation table                            *
  95.         *                                                       *
  96.         *********************************************************
  97. This table contains 0, 1, 2, ... and serves as translation table for DDBs
  98. */
  99. #define INTS(Base)  Base+0,Base+1,Base+2,Base+3,Base+4,Base+5,   
  100.                     Base+6,Base+7,Base+8,Base+9,Base+10,Base+11, 
  101.                     Base+12,Base+13,Base+14,Base+15
  102. static void XorPixel   (int x, int y) {
  103.   unsigned int Index = LCD_L0_GetPixelIndex(x,y);
  104.   LCDSIM_SetPixelIndex(x, y, LCD_NUM_COLORS-1-Index);
  105. }
  106. /*
  107.         *********************************************************
  108.         *                                                       *
  109.         *       LCD_L0_SetColorIndex                            *
  110.         *       LCD_L0_SetBkColorIndex                          *
  111.         *                                                       *
  112.         *********************************************************
  113. */
  114. #define   COLORINDEX LCD_COLORINDEX
  115. #define BKCOLORINDEX LCD_BKCOLORINDEX
  116. /*
  117.         *********************************************************
  118.         *                                                       *
  119.         *       LCD_L0_DrawPixel                                   *
  120.         *                                                       *
  121.         *********************************************************
  122. Purpose:  This routine is called by emWin. It writes 1 pixel into the
  123.           display.
  124. */
  125. void LCD_L0_DrawPixel(int x, int y) {
  126.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  127.     XORPIXEL(x, y);
  128.   } else {
  129.     SETPIXEL(x, y, COLORINDEX);
  130.   }
  131. }
  132. /*
  133.         *********************************************************
  134.         *                                                       *
  135.         *          LCD_DrawLine  vertical/horizontal            *
  136.         *          LCD_DrawRect                                 *
  137.         *                                                       *
  138.         *********************************************************
  139. */
  140. void LCD_L0_DrawHLine  (int x0, int y,  int x1) {
  141.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  142.     for (;x0 <= x1; x0++) {
  143.       XORPIXEL(x0, y);
  144.     }
  145.   } else {
  146. //    LCDSIM_FillLine(x0,y,x1,COLORINDEX);
  147.     for (;x0 <= x1; x0++) {
  148.       SETPIXEL(x0, y, COLORINDEX);
  149.     }
  150.   }
  151. }
  152. void LCD_L0_DrawVLine  (int x, int y0,  int y1) {
  153.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  154.     while (y0 <= y1) {
  155.       XORPIXEL(x, y0);
  156.       y0++;
  157.     }
  158.   } else {
  159.     while (y0 <= y1) {
  160.       SETPIXEL(x, y0, COLORINDEX);
  161.       y0++;
  162.     }
  163.   }
  164. }
  165. void LCD_L0_FillRect(int x0, int y0, int x1, int y1) {
  166.   for (; y0 <= y1; y0++) {
  167.     LCD_L0_DrawHLine(x0,y0, x1);
  168.   }
  169. }
  170. /*
  171.   ***************************************************************
  172.   *                                                             *
  173.   *            Internal bitmap routines                         *
  174.   *                                                             *
  175.   ***************************************************************
  176. */
  177. /*
  178.     *********************************************
  179.     *                                           *
  180.     *      Draw Bitmap 1 BPP                    *
  181.     *                                           *
  182.     *********************************************
  183. */
  184. static void  DrawBitLine1BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  185.   LCD_PIXELINDEX Index0 = *(pTrans+0);
  186.   LCD_PIXELINDEX Index1 = *(pTrans+1);
  187.   x+=Diff;
  188. /*
  189. // Jump to right entry point
  190. */
  191.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {
  192.   case 0:    /* Write mode */
  193.     do {
  194.       LCDSIM_SetPixelIndex(x++,y, (*p & (0x80>>Diff)) ? Index1 : Index0);
  195. if (++Diff==8) {
  196.         Diff=0;
  197. p++;
  198. }
  199. } while (--xsize);
  200.     break;
  201.   case LCD_DRAWMODE_TRANS:
  202.     do {
  203.    if (*p & (0x80>>Diff))
  204.         LCDSIM_SetPixelIndex(x,y, Index1);
  205.       x++;
  206. if (++Diff==8) {
  207.         Diff=0;
  208. p++;
  209. }
  210. } while (--xsize);
  211.     break;
  212.   case LCD_DRAWMODE_XOR:;
  213.     do {
  214.    if (*p & (0x80>>Diff)) {
  215.         int Pixel = LCDSIM_GetPixelIndex(x,y);
  216.         LCDSIM_SetPixelIndex(x,y, LCD_NUM_COLORS-1-Pixel);
  217.       }
  218.       x++;
  219. if (++Diff==8) {
  220.         Diff=0;
  221. p++;
  222. }
  223. } while (--xsize);
  224.     break;
  225. }
  226. }
  227. /*
  228.     *********************************************
  229.     *                                           *
  230.     *      Draw Bitmap 2 BPP                    *
  231.     *                                           *
  232.     *********************************************
  233. */
  234. #if (LCD_MAX_LOG_COLORS > 2)
  235. static void  DrawBitLine2BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  236.   PIXELINDEX pixels;
  237. /*
  238. // Jump to right entry point
  239. */
  240.   pixels = *p;
  241.   if (GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) switch (Diff&3) {
  242.   case 0:
  243.     goto WriteTBit0;
  244.   case 1:
  245.     goto WriteTBit1;
  246.   case 2:
  247.     goto WriteTBit2;
  248.   default:
  249.     goto WriteTBit3;
  250.   } else switch (Diff&3) {
  251.   case 0:
  252.     goto WriteBit0;
  253.   case 1:
  254.     goto WriteBit1;
  255.   case 2:
  256.     goto WriteBit2;
  257.   default:
  258.     goto WriteBit3;
  259.   }
  260. /*
  261.         Write without transparency
  262. */
  263. WriteBit0:
  264.   SETPIXEL(x+0, y, *(pTrans+(pixels>>6)));
  265.   if (!--xsize)
  266.     return;
  267. WriteBit1:
  268.   SETPIXEL(x+1, y, *(pTrans+(3&(pixels>>4))));
  269.   if (!--xsize)
  270.     return;
  271. WriteBit2:
  272.   SETPIXEL(x+2, y, *(pTrans+(3&(pixels>>2))));
  273.   if (!--xsize)
  274.     return;
  275. WriteBit3:
  276.   SETPIXEL(x+3, y, *(pTrans+(3&(pixels))));
  277.   if (!--xsize)
  278.     return;
  279.   pixels = *(++p);
  280.   x+=4;
  281.   goto WriteBit0;
  282. /*
  283.         Write with transparency
  284. */
  285. WriteTBit0:
  286.   if (pixels&(3<<6))
  287.     SETPIXEL(x+0, y, *(pTrans+(pixels>>6)));
  288.   if (!--xsize)
  289.     return;
  290. WriteTBit1:
  291.   if (pixels&(3<<4))
  292.     SETPIXEL(x+1, y, *(pTrans+(3&(pixels>>4))));
  293.   if (!--xsize)
  294.     return;
  295. WriteTBit2:
  296.   if (pixels&(3<<2))
  297.     SETPIXEL(x+2, y, *(pTrans+(3&(pixels>>2))));
  298.   if (!--xsize)
  299.     return;
  300. WriteTBit3:
  301.   if (pixels&(3<<0))
  302.     SETPIXEL(x+3, y, *(pTrans+(3&(pixels))));
  303.   if (!--xsize)
  304.     return;
  305.   pixels = *(++p);
  306.   x+=4;
  307.   goto WriteTBit0;
  308. }
  309. #endif
  310. /*
  311.     *********************************************
  312.     *                                           *
  313.     *      Draw Bitmap 4 BPP                    *
  314.     *                                           *
  315.     *********************************************
  316. */
  317. #if (LCD_MAX_LOG_COLORS > 4)
  318. static void  DrawBitLine4BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  319.   U8 pixels;
  320. /*
  321. // Jump to right entry point
  322. */
  323.   pixels = *p;
  324.   if (GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) {
  325.     if ((Diff&1) ==0)
  326.       goto WriteTBit0;
  327.     goto WriteTBit1;
  328.   } else {
  329.     if ((Diff&1) ==0)
  330.       goto WriteBit0;
  331.     goto WriteBit1;
  332.   }
  333. /*
  334.         Write without transparency
  335. */
  336. WriteBit0:
  337.   SETPIXEL(x+0, y, *(pTrans+(pixels>>4)));
  338.   if (!--xsize)
  339.     return;
  340. WriteBit1:
  341.   SETPIXEL(x+1, y, *(pTrans+(pixels&0xf)));
  342.   if (!--xsize)
  343.     return;
  344.   x+=2;
  345.   pixels = *(++p);
  346.   goto WriteBit0;
  347. /*
  348.         Write with transparency
  349. */
  350. WriteTBit0:
  351.   if (pixels>>4)
  352.     SETPIXEL(x+0, y, *(pTrans+(pixels>>4)));
  353.   if (!--xsize)
  354.     return;
  355. WriteTBit1:
  356.   if (pixels&0xf)
  357.     SETPIXEL(x+1, y, *(pTrans+(pixels&0xf)));
  358.   if (!--xsize)
  359.     return;
  360.   x+=2;
  361.   pixels = *(++p);
  362.   goto WriteTBit0;
  363. }
  364. #endif
  365. /*
  366.     *********************************************
  367.     *                                           *
  368.     *      Draw Bitmap 8 BPP  (256 colors)      *
  369.     *                                           *
  370.     *********************************************
  371. */
  372. #if (LCD_MAX_LOG_COLORS > 16)
  373. static void  DrawBitLine8BPP(int x, int y, U8 const*p, int xsize, const LCD_PIXELINDEX*pTrans) {
  374.   LCD_PIXELINDEX pixel;
  375.   if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS)==0) {
  376.     if (pTrans) {
  377.       for (;xsize > 0; xsize--,x++,p++) {
  378.         pixel = *p;
  379.         SETPIXEL(x, y, *(pTrans+pixel));
  380.       }
  381.     } else {
  382.       for (;xsize > 0; xsize--,x++,p++) {
  383.         SETPIXEL(x, y, *p);
  384.       }
  385.     }
  386.   } else {   /* Handle transparent bitmap */
  387.     if (pTrans) {
  388.       for (; xsize > 0; xsize--, x++, p++) {
  389.         pixel = *p;
  390.         if (pixel) {
  391.           SETPIXEL(x+0, y, *(pTrans+pixel));
  392.         }
  393.       }
  394.     } else {
  395.       for (; xsize > 0; xsize--, x++, p++) {
  396.         pixel = *p;
  397.         if (pixel) {
  398.           SETPIXEL(x+0, y, pixel);
  399.         }
  400.       }
  401.     }
  402.   }
  403. }
  404. #endif
  405. /*
  406.     *********************************************
  407.     *                                           *
  408.     *      Draw Bitmap 16 BPP  (65536 colors)   *
  409.     *                                           *
  410.     *********************************************
  411. */
  412. #if (LCD_BITSPERPIXEL > 8)
  413. static void  DrawBitLine16BPP(int x, int y, U16 const*p, int xsize, const LCD_PIXELINDEX*pTrans) {
  414.   LCD_PIXELINDEX pixel;
  415.   if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS)==0) {
  416.     if (pTrans) {
  417.       for (;xsize > 0; xsize--,x++,p++) {
  418.         pixel = *p;
  419.         SETPIXEL(x, y, *(pTrans+pixel));
  420.       }
  421.     } else {
  422.       for (;xsize > 0; xsize--,x++,p++) {
  423.         SETPIXEL(x, y, *p);
  424.       }
  425.     }
  426.   } else {   /* Handle transparent bitmap */
  427.     if (pTrans) {
  428.       for (; xsize > 0; xsize--, x++, p++) {
  429.         pixel = *p;
  430.         if (pixel) {
  431.           SETPIXEL(x+0, y, *(pTrans+pixel));
  432.         }
  433.       }
  434.     } else {
  435.       for (; xsize > 0; xsize--, x++, p++) {
  436.         pixel = *p;
  437.         if (pixel) {
  438.           SETPIXEL(x+0, y, pixel);
  439.         }
  440.       }
  441.     }
  442.   }
  443. }
  444. #endif
  445. /*
  446.         *********************************************************
  447.         *                                                       *
  448.         *         Universal draw Bitmap routine                 *
  449.         *                                                       *
  450.         *********************************************************
  451. */
  452. void LCD_L0_DrawBitmap   (int x0, int y0,
  453.                        int xsize, int ysize,
  454.                        int BitsPerPixel, 
  455.                        int BytesPerLine,
  456.                        const U8* pData, int Diff,
  457.                        const LCD_PIXELINDEX* pTrans)
  458. {
  459.   int i;
  460.   /*
  461.      Use DrawBitLineXBPP
  462.   */
  463.   for (i=0; i<ysize; i++) {
  464.     switch (BitsPerPixel) {
  465.     case 1:
  466.       DrawBitLine1BPP(x0, i+y0, pData, Diff, xsize, pTrans);
  467.       break;
  468.     #if (LCD_MAX_LOG_COLORS > 2)
  469.       case 2:
  470.         DrawBitLine2BPP(x0, i+y0, pData, Diff, xsize, pTrans);
  471.         break;
  472.     #endif
  473.     #if (LCD_MAX_LOG_COLORS > 4)
  474.       case 4:
  475.         DrawBitLine4BPP(x0, i+y0, pData, Diff, xsize, pTrans);
  476.         break;
  477.     #endif
  478.     #if (LCD_MAX_LOG_COLORS > 16)
  479.       case 8:
  480.         DrawBitLine8BPP(x0, i+y0, pData, xsize, pTrans);
  481.         break;
  482.     #endif
  483.     #if (LCD_BITSPERPIXEL > 8)
  484.       case 16:
  485.         DrawBitLine16BPP(x0, i+y0, (const U16 *)pData, xsize, pTrans);
  486.         break;
  487.     #endif
  488.     }
  489.     pData += BytesPerLine;
  490.   }
  491. }
  492. /********************************************************
  493. *
  494. *       LCD_L0_SetOrg
  495. *
  496. *********************************************************
  497. Purpose:        Sets the original position of the virtual display.
  498.                 Has no function at this point with the PC-driver.
  499. */
  500. int OrgX, OrgY;
  501. void LCD_L0_SetOrg(int x, int y) {
  502.   OrgX = x;
  503.   OrgY = y;
  504. }
  505. /*
  506.         *********************************************************
  507.         *                                                       *
  508.         *           Support for verification                    *
  509.         *                                                       *
  510.         *********************************************************
  511. The following routines are implemented, but have no functionility
  512. at this point. The reason is that these functions are supposed
  513. to supervise the hardware, which for obvious reasons can not be
  514. done in a simulation.
  515. */
  516. #if LCD_VERIFY
  517. int  LCD_GetErrStat(void) {
  518.   return 0;
  519. }
  520. void LCD_ClrErrStat(void) {
  521. }
  522. int  LCD_GetErrCnt (void) {
  523.   return 0;
  524. }
  525. #endif  
  526. /*
  527.         *********************************************************
  528.         *                                                       *
  529.         *       LCD_On                                          *
  530.         *       LCD_Off                                         *
  531.         *                                                       *
  532.         *********************************************************
  533. (Not supported in Simulation)
  534. */
  535. void LCD_Off          (void) {}
  536. void LCD_On           (void) {}
  537. /*
  538.         *********************************************************
  539.         *                                                       *
  540.         *       LUT routines (lookup tables)                    *
  541.         *                                                       *
  542.         *********************************************************
  543. */
  544. void LCD_L0_SetLUTEntry(U8 Pos, LCD_COLOR color) {
  545.   LCDSIM_SetLUTEntry(Pos, color);
  546. }
  547. /*
  548.         *********************************************************
  549.         *                                                       *
  550.         *       LCD_Init : Init the display                     *
  551.         *                                                       *
  552.         *********************************************************
  553. */
  554. int  LCD_L0_Init(void) {
  555.   int x,y;
  556.   // Create Bitmaps to simulate LCD (pages)
  557.   for (x=0; x< LCD_XSIZE; x++)
  558.     for (y=0; y< LCD_YSIZE; y++)
  559.       SETPIXEL( x, y, BKCOLORINDEX);
  560. return 0;
  561. }
  562. int  LCD_L0_CheckInit(void) {
  563.   return 0;
  564. /*
  565.         ******************************************
  566.         *                                        *
  567.         *    Re-initialize LCD                   *
  568.         *                                        *
  569.         ******************************************
  570. This routine is supplied for compatibility and interchangability of
  571. "C"-sources with embedded versions of the driver. It has no real
  572. effect in the PC-version as there is simply no need to re-initialize
  573. the LCD since it is just simulated anyhow.
  574. */
  575. void LCD_L0_ReInit       (void) {}
  576. unsigned LCD_L0_GetPixelIndex(int x, int y)  {
  577.   return LCDSIM_GetPixelIndex(x,y);
  578. }
  579. /*
  580.         *********************************************************
  581.         *                                                       *
  582.         *       LCD_L0_XorPixel                                 *
  583.         *                                                       *
  584.         *********************************************************
  585. Purpose:  This routine is called by emWin. It writes 1 pixel into the
  586.           display.
  587. */
  588. void LCD_L0_XorPixel(int x, int y) {
  589.   XORPIXEL(x, y);
  590. }
  591. /*
  592.         *********************************************************
  593.         *                                                       *
  594.         *       LCD_L0_SetPixelIndex                            *
  595.         *                                                       *
  596.         *********************************************************
  597. Purpose:  This routine is called by emWin. It writes 1 pixel into the
  598.           display.
  599. */
  600. void LCD_L0_SetPixelIndex(int x, int y, int ColorIndex) {
  601.   SETPIXEL(x, y, ColorIndex);
  602. }
  603. #else
  604.   void LCDWin(void) { } /* avoid empty object files */
  605. #endif /* defined(WIN32) && defined(LCD_USE_WINSIM) */