Load_Recoil_Image(): Read image in multiple files with RECOIL
add Recoil virtual readFile() method to allow loading of Companion files
This commit is contained in:
		
							parent
							
								
									44b1d5a466
								
							
						
					
					
						commit
						701dec6df3
					
				@ -27,8 +27,33 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "recoil.h"
 | 
					#include "recoil.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RECOIL Vtable with our private data added
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
						int (*readFile)(RECOIL *, const char *filename, unsigned char *content, int content_length);
 | 
				
			||||||
 | 
					  T_IO_Context *context;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					RECOILVtbl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int RECOIL_ReadFile(RECOIL * recoil, const char * filename, unsigned char * content, int content_length)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  FILE * f;
 | 
				
			||||||
 | 
					  const char * ext;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ext = strrchr(filename, '.');   // extract back extension from filename
 | 
				
			||||||
 | 
					  if (ext == NULL)
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  ext++;
 | 
				
			||||||
 | 
					  f = Open_file_read_with_alternate_ext((*((const RECOILVtbl **)recoil))->context, ext);
 | 
				
			||||||
 | 
					  if (f == NULL)
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  content_length = fread(content, 1, content_length, f);
 | 
				
			||||||
 | 
					  fclose(f);
 | 
				
			||||||
 | 
					  return content_length;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Load_Recoil_Image(T_IO_Context *context)
 | 
					void Load_Recoil_Image(T_IO_Context *context)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					  RECOILVtbl vtbl = { RECOIL_ReadFile, context };
 | 
				
			||||||
  RECOIL *recoil;
 | 
					  RECOIL *recoil;
 | 
				
			||||||
  byte * file_content;
 | 
					  byte * file_content;
 | 
				
			||||||
  unsigned long file_length;
 | 
					  unsigned long file_length;
 | 
				
			||||||
@ -68,6 +93,7 @@ void Load_Recoil_Image(T_IO_Context *context)
 | 
				
			|||||||
  recoil = RECOIL_New();
 | 
					  recoil = RECOIL_New();
 | 
				
			||||||
  if (recoil)
 | 
					  if (recoil)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
 | 
					    *(const RECOILVtbl **)recoil = &vtbl; // set Vtable
 | 
				
			||||||
    if (RECOIL_Decode(recoil, context->File_name, file_content, file_length))
 | 
					    if (RECOIL_Decode(recoil, context->File_name, file_content, file_length))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      int width, height;
 | 
					      int width, height;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user