home *** CD-ROM | disk | FTP | other *** search
-
- PROGRAM READTIFF;
- {
- Paul Schubert, Rottweiler Str. 8, 6000 Frankfurt 1, 069 / 231145
-
- PROGRAMM ZUM LESEN VON ALDUS / MICROSOFT TIFF- FILES
- IM BILEVEL- UND GRAYSCALE- FORMAT
-
- DANK AN TORSTEN PRIEBE, VON DEM ICH DIE TIFF- SPEZIFIKATION UND
- DIE LISTE DER TAG- NAMEN ERHALTEN HABE
-
- }
- {$F+}
-
-
- {.$DEFINE TEST}
-
-
- USES SELECTD,VIDEO,GRAPH,EGAVGA,
- GETPUT,TIFFUNIT,BUFFILE,
- PARRAY,
- TPDIR,DOS,TPPICK,
- TPCRT,TPDOS,TPSTRING,TPEDIT,
- TPENHKBD,TPWINDOW;
-
-
- TYPE VPARTYP = RECORD
- M : WORD; { VIDEO- MODE }
- X,Y : WORD; { GETMAXX, GETMAXY }
- END;
-
-
- {$IFDEF TEST}
- CONST DEFMASK : STRING[64] = 'D:\BILDER\*.TIF';
- { SONDER- VIDEOMODI FÜR BILEVEL- DARSTELLUNG }
- USEMODE12H : BOOLEAN = TRUE; { VIDEO- MODUS 12H AUF EGA BENUTZEN }
- USE80X60F1 : BOOLEAN = TRUE; { TREIBER 800*600 / 16 BENUTZEN }
- { SONDER- VIDEOMODI FÜR GRAYSCALE- UND SPÄTER AUCH FARBBILDER }
- USE64X48F2 : BOOLEAN = TRUE; { TREIBER 640*480 / 256 BENUTZEN }
- USE80X60F2 : BOOLEAN = TRUE; { TREIBER 800*600 / 256 BENUTZEN }
- {$ELSE}
- CONST DEFMASK : STRING[64] = '*.TIF';
- { SONDER- VIDEOMODI FÜR BILEVEL- DARSTELLUNG }
- USEMODE12H : BOOLEAN = FALSE; { VIDEO- MODUS 12H AUF EGA BENUTZEN }
- USE80X60F1 : BOOLEAN = FALSE; { TREIBER 800*600 / 16 BENUTZEN }
- { SONDER- VIDEOMODI FÜR GRAYSCALE- UND SPÄTER AUCH FARBBILDER }
- USE64X48F2 : BOOLEAN = FALSE; { TREIBER 640*480 / 256 BENUTZEN }
- USE80X60F2 : BOOLEAN = FALSE; { TREIBER 800*600 / 256 BENUTZEN }
- {$ENDIF}
-
- CONST PROGNAME : STRING[12] = 'READTIF1.EXE';
- HEAPMIN : LONGINT = 4096; { MINIMALER PLATZ, DEN EIN BILD AUF
- DEM HEAP LASSEN MUß }
-
-
- CONST V : ARRAY[1..6] OF VPARTYP =
- ((M:$10;X:639;Y:349), { EGA 640 * 350 / 16 }
- (M:$12;X:639;Y:479), { VGA / EGA 640 * 480 / 16 }
- (M:$13;X:319;Y:199), { VGA 320 * 200 / 256 }
- (M:$2E;X:639;Y:479), { EXTRA VGA 640 * 480 / 256 }
- (M:$29;X:799;Y:599), { VGA / EGA 800 * 600 / 16 }
- (M:$30;X:799;Y:599)); { EXTRA VGA 800 * 600 / 256 }
-
-
- VAR NAME,MASK,NM : STRING;
- I : WORD;
- DIRRET : BYTE;
- GD,GM : INTEGER;
- GRMAX : LONGINT;
- RX,RY : REAL;
-
-
- PROCEDURE PIEP;
- BEGIN
- SOUND(2500);
- DELAY(80);
- SOUND(800);
- DELAY(120);
- NOSOUND;
- END; { PIEP }
-
-
- PROCEDURE TICK;
- BEGIN
- SOUND(4000);
- DELAY(1);
- NOSOUND;
- END; { TICK }
-
-
- PROCEDURE WRITECONFIG;
- VAR F : FILE;
- I,NBL,NBB : WORD;
- FE : LONGINT;
- N : STRING[12];
- BEGIN
- {$I-}
- ASSIGN(F,PROGNAME);
- RESET(F,1);
- IF IORESULT <> 0 THEN EXIT;
- BLOCKREAD(F,I,2); { EXE - ID }
- BLOCKREAD(F,NBL,2); { BYTES IM LETZTEN BLOCK }
- BLOCKREAD(F,NBB,2); { 512- BYTE- BLOCKS }
- FE := LONGINT(NBB) * 512 - (512 - NBL);
- SEEK(F,FE);
- BLOCKWRITE(F,PROGNAME,SIZEOF(PROGNAME));
- BLOCKWRITE(F,DEFMASK,SIZEOF(DEFMASK));
- BLOCKWRITE(F,USEMODE12H,1);
- BLOCKWRITE(F,USE80X60F1,1);
- BLOCKWRITE(F,USE64X48F2,1);
- BLOCKWRITE(F,USE80X60F2,1);
- BLOCKWRITE(F,USEET4000,1);
- BLOCKWRITE(F,SEGPORT,2);
- BLOCKWRITE(F,HEAPMIN,4);
- BLOCKWRITE(F,V,SIZEOF(V));
- FCLOSE(F);
- {$I+}
- END; { WRITECONFIG }
-
-
- PROCEDURE READCONFIG;
- VAR F : FILE;
- I,NBL,NBB : WORD;
- FE : LONGINT;
- N : STRING[12];
- BEGIN { READCONFIG }
- {$I-}
- ASSIGN(F,PROGNAME);
- RESET(F,1);
- IF IORESULT <> 0 THEN EXIT;
- BLOCKREAD(F,I,2); { EXE - ID }
- BLOCKREAD(F,NBL,2); { BYTES IM LETZTEN BLOCK }
- BLOCKREAD(F,NBB,2); { 512- BYTE- BLOCKS }
- FE := LONGINT(NBB) * 512 - (512 - NBL);
- SEEK(F,FE);
- N := '';
- BLOCKREAD(F,N[0],13);
- IF (IORESULT <> 0) OR (N <> PROGNAME) THEN BEGIN
- FCLOSE(F);
- WRITECONFIG;
- RESET(F,1);
- SEEK(F,FE);
- END ELSE BEGIN
- BLOCKREAD(F,DEFMASK,SIZEOF(DEFMASK));
- BLOCKREAD(F,USEMODE12H,1);
- BLOCKREAD(F,USE80X60F1,1);
- BLOCKREAD(F,USE64X48F2,1);
- BLOCKREAD(F,USE80X60F2,1);
- BLOCKREAD(F,USEET4000,1);
- BLOCKREAD(F,SEGPORT,2);
- BLOCKREAD(F,HEAPMIN,4);
- BLOCKREAD(F,V,SIZEOF(V));
- END;
- FCLOSE(F);
- {$I+}
- END; { READCONFIG }
-
-
- FUNCTION JANEINABFRAGE(X,Y:BYTE;VAR WERT:BOOLEAN):CHAR;
- CONST JANEIN = ['J','Y','N',CHAR($80+72),CHAR($80+80),^[];
- VAR CH1 : CHAR;
- BEGIN
- READCHARACTER('J/N ?',Y,X,$0F,JANEIN,CH1);
- IF CH1 IN ['J','Y'] THEN WERT := TRUE;
- IF CH1 = 'N' THEN WERT := FALSE;
- JANEINABFRAGE := CH1;
- END; { JANEINABFRAGE }
-
-
- PROCEDURE WERTABFRAGE(X,Y,WID:BYTE;MI,MA:WORD;VAR WERT:WORD);
- VAR I : WORD;
- ESC : BOOLEAN;
- BEGIN
- I := WERT;
- READWORD('',Y,X,WID,$07,$0F,MI,MA,ESC,I);
- IF NOT ESC THEN WERT := I;
- END; { WERTABFRAGE }
-
-
- PROCEDURE CONFIG;
- VAR I : WORD;
- CH1,CH2 : CHAR;
- ESC : BOOLEAN;
- IPF : BYTE;
- BEGIN { CONFIG }
- READCONFIG;
- CLRSCR;
- IF NOT ADDEDITCOMMAND(RSUSER0,1,72 SHL 8,0) THEN BEGIN END;
- IF NOT ADDEDITCOMMAND(RSUSER1,1,80 SHL 8,0) THEN BEGIN END;
- IF NOT ADDEDITCOMMAND(RSUSER2,1,9,0) THEN BEGIN END;
- FORCEUPPER := TRUE;
-
- IPF := 3;
- REPEAT
- CH1 := #0;
- CH2 := #0;
- RSCHWORD := 0;
- TEXTATTR := $4E;
- GOTOXY(1,1);
- CLREOL;
- WRITE(' <Esc> = Konfiguration Ende');
- TEXTATTR := $07;
- GOTOXY(1,3); WRITE(' Konfigurieren Programm ',PROGNAME);
- GOTOXY(1,5); WRITE('Default- Suchmaske : ',DEFMASK);
- GOTOXY(1,7); WRITE('Bei EGA VideoMode 12H verwenden : ');
- IF USEMODE12H THEN WRITE(' JA ') ELSE WRITE('NEIN');
- CLREOL;
- GOTOXY(1,9); WRITE(' Video- Modi : MAXX-1 MAXY-1 verwenden');
- TEXTATTR := $1B;
- GOTOXY(1,23); WRITE(' Auswählen der Eingabefelder durch Cursor auf/ab');
- CLREOL;
- GOTOXY(1,24); WRITE(' Die Abfrage J/N ? akzeptiert J oder Y für Ja, N für Nein');
- CLREOL;
- GOTOXY(1,25); WRITE(' Eingabe von HEX- Werten erfolgt durch Voranstellen von $ (z.B. $5E)');
- CLREOL;
- TEXTATTR := $07;
- FOR I := 4 TO 6 DO BEGIN
- GOTOXY(8,7+I);
- WRITE(HEXB(V[I].M),'H (',V[I].M,'), ',V[I].X:4,' * ',V[I].Y:4,' ');
- CASE I OF
- 4 : BEGIN
- WRITE(' 256 Farben ');
- IF USE64X48F2 THEN WRITE(' JA ') ELSE WRITE('NEIN');
- END;
- 5 : BEGIN
- WRITE(' 16 Farben ');
- IF USE80X60F1 THEN WRITE(' JA ') ELSE WRITE('NEIN');
- END;
- 6 : BEGIN
- WRITE(' 256 Farben ');
- IF USE80X60F2 THEN WRITE(' JA ') ELSE WRITE('NEIN');
- END;
- END; { CASE I }
- CLREOL;
- END; { NEXT I }
- GOTOXY(1,15); WRITE('VGA- Chip ET4000 : ');
- IF USEET4000 THEN WRITE(' JA ') ELSE WRITE('NEIN');
- CLREOL;
- GOTOXY(1,16); WRITE('Segment- Port- Adresse : ',HEXW(SEGPORT),' (',SEGPORT,')');
- GOTOXY(1,17); WRITE('minimaler freier HEAP : ',HEAPMIN);
- CASE IPF OF
- {$V-}
- 2 : READSTRING('',5,22,PRED(SIZEOF(DEFMASK)),$07,$0F,$0E,ESC,DEFMASK);
- {$V+}
- 3 : CH1 := JANEINABFRAGE(40,7,USEMODE12H);
-
- 4 : CH1 := JANEINABFRAGE(48,11,USE64X48F2);
- 5 : CH1 := JANEINABFRAGE(48,12,USE80X60F1);
- 6 : CH1 := JANEINABFRAGE(48,13,USE80X60F2);
-
- 7 : WERTABFRAGE(13,11,3, 0, 255,V[4].M);
- 8 : WERTABFRAGE(19,11,4,319,1199,V[4].X);
- 9 : WERTABFRAGE(26,11,4,199,1023,V[4].Y);
-
- 10 : WERTABFRAGE(13,12,3, 0, 255,V[5].M);
- 11 : WERTABFRAGE(19,12,4,319,1199,V[5].X);
- 12 : WERTABFRAGE(26,12,4,199,1023,V[5].Y);
-
- 13 : WERTABFRAGE(13,13,3, 0, 255,V[6].M);
- 14 : WERTABFRAGE(19,13,4,319,1199,V[6].X);
- 15 : WERTABFRAGE(26,13,4,199,1023,V[6].Y);
-
- 16 : CH1 := JANEINABFRAGE(31,15,USEET4000);
- 17 : WERTABFRAGE(32,16,4, 0,$3FF,SEGPORT);
- 18 : READLONGINT('',17,26,8,$07,$0F,512,65536,ESC,HEAPMIN);
- END; { CASE }
-
- IF CH1 = #0 THEN CH1 := CHAR(LO(RSCHWORD));
- IF CH2 = #0 THEN CH2 := CHAR(HI(RSCHWORD));
- CASE CH2 OF
- #72 : IF IPF > 2 THEN DEC(IPF);
- #80 : IF IPF < 18 THEN INC(IPF);
- END; { CASE HI(RSCHWORD }
- UNTIL CH1 = ^[;
- WRITECONFIG;
- CLRSCR;
- END; { CONFIG }
-
-
- FUNCTION DIRECTORY(VAR MASK:STRING):STRING;
- CONST DIRCOLORS : PICKCOLORARRAY = ($1B,$1E,$1E,$50,$1F,$50);
- { NORMAL, RAND, ÜBERSCHRIFT, CURSOR, DIRECTORIES, CURSOR AUF DIRECTORIES }
- VAR CH1 : CHAR;
- BEGIN
- PICKSRCH := STRINGALTSRCH {STRINGPICKSRCH} {CHARPICKSRCH} {CHARPICKNOW};
- GOTOXY(1,4);
- { XLO,YLO,YHI,SPALTEN }
- CASE GETFILENAME(MASK,ANYFILE,1,18,25,5,DIRCOLORS,NAME) OF
- 0 : BEGIN
- DIRRET := 0;
- IF PICKCHAR = #$C4 THEN BEGIN
- CONFIG;
- MASK := DEFMASK;
- NAME := '*';
- END;
- END;
- 1,2,3 : BEGIN
- WRITELN(MASK+' PFAD NICHT GEFUNDEN');
- NAME := '*';
- MASK := DEFAULTDRIVE + ':\*.TIF';
- INC(DIRRET);
- IF DIRRET > 2 THEN BEGIN
- WRITELN;
- WRITELN('Konfigurieren J/N ? ');
- REPEAT
- CH1 := UPCASE(READKEY);
- UNTIL CH1 IN ['Y','J','N',^[];
- IF (CH1 = 'N') OR (CH1 = ^[) THEN HALT;
- CONFIG;
- MASK := DEFMASK;
- END;
- END;
- 4 : BEGIN
- WRITELN('ZU WENIG SPEICHER');
- NAME := '';
- END;
- ELSE
- WRITELN('DOS ERROR');
- NAME := '';
- END; { CASE }
- DIRECTORY := NAME;
- END; { DIRECTORY }
-
-
- FUNCTION KANNICHNICH(VA:BYTE):BOOLEAN;
- CONST KNT : ARRAY[1..6] OF STRING =
- ('Dies Kompressionsverfahren kann nicht gelesen werden',
- 'Grayscale- Bilder müssen 4 oder 8 Bits per Sample haben',
- 'RGB- Bilder können nur mit 8 Bit / Pixel angezeigt werden',
- 'Eskönnen keine Palette- Farbbilder angezeigt werden',
- 'Für Graphikanzeige wird eine EGA- oder VGA- Karte benötigt',
- 'Grayscale- und Farbbilder können nur auf VGA- Karte gezeigt werden'
- );
- VAR CH1 : CHAR;
- ERR : BYTE;
- BEGIN
- ERR := 0;
- IF (COMPR <> 1) AND (COMPR <> $8005) AND (COMPR <> 2) THEN ERR := 1;
- IF (TIFCL = 2) AND NOT (BPS[1] IN [4,8]) THEN ERR := 2;
- IF (TIFCL = 4) AND NOT (BPS[1] = 8) THEN ERR := 3;
- IF TIFCL = 3 THEN ERR := 4;
- IF NOT (VA IN [4,5,7..12]) THEN ERR := 5;
- IF (TIFCL > 1) AND NOT (VA IN [7..12]) THEN ERR := 6;
-
- IF ERR = 0 THEN BEGIN
- KANNICHNICH := FALSE;
- END ELSE BEGIN
- KANNICHNICH := TRUE;
- TEXTATTR := $CE;
- GOTOXY(1,23); CLREOL;
- GOTOXY(1,24); CLREOL;
- GOTOXY(1,25); CLREOL;
- GOTOXY(3,24);
- WRITE(#7,KNT[ERR]);
- CH1 := READKEY; IF CH1 = #0 THEN CH1 := READKEY;
- END;
- END; { KANNICHNICH }
-
-
- PROCEDURE ZEIGEBILD;
- CONST MAXLIN = 3500;
- MSK : ARRAY[0..7] OF BYTE = ($80,$40,$20,$10,8,4,2,1);
- MSK2 : ARRAY[0..3] OF BYTE = ($C0,$30,$0C,$03);
-
- {
- XO / YO = X/Y- OFFSET IN FILE FÜR ANZEIGE
- SCW = BILDSCHIRMBREITE IN BYTES
- BW = BILDBREITE IN BYTES
- AL = AKTULELLE LÄNGE DES FILES; IST < IMGHIG,
- WENN NICHT ALLES IN DEN SPEICHER PASST
- SCH = BILDSCHIRMHÖHE; IST < GETMAXY, WENN AL < BILDSCHIRMLÄNGE IST
- MW = MOVE- BREITE IN BYTES; IST = SCW, WENN BW >= SCW, ANSONSTEN BW
- RW = READ- BREITE IN BYTES; IST IMGWID SHR 1 BEI 4- BIT GRAYSCALE
-
- PP,PP1 = ZWISCHENVARIABLE FÜR PACKBITS DEKOMPRESSION
-
- P = VGA- PALETTE FÜR RGB- PALETTE- WANDLUNG
- PZ = PALETTE- ZEIGER FÜR RGB- PALETTE- WANDLUNG
- COL = ZWISCHENBUFFER FÜR PIXELINFORMATION FÜR RGB- BILDER
-
- AUS TIFFUNIT :
- STP = STRIP- NR. DES IN ARBEIT BEFINDLICHEN STREIFENS
- SBC = STRIP BYTECOUNT DES IN ARBEIT BEFINDLICHEN STREIFENS
- }
- VAR XO,YO : INTEGER;
- VA,VM : BYTE; { VIDEOADAPTER / VIDEOMODE }
- TA,TM,O : BYTE;
- I,J,K,BW,SCH,AL,
- SCW,MW,RW,STP,
- W : WORD;
- CH1,CH2,CH3 : CHAR;
- CHG,HLP,SW : BOOLEAN;
- B : ARRAY[0..MAXLIN] OF BYTEARRPTR;
- B0 : PTRARRAY ABSOLUTE B;
- BB : BYTEARRPTR;
- L : LONGINT;
- P : VGAPALETTETYPE;
- PP,PP1 : BYTE;
- PZ : WORD;
- COL : COLORVALUE;
-
- BV : BYTE;
- BITS,BITC : WORD;
-
- { ERMITTELN DER FARBNUMMER AUS DEN 8- BIT- RGB- WERTEN,
- GGF. BILDEN EINES NEUEN PALETTE- EINTRAGS }
- FUNCTION PAL(C:COLORVALUE):BYTE;
- VAR I : WORD;
- BEGIN
- C.R := C.R SHR 2;
- C.G := C.G SHR 2;
- C.B := C.B SHR 2;
-
- PAL := 0;
- IF (C.R = 0) AND (C.G = 0) AND (C.B = 0) THEN EXIT;
- PAL := 15;
- IF (C.R = $3F) AND (C.G = $3F) AND (C.B = $3F) THEN EXIT;
- IF PZ < 1 THEN EXIT; { PALETTE- ÜBERLAUF }
- FOR I := 255 DOWNTO PZ DO BEGIN
- IF (C.R = P[I].R) AND (C.G = P[I].G) AND (C.B = P[I].B) THEN BEGIN
- PAL := I;
- EXIT;
- END;
- END; { NEXT I }
- IF PZ = 1 THEN BEGIN
- PAL := 0;
- END ELSE BEGIN
- DEC(PZ);
- IF PZ = 15 THEN PZ := 14;
- P[PZ] := C;
- PAL := PZ;
- VGASETCOLOR(PZ,P[PZ]);
- END;
- END; { PAL }
-
- FUNCTION MAX(W1,W2:WORD):WORD;
- BEGIN
- IF W1 > W2 THEN MAX := W1 ELSE MAX := W2;
- END; { MAX }
-
- PROCEDURE SHOWLINE(NR:WORD);
- BEGIN
- PARRPTR(B0,NR+YO);
- CASE TIFCL OF
- 1 : IF (NR + YO) <= PRED(AL) THEN BEGIN
- MOVE(B[NR+YO]^[XO],MEM[$A000:NR*SCW],MW);
- END;
- 2,4 : IF (NR + YO) <= PRED(AL) THEN BEGIN
- IF SCW > 320 THEN BEGIN
- L := LONGINT(SCW) * LONGINT(NR);
- SETSEG(L SHR 16);
- J := ((L + MW) AND $FFFF);
- IF J < MW THEN BEGIN
- { EINEN SEGMENTÜBERSCHNEIDENDEN MOVE IN 2 SCHRITTEN AUSFÜHREN }
- K := MW - J;
- MOVE(B[NR+YO]^[XO],MEM[$A000:NR*SCW],K);
- SETSEG(SUCC(L SHR 16));
- MOVE(B[NR+YO]^[XO+K],MEM[$A000:0],J);
- END ELSE MOVE(B[NR+YO]^[XO],MEM[$A000:NR*SCW],MW);
- END ELSE BEGIN
- MOVE(B[NR+YO]^[XO],MEM[$A000:NR*SCW],MW);
- END;
- END;
- END; { CASE TIFCL }
- END; { SHOWLINE }
-
-
- BEGIN { ZEIGEBILD }
- TA := TEXTATTR;
- TM := LASTMODE;
- DIRECTVIDEO := FALSE;
- VA := HI(VIDADAP);
- IF KANNICHNICH(VA) THEN EXIT;
-
- { DIVERSE VIDEO- PARAMETER NACH ART DES BILDES EINSTELLEN }
- CASE TIFCL OF
- 1 : BEGIN
- IF VA IN [4,5] THEN BEGIN
- { EGA }
- VM := 1; { EGA 640 * 350 / 16 }
- IF (IMGHIG > 400) AND USE80X60F1 THEN VM := 5; { EGAVGA / 800 * 600 }
- END ELSE BEGIN
- { VGA }
- VM := 2; { VGA 640 * 480 / 16 }
- IF (IMGHIG > 530) AND USE80X60F1 THEN VM := 5; { EGAVGA / 800 * 600 }
- END;
- SCW := SUCC(V[VM].X) SHR 3; { SCREENWIDTH IN BYTES }
- BW := IMGWID SHR 3;
- IF (IMGWID AND 7) <> 0 THEN INC(BW);
- RW := BW;
- SETVMODE(V[VM].M); { GRAPHIK INITIALISIEREN }
- TEXTATTR := $0F;
- END;
- 2,4 : BEGIN
- VM := 3; { VGA 320 * 200 / 256 }
- IF IMGHIG > 250 THEN BEGIN
- IF USE64X48F2 THEN VM := 4; { VGA 640 * 480 / 256 }
- IF (IMGHIG > 530) AND USE80X60F2
- THEN VM := 6; { VGA 800 * 600 / 256 }
- END;
- SCW := SUCC(V[VM].X); { SCREENWIDTH IN BYTES }
- SETVMODE(V[VM].M); { GRAPHIK INITIALISIEREN }
- CASE BPS[1] OF
- 4 : BEGIN
- RW := IMGWID SHR 1;
- IF (IMGWID AND 1) <> 0 THEN INC(RW);
- GRAYSCALE16;
- TEXTATTR := $0F;
- END;
- 8 : BEGIN
- RW := IMGWID;
- GRAYCURVE256;
- TEXTATTR := $FF;
- END;
- END; { CASE BPS[1] }
- BW := IMGWID;
- { TIFF- CLASS 3 = RGB }
- IF TIFCL = 4 THEN BEGIN
- RW := RW * 3;
- { PALETTE- VARIABLE VORBEREITEN }
- P[0].R := 0; P[0].G := 0; P[0].B := 0;
- P[15].R := $3F; P[15].G := $3F; P[15].B := $3F;
- VGASETCOLOR(15,P[15]);
- PZ := 256;
- TEXTATTR := $0F;
- END;
- END;
- END; { CASE TIFCL }
- IF BW < SCW THEN MW := BW ELSE MW := SCW;
- CHG := TRUE;
- HLP := TRUE;
- XO := 0;
- YO := 0;
-
- { BILD EINLESEN }
- GETMEM(BB,MAX(RW,BW));
- AL := PARRINIT(IMGHIG,BW,HEAPMIN);
-
- STP := 1;
- BSEEK(1,TIFF,STRI[STP].O); { SEEK(TIFF,STRI[STP].O); }
- SBC := STRI[STP].B;
- FOR I := 0 TO PRED(IMGHIG) DO BEGIN
- IF (I <= AL) THEN BEGIN
- PARRNEW(B0,I);
- CASE COMPR OF
- 1 : BEGIN { KEINE KOMPRESSION }
- BGET(1,TIFF,@BB^,RW);
- DEC(SBC,RW);
- END;
- { KOMPRESSION CCITT GROUP 3, 1- DIMENSIONAL }
- 2 : BEGIN
- BITC := 0;
- BBC := 0;
- SW := FALSE; { EINE ZEILE BEGINNT IMMER MIT WHITERUN }
- J := 0;
- K := 0;
- FILLCHAR(BB^,MAX(BW,RW),#0);
- REPEAT
- LIESCCITTRUN(SW,BITS,BV);
- INC(BITC,BITS);
- WHILE BITS > 0 DO BEGIN
- IF (K = 0) AND (BITS > 7) THEN BEGIN
- IF BV = 0 THEN FILLCHAR(BB^[J],BITS SHR 3,#$FF);
- INC(J,BITS SHR 3);
- BITS := BITS AND 7;
- END ELSE BEGIN
- IF BV = 0 THEN BB^[J] := BB^[J] OR MSK[K];
- INC(K);
- IF K > 7 THEN BEGIN
- INC(J);
- K := 0;
- END;
- DEC(BITS);
- END;
- END; { WHILE BITS > 0 }
- SW := NOT SW;
- UNTIL BITC >= IMGWID; { JEWEILS 1 ZEILE LESEN }
- END;
- ELSE { CASE COMPR }
- { KOMPRESSION PACKBITS }
- J := 0;
- REPEAT
- BGET(1,TIFF,@PP,1); { BLOCKREAD(TIFF,PP,1,K); }
- DEC(SBC);
- IF PP <> 128 THEN BEGIN
- IF PP < 128 THEN BEGIN
- BGET(1,TIFF,@BB^[J],SUCC(PP));
- DEC(SBC,SUCC(PP));
- INC(J,SUCC(PP));
- END ELSE BEGIN
- PP := SUCC(-PP);
- BGET(1,TIFF,@PP1,1); { BLOCKREAD(TIFF,PP1,1); }
- FILLCHAR(BB^[J],PP,CHAR(PP1));
- DEC(SBC,1);
- INC(J,PP);
- END;
- END; { IF PP = 128 }
- UNTIL J >= RW;
- END; { ELSECASE COMPR }
-
- { 4- BIT PER SAMPLE AUF 8 BIT PRO PIXEL DEHNEN }
- IF BPS[1] = 4 THEN BEGIN
- K := PRED(BW);
- FOR J := PRED(RW) DOWNTO 0 DO BEGIN
- BB^[K] := (BB^[J]) AND $0F;
- IF K > 0 THEN BEGIN
- DEC(K);
- BB^[K] := (BB^[J]) SHR 4;
- DEC(K);
- END;
- END; { NEXT J }
- END; { IF BPS[1] = 4 }
- { RGB- DATEN IN PALETTE- DATEN UMARBEITEN }
- IF TIFCL = 4 THEN BEGIN
- K := 0;
- FOR J := 0 TO PRED(BW) DO BEGIN
- MOVE(BB^[K],COL,3); INC(K,3);
- BB^[J] := PAL(COL);
- END; { NEXT J }
- END; { IF TIFCL = 4 }
-
- { ANZEIGE DER GELESENEN ZEILE }
- MOVE(BB^,B[I]^[0],BW);
- IF I <= V[VM].Y THEN BEGIN
- SHOWLINE(I);
- END ELSE BEGIN
- IF I MOD 50 = 0 THEN TICK; { LEBENSZEICHEN GEBEN }
- END;
-
- IF (STRI[1].B > 0) AND (SBC <= 0) THEN BEGIN
- INC(STP);
- BSEEK(1,TIFF,STRI[STP].O); { SEEK(TIFF,STRI[STP].O); }
- SBC := STRI[STP].B;
- END;
- END; { IF (I < MAXLIN) USW. }
- END; { NEXT I - EINE ZEILE VON FILE EINLESEN }
- { DAS BILD IST KOMPLETT EINGELESEN }
- SETSEG(0);
- PIEP;
-
- { BILD ANZEIGEN }
- IF AL < V[VM].Y THEN SCH := PRED(AL) ELSE SCH := V[VM].Y;
- REPEAT
- IF CHG THEN BEGIN
- FOR I := 0 TO SCH DO SHOWLINE(I);
- SETSEG(0);
- END; { IF CHG }
- { GGF. HILFETEXT ANZEIGEN }
- IF HLP THEN BEGIN
- GOTOXY(1,1);
- IF V[VM].X < 639 THEN BEGIN
- WRITE('<Esc> = Ende');
- IF (IMGWID > SUCC(V[VM].X)) OR (AL > SUCC(V[VM].Y)) THEN BEGIN
- WRITE(', Cursortasten = Scrollen');
- GOTOXY(1,2);
- WRITE('<Ctrl>-Cursortasten = schnell Scrollen');
- END;
- END ELSE BEGIN
- WRITE('<Esc> = Ende');
- IF (IMGWID > SUCC(V[VM].X)) OR (AL > SUCC(V[VM].Y)) THEN BEGIN
- WRITE(', Cursortasten = Scrollen, <Ctrl>-Cursortasten = schnell Scrollen ');
- END;
- END; { ELSEIF V[VM].X < 639 }
- GOTOXY(1,4);
- WRITE('<F5> = vertikal spiegeln');
- GOTOXY(1,5);
- WRITE('<F6> = horizontal spiegeln');
- IF (TIFCL < 3) THEN BEGIN
- GOTOXY(1,6);
- WRITE('<F7> = invertieren');
- END;
- GOTOXY(1,8);
- WRITE(SUCC(V[VM].X),' * ',SUCC(V[VM].Y),' MEMAVAIL = ',MEMAVAIL);
- IF AL <> IMGHIG THEN BEGIN
- GOTOXY(1,25);
- WRITE(' Speicherplatz für ',AL,' von ',IMGHIG,' Zeilen ');
- END;
- HLP := FALSE;
- END; { IF HLP }
- { JETZT WIRD SICH UM DIE TASTATUR GEKÜMMERT }
- CH1 := READKEY; IF CH1 = #0 THEN CH2 := READKEY ELSE CH2 := #0;
- {
- NACH ERKANNTEM TASTENDRUCK DEN TASTATURBUFFER LEEREN
- DAS VERHINDERT 'NACHLAUFEN' BEI LANGSAMEN BILDSCHIRMOPERATIONEN
- }
- WHILE KEYPRESSED DO CH3 := READKEY;
- CHG := TRUE;
- CASE CH2 OF
- {F1} #59 : BEGIN
- HLP := TRUE;
- CHG := FALSE;
- END;
- { PALETTE ANZEIGEN }
- {F2} #60 : BEGIN
- IF (TIFCL = 2) AND (BPS[1] = 8) THEN GRAYCURVE256;
- FOR I := 0 TO 20 DO BEGIN
- FOR J := 0 TO 255 DO MEM[$A000:I*SUCC(V[VM].X)+J] := J;
- END;
- CHG := FALSE;
- END;
- {F3} #61 : IF (TIFCL = 2) AND (BPS[1] = 8) THEN BEGIN
- GRAYSCALE256;
- FOR I := 0 TO 20 DO BEGIN
- FOR J := 0 TO 255 DO MEM[$A000:I*SUCC(V[VM].X)+J] := J;
- END;
- CHG := FALSE;
- END;
- {F5} #63 : BEGIN
- FOR I := 0 TO PRED(AL) SHR 1 DO BEGIN
- PARRPTR(B0,I);
- PARRPTR2(B0,PRED(AL)-I);
- MOVE(B[I]^,BB^,BW);
- MOVE(B[PRED(AL)-I]^,B[I]^,BW);
- MOVE(BB^,B[PRED(AL)-I]^,BW);
- END; { NEXT I }
- END;
- {F6} #64 : BEGIN
- FOR I := 0 TO PRED(AL) DO BEGIN
- PARRPTR(B0,I);
- MOVE(B[I]^,BB^,BW);
- FOR J := 0 TO PRED(BW) DO BEGIN
- IF TIFCL = 1 THEN BEGIN
- FOR K := 0 TO 7 DO BEGIN
- O := (O SHR 1) AND $7F;
- O := O OR (BB^[J] AND $80);
- BB^[J] := BB^[J] SHL 1;
- END;
- B[I]^[PRED(BW)-J] := O;
- END ELSE BEGIN
- B[I]^[PRED(BW)-J] := BB^[J];
- END;
- END; { NEXT J }
- IF I MOD 20 = 0 THEN TICK; { LEBENSZEICHEN GEBEN }
- END; { NEXT I }
- END;
- {F7} #65 : IF TIFCL < 3 THEN BEGIN
- IF BPS[1] = 4 THEN K := $0F ELSE K := $FF;
- FOR I := 0 TO PRED(AL) DO BEGIN
- PARRPTR(B0,I);
- FOR J := 0 TO PRED(BW) DO B[I]^[J] := B[I]^[J] XOR K;
- IF I MOD 40 = 0 THEN TICK; { LEBENSZEICHEN GEBEN }
- END; { NEXT I }
- END;
- { FILE SCHREIBEN }
- {F10} #68 : IF (BPS[1] IN [1,8]) AND
- (AL = IMGHIG) AND
- (COMPR = 1) THEN BEGIN
- GOTOXY(1,3);
- WRITE(#7,'File schreiben ?');
- CH1 := UPCASE(READKEY); IF CH1 = #0 THEN BEGIN
- CH1 := READKEY;
- CH1 := #0;
- END;
- IF CH1 IN ['J','Y'] THEN BEGIN
- WRITE(' --- moment bitte --- ');
- FSEEK(TIFF,STRI[1].O); { SEEK(TIFF,STRI[1].O); }
- FOR I := 0 TO PRED(IMGHIG) DO BEGIN
- PARRPTR(B0,I);
- FPUT(TIFF,@B[I]^[0],RW);
- END; { NEXT I }
- END;
- END ELSE BEGIN
- WRITE(#7#7#7);
- END;
- {UP} #72 : IF PRED(AL) > SCH THEN BEGIN
- DEC(YO,8);
- IF YO < 0 THEN YO := 0;
- END;
- {DN} #80 : IF PRED(AL) > SCH THEN BEGIN
- INC(YO,8);
- IF (YO + V[VM].Y) >= AL THEN YO := PRED(AL - V[VM].Y);
- END;
- {LE} #75 : IF IMGWID > V[VM].X THEN BEGIN
- IF XO > 0 THEN DEC(XO);
- END;
- {RI} #77 : IF IMGWID > V[VM].X THEN BEGIN
- IF (XO + SCW) < BW THEN INC(XO);
- END;
- {HO} #71 : IF PRED(AL) > SCH THEN BEGIN
- IF XO <> 0 THEN XO := 0
- ELSE YO := 0;
- IF (YO + V[VM].Y) > AL THEN YO := PRED(AL - V[VM].Y);
- END ELSE CHG := FALSE;
- {EN} #79 : BEGIN
- IF IMGWID > V[VM].X THEN BEGIN
- IF XO <> (BW - SCW) THEN BEGIN
- XO := BW - SCW;
- END ELSE BEGIN
- IF PRED(AL) > SCH THEN YO := PRED(AL - V[VM].Y);
- END;
- END ELSE BEGIN
- IF PRED(AL) > SCH THEN YO := PRED(AL - V[VM].Y);
- END;
- END;
- {CUP}#141,
- {PU} #73 : IF PRED(AL) > SCH THEN BEGIN
- DEC(YO,V[VM].Y SHR 1);
- IF YO < 0 THEN YO := 0;
- END ELSE CHG := FALSE;
- {CDN}#145,
- {PD} #81 : IF PRED(AL) > SCH THEN BEGIN
- INC(YO,V[VM].Y SHR 1);
- IF (YO + V[VM].Y) >= AL THEN YO := PRED(AL - V[VM].Y);
- END ELSE CHG := FALSE;
- {CLE}#115 : IF IMGWID > V[VM].X THEN BEGIN
- DEC(XO,SCW SHR 1);
- IF XO < 0 THEN XO := 0;
- END ELSE CHG := FALSE;
- {CRI}#116 : IF IMGWID > V[VM].X THEN BEGIN
- INC(XO,SCW SHR 1);
- IF XO > (BW - SCW) THEN XO := BW - SCW;
- END ELSE CHG := FALSE;
- ELSE
- IF CH1 <> ' ' THEN CHG := FALSE;
- END; { CASE CH2 }
- UNTIL CH1 = ^[;
- { <Esc> = ENDE ZEIGEBILD }
- PARRDISPOSE(B0);
- FREEMEM(BB,MAX(BW,RW));
- TEXTMODE(LASTMODE);
- TEXTATTR := TA;
- END; { ZEIGEBILD }
-
-
- BEGIN
- CLRSCR;
-
- GD := REGISTERBGIDRIVER(@EGAVGADRIVER);
- IF GD < 0 THEN BEGIN
- WRITELN('FEHLER REGISTERBGIDRIVER #',GD);
- HALT(1);
- END;
-
- DIRRET := 0;
- READCONFIG;
-
- EXPLODE := FALSE;
- IF NOT ADDPICKCOMMAND(PKSUSER0,1,68 SHL 8,0) THEN BEGIN END;
-
- NAME := '*';
- IF PARAMCOUNT = 0 THEN BEGIN
- MASK := DEFMASK;
- END ELSE BEGIN
- MASK := PARAMSTR(1);
- I := POS('.TIF',MASK);
- IF I = (LENGTH(MASK) - 3) THEN BEGIN
- NAME := MASK;
- WHILE (LENGTH(MASK) > 0) AND (MASK[LENGTH(MASK)] <> '\') DO DELETE(MASK,LENGTH(MASK),1);
- MASK := MASK + '*.TIF';
- END ELSE BEGIN
- IF MASK[LENGTH(MASK)] <> '\' THEN MASK := MASK + '\';
- MASK := MASK + '*.TIF';
- END;
- END;
- IF MASK[2] <> ':' THEN MASK := DEFAULTDRIVE + ':' + MASK;
-
- NM := '';
- REPEAT
- IF NAME = '*' THEN BEGIN
- TEXTATTR := $4E;
- GOTOXY(1,1);
- CLREOL;
- WRITE(NM,' <Esc> = Programm Ende, <Ret> = Auswahl, <F10> = Config');
- TEXTATTR := $07;
- GOTOXY(1,4);
- NAME := DIRECTORY(MASK);
- IF (NAME <> '*') AND (NAME <> '') THEN BEGIN
- MASK := JUSTPATHNAME(NAME);
- IF MASK[LENGTH(MASK)] <> '\' THEN MASK := MASK + '\';
- MASK := MASK + '*.TIF';
- END;
- END;
- IF (NAME <> '*') AND (NAME <> '') THEN BEGIN
- NM := NAME;
- CLRSCR;
- CASE ZEIGETIFF(NAME,TRUE) OF
- ^[ : NAME := '';
- ' ' : BEGIN
- ZEIGEBILD;
- DIRECTVIDEO := TRUE;
- TEXTATTR := $07;
- CLOSETIFF;
- CLRSCR;
- IF ZEIGETIFF(NAME,FALSE) = ' ' THEN {};
- CLOSETIFF;
- NAME := '*';
- END;
- '1' : BEGIN
- CLRSCR;
- WRITELN(STRC:6,' Strips : ');
- FOR I := 1 TO STRC DO WRITE(STRI[I].O:6,STRI[I].B:8,' ║');
- IF READKEY = ' ' THEN {};
-
- IF GRCC > 0 THEN BEGIN
- DIRECTVIDEO := FALSE;
- DETECTGRAPH(GD,GM);
- INITGRAPH(GD,GM,'');
- GOTOXY(1,1);
- WRITELN('Gray Response Curve <',GRU,'> (',GRCC,')');
- GRMAX := 0;
- FOR I := 1 TO GRCC DO BEGIN
- IF GRC[I] > GRMAX THEN GRMAX := GRC[I];
- END;
- RX := GETMAXX; RX := RX / GRCC;
- RY := GETMAXY - 20; RY := RY / GRMAX;
- MOVETO(0,GETMAXY - ROUND(GRC[1] * RY));
- FOR I := 1 TO GRCC DO
- LINETO(ROUND(RX * I),GETMAXY - ROUND(GRC[I] * RY));
-
- IF READKEY = ' ' THEN {};
- CLOSEGRAPH;
- DIRECTVIDEO := TRUE;
- END;
-
- CLOSETIFF;
- END;
- ELSE
- CLOSETIFF;
- NAME := '*';
- END; { CASE ZEIGETIFF }
- END;
- UNTIL NAME = '';
- GOTOXY(1,25);
- TEXTATTR := $07;
- END.
-
-