📄 dc.cpp
字号:
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 + -