Added support for different pixelformats.

This commit is contained in:
HylkeV 2016-12-08 19:50:30 +01:00
parent 3f53f337c7
commit bea3ec8fec
4 changed files with 23 additions and 28 deletions

View file

@ -10,7 +10,6 @@
#include <sys/ioctl.h>
int fbfd = 0;
struct fb_var_screeninfo orig_vinfo;
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
long int screensize = 0;
@ -32,19 +31,9 @@ int8_t init_frame_buffer(void)
printf("Error reading variable information.\n");
return 0;
}
printf("Original %dx%d, %dbpp\n", vinfo.xres, vinfo.yres,
printf("Screen info %dx%d, %dbpp\n", vinfo.xres, vinfo.yres,
vinfo.bits_per_pixel );
// Store for reset (copy vinfo to vinfo_orig)
memcpy(&orig_vinfo, &vinfo, sizeof(struct fb_var_screeninfo));
// Change variable info
vinfo.bits_per_pixel = 24;
if (ioctl(fbfd, FBIOPUT_VSCREENINFO, &vinfo)) {
printf("Error setting variable information.\n");
return 0;
}
// Get fixed screen information
if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) {
printf("Error reading fixed information.\n");
@ -72,19 +61,27 @@ void deinit_frame_buffer(void)
{
// cleanup
munmap((void *)fbp, screensize);
if (ioctl(fbfd, FBIOPUT_VSCREENINFO, &orig_vinfo)) {
printf("Error re-setting variable information.\n");
}
close(fbfd);
}
void write_pixel_to_screen(uint16_t x, uint16_t y, uint16_t r, uint16_t g, uint16_t b, uint8_t a){
unsigned int pix_offset;
unsigned bpp = vinfo.bits_per_pixel / 8;
void write_pixel_to_screen(uint16_t x, uint16_t y, uint8_t r, uint8_t g, uint8_t b, uint8_t a){
uint32_t pix_offset;
uint8_t bpp = vinfo.bits_per_pixel / 8;
union {
uint32_t pixel32;
uint8_t pixel8[4];
} pixel;
uint8_t i;
if(x < vinfo.xres && y < vinfo.yres){
pixel.pixel32 = 0;
pixel.pixel32 |= ((uint32_t)r >> (8 - vinfo.red.length)) << vinfo.red.offset;
pixel.pixel32 |= ((uint32_t)g >> (8 - vinfo.green.length)) << vinfo.green.offset;
pixel.pixel32 |= ((uint32_t)b >> (8 - vinfo.blue.length)) << vinfo.blue.offset;
pix_offset = bpp * x + y * finfo.line_length;
fbp[pix_offset++] = r;
fbp[pix_offset++] = g;
fbp[pix_offset] = b;
for (i=0; i<bpp; i++) {
fbp[pix_offset+i] = pixel.pixel8[i];
}
}
}