static void do_decode_24bit(deark *c, lctx *d, struct page_ctx *pg) { dbuf *unc_pixels = NULL; struct deark_bitmap *img = NULL; de_int64 i, j; de_byte cr, cg, cb, ca; de_int64 w, h; de_int64 skip; w = pg->type_info->width; h = pg->type_info->height; // TODO: Try to support uncompressed 24-bit images, assuming they exist. // Apparently, some 'it32' icons begin with four extra 0x00 bytes. // Skip over the first four bytes if they are 0x00. // (I don't know the reason for these bytes, but this is the same // logic libicns uses.) skip = 0; if(pg->code4cc.id==0x69743332) { // 'it32' (128x128) if(!dbuf_memcmp(c->infile, pg->image_pos, "\0\0\0\0", 4)) { skip = 4; } } unc_pixels = dbuf_create_membuf(c, w*h*3, 1); do_uncompress_24(c, d, pg, unc_pixels, skip); img = de_bitmap_create(c, w, h, 4); for(j=0; j<pg->type_info->height; j++) { for(i=0; i<pg->type_info->width; i++) { cr = dbuf_getbyte(unc_pixels, j*w + i); cg = dbuf_getbyte(unc_pixels, (h+j)*w + i); cb = dbuf_getbyte(unc_pixels, (2*h+j)*w + i); if(pg->mask_pos) ca = de_getbyte(pg->mask_pos + j*w + i); else ca = 0xff; de_bitmap_setpixel_rgba(img, i, j, DE_MAKE_RGBA(cr,cg,cb,ca)); } } de_bitmap_write_to_file(img, pg->filename_token, 0); de_bitmap_destroy(img); if(unc_pixels) dbuf_close(unc_pixels); }
static void do_image_16_32bit(deark *c, lctx *d, dbuf *bits, de_int64 bits_offset) { struct deark_bitmap *img = NULL; de_int64 i, j; int has_transparency; de_uint32 v; de_int64 k; de_byte sm[4]; if(d->bitfields_type==BF_SEGMENT) { has_transparency = (d->bitfields_segment_len>=16 && d->bitfield[3].mask!=0); } else if(d->bitfields_type==BF_IN_HEADER) { has_transparency = (d->bitfield[3].mask!=0); } else { has_transparency = 0; } img = bmp_bitmap_create(c, d, has_transparency?4:3); for(j=0; j<d->height; j++) { for(i=0; i<d->width; i++) { if(d->bitcount==16) { v = (de_uint32)dbuf_getui16le(bits, bits_offset + j*d->rowspan + 2*i); } else { v = (de_uint32)dbuf_getui32le(bits, bits_offset + j*d->rowspan + 4*i); } for(k=0; k<4; k++) { if(d->bitfield[k].mask!=0) { sm[k] = (de_byte)(0.5 + d->bitfield[k].scale * (double)((v&d->bitfield[k].mask) >> d->bitfield[k].shift)); } else { if(k==3) sm[k] = 255; // Default alpha sample = opaque else sm[k] = 0; // Default other samples = 0 } } de_bitmap_setpixel_rgba(img, i, j, DE_MAKE_RGBA(sm[0], sm[1], sm[2], sm[3])); }