Advertisement
xerpi

ya2d load image [file]

Oct 7th, 2013
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.99 KB | None | 0 0
  1. /*
  2. * Copyright (C) 2013, xerpi
  3. */
  4.  
  5. #include "ya2d_image.h"
  6. #include "ya2d_texture.h"
  7. #include <pspiofilemgr.h>
  8. #include <pspgu.h>
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <png.h>
  12.  
  13.  
  14. static void _ya2d_read_png_file_fn(png_structp png_ptr, png_bytep data, png_size_t length)
  15. {
  16.     SceUID fd = *(SceUID*) png_get_io_ptr(png_ptr);
  17.     sceIoRead(fd, data, length);
  18. }
  19.  
  20. static void _ya2d_read_png_buffer_fn(png_structp png_ptr, png_bytep data, png_size_t length)
  21. {
  22.     unsigned char *address = png_get_io_ptr(png_ptr);
  23.     memcpy(data, address, length);
  24.     *address += length;
  25. }
  26.  
  27.  
  28.  
  29. ya2d_Texture* ya2d_load_PNG_file(const char* filename, int place)
  30. {
  31.     png_byte pngsig[YA2D_PNGSIGSIZE];
  32.     SceUID fd;
  33.    
  34.     if(!(fd = sceIoOpen(filename, PSP_O_RDONLY, 0777))) {
  35.         goto exit_error;
  36.     }
  37.     if(sceIoRead(fd, pngsig, YA2D_PNGSIGSIZE) != YA2D_PNGSIGSIZE) {
  38.         goto exit_close;
  39.     }
  40.     if(png_sig_cmp(pngsig, 0, YA2D_PNGSIGSIZE) != 0) {
  41.         goto exit_close;
  42.     }
  43.    
  44.     png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,
  45.                                                  NULL, NULL, NULL);
  46.     if(png_ptr == NULL) {
  47.         goto exit_close;
  48.     }
  49.    
  50.     png_infop info_ptr = png_create_info_struct(png_ptr);
  51.     if(info_ptr == NULL) {
  52.         goto exit_destroy_read;
  53.     }
  54.    
  55.     png_bytep* row_ptrs = NULL;
  56.    
  57.     if(setjmp(png_jmpbuf(png_ptr))) {
  58.         png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)0);
  59.         if(row_ptrs != NULL) free(row_ptrs);
  60.         goto exit_close;   
  61.     }
  62.  
  63.     png_set_read_fn(png_ptr, (png_voidp)&fd, _ya2d_read_png_file_fn);
  64.     png_set_sig_bytes(png_ptr, YA2D_PNGSIGSIZE);
  65.     png_read_info(png_ptr, info_ptr);
  66.    
  67.     unsigned int width, height;
  68.     int bit_depth, color_type;
  69.    
  70.     png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth,
  71.                  &color_type, NULL, NULL, NULL);
  72.    
  73.     switch(color_type) {
  74.     case PNG_COLOR_TYPE_RGB: //PSP: 16 or 32 bpp (not 0xRRGGBB)
  75.         png_set_filler(png_ptr, 0xFF, PNG_FILLER_AFTER);
  76.         break;
  77.     case PNG_COLOR_TYPE_PALETTE:
  78.         png_set_palette_to_rgb(png_ptr);
  79.         break;
  80.     case PNG_COLOR_TYPE_GRAY:
  81.         if(bit_depth < 8) {
  82.             png_set_expand_gray_1_2_4_to_8(png_ptr);
  83.             bit_depth = 8;
  84.         }
  85.         break;
  86.     }
  87.    
  88.     if(png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) {
  89.         png_set_tRNS_to_alpha(png_ptr);
  90.     }
  91.     if(bit_depth == 16) {
  92.         png_set_strip_16(png_ptr);
  93.     }
  94.    
  95.     png_read_update_info(png_ptr, info_ptr);
  96.    
  97.     row_ptrs = (png_bytep*)malloc(sizeof(png_bytep) * height);
  98.     ya2d_Texture* texture = ya2d_create_texture(width, height,
  99.                                                 GU_PSM_8888, place);
  100.                                                
  101.     int i;
  102.     for (i = 0; i < height; ++i) {
  103.         row_ptrs[i] = (png_bytep)(texture->data + i*texture->stride);
  104.     }
  105.    
  106.     png_read_image(png_ptr, row_ptrs);
  107.     png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)0);
  108.     free(row_ptrs);
  109.     sceIoClose(fd);
  110.     return texture;
  111.    
  112. exit_destroy_read:
  113.     png_destroy_read_struct(&png_ptr, (png_infopp)0, (png_infopp)0);
  114. exit_close:
  115.     sceIoClose(fd);
  116. exit_error:
  117.     return NULL;
  118. }
  119.  
  120.  
  121. ya2d_Texture* ya2d_load_PNG_buffer(void *buffer, int place)
  122. {
  123.  
  124.     return NULL;   
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement