Fix issue 535 : PC1 files created by Grafx2 can't be reloaded by Degas Elite
git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@2063 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
parent
be1cffc1fb
commit
01543b7a8d
@ -1638,58 +1638,62 @@ void PC1_uncompress_packbits(byte * src,byte * dest)
|
|||||||
|
|
||||||
void PC1_compress_packbits(byte * src,byte * dest,int source_size,int * dest_size)
|
void PC1_compress_packbits(byte * src,byte * dest,int source_size,int * dest_size)
|
||||||
{
|
{
|
||||||
int is; // index dans la source
|
|
||||||
int id; // 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"
|
|
||||||
|
|
||||||
for (is=id=0;is<source_size;)
|
*dest_size = 0;
|
||||||
|
while (source_size > 0)
|
||||||
{
|
{
|
||||||
// On recherche le 1er endroit où il y a répétition d'au moins 3 valeurs
|
int is = 0; // index dans la source
|
||||||
// identiques
|
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"
|
||||||
|
|
||||||
repet=0;
|
while(is<40)
|
||||||
for (ir=is;ir<source_size-2;ir++)
|
|
||||||
{
|
{
|
||||||
if ((src[ir]==src[ir+1]) && (src[ir+1]==src[ir+2]))
|
// 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++)
|
||||||
{
|
{
|
||||||
repet=1;
|
if ((src[ir]==src[ir+1]) && (src[ir+1]==src[ir+2]))
|
||||||
break;
|
{
|
||||||
|
repet=1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ((ir-is)+1==40)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// On code la partie sans répétitions
|
// On code la partie sans répétitions
|
||||||
if (ir!=is)
|
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<source_size;ir++)
|
|
||||||
{
|
{
|
||||||
if (src[ir]!=src[is])
|
n=(ir-is)+1;
|
||||||
break;
|
dest[id++]=n-1;
|
||||||
if ((ir-is)+1==40)
|
for (;n>0;n--)
|
||||||
break;
|
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;
|
||||||
}
|
}
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
// On renseigne la taille du buffer compressé
|
|
||||||
*dest_size=id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//// DECODAGE d'une partie d'IMAGE ////
|
//// DECODAGE d'une partie d'IMAGE ////
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user