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

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        : GUIDev.C
  16. Purpose     : Implementation of memory devices
  17. ---------------------------END-OF-HEADER------------------------------
  18. */
  19. #include <string.h>
  20. #include "GUI_Protected.h"
  21. #include "GUIDebug.h"
  22. /* Memory device capabilities are compiled only if support for them is enabled.*/ 
  23. #if GUI_SUPPORT_MEMDEV
  24. typedef struct {
  25.   GUI_USAGE Public;
  26.   struct {
  27.     int BytesPerLine;
  28.   } Private;
  29. } GUI_USAGE_BM;
  30. static void GUI_USAGE_BM_AddPixel(GUI_USAGE* p, int x, int y) {
  31.   U8* pData;
  32.   const GUI_USAGE_BM * pThis = (GUI_USAGE_BM*)p;
  33.   #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL
  34.     if ((x >= pThis->Public.x0 + pThis->Public.XSize) | (x < pThis->Public.x0)
  35.       | (y >= pThis->Public.y0 + pThis->Public.YSize) | (y < pThis->Public.y0))
  36.     {
  37.       GUI_DEBUG_ERROROUT2("GUI_USAGE_BM_AddPixel: parameters out of bounds",x,y);
  38.     }
  39.   #endif
  40.   x -= pThis->Public.x0;
  41.   pData =  (U8*)(pThis+1); 
  42.   pData += (y-pThis->Public.y0) * pThis->Private.BytesPerLine;
  43.   pData += x>>3;
  44.   *pData|= 0x80>>(x&7);
  45. }
  46. static void GUI_USAGE_BM_AddHLine(GUI_USAGE* p, int x, int y, int len) {
  47. #if 0   /* Enable for the slower, but smaller version ... xxx*/
  48.   while (len-- >0)
  49.     GUI_USAGE_BM_AddPixel(h, x++,y);
  50. #else
  51.   U8* pData;
  52.   const GUI_USAGE_BM * pThis = (GUI_USAGE_BM*)p;
  53.   /* Asserts */
  54.   GUI_DEBUG_ERROROUT3_IF( x<pThis->Public.x0, "GUIDEV.c: MarkPixels: negative x offset, Act= %d, Border= %d, Clip= %d"
  55.                     ,x, pThis->Public.x0, GUI_Context.ClipRect.x0);
  56.   /* Calculate pointers */
  57.   x -= pThis->Public.x0;
  58.   pData =  (U8*)(pThis+1); 
  59.   pData += (y-pThis->Public.y0) * pThis->Private.BytesPerLine;
  60.   pData += x>>3;
  61.   /* Set bits */
  62.   {  
  63.     int x1 = x+len-1;   /* last pixel */
  64.     int NumBytes = (x1>>3) - (x>>3);
  65.     U8 Mask0 = 0xff >> (x&7);
  66.     U8 Mask1 = 0xff << (7-(x1&7));
  67.     if (NumBytes ==0) {
  68.       *pData |= (Mask0&Mask1);
  69.     } else {
  70.       *pData++ |= Mask0;               /* Mark first byte */
  71.       /* Mark middle bytes */
  72.       if (--NumBytes > 0) {
  73.         memset (pData, 0xff, NumBytes);
  74.         pData += NumBytes;
  75.       }
  76.       *pData |= Mask1;                 /* Mark last bytes */
  77.     }
  78.   }
  79. #endif
  80. }
  81. static void GUI_USAGE_BM_Clear(GUI_USAGE* p) {
  82.   GUI_USAGE_BM * pThis = (GUI_USAGE_BM*) p;
  83.   memset (pThis+1, 0, pThis->Public.YSize * pThis->Private.BytesPerLine);
  84. }
  85. static int GUI_USAGE_BM_GetNextDirty(GUI_USAGE* p, int *pxOff, int yOff) {
  86.   int x = *pxOff;
  87.   int xEnd;
  88.   const GUI_USAGE_BM * pThis = (GUI_USAGE_BM*)p;
  89.   int xSize = pThis->Public.XSize;
  90.   U8* pData = (U8*)(pThis+1);
  91.   pData += yOff * pThis->Private.BytesPerLine;
  92.   pData += (x>>3);
  93.   if (x>=xSize)
  94.     return 0;
  95.   {
  96. /* Find first bit */
  97.     int BytesLeft = ((xSize-1) >>3) - (x>>3);
  98.     /* Check first byte */
  99.     U8 Data = (*pData++) << (x&7);
  100.     while (Data == 0) {
  101.       if (BytesLeft ==0)
  102.         return 0;
  103.       Data = *pData++;
  104.       BytesLeft--;
  105.       x= (x+8) & ~7;
  106.     }
  107.     while ((Data&0x80) ==0) {
  108.       Data<<=1;
  109.       x++;
  110.     }
  111. /* Find last cleared byte */
  112.     if (Data != 0xff) {   /* This line is simply a speed-opt and may be eliminated */
  113.       xEnd =x;
  114.       while (Data&0x40) {
  115.         Data<<=1;
  116.         xEnd++;
  117.       }
  118.     } else {
  119.       xEnd =x+7;
  120.     }
  121.     if ((xEnd&7) ==7) {
  122.       while (--BytesLeft >= 0) {
  123.         if ((Data = *pData++) == 0xff) {
  124.           xEnd+=8;
  125.         } else {
  126.           while (Data&0x80) {
  127.             Data<<=1;
  128.             xEnd++;
  129.           }
  130.           break;
  131.         }
  132.       }
  133.     }
  134.   }
  135.   *pxOff =x;
  136.   return xEnd-x+1;
  137. }
  138. /*
  139.       *************************************************
  140.       *                                               *
  141.       *             Delete                            *
  142.       *                                               *
  143.       *************************************************
  144. */
  145. void GUI_USAGE_BM_Delete(GUI_MEMDEV_Handle hDevUsage) {
  146.   GUI_ALLOC_FREE(hDevUsage);
  147. }
  148. static const tUSAGE_APIList API = {
  149.   GUI_USAGE_BM_AddPixel,     /* tUSAGE_AddPixel*         */
  150.   GUI_USAGE_BM_AddHLine,     /* tUSAGE_AddHLine*         */
  151.   GUI_USAGE_BM_Clear,        /* tUSAGE_Clear*            */
  152.   0,                         /* tUSAGE_CreateCompatible* */
  153.   GUI_USAGE_BM_Delete,       /* tUSAGE_Delete*           */
  154.   GUI_USAGE_BM_GetNextDirty  /* tUSAGE_GetNextDirty*     */
  155. };
  156. /*
  157.       *************************************************
  158.       *                                               *
  159.       *             Create                            *
  160.       *                                               *
  161.       *************************************************
  162. */
  163. GUI_USAGE_Handle GUI_USAGE_BM_Create(int x0, int y0, int xsize, int ysize, int Flags) {
  164.   int MemSize;
  165.   int BytesPerLine;
  166.   GUI_USAGE_Handle hMem;
  167.   GUI_USE_PARA(Flags);
  168.   BytesPerLine = ((xsize+15) >>4)<<1;  /* 2 byte alignment */
  169.   MemSize = ysize*BytesPerLine +sizeof(GUI_USAGE_BM);
  170.   hMem = GUI_ALLOC_ALLOC(MemSize);
  171.   /* Check if we can alloc sufficient memory */
  172.   if (!hMem) {
  173.     GUI_DEBUG_ERROROUT("GUI_USAGE_BM_Create: Too little memory");
  174.     return 0;    
  175.   }
  176.   {
  177.     GUI_USAGE_BM* pUsage = (GUI_USAGE_BM*)GUI_ALLOC_H2P(hMem);
  178.     pUsage->Public.x0    = x0;
  179.     pUsage->Public.y0    = y0;
  180.     pUsage->Public.XSize = xsize;
  181.     pUsage->Public.YSize = ysize;
  182.     pUsage->Public.pAPI  = &API;
  183.     pUsage->Public.UseCnt= 1;
  184.     pUsage->Private.BytesPerLine= BytesPerLine;
  185.   }
  186.   return hMem;
  187. }
  188. #else
  189. void GUIDEV_UsageBM(void) {} /* avoid empty object files */
  190. #endif /* GUI_SUPPORT_MEMDEV */