[net.sources] Macpaint -> PC view prog

root@ozdaltx.UUCP (root) (10/20/86)

One of my members sent this to me, and having seen several
requests along the same line, I figured I'd post it.. as mayby
someone else can use it... Anyone, for re-writing it in 'C' ?
Another real hacker challenge would be options to send the output
to a printer in -either- bit-image or RLE format... (for those of
us who don't have bit-image printers ;-)... anyway, enjoy..
> Scotty <
----------------------------- CUT HERE -------------------------------
(*
       MACVIEW.PAS - Display MacPaint pictures on the IBM PC
                     graphics adapter.

                     Mark Anacker    09/24/85
                                                                     *)
PROGRAM MACVIEW;
(*$V-*)

TYPE
  STRING255 = STRING[255];
  SCANLINE = ARRAY [1..80] OF BYTE;      (* hi-res screen is 80 bytes wide *)

CONST
  SCANFLAG : BOOLEAN = TRUE;
  ODDLINE  : INTEGER = 0;
  EVENLINE : INTEGER = 0;

VAR
  FILNAM : STRING[64];
  PNTFIL : FILE OF BYTE;
  ELEN   : BYTE;
  ELEM   : STRING255;
  OUTPAT : STRING255;
  LCNT   : INTEGER;
  CNT    : INTEGER;
  XPOS,YPOS : INTEGER;
  STLINE,ENLINE : INTEGER;
  EVSCREEN : ARRAY [0..99,1..80] OF BYTE ABSOLUTE $B800:$0000;
  ODSCREEN : ARRAY [0..99,1..80] OF BYTE ABSOLUTE $B800:$2000;

  DOIT : BOOLEAN;

  SLPTR : ARRAY [0..719] OF ^SCANLINE;   (* pointers to scan line buffers *)

PROCEDURE HELPMSG;
       BEGIN
         WRITE('MACVIEW - View MacPaint images  ...  by Mark Anacker');
         WRITELN('  09/24/85'); WRITELN;;
         WRITELN('This program will let you view an entire MacPaint image.');
         WRITELN('First, transfer the picture file from the Mac.  Then,');
         WRITELN('run this program and give it the file name.  You may use');
         WRITELN('the keypad keys 1-3 and 7-9 to scroll over the image.');
         WRITELN('Press the space bar to exit back to DOS.');
         WRITELN;
         WRITELN('You may specify the file name on the command line.');
         WRITELN;
         WRITELN('Remember, the aspect ratio is different.  The picture will');
         WRITELN('be distorted somewhat in the vertical direction.');
         WRITELN;
       END;

PROCEDURE GETFILE;
VAR    CNT : INTEGER;
       INCH : CHAR;
       BEGIN
         ASSIGN(PNTFIL,FILNAM);
         (*$I-*) RESET(PNTFIL); (*$I+*)
         IF IORESULT<>0 THEN
           BEGIN
             WRITELN('** Error opening file - halting **'); HALT(1);
           END;
         SEEK(PNTFIL,512);               (* skip brush patterns *)
         YPOS:=0; LCNT:=0; OUTPAT:='';
         SCANFLAG:=TRUE;
         ODDLINE:=0; EVENLINE:=0;
         STLINE:=0;
       END;

PROCEDURE OUTSCREEN;                               (* display line *)
VAR    CNT,CNT2 : INTEGER;
       BEGIN
         FOR CNT:=1 TO LENGTH(OUTPAT) DO           (* invert bits to black *)
           OUTPAT[CNT]:=CHR(NOT ORD(OUTPAT[CNT])); (* on white like the Mac *)
         NEW(SLPTR[LCNT]);                         (* allocate a new buffer line*)
         FILLCHAR(SLPTR[LCNT]^,80,CHR(0));         (* fill it to black *)
         MOVE(OUTPAT[1],SLPTR[LCNT]^,72);          (* and copy the decoded bits *)
       END;

PROCEDURE PUTLINE;                       (* decide if we need to do line *)
       BEGIN
         OUTPAT:=OUTPAT+ELEM;            (* build scan line pattern *)
         IF LENGTH(OUTPAT)>=72 THEN      (* if we have a full line, *)
           BEGIN
             IF LENGTH(OUTPAT)>72 THEN   (* if too long, truncate *)
               OUTPAT:=COPY(OUTPAT,1,72);
             OUTSCREEN;                  (* put it in the buffer *)
             LCNT:=LCNT+1; OUTPAT:='';
             FILLCHAR(OUTPAT,75,CHR(0)); (* reset the string *)
           END;
       END;

PROCEDURE REPBLOCK;                      (* block of repeating data *)
VAR    TMPBYTE : BYTE;
       CNT : INTEGER;
       BEGIN
         ELEN:=(256-ELEN);               (* get character count *)
         READ(PNTFIL,TMPBYTE);           (* get character to repeat *)
         ELEM:='';
         FOR CNT:=0 TO ELEN DO
           ELEM:=CONCAT(ELEM,CHR(TMPBYTE));  (* make string of chars. *)
         PUTLINE;                        (* test for a complete scan line *)
       END;

PROCEDURE MIXBLOCK;                      (* block of mixed, raw data *)
VAR    TMPBYTE : BYTE;
       CNT : INTEGER;
       BEGIN
         ELEM:='';
         FOR CNT:=0 TO ELEN DO
           BEGIN
             READ(PNTFIL,TMPBYTE);             (* get characters *)
             ELEM:=CONCAT(ELEM,CHR(TMPBYTE));  (* add to running pattern *)
           END;
         PUTLINE;                        (* test for complete scan line *)
       END;

PROCEDURE LOADBUF;                       (* read data from file *)
       BEGIN
         GETFILE;                        (* open file *)
         WRITELN('Loading picture into buffer ... Please wait a moment');
         REPEAT
           BEGIN
             READ(PNTFIL,ELEN);          (* get a byte *)
             IF ELEN>127 THEN            (* if 8th bit set, *)
               REPBLOCK                  (* it's a repeater, else *)
              ELSE
               MIXBLOCK;                 (* it's mixed *)
           END;
         UNTIL LCNT>=720;                (* until all 720 lines are done *)
         CLOSE(PNTFIL);
       END;

PROCEDURE SHOWBUF;                       (* display the buffer on screen *)
VAR    CNT : INTEGER;
       BEGIN
         EVENLINE:=0; ODDLINE:=0;
         FOR CNT:=STLINE TO STLINE+199 DO  (* show the current 200 scan lines *)
           BEGIN
             IF (CNT AND 1)<>1 THEN       (* even line *)
               BEGIN
                 MOVE(SLPTR[CNT]^,EVSCREEN[EVENLINE,1],80);  (* even lines *)
                 EVENLINE:=EVENLINE+1;
               END
              ELSE
               BEGIN                     (* odd line *)
                 MOVE(SLPTR[CNT]^,ODSCREEN[ODDLINE,1],80);   (* odd lines *)
                 ODDLINE:=ODDLINE+1;
               END;
             END;
       END;

PROCEDURE MOVEIT;                        (* scroll the picture up and down *)
CONST
  FKTABLE : STRING[6] = 'OPQGHI';        (* cursor/numeric key *)
  FKEQUIV : STRING[6] = '123789';        (* conversion table *)
VAR    INCH : CHAR;
       CNT : INTEGER;
       BEGIN
         REPEAT
           GOTOXY(75,1); WRITE(STLINE:3);  (* put top scan line in upper corner *)
           READ(KBD,INCH);               (* get the key from the user *)
           IF (INCH=CHR(27)) AND KEYPRESSED THEN   (* if a real cursor key, *)
             BEGIN
               READ(KBD,INCH);           (* get the key code *)
               IF POS(INCH,FKTABLE)>0 THEN (* and convert to it's number *)
                 BEGIN
                   CNT:=POS(INCH,FKTABLE); INCH:=FKEQUIV[CNT];
                 END;
             END;
           CASE INCH OF
            '8' : BEGIN                  (* move image UP *)
                    IF STLINE<520 THEN
                      BEGIN
                        FOR CNT:=0 TO 98 DO
                          BEGIN
                            MOVE(EVSCREEN[CNT+1,1],EVSCREEN[CNT,1],72);
                            MOVE(ODSCREEN[CNT+1,1],ODSCREEN[CNT,1],72);
                          END;
                        FILLCHAR(EVSCREEN[99,1],72,CHR(0));
                        FILLCHAR(ODSCREEN[99,1],72,CHR(0));
                        STLINE:=STLINE+2;
                        MOVE(SLPTR[STLINE+198]^,EVSCREEN[99,1],72);
                        MOVE(SLPTR[STLINE+199]^,ODSCREEN[99,1],72);
                      END;
                  END;
            '2' : BEGIN                  (* move image DOWN *)
                    IF STLINE>1 THEN
                      BEGIN
                        FOR CNT:=99 DOWNTO 1 DO
                          BEGIN
                            MOVE(EVSCREEN[CNT-1,1],EVSCREEN[CNT,1],72);
                            MOVE(ODSCREEN[CNT-1,1],ODSCREEN[CNT,1],72);
                          END;
                        FILLCHAR(EVSCREEN[0,1],72,CHR(0));
                        FILLCHAR(ODSCREEN[0,1],72,CHR(0));
                        STLINE:=STLINE-2;
                        MOVE(SLPTR[STLINE]^,EVSCREEN[0,1],72);
                        MOVE(SLPTR[STLINE+1]^,ODSCREEN[0,1],72);
                      END;
                  END;
            '3' : BEGIN                  (* page image DOWN *)
                    STLINE:=STLINE-100;
                    IF STLINE<0 THEN STLINE:=0;
                    SHOWBUF;
                  END;
            '9' : BEGIN                  (* page image UP *)
                    STLINE:=STLINE+100;
                    IF STLINE>520 THEN STLINE:=520;
                    SHOWBUF;
                  END;
            '7' : BEGIN                  (* go to TOP of image *)
                    STLINE:=0; SHOWBUF;
                  END;
            '1' : BEGIN                  (* go to BOTTOM of image *)
                    STLINE:=514; SHOWBUF;
                  END
           END;
         UNTIL INCH=' ';                 (* exit when SPACE bar is pressed *)
       END;                              (* moveit *)

               (* main section *)

BEGIN
  TEXTCOLOR(7);                          (* set color to gray *)
  IF PARAMCOUNT=0 THEN                   (* if a blank command line, *)
    BEGIN
      HELPMSG;                           (* show message, prompt for file *)
      WRITE('MacPaint file name : '); READLN(FILNAM);
      IF FILNAM='' THEN HALT(2);         (* if none given, exit to DOS *)
    END
   ELSE
    FILNAM:=PARAMSTR(1);                 (* else get file name from cmd line *)
  IF POS('.',FILNAM)=0 THEN              (* if no extension was given, *)
   FILNAM:=FILNAM+'.MCP';                (* assume .MCP *)
  LOADBUF;                               (* load the file *)
  HIRES;                                 (* switch to hi-res mode *)
  SHOWBUF;                               (* display the buffer *)
  MOVEIT;                                (* move it up and down *)
  CLRSCR;                                (* clear the screen when done *)
END.