Exemple #1
0
/*
==============
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;
}
Exemple #2
0
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;
}