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

uCOS

开发平台:

C/C++

  1. /*********************************************************************
  2. *                SEGGER MICROCONTROLLER SYSTEME GmbH                 *
  3. *        Solutions for real time microcontroller applications        *
  4. **********************************************************************
  5. *                                                                    *
  6. *        (c) 2002         SEGGER Microcontroller Systeme GmbH        *
  7. *                                                                    *
  8. *        Internet: www.segger.com    Support:  support@segger.com    *
  9. *                                                                    *
  10. **********************************************************************
  11. **** emWin/GSC Grafical user interface for embedded applications ****
  12. emWin is protected by international copyright laws. Knowledge of the
  13. source code may not be used to write a similar product. This file may
  14. only be used in accordance with a license and should not be re-
  15. distributed in any way. We appreciate your understanding and fairness.
  16. ----------------------------------------------------------------------
  17. File        : LCD.c
  18. Purpose     : Link between GUI and LCD_L0
  19.               Performs most of the clipping.
  20. ---------------------------END-OF-HEADER------------------------------
  21. */
  22. #define LCD_C
  23. #include <stdio.h>
  24. #include "GUI_Private.H"
  25. #include "LCD_Private.h"
  26. #include "GUIDebug.h"
  27. /*
  28.         *********************************************************
  29.         *                                                       *
  30.         *       Macros for internal use                         *
  31.         *                                                       *
  32.         *********************************************************
  33. */
  34. #define RETURN_IF_Y_OUT() 
  35.   if (y < GUI_Context.ClipRect.y0) return;             
  36.   if (y > GUI_Context.ClipRect.y1) return;
  37. #define RETURN_IF_X_OUT() 
  38.   if (x < GUI_Context.ClipRect.x0) return;             
  39.   if (x > GUI_Context.ClipRect.x1) return;
  40. #define CLIP_X() 
  41.   if (x0 < GUI_Context.ClipRect.x0) { x0 = GUI_Context.ClipRect.x0; } 
  42.   if (x1 > GUI_Context.ClipRect.x1) { x1 = GUI_Context.ClipRect.x1; }
  43. #define CLIP_Y() 
  44.   if (y0 < GUI_Context.ClipRect.y0) { y0 = GUI_Context.ClipRect.y0; } 
  45.   if (y1 > GUI_Context.ClipRect.y1) { y1 = GUI_Context.ClipRect.y1; }
  46. /*
  47.         *********************************************************
  48.         *                                                       *
  49.         *       LCD_SetColorIndex                               *
  50.         *       LCD_SetBkColorIndex                             *
  51.         *                                                       *
  52.         *********************************************************
  53. */
  54. static int GetColorIndex(int i)  /* i is 0 or 1 */ {
  55. int ret;
  56.   ret =  (GUI_Context.DrawMode & LCD_DRAWMODE_REV) ? i-1 : i;
  57.   if(ret == -1) ret = 1;
  58.   return ret;
  59. }
  60. void LCD_SetColorIndex(int Index)   { LCD_ACOLORINDEX[GetColorIndex(1)] = Index; }
  61. void LCD_SetBkColorIndex(int Index) { LCD_ACOLORINDEX[GetColorIndex(0)] = Index; }
  62. /*
  63.         *********************************************************
  64.         *                                                       *
  65.         *       LCD_SetDrawMode                                 *
  66.         *                                                       *
  67.         *********************************************************
  68. */
  69. LCD_DRAWMODE LCD_SetDrawMode  (LCD_DRAWMODE dm) {
  70.   LCD_DRAWMODE OldDM = GUI_Context.DrawMode;
  71.   if ((GUI_Context.DrawMode^dm) & LCD_DRAWMODE_REV) {
  72.     LCD_PIXELINDEX temp = LCD_BKCOLORINDEX;
  73.     LCD_BKCOLORINDEX    = LCD_COLORINDEX;
  74.     LCD_COLORINDEX = temp;
  75.   }
  76.   GUI_Context.DrawMode = dm;
  77.   return OldDM;
  78. }
  79. /*
  80.         *********************************************************
  81.         *                                                       *
  82.         *       LCD_DrawPixel                                   *
  83.         *                                                       *
  84.         *********************************************************
  85. Purpose:  This routine is called by emWin. It writes 1 pixel into the
  86.           display using the current drawing mode.
  87. */
  88. void LCD_DrawPixel(int x, int y) {
  89.   RETURN_IF_Y_OUT();
  90.   RETURN_IF_X_OUT();
  91.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  92.     LCDDEV_L0_XorPixel(x, y);
  93.   } else {
  94.     LCDDEV_L0_SetPixelIndex(x, y, LCD_COLORINDEX);
  95.   }
  96. }
  97. /*
  98.         *********************************************************
  99.         *                                                       *
  100.         *          LCD_DrawLine  vertical/horizontal            *
  101.         *          LCD_DrawRect                                 *
  102.         *                                                       *
  103.         *********************************************************
  104. */
  105. void LCD_DrawHLine  (int x0, int y,  int x1) {
  106.   /* Perform clipping and check if there is something to do */
  107.   RETURN_IF_Y_OUT();
  108.   CLIP_X();
  109.   if (x1<x0)
  110.     return;
  111.   /* Call driver to draw */
  112.   LCDDEV_L0_DrawHLine(x0, y, x1);
  113. }
  114. void LCD_FillRect(int x0, int y0, int x1, int y1) {
  115.   /* Perform clipping and check if there is something to do */
  116.   CLIP_X();
  117.   if (x1<x0)
  118.     return;
  119.   CLIP_Y();
  120.   if (y1<y0)
  121.     return;
  122.   /* Call driver to draw */
  123.   LCDDEV_L0_FillRect(x0,y0,x1,y1);
  124. }
  125. /*
  126.     **********************************************************************
  127.     *                                                                    *
  128.     *             Universal draw Bitmap routine                          *
  129.     *                                                                    *
  130.     **********************************************************************
  131. */
  132. void LCD_DrawBitmap   (int x0, int y0,
  133.                        int xsize, int ysize,
  134.                        int xMul, int yMul,
  135.                        int BitsPerPixel,
  136.                        int BytesPerLine,
  137.                        const U8* pPixel,
  138.                        const LCD_LOGPALETTE* pLogPal) {
  139.   U8  Data;
  140.   int x1, y1;
  141.   const LCD_PIXELINDEX* pTrans;
  142.   /* Handle the optional Y-magnification */
  143.   y1 = y0+ysize-1;
  144.   x1 = x0+xsize-1;
  145.   /* Handle color translation */
  146.   if ((pLogPal) && (pLogPal->pPalEntries)) {
  147.     if ((pTrans = LCD_GetpPalConvTable(pLogPal)) == NULL) {
  148.       return;
  149.     }
  150.   } else {
  151. pTrans = (BitsPerPixel != 1) ? NULL : &LCD_BKCOLORINDEX;
  152.   }
  153. /*  Handle BITMAP without magnification */
  154.   if ((xMul==1) && (yMul==1)) {
  155.     int Diff;
  156.     /*    Clip Y    */
  157.     if (y0 < GUI_Context.ClipRect.y0) {
  158.       Diff = GUI_Context.ClipRect.y0 -y0;
  159.       y0     = GUI_Context.ClipRect.y0;
  160.       pPixel += Diff*BytesPerLine;
  161.       ysize -= Diff;
  162.     }
  163.     if (y1 > GUI_Context.ClipRect.y1) {
  164.       int Diff = y1-GUI_Context.ClipRect.y1;
  165.       ysize -= Diff;
  166.     }
  167.     if (ysize <=0)
  168.   return;
  169.     /*        Clip right side    */
  170.     if (x1 > GUI_Context.ClipRect.x1) {
  171.       int Diff = x1-GUI_Context.ClipRect.x1;
  172.       xsize -= Diff;
  173.     }
  174.     /*        Clip left side ... (The difficult side ...)    */
  175.     Diff =0;
  176.     if (x0 < GUI_Context.ClipRect.x0) {
  177.       Diff = GUI_Context.ClipRect.x0-x0;
  178. xsize-=Diff;
  179. switch (BitsPerPixel) {
  180. case 1:
  181.    pPixel+= (Diff>>3); x0 += (Diff>>3)<<3; Diff &=7;
  182. break;
  183. case 2:
  184.    pPixel+= (Diff>>2); x0 += (Diff>>2)<<2; Diff &=3;
  185. break;
  186. case 4:
  187. pPixel+= (Diff>>1); x0 += (Diff>>1)<<1; Diff &=1;
  188. break;
  189. case 8:
  190. pPixel+= Diff;      x0 += Diff; Diff=0;
  191. break;
  192. case 16:
  193. pPixel+= (Diff<<1); x0 += Diff; Diff=0;
  194. break;
  195. }
  196.     }
  197.     if (xsize <=0)
  198.   return;
  199.     LCDDEV_L0_DrawBitmap   (x0,y0, xsize, ysize, BitsPerPixel, BytesPerLine, pPixel, Diff, pTrans);
  200.   } else {
  201.     /**** Handle BITMAP with magnification ***/
  202.     int x,y;
  203.     int yi;
  204.     int Shift = 8-BitsPerPixel;
  205.     for (y=y0, yi=0; yi<ysize; yi++, y+= yMul, pPixel+=BytesPerLine) {
  206.       int yMax = y+yMul-1;
  207.       /* Draw if within clip area (Optimization ... "if" is not required !) */
  208.       if ((yMax >= GUI_Context.ClipRect.y0) && (y <= GUI_Context.ClipRect.y1)) {
  209.         int BitsLeft =0;
  210.         int xi;
  211.         const U8* pDataLine = pPixel;
  212.         for (x=x0, xi=0; xi<xsize; xi++, x+=xMul) {
  213.           U8  Index;
  214.           if (!BitsLeft) {
  215.             Data = *pDataLine++;
  216.             BitsLeft =8;
  217.           }
  218.           Index = Data>>Shift;
  219.           Data    <<= BitsPerPixel;
  220.           BitsLeft -= BitsPerPixel;
  221.           if (Index | ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) ==0)) {
  222.             LCD_PIXELINDEX  OldColor = LCD_COLORINDEX;
  223.             if (pTrans) {
  224.               LCD_COLORINDEX = *(pTrans+Index);
  225.             } else {
  226.               LCD_COLORINDEX = Index;
  227.             }
  228.             LCD_FillRect(x,y, x+xMul-1, yMax);
  229.             LCD_COLORINDEX = OldColor;
  230.           }
  231.         }
  232.       }
  233.     }
  234.   }
  235. }
  236. /*********************************************************************
  237. *
  238. *           Set Max Clip Rect
  239. *
  240. **********************************************************************
  241. */
  242. void LCD_SetClipRectMax(void) {
  243.   LCDDEV_L0_GetRect(&GUI_Context.ClipRect);
  244. }
  245. /*
  246.         *********************************************************
  247.         *                                                       *
  248.         *       LCD_Init : Init the display                     *
  249.         *                                                       *
  250.         *********************************************************
  251. */
  252. int  LCD_Init(void) {
  253.   int r;
  254.   GUI_DEBUG_LOG("nLCD_Init...");
  255.   LCD_SetClipRectMax();
  256.   if ((r = LCD_L0_Init()) != 0)
  257.     return r;
  258. #if LCD_NUM_DISPLAYS > 1
  259.   if ((r = LCD_L0_1_Init()) != 0)
  260.     return r;
  261. #endif
  262.   LCD_InitLUT();
  263. /* Clear video memory */
  264.   LCD_SetDrawMode(GUI_DRAWMODE_REV);
  265.   LCD_FillRect(0,0, GUI_XMAX, GUI_YMAX);
  266.   LCD_SetDrawMode(0);
  267. /* Switch LCD on */
  268.   LCD_On();
  269.   return 0;
  270. }
  271. /*********************************************************************
  272. *
  273. *           LCD_Index2Color
  274. *           LCD_Color2Index
  275. *
  276. **********************************************************************
  277. */
  278. int LCD_Color2Index     (LCD_COLOR Color) {
  279.   return LCDDEV_L0_Color2Index(Color);
  280. }
  281. LCD_COLOR LCD_Index2Color (int Index) {
  282.   return LCDDEV_L0_Index2Color(Index);
  283. }
  284. /*********************************************************************
  285. *
  286. *           LCD_SetBkColor
  287. *           LCD_SetColor
  288. *
  289. **********************************************************************
  290. Purpose:  Assign color/index to foreground/ background
  291. */
  292. void LCD_SetBkColor(GUI_COLOR color) {
  293.   LCD_SetBkColorIndex(LCD_Color2Index(color));
  294. }
  295. void LCD_SetColor(GUI_COLOR color) {
  296.   LCD_SetColorIndex(LCD_Color2Index(color));
  297. }