// Rasterized caption static void handle_2_125(deark *c, lctx *d, const struct ds_info *dsi, de_int64 pos, de_int64 len) { dbuf *unc_pixels = NULL; struct deark_bitmap *img = NULL; de_int64 i, j; de_byte b; de_int64 rowspan; de_int64 width, height; // I can't find any examples of this field, so this may not be correct. // The format seems to be well-documented, though the pixels are in an // unusual order. unc_pixels = dbuf_open_input_subfile(c->infile, pos, len); width = 460; height = 128; img = de_bitmap_create(c, width, height, 1); rowspan = height/8; for(j=0; j<width; j++) { for(i=0; i<height; i++) { b = de_get_bits_symbol(unc_pixels, 1, rowspan*j, i); de_bitmap_setpixel_gray(img, j, (height-1-i), b?0:255); } } de_bitmap_write_to_file(img, "caption", DE_CREATEFLAG_IS_AUX); de_bitmap_destroy(img); dbuf_close(unc_pixels); }
static void do_bitmap(deark *c, lctx *d, dbuf *unc_pixels) { i64 i, j; i64 rowspan; u32 clr; de_bitmap *img = NULL; u8 b; rowspan = (d->w * d->bpp +7)/8; img = de_bitmap_create(c, d->w, d->h, 3); for(j=0; j<d->h; j++) { for(i=0; i<d->w; i++) { if(d->bpp<=8) { b = de_get_bits_symbol(unc_pixels, d->bpp, j*rowspan, i); clr = d->pal[(unsigned int)b]; } else { clr = dbuf_getRGB(unc_pixels, j*rowspan + i*3, 0); } de_bitmap_setpixel_rgb(img, i, j, clr); } } de_bitmap_write_to_file(img, NULL, 0); de_bitmap_destroy(img); }
// Some MacPaint files contain a collection of brush patterns. // Essentially, MacPaint saves workspace settings inside image files. // (But these patterns are the only setting.) static void do_read_patterns(deark *c, lctx *d, de_int64 pos) { de_int64 cell; de_int64 i, j; de_byte x; const de_int64 dispwidth = 19; const de_int64 dispheight = 17; de_int64 xpos, ypos; int is_blank; struct deark_bitmap *pat = NULL; de_uint32 patcrc; const char *patsetname; pos += 4; patcrc = x_dbuf_crc32(c->infile, pos, 38*8); patsetname = get_pattern_set_info(patcrc, &is_blank); de_dbg(c, "brush patterns crc: 0x%08x (%s)\n", (unsigned int)patcrc, patsetname); if(c->extract_level<2) { goto done; } if(is_blank) { de_dbg(c, "brush patterns are blank: not extracting\n"); goto done; } pat = de_bitmap_create(c, (dispwidth+1)*19+1, (dispheight+1)*2+1, 1); for(cell=0; cell<38; cell++) { xpos = (dispwidth+1)*(cell%19)+1; ypos = (dispheight+1)*(cell/19)+1; for(j=0; j<dispheight; j++) { for(i=0; i<dispwidth; i++) { // TODO: Figure out the proper "brush origin" of these patterns. // Some of them may be shifted differently than MacPaint displays them. x = de_get_bits_symbol(c->infile, 1, pos+cell*8+j%8, i%8); // 0 = white. Only need to set the white pixels, since they start out // black. if(x==0) { de_bitmap_setpixel_gray(pat, xpos+i, ypos+j, 255); } } } } de_bitmap_write_to_file(pat, "pat", DE_CREATEFLAG_IS_AUX); done: de_bitmap_destroy(pat); }
static void do_decode_1_4_8bit(deark *c, lctx *d, struct page_ctx *pg) { struct deark_bitmap *img = NULL; de_int64 i, j; de_byte a, b; de_byte x; de_int32 fgcol; img = de_bitmap_create(c, pg->type_info->width, pg->type_info->height, 4); for(j=0; j<pg->type_info->height; j++) { for(i=0; i<pg->type_info->width; i++) { // Foreground b = de_get_bits_symbol(c->infile, pg->type_info->bpp, pg->image_pos + pg->rowspan*j, i); if(pg->type_info->bpp==8) { fgcol = getpal256((int)b); } else if(pg->type_info->bpp==4) { fgcol = pal16[(unsigned int)b]; } else { fgcol = b ? 0x0000000 : 0xffffff; } // Opacity if(pg->mask_pos) { x = de_get_bits_symbol(c->infile, 1, pg->mask_pos + pg->mask_rowspan*j, i); a = x ? 0xff : 0x00; } else { a = 0xff; } de_bitmap_setpixel_rgba(img, i, j, DE_SET_ALPHA(fgcol, a)); } } de_bitmap_write_to_file(img, pg->filename_token, 0); de_bitmap_destroy(img); }
static void read_paletted_image(deark *c, lctx *d, dbuf *unc_pixels, de_bitmap *img) { i64 i, j, plane; unsigned int n; u8 x; if(d->nplanes<1 || d->nplanes>8) return; for(j=0; j<d->h; j++) { for(i=0; i<d->w; i++) { n = 0; for(plane=0; plane<d->nplanes; plane++) { x = de_get_bits_symbol(unc_pixels, 1, j*d->rowspan_total + plane*d->rowspan_per_plane, i); if(x) n |= 1<<plane; } de_bitmap_setpixel_rgb(img, i, j, d->pal[n]); } } }