⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dc.cpp

📁 一个完全的4级灰度的嵌入式CDC显示类。支持DC的全部操作。对于嵌入式开发是一个非常好的工具。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    INT32 _2b2 = b2<<1;
    INT32 a2b2 = a2*b2;

    INT32 _x2 = b2*x*x;
    INT32 _x  = b2*x*2;
    
    INT32 _y2 = a2*y*y;
    INT32 _y  = a2*y*2;

    INT32 ox = x;

    while(x <= x1)
    {
        if(_x2 + _y2 > a2b2)
        {
            _y2 = _y2 - _y + a2;
            _y = _y - _2a2;
            y -= 1;
            if(x - ox >= 1)
            {
                HwSetPixel(x0+x, y0+y, iColor, iDrawMode, iPenWidth);
                HwSetPixel(x0-x, y0+y, iColor, iDrawMode, iPenWidth);
                HwSetPixel(x0+x, y0-y, iColor, iDrawMode, iPenWidth);
                HwSetPixel(x0-x, y0-y, iColor, iDrawMode, iPenWidth);
            }
        }
        else
        {
            HwSetPixel(x0+x, y0+y, iColor, iDrawMode, iPenWidth);
            HwSetPixel(x0-x, y0+y, iColor, iDrawMode, iPenWidth);
            HwSetPixel(x0+x, y0-y, iColor, iDrawMode, iPenWidth);
            HwSetPixel(x0-x, y0-y, iColor, iDrawMode, iPenWidth);
            _x2 = _x2 + _x + b2;
            _x = _x + _2b2;
            ox = x;
            x += 1;
        }
    }
}
/*
extern "C" void HwSetDot(INT16 iX, INT16 iY, UINT8 iColor)
{
    LTOP(iX, iY);

    if(iX >=LCD_WIDTH || iY>=LCD_HEIGHT || iX <0 || iY < 0)
        return;
    UINT8 mask[]={0x3F, 0xCF, 0xF3, 0xFC};
    INT8 off = iX>>2;
    INT8 bit= iX&3;
    INT8 bit1 = 6-(bit<<1);
    UINT8 * addr = g_pLcdBuf[iY] + off;
    *addr = (*addr & mask[bit]) | (iColor<<bit1);

}
//用指定颜色填充一个封闭区域 速度太慢,凑合用
//内存使用太多,用循环队列可解决
extern "C" BOOL HwFloodFill(INT16 x , INT16 y, UINT8 iColor)
{
    INT8  curcolor = HwGetPixel(x,y);
    if(curcolor == iColor || curcolor<0)
        return FALSE;
    UINT16 *xqueue = (UINT16 *)mcMalloc(LCD_WIDTH*LCD_HEIGHT);
    if(!xqueue)
        return FALSE;
    UINT16 *yqueue = (UINT16 *)mcMalloc(LCD_WIDTH*LCD_HEIGHT);
    
    if(!yqueue)
    {
        mcFree(xqueue);
        return FALSE;
    }
    UINT16 head=0,real=0;
    xqueue[real] = x;
    yqueue[real++] =y;
    HwSetDot(x, y, iColor);
    INT8 dx[] ={0, 0, -1, 1};
    INT8 dy[] ={-1, 1, 0, 0};
    INT16 cx, cy;
    INT16 maxdot=1;
    while(head<real)
    {
        x = xqueue[head];
        y = yqueue[head++];
        for(UINT8 i=0; i<4; i++)
        {
            cx = x+dx[i];
            cy = y+dy[i];
            if(HwGetPixel(cx, cy) == curcolor)
            {
              xqueue[real] = cx;
              yqueue[real++] = cy;
              HwSetDot(cx, cy, iColor);
            }
            if(real-head>maxdot)
                maxdot = real-head;
        }
    }

    mcFree(xqueue);
    mcFree(yqueue);
    return TRUE;
}
*/
//用指定颜色画一个填充矩形
extern "C" void HwPaintRect(INT16 x0, INT16 y0, INT16 x1, INT16 y1, UINT8 iColor)
{
	LTOP(x0, y0, x1, y1);
    if(x0>x1)
        SWAP(x0,x1);
    if(y0>y1)
        SWAP(y0,y1);
    if(x1>=LCD_WIDTH || y1>=LCD_HEIGHT || x0<0 || y0<0)
        return;
    UINT8 fmask[] ={0x00, 0xC0, 0xF0, 0xFC};
    UINT8 rmask[]={0x3F, 0x0F, 0x03, 0x00};

    INT16 off = x0>>2;
    UINT8 bit0 = x0&3, bit1 = x1&3;
    INT8  size = (x1>>2)- off -1;
    UINT8 bit2 = bit0<<1;
    for(INT16 i=y0; i<=y1; i++)
    {
        UINT8 * addr =  g_pLcdBuf[i] + off;
        *addr = (*addr & fmask[bit0]) | (g_Pen8[iColor]>>bit2);
        addr ++;
        if(size >0)
         memset(addr, g_Pen8[iColor], size);
        addr += size;
        *addr = (*addr & rmask[bit1]) | (g_Pen8[iColor] &~rmask[bit1]);
    }
}

extern "C" void HwWriteImage(INT16 x0, INT16 y0, INT16 x1, 
                         INT16 y1, UINT8 iDrawMode, UINT8 *pImageBuf)
{
    LTOP(x0, y0, x1, y1);
    if(x0>x1)
        SWAP(x0,x1);
    if(y0>y1)
        SWAP(y0,y1);

    if(x0<0 || x1>=LCD_WIDTH || y0<0 || y1>=LCD_HEIGHT)
         return ;

    INT16 width = x1-x0+1;
    INT16 height = y1-y0+1;
    HwBitBlt(pImageBuf, (width+3)>>2, 0,0,width, 
                 height, g_pLcdBuf[0], LCD_WIDTH/4, x0, y0, iDrawMode);
    
} 

extern "C" void HwInvertRect(INT16 x0, INT16 y0, INT16 x1, INT16 y1)
{
	LTOP(x0, y0, x1, y1);
    if(x0>x1)
        SWAP(x0,x1);
    if(y0>y1)
        SWAP(y0,y1);
   if(x1>=LCD_WIDTH || y1>= LCD_HEIGHT || x0<0 || y0<0)
       return;
    UINT8 mask[]= {0x00, 0xC0, 0xF0, 0xFC, 0xFF};
    UINT8 mask1[]={0xFF, 0x3F, 0x0F, 0x03, 0x00};

    UINT8 off = x0>>2;
    UINT8 bit0 = x0&3, bit1 = (x1&3)+1;
    INT8 size = (x1>>2)- off-1;
    if(size>=0)
        for(INT16 i=y0; i<=y1; i++)
        {
            UINT8 *addr = g_pLcdBuf[i] + off;
            *addr = *addr & mask[bit0] | ~(*addr) &mask1[bit0];
            addr++;
            for(INT16 j=0; j<size; j++,addr++)
                *addr = ~(*addr);
            *addr  = *addr & mask1[bit1] | (~(*addr) & mask[bit1]);
        }
    else
      for(INT16 i=y0; i<=y1; i++)
      {
            UINT8 *addr = g_pLcdBuf[i] + off;
            UINT8 cmask = mask[bit1-bit0]>>bit0;
            UINT8 tmp =*addr & ~cmask;
            *addr = ~(*addr) & cmask | tmp;
      }
}

extern "C" UINT16 HwImageSize(INT16 x0, INT16 y0, INT16 x1, INT16 y1)
{
	LTOP(x0,y0,x1,y1);
    if(x0>x1)
        SWAP(x0,x1);
    if(y0>y1)
        SWAP(y0,y1);
    UINT16 bytes = (x1-x0+4)>>2;// + ((x1-x0+1)%4? 1:0);
    return bytes * (y1-y0+1);
}

extern "C" void HwReadImage(INT16 x0, INT16 y0, INT16 x1, INT16 y1, UINT8 *pBuff)
{
	LTOP(x0, y0, x1, y1);
    if(x0>x1)
        SWAP(x0,x1);
    if(y0>y1)
        SWAP(y0,y1);
    
    if(x0<0 || x1>=LCD_WIDTH || y0<0 || y1>=LCD_HEIGHT)
         return ;
    UINT16 bytes = (x1-x0+4)>>2;
    HwBitBlt(g_pLcdBuf[0], LCD_WIDTH/4, x0, y0, x1-x0+1, y1-y0+1, pBuff, bytes,0,0, DRAWMODE_REP);
    
}

extern "C" void HwPutAsc(INT16 x, INT16 y, UINT8 iBackColor, UINT8 iForColor, UINT8 iDrawMode, UINT8 iChar)
{

   UINT32   bitmap[CHAR_HEIGHT * ASC_WIDTH / 16];
   UINT32 * fontaddr = (UINT32 *)(ASC_FONT_ADDR + (iChar<<5));
   UINT32 * paddr = fontaddr;
   UINT32   mask = g_Pen32[iBackColor];
   for(UINT8 i=0; i<CHAR_HEIGHT * ASC_WIDTH / 16; i++)
      bitmap[i] = ~(*(paddr++)| mask);
   if(iForColor)
   {
       paddr = fontaddr;
       mask = g_Pen32[3-iForColor];
       for(UINT8 i=0; i<CHAR_HEIGHT * ASC_WIDTH / 16; i++)
          bitmap[i] |= *(paddr++) & mask;
   }
   
   ::HwWriteImage(x, y, x+ASC_WIDTH-1, y+CHAR_HEIGHT-1, iDrawMode, (UINT8 *)bitmap);
 }

extern "C" void HwPutHz(INT16 x, INT16 y, UINT8 iBackColor, UINT8 iForColor, UINT8 iDrawMode, UINT16 iHz)
{
    UINT16 bitmap[CHAR_HEIGHT*2];
    UINT8 *fontaddr = (UINT8 *)HZ_FONT_ADDR + ((((UINT32)HIBYTE(iHz)-161)*94L+LOBYTE(iHz)-161) << 5);
    UINT8 *paddr = fontaddr;
    UINT16 mask = g_Pen16[iBackColor];
    for(UINT8 i=0; i<CHAR_HEIGHT*2; i++)
        bitmap[i] = ~(g_iOneBit2TwoBitMap[*(paddr++)] | mask);
    if(iForColor)
    {
       paddr = fontaddr;
       mask = g_Pen16[3-iForColor];
       for(UINT8 i=0; i<CHAR_HEIGHT*2; i++)
          bitmap[i] |= g_iOneBit2TwoBitMap[*(paddr++)] & mask;
    }
    ::HwWriteImage(x, y, x+HZ_WIDTH-1, y+CHAR_HEIGHT-1, iDrawMode, (UINT8 *)bitmap);
}

extern "C" void HwPutString(INT16 x, INT16 y, UINT8 iBackColor, UINT8 iForColor, UINT8 iDrawMode, UINT8 *pText, INT16 iLen)
{
#define MAX_STRING_LEN 255
    if(!iLen) iLen = MAX_STRING_LEN;
    for(INT16 i=0; i<iLen && *pText && pText;)
      {
         if(ISCC(*pText))
         {
             ::HwPutHz(x, y, iBackColor, iForColor, iDrawMode, MAKEWORD(*(pText+1), *pText));
             x+= HZ_WIDTH;
             pText +=2;
             i += 2;
         }
         else
         {
			 if(!((*pText) < 0x20 || (*pText) > 0x7F)){
				 ::HwPutAsc(x, y, iBackColor, iForColor, iDrawMode, *pText);
				 x+= ASC_WIDTH;
			 }
			 else 
				 return;// hqf
             pText++;
             i++;
         }
      }
#undef MAX_STRING_LEN
}
extern "C" void HwPutIcon(INT16 x, INT16 y, UINT8 iDrawMode, UINT32 iIcon)
{
//    ::HwWriteImage(x, y, x+gICON_WIDTH(iIcon)-1,  y+gICON_HEIGHT(iIcon)-1, iDrawMode, (UINT8*)(iIcon + 12));
}

extern "C" INT16 HwGetTextExtern(char *pText)
{
    return strlen(pText)*ASC_WIDTH;
}

extern "C" void HwDrawText(INT16 x, INT16 y, UINT8 iBkColor, UINT8 iForColor, UINT8 iDrawMode, UINT8 iHalign, UINT8 iValign, char *pText)
{
  INT16 width = HwGetTextExtern(pText); 
    switch(iHalign)
    {
    case HALIGN_CENTER:
        x -= width/2;
        break;
    case HALIGN_RIGHT:
        x -= width;
        break;
    }
    switch(iValign)
    {
    case VALIGN_MID:
         y -= CHAR_HEIGHT/2;
         break;
    case VALIGN_BOTTOM:
         y -= CHAR_HEIGHT;
         break;
    }
    ::HwPutString(x, y, iBkColor, iForColor, iDrawMode, (UINT8 *)pText, 0); 

}

    /////////////////////////////////////////////////////////////////////
    //                                                                 //
    //           第二部分,硬件光标接口                                //
    //                                                                 //
    //                                                                 //
    /////////////////////////////////////////////////////////////////////

extern "C" void OpenCursor()
{
    *((unsigned short *)0xFFFFFA18) |= 0x8000;	//YGR
    *((unsigned char *)0xFFFFFA1F) |= 0x9F;
} 
extern "C" BOOL GetCursorStatus()
{
	return *((unsigned short *)0xFFFFFA18) & 0xC000;
}
extern "C" void GetCursorXY(short * iX, short * iY)
{
	*iX = *((unsigned short *)0xFFFFFA18) & 0x01FF;
    *iY = *((unsigned short *)0xFFFFFA1A) & 0x00FF;
#ifdef CIRCUMGYRATE
  INT16 tmp = *iY;
  *iY = *iX;
  *iX = LCD_WIDTH-tmp-1;
#endif
}

extern "C" void CloseCursor()
{
    *((unsigned short *)0xFFFFFA18) &= 0x1FF;
} 
 
extern "C" void SetCursorXY(short  iX,  short iY)
{
	LTOP(iX, iY);
    *((unsigned short *)0xFFFFFA18) = (iX & 0x01FF|0x8000);	//YGR
    *((unsigned short *)0xFFFFFA1A) = (iY & 0x00FF);
}
//iBlink为0时静止
extern "C" void SetCursorAttr(unsigned char iWidth, unsigned char iHeight)
{
#ifdef CIRCUMGYRATE
	SWAP(iWidth, iHeight);
#endif
    *((unsigned short *)0xFFFFFA1C) = (((iWidth&0x1F)<<8)|iHeight&0x1F);
    //频率
    *((unsigned char *)0xFFFFFA1F) = 0x9F;
} 

extern "C" void StrTrim(char *szText, char cTrimChar)
{
    char *pstr = szText;
    while(*pstr == cTrimChar && *pstr)
        pstr++;

    if(pstr != szText)
     memmove(szText, pstr, strlen(szText)+1);

    pstr = szText + strlen(szText)-1;
    while(*pstr == cTrimChar)
        pstr--;
    *(pstr+1)=0;
}
    /////////////////////////////////////////////////////////////////////
    //                                                                 //
    //           第三部分,CDC类函数定义                               //
    //                                                                 //
    //                                                                 //
    /////////////////////////////////////////////////////////////////////

/*
UINT8 CDC:: m_bOutToVirtualScreen = FALSE; 

void CDC::SetOutScreen(UINT8 bOutToVirtualScreen)
{
    //if(m_bOutToVirtualScreen == bOutToVirtualScreen)
    //  return;
    UINT8 * addr= bOutToVirtualScreen ? 
                     g_pVirtualScreenBuf : (UINT8 *)(*((UINT32 *)0xFFFFFA00));
    
    m_bOutToVirtualScreen = bOutToVirtualScreen; 
    
    for(INT16 i=0; i< LCD_HEIGHT; i++, addr += LCD_WIDTH/4)
        g_pLcdBuf[i] = addr;
}

void CDC::Invalidate(INT16 x0, INT16 y0, INT16 x1, INT16 y1)
{
    if(m_bOutToVirtualScreen)
    {
        LTOP(x0, y0, x1, y1);
        if(x0 > x1)
          SWAP(x0,x1);
        if(y0 > y1)
          SWAP(y0, y1);
        UINT8 *addr = (UINT8 *)(*((UINT32 *)0xFFFFFA00)); 
        ::HwBitBlt(g_pVirtualScreenBuf, LCD_WIDTH/4, x0, y0, x1-x0+1,
                   y1-y0+1, addr, LCD_WIDTH/4, x0, y0, DRAWMODE_REP);   
    }
}

void CDC::Invalidate(CRect *srRect)
{
    Invalidate(srRect->Xmin, srRect->Ymin, srRect->Xmax, srRect->Ymax);    
}
*/
CDC::CDC()
{
  Reset();
}

void CDC::Reset()
{
    m_iBackColor = WHITE;
    m_iPenColor  = BLACK;
    m_iDrawMode  = DRAWMODE_REP;
    m_iValign    = VALIGN_TOP;
    m_iHalign    = HALIGN_LEFT;
    m_iCurX =0; 
    m_iCurY =0;
    m_iPenWidth  = 1;
    m_iLineStyle = 0;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -