static void do_read_bitmap(deark *c, lctx *d, de_int64 pos) { de_int64 ver_num; dbuf *unc_pixels = NULL; ver_num = de_getui32be(pos); de_dbg(c, "version number: %u\n", (unsigned int)ver_num); if(ver_num!=0 && ver_num!=2 && ver_num!=3) { de_warn(c, "Unrecognized version number: %u\n", (unsigned int)ver_num); } pos += 512; unc_pixels = dbuf_create_membuf(c, MACPAINT_IMAGE_BYTES, 1); de_fmtutil_uncompress_packbits(c->infile, pos, c->infile->len - pos, unc_pixels, NULL); if(unc_pixels->len < MACPAINT_IMAGE_BYTES) { de_warn(c, "Image decompressed to %d bytes, expected %d.\n", (int)unc_pixels->len, (int)MACPAINT_IMAGE_BYTES); } de_convert_and_write_image_bilevel(unc_pixels, 0, MACPAINT_WIDTH, MACPAINT_HEIGHT, MACPAINT_WIDTH/8, DE_CVTF_WHITEISZERO, NULL, 0); dbuf_close(unc_pixels); }
static int do_image_pbm_binary(deark *c, lctx *d, struct page_ctx *pg, de_int64 pos1) { de_int64 rowspan; rowspan = (pg->width+7)/8; pg->image_data_len = rowspan * pg->height; de_convert_and_write_image_bilevel(c->infile, pos1, pg->width, pg->height, rowspan, DE_CVTF_WHITEISZERO, NULL, 0); return 1; }
// TODO: Consolidate this withe do_static_bitmap()? static void do_picture_bitmap(deark *c, lctx *d, struct para_info *pinfo) { i64 pos1 = pinfo->thisparapos; i64 pos; i64 cbHeader, cbSize; i64 bmWidth, bmHeight; i64 bmPlanes; i64 bmBitsPixel; i64 rowspan; pos = pos1; pos += 16; pos += 2; bmWidth = de_getu16le_p(&pos); // pos1+16+2 bmHeight = de_getu16le_p(&pos); // pos1+16+4 de_dbg_dimensions(c, bmWidth, bmHeight); rowspan = de_getu16le_p(&pos); // pos1+16+6 de_dbg(c, "bytes/row: %d", (int)rowspan); bmPlanes = (i64)de_getbyte_p(&pos); de_dbg(c, "planes: %d", (int)bmPlanes); bmBitsPixel = (i64)de_getbyte_p(&pos); // pos1+16+9 de_dbg(c, "bmBitsPixel: %d", (int)bmBitsPixel); pos += 4; cbHeader = de_getu16le_p(&pos); // pos1+30 de_dbg(c, "cbHeader: %d", (int)cbHeader); cbSize = de_getu32le_p(&pos); // pos1+32 de_dbg(c, "cbSize: %d", (int)cbSize); if(bmBitsPixel!=1 || bmPlanes!=1) { de_err(c, "This type of bitmap is not supported (bmBitsPixel=%d, planes=%d)", (int)bmBitsPixel, (int)bmPlanes); goto done; } pos = pos1 + cbHeader; de_convert_and_write_image_bilevel(c->infile, pos, bmWidth, bmHeight, rowspan, 0, NULL, 0); done: ; }
static void do_card_index(deark *c, lctx *d, de_int64 cardnum, de_int64 pos) { de_int64 datapos; de_int64 bitmap_len; de_int64 w, h; de_int64 src_rowspan; de_int64 text_len; de_int64 text_pos; struct deark_bitmap *img = NULL; de_finfo *fi_bitmap = NULL; de_finfo *fi_text = NULL; const char *cardtype; de_ucstring *name = NULL; int saved_indent_level; de_dbg_indent_save(c, &saved_indent_level); datapos = de_getui32le(pos+6); de_dbg(c, "card #%d at %d, dpos=%d\n", (int)cardnum, (int)pos, (int)datapos); de_dbg_indent(c, 1); if(datapos>=c->infile->len) goto done; bitmap_len = de_getui16le(datapos); de_dbg(c, "bitmap length: %d\n", (int)bitmap_len); if(bitmap_len==0) { text_len = de_getui16le(datapos+2); text_pos = datapos+4; } else { text_len = de_getui16le(datapos + bitmap_len + 10); text_pos = datapos + bitmap_len + 10; } de_dbg(c, "text length: %d\n", (int)text_len); if(bitmap_len==0 && text_len==0) { cardtype = "empty"; } else if(bitmap_len==0) { cardtype = "text-only"; } else if(text_len==0) { cardtype = "graphics-only"; } else { cardtype = "graphics+text"; } de_dbg(c, "card type: %s\n", cardtype); if(bitmap_len==0 && text_len==0) { goto done; } name = ucstring_create(c); dbuf_read_to_ucstring(c->infile, pos+11, 40, name, DE_CONVFLAG_STOP_AT_NUL, DE_ENCODING_ASCII); de_dbg(c, "name: \"%s\"\n", ucstring_get_printable_sz(name)); // Text if(text_len!=0 && c->extract_level>=2) { fi_text = de_finfo_create(c); if(c->filenames_from_file) de_finfo_set_name_from_ucstring(c, fi_text, name); do_text_data(c, d, fi_text, text_pos, text_len); } // Bitmap if(bitmap_len==0) goto done; fi_bitmap = de_finfo_create(c); if(c->filenames_from_file) de_finfo_set_name_from_ucstring(c, fi_bitmap, name); w = de_getui16le(datapos+2); h = de_getui16le(datapos+4); de_dbg(c, "bitmap dimensions: %dx%d\n", (int)w, (int)h); img = de_bitmap_create(c, w, h, 1); src_rowspan = ((w+15)/16)*2; de_convert_and_write_image_bilevel(c->infile, datapos+10, w, h, src_rowspan, 0, fi_bitmap, 0); done: ucstring_destroy(name); de_bitmap_destroy(img); de_finfo_destroy(c, fi_bitmap); de_finfo_destroy(c, fi_text); de_dbg_indent_restore(c, saved_indent_level); }