📄 bitmap.c
字号:
#include "bitmap.h"
//-------------------------------------------------------------
void wSetPixel (xTBitmap *pxBitmap, u32 x, u32 y, u16 uxColor)
{
u32 *uiStart = pxBitmap->pxData;
uiStart += ((pxBitmap->uiSizeX>>3)*3)*y + (x>>3)*3;
u32 uxcColor = (uxColor<<20);
u32 ulShift = (x&0x00000007)*12;
uiStart+= ulShift>>5;
ulShift&=0x0000001F;
*uiStart = (*uiStart & ~((0xFFF00000) >> ulShift))|((u32)uxcColor>>ulShift);
if (ulShift>20)
{
uiStart++;
*uiStart = (*uiStart & ~((0xFFF00000) << (32-ulShift)))|((u32)uxcColor<< (32-ulShift));
}
return;
}
//-------------------------------------------------------------
void wClear (xTBitmap *pxBitmap, u16 color)
{
u32 x, y, x2, y2;
x2 = pxBitmap->uiSizeX / 3;
y2 = pxBitmap->uiSizeY;
u32 *uiStart = pxBitmap->pxData;
u32 d1, d2, d3;
d1 = (color << 20) | (color << 8) | (color >> 4);
d2 = (d1 << 8) | (color >> 8);
d3 = (d1 << 4) | (color);
for (y = 0; y < y2; y++)
for (x = 0; x < x2; x++)
{
*(uiStart++)=d1;
*(uiStart++)=d2;
*(uiStart++)=d3;
}
/* TODO: implement the case when the number of pixels in bitmap line is undivisible from 8 */
/* <optimize>
for (y = 0; y < y2; y++)
for (x = 0; x < x2; x++)
wSetPixel(pxBitmap, x, y, color);
// </optimize> */
}
//-------------------------------------------------------------
/* uxShift: first 16 bits are y shift, last 16 bits are x shift*/
void wFloodFill (xTBitmap *pxBitmap,
xTRectangle *pxRectangle,
u32 uxShift,
u16 color)
{
u32 x, y, x2, y1, y2;
u16 sy = uxShift>>16;
u16 sx = uxShift&0x0000FFFF;
x = pxRectangle->x1 + sx;
x2 = pxRectangle->x2 + sx;
y1 = pxRectangle->y1 + sy;
y2 = pxRectangle->y2 + sy;
// <optimize>
for (; x < x2; x++)
for (y = y1; y < y2; y++)
wSetPixel(pxBitmap, x, y, color);
// </optimize>
}
//-------------------------------------------------------------
void wDrawChar(xTBitmap *pxBitmap,
xTFont *pxFont,
u08 c, u32 x, u32 y, u16 color)
{
/* Draw a single ascii character on screen at location x,y */
u32 i;
u32 j;
u16 uiSizeX = pxFont->uiSizeX;
u16 uiSizeY = pxFont->uiSizeY;
if (uiSizeX>8)
{
u16 *pxChar = (u16*)pxFont->pxData;
u16 uiMask;
pxChar+= c*((uiSizeY+1)&0xFFFE);
x+=uiSizeX;
y+=uiSizeY;
for (i=uiSizeY; i>0; i--)
{
uiMask = 0x0001 << (uiSizeX-1);
for (j=uiSizeX; j>0; j--)
{
if (*pxChar & uiMask)
// <optimize>
wSetPixel(pxBitmap, x-j, y-i, color);
// </optimize>
uiMask>>=1;
}
pxChar++;
}
}
else
{
u08 *pxChar = (u08*)pxFont->pxData;
u08 uiMask;
pxChar+= c*((uiSizeY+3)&0xFFFC);
x+=uiSizeX;
y+=uiSizeY;
for (i=uiSizeY; i>0; i--)
{
uiMask = 0x01 << (uiSizeX-1);
for (j=uiSizeX; j>0; j--)
{
if (*pxChar & uiMask)
// <optimize>
wSetPixel(pxBitmap, x-j, y-i, color);
// </optimize>
uiMask>>=1;
}
pxChar++;
}
}
}
//-------------------------------------------------------------
void wDrawString(xTBitmap *pxBitmap,
xTFont *pxFont,
u08* s,
xTRectangle *pxRectangle,
u32 uxShift,
u16 color)
{
/* Draw a string of ascii chars on screen */
u16 x = pxRectangle->x1 + (uxShift&0x0000FFFF);
u16 x2 = pxRectangle->x2 + (uxShift&0x0000FFFF);
u16 y = pxRectangle->y1 + (uxShift>>16);
u16 uiSizeX = pxFont->uiSizeX;
uiSizeX+= uiSizeX>>2;
while (*s)
{
wDrawChar(pxBitmap, pxFont, *s++, x, y, color);
x+=uiSizeX;
if (x>=x2) return;
}
}
//-------------------------------------------------------------
void wDrawStringL(xTBitmap *pxBitmap,
xTFont *pxFont,
u08* s,
xTRectangle *pxRectangle,
u32 uxShift,
u32 ulLength,
u16 color)
{
/* Draw a string of ascii chars on screen */
u16 x = pxRectangle->x1 + (uxShift&0x0000FFFF);
u16 x2 = pxRectangle->x2 + (uxShift&0x0000FFFF);
u16 y = pxRectangle->y1 + (uxShift>>16);
u16 uiSizeX = pxFont->uiSizeX;
uiSizeX+= uiSizeX>>2;
u32 i = ulLength;
for (;i>0;i--)
{
wDrawChar(pxBitmap, pxFont, *s++, x, y, color);
x+=uiSizeX;
if (x>=x2) return;
}
}
//----------------------------------------------------------
void wDrawHex32 (xTBitmap *pxBitmap,
xTFont *pxFont,
u32 s,
xTRectangle *pxRectangle,
u32 uxShift,
u16 color)
{
u08 number;
u16 uiSizeX = pxFont->uiSizeX;
uiSizeX+= uiSizeX>>2;
i32 x = pxRectangle->x1 + uiSizeX*8 + (uxShift&0x0000FFFF);
u32 y = pxRectangle->y1 + (uxShift>>16);
u08 i = 0;
for (;i<8;i++)
{
number = s%16;
if (number>9) number += 7;
wDrawChar(pxBitmap, pxFont, (number+48), x, y, color);
x -= uiSizeX;
s>>=4;
}
}
//----------------------------------------------------------
void wDrawHex8 (xTBitmap *pxBitmap,
xTFont *pxFont,
u32 s,
xTRectangle *pxRectangle,
u32 uxShift,
u16 color)
{
u08 number;
u16 uiSizeX = pxFont->uiSizeX;
uiSizeX += uiSizeX>>2;
i32 x = pxRectangle->x1 + uiSizeX*8 + (uxShift&0x0000FFFF);
u32 y = pxRectangle->y1 + (uxShift>>16);
u08 i = 0;
for (;i<2;i++)
{
number = s%16;
if (number>9) number += 7;
wDrawChar(pxBitmap, pxFont, (number+48), x, y, color);
x -= uiSizeX;
s>>=4;
}
}
//----------------------------------------------------------
/*
c:
bit|function
8 |0 - zeroes aren't viewed, 1 - zeroes viewed
7:0|number length
*/
void wDrawNumber (xTBitmap *pxBitmap,
xTFont *pxFont,
u32 s,
u32 c,
xTRectangle *pxRectangle,
u32 uxShift,
u16 color)
{
u08 number;
u08 zero = ((c&0x100)>>8);
u16 uiSizeX = pxFont->uiSizeX;
uiSizeX+= uiSizeX>>2;
u32 x1 = pxRectangle->x1 + (uxShift&0x0000FFFF);
i32 x = pxRectangle->x2 + (uxShift&0x0000FFFF);
u32 y = pxRectangle->y1 + (uxShift>>16);
while (s)
{
number = (s%10);
s/=10;
wDrawChar(pxBitmap, pxFont, (number+48), x, y, color);
x-= uiSizeX;
if(x<x1) return;
}
}
//----------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -