diff --git a/fbshot.c b/fbshot.c index ca55499..703eb47 100644 --- a/fbshot.c +++ b/fbshot.c @@ -44,6 +44,8 @@ #include #include +#include + #include #include #include @@ -71,7 +71,7 @@ struct picture{ int xres,yres; char *buffer; struct fb_cmap *colormap; - char bps,gray; + char bps,gray,bgr; }; void FatalError(char* err){ @@ -168,6 +168,12 @@ int read_fb(char *device, int vt_num, struct picture *pict){ i=pict->bps>>3; } + /* check if framebuffer is bgr instead of rgb */ + if(pict->bps==32 && fb_varinfo.red.offset==16 && fb_varinfo.blue.offset==0) + pict->bgr=1; + else + pict->bgr=0; + if(!(pict->buffer=malloc(pict->xres*pict->yres*i))) FatalError("couldnt malloc"); @@ -185,6 +191,10 @@ int read_fb(char *device, int vt_num, struct picture *pict){ fprintf(stdout, "FIX: card:%s mem:0x%.8X mem_len:%d visual:%i type:%i type_aux:%i line_len:%i accel:%i\n", fb_fixinfo.id,fb_fixinfo.smem_start,fb_fixinfo.smem_len,fb_fixinfo.visual, fb_fixinfo.type,fb_fixinfo.type_aux,fb_fixinfo.line_length,fb_fixinfo.accel); + printf("red: off %2d len %d msb_right %d\n",fb_varinfo.red.offset,fb_varinfo.red.length,fb_varinfo.red.msb_right); + printf("blue: off %2d len %d msb_right %d\n",fb_varinfo.blue.offset,fb_varinfo.blue.length,fb_varinfo.blue.msb_right); + printf("green: off %2d len %d msb_right %d\n",fb_varinfo.green.offset,fb_varinfo.green.length,fb_varinfo.green.msb_right); + printf("transp: off %2d len %d msb_right %d\n",fb_varinfo.transp.offset,fb_varinfo.transp.length,fb_varinfo.transp.msb_right); #endif fflush(stdout); @@ -272,7 +282,10 @@ static int Write_PNG(struct picture * pict, char *filename, int interlace, int g fprintf(stdout, "%i\n",write(i,(void*)pict->buffer,(pict->xres)*(pict->yres))); perror("dupa"); fprintf(stdout, "Writing to %s %ix%i %i\n", filename,(pict->xres),(pict->yres),(pict->xres)*(pict->yres)); +if (pict->colormap != NULL) fprintf(stdout, "start: %i, size: %i\n", pict->colormap->start,pict->colormap->len); +else + printf("no pict->colormap!\n"); fflush(stdout); close(i); #endif @@ -312,7 +325,7 @@ static int Write_PNG(struct picture * pict, char *filename, int interlace, int g png_init_io(png_ptr, OUTfd); - png_set_compression_level(png_ptr, Z_BEST_COMPRESSION); + png_set_compression_level(png_ptr, Z_BEST_SPEED); row_pointers=(png_bytep*)malloc(sizeof(png_bytep)*pict->yres); @@ -357,7 +370,10 @@ static int Write_PNG(struct picture * pict, char *filename, int interlace, int g color_type=PNG_COLOR_TYPE_RGB_ALPHA; for (i=0; i<(pict->yres); i++) row_pointers[i]=pict->buffer+i*4*(pict->xres); - png_set_invert_alpha(png_ptr); + if(pict->bgr) + png_set_bgr(png_ptr); + else /* i'm not sure if the invert_alpha is related to pict->bgr --seife */ + png_set_invert_alpha(png_ptr); break; }