通过数组指针来转换
用这种方法可以把屏幕mmap 中的数据转为二维的长乘高的数据。
引申一下,其实这个方法可以在任何几维的数组中互转,因为数组不管几维,数据在内存中都是连续排列的
如果存储类型不是常规的char ,int 等 可以用typedef 先定义。
#include <stdio.h>
int main()
{
int mm[5] = { 0,1,2,3,4 };
int (*pm)[3] = (int (*)[3])mm; //pm 排 ,[3]表示列
printf("%d\n", pm[0][2]); // {0,1,2},
// {3,4}
return 0;
}
framebuffer 改用 二维数组程序,更好理解
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <string.h>
#include <unistd.h>
#include <linux/fb.h>
static struct fb_var_screeninfo var;
int main(int argc, char *argv[])
{
int fd_fb = open("/dev/fb0", O_RDWR);
if (fd_fb < 0)
{
puts("/dev/fb0 error");
return -1;
}
if (ioctl(fd_fb, FBIOGET_VSCREENINFO, &var))
{
puts("ioctl error");
return -1;
}
// unsigned int pixel_width = var.bits_per_pixel / 8; //deepin=32
int screen_size = var.xres * var.yres * var.bits_per_pixel / 8;
unsigned char *fb_base = mmap(NULL, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
if (fb_base == NULL)
{
puts("mmap error");
return -1;
}
memset(fb_base,0, screen_size);
/* for(int h=0;h<var.yres;h++){
for (int s = 0; s <var.xres ; s++)
{
int color =0xff0000;
//-------------------------------------------------
unsigned char *pen_8 = fb_base + 1366*4*h+s * 4; //400*400
unsigned int *pen_32 = (unsigned int *)pen_8; //char->int 这句非常重要
*pen_32=color;
}
}*/
for(int a=0;a<768;a++){
for(int b=0;b<1366;b++){
int color=0xff0000;
unsigned int (*p)[1366]=(unsigned int (*)[1366])fb_base;
p[a][b]=color;
}
}
munmap(fb_base, screen_size);
close(fd_fb);
return 0;
}