www.pudn.com > UCGUI390a.rar > GUIAAChar2.c


/* 
********************************************************************************************************* 
*                                                uC/GUI 
*                        Universal graphic software for embedded applications 
* 
*                       (c) Copyright 2002, Micrium Inc., Weston, FL 
*                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH 
* 
*              µC/GUI 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 redistributed 
*              in any way. We appreciate your understanding and fairness. 
* 
---------------------------------------------------------------------- 
File        : GUICharAA2.C 
Purpose     : Display antialiased 2bpp 
---------------------------END-OF-HEADER------------------------------ 
*/ 
 
#include "GUI_Private.h" 
 
#if GUI_SUPPORT_AA 
 
#include  
#include  
 
/********************************************************************* 
* 
*       Defines 
* 
********************************************************************** 
*/ 
 
#define MAX_CHAR_SIZE 100 
 
/********************************************************************* 
* 
*       Static data 
* 
********************************************************************** 
*/ 
 
/* used by transparent characters */ 
static const int aConvTable[4] = {0, 5, 10, 15}; 
 
/* used by non transparent characters */ 
static LCD_COLOR aColor[4]; 
static LCD_PIXELINDEX OldColorIndex, OldBkColorIndex; 
static GUI_LOGPALETTE Palette = {4, 0, &aColor[0]}; 
static GUI_BITMAP Bitmap = {0, 0, 0, 2, 0, &Palette, 0}; 
 
/********************************************************************* 
* 
*       Static code 
* 
********************************************************************** 
*/ 
/********************************************************************* 
* 
*       DrawNoTrans 
*/ 
static void DrawNoTrans(int x0, int y0, int XSize, int YSize, int BytesPerLine, const U8*pData) { 
  if ((OldColorIndex   != LCD_COLORINDEX) ||  
      (OldBkColorIndex != LCD_BKCOLORINDEX)) { 
    int i; 
    LCD_PIXELINDEX BkColorIndex = LCD_BKCOLORINDEX; 
    LCD_PIXELINDEX ColorIndex   = LCD_COLORINDEX; 
    LCD_COLOR BkColor = LCD_Index2Color(BkColorIndex); 
    LCD_COLOR Color   = LCD_Index2Color(ColorIndex); 
    aColor[0] = BkColor; 
    for (i = 1; i < 3; i++) { 
      U8 Intens; 
      Intens = 5 * i; 
      aColor[i] = LCD_AA_MixColors(Color, BkColor, Intens); 
    } 
    aColor[3] = Color; 
    LCD_GetpPalConvTableUncached(&Palette); 
    OldColorIndex = ColorIndex; 
    OldBkColorIndex = BkColorIndex; 
  } 
  Bitmap.XSize = XSize; 
  Bitmap.YSize = YSize; 
  Bitmap.BytesPerLine = BytesPerLine; 
  Bitmap.pData = pData; 
  GL_DrawBitmap(&Bitmap, x0, y0); 
} 
 
/********************************************************************* 
* 
*       DrawTrans 
*/ 
static void DrawTrans(int x0, int y0, int XSize, int YSize, int BytesPerLine, const U8*pData) { 
  int x, y; 
  for (y = 0; y < YSize; y++) { 
    const U8 *pData0 = pData; 
    U8 Rem = XSize & 3; 
    for (x = 0; x < XSize - 1; x += 4) { 
      LCD_SetPixelAA(x + x0    , y0 + y, aConvTable[((*pData0  ) >> 6)       ]); 
      LCD_SetPixelAA(x + x0 + 1, y0 + y, aConvTable[((*pData0  ) >> 4) & 0x03]); 
      LCD_SetPixelAA(x + x0 + 2, y0 + y, aConvTable[((*pData0  ) >> 2) & 0x03]); 
      LCD_SetPixelAA(x + x0 + 3, y0 + y, aConvTable[((*pData0++)     ) & 0x03]); 
  	} 
    if (Rem) { 
      LCD_SetPixelAA(x + x0    , y0 + y, aConvTable[((*pData0  ) >> 6)       ]); 
      if (Rem > 1) { 
        LCD_SetPixelAA(x + x0 + 1, y0 + y, aConvTable[((*pData0  ) >> 4) & 0x03]); 
        if (Rem > 2) { 
          LCD_SetPixelAA(x + x0 + 2, y0 + y, aConvTable[((*pData0  ) >> 2) & 0x03]); 
        } 
      } 
    } 
    pData += BytesPerLine; 
  } 
} 
 
/********************************************************************* 
* 
*       GUIPROP_FindChar 
*/ 
static const GUI_FONT_PROP* GUIPROP_FindChar(const GUI_FONT_PROP* pProp, U16P c) { 
  for (pProp = GUI_Context.pAFont->p.pProp; pProp; pProp=(const GUI_FONT_PROP*) pProp->pNext) { 
    if ((c>=pProp->First) && (c<=pProp->Last)) 
      break; 
  } 
  return pProp; 
} 
 
/********************************************************************* 
* 
*       Public code 
* 
********************************************************************** 
*/ 
/********************************************************************* 
* 
*       GUIPROP_AA2_DispChar 
*/ 
void GUIPROP_AA2_DispChar(U16P c) { 
  int BytesPerLine; 
  GUI_DRAWMODE DrawMode = GUI_Context.TextMode; 
  const GUI_FONT_PROP* pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c); 
  if (pProp) { 
    GUI_DRAWMODE OldDrawMode; 
    const GUI_CHARINFO* pCharInfo = pProp->paCharInfo+(c-pProp->First); 
    BytesPerLine = pCharInfo->BytesPerLine; 
    OldDrawMode  = LCD_SetDrawMode(DrawMode); 
    if (DrawMode & GUI_TM_TRANS) { 
      DrawTrans(GUI_Context.DispPosX,  
                GUI_Context.DispPosY, 
                pCharInfo->XSize, 
                GUI_Context.pAFont->YSize, 
                BytesPerLine, 
                (U8 const*)pCharInfo->pData 
      ); 
    } else { 
      DrawNoTrans(GUI_Context.DispPosX,  
                  GUI_Context.DispPosY, 
                  pCharInfo->XSize, 
                  GUI_Context.pAFont->YSize, 
                  BytesPerLine, 
                  (U8 const*)pCharInfo->pData 
      ); 
    } 
    LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */ 
    GUI_Context.DispPosX += pCharInfo->XDist; 
  } 
} 
 
/********************************************************************* 
* 
*       GUIPROP_AA2_GetCharDistX 
*/ 
int GUIPROP_AA2_GetCharDistX(U16P c) { 
  const GUI_FONT_PROP* pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c); 
  return (pProp) ? (pProp->paCharInfo+(c-pProp->First))->XSize : 0; 
} 
 
/********************************************************************* 
* 
*       GUIPROP_AA2_GetFontInfo 
*/ 
void GUIPROP_AA2_GetFontInfo(const GUI_FONT * pFont, GUI_FONTINFO* pfi) { 
  GUI_USE_PARA(pFont); 
  pfi->Flags = GUI_FONTINFO_FLAG_PROP | GUI_FONTINFO_FLAG_AA2; 
} 
 
/********************************************************************* 
* 
*       GUIPROP_AA2_IsInFont 
*/ 
char GUIPROP_AA2_IsInFont(const GUI_FONT * pFont, U16 c) { 
  const GUI_FONT_PROP* pProp = GUIPROP_FindChar(pFont->p.pProp, c); 
  return (pProp==NULL) ? 0 : 1; 
} 
 
#else                            /* Avoid problems with empty object modules */ 
  void GUIAAChar2_C(void); 
  void GUIAAChar2_C(void) {} 
#endif /* GUI_SUPPORT_AA */ 
 
/*************************** End of file ****************************/