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

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. #include <stddef.h>             /* needed for definition of NULL */
  23. #include "GUI_Private.h"
  24. #include "GUIDebug.h"
  25. #include "LCD_Private.H"      /* private modul definitions & config */
  26. #if LCD_XMAG > 2
  27.   #error Not yet supported
  28. #endif
  29. #if LCD_XMAG == 2
  30. static const U8 abData12[16] = {
  31.   0x0, 0x3, 0xc, 0xf, 0x30, 0x33, 0x3c, 0x3f, 0xC0, 0xC3, 0xCc, 0xcf, 0xf0, 0xf3, 0xfc, 0xff
  32. };
  33. static const U8 abData22[16] = {
  34.   0x0,   0x5, 0x5*2, 0x5*3,
  35.   0x50*1+0x0, 0x50*1+0x5, 0x50*1+0x5*2, 0x50*1+0x5*3,
  36.   0x50*2+0x0, 0x50*2+0x5, 0x50*2+0x5*2, 0x50*2+0x5*3,
  37.   0x50*3+0x0, 0x50*3+0x5, 0x50*3+0x5*2, 0x50*3+0x5*3
  38. };
  39. static const U8 abData32[16] = {
  40.   0x0, 0x11, 0x22, 0x33,
  41.   0x44, 0x55, 0x66, 0x77,
  42.   0x88, 0x99, 0xaa, 0xbb,
  43.   0xcc, 0xdd, 0xee, 0xff
  44. };
  45. static void DrawBitline(int x0, int y0, int xsize, int BPP, const U8*pData, int Diff, const LCD_PIXELINDEX* pTrans) {
  46.   union {
  47.     U8  ab[100];     /* Byte Buffer */
  48.     U16 au16[50];    /* Word Buffer */
  49.   } Buffer;
  50.   int i;
  51.   int NumPixels;
  52.   int NumPixelsMax = sizeof(Buffer.ab)*8/BPP/LCD_XMAG;
  53.   while (xsize >0) {
  54.     int iOff =0;
  55.     NumPixels = (xsize < NumPixelsMax) ? xsize : NumPixelsMax;
  56.     switch (BPP) {
  57.     case 1:
  58.       for (i=0; i<NumPixels; i+=8) {
  59.         /* load the byte */
  60.         U16 Data;
  61.         if (Diff) {
  62.           Data = ((*pData) << 8) | (*(pData+1));
  63.           Data >>= 8-Diff;
  64.           Data &= 0xff;
  65.         } else {
  66.           Data = *pData;
  67.         }
  68.         pData++;
  69.         Buffer.ab[iOff++] = abData12[Data>>4]; 
  70.         Buffer.ab[iOff++] = abData12[Data&15]; 
  71.       }
  72.       break;
  73.     case 2:
  74.       for (i=0; i<NumPixels; i+=4) {
  75.         /* load the byte */
  76.         U16 Data;
  77.         if (Diff) {
  78.           Data = ((*pData) << 8) | (*(pData+1));
  79.           Data >>= 8-(Diff<<1);
  80.           Data &= 0xff;
  81.         } else {
  82.           Data = *pData;
  83.         }
  84.         pData++;
  85.         Buffer.ab[iOff++] = abData22[Data>>4]; 
  86.         Buffer.ab[iOff++] = abData22[Data&15]; 
  87.       }
  88.       break;
  89.     case 4:
  90.       for (i=0; i<NumPixels; i+=2) {
  91.         /* load the byte */
  92.         U16 Data;
  93.         if (Diff) {
  94.           Data = ((*pData) << 8) | (*(pData+1));
  95.           Data >>= 8-(Diff<<2);
  96.           Data &= 0xff;
  97.         } else {
  98.           Data = *pData;
  99.         }
  100.         pData++;
  101.         Buffer.ab[iOff++] = abData32[Data>>4]; 
  102.         Buffer.ab[iOff++] = abData32[Data&15]; 
  103.       }
  104.       break;
  105.     case 8:
  106.       for (i=0; i<NumPixels; i++) {
  107.         #if LCD_XMAG > 2
  108.           memset (&Buffer.ab[i*LCD_XMAG], *(pData+i), LCD_XMAG);
  109.         #else
  110.           Buffer.ab[i*LCD_XMAG] = Buffer.ab[i*LCD_XMAG+1] = *pData++; 
  111.         #endif
  112.       }
  113.       break;
  114.     case 16:
  115.       for (i=0; i<NumPixels; i++) {
  116.         #if LCD_XMAG > 2
  117.           memset (&Buffer.ab[i*LCD_XMAG], *(pData+i), LCD_XMAG);
  118.         #else
  119.           Buffer.au16[i*LCD_XMAG] = Buffer.au16[i*LCD_XMAG+1] = *(U16*)pData;
  120.           pData += 2; /* Move to next word */
  121.         #endif
  122.       }
  123.       break;
  124.     }
  125.     LCD_L0_DrawBitmap(x0 + Diff * LCD_XMAG, y0, NumPixels * LCD_XMAG, LCD_YMAG, BPP, 0, Buffer.ab, 0, pTrans);
  126.     x0 += NumPixels*LCD_XMAG;
  127.     xsize -= NumPixels;
  128.   }
  129. }
  130. void LCD_L0_MAG_DrawBitmap   (int x0, int y0, int xsize, int ysize,
  131.                        int BPP, int BytesPerLine,
  132.                        const U8* pData, int Diff,
  133.                        const LCD_PIXELINDEX* pTrans)
  134. {
  135.   int iLine;
  136.   y0 *= LCD_YMAG;
  137.   x0 *= LCD_XMAG;
  138.   for (iLine = 0; iLine < ysize; iLine++) {
  139.     #if LCD_XMAG == 1
  140.       LCD_L0_DrawBitmap(x0, y0, xsize, LCD_YMAG, BPP, 0, pData, Diff, pTrans);
  141.     #else
  142.       DrawBitline(x0, y0, xsize, BPP, pData, Diff, pTrans);
  143.     #endif
  144.     y0+= LCD_YMAG;
  145.     pData += BytesPerLine;
  146.   }
  147. }
  148. void         LCD_L0_MAG_DrawHLine    (int x0, int y0,  int x1) {
  149.   x0 *= LCD_XMAG;
  150.   x1 = x1*(LCD_XMAG) + LCD_XMAG-1;
  151.   y0 *= LCD_YMAG;
  152.   LCD_L0_FillRect(x0, y0, x1, y0 + LCD_YMAG-1);
  153. }
  154. void         LCD_L0_MAG_DrawVLine    (int x0 , int y0,  int y1) {
  155.   y0 *= LCD_YMAG;
  156.   y1 = y1*(LCD_YMAG) + LCD_YMAG-1;
  157.   x0 *= LCD_XMAG;
  158.   LCD_L0_FillRect(x0, y0, x0 + LCD_XMAG-1, y1);
  159. }
  160. void         LCD_L0_MAG_FillRect     (int x0, int y0, int x1, int y1) {
  161.   y0 *= LCD_YMAG;
  162.   y1 = y1*(LCD_YMAG) + LCD_YMAG-1;
  163.   x0 *= LCD_XMAG;
  164.   x1 = x1*(LCD_XMAG) + LCD_XMAG-1;
  165.   LCD_L0_FillRect(x0, y0, x1, y1);
  166. }
  167. unsigned int LCD_L0_MAG_GetPixelIndex(int x, int y) {
  168.   return LCD_L0_GetPixelIndex(x* LCD_XMAG, y* LCD_YMAG);
  169. }
  170. void         LCD_L0_MAG_SetPixelIndex(int x, int y, int ColorIndex) {
  171.   int ix, iy;
  172.   y *= LCD_YMAG;
  173.   x *= LCD_XMAG;
  174.   for (iy=0; iy< LCD_YMAG; iy++) {
  175.     for (ix=0; ix< LCD_XMAG; ix++) {
  176.       LCD_L0_SetPixelIndex(x+ix, y+iy, ColorIndex);
  177.     }
  178.   }
  179. }
  180. void         LCD_L0_MAG_XorPixel     (int x, int y) {
  181.   int ix, iy;
  182.   y *= LCD_YMAG;
  183.   x *= LCD_XMAG;
  184.   for (iy=0; iy< LCD_YMAG; iy++) {
  185.     for (ix=0; ix< LCD_XMAG; ix++) {
  186.       LCD_L0_XorPixel(x+ix, y+iy);
  187.     }
  188.   }
  189. }
  190. #else
  191. void LCDL0Mag(void) { } /* avoid empty object files */
  192. #endif