I've been reimplementing SHP Ed functions in HTML5/Javascript as a way to modernize it and teach myself more programming skills.
However, I'm hitting a blank wall when it comes to the SHP decompression code.
I've got access to Fred's old SHPEd source code (see attached); and I think I've identified the decryption routine in SPF.cpp:
Quote:
//---------------------------------------------------------------------------
// read the shp data (for icon n) into the pseudo image
// this does not use the header info for lines, but reads
// until it finds KEY BYTE 88 Next byte 0.
void __fastcall read_SPicon_shp(FILE *inf, int n)
{
int ch,b,r,i,l=0;
long fpos;
fseek(inf,icon_add[n]+HEADER_SIZE,0);
pix_pos=0;
far_right=0;
far_bottom=0;
do
{
// read data and decode
ch=fgetc(inf);
//==== this section checks for end =====
if (ch==-1) break;// for last image this is end of shp
fgetpos(inf,&fpos);
if ((n<(icons-1)) && fpos>icon_add[n+1]) break;
// ==== end of end check ===========
r=ch%2;
b=ch/2;
if (b==0 && r==1) // a skip over
{
ch=fgetc(inf);
for (i=0; i
put_pix(l,BACK_COLOR);
if (pix_pos>far_right) far_right=pix_pos;
}
else if (b==0) // end of line
{
++l;
pix_pos=0;
}
else if (r==0) // a run of bytes
{
ch=fgetc(inf); // the color #
for (i=0; i
put_pix(l,ch);
if (pix_pos>far_right) far_right=pix_pos;
}
else // b!0 and r==1 ... read the next b bytes as color #'s
{
for (i=0; i
{
ch=fgetc(inf);
put_pix(l,ch);
}
if (pix_pos>far_right) far_right=pix_pos;
}
} while (true); //exit this loop with break
far_bottom=l;
}
|
I'm thinking that it decodes as:
Read Character
R = Character % 2
B = Character / 2
###########
EOF Test:
If Character EQUAL TO -1 break, this is End of SHP.
##########
TEST ONE:
IF B equals 0 AND R equals 1
(I think Char = 1, which returns B = 0.5 and R = 1)
We have a huge string of blank pixels coming up.
Read the next character in the file. That character is the number of pixels that we paint as the transparent background color.
############
TEST TWO:
If B equals 0
End of SHP Line -- I think this used to mark the end of each row in the SHP file, i.e. incremeting from y = 0 to y =1 and so on.
###########
TEST THREE:
IF R equals 0
Read the next character in the file; that character is the color index number from the palette.
We then paint a number of pixels equal to "B" with that color we just grabbed.
##############
TEST FOUR:
IF B NOT ZERO and R EQUAL ONE
Read the next [b] bytes as color numbers?
Basically this says that the next B characters are direct image colors; probably used to save space when you have a lot of different characters, to avoid the use of space wasting couplets.