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