forums.ps2dev.org Forum Index forums.ps2dev.org
Homebrew PS2, PSP & PS3 Development Discussions
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

[SOLVED]Problem with Bin2o

 
Post new topic   Reply to topic    forums.ps2dev.org Forum Index -> PSP Development
View previous topic :: View next topic  
Author Message
ne0h



Joined: 21 Feb 2008
Posts: 386

PostPosted: Sat Mar 15, 2008 2:58 am    Post subject: [SOLVED]Problem with Bin2o Reply with quote

I will load a image writted in the Eboot with Bin2o:
"Makefile":

logo.o: logo.png
bin2o -i logo.png logo.o logo

This is the function:

extern unsigned char logo_start[];
ourImage = loadImage(logo_start);


Function for loadImage:

Image* loadImage(const char* filename)
{
png_structp png_ptr;
png_infop info_ptr;
unsigned int sig_read = 0;
png_uint_32 width, height;
int bit_depth, color_type, interlace_type, x, y;
u32* line;
FILE *fp;
Image* image = (Image*) malloc(sizeof(Image));
if (!image) return NULL;

if ((fp = fopen(filename, "rb")) == NULL) return NULL;
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL) {
free(image);
fclose(fp);
return NULL;;
}
png_set_error_fn(png_ptr, (png_voidp) NULL, (png_error_ptr) NULL, user_warning_fn);
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL) {
free(image);
fclose(fp);
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
return NULL;
}
png_init_io(png_ptr, fp);
png_set_sig_bytes(png_ptr, sig_read);
png_read_info(png_ptr, info_ptr);
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, int_p_NULL, int_p_NULL);
if (width > 512 || height > 512) {
free(image);
fclose(fp);
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
return NULL;
}
image->imageWidth = width;
image->imageHeight = height;
image->textureWidth = getNextPower2(width);
image->textureHeight = getNextPower2(height);
png_set_strip_16(png_ptr);
png_set_packing(png_ptr);
if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png_ptr);
if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) png_set_gray_1_2_4_to_8(png_ptr);
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr);
png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
image->data = (Color*) memalign(16, image->textureWidth * image->textureHeight * sizeof(Color));
if (!image->data) {
free(image);
fclose(fp);
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
return NULL;
}
line = (u32*) malloc(width * 4);
if (!line) {
free(image->data);
free(image);
fclose(fp);
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
return NULL;
}
for (y = 0; y < height; y++) {
png_read_row(png_ptr, (u8*) line, png_bytep_NULL);
for (x = 0; x < width; x++) {
u32 color = line[x];
image->data[x + y * image->textureWidth] = color;
}
}
free(line);
png_read_end(png_ptr, info_ptr);
png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);
fclose(fp);
return image;
}


The compiler give me the error:

[Warning] pointer targets in passing argument 1 of 'loadImage' differ in signedness

and when the image will load, the PSP Crash!

Have someone a or another solution?


Last edited by ne0h on Mon Mar 17, 2008 3:19 am; edited 1 time in total
Back to top
View user's profile Send private message
CpuWhiz



Joined: 04 Jun 2007
Posts: 42

PostPosted: Sat Mar 15, 2008 3:37 am    Post subject: Reply with quote

loadImage() expects a filename instead of a pointer to the actual data. I have made a simple loadMemoryImage() for you based off the code from loadImage(). First add the following to graphics.c (I added it right above the loadImage() function):
Code:
typedef struct _memory_png
{
   char *file;
   png_size_t pos;
   png_size_t size;
}memory_png;

static void user_read_fn(png_structp png_ptr, png_bytep buffer, png_size_t size)
{
   memory_png *data = (memory_png*)png_ptr->io_ptr;
   if( data->size && (data->pos + size) > data->size )
   {
      png_error(png_ptr, "Error reading data from PNG file.");
      return;
   }

   memcpy(buffer, data->file + data->pos, size);
   data->pos += size;
};

Image* loadMemoryImage(const unsigned char* data, int size)
{
   memory_png file;
   png_structp png_ptr;
   png_infop info_ptr;
   unsigned int sig_read = 0;
   png_uint_32 width, height;
   int bit_depth, color_type, interlace_type, x, y;
   u32* line;
   Image* image = (Image*) malloc(sizeof(Image));
   if (!image) return NULL;

   file.file = (char*)data;
   file.pos = 0;
   file.size = size;

   png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
   if (png_ptr == NULL) {
      free(image);
      return NULL;;
   }
   png_set_error_fn(png_ptr, (png_voidp) NULL, (png_error_ptr) NULL, user_warning_fn);
   png_set_read_fn(png_ptr, (png_voidp)&file, user_read_fn);
   info_ptr = png_create_info_struct(png_ptr);
   if (info_ptr == NULL) {
      free(image);
      png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
      return NULL;
   }
   png_init_io(png_ptr, (FILE*)&file);
   png_set_sig_bytes(png_ptr, sig_read);
   png_read_info(png_ptr, info_ptr);
   png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, int_p_NULL, int_p_NULL);
   if (width > 512 || height > 512) {
      free(image);
      png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
      return NULL;
   }
   image->imageWidth = width;
   image->imageHeight = height;
   image->textureWidth = getNextPower2(width);
   image->textureHeight = getNextPower2(height);
   png_set_strip_16(png_ptr);
   png_set_packing(png_ptr);
   if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png_ptr);
   if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) png_set_gray_1_2_4_to_8(png_ptr);
   if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr);
   png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
   image->data = (Color*) memalign(16, image->textureWidth * image->textureHeight * sizeof(Color));
   if (!image->data) {
      free(image);
      png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
      return NULL;
   }
   line = (u32*) malloc(width * 4);
   if (!line) {
      free(image->data);
      free(image);
      png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
      return NULL;
   }
   for (y = 0; y < height; y++) {
      png_read_row(png_ptr, (u8*) line, png_bytep_NULL);
      for (x = 0; x < width; x++) {
         u32 color = line[x];
         image->data[x + y * image->textureWidth] =  color;
      }
   }
   free(line);
   png_read_end(png_ptr, info_ptr);
   png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);
   return image;
}


Now add the following line to grahpics.h:
Code:
extern Image* loadMemoryImage(const unsigned char* data, int size);


Finally, to use it (Don't forget to define logo_size as extern. You could use 0 for the size, but that's not very safe now is it):
Code:
ourImage = loadMemoryImage(logo_start, logo_size);
Back to top
View user's profile Send private message
ne0h



Joined: 21 Feb 2008
Posts: 386

PostPosted: Sat Mar 15, 2008 5:33 am    Post subject: Reply with quote

Tanks, tanks and tanks....
It work perfectly, also with size 0!
Excuse for my english, i'm italian!
Back to top
View user's profile Send private message
J.F.



Joined: 22 Feb 2004
Posts: 2906

PostPosted: Sat Mar 15, 2008 6:38 am    Post subject: Reply with quote

We get people from all over the world here, so language is not a problem. As long as you're programming, that's all that matters.

As to passing the size as 0, that's probably fine for what you're doing since you're embedding your own pngs into the program, so you KNOW they are good. It would be more of a problem if you were just using random pngs of unknown quality.
Back to top
View user's profile Send private message AIM Address
Display posts from previous:   
Post new topic   Reply to topic    forums.ps2dev.org Forum Index -> PSP Development All times are GMT + 10 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group