Advertisement
xerpi

ya2d_load_JPEG_file FULL

Oct 10th, 2013
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.50 KB | None | 0 0
  1.  
  2. ya2d_Texture* ya2d_load_JPEG_file(const char* filename, int place)
  3. {
  4.     FILE *fd;
  5.     if (!(fd = fopen(filename, "rb"))) {
  6.         goto exit_error;
  7.     }
  8.    
  9.     struct jpeg_decompress_struct jinfo;
  10.     struct jpeg_error_mgr jerr;
  11.     jinfo.err = jpeg_std_error(&jerr);
  12.     jpeg_create_decompress(&jinfo);
  13.     jpeg_stdio_src(&jinfo, fd);
  14.     jpeg_read_header(&jinfo, 1);
  15.    
  16.     int row_bytes;
  17.     switch (jinfo.out_color_space) {
  18.     case JCS_RGB:
  19.         row_bytes = jinfo.image_width * 3;
  20.         break;
  21.     default:
  22.         goto exit_close;
  23.     }
  24.    
  25.     ya2d_Texture *texture = ya2d_create_texture(jinfo.image_width,
  26.                                                 jinfo.image_height,
  27.                                                 GU_PSM_8888, place);
  28.     JSAMPARRAY buffer = (JSAMPARRAY)malloc(sizeof(JSAMPROW));
  29.     buffer[0] = (JSAMPROW)malloc(sizeof(JSAMPLE) * row_bytes);
  30.    
  31.     unsigned int i, color, *tex_ptr;
  32.     unsigned char* jpeg_ptr = (unsigned char*)buffer[0];
  33.     void* row_ptr = texture->data;
  34.     jpeg_start_decompress(&jinfo);
  35.    
  36.     while (jinfo.output_scanline < jinfo.output_height) {
  37.         jpeg_read_scanlines(&jinfo, buffer, 1);
  38.         tex_ptr = (unsigned int*)(row_ptr += texture->stride);
  39.         for (i = 0; i < jinfo.output_width; ++i) {
  40.             color = *(jpeg_ptr++);
  41.             color |= *(jpeg_ptr++)<<8;
  42.             color |= *(jpeg_ptr++)<<16;
  43.             *(tex_ptr++) = color | 0xFF000000;
  44.         }
  45.     }
  46.  
  47.     jpeg_finish_decompress(&jinfo);
  48.     jpeg_destroy_decompress(&jinfo);
  49.    
  50.     free(buffer[0]);
  51.     free(buffer);
  52.     fclose(fd);
  53.     return texture;
  54.    
  55. exit_close:
  56.     fclose(fd);
  57. exit_error:
  58.     return NULL;
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement