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

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        : GUI_StreamBMP.C
  18. Purpose     : Draw stream data bitmaps
  19. ---------------------------END-OF-HEADER------------------------------
  20. */
  21. #include <stddef.h>           /* needed for definition of NULL */
  22. #include "GUI_Private.H"
  23. #include "GUIDebug.h"
  24. #define BI_RGB  0   /* Windows define */
  25. static void StreamU16 (U16 Data, GUI_CALLBACK_VOID_U8_P* pfStream, void* p) {
  26.   (*pfStream) (Data,      p);
  27.   (*pfStream) (Data >> 8, p);
  28. }
  29. static void StreamU32 (U32 Data, GUI_CALLBACK_VOID_U8_P* pfStream, void* p) {
  30.   StreamU16(Data, pfStream, p);
  31.   StreamU16(Data >> 16, pfStream, p);
  32. }
  33. /************************************************
  34. *                                               *
  35. *             Draw  point                       *
  36. *                                               *
  37. *************************************************
  38. */
  39.  
  40. void GUI_StreamBMP (GUI_RECT* pRect, GUI_CALLBACK_VOID_U8_P* pfStream, void *p) {
  41.   GUI_RECT r;
  42.   int i, x, y, BPP;
  43.   int NumColors;
  44.   U32 Size;
  45.   GUI_LOCK();
  46.   if (pRect) {
  47.     r = *pRect;
  48.   } else {
  49.     r.x0 = r.y0 = 0;
  50.     r.x1 = LCD_GetXSize() -1;
  51.     r.y1 = LCD_GetYSize() -1;
  52.   }
  53.   Size = (r.x1 - r.x0 + 1) * (r.y1 - r.y0 + 1);
  54.   BPP = LCD_GetBitsPerPixel();
  55.   NumColors = (BPP <= 8) ? (1 << BPP) : 0;
  56. /* Save Bitmap fileheader : BITMAPFILEHEADER : 14 bytes */
  57.   (*pfStream) ('B', p);             /* WORD Type */
  58.   (*pfStream) ('M', p);
  59.   StreamU32(Size, pfStream, p);     /* DWORD bfSize */
  60.   StreamU32(0, pfStream, p);        /*  WORD aReserved[2]: Has to be 0 */
  61.   StreamU32(0x76, pfStream, p);     /* DWORD bfOffBits: Offset to bits (constant) */
  62. /* BITMAPINFOHEADER: 40 bytes */
  63.   StreamU32(0x28, pfStream, p);     /* DWORD sizeof(BITMAPINFOHEADER) */
  64.   StreamU32(r.x1 - r.x0 +1, pfStream, p);  /* I32    biWidth */
  65.   StreamU32(r.y1 - r.y0 +1, pfStream, p);  /* I32    biHeigth */
  66.   StreamU16(1, pfStream, p);               /* WORD   biPlanes; */
  67.   StreamU16(BPP, pfStream, p); /* WORD   biBitCount */
  68.   StreamU32(BI_RGB, pfStream, p);          /*    DWORD  biCompression; */
  69.   StreamU32(0, pfStream, p);               /*    DWORD  biSizeImage; (may be 0 for BI_RGB) */
  70.   StreamU32(0, pfStream, p);               /*    LONG   biXPelsPerMeter; */
  71.   StreamU32(0, pfStream, p);               /*    LONG   biYPelsPerMeter; */ 
  72.   StreamU32(0, pfStream, p);               /*    DWORD  biClrUsed;  0 means max. number fitting into bits */
  73.   StreamU32(0, pfStream, p);               /*    DWORD  biClrImportant;  0 means all colors are required  */
  74. /* RGBQuads */
  75.   for (i = 0; i < NumColors; i++) {
  76.     LCD_COLOR Color;
  77.     Color = GUI_Index2Color(i);
  78.     StreamU32(Color, pfStream, p);
  79.   }
  80. /* Store indices */
  81.   for (y = r.y0; y <= r.y1; y++) {
  82.     for (x = r.x0; x <= r.x1; x++) {
  83.       U8 Data;
  84.       Data = LCD_L0_GetPixelIndex(x, y);
  85.       (*pfStream) (Data, p);
  86.     }
  87.   }  
  88.   GUI_UNLOCK();
  89. }