HIDDEN int dsk_wmap(fb *ifp, const ColorMap *cmap) { if (cmap == (ColorMap *) NULL) /* Do not write default map to file. */ return 0; if (fb_is_linear_cmap(cmap)) return 0; if (lseek(ifp->if_fd, FILE_CMAP_ADDR, 0) == -1) { fb_log("disk_colormap_write : seek to %ld failed.\n", FILE_CMAP_ADDR); return -1; } if (write(ifp->if_fd, (char *) cmap, sizeof(ColorMap)) != sizeof(ColorMap)) { fb_log("disk_colormap_write : write failed.\n"); return -1; } return 0; }
int main(int argc, char **argv) { FBIO *fbp; unsigned char *scan_buf; int y; int cm_save_needed; outrle.rle_file = stdout; if (!get_args(argc, argv)) { (void)fputs(usage, stderr); bu_exit(1, NULL); } /* If screen size = default & file size is given, track file size */ if (screen_width == 0 && file_width > 0) screen_width = file_width; if (screen_height == 0 && file_height > 0) screen_height = file_height; if ((fbp = fb_open(framebuffer, screen_width, screen_height)) == FBIO_NULL) bu_exit(12, NULL); /* Honor original screen size desires, if set, unless they shrank */ if (screen_width == 0 || fb_getwidth(fbp) < screen_width) screen_width = fb_getwidth(fbp); if (screen_height == 0 || fb_getheight(fbp) < screen_height) screen_height = fb_getheight(fbp); /* If not specified, output file size tracks screen size */ if (file_width == 0) file_width = screen_width; if (file_height == 0) file_height = screen_height; /* Clip below and to left of (0, 0) */ if (screen_xoff < 0) { file_width += screen_xoff; screen_xoff = 0; } if (screen_yoff < 0) { file_height += screen_yoff; screen_yoff = 0; } /* Clip up and to the right */ if (screen_xoff + file_width > screen_width) file_width = screen_width - screen_xoff; if (screen_yoff + file_height > screen_height) file_height = screen_height - screen_yoff; if (file_width <= 0 || file_height <= 0) { fprintf(stderr, "fb-rle: Error: image rectangle entirely off screen\n"); bu_exit(1, NULL); } /* Read color map, see if it is linear */ cm_save_needed = 1; if (fb_rmap(fbp, &cmap) == -1) cm_save_needed = 0; if (cm_save_needed && fb_is_linear_cmap(&cmap)) cm_save_needed = 0; if (crunch && (cm_save_needed == 0)) crunch = 0; /* Convert to Utah format */ if (cm_save_needed) for (y=0; y<256; y++) { rlemap[y+0*256] = cmap.cm_red[y]; rlemap[y+1*256] = cmap.cm_green[y]; rlemap[y+2*256] = cmap.cm_blue[y]; } scan_buf = (unsigned char *)malloc(sizeof(RGBpixel) * screen_width); /* Build RLE header */ outrle.ncolors = 3; RLE_SET_BIT(outrle, RLE_RED); RLE_SET_BIT(outrle, RLE_GREEN); RLE_SET_BIT(outrle, RLE_BLUE); outrle.background = 2; /* use background */ outrle.bg_color = background; outrle.alpha = 0; /* no alpha channel */ if (cm_save_needed && !crunch) { outrle.ncmap = 3; outrle.cmaplen = 8; /* 1<<8 = 256 */ outrle.cmap = rlemap; } else { outrle.ncmap = 0; /* no color map */ outrle.cmaplen = 0; outrle.cmap = (rle_map *)0; } outrle.xmin = screen_xoff; outrle.ymin = screen_yoff; outrle.xmax = screen_xoff + file_width - 1; outrle.ymax = screen_yoff + file_height - 1; outrle.comments = (const char **)0; /* Add comments to the header file, since we have one */ if (framebuffer == (char *)0) framebuffer = fbp->if_name; snprintf(comment, COMMENT_SIZE, "encoded_from=%s", framebuffer); rle_putcom(bu_strdup(comment), &outrle); now = time(0); snprintf(comment, COMMENT_SIZE, "encoded_date=%24.24s", ctime(&now)); rle_putcom(bu_strdup(comment), &outrle); if ((who = getenv("USER")) != (char *)0) { snprintf(comment, COMMENT_SIZE, "encoded_by=%s", who); rle_putcom(bu_strdup(comment), &outrle); } # if HAVE_GETHOSTNAME gethostname(host, sizeof(host)); snprintf(comment, COMMENT_SIZE, "encoded_host=%s", host); rle_putcom(bu_strdup(comment), &outrle); # endif rle_put_setup(&outrle); rle_row_alloc(&outrle, &rows); /* Read the image a scanline at a time, and encode it */ for (y = 0; y < file_height; y++) { if (fb_read(fbp, screen_xoff, y+screen_yoff, scan_buf, file_width) == -1) { (void) fprintf(stderr, "fb-rle: read of %d pixels on line %d failed!\n", file_width, y+screen_yoff); bu_exit(1, NULL); } if (crunch) cmap_crunch((RGBpixel *)scan_buf, file_width, &cmap); /* Grumble, convert to Utah layout */ { unsigned char *pp = (unsigned char *)scan_buf; rle_pixel *rp = rows[0]; rle_pixel *gp = rows[1]; rle_pixel *bp = rows[2]; int i; for (i=0; i<file_width; i++) { *rp++ = *pp++; *gp++ = *pp++; *bp++ = *pp++; } } rle_putrow(rows, file_width, &outrle); } rle_puteof(&outrle); fb_close(fbp); fclose(outrle.rle_file); return 0; }
int main(int argc, char **argv) { FBIO *fbp; int y; unsigned char *scanline; /* 1 scanline pixel buffer */ int scanbytes; /* # of bytes of scanline */ int scanpix; /* # of pixels of scanline */ ColorMap cmap; /* libfb color map */ char usage[] = "\ Usage: fb-pix [-h -i -c] [-F framebuffer]\n\ [-s squaresize] [-w width] [-n height] [file.pix]\n"; screen_height = screen_width = 512; /* Defaults */ if (!get_args(argc, argv)) { (void)fputs(usage, stderr); bu_exit(1, NULL); } #if defined(_WIN32) && !defined(__CYGWIN__) setmode(fileno(stdout), O_BINARY); #endif scanpix = screen_width; scanbytes = scanpix * sizeof(RGBpixel); if ((scanline = (unsigned char *)malloc(scanbytes)) == RGBPIXEL_NULL) { fprintf(stderr, "fb-pix: malloc(%d) failure\n", scanbytes); bu_exit(2, NULL); } if ((fbp = fb_open(framebuffer, screen_width, screen_height)) == NULL) { bu_exit(12, NULL); } if (screen_height > fb_getheight(fbp)) screen_height = fb_getheight(fbp); if (screen_width > fb_getwidth(fbp)) screen_width = fb_getwidth(fbp); if (crunch) { if (fb_rmap(fbp, &cmap) == -1) { crunch = 0; } else if (fb_is_linear_cmap(&cmap)) { crunch = 0; } } if (!inverse) { /* Regular -- read bottom to top */ for (y=0; y < screen_height; y++) { fb_read(fbp, 0, y, scanline, screen_width); if (crunch) cmap_crunch((RGBpixel *)scanline, scanpix, &cmap); if (fwrite((char *)scanline, scanbytes, 1, outfp) != 1) { perror("fwrite"); break; } } } else { /* Inverse -- read top to bottom */ for (y = screen_height-1; y >= 0; y--) { fb_read(fbp, 0, y, scanline, screen_width); if (crunch) cmap_crunch((RGBpixel *)scanline, scanpix, &cmap); if (fwrite((char *)scanline, scanbytes, 1, outfp) != 1) { perror("fwrite"); break; } } } fb_close(fbp); return 0; }