📄 glib.c
字号:
/*****************************************
NAME: glib.c
DESC: graphic codes
HISTORY: 2002.03.13:draft ver 0.0
*****************************************/
#include "def.h"
#include "lcdlib.h"
#include "glib.h"
#include "lcd.h"
void (*PutPixel)(unsigned int,unsigned int,unsigned int);
//static unsigned int vframewidth, vframeheight;
unsigned int vframewidth, vframeheight;
unsigned int *framebuffer;
void GlibInit(unsigned int displaytype, unsigned int whichframebuffer)
{
switch(displaytype&0xf) {
case BPP1:
PutPixel=_PutPixel1Bit;
break;
case BPP2:
PutPixel=_PutPixel2Bit;
break;
case BPP4:
PutPixel=_PutPixel4Bit;
break;
case BPP8:
case BPP8_NP:
PutPixel=_PutPixel8Bit;
break;
case BPP16_565:
case BPP16_5551:
PutPixel=_PutPixel16Bit;
break;
case BPP24:
PutPixel=_PutPixel24Bit;
break;
default:
break;
}
switch(displaytype&0xff00) {
case 0x1100:
case 0x2100:
vframewidth=BG_VXSIZE_176220;
vframeheight=BG_VYSIZE_176220;
break;
case 0x1200:
case 0x2200:
vframewidth=BG_VXSIZE_240320;
vframeheight=BG_VYSIZE_240320;
break;
case 0x2300:
vframewidth=BG_VXSIZE_320240;
vframeheight=BG_VYSIZE_320240;
break;
case 0x1400:
case 0x2400:
vframewidth=BG_VXSIZE_640480;
vframeheight=BG_VYSIZE_640480;
break;
case 0x1800:
case 0x2800:
vframewidth=BG_VXSIZE_800600;
vframeheight=BG_VYSIZE_800600;
break;
case 0x4100:
vframewidth=FG_VXSIZE_176220;
vframeheight=FG_VYSIZE_176220;
break;
case 0x4200:
vframewidth=FG_VXSIZE_240320;
vframeheight=FG_VYSIZE_240320;
break;
case 0x4400:
vframewidth=FG_VXSIZE_640480;
vframeheight=FG_VYSIZE_640480;
break;
case 0x4800:
vframewidth=FG_VXSIZE_800600;
vframeheight=FG_VYSIZE_800600;
break;
default:
break;
}
// not using virtual frame
if((displaytype&0xf0)==0x10 || (displaytype&0xf0)==0x20) {
vframewidth=vframewidth/2;
vframeheight=vframeheight/2;
}
switch(whichframebuffer) {
case BGBUFFER1:
framebuffer=(unsigned int *)LCDFRAMEBUFFERBG1;
break;
case BGBUFFER2:
framebuffer=(unsigned int *)LCDFRAMEBUFFERBG2;
break;
case FGBUFFER1:
framebuffer=(unsigned int *)LCDFRAMEBUFFERFG1;
break;
case FGBUFFER2:
framebuffer=(unsigned int *)LCDFRAMEBUFFERFG2;
break;
default:
break;
}
}
void _PutPixel1Bit(unsigned int x,unsigned int y,unsigned int c)
{
if(x<vframewidth && y<vframeheight)
*(framebuffer+y*vframewidth/32+x/32)= (*(framebuffer+y*vframewidth/32+x/32)
& ~(0x80000000>>(x%32)*1))| ((c&0x00000001)<<((32-1-(x%32))*1));
}
void _PutPixel2Bit(unsigned int x,unsigned int y,unsigned int c)
{
if(x<vframewidth && y<vframeheight)
*(framebuffer+y*vframewidth/16+x/16)= (*(framebuffer+y*vframewidth/16+x/16)
& ~(0xc0000000>>(x%16)*2))| ((c&0x00000003)<<((16-1-(x%16))*2));
}
void _PutPixel4Bit(unsigned int x,unsigned int y,unsigned int c)
{
if(x<vframewidth && y<vframeheight)
*(framebuffer+y*vframewidth/8+x/8)= (*(framebuffer+y*vframewidth/8+x/8)
& ~(0xf0000000>>(x%8)*4))| ((c&0x0000000f)<<((8-1-(x%8))*4));
}
void _PutPixel8Bit(unsigned int x,unsigned int y,unsigned int c)
{
if(x<vframewidth && y<vframeheight)
*(framebuffer+y*vframewidth/4+x/4)= (*(framebuffer+y*vframewidth/4+x/4)
& ~(0xff000000>>(x%4)*8))| ((c&0x000000ff)<<((4-1-(x%4))*8));
}
void _PutPixel16Bit(unsigned int x,unsigned int y,unsigned int c)
{
if(x<vframewidth && y<vframeheight)
*(framebuffer+y*vframewidth/2+x/2)= (*(framebuffer+y*vframewidth/2+x/2)
& ~(0xffff0000>>(x%2)*16))|((c&0x0000ffff)<<((2-1-(x%2))*16));
}
void _PutPixel24Bit(unsigned int x,unsigned int y,unsigned int c)
{
if(x<vframewidth && y<vframeheight)
*(framebuffer+y*vframewidth+x)=(c&0xffffff); // for serial LCD
// *(framebuffer+y*vframewidth+x)=(c&0xfcfcfc);
}
/* for old(r01 base) version
void _PutPixel24Bit(unsigned int x,unsigned int y,unsigned int c)
{
if(x<vframewidth && y<vframeheight)
// *(framebuffer+y*vframewidth+x)=((c&0xfc)>>2)|((c&0xfc00)>>4)|((c&0xfc0000)>>6); //24bpp input
*(framebuffer+y*vframewidth+x)=((c&0x7ff)<<1)|((c&0xf800)<<2); //16bpp input for SMDK2460 r01
}
*/
void GlibRectangle(int x1,int y1,int x2,int y2,int color)
{
GlibLine(x1,y1,x2,y1,color);
GlibLine(x2,y1,x2,y2,color);
GlibLine(x1,y2,x2,y2,color);
GlibLine(x1,y1,x1,y2,color);
}
void GlibFilledRectangle(int x1,int y1,int x2,int y2,int color)
{
int i;
for(i=y1;i<=y2;i++)
GlibLine(x1,i,x2,i,color);
}
// LCD display is flipped vertically
// But, think the algorithm by mathematics point.
// 3I2
// 4 I 1
// --+-- <-8 octants mathematical cordinate
// 5 I 8
// 6I7
void GlibLine(int x1,int y1,int x2,int y2,int color)
{
int dx,dy,e;
dx=x2-x1;
dy=y2-y1;
if(dx>=0)
{
if(dy >= 0) // dy>=0
{
if(dx>=dy) // 1/8 octant
{
e=dy-dx/2;
while(x1<=x2)
{
PutPixel(x1,y1,color);
if(e>0){y1+=1;e-=dx;}
x1+=1;
e+=dy;
}
}
else // 2/8 octant
{
e=dx-dy/2;
while(y1<=y2)
{
PutPixel(x1,y1,color);
if(e>0){x1+=1;e-=dy;}
y1+=1;
e+=dx;
}
}
}
else // dy<0
{
dy=-dy; // dy=abs(dy)
if(dx>=dy) // 8/8 octant
{
e=dy-dx/2;
while(x1<=x2)
{
PutPixel(x1,y1,color);
if(e>0){y1-=1;e-=dx;}
x1+=1;
e+=dy;
}
}
else // 7/8 octant
{
e=dx-dy/2;
while(y1>=y2)
{
PutPixel(x1,y1,color);
if(e>0){x1+=1;e-=dy;}
y1-=1;
e+=dx;
}
}
}
}
else //dx<0
{
dx=-dx; //dx=abs(dx)
if(dy >= 0) // dy>=0
{
if(dx>=dy) // 4/8 octant
{
e=dy-dx/2;
while(x1>=x2)
{
PutPixel(x1,y1,color);
if(e>0){y1+=1;e-=dx;}
x1-=1;
e+=dy;
}
}
else // 3/8 octant
{
e=dx-dy/2;
while(y1<=y2)
{
PutPixel(x1,y1,color);
if(e>0){x1-=1;e-=dy;}
y1+=1;
e+=dx;
}
}
}
else // dy<0
{
dy=-dy; // dy=abs(dy)
if(dx>=dy) // 5/8 octant
{
e=dy-dx/2;
while(x1>=x2)
{
PutPixel(x1,y1,color);
if(e>0){y1-=1;e-=dx;}
x1-=1;
e+=dy;
}
}
else // 6/8 octant
{
e=dx-dy/2;
while(y1>=y2)
{
PutPixel(x1,y1,color);
if(e>0){x1-=1;e-=dy;}
y1-=1;
e+=dx;
}
}
}
}
}
void GlibClearScr(unsigned int c)
{
int i,j;
for(j=0;j<vframeheight;j++)
for(i=0;i<vframewidth;i++)
PutPixel(i,j,c);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -