Save_PC1: PC1_compress_packbits => PackBits_pack_buffer
This commit is contained in:
		
							parent
							
								
									bd723a9a2c
								
							
						
					
					
						commit
						e956a0743b
					
				@ -443,68 +443,6 @@ void Save_PI1(T_IO_Context * context)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
//////////////////////////////////// PC1 ////////////////////////////////////
 | 
					//////////////////////////////////// PC1 ////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//// COMPRESSION d'un buffer selon la méthode PACKBITS ////
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void PC1_compress_packbits(byte * src,byte * dest,int source_size,int * dest_size)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  *dest_size = 0;
 | 
					 | 
				
			||||||
  while (source_size > 0)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    int is = 0; // index dans la source
 | 
					 | 
				
			||||||
    int id = 0; // index dans la destination
 | 
					 | 
				
			||||||
    int ir; // index de   la répétition
 | 
					 | 
				
			||||||
    int n;  // Taille des séquences
 | 
					 | 
				
			||||||
    int repet; // "Il y a répétition"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    while(is<40)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      // 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++)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        if ((src[ir]==src[ir+1]) && (src[ir+1]==src[ir+2]))
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          repet=1;
 | 
					 | 
				
			||||||
          break;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // On code la partie sans répétitions
 | 
					 | 
				
			||||||
      if (!repet || ir!=is)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        n=(ir-is)+1;
 | 
					 | 
				
			||||||
        dest[id++]=n-1;
 | 
					 | 
				
			||||||
        for (;n>0;n--)
 | 
					 | 
				
			||||||
          dest[id++]=src[is++];
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // On code la partie sans répétitions
 | 
					 | 
				
			||||||
      if (repet)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        // On compte la quantité de fois qu'il faut répéter la valeur
 | 
					 | 
				
			||||||
        for (ir+=3;ir<40;ir++)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          if (src[ir]!=src[is])
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        n=(ir-is);
 | 
					 | 
				
			||||||
        dest[id++]=257-n;
 | 
					 | 
				
			||||||
        dest[id++]=src[is];
 | 
					 | 
				
			||||||
        is=ir;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    // On renseigne la taille du buffer compressé
 | 
					 | 
				
			||||||
    *dest_size+=id;
 | 
					 | 
				
			||||||
    // Move for next 40-byte block
 | 
					 | 
				
			||||||
    src += 40;
 | 
					 | 
				
			||||||
    dest += id;
 | 
					 | 
				
			||||||
    source_size -= 40;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//// DECODAGE d'une partie d'IMAGE ////
 | 
					//// DECODAGE d'une partie d'IMAGE ////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Transformation de 4 plans de bits en 1 ligne de pixels
 | 
					// Transformation de 4 plans de bits en 1 ligne de pixels
 | 
				
			||||||
@ -724,9 +662,8 @@ void Load_PC1(T_IO_Context * context)
 | 
				
			|||||||
void Save_PC1(T_IO_Context * context)
 | 
					void Save_PC1(T_IO_Context * context)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  FILE *file;
 | 
					  FILE *file;
 | 
				
			||||||
  int   size;
 | 
					 | 
				
			||||||
  short x_pos,y_pos;
 | 
					  short x_pos,y_pos;
 | 
				
			||||||
  byte * buffercomp;
 | 
					  byte buffer[32];;
 | 
				
			||||||
  byte * bufferdecomp;
 | 
					  byte * bufferdecomp;
 | 
				
			||||||
  byte * ptr;
 | 
					  byte * ptr;
 | 
				
			||||||
  byte pixels[320];
 | 
					  byte pixels[320];
 | 
				
			||||||
@ -737,12 +674,14 @@ void Save_PC1(T_IO_Context * context)
 | 
				
			|||||||
  {
 | 
					  {
 | 
				
			||||||
    // Allocation des buffers mémoire
 | 
					    // Allocation des buffers mémoire
 | 
				
			||||||
    bufferdecomp = GFX2_malloc(32000);
 | 
					    bufferdecomp = GFX2_malloc(32000);
 | 
				
			||||||
    buffercomp = GFX2_malloc(64066);
 | 
					 | 
				
			||||||
    // Codage de la résolution
 | 
					    // Codage de la résolution
 | 
				
			||||||
    buffercomp[0]=0x80;
 | 
					    if (!Write_word_be(file, 0x8000))
 | 
				
			||||||
    buffercomp[1]=0x00;
 | 
					      File_error = 1;
 | 
				
			||||||
    // Codage de la palette
 | 
					    // Codage de la palette
 | 
				
			||||||
    PI1_code_palette(context->Palette, buffercomp+2);
 | 
					    PI1_code_palette(context->Palette, buffer);
 | 
				
			||||||
 | 
					    if (!Write_bytes(file, buffer, 32))
 | 
				
			||||||
 | 
					      File_error = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Codage de l'image
 | 
					    // Codage de l'image
 | 
				
			||||||
    ptr=bufferdecomp;
 | 
					    ptr=bufferdecomp;
 | 
				
			||||||
    for (y_pos=0;y_pos<200;y_pos++)
 | 
					    for (y_pos=0;y_pos<200;y_pos++)
 | 
				
			||||||
@ -761,12 +700,12 @@ void Save_PC1(T_IO_Context * context)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Compression du buffer
 | 
					    // Compression du buffer
 | 
				
			||||||
    PC1_compress_packbits(bufferdecomp,buffercomp+34,32000,&size);
 | 
					    if (PackBits_pack_buffer(file, bufferdecomp, 32000) < 0)
 | 
				
			||||||
    size += 34;
 | 
					      File_error = 1;
 | 
				
			||||||
    size += 32;
 | 
					 | 
				
			||||||
    PI1_save_ranges(context, buffercomp,size);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (Write_bytes(file,buffercomp,size))
 | 
					    PI1_save_ranges(context, buffer, 32);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (Write_bytes(file, buffer, 32))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      fclose(file);
 | 
					      fclose(file);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -778,8 +717,7 @@ void Save_PC1(T_IO_Context * context)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    // Libération des buffers mémoire
 | 
					    // Libération des buffers mémoire
 | 
				
			||||||
    free(bufferdecomp);
 | 
					    free(bufferdecomp);
 | 
				
			||||||
    free(buffercomp);
 | 
					    bufferdecomp = NULL;
 | 
				
			||||||
    buffercomp = bufferdecomp = NULL;
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user