Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/LibRawLite/internal/libraw_x3f.cpp view on Meta::CPAN
/* Read image data */
ID->data_size = read_data_block(&ID->data, I, DE, 0);
/* TODO: can it be fewer than 8 bits? Maybe taken from TRU->table? */
new_huffman_tree(&TRU->tree, 8);
populate_true_huffman_tree(&TRU->tree, &TRU->table);
#ifdef DBG_PRNT
print_huffman_tree(TRU->tree.nodes, 0, 0);
#endif
TRU->plane_address[0] = (uint8_t*)ID->data;
for (i=1; i<TRUE_PLANES; i++)
TRU->plane_address[i] =
TRU->plane_address[i-1] +
(((TRU->plane_size.element[i-1] + 15) / 16) * 16);
TRU->x3rgb16.size = ID->columns * ID->rows * 3;
TRU->x3rgb16.element =
(uint16_t *)malloc(sizeof(uint16_t)*TRU->x3rgb16.size);
true_decode(I, DE);
}
static void x3f_load_huffman_compressed(x3f_info_t *I,
x3f_directory_entry_t *DE,
int bits,
int use_map_table)
{
x3f_directory_entry_header_t *DEH = &DE->header;
x3f_image_data_t *ID = &DEH->data_subsection.image_data;
x3f_huffman_t *HUF = ID->huffman;
int table_size = 1<<bits;
int row_offsets_size = ID->rows * sizeof(HUF->row_offsets.element[0]);
#ifdef DCRAW_VERBOSE
printf("Load huffman compressed\n");
#endif
GET_TABLE(HUF->table, GET4, table_size,uint32_t);
ID->data_size = read_data_block(&ID->data, I, DE, row_offsets_size);
GET_TABLE(HUF->row_offsets, GET4, ID->rows,uint32_t);
#ifdef DCRAW_VERBOSE
printf("Make huffman tree ...\n");
#endif
new_huffman_tree(&HUF->tree, bits);
populate_huffman_tree(&HUF->tree, &HUF->table, &HUF->mapping);
#ifdef DCRAW_VERBOSE
printf("... DONE\n");
#endif
#ifdef DBG_PRNT
print_huffman_tree(HUF->tree.nodes, 0, 0);
#endif
huffman_decode(I, DE, bits);
}
static void x3f_load_huffman_not_compressed(x3f_info_t *I,
x3f_directory_entry_t *DE,
int bits,
int use_map_table,
int row_stride)
{
x3f_directory_entry_header_t *DEH = &DE->header;
x3f_image_data_t *ID = &DEH->data_subsection.image_data;
#ifdef DCRAW_VERBOSE
printf("Load huffman not compressed\n");
#endif
ID->data_size = read_data_block(&ID->data, I, DE, 0);
simple_decode(I, DE, bits, row_stride);
}
static void x3f_load_huffman(x3f_info_t *I,
x3f_directory_entry_t *DE,
int bits,
int use_map_table,
int row_stride)
{
x3f_directory_entry_header_t *DEH = &DE->header;
x3f_image_data_t *ID = &DEH->data_subsection.image_data;
x3f_huffman_t *HUF = new_huffman(&ID->huffman);
if (use_map_table) {
int table_size = 1<<bits;
GET_TABLE(HUF->mapping, GET2, table_size,uint16_t);
}
switch (ID->type_format) {
case X3F_IMAGE_RAW_HUFFMAN_X530:
case X3F_IMAGE_RAW_HUFFMAN_10BIT:
HUF->x3rgb16.size = ID->columns * ID->rows * 3;
HUF->x3rgb16.element =
(uint16_t *)malloc(sizeof(uint16_t)*HUF->x3rgb16.size);
break;
case X3F_IMAGE_THUMB_HUFFMAN:
HUF->rgb8.size = ID->columns * ID->rows * 3;
HUF->rgb8.element =
(uint8_t *)malloc(sizeof(uint8_t)*HUF->rgb8.size);
break;
default:
#ifdef DCRAW_VERBOSE
fprintf(stderr, "Unknown huffman image type\n");
#endif
break;
}
if (row_stride == 0)
return x3f_load_huffman_compressed(I, DE, bits, use_map_table);
else
return x3f_load_huffman_not_compressed(I, DE, bits, use_map_table, row_stride);
}
static void x3f_load_pixmap(x3f_info_t *I, x3f_directory_entry_t *DE)
{
x3f_load_image_verbatim(I, DE);
}
static void x3f_load_jpeg(x3f_info_t *I, x3f_directory_entry_t *DE)
{
x3f_load_image_verbatim(I, DE);
}
static void x3f_load_image(x3f_info_t *I, x3f_directory_entry_t *DE)
{
x3f_directory_entry_header_t *DEH = &DE->header;
x3f_image_data_t *ID = &DEH->data_subsection.image_data;
read_data_set_offset(I, DE, X3F_IMAGE_HEADER_SIZE);
switch (ID->type_format) {
case X3F_IMAGE_RAW_TRUE:
case X3F_IMAGE_RAW_MERRILL:
case X3F_IMAGE_RAW_QUATTRO:
x3f_load_true(I, DE);
break;
case X3F_IMAGE_RAW_HUFFMAN_X530:
case X3F_IMAGE_RAW_HUFFMAN_10BIT:
x3f_load_huffman(I, DE, 10, 1, ID->row_stride);
break;
case X3F_IMAGE_THUMB_PLAIN:
x3f_load_pixmap(I, DE);
break;
case X3F_IMAGE_THUMB_HUFFMAN:
x3f_load_huffman(I, DE, 8, 0, ID->row_stride);
break;
case X3F_IMAGE_THUMB_JPEG:
x3f_load_jpeg(I, DE);
break;
default:
#ifdef DCRAW_VERBOSE
fprintf(stderr, "Unknown image type\n");
#endif
break;
}
}
static void x3f_load_camf_decode_type2(x3f_camf_t *CAMF)
{
uint32_t key = CAMF->t2.crypt_key;
int i;
CAMF->decoded_data_size = CAMF->data_size;
CAMF->decoded_data = malloc(CAMF->decoded_data_size);
for (i=0; i<CAMF->data_size; i++) {
uint8_t old, _new;
uint32_t tmp;
old = ((uint8_t *)CAMF->data)[i];
key = (key * 1597 + 51749) % 244944;
( run in 0.890 second using v1.01-cache-2.11-cpan-941387dca55 )