Fix Endian dependent code when compiled without SDL or SDL2
Signed-off-by: Thomas Bernard <miniupnp@free.fr>
This commit is contained in:
		
							parent
							
								
									d7abcb36c9
								
							
						
					
					
						commit
						c53b86d6c9
					
				@ -61,6 +61,16 @@
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(WIN32) && !defined(USE_SDL) && !defined(USE_SDL2)
 | 
			
		||||
#if defined(__macosx__)
 | 
			
		||||
#include <machine/endian.h>
 | 
			
		||||
#elif defined(__FreeBSD__)
 | 
			
		||||
#include <sys/endian.h>
 | 
			
		||||
#else
 | 
			
		||||
#include <endian.h>
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "errors.h"
 | 
			
		||||
#include "global.h"
 | 
			
		||||
#include "loadsave.h"
 | 
			
		||||
@ -1798,10 +1808,17 @@ void Load_IFF(T_IO_Context * context)
 | 
			
		||||
            PCHG_palettes = prev_pal;
 | 
			
		||||
 | 
			
		||||
            lineBitMask = (dword *)PCHGData;
 | 
			
		||||
            #if SDL_BYTEORDER != SDL_BIG_ENDIAN
 | 
			
		||||
#if defined(SDL_BYTEORDER) && (SDL_BYTEORDER != SDL_BIG_ENDIAN)
 | 
			
		||||
            for (i = 0 ; i < ((LineCount + 31) >> 5); i++)
 | 
			
		||||
              lineBitMask[i] = SDL_Swap32(lineBitMask[i]);
 | 
			
		||||
            #endif
 | 
			
		||||
#elif defined(BYTE_ORDER) && (BYTE_ORDER != BIG_ENDIAN)
 | 
			
		||||
            for (i = 0 ; i < ((LineCount + 31) >> 5); i++)
 | 
			
		||||
              lineBitMask[i] = be32toh(lineBitMask[i]);
 | 
			
		||||
#elif defined(WIN32)
 | 
			
		||||
            // assume WIN32 is little endian
 | 
			
		||||
            for (i = 0 ; i < ((LineCount + 31) >> 5); i++)
 | 
			
		||||
              lineBitMask[i] = __builtin_bswap32(lineBitMask[i]);
 | 
			
		||||
#endif
 | 
			
		||||
            data = (const byte *)PCHGData + ((LineCount + 31) >> 5) * 4;
 | 
			
		||||
            for (y_pos = 0 ; y_pos < LineCount; y_pos++)
 | 
			
		||||
            {
 | 
			
		||||
@ -3068,21 +3085,25 @@ static void Load_BMP_Pixels(T_IO_Context * context, FILE * file, unsigned int co
 | 
			
		||||
                break;
 | 
			
		||||
              case 32:
 | 
			
		||||
                {
 | 
			
		||||
                #if SDL_BYTEORDER != SDL_LIL_ENDIAN
 | 
			
		||||
#if defined(SDL_BYTEORDER) && (SDL_BYTEORDER != SDL_LIL_ENDIAN)
 | 
			
		||||
                  dword pixel = SDL_Swap32(((dword *)buffer)[x_pos]);
 | 
			
		||||
                #else
 | 
			
		||||
#elif defined(BYTEORDER)
 | 
			
		||||
                  dword pixel = le32toh(((dword *)buffer)[x_pos]);
 | 
			
		||||
#else // default to little endian
 | 
			
		||||
                  dword pixel = ((dword *)buffer)[x_pos];
 | 
			
		||||
                #endif
 | 
			
		||||
#endif
 | 
			
		||||
                  Set_pixel_24b(context, x_pos,target_y,Bitmap_mask(pixel,mask[0]),Bitmap_mask(pixel,mask[1]),Bitmap_mask(pixel,mask[2]));
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
              case 16:
 | 
			
		||||
                {
 | 
			
		||||
                #if SDL_BYTEORDER != SDL_LIL_ENDIAN
 | 
			
		||||
#if defined(SDL_BYTEORDER) && (SDL_BYTEORDER != SDL_LIL_ENDIAN)
 | 
			
		||||
                  word pixel = SDL_Swap16(((word *)buffer)[x_pos]);
 | 
			
		||||
                #else
 | 
			
		||||
#elif defined(BYTEORDER)
 | 
			
		||||
                  word pixel = le16toh(((word *)buffer)[x_pos]);
 | 
			
		||||
#else // default to little endian
 | 
			
		||||
                  word pixel = ((word *)buffer)[x_pos];
 | 
			
		||||
                #endif
 | 
			
		||||
#endif
 | 
			
		||||
                  Set_pixel_24b(context, x_pos,target_y,Bitmap_mask(pixel,mask[0]),Bitmap_mask(pixel,mask[1]),Bitmap_mask(pixel,mask[2]));
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										12
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								src/main.c
									
									
									
									
									
								
							@ -59,6 +59,16 @@
 | 
			
		||||
    #include <sys/param.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(WIN32)
 | 
			
		||||
#if defined(__macosx__)
 | 
			
		||||
#include <machine/endian.h>
 | 
			
		||||
#elif defined(__FreeBSD__)
 | 
			
		||||
#include <sys/endian.h>
 | 
			
		||||
#else
 | 
			
		||||
#include <endian.h>
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "const.h"
 | 
			
		||||
#include "struct.h"
 | 
			
		||||
#include "global.h"
 | 
			
		||||
@ -557,7 +567,7 @@ int Init_program(int argc,char * argv[])
 | 
			
		||||
  // iconv is used to convert filenames
 | 
			
		||||
  cd = iconv_open(TOCODE, FROMCODE);  // From UTF8 to ANSI
 | 
			
		||||
  cd_inv = iconv_open(FROMCODE, TOCODE);  // From ANSI to UTF8
 | 
			
		||||
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
 | 
			
		||||
#if (defined(SDL_BYTEORDER) && (SDL_BYTEORDER == SDL_BIG_ENDIAN)) || (defined(BYTE_ORDER) && (BYTE_ORDER == BIG_ENDIAN))
 | 
			
		||||
  cd_utf16 = iconv_open("UTF-16BE", FROMCODE); // From UTF8 to UTF16
 | 
			
		||||
  cd_utf16_inv = iconv_open(FROMCODE, "UTF-16BE"); // From UTF16 to UTF8
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
@ -125,7 +125,7 @@ static int skip_padding(FILE *file, int max_chars)
 | 
			
		||||
      return chars_read;
 | 
			
		||||
    chars_read++;
 | 
			
		||||
  } while (b == ' ');
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  fseek(file, -1, SEEK_CUR);
 | 
			
		||||
  return chars_read;
 | 
			
		||||
}
 | 
			
		||||
@ -218,7 +218,7 @@ Save_GPL (T_IO_Context * context)
 | 
			
		||||
    fprintf (file, "GIMP Palette\n");
 | 
			
		||||
    fprintf (file, "Name: %s\n", context->File_name);
 | 
			
		||||
    // TODO: use actual columns value
 | 
			
		||||
    fprintf (file, "Columns: %d\n#\n", 16); 
 | 
			
		||||
    fprintf (file, "Columns: %d\n#\n", 16);
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < 256 && File_error==0; i++)
 | 
			
		||||
    {
 | 
			
		||||
@ -227,7 +227,7 @@ Save_GPL (T_IO_Context * context)
 | 
			
		||||
        File_error=1;
 | 
			
		||||
    }
 | 
			
		||||
    fclose(file);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    if (File_error)
 | 
			
		||||
      Remove_file(context);
 | 
			
		||||
  }
 | 
			
		||||
@ -278,7 +278,7 @@ void Load_PAL(T_IO_Context * context)
 | 
			
		||||
      {
 | 
			
		||||
        int i, n, r, g, b;
 | 
			
		||||
        fscanf(file, "%d",&n);
 | 
			
		||||
        if(n != 100) 
 | 
			
		||||
        if(n != 100)
 | 
			
		||||
        {
 | 
			
		||||
          File_error = 2;
 | 
			
		||||
          fclose(file);
 | 
			
		||||
@ -321,7 +321,7 @@ void Load_PAL(T_IO_Context * context)
 | 
			
		||||
      } else
 | 
			
		||||
        File_error = 2;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    fclose(file);
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
@ -342,9 +342,9 @@ void Save_PAL(T_IO_Context * context)
 | 
			
		||||
  if ((file=Open_file_write(context)) != NULL)
 | 
			
		||||
  {
 | 
			
		||||
    int i;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    setvbuf(file, NULL, _IOFBF, 64*1024);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    if (fputs("JASC-PAL\r\n0100\r\n256\r\n", file)==EOF)
 | 
			
		||||
      File_error=1;
 | 
			
		||||
    for (i = 0; i < 256 && File_error==0; i++)
 | 
			
		||||
@ -352,9 +352,9 @@ void Save_PAL(T_IO_Context * context)
 | 
			
		||||
      if (fprintf(file,"%d %d %d\r\n",context->Palette[i].R, context->Palette[i].G, context->Palette[i].B) <= 0)
 | 
			
		||||
        File_error=1;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    fclose(file);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    if (File_error)
 | 
			
		||||
      Remove_file(context);
 | 
			
		||||
  }
 | 
			
		||||
@ -425,7 +425,7 @@ void Load_PKM(T_IO_Context * context)
 | 
			
		||||
  long  file_size;
 | 
			
		||||
 | 
			
		||||
  File_error=0;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  if ((file=Open_file_read(context)))
 | 
			
		||||
  {
 | 
			
		||||
    file_size=File_length_file(file);
 | 
			
		||||
@ -535,7 +535,7 @@ void Load_PKM(T_IO_Context * context)
 | 
			
		||||
        Pre_load(context, header.Width,header.Height,file_size,FORMAT_PKM,PIXEL_SIMPLE,0);
 | 
			
		||||
        if (File_error==0)
 | 
			
		||||
        {
 | 
			
		||||
          
 | 
			
		||||
 | 
			
		||||
          context->Width=header.Width;
 | 
			
		||||
          context->Height=header.Height;
 | 
			
		||||
          image_size=(dword)(context->Width*context->Height);
 | 
			
		||||
@ -551,7 +551,7 @@ void Load_PKM(T_IO_Context * context)
 | 
			
		||||
          // Boucle de décompression:
 | 
			
		||||
          while ( (Compteur_de_pixels<image_size) && (Compteur_de_donnees_packees<Taille_pack) && (!File_error) )
 | 
			
		||||
          {
 | 
			
		||||
            if(Read_byte(file, &temp_byte)!=1) 
 | 
			
		||||
            if(Read_byte(file, &temp_byte)!=1)
 | 
			
		||||
            {
 | 
			
		||||
              File_error=2;
 | 
			
		||||
              break;
 | 
			
		||||
@ -694,7 +694,7 @@ void Save_PKM(T_IO_Context * context)
 | 
			
		||||
  if ((file=Open_file_write(context)))
 | 
			
		||||
  {
 | 
			
		||||
    setvbuf(file, NULL, _IOFBF, 64*1024);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Ecriture du header
 | 
			
		||||
    if (Write_bytes(file,&header.Ident,3) &&
 | 
			
		||||
        Write_byte(file,header.Method) &&
 | 
			
		||||
@ -849,13 +849,13 @@ void Test_CEL(T_IO_Context * context, FILE * file)
 | 
			
		||||
  {
 | 
			
		||||
      //   Vu que ce header n'a pas de signature, il va falloir tester la
 | 
			
		||||
      // cohérence de la dimension de l'image avec celle du fichier.
 | 
			
		||||
      
 | 
			
		||||
 | 
			
		||||
      size=file_size-4;
 | 
			
		||||
      if ( (!size) || ( (((header1.Width+1)>>1)*header1.Height)!=size ) )
 | 
			
		||||
      {
 | 
			
		||||
        // Tentative de reconnaissance de la signature des nouveaux fichiers
 | 
			
		||||
 | 
			
		||||
        fseek(file,0,SEEK_SET);        
 | 
			
		||||
        fseek(file,0,SEEK_SET);
 | 
			
		||||
        if (Read_bytes(file,&header2.Signature,4) &&
 | 
			
		||||
            !memcmp(header2.Signature,"KiSS",4) &&
 | 
			
		||||
            Read_byte(file,&header2.Kind) &&
 | 
			
		||||
@ -1030,7 +1030,7 @@ void Save_CEL(T_IO_Context * context)
 | 
			
		||||
  if ((file=Open_file_write(context)))
 | 
			
		||||
  {
 | 
			
		||||
    setvbuf(file, NULL, _IOFBF, 64*1024);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // On regarde si des couleurs >16 sont utilisées dans l'image
 | 
			
		||||
    for (x_pos=16;((x_pos<256) && (!color_usage[x_pos]));x_pos++);
 | 
			
		||||
 | 
			
		||||
@ -1463,10 +1463,9 @@ void PI1_16p_to_8b(byte * src,byte * dest)
 | 
			
		||||
 | 
			
		||||
//// DECODAGE de la PALETTE ////
 | 
			
		||||
 | 
			
		||||
void PI1_decode_palette(byte * src,byte * palette)
 | 
			
		||||
static void PI1_decode_palette(const byte * src, T_Components * palette)
 | 
			
		||||
{
 | 
			
		||||
  int i;  // Numéro de la couleur traitée
 | 
			
		||||
  int ip; // index dans la palette
 | 
			
		||||
  word w; // Word contenant le code
 | 
			
		||||
 | 
			
		||||
  // Schéma d'un word =
 | 
			
		||||
@ -1474,37 +1473,23 @@ void PI1_decode_palette(byte * src,byte * palette)
 | 
			
		||||
  //    Low        High
 | 
			
		||||
  // VVVV RRRR | 0000 BBBB
 | 
			
		||||
  // 0321 0321 |      0321
 | 
			
		||||
  
 | 
			
		||||
  ip=0;
 | 
			
		||||
 | 
			
		||||
  for (i=0;i<16;i++)
 | 
			
		||||
  {
 | 
			
		||||
    #if SDL_BYTEORDER == SDL_LIL_ENDIAN 
 | 
			
		||||
   
 | 
			
		||||
      w=(((word)src[(i*2)+1]<<8) | (src[(i*2)+0]));
 | 
			
		||||
    
 | 
			
		||||
      // Traitement des couleurs rouge, verte et bleue:
 | 
			
		||||
      palette[ip++]=(((w & 0x0007) <<  1) | ((w & 0x0008) >>  3)) << 4;
 | 
			
		||||
      palette[ip++]=(((w & 0x7000) >> 11) | ((w & 0x8000) >> 15)) << 4;
 | 
			
		||||
      palette[ip++]=(((w & 0x0700) >>  7) | ((w & 0x0800) >> 11)) << 4;
 | 
			
		||||
   
 | 
			
		||||
    #else
 | 
			
		||||
      w=(((word)src[(i*2+1)])|(((word)src[(i*2)])<<8));
 | 
			
		||||
    
 | 
			
		||||
      palette[ip++] = (((w & 0x0700)>>7) | ((w & 0x0800) >> 7))<<4 ;
 | 
			
		||||
      palette[ip++]=(((w & 0x0070)>>3) | ((w & 0x0080) >> 3))<<4 ;
 | 
			
		||||
      palette[ip++] = (((w & 0x0007)<<1) | ((w & 0x0008)))<<4 ;
 | 
			
		||||
    #endif
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
  } 
 | 
			
		||||
    w = (word)src[0] << 8 | (word)src[1];
 | 
			
		||||
    src += 2;
 | 
			
		||||
 | 
			
		||||
    palette[i].R = (((w & 0x0700)>>7) | ((w & 0x0800) >> 11)) * 0x11 ;
 | 
			
		||||
    palette[i].G = (((w & 0x0070)>>3) | ((w & 0x0080) >> 7)) * 0x11 ;
 | 
			
		||||
    palette[i].B = (((w & 0x0007)<<1) | ((w & 0x0008) >> 3)) * 0x11 ;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//// CODAGE de la PALETTE ////
 | 
			
		||||
 | 
			
		||||
void PI1_code_palette(byte * palette,byte * dest)
 | 
			
		||||
void PI1_code_palette(const T_Components * palette, byte * dest)
 | 
			
		||||
{
 | 
			
		||||
  int i;  // Numéro de la couleur traitée
 | 
			
		||||
  int ip; // index dans la palette
 | 
			
		||||
  word w; // Word contenant le code
 | 
			
		||||
 | 
			
		||||
  // Schéma d'un word =
 | 
			
		||||
@ -1512,48 +1497,35 @@ void PI1_code_palette(byte * palette,byte * dest)
 | 
			
		||||
  // Low        High
 | 
			
		||||
  // VVVV RRRR | 0000 BBBB
 | 
			
		||||
  // 0321 0321 |      0321
 | 
			
		||||
    
 | 
			
		||||
  ip=0;
 | 
			
		||||
 | 
			
		||||
  for (i=0;i<16;i++)
 | 
			
		||||
  {
 | 
			
		||||
    #if SDL_BYTEORDER == SDL_LIL_ENDIAN
 | 
			
		||||
   
 | 
			
		||||
    // Traitement des couleurs rouge, verte et bleue:
 | 
			
		||||
    w =(((word)(palette[ip]>>2) & 0x38) >> 3) | (((word)(palette[ip]>>2) & 0x04) <<  1); ip++;
 | 
			
		||||
    w|=(((word)(palette[ip]>>2) & 0x38) << 9) | (((word)(palette[ip]>>2) & 0x04) << 13); ip++;
 | 
			
		||||
    w|=(((word)(palette[ip]>>2) & 0x38) << 5) | (((word)(palette[ip]>>2) & 0x04) <<  9); ip++;
 | 
			
		||||
    
 | 
			
		||||
    dest[(i*2)+0]=w & 0x00FF;
 | 
			
		||||
    dest[(i*2)+1]=(w>>8);
 | 
			
		||||
    #else
 | 
			
		||||
   
 | 
			
		||||
     w=(((word)(palette[ip]<<3))&0x0700);ip++;
 | 
			
		||||
     w|=(((word)(palette[ip]>>1))&0x0070);ip++;
 | 
			
		||||
     w|=(((word)(palette[ip]>>5))&0x0007);ip++;
 | 
			
		||||
 
 | 
			
		||||
    dest[(i*2)+1]=w & 0x00FF;
 | 
			
		||||
    dest[(i*2)+0]=(w>>8);
 | 
			
		||||
    #endif
 | 
			
		||||
    w  = ((word)(palette[i].R & 0xe0) << 3) | ((word)(palette[i].R & 0x10) << 7);
 | 
			
		||||
    w |= ((word)(palette[i].G & 0xe0) >> 1) | ((word)(palette[i].G & 0x10) << 3);
 | 
			
		||||
    w |= ((word)(palette[i].B & 0xe0) >> 5) | ((word)(palette[i].B & 0x10) >> 1);
 | 
			
		||||
 | 
			
		||||
    *dest++ = (w >> 8);
 | 
			
		||||
    *dest++ = (w & 0xff);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Load color ranges from a PI1 or PC1 image (Degas Elite format)
 | 
			
		||||
void PI1_load_ranges(T_IO_Context * context, const byte * buffer, int size)
 | 
			
		||||
{  
 | 
			
		||||
{
 | 
			
		||||
  int range;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  if (buffer==NULL || size<32)
 | 
			
		||||
    return;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
  for (range=0; range < 4; range ++)
 | 
			
		||||
  {
 | 
			
		||||
    word min_col, max_col, direction, delay;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    min_col   = (buffer[size - 32 + range*2 +  0] << 8) | buffer[size - 32 + range*2 +  1];
 | 
			
		||||
    max_col   = (buffer[size - 32 + range*2 +  8] << 8) | buffer[size - 32 + range*2 +  9];
 | 
			
		||||
    direction = (buffer[size - 32 + range*2 + 16] << 8) | buffer[size - 32 + range*2 + 17];
 | 
			
		||||
    delay     = (buffer[size - 32 + range*2 + 24] << 8) | buffer[size - 32 + range*2 + 25];
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
    if (max_col < min_col)
 | 
			
		||||
      SWAP_WORDS(min_col,max_col)
 | 
			
		||||
    // Sanity checks
 | 
			
		||||
@ -1581,7 +1553,7 @@ void PI1_save_ranges(T_IO_Context * context, byte * buffer, int size)
 | 
			
		||||
  {
 | 
			
		||||
    int i; // index in context->Cycle_range[] : < context->Color_cycles
 | 
			
		||||
    int saved_range; // index in resulting buffer : < 4
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    for (i=0, saved_range=0; i<context->Color_cycles && saved_range<4; i++)
 | 
			
		||||
    {
 | 
			
		||||
      if (context->Cycle_range[i].Start < 16 && context->Cycle_range[i].End < 16)
 | 
			
		||||
@ -1591,15 +1563,15 @@ void PI1_save_ranges(T_IO_Context * context, byte * buffer, int size)
 | 
			
		||||
          speed = 0;
 | 
			
		||||
        else if (context->Cycle_range[i].Speed == 1)
 | 
			
		||||
          // has to "round" manually to closest valid number for this format
 | 
			
		||||
          speed = 1;          
 | 
			
		||||
          speed = 1;
 | 
			
		||||
        else
 | 
			
		||||
          speed = 128 - 210 / context->Cycle_range[i].Speed;
 | 
			
		||||
          
 | 
			
		||||
 | 
			
		||||
        buffer[size - 32 + saved_range*2 +  1] = context->Cycle_range[i].Start;
 | 
			
		||||
        buffer[size - 32 + saved_range*2 +  9] = context->Cycle_range[i].End;
 | 
			
		||||
        buffer[size - 32 + saved_range*2 + 17] = (context->Cycle_range[i].Speed == 0) ? 1 : (context->Cycle_range[i].Inverse ? 0 : 2);
 | 
			
		||||
        buffer[size - 32 + saved_range*2 + 25] = speed;
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        saved_range ++;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
@ -1654,7 +1626,7 @@ void Load_PI1(T_IO_Context * context)
 | 
			
		||||
          // Initialisation de la palette
 | 
			
		||||
          if (Config.Clear_palette)
 | 
			
		||||
            memset(context->Palette,0,sizeof(T_Palette));
 | 
			
		||||
          PI1_decode_palette(buffer+2,(byte *)context->Palette);
 | 
			
		||||
          PI1_decode_palette(buffer+2, context->Palette);
 | 
			
		||||
 | 
			
		||||
          // Chargement/décompression de l'image
 | 
			
		||||
          ptr=buffer+34;
 | 
			
		||||
@ -1699,14 +1671,14 @@ void Save_PI1(T_IO_Context * context)
 | 
			
		||||
  if ((file=Open_file_write(context)))
 | 
			
		||||
  {
 | 
			
		||||
    setvbuf(file, NULL, _IOFBF, 64*1024);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // allocation d'un buffer mémoire
 | 
			
		||||
    buffer=(byte *)malloc(32034);
 | 
			
		||||
    // Codage de la résolution
 | 
			
		||||
    buffer[0]=0x00;
 | 
			
		||||
    buffer[1]=0x00;
 | 
			
		||||
    // Codage de la palette
 | 
			
		||||
    PI1_code_palette((byte *)context->Palette,buffer+2);
 | 
			
		||||
    PI1_code_palette(context->Palette, buffer+2);
 | 
			
		||||
    // Codage de l'image
 | 
			
		||||
    ptr=buffer+34;
 | 
			
		||||
    for (y_pos=0;y_pos<200;y_pos++)
 | 
			
		||||
@ -1803,7 +1775,7 @@ void PC1_compress_packbits(byte * src,byte * dest,int source_size,int * dest_siz
 | 
			
		||||
    {
 | 
			
		||||
      // On recherche le 1er endroit où il y a répétition d'au moins 3 valeurs
 | 
			
		||||
      // identiques
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
      repet=0;
 | 
			
		||||
      for (ir=is;ir<40-2;ir++)
 | 
			
		||||
      {
 | 
			
		||||
@ -1813,7 +1785,7 @@ void PC1_compress_packbits(byte * src,byte * dest,int source_size,int * dest_siz
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
      // On code la partie sans répétitions
 | 
			
		||||
      if (!repet || ir!=is)
 | 
			
		||||
      {
 | 
			
		||||
@ -1822,7 +1794,7 @@ void PC1_compress_packbits(byte * src,byte * dest,int source_size,int * dest_siz
 | 
			
		||||
        for (;n>0;n--)
 | 
			
		||||
          dest[id++]=src[is++];
 | 
			
		||||
      }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
      // On code la partie sans répétitions
 | 
			
		||||
      if (repet)
 | 
			
		||||
      {
 | 
			
		||||
@ -1967,7 +1939,7 @@ void Load_PC1(T_IO_Context * context)
 | 
			
		||||
          // Initialisation de la palette
 | 
			
		||||
          if (Config.Clear_palette)
 | 
			
		||||
            memset(context->Palette,0,sizeof(T_Palette));
 | 
			
		||||
          PI1_decode_palette(buffercomp+2,(byte *)context->Palette);
 | 
			
		||||
          PI1_decode_palette(buffercomp+2, context->Palette);
 | 
			
		||||
 | 
			
		||||
          // Décompression du buffer
 | 
			
		||||
          PC1_uncompress_packbits(buffercomp+34,bufferdecomp);
 | 
			
		||||
@ -2025,7 +1997,7 @@ void Save_PC1(T_IO_Context * context)
 | 
			
		||||
  if ((file=Open_file_write(context)))
 | 
			
		||||
  {
 | 
			
		||||
    setvbuf(file, NULL, _IOFBF, 64*1024);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Allocation des buffers mémoire
 | 
			
		||||
    bufferdecomp=(byte *)malloc(32000);
 | 
			
		||||
    buffercomp  =(byte *)malloc(64066);
 | 
			
		||||
@ -2033,7 +2005,7 @@ void Save_PC1(T_IO_Context * context)
 | 
			
		||||
    buffercomp[0]=0x80;
 | 
			
		||||
    buffercomp[1]=0x00;
 | 
			
		||||
    // Codage de la palette
 | 
			
		||||
    PI1_code_palette((byte *)context->Palette,buffercomp+2);
 | 
			
		||||
    PI1_code_palette(context->Palette, buffercomp+2);
 | 
			
		||||
    // Codage de l'image
 | 
			
		||||
    ptr=bufferdecomp;
 | 
			
		||||
    for (y_pos=0;y_pos<200;y_pos++)
 | 
			
		||||
@ -2056,7 +2028,7 @@ void Save_PC1(T_IO_Context * context)
 | 
			
		||||
    size += 34;
 | 
			
		||||
    size += 32;
 | 
			
		||||
    PI1_save_ranges(context, buffercomp,size);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    if (Write_bytes(file,buffercomp,size))
 | 
			
		||||
    {
 | 
			
		||||
      fclose(file);
 | 
			
		||||
@ -2137,7 +2109,7 @@ void Load_NEO(T_IO_Context * context)
 | 
			
		||||
          if (Config.Clear_palette)
 | 
			
		||||
            memset(context->Palette,0,sizeof(T_Palette));
 | 
			
		||||
          // on saute la résolution et le flag, chacun 2 bits
 | 
			
		||||
          PI1_decode_palette(buffer+4,(byte *)context->Palette);
 | 
			
		||||
          PI1_decode_palette(buffer+4, context->Palette);
 | 
			
		||||
 | 
			
		||||
          // Chargement/décompression de l'image
 | 
			
		||||
          ptr=buffer+128;
 | 
			
		||||
@ -2179,7 +2151,7 @@ void Save_NEO(T_IO_Context * context)
 | 
			
		||||
  if ((file=Open_file_write(context)))
 | 
			
		||||
  {
 | 
			
		||||
    setvbuf(file, NULL, _IOFBF, 64*1024);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // allocation d'un buffer mémoire
 | 
			
		||||
    buffer=(byte *)malloc(32128);
 | 
			
		||||
    // Codage de la résolution
 | 
			
		||||
@ -2188,7 +2160,7 @@ void Save_NEO(T_IO_Context * context)
 | 
			
		||||
    buffer[2]=0x00;
 | 
			
		||||
    buffer[3]=0x00;
 | 
			
		||||
    // Codage de la palette
 | 
			
		||||
    PI1_code_palette((byte *)context->Palette,buffer+4);
 | 
			
		||||
    PI1_code_palette(context->Palette, buffer+4);
 | 
			
		||||
    // Codage de l'image
 | 
			
		||||
    ptr=buffer+128;
 | 
			
		||||
    for (y_pos=0;y_pos<200;y_pos++)
 | 
			
		||||
@ -2233,7 +2205,7 @@ void Save_NEO(T_IO_Context * context)
 | 
			
		||||
//////////////////////////////////// C64 ////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
void Test_C64(T_IO_Context * context, FILE * file)
 | 
			
		||||
{  
 | 
			
		||||
{
 | 
			
		||||
  long file_size;
 | 
			
		||||
 | 
			
		||||
  (void)context;
 | 
			
		||||
@ -2261,7 +2233,7 @@ void Test_C64(T_IO_Context * context, FILE * file)
 | 
			
		||||
void Load_C64_hires(T_IO_Context *context, byte *bitmap, byte *screen_ram)
 | 
			
		||||
{
 | 
			
		||||
    int cx,cy,x,y,c[4],pixel,color;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
    for(cy=0; cy<25; cy++)
 | 
			
		||||
    {
 | 
			
		||||
        for(cx=0; cx<40; cx++)
 | 
			
		||||
@ -2292,7 +2264,7 @@ void Load_C64_multi(T_IO_Context *context, byte *bitmap, byte *screen_ram, byte
 | 
			
		||||
            c[1]=screen_ram[cy*40+cx]>>4;
 | 
			
		||||
            c[2]=screen_ram[cy*40+cx]&15;
 | 
			
		||||
            c[3]=color_ram[cy*40+cx]&15;
 | 
			
		||||
                
 | 
			
		||||
 | 
			
		||||
            for(y=0; y<8; y++)
 | 
			
		||||
            {
 | 
			
		||||
                pixel=bitmap[cy*320+cx*8+y];
 | 
			
		||||
@ -2331,7 +2303,7 @@ void Load_C64_fli(T_IO_Context *context, byte *bitmap, byte *screen_ram, byte *c
 | 
			
		||||
  //    Each byte contains 2 colors that *can* be used by the 4x1 pixel group:
 | 
			
		||||
  //        Low nybble: Color 1
 | 
			
		||||
  //        High nybble: Color 2
 | 
			
		||||
  // 
 | 
			
		||||
  //
 | 
			
		||||
  // bitmap     : length: 8000
 | 
			
		||||
  //    This is the final structure that refers to all others. It describes
 | 
			
		||||
  //    160x200 pixels linearly, from top left to bottom right, starting in
 | 
			
		||||
@ -2347,7 +2319,7 @@ void Load_C64_fli(T_IO_Context *context, byte *bitmap, byte *screen_ram, byte *c
 | 
			
		||||
  //
 | 
			
		||||
 | 
			
		||||
  int cx,cy,x,y,c[4];
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  for(y=0; y<200; y++)
 | 
			
		||||
  {
 | 
			
		||||
    for(x=0; x<160; x++)
 | 
			
		||||
@ -2355,7 +2327,7 @@ void Load_C64_fli(T_IO_Context *context, byte *bitmap, byte *screen_ram, byte *c
 | 
			
		||||
      Set_pixel(context, x,y,background[y]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  Set_loading_layer(context, 1);
 | 
			
		||||
  for(cy=0; cy<25; cy++)
 | 
			
		||||
  {
 | 
			
		||||
@ -2381,7 +2353,7 @@ void Load_C64_fli(T_IO_Context *context, byte *bitmap, byte *screen_ram, byte *c
 | 
			
		||||
      for(y=0; y<8; y++)
 | 
			
		||||
      {
 | 
			
		||||
        int pixel=bitmap[cy*320+cx*8+y];
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        c[0]=background[cy*8+y]&15;
 | 
			
		||||
        c[1]=screen_ram[y*1024+cy*40+cx]>>4;
 | 
			
		||||
        c[2]=screen_ram[y*1024+cy*40+cx]&15;
 | 
			
		||||
@ -2659,9 +2631,9 @@ int Save_C64_window(byte *saveWhat, byte *loadAddr)
 | 
			
		||||
    addr=Window_set_dropdown_button(110,28,70,15,70,address_label[*loadAddr/32],1, 0, 1, LEFT_SIDE,0); // 4
 | 
			
		||||
    Window_dropdown_clear_items(addr);
 | 
			
		||||
    for (i=0; i<sizeof(address_label)/sizeof(address_label[0]); i++)
 | 
			
		||||
        Window_dropdown_add_item(addr,i,address_label[i]); 
 | 
			
		||||
        Window_dropdown_add_item(addr,i,address_label[i]);
 | 
			
		||||
 | 
			
		||||
    Update_window_area(0,0,Window_width,Window_height); 
 | 
			
		||||
    Update_window_area(0,0,Window_width,Window_height);
 | 
			
		||||
    Display_cursor();
 | 
			
		||||
 | 
			
		||||
    do
 | 
			
		||||
@ -2737,9 +2709,9 @@ int Save_C64_hires(T_IO_Context *context, byte saveWhat, byte loadAddr)
 | 
			
		||||
                for(x=0; x<8; x++)
 | 
			
		||||
                {
 | 
			
		||||
                    pixel=Get_pixel(context, x+cx*8,y+cy*8);
 | 
			
		||||
                    if(pixel>15) 
 | 
			
		||||
                    { 
 | 
			
		||||
                        Warning_message("Color above 15 used"); 
 | 
			
		||||
                    if(pixel>15)
 | 
			
		||||
                    {
 | 
			
		||||
                        Warning_message("Color above 15 used");
 | 
			
		||||
                        // TODO hilite offending block here too?
 | 
			
		||||
                        // or make it smarter with color allocation?
 | 
			
		||||
                        // However, the palette is fixed to the 16 first colors
 | 
			
		||||
@ -2781,7 +2753,7 @@ int Save_C64_hires(T_IO_Context *context, byte saveWhat, byte loadAddr)
 | 
			
		||||
 | 
			
		||||
int Save_C64_multi(T_IO_Context *context, byte saveWhat, byte loadAddr)
 | 
			
		||||
{
 | 
			
		||||
    /* 
 | 
			
		||||
    /*
 | 
			
		||||
    BITS     COLOR INFORMATION COMES FROM
 | 
			
		||||
    00     Background color #0 (screen color)
 | 
			
		||||
    01     Upper 4 bits of Screen RAM
 | 
			
		||||
@ -2842,7 +2814,7 @@ int Save_C64_multi(T_IO_Context *context, byte saveWhat, byte loadAddr)
 | 
			
		||||
 | 
			
		||||
                    if ((cols & 1 << n) == 0 ) {
 | 
			
		||||
                        // This color isn't used at all in this tile:
 | 
			
		||||
                        // Can't be the global 
 | 
			
		||||
                        // Can't be the global
 | 
			
		||||
                        invalids |= 1 << n;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
@ -2867,7 +2839,7 @@ int Save_C64_multi(T_IO_Context *context, byte saveWhat, byte loadAddr)
 | 
			
		||||
	for (n = 0; n<16; n++)
 | 
			
		||||
	{
 | 
			
		||||
		if (candidates & (1 << n)) {
 | 
			
		||||
			background = n; 
 | 
			
		||||
			background = n;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@ -2913,12 +2885,12 @@ int Save_C64_multi(T_IO_Context *context, byte saveWhat, byte loadAddr)
 | 
			
		||||
			{
 | 
			
		||||
				bits=0;
 | 
			
		||||
				for(x=0;x<4;x++)
 | 
			
		||||
				{                    
 | 
			
		||||
				{
 | 
			
		||||
					pixel=Get_pixel(context, cx*4+x,cy*8+y);
 | 
			
		||||
					if(pixel>15) 
 | 
			
		||||
					{ 
 | 
			
		||||
						Warning_message("Color above 15 used"); 
 | 
			
		||||
						// TODO hilite as in hires, you should stay to 
 | 
			
		||||
					if(pixel>15)
 | 
			
		||||
					{
 | 
			
		||||
						Warning_message("Color above 15 used");
 | 
			
		||||
						// TODO hilite as in hires, you should stay to
 | 
			
		||||
						// the fixed 16 color palette
 | 
			
		||||
						return 1;
 | 
			
		||||
					}
 | 
			
		||||
@ -2931,18 +2903,18 @@ int Save_C64_multi(T_IO_Context *context, byte saveWhat, byte loadAddr)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
    file = Open_file_write(context);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    if(!file)
 | 
			
		||||
    {
 | 
			
		||||
        Warning_message("File open failed");
 | 
			
		||||
        File_error = 2;
 | 
			
		||||
        return 2;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    setvbuf(file, NULL, _IOFBF, 64*1024);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    if (loadAddr)
 | 
			
		||||
    {
 | 
			
		||||
        Write_byte(file,0);
 | 
			
		||||
@ -2951,16 +2923,16 @@ int Save_C64_multi(T_IO_Context *context, byte saveWhat, byte loadAddr)
 | 
			
		||||
 | 
			
		||||
    if (saveWhat==0 || saveWhat==1)
 | 
			
		||||
        Write_bytes(file,bitmap,8000);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
    if (saveWhat==0 || saveWhat==2)
 | 
			
		||||
        Write_bytes(file,screen_ram,1000);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
    if (saveWhat==0 || saveWhat==3)
 | 
			
		||||
        Write_bytes(file,color_ram,1000);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
    if (saveWhat==0)
 | 
			
		||||
        Write_byte(file,background);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    fclose(file);
 | 
			
		||||
    //printf("\nbg:%d\n",background);
 | 
			
		||||
    return 0;
 | 
			
		||||
@ -2971,26 +2943,26 @@ int Save_C64_fli(T_IO_Context * context, byte saveWhat, byte loadAddr)
 | 
			
		||||
 | 
			
		||||
    FILE *file;
 | 
			
		||||
    byte file_buffer[17474];
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    memset(file_buffer,0,sizeof(file_buffer));
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    if (C64_FLI(file_buffer+9474, file_buffer+1282, file_buffer+258, file_buffer+2))
 | 
			
		||||
    {
 | 
			
		||||
      File_error=1;
 | 
			
		||||
      return 1;
 | 
			
		||||
    }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
    file = Open_file_write(context);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    if(!file)
 | 
			
		||||
    {
 | 
			
		||||
        Warning_message("File open failed");
 | 
			
		||||
        File_error = 1;
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    setvbuf(file, NULL, _IOFBF, 64*1024);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    if (loadAddr)
 | 
			
		||||
    {
 | 
			
		||||
        file_buffer[0]=0;
 | 
			
		||||
@ -3006,12 +2978,12 @@ int Save_C64_fli(T_IO_Context * context, byte saveWhat, byte loadAddr)
 | 
			
		||||
 | 
			
		||||
    if (saveWhat==0 || saveWhat==1)
 | 
			
		||||
        Write_bytes(file,file_buffer+1282,8192);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
    if (saveWhat==0 || saveWhat==2)
 | 
			
		||||
        Write_bytes(file,file_buffer+9474,8000);
 | 
			
		||||
        
 | 
			
		||||
        
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    fclose(file);
 | 
			
		||||
    //printf("\nbg:%d\n",background);
 | 
			
		||||
    return 0;
 | 
			
		||||
@ -3167,7 +3139,7 @@ void Test_CM5(T_IO_Context * context, FILE * file)
 | 
			
		||||
void Load_CM5(T_IO_Context* context)
 | 
			
		||||
{
 | 
			
		||||
  // Ensure "8bit" constraint mode is switched on
 | 
			
		||||
  // Set palette to the CPC hardware colors 
 | 
			
		||||
  // Set palette to the CPC hardware colors
 | 
			
		||||
  // Load the palette data to the 4 colorlayers
 | 
			
		||||
  FILE *file;
 | 
			
		||||
  byte value = 0;
 | 
			
		||||
@ -3339,19 +3311,19 @@ void Save_CM5(T_IO_Context* context)
 | 
			
		||||
  int tx, ty;
 | 
			
		||||
 | 
			
		||||
  // TODO: Check picture has 5 layers
 | 
			
		||||
  // TODO: Check the constraints on the layers 
 | 
			
		||||
  // TODO: Check the constraints on the layers
 | 
			
		||||
  // Layer 1 : 1 color Only
 | 
			
		||||
  // Layer 2 and 3 : 1 color/line
 | 
			
		||||
  // Layer 4 : 1 color / 48x1 block 
 | 
			
		||||
  // Layer 4 : 1 color / 48x1 block
 | 
			
		||||
  // TODO: handle filesize
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  if (!(file = Open_file_write(context)))
 | 
			
		||||
  {
 | 
			
		||||
    File_error = 1;
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  setvbuf(file, NULL, _IOFBF, 64*1024);
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  // Write layer 0
 | 
			
		||||
  Set_saving_layer(context, 0);
 | 
			
		||||
  Write_byte(file, Get_pixel(context, 0, 0));
 | 
			
		||||
@ -3377,9 +3349,9 @@ void Save_CM5(T_IO_Context* context)
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  setvbuf(file, NULL, _IOFBF, 64*1024);
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  Set_saving_layer(context, 4);
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  for (ty = 0; ty < 256; ty++)
 | 
			
		||||
  {
 | 
			
		||||
    for (tx = 0; tx < 48*6; tx+=4)
 | 
			
		||||
@ -3401,7 +3373,7 @@ void Save_CM5(T_IO_Context* context)
 | 
			
		||||
 | 
			
		||||
  fclose(file);
 | 
			
		||||
  File_error = 0;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user