Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ya2d_Texture* ya2d_load_JPEG_file(const char* filename, int place)
- {
- FILE *fd;
- if (!(fd = fopen(filename, "rb"))) {
- goto exit_error;
- }
- struct jpeg_decompress_struct jinfo;
- struct jpeg_error_mgr jerr;
- jinfo.err = jpeg_std_error(&jerr);
- jpeg_create_decompress(&jinfo);
- jpeg_stdio_src(&jinfo, fd);
- jpeg_read_header(&jinfo, 1);
- int row_bytes;
- switch (jinfo.out_color_space) {
- case JCS_RGB:
- row_bytes = jinfo.image_width * 3;
- break;
- default:
- goto exit_close;
- }
- ya2d_Texture *texture = ya2d_create_texture(jinfo.image_width,
- jinfo.image_height,
- GU_PSM_8888, place);
- JSAMPARRAY buffer = (JSAMPARRAY)malloc(sizeof(JSAMPROW));
- buffer[0] = (JSAMPROW)malloc(sizeof(JSAMPLE) * row_bytes);
- unsigned int i, color, *tex_ptr;
- unsigned char* jpeg_ptr = (unsigned char*)buffer[0];
- void* row_ptr = texture->data;
- jpeg_start_decompress(&jinfo);
- while (jinfo.output_scanline < jinfo.output_height) {
- jpeg_read_scanlines(&jinfo, buffer, 1);
- tex_ptr = (unsigned int*)(row_ptr += texture->stride);
- for (i = 0; i < jinfo.output_width; ++i) {
- color = *(jpeg_ptr++);
- color |= *(jpeg_ptr++)<<8;
- color |= *(jpeg_ptr++)<<16;
- *(tex_ptr++) = color | 0xFF000000;
- }
- }
- jpeg_finish_decompress(&jinfo);
- jpeg_destroy_decompress(&jinfo);
- free(buffer[0]);
- free(buffer);
- fclose(fd);
- return texture;
- exit_close:
- fclose(fd);
- exit_error:
- return NULL;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement