Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/FreeImage/PluginTARGA.cpp view on Meta::CPAN
// start anew on the next pixel
continue;
} else {
writeToPacket(packet, current, pixel_size);
packet += pixel_size;
}
}
// increase counter on every pixel
++packet_count;
if(packet_count == max_packet_size) {
flushPacket(line, pixel_size, packet_begin, packet, packet_count, has_rle);
}
}//for width
// write line to disk
io->write_proc(line_begin, 1, (unsigned)(line - line_begin), handle);
}//for height
free(line_begin);
free(packet_begin);
free(current);
free(next);
}
static BOOL DLL_CALLCONV
Save(FreeImageIO *io, FIBITMAP *dib, fi_handle handle, int page, int flags, void *data) {
if ((dib == NULL) || (handle == NULL)) {
return FALSE;
}
RGBQUAD *palette = FreeImage_GetPalette(dib);
const unsigned bpp = FreeImage_GetBPP(dib);
// write the file header
TGAHEADER header;
header.id_length = 0;
header.cm_first_entry = 0;
header.is_xorigin = 0;
header.is_yorigin = 0;
header.is_width = (WORD)FreeImage_GetWidth(dib);
header.is_height = (WORD)FreeImage_GetHeight(dib);
header.is_pixel_depth = (BYTE)bpp;
header.is_image_descriptor = (bpp == 32 ? 8 : 0);
if (palette) {
header.color_map_type = 1;
header.image_type = (TARGA_SAVE_RLE & flags) ? TGA_RLECMAP : TGA_CMAP;
header.cm_length = (WORD)(1 << bpp);
if (FreeImage_IsTransparent(dib)) {
header.cm_size = 32;
} else {
header.cm_size = 24;
}
} else {
header.color_map_type = 0;
header.image_type = (TARGA_SAVE_RLE & flags) ? TGA_RLERGB : TGA_RGB;
header.cm_length = 0;
header.cm_size = 0;
}
// write the header
#ifdef FREEIMAGE_BIGENDIAN
SwapHeader(&header);
#endif
io->write_proc(&header, sizeof(header), 1, handle);
#ifdef FREEIMAGE_BIGENDIAN
SwapHeader(&header);
#endif
// write the palette
if (palette) {
if (FreeImage_IsTransparent(dib)) {
FILE_BGRA *bgra_pal = (FILE_BGRA*)malloc(header.cm_length * sizeof(FILE_BGRA));
// get the transparency table
BYTE *trns = FreeImage_GetTransparencyTable(dib);
for (unsigned i = 0; i < header.cm_length; i++) {
bgra_pal[i].b = palette[i].rgbBlue;
bgra_pal[i].g = palette[i].rgbGreen;
bgra_pal[i].r = palette[i].rgbRed;
bgra_pal[i].a = trns[i];
}
io->write_proc(bgra_pal, sizeof(FILE_BGRA), header.cm_length, handle);
free(bgra_pal);
} else {
FILE_BGR *bgr_pal = (FILE_BGR*)malloc(header.cm_length * sizeof(FILE_BGR));
for (unsigned i = 0; i < header.cm_length; i++) {
bgr_pal[i].b = palette[i].rgbBlue;
bgr_pal[i].g = palette[i].rgbGreen;
bgr_pal[i].r = palette[i].rgbRed;
}
io->write_proc(bgr_pal, sizeof(FILE_BGR), header.cm_length, handle);
free(bgr_pal);
}
}
// write the data bits
if (TARGA_SAVE_RLE & flags) {
saveRLE(dib, io, handle);
} else {
// -- no rle compression --
const unsigned width = header.is_width;
const unsigned height = header.is_height;
const unsigned pixel_size = bpp/8;
BYTE *line, *const line_begin = (BYTE*)malloc(width * pixel_size);
BYTE *line_source = line_begin;
for (unsigned y = 0; y < height; y++) {
BYTE *scanline = FreeImage_GetScanLine(dib, y);
// rewind the line pointer
line = line_begin;
switch (bpp) {
case 8: {
// don't copy line, read straight from dib
line_source = scanline;
}
( run in 0.662 second using v1.01-cache-2.11-cpan-e1769b4cff6 )