error checking for png
authornotaz <notasas@gmail.com>
Wed, 21 May 2008 19:05:55 +0000 (19:05 +0000)
committernotaz <notasas@gmail.com>
Wed, 21 May 2008 19:05:55 +0000 (19:05 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@451 be3aeb3a-fb24-0410-a615-afba39da0efa

platform/common/emu.c
platform/common/readpng.c
platform/common/readpng.h

index e88859b..0b8fdf7 100644 (file)
@@ -224,7 +224,7 @@ int emu_cdCheck(int *pregion)
        return type;\r
 }\r
 \r
-static int extract_text(char *dest, unsigned char *src, int len, int swab)\r
+static int extract_text(char *dest, const unsigned char *src, int len, int swab)\r
 {\r
        char *p = dest;\r
        int i;\r
index c93b36f..a437a52 100644 (file)
 #define BG_HEIGHT 240
 #endif
 
-void readpng(void *dest, const char *fname, readpng_what what)
+int readpng(void *dest, const char *fname, readpng_what what)
 {
        FILE *fp;
        png_structp png_ptr = NULL;
        png_infop info_ptr = NULL;
        png_bytepp row_ptr = NULL;
+       int ret = -1;
 
        if (dest == NULL || fname == NULL)
        {
-               return;
+               return -1;
        }
 
        fp = fopen(fname, "rb");
        if (fp == NULL)
        {
                lprintf(__FILE__ ": failed to open: %s\n", fname);
-               return;
+               return -1;
        }
 
        png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
@@ -36,7 +37,7 @@ void readpng(void *dest, const char *fname, readpng_what what)
        {
                lprintf(__FILE__ ": png_create_read_struct() failed\n");
                fclose(fp);
-               return;
+               return -1;
        }
 
        info_ptr = png_create_info_struct(png_ptr);
@@ -145,12 +146,41 @@ void readpng(void *dest, const char *fname, readpng_what what)
                        }
                        break;
                }
+
+               case READPNG_320_24:
+               case READPNG_480_24:
+               {
+                       int height, width, h;
+                       int needw = (what == READPNG_480_24) ? 480 : 320;
+                       unsigned char *dst = dest;
+                       if (info_ptr->pixel_depth != 24)
+                       {
+                               lprintf(__FILE__ ": image uses %ibpp, needed 24bpp\n", info_ptr->pixel_depth);
+                               break;
+                       }
+                       height = info_ptr->height;
+                       if (height > 240) height = 240;
+                       width = info_ptr->width;
+                       if (width > needw) width = needw;
+
+                       for (h = 0; h < height; h++)
+                       {
+                               int len = width;
+                               unsigned char *src = row_ptr[h];
+                               dst += (needw - width) * 3;
+                               for (len = width; len > 0; len--, dst+=3, src+=3)
+                                       dst[0] = src[2], dst[1] = src[1], dst[2] = src[0];
+                       }
+                       break;
+               }
        }
 
 
+       ret = 0;
 done:
        png_destroy_read_struct(&png_ptr, info_ptr ? &info_ptr : NULL, (png_infopp)NULL);
        fclose(fp);
+       return ret;
 }
 
 
index 542a774..7d74fee 100644 (file)
@@ -2,9 +2,18 @@ typedef enum
 {
        READPNG_BG = 1,
        READPNG_FONT,
-       READPNG_SELECTOR
+       READPNG_SELECTOR,
+       READPNG_320_24,
+       READPNG_480_24
 }
 readpng_what;
 
-void readpng(void *dest, const char *fname, readpng_what what);
+#ifdef __cplusplus
+extern "C" {
+#endif
 
+int readpng(void *dest, const char *fname, readpng_what what);
+
+#ifdef __cplusplus
+}
+#endif