View Single Post
  #1  
Old April 10th, 2021, 03:41 PM
MarkSheppard's Avatar

MarkSheppard MarkSheppard is offline
Lieutenant Colonel
 
Join Date: Jun 2005
Posts: 1,302
Thanks: 99
Thanked 528 Times in 357 Posts
MarkSheppard is on a distinguished road
Disk Re-Implementing SHPEd

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.
Attached Files
File Type: zip shpedsrc.zip (91.8 KB, 209 views)
Reply With Quote