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

📄 screen.h

📁 嵌入式arm机开发的五子棋游戏
💻 H
字号:
#include <unistd.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/ioctl.h>
#include <pthread.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <linux/fb.h>
#include <sys/mman.h>

struct SCREEN_CTRL
	{
		int fb;
		void * fb_mem;
		int fb_width, fb_height, fb_line_len, fb_size;
		int fb_bpp;
	};
#define SCREEN_WIDTH 640
#define SCREEN_LENGTH 480
#define CAHRROW 30
#define CAHRLINE 20

int Get_Max(int max ,int min);
int Get_Min(int max ,int min);
static void DrawRectangle(int x0 ,int y0 ,int x1, int y1, int color);
static void DrawRound(int centre_x ,int centre_y ,int radius,  int color);
static void  Screen_Color_Ctrl(int  *buffer, int  position );
static void ShowPicture(int (*buffer)[SCREEN_WIDTH]);
static void DrawChar(int point_x, int point_y, int (*mychar)[CAHRLINE] ,int color);

int framebuffer_open ();
void framebuffer_close();
//屏幕的三个方法
static struct SCREEN_CTRL Fb_dev;
#define SCREEN_Fb_dev	      	"/dev/fb0" //屏幕驱动程序路径
static char *default_framebuffer = SCREEN_Fb_dev;//定义了一个屏幕
static int ad_driver_fd = -1;//打开的文件指针
//////////////////////////////////////////////////////////////////////////////

static void DrawChar(int point_x, int point_y, int(*mychar)[CAHRLINE] ,int color)
{
  int i = 0;
  int j = 0;
  unsigned short int *point = (unsigned short int *)Fb_dev.fb_mem;
  	for ( i= 0; i< CAHRROW; i++)
			for (j= 0; j< CAHRLINE; j++)
			{
			   if(mychar[i][j]==1)
				   point[(point_y+i)*640+point_x+j] = color;
			}

}
////////////////////////////////////////////////////////////////////////////
static void ShowPicture(int (*buffer)[SCREEN_WIDTH])
{
   int i = 0;
  int j = 0;
  unsigned short int *point = (unsigned short int *)Fb_dev.fb_mem;
        for ( i= 0; i<480 ; i++)
                        for (j= 0; j< 640; j++)
                        {
                           
                                   point[i*640+j] = buffer[i][j];
                        }

}
////////////////////////////////////////////////////////////////////////////
static void Screen_Color_Ctrl(int  *buffer, int  position )
	{
		int i=0;
               
		unsigned short int *point = (unsigned short int *)Fb_dev.fb_mem;			 		    
	    	for ( i= 0; i<640; i++)
				{
                                 
			    	 point[position*640+i]= buffer[i];
                                                    
				}
			
	}
/////////////////////////////////////////////////////////////////////////////////////



int Get_Max(int max ,int min)
{
	return max>min?max:min;
}
int Get_Min(int max ,int min)
{
	return max<min?max:min;
}

static void DrawRectangle(int x0 ,int y0 ,int x1, int y1, int color)
{
   int x , y;
   int start_point_x;
   int start_point_y;
   int end_point_x;
   int end_point_y;
   unsigned short int *point = (unsigned short int *)Fb_dev.fb_mem;
   start_point_x = Get_Min(x0,x1);
   start_point_y = Get_Min(y0,y1);
   end_point_x = Get_Max(x0,x1);
   end_point_y = Get_Max(y0,y1);
   for( x = start_point_x;x<end_point_x&&x>=0;x++)
	   for(y = start_point_y;y<end_point_y&&y>=0;y++)
	   {
	    	point[y*SCREEN_WIDTH+x] = color ;   
	   }

//	   point = NULL;
//	   delete point;
}

static void DrawRound(int  centre_x ,int centre_y ,int radius , int color)
{
   int x , y;
   int start_point_x;
   int start_point_y;
   int end_point_x;
   int end_point_y;
   unsigned short int *point = (unsigned short int *)Fb_dev.fb_mem;
   start_point_x =  centre_x -radius;
   start_point_y =  centre_y  - radius;
   end_point_x =  centre_x +radius;
   end_point_y =  centre_y+radius;
   for( x = start_point_x;x<end_point_x;x++)
	   for(y = start_point_y;y<end_point_y;y++)
	   {
	     if((x - centre_x)*(x - centre_x)+(y - centre_y)*(y - centre_y)<(radius*radius))
	        point[y*SCREEN_WIDTH+x] = color ;
	   }
       // point = NULL;
	   // delete point;
}


int framebuffer_open()
{
		
		int fb;
		struct fb_var_screeninfo fb_vinfo;
		struct fb_fix_screeninfo fb_finfo;
		char * fb_dev_name = NULL;
		
		if (!(fb_dev_name = getenv("FRAMEBUFFER")))
			fb_dev_name = default_framebuffer;

		fb = open (fb_dev_name, O_RDWR);
		if (fb < 0 )
		{
				printf("device %s open failed.\n", fb_dev_name);
				return -1;
		}
			
		
		if (ioctl(fb, FBIOGET_VSCREENINFO, &fb_vinfo))
		{
				printf("Can't get VSCREENINFO: %s\n", strerror(errno));
				close(fb);
				return -1;
		}
			
		if (ioctl(fb, FBIOGET_FSCREENINFO, &fb_finfo))
		{
				printf("Can't get FSCREENINFO: %s\n", strerror(errno));
				return 1;
		}	
	
		Fb_dev.fb_bpp = fb_vinfo.red.length +  fb_vinfo.green.length +  fb_vinfo.blue.length +  fb_vinfo.transp.length;
		Fb_dev.fb_width = fb_vinfo.xres;
		Fb_dev.fb_height = fb_vinfo.yres;
		Fb_dev.fb_line_len = fb_finfo.line_length;
		Fb_dev.fb_size = fb_finfo.smem_len;
		
		if (Fb_dev.fb_bpp != 16) 
		{
			printf ("frame buffer must be 16bpp mode. \n");
			exit(0);
		}

		Fb_dev.fb_mem = mmap (NULL, Fb_dev.fb_size, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0);
		if (Fb_dev.fb_mem == NULL || (int) Fb_dev.fb_mem == -1) 
		{
			Fb_dev.fb_mem = NULL;
			printf("mmap failed.\n");
			close(fb);
			return -1;
		}

		Fb_dev.fb = fb;
		memset (Fb_dev.fb_mem, 0x0, Fb_dev.fb_size);
		return 0;
	}


void framebuffer_close()
	{
		if (Fb_dev.fb_mem) 
		{
			munmap (Fb_dev.fb_mem, Fb_dev.fb_size);
			Fb_dev.fb_mem = NULL;
		}

		if (Fb_dev.fb) 
		{
			close (Fb_dev.fb);
			Fb_dev.fb = 0;
		}
	}



⌨️ 快捷键说明

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