home *** CD-ROM | disk | FTP | other *** search
- unit Unit1;
-
- interface
-
- uses
- SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
- Forms, Dialogs, StdCtrls, Unit2, Unit3;
-
- type
- TGIFmainwin = class(TForm)
- GroupBox1: TGroupBox;
- MactoPCButton: TRadioButton;
- PCtoMacButton: TRadioButton;
- CustomButton: TRadioButton;
- GammaSlider: TScrollBar;
- Label1: TLabel;
- GammaLabel: TLabel;
- ConvertButton: TButton;
- Label2: TLabel;
- HelpButton: TButton;
- OpenDialog1: TOpenDialog;
- SaveDialog1: TSaveDialog;
- procedure GammaSliderChange(Sender: TObject);
- procedure CustomButtonClick(Sender: TObject);
- procedure MactoPCButtonClick(Sender: TObject);
- procedure PCtoMacButtonClick(Sender: TObject);
- procedure HelpButtonClick(Sender: TObject);
- procedure ConvertButtonClick(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- GIFmainwin: TGIFmainwin;
- c: char;
- errnum: integer;
- infile,outfile: file;
- infilename,outfilename: string[80];
- infilesize: longint; {Size of input file in bytes}
- totalread: longint; {Total # of bytes read from input file}
- gammain,gammaout: real;
- file_incomplete: boolean;
-
- implementation
-
- {$R *.DFM}
-
- procedure TGIFmainwin.GammaSliderChange(Sender: TObject);
- var
- gammastr: string[8];
- begin
- gammaout := GammaSlider.position / 10;
- str(gammaout:4:1, gammastr);
- GammaLabel.caption := 'New gamma value = ' + gammastr;
- end;
-
- procedure TGIFmainwin.CustomButtonClick(Sender: TObject);
- var
- gammastr: string[8];
- begin
- GammaSlider.position := round(gammaout * 10);
- str(gammaout:4:1, gammastr);
- GammaLabel.caption := 'New gamma value = ' + gammastr;
- Label1.visible := true;
- GammaSlider.visible := true;
- end;
-
- procedure TGIFmainwin.MactoPCButtonClick(Sender: TObject);
- begin
- Label1.visible := false;
- GammaSlider.visible := false;
- gammain := 1.0;
- gammaout := 1.8;
- GammaLabel.caption := 'New gamma value = 1.8';
- end;
-
- procedure TGIFmainwin.PCtoMacButtonClick(Sender: TObject);
- begin
- Label1.visible := false;
- GammaSlider.visible := false;
- gammain := 1.8;
- gammaout := 1.0;
- GammaLabel.caption := 'New gamma value = 1.0';
- end;
-
- procedure TGIFmainwin.HelpButtonClick(Sender: TObject);
- begin
- Unit2.AboutBox.ShowModal;
- end;
-
- procedure ErrorHandler;
- var
- errormessage: string[80];
- errnumstring: string[10];
- begin
- case errnum of
- 2: errormessage := 'File not found: ' + infilename + '.';
- 3: errormessage := 'Path not found: ' + infilename + '.';
- 4: errormessage := 'Too many open files.';
- 12: errormessage := 'Invalid file access code.';
- 15: errormessage := 'Invalid drive number.';
- 100: errormessage := 'Disk read error.';
- 101: errormessage := 'Disk write error.';
- 102: errormessage := 'File not assigned.';
- 103: errormessage := 'File not open.';
- 104: errormessage := 'File not open for input: ' + infilename + '.';
- 105: errormessage := 'File not open for output: ' + outfilename + '.';
- 150: errormessage := 'Disk is write-protected.';
- 152: errormessage := 'Drive not ready.';
- 156: errormessage := 'Disk seek error.';
- 162: errormessage := 'Hardware failure.';
- else
- begin
- str(errnum,errnumstring);
- errormessage := 'Unknown error #' + errnumstring + '.';
- end
- end;
- errormessage := errormessage + ' Program halted.';
- MessageDlg(errormessage, mtError, [mbOK], 0);
- halt;
- end; {of procedure ErrorHandler}
-
- procedure ConvertGIF;
- var
- pal: array[1..768] of char; {Holds GIF color table}
- originalheader: array[1..13] of char; {Holds GIF file header}
- buffer: array[1..2048] of char; {I/O file buffer}
- numread, numwritten: integer; {# of bytes read, written}
- byte,count,numin,temp: integer;
- gamma,pallum,devisor: real;
- errormessage: string[80];
- begin
- file_incomplete:=false; {Initialize error flag to no error}
- totalread := 0;
- blockread(infile,originalheader,13,numread); {Read GIF file header}
- errnum:=IOresult;
- if errnum<>0 then ErrorHandler;
- totalread := totalread + numread;
- GaugeWin.Gauge1.Progress := totalread;
- temp:=ord(originalheader[11]); {Get 11th element of header}
- temp:=temp and 7; {Begin calculating length of GIF color table...}
- numin:=2;
- count:=0;
- while count < temp do
- begin
- numin:=numin*2;
- inc(count);
- end;
- blockwrite(outfile,originalheader,13,numwritten); {Save GIF file header}
- errnum:=IOresult;
- if errnum<>0 then ErrorHandler;
- byte:=numin*3; {Finish calculating length of GIF color table}
- blockread(infile,pal,byte,numread); {Read GIF color table into buffer}
- errnum:=IOresult;
- if errnum<>0 then ErrorHandler;
- totalread := totalread + numread;
- GaugeWin.Gauge1.Progress := totalread;
- gamma:=gammain/gammaout; {Calculate new gamma}
- devisor:=255;
- devisor:=(exp(ln(devisor)*gamma))/255; { (255^gamma)/255) }
- for count:=1 to byte do {Begin converting GIF color table}
- begin
- if (ord(pal[count]) <> 0) and (ord(pal[count]) <> 255) then
- begin
- pallum:=ord(pal[count]);
- pallum:=(exp(ln(pallum)*gamma))/devisor; { (pallum^gamma)/devisor) }
- pallum:=int(pallum); {Convert real to integer}
- pal[count]:=chr(round(pallum)); {Round down}
- end;
- end;
- blockwrite(outfile,pal,byte,numwritten); {Write new GIF color table}
- errnum:=IOresult;
- if errnum<>0 then ErrorHandler;
- repeat
- blockread(infile,buffer,sizeof(buffer),numread); {Read a bunch of bytes}
- errnum:=IOresult;
- if errnum<>0 then ErrorHandler;
- totalread := totalread + numread;
- GaugeWin.Gauge1.Progress := totalread;
- blockwrite(outfile,buffer,numread,numwritten); {Save a bunch of bytes}
- errnum:=IOresult;
- if errnum<>0 then ErrorHandler;
- until (numread = 0) or (numwritten <> numread); {Continue until EOF}
- if numwritten <> numread then file_incomplete:=true; {I/O discrepancy?}
- system.close(infile);
- errnum:=IOresult;
- if errnum<>0 then ErrorHandler;
- system.close(outfile);
- errnum:=IOresult;
- if errnum<>0 then ErrorHandler;
- {Turn on system error checking here with $I+}
- {$I+}
- if file_incomplete = false then
- begin
- GaugeWin.GaugeLabel.caption := 'New file: ' + outfilename;
- GaugeWin.Cursor := crDefault;
- end
- else
- begin
- errormessage := outfilename + ' is incomplete. I/O error or disk full.';
- MessageDlg(errormessage, mtError, [mbOK], 0);
- end;
- end; {of procedure ConvertGIF}
-
- procedure TGIFmainwin.ConvertButtonClick(Sender: TObject);
- var
- warnMsg: String;
- begin
- infilename := '';
- outfilename := '';
- warnMsg := chr(10) + chr(13) + ' already exists. Replace it?';
- if OpenDialog1.Execute then
- infilename := OpenDialog1.filename
- else exit;
- if SaveDialog1.Execute then
- outfilename := SaveDialog1.filename
- else exit;
- if FileExists(outfilename) then
- if MessageDlg(outfilename + warnMsg, mtWarning, [mbYes, mbNo], 0) = mrNo then exit;
- assignfile(infile,infilename);
- assignfile(outfile,outfilename);
- {Turn off system error-checking here with $I-}
- {$I-}
- reset(infile,1);
- errnum:=IOresult;
- if errnum<>0 then ErrorHandler;
- rewrite(outfile,1);
- errnum:=IOresult;
- if errnum<>0 then ErrorHandler;
- infilesize := FileSize(infile);
- GaugeWin.GaugeLabel.caption := 'Converting ' + infilename + '...';
- GaugeWin.Gauge1.MinValue :=1;
- GaugeWin.Gauge1.MaxValue := infilesize;
- Unit3.GaugeWin.Show;
- ConvertGIF; {Convert the GIF file}
- end; {of procedure ConvertButtonClick}
-
- initialization
-
- begin {main}
- gammain := 1.0;
- gammaout := 1.8;
- file_incomplete := false;
- end;
- end.
-