📄 lcd_graphic_inv.h
字号:
#include "lcd.h"
#include <stdio.h>
#include <math.h>
void lcd_eraser(char *buf)
{
int i;
for(i=0 ; i<76800 ; i++) *(buf+i)=0x00;
}
void put_pixel(char *buf, int x, int y, char color)
{
int addr,Sel;
addr = 320*y+x;
Sel = addr&3;
if(Sel==3) *(buf+addr-3)=color;
else if(Sel==2) *(buf+addr-1)=color;
else if(Sel==1) *(buf+addr+1)=color;
else if(Sel==0) *(buf+addr+3)=color;
}
int get_pixel(char *buf, int x, int y)
{
int addr,Sel;
addr = 320*y+x;
Sel = addr&3;
if(Sel==3) return *(buf+addr-3);
else if(Sel==2) return *(buf+addr-1);
else if(Sel==1) return *(buf+addr+1);
else if(Sel==0) return *(buf+addr+3);
return 0;
}
#define abs(x) ( (x) > 0 ) ? (x) :( -(x))
#define two(x) ( (x) << 1 )
void line(char *buf, int x1, int y1, int x2, int y2, char color)
{
int x, y, count, dx, dy, Xinc, Yinc, err, twodx;
x = x1; y = y1;
count = dx = abs ( x2 - x1 );
twodx = two ( dx );
dy = abs ( y2 - y1 );
Xinc = ( x2 > x1 ) ? (1) : (-1);
Yinc = ( y2 > y1 ) ? (1) : (-1);
err = 0;
while ( count-- >= 0 ){
if ( err < dx )
err += dy;
else{
y += Yinc;
err += dy - twodx;
}
put_pixel(buf,x,y,color);
while ( (y != y2) && (err > twodx) ){
y += Yinc;
err -= twodx;
put_pixel(buf,x,y,color);
}
x += Xinc;
err += dy;
}
}
void rectangle(char *buf, int x1, int y1, int x2, int y2, char color)
{
line(buf,x1,y1,x2,y1,color);
line(buf,x1,y1,x1,y2,color);
line(buf,x2,y1,x2,y2,color);
line(buf,x1,y2,x2,y2,color);
}
void box(char *buf, int x1, int y1, int x2, int y2, char color)
{
line(buf,x1,y1,x2,y1,color);
line(buf,x1,y1,x1,y2,color);
line(buf,x2,y1,x2,y2,color);
line(buf,x1,y2,x2,y2,color);
}
void bar(char *buf, int x1, int y1, int x2, int y2, char color)
{
int X1,Y1,X2,Y2,i,j;
X1=x1; X2=x2; Y1=y1; Y2=y2;
if(x1>x2){
X1=x2;
X2=x1;
}
if(y1>y2){
Y1=y2;
Y2=y1;
}
for(i=X1;i<=X2;i++) for(j=Y1;j<=Y2;j++)put_pixel(buf,i,j,color);
}
//#define asp_ratio 1
//int asp_ratio,
void plot_circle(char *buf, int x, int y, int x_center, int y_center, int asp_ratio, char color_code)
{
int startx,endx,x1,starty,endy,y1;
starty = y*asp_ratio;
endy = (y+1)*asp_ratio;
startx = x*asp_ratio;
endx = (x+1)*asp_ratio;
for(x1=startx; x1<endx ; ++x1){
put_pixel(buf,x1+x_center, y+y_center, color_code);
put_pixel(buf,x1+x_center, y_center-y, color_code);
put_pixel(buf,x_center-x1, y_center-y, color_code);
put_pixel(buf,x_center-x1, y+y_center, color_code);
}
for(y1=starty; y1<endy ; ++y1){
put_pixel(buf,y1+x_center, x+y_center, color_code);
put_pixel(buf,y1+x_center, y_center-x, color_code);
put_pixel(buf,x_center-y1, y_center-x, color_code);
put_pixel(buf,x_center-y1, x+y_center, color_code);
}
}
void ellipse(char *buf, int x_center, int y_center, int radius, int asp_ratio, char color_code)
{
register int x,y,delta;
y= radius ;
delta = 3 - 2*radius;
for(x=0; x<y ; x++){
plot_circle(buf,x,y,x_center,y_center, asp_ratio, color_code);
if(delta<0)
delta += 4*x + 6;
else {
delta += 4*(x-y) + 10;
y-- ;
}
}
x = y;
if (y) plot_circle(buf,x,y,x_center,y_center, asp_ratio, color_code);
}
void circle(char *buf, int x_center, int y_center, int radius, char color_code)
{
ellipse(buf, x_center, y_center, radius, 1, color_code);
}
void rgb_bar(char *buf)
{
int i;
for(i=20 ; i<100 ; i++) line(buf,i,20,i,220,Red_C);
for(i=120 ; i<200 ; i++) line(buf,i,20,i,220,Green_C);
for(i=220 ; i<300 ; i++) line(buf,i,20,i,220,Blue_C);
}
void color_bar(char *buf)
{
int i;
for(i=20 ; i<60 ; i++) line(buf,i,0,i,240,White_C);
for(i=60 ; i<100 ; i++) line(buf,i,0,i,240,Yellow_C);
for(i=100 ; i<140 ; i++) line(buf,i,0,i,240,SkyBlue_C);
for(i=140 ; i<180 ; i++) line(buf,i,0,i,240,Green_C);
for(i=180 ; i<220 ; i++) line(buf,i,0,i,240,Purple_C);
for(i=220 ; i<260 ; i++) line(buf,i,0,i,240,Red_C);
for(i=260 ; i<300 ; i++) line(buf,i,0,i,240,Blue_C);
}
//-----------------------------------------------
//BMP image function
//-----------------------------------------------
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned int DWORD;
typedef struct{ // Windows (.BMP) file 位图文件头
WORD bmp_id; // "BM"=0x424D
DWORD bmp_size;
WORD reserv_1; // 0
WORD reserv_2; // 0
DWORD offset;
} BMP_HEADER;
typedef struct{
DWORD InfoHeadSize; // 0x28 = 40byte
DWORD width_x;
DWORD width_y;
WORD planes; // = 1
WORD BitPixel; // 1 (2 color), 4 (16 color), 8 (256color)
DWORD Compression;
DWORD Imagesize;
DWORD X_Resolution;
DWORD Y_Resolution;
DWORD Colors;
DWORD ImportantColors;
} BMP_INFO_HEADER;
typedef struct{
char Blue;
char Green;
char Red;
char Reserved; // 0
} RGB_BLOCK;
int draw_bmp(char *buf, int base_x, int base_y, unsigned char *bmp_image)
{
int i,j,index=0;
BMP_HEADER *header;
BMP_INFO_HEADER *info_header;
RGB_BLOCK *rgb;
BYTE R,G,B;
BYTE palette[256];
header=(BMP_HEADER *)malloc(sizeof(BMP_HEADER));
info_header=(BMP_INFO_HEADER *)malloc(sizeof(BMP_INFO_HEADER));
//------------------------------------------
// deal with the bmp file header
//------------------------------------------
header->bmp_id=(WORD)bmp_image[index++];
header->bmp_id+=(WORD)bmp_image[index++]<<8;
header->bmp_size=(DWORD)bmp_image[index++];
header->bmp_size+=(DWORD)bmp_image[index++]<<8;
header->bmp_size+=(DWORD)bmp_image[index++]<<16;
header->bmp_size+=(DWORD)bmp_image[index++]<<24;
header->reserv_1=(WORD)bmp_image[index++];
header->reserv_1=(WORD)bmp_image[index++]<<8;
header->reserv_2=(WORD)bmp_image[index++];
header->reserv_2=(WORD)bmp_image[index++]<<8;
header->offset=(DWORD)bmp_image[index++];
header->offset+=(DWORD)bmp_image[index++]<<8;
header->offset+=(DWORD)bmp_image[index++]<<16;
header->offset+=(DWORD)bmp_image[index++]<<24;
#if 0
printf("bmp_id=0x%x,%d\n",header->bmp_id,header->bmp_id);
printf("bmp_size=0x%x,%d\n",header->bmp_size,header->bmp_size);
printf("bmp_reserv_1=0x%x,%d\n",header->reserv_1,header->reserv_1);
printf("bmp_reserv_2=0x%x,%d\n",header->reserv_2,header->reserv_2);
printf("bmp_offset=0x%x,%d\n",header->offset,header->offset);
#endif
if(header->bmp_id!=0x4d42){
printf("this is not bmp file\n");
return 1;
}
if(header->bmp_size>77878){
printf("the image file is too big\n");
return 1;
}
//-----------------------------------------------------------
// deal with the bmp information header
//-----------------------------------------------------------
info_header->InfoHeadSize=(DWORD)bmp_image[index++]; // 0x28 = 40byte
info_header->InfoHeadSize+=(DWORD)bmp_image[index++]<<8;
info_header->InfoHeadSize+=(DWORD)bmp_image[index++]<<16;
info_header->InfoHeadSize+=(DWORD)bmp_image[index++]<<24;
info_header->width_x=(DWORD)bmp_image[index++];
info_header->width_x+=(DWORD)bmp_image[index++]<<8;
info_header->width_x+=(DWORD)bmp_image[index++]<<16;
info_header->width_x+=(DWORD)bmp_image[index++]<<24;
info_header->width_y=(DWORD)bmp_image[index++];
info_header->width_y+=(DWORD)bmp_image[index++]<<8;
info_header->width_y+=(DWORD)bmp_image[index++]<<16;
info_header->width_y+=(DWORD)bmp_image[index++]<<24;
info_header->planes=(WORD)bmp_image[index++]; // = 1
info_header->planes+=(WORD)bmp_image[index++]<<8;
info_header->BitPixel=(WORD)bmp_image[index++]; // 1 (2 color), 4 (16 color), 8 (256color)
info_header->BitPixel+=(WORD)bmp_image[index++]<<8;
info_header->Compression=(DWORD)bmp_image[index++];
info_header->Compression+=(DWORD)bmp_image[index++]<<8;
info_header->Compression+=(DWORD)bmp_image[index++]<<16;
info_header->Compression+=(DWORD)bmp_image[index++]<<24;
info_header->Imagesize=(DWORD)bmp_image[index++];
info_header->Imagesize+=(DWORD)bmp_image[index++]<<8;
info_header->Imagesize+=(DWORD)bmp_image[index++]<<16;
info_header->Imagesize+=(DWORD)bmp_image[index++]<<24;
info_header->X_Resolution=(DWORD)bmp_image[index++];
info_header->X_Resolution+=(DWORD)bmp_image[index++]<<8;
info_header->X_Resolution+=(DWORD)bmp_image[index++]<<16;
info_header->X_Resolution+=(DWORD)bmp_image[index++]<<24;
info_header->Y_Resolution=(DWORD)bmp_image[index++];
info_header->Y_Resolution+=(DWORD)bmp_image[index++]<<8;
info_header->Y_Resolution+=(DWORD)bmp_image[index++]<<16;
info_header->Y_Resolution+=(DWORD)bmp_image[index++]<<24;
info_header->Colors=(DWORD)bmp_image[index++];
info_header->Colors+=(DWORD)bmp_image[index++]<<8;
info_header->Colors+=(DWORD)bmp_image[index++]<<16;
info_header->Colors+=(DWORD)bmp_image[index++]<<24;
info_header->ImportantColors=(DWORD)bmp_image[index++];
info_header->ImportantColors+=(DWORD)bmp_image[index++]<<8;
info_header->ImportantColors+=(DWORD)bmp_image[index++]<<16;
info_header->ImportantColors+=(DWORD)bmp_image[index++]<<24;
#if 0
printf("info_header->InfoHeadSize=0x%x,%d\n",info_header->InfoHeadSize,info_header->InfoHeadSize); // 0x28 = 40byte
printf("info_header->width_x=0x%x,%d\n",info_header->width_x,info_header->width_x);
printf("info_header->width_y=0x%x,%d\n",info_header->width_y,info_header->width_y);
printf("info_header->planes=0x%x,%d\n",info_header->planes,info_header->planes);
printf("info_header->BitPixel=0x%x,%d\n",info_header->BitPixel,info_header->BitPixel);
printf("info_header->Compression=0x%x,%d\n",info_header->Compression,info_header->Compression);
printf("info_header->Imagesize=0x%x,%d\n",info_header->Imagesize,info_header->Imagesize);
printf("info_header->X_Resolution=0x%x,%d\n",info_header->X_Resolution,info_header->X_Resolution);
printf("info_header->Y_Resolution=0x%x,%d\n",info_header->Y_Resolution,info_header->Y_Resolution);
printf("info_header->Colors=0x%x,%d\n",info_header->Colors,info_header->Colors);
printf("info_header->ImportantColors=0x%x,%d\n",info_header->ImportantColors,info_header->ImportantColors);
#endif
if(info_header->BitPixel>8){
printf("color is more than 256\n");
return 1;
}
if(info_header->Imagesize>76800){
printf("the image size is bigger than 320*240\n");
return 1;
}
rgb=(RGB_BLOCK *)(bmp_image+54);
for(i=0;i<256;i++){
// R=rgb->Red&0xe0;
// G=(rgb->Green&0xe0)>>3;
// B=(rgb->Blue&0xc0)>>6;
// palette[i]=R | G | B;
R=(rgb->Red&0xe0)>>3;
G=(rgb->Green&0xe0);
B=(rgb->Blue&0xc0)>>6;
palette[i]=G | R | B;
rgb++;
}
index+=256*4;
for(i=0;i<info_header->width_y;i++){
for(j=0;j<info_header->width_x;j++){
put_pixel(buf,j,(info_header->width_y-i),palette[*(bmp_image+(i*info_header->width_x)+j+header->offset)]);
}
}
free(info_header);
free(header);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -