Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Copyright (C) 2013, xerpi
- */
- #include "ya2d_image.h"
- #include "ya2d_texture.h"
- #include <pspiofilemgr.h>
- #include <pspgu.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <png.h>
- static void _ya2d_read_png_file_fn(png_structp png_ptr, png_bytep data, png_size_t length)
- {
- SceUID fd = *(SceUID*) png_get_io_ptr(png_ptr);
- sceIoRead(fd, data, length);
- }
- static void _ya2d_read_png_buffer_fn(png_structp png_ptr, png_bytep data, png_size_t length)
- {
- unsigned char *address = png_get_io_ptr(png_ptr);
- memcpy(data, address, length);
- *address += length;
- }
- ya2d_Texture* ya2d_load_PNG_file(const char* filename, int place)
- {
- png_byte pngsig[YA2D_PNGSIGSIZE];
- SceUID fd;
- if(!(fd = sceIoOpen(filename, PSP_O_RDONLY, 0777))) {
- goto exit_error;
- }
- if(sceIoRead(fd, pngsig, YA2D_PNGSIGSIZE) != YA2D_PNGSIGSIZE) {
- goto exit_close;
- }
- if(png_sig_cmp(pngsig, 0, YA2D_PNGSIGSIZE) != 0) {
- goto exit_close;
- }
- png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,
- NULL, NULL, NULL);
- if(png_ptr == NULL) {
- goto exit_close;
- }
- png_infop info_ptr = png_create_info_struct(png_ptr);
- if(info_ptr == NULL) {
- goto exit_destroy_read;
- }
- png_bytep* row_ptrs = NULL;
- if(setjmp(png_jmpbuf(png_ptr))) {
- png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)0);
- if(row_ptrs != NULL) free(row_ptrs);
- goto exit_close;
- }
- png_set_read_fn(png_ptr, (png_voidp)&fd, _ya2d_read_png_file_fn);
- png_set_sig_bytes(png_ptr, YA2D_PNGSIGSIZE);
- png_read_info(png_ptr, info_ptr);
- unsigned int width, height;
- int bit_depth, color_type;
- png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth,
- &color_type, NULL, NULL, NULL);
- switch(color_type) {
- case PNG_COLOR_TYPE_RGB: //PSP: 16 or 32 bpp (not 0xRRGGBB)
- png_set_filler(png_ptr, 0xFF, PNG_FILLER_AFTER);
- break;
- case PNG_COLOR_TYPE_PALETTE:
- png_set_palette_to_rgb(png_ptr);
- break;
- case PNG_COLOR_TYPE_GRAY:
- if(bit_depth < 8) {
- png_set_expand_gray_1_2_4_to_8(png_ptr);
- bit_depth = 8;
- }
- break;
- }
- if(png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) {
- png_set_tRNS_to_alpha(png_ptr);
- }
- if(bit_depth == 16) {
- png_set_strip_16(png_ptr);
- }
- png_read_update_info(png_ptr, info_ptr);
- row_ptrs = (png_bytep*)malloc(sizeof(png_bytep) * height);
- ya2d_Texture* texture = ya2d_create_texture(width, height,
- GU_PSM_8888, place);
- int i;
- for (i = 0; i < height; ++i) {
- row_ptrs[i] = (png_bytep)(texture->data + i*texture->stride);
- }
- png_read_image(png_ptr, row_ptrs);
- png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)0);
- free(row_ptrs);
- sceIoClose(fd);
- return texture;
- exit_destroy_read:
- png_destroy_read_struct(&png_ptr, (png_infopp)0, (png_infopp)0);
- exit_close:
- sceIoClose(fd);
- exit_error:
- return NULL;
- }
- ya2d_Texture* ya2d_load_PNG_buffer(void *buffer, int place)
- {
- return NULL;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement