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.