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 

libpng png_set_read_fn troubles

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



Joined: 23 Feb 2005
Posts: 15
Location: Las Vegas

PostPosted: Sat Feb 04, 2006 7:29 am    Post subject: libpng png_set_read_fn troubles Reply with quote

I am attempting to modify libpng and Lua's graphics.cpp file to allow the useage of extracting an image from a rar file directly into libpng without ever writing anything to the memory stick.

Code:
Image* loadPngImage(const char* filename, const char* rarfile)
{
        png_structp png_ptr;
        png_infop info_ptr;
        unsigned int sig_read = 0;
        png_uint_32 width, height, x, y;
        int bit_depth, color_type, interlace_type;
        u32* line;
        FILE *fp;
   hardrarfile = (char*)rarfile;
        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_read_fn(png_ptr, NULL, user_read_data_fn);
        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 actual function to do so is indented further.

So, as follows, this is my custom function to read the data from the rar file and right back into libpng.

Code:
char *hardrarfile;
png_structp last_ptr;
char *data_ptr;

void user_read_data_fn(png_structp png_ptr, png_bytep data, png_size_t length) {

   unsigned long data_size;

   if (last_ptr != png_ptr->io_ptr) {
      
      free(data_ptr);
      urarlib_get(&data_ptr, &data_size, hardrarfile, (png_FILE_p)png_ptr->io_ptr, "MaySeptember8891");
      last_ptr = (png_struct*)png_ptr->io_ptr;
      pspDebugScreenPrintf("^ READ RAR SUCESS\n");

   } else { pspDebugScreenPrintf("^ SKIPPING READ RAR DUE TO PREVIOUS ACCESS\n"); }


   strncpy((char*)data, (const char*)data_ptr, (int)length);

   pspDebugScreenPrintf("^ STRCOPY TO PNG DATA SUCESS\n");
   
}


Basically urarlib_get grabs the file (hardrarfile) and places it into data_ptr. Works fine, extracts it like it is supposed to.

It prints out as such:

^ READ RAR SUCESS
^ STRCOPY TO PNG DATA SUCESS
^ SKIPPING READ RAR DUE TO PREVIOUS ACCESS
^ STRCOPY TO PNG DATA SUCESS

However, in my main.cpp file it does not continue after I attempt to load the PNG. It doesn't freeze, it just stops, and doesn't display the image.

Code:
   pspDebugScreenInit();
   SetupCallbacks();

   initGraphics();

   Image* testimage;

   printf("^ CALLING LOADPNG\n");

   testimage = loadPngImage("data.rar", "rro.png");

   printf("^ LOADPNG SUCESS\n^ CALLING BLIT TO SCREEN\n");

   blitAlphaImageToScreen(0, 0, 480, 272, testimage, 0, 0);

   flipScreen();


Again, it never displays ^ LOADPNG SUCESS or anything past that.


Hopefully this is enough information so in turn you can help me out. Anyone have any ideas? Thanks.
_________________
Wil
Back to top
View user's profile Send private message Visit poster's website AIM Address Yahoo Messenger MSN Messenger
Wil



Joined: 23 Feb 2005
Posts: 15
Location: Las Vegas

PostPosted: Sat Feb 04, 2006 1:37 pm    Post subject: Reply with quote

Heh, got it working!

Incase someone was wondering HOW -- I realized that since fread wasn't being rewound that it's likely I need to add an offset option so that it will read from it's last position. It worked further but still had a problem so what I ended up doing was using png_memcpy instead of strncopy.

Thanks for all who... looked ;)
_________________
Wil
Back to top
View user's profile Send private message Visit poster's website AIM Address Yahoo Messenger MSN Messenger
patpsp



Joined: 25 Oct 2005
Posts: 31

PostPosted: Sat Feb 04, 2006 6:54 pm    Post subject: Reply with quote

Please post your corrected code, so that it could be a sample for people searching this functionality.

thanks
Back to top
View user's profile Send private message
daurnimator



Joined: 11 Dec 2005
Posts: 38
Location: melbourne, australia

PostPosted: Sun Feb 19, 2006 1:20 pm    Post subject: Reply with quote

I'm SO DAMN SICK OF THIS FORUM AND THE SEARCH TOOL

its all you care about - stuff the searches, let people ask their own questions.

I've seen SO many good threads destroyed by being told to use the search function - where they had a unique case.

I'm sure many people have permanently left psp programming by this attitude.
Back to top
View user's profile Send private message MSN Messenger
patpsp



Joined: 25 Oct 2005
Posts: 31

PostPosted: Sun Feb 19, 2006 9:35 pm    Post subject: Reply with quote

If you say this because of my post, please read again what I wrote :

I asked him to give his corrected code, so that it could be a sample.
I never asked him to use search function.

Please read !!!!!
Back to top
View user's profile Send private message
daurnimator



Joined: 11 Dec 2005
Posts: 38
Location: melbourne, australia

PostPosted: Sun Feb 26, 2006 12:26 am    Post subject: Reply with quote

i know, but this is the attitude still, by getting him to post his code, you are fostering the use of the search tool.
Back to top
View user's profile Send private message MSN Messenger
Raphael



Joined: 17 Jan 2006
Posts: 646
Location: Germany

PostPosted: Sun Feb 26, 2006 12:33 am    Post subject: Reply with quote

Yet the search function exists and is a great help for someone searching for a solution to some obviously already answered questions. The whole forum is meaningless if noone ever writes down his findings and good codes, so others can learn from it by either searching for it directly, or being forwarded to the answer in their own thread.

Actually I haven't found that huge of an "RTFM"/"UTFS" attitude in this forums yet, so I don't see the problem.

So stop the arguing.
Back to top
View user's profile Send private message Visit poster's website
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