3232#include <stdlib.h>
3333#include "tic_assert.h"
3434#include "tools.h"
35+ #include "ext/png.h"
3536
3637typedef enum
3738{
@@ -81,6 +82,42 @@ static s32 chunkSize(const Chunk* chunk)
8182 return chunk -> size == 0 && (chunk -> type == CHUNK_CODE || chunk -> type == CHUNK_BINARY ) ? TIC_BANK_SIZE : retro_le_to_cpu16 (chunk -> size );
8283}
8384
85+ static png_buffer getRawCartFromPng (png_buffer buffer )
86+ {
87+ png_buffer zip = png_decode (buffer );
88+
89+ if (zip .size )
90+ {
91+ png_buffer buf = png_create (sizeof (tic_cartridge ));
92+
93+ buf .size = tic_tool_unzip (buf .data , buf .size , zip .data , zip .size );
94+ free (zip .data );
95+
96+ if (buf .size )
97+ return buf ;
98+
99+ free (buf .data );
100+ }
101+
102+ return (png_buffer ){.data = NULL , .size = 0 };
103+ }
104+
105+ tic_cartridge * loadPngCart (png_buffer buffer )
106+ {
107+ png_buffer buf = getRawCartFromPng (buffer );
108+
109+ if (buf .data )
110+ {
111+ tic_cartridge * cart = malloc (sizeof (tic_cartridge ));
112+ tic_cart_load (cart , buf .data , buf .size );
113+ free (buf .data );
114+
115+ return cart ;
116+ }
117+
118+ return NULL ;
119+ }
120+
84121void tic_cart_load (tic_cartridge * cart , const u8 * buffer , s32 size )
85122{
86123 memset (cart , 0 , sizeof (tic_cartridge ));
@@ -90,27 +127,16 @@ void tic_cart_load(tic_cartridge* cart, const u8* buffer, s32 size)
90127 // check if this cartridge is in PNG format
91128 if (!memcmp (buffer , "\x89PNG" , 4 ))
92129 {
93- s32 siz ;
94- const u8 * ptr = buffer + 8 ;
95- // iterate on chunks until we find a cartridge
96- while (ptr < end )
130+ png_buffer buf = getRawCartFromPng ((png_buffer ){.data = (u8 * )buffer , .size = size });
131+
132+ if (buf .data )
97133 {
98- siz = ((ptr [0 ] << 24 ) | (ptr [1 ] << 16 ) | (ptr [2 ] << 8 ) | ptr [3 ]);
99- if (!memcmp (ptr + 4 , "caRt" , 4 ) && siz > 0 )
100- {
101- chunk_cart = malloc (sizeof (tic_cartridge ));
102- if (chunk_cart )
103- {
104- size = tic_tool_unzip (chunk_cart , sizeof (tic_cartridge ), ptr + 8 , siz );
105- buffer = chunk_cart ;
106- end = buffer + size ;
107- }
108- break ;
109- }
110- ptr += siz + 12 ;
134+ chunk_cart = buf .data ;
135+ buffer = buf .data ;
136+ size = buf .size ;
137+ end = buffer + size ;
111138 }
112- // error, no TIC-80 cartridge chunk in PNG???
113- if (!chunk_cart )
139+ else
114140 return ;
115141 }
116142
0 commit comments