/* ============== LoadPCX32 ============== */ RGBAImagePtr LoadPCX32Buff(byte* buffer, std::size_t length) { byte *palette; byte *pic8; int i, c, p, width, height; byte *pic32; LoadPCXBuff(buffer, length, &pic8, &palette, &width, &height); if (!pic8) { return RGBAImagePtr(); } RGBAImagePtr image (new RGBAImage(width, height)); c = (width) * (height); pic32 = image->getMipMapPixels(0); for (i = 0; i < c; i++) { p = pic8[i]; pic32[0] = palette[p * 3]; pic32[1] = palette[p * 3 + 1]; pic32[2] = palette[p * 3 + 2]; pic32[3] = 255; pic32 += 4; } free (pic8); free (palette); return image; }
static RGBAImagePtr LoadJPGBuff_(const void *src_buffer, int src_size) { struct jpeg_decompress_struct cinfo; struct my_jpeg_error_mgr jerr; cinfo.err = jpeg_std_error (&jerr.pub); jerr.pub.error_exit = my_jpeg_error_exit; if (setjmp (jerr.setjmp_buffer)) //< TODO: use c++ exceptions instead of setjmp/longjmp to handle errors { rError() << "WARNING: JPEG library error: " << errormsg << "\n"; jpeg_destroy_decompress (&cinfo); return RGBAImagePtr(); } jpeg_create_decompress (&cinfo); jpeg_buffer_src (&cinfo, const_cast<void*>(src_buffer), src_size); jpeg_read_header (&cinfo, TRUE); jpeg_start_decompress (&cinfo); int row_stride = cinfo.output_width * cinfo.output_components; RGBAImagePtr image (new RGBAImage(cinfo.output_width, cinfo.output_height)); JSAMPARRAY buffer = (*cinfo.mem->alloc_sarray) ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); while (cinfo.output_scanline < cinfo.output_height) { jpeg_read_scanlines (&cinfo, buffer, 1); if (cinfo.out_color_components == 4) j_putRGBAScanline (buffer[0], cinfo.output_width, image->getMipMapPixels(0), cinfo.output_scanline-1); else if (cinfo.out_color_components == 3) j_putRGBScanline (buffer[0], cinfo.output_width, image->getMipMapPixels(0), cinfo.output_scanline-1); else if (cinfo.out_color_components == 1) j_putGrayScanlineToRGB (buffer[0], cinfo.output_width, image->getMipMapPixels(0), cinfo.output_scanline-1); } jpeg_finish_decompress (&cinfo); jpeg_destroy_decompress (&cinfo); return image; }