text: /*********************************************************************
  *                SEGGER MICROCONTROLLER SYSTEME GmbH                 *
  *        Solutions for real time microcontroller applications        *
  **********************************************************************
  *                                                                    *
  *        (c) 1996 - 2004  SEGGER Microcontroller Systeme GmbH        *
  *                                                                    *
  *        Internet: www.segger.com    Support:  support@segger.com    *
  *                                                                    *
  **********************************************************************
  
  ***** emWin - Graphical user interface for embedded applications *****
  emWin is protected by international copyright laws.   Knowledge of the
  source code may not be used to write a similar product.  This file may
  only be used in accordance with a license and should not be re-
  distributed in any way. We appreciate your understanding and fairness.
  ----------------------------------------------------------------------
  File        : GUIDEV_AA.c
  Purpose     : Memory device drawing with Antialiasing
  ----------------------------------------------------------------------
  Version-Date---Author-Explanation
  ----------------------------------------------------------------------
  1.02    000804 RS     LCD_CopyFromLCDAA added
  1.00a   000804 RS     Fix for odd X-sizes
  1.00    000728 RS     First release
  ----------------------------------------------------------------------
  Known problems or limitations with current version
  ----------------------------------------------------------------------
  None.
  ---------------------------END-OF-HEADER------------------------------
  */
  
  #include "../Core/GUI_Private.h"
  #include <string.h>
  
  #if GUI_SUPPORT_MEMDEV
  
  /*********************************************************************
  *
  *       defines
  *
  **********************************************************************
  */
  
  #define SETPIXEL(x,y,colorindex) _SetPixel(x,y,colorindex);
  #define BKCOLORINDEX GUI_Context.pDevData->aColorIndex[0]
  #define COLORINDEX   GUI_Context.pDevData->aColorIndex[1]
  
  /*********************************************************************
  *
  *       public code
  *
  **********************************************************************
  */
  /*********************************************************************
  *
  *       GUI_MEMDEV_CopyToLCDAA
  */
  void GUI_MEMDEV_CopyToLCDAA(GUI_MEMDEV_Handle hMem) {
    GUI_LOCK();
    /* Make sure memory handle is valid */
    if (hMem) {
      GUI_MEMDEV_Handle hMemPrev;
    #if GUI_NUM_LAYERS > 1
      int PrevLayer;
    #endif
      int x, y;
      GUI_MEMDEV* pDev = (GUI_MEMDEV*)GUI_ALLOC_h2p(hMem);  /* Convert to pointer */
      LCD_PIXELINDEX* pData0 = (LCD_PIXELINDEX*)(pDev+1);
      int LineOff = pDev->XSize;
      int x0 = pDev->x0;
      int y0 = pDev->y0;
      int XMax = pDev->XSize / 2;
      int YMax = pDev->YSize / 2;
      hMemPrev = GUI_Context.hDevData;
    #if GUI_NUM_LAYERS > 1
      PrevLayer = GUI_SelectLayer(pDev->LayerIndex);   /* Should not we switch back to the orig. layer when done ? */
    #else
      GUI_SelectLCD();  /* Activate LCD */
    #endif
      for (y = 0; y < YMax; y++) {
        LCD_PIXELINDEX* pData = pData0;
        for (x = 0; x < XMax; x++) {
          LCD_PIXELINDEX PixelIndex;
          int ColorSep[3];
          U32 Color = LCD_Index2Color(*pData);
          ColorSep[0] = Color&255;
          ColorSep[1] = (Color>>8)  &255;
          ColorSep[2] = (Color>>16) &255;
          Color = LCD_Index2Color(*(pData+1));
          ColorSep[0] += Color&255;
          ColorSep[1] += (Color>>8)  &255;
          ColorSep[2] += (Color>>16) &255;
          Color = LCD_Index2Color(*(pData+LineOff));
          ColorSep[0] += Color&255;
          ColorSep[1] += (Color>>8)  &255;
          ColorSep[2] += (Color>>16) &255;
          Color = LCD_Index2Color(*(pData+LineOff+1));
          ColorSep[0] += Color&255;
          ColorSep[1] += (Color>>8)  &255;
          ColorSep[2] += (Color>>16) &255;
          Color  = (ColorSep[0]+2)>>2;
          Color |= ((ColorSep[1]+2)>>2)<<8;
          Color |= ((U32)((ColorSep[2]+2)>>2))<<16;
          PixelIndex = LCD_Color2Index(Color);
          LCD_SetPixelIndex(x+x0, y+y0, PixelIndex);
          pData += 2;
        }
        pData0 += 2 * LineOff;
      }
    #if GUI_NUM_LAYERS > 1
      GUI_SelectLayer(PrevLayer);
    #endif
      /* Reactivate previously used device */
      GUI_MEMDEV_Select(hMemPrev);
    }
    GUI_UNLOCK();
  }
  
  /*********************************************************************
  *
  *       GUI_MEMDEV_CopyFromLCDAA
  */
  void GUI_MEMDEV_CopyFromLCDAA(GUI_MEMDEV_Handle hMem) {
    /* Make sure memory handle is valid */
    if (!hMem) {
      hMem = GUI_Context.hDevData;
    }
    if (hMem) {
      int x, y;
      GUI_MEMDEV* pDevData = (GUI_MEMDEV*) GUI_ALLOC_h2p(hMem);  /* Convert to pointer */
      GUI_USAGE* pUsage = 0;
      int x0 = pDevData->x0;
      int y0 = pDevData->y0;
      int XMax = pDevData->XSize/2;
      int YMax = pDevData->YSize/2;
      LCD_PIXELINDEX* pData = (LCD_PIXELINDEX*)(pDevData+1);
      int LineOff = pDevData->BytesPerLine;
      if (pDevData->hUsage) 
        pUsage = GUI_USAGE_H2P(pDevData->hUsage);
      for (y=0; y< YMax; y++) {
        if (pUsage) {
          GUI_USAGE_AddHLine(pUsage, 0, y*2, pDevData->XSize);
          GUI_USAGE_AddHLine(pUsage, 0, y*2+1, pDevData->XSize);
        }
        for (x=0; x< XMax; x++) {
          *pData = *(pData+1) = *(pData+LineOff) = *(pData+LineOff+1) = LCD_GetPixelIndex(x+x0,y+y0);
          pData+=2;
        }
        pData += LineOff + (pDevData->XSize&1);
      }
    }
  }
  
  #else
  
  void GUIDEV_AA(void) {} /* avoid empty object files */
  
  #endif /* GUI_MEMDEV_SUPPORT */
  
  /*************************** end of file ****************************/
  