123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322 |
- unit demo1;
- interface
- uses
- Windows, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- ExtCtrls, StdCtrls, ExtDlgs, lcms2dll, ComCtrls;
- type
- TForm1 = class(TForm)
- Image1: TImage;
- Image2: TImage;
- Panel1: TPanel;
- Splitter1: TSplitter;
- Button2: TButton;
- ComboBoxInput: TComboBox;
- ComboBoxOutput: TComboBox;
- Label1: TLabel;
- Label2: TLabel;
- WBCompensation: TCheckBox;
- NoTransform: TCheckBox;
- RadioGroup1: TRadioGroup;
- OpenPictureDialog1: TOpenPictureDialog;
- Button1: TButton;
- ProgressBar1: TProgressBar;
- ComboBoxIntent: TComboBox;
- Label3: TLabel;
- Button3: TButton;
- Button4: TButton;
- OpenDialog1: TOpenDialog;
- Label4: TLabel;
- ScrollBar1: TScrollBar;
- procedure Button2Click(Sender: TObject);
- procedure Button1Click(Sender: TObject);
- procedure Button3Click(Sender: TObject);
- procedure Button4Click(Sender: TObject);
- procedure ComboBoxIntentChange(Sender: TObject);
- procedure ScrollBar1Change(Sender: TObject);
- private
- { Private declarations }
- function ComputeFlags: DWORD;
- public
- constructor Create(Owner: TComponent); Override;
- { Public declarations }
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.DFM}
- CONST
- IS_INPUT = $1;
- IS_DISPLAY = $2;
- IS_COLORSPACE = $4;
- IS_OUTPUT = $8;
- IS_ABSTRACT = $10;
- VAR
- IntentCodes: array [0 .. 20] of cmsUInt32Number;
- FUNCTION InSignatures(Signature: cmsProfileClassSignature; dwFlags: DWORD): Boolean;
- BEGIN
- if (((dwFlags AND IS_DISPLAY) <> 0) AND (Signature = cmsSigDisplayClass)) then
- InSignatures := TRUE
- else if (((dwFlags AND IS_OUTPUT) <> 0) AND (Signature = cmsSigOutputClass))
- then
- InSignatures := TRUE
- else if (((dwFlags AND IS_INPUT) <> 0) AND (Signature = cmsSigInputClass))
- then
- InSignatures := TRUE
- else if (((dwFlags AND IS_COLORSPACE) <> 0) AND
- (Signature = cmsSigColorSpaceClass)) then
- InSignatures := TRUE
- else if (((dwFlags AND IS_ABSTRACT) <> 0) AND
- (Signature = cmsSigAbstractClass)) then
- InSignatures := TRUE
- else
- InSignatures := FALSE
- END;
- PROCEDURE FillCombo(var Combo: TComboBox; Signatures: DWORD);
- var
- Files, Descriptions: TStringList;
- Found: Integer;
- SearchRec: TSearchRec;
- Path, Profile: String;
- Dir: ARRAY [0 .. 1024] OF Char;
- hProfile: cmsHPROFILE;
- Descrip: array [0 .. 256] of Char;
- begin
- Files := TStringList.Create;
- Descriptions := TStringList.Create;
- GetSystemDirectory(Dir, 1023);
- Path := String(Dir) + '\SPOOL\DRIVERS\COLOR\';
- Found := FindFirst(Path + '*.ic?', faAnyFile, SearchRec);
- while Found = 0 do
- begin
- Profile := Path + SearchRec.Name;
- hProfile := cmsOpenProfileFromFile(PAnsiChar(AnsiString(Profile)), 'r');
- if (hProfile <> NIL) THEN
- begin
- if ((cmsGetColorSpace(hProfile) = cmsSigRgbData) AND InSignatures
- (cmsGetDeviceClass(hProfile), Signatures)) then
- begin
- cmsGetProfileInfo(hProfile, cmsInfoDescription, 'EN', 'us', Descrip,
- 256);
- Descriptions.Add(Descrip);
- Files.Add(Profile);
- end;
- cmsCloseProfile(hProfile);
- end;
- Found := FindNext(SearchRec);
- end;
- FindClose(SearchRec);
- Combo.Items := Descriptions;
- Combo.Tag := Integer(Files);
- end;
- // A rather simple Logger... note the "cdecl" convention
- PROCEDURE ErrorLogger(ContextID: cmsContext; ErrorCode: cmsUInt32Number;
- Text: PAnsiChar); Cdecl;
- begin
- MessageBox(0, PWideChar(WideString(Text)), 'Something is going wrong...',
- MB_OK OR MB_ICONWARNING or MB_TASKMODAL);
- end;
- constructor TForm1.Create(Owner: TComponent);
- var
- IntentNames: array [0 .. 20] of PAnsiChar;
- i, n: Integer;
- begin
- inherited Create(Owner);
- // Set the logger
- cmsSetLogErrorHandler(ErrorLogger);
- ScrollBar1.Min := 0;
- ScrollBar1.Max := 100;
- FillCombo(ComboBoxInput, IS_INPUT OR IS_COLORSPACE OR IS_DISPLAY);
- FillCombo(ComboBoxOutput, $FFFF );
- // Get the supported intents
- n := cmsGetSupportedIntents(20, @IntentCodes, @IntentNames);
- ComboBoxIntent.Items.BeginUpdate;
- ComboBoxIntent.Items.Clear;
- for i:= 0 TO n - 1 DO
- ComboBoxIntent.Items.Add(String(IntentNames[i]));
- ComboBoxIntent.ItemIndex := 0;
- ComboBoxIntent.Items.EndUpdate;
- end;
- procedure TForm1.ScrollBar1Change(Sender: TObject);
- var d: Integer;
- s: String;
- begin
- d := ScrollBar1.Position;
- Str(d, s);
- Label4.Caption := 'Adaptation state '+s + '% (Abs. col only)';
- end;
- procedure TForm1.Button2Click(Sender: TObject);
- begin
- if OpenPictureDialog1.Execute then
- begin
- Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
- Image1.Picture.Bitmap.PixelFormat := pf24bit;
- Image2.Picture.LoadFromFile(OpenPictureDialog1.FileName);
- Image2.Picture.Bitmap.PixelFormat := pf24bit;
- end
- end;
- function SelectedFile(var Combo: TComboBox): string;
- var
- List: TStringList;
- n: Integer;
- begin
- List := TStringList(Combo.Tag);
- n := Combo.ItemIndex;
- if (n >= 0) then
- SelectedFile := List.Strings[n]
- else
- SelectedFile := Combo.Text;
- end;
- procedure TForm1.ComboBoxIntentChange(Sender: TObject);
- begin
- ScrollBar1.Enabled := (ComboBoxIntent.itemIndex = 3);
- end;
- function TForm1.ComputeFlags: DWORD;
- var
- dwFlags: DWORD;
- begin
- dwFlags := 0;
- if (WBCompensation.Checked) then
- begin
- dwFlags := dwFlags OR cmsFLAGS_BLACKPOINTCOMPENSATION
- end;
- if (NoTransform.Checked) then
- begin
- dwFlags := dwFlags OR cmsFLAGS_NULLTRANSFORM
- end;
- case RadioGroup1.ItemIndex of
- 0:
- dwFlags := dwFlags OR cmsFLAGS_NOOPTIMIZE;
- 1:
- dwFlags := dwFlags OR cmsFLAGS_HIGHRESPRECALC;
- 3:
- dwFlags := dwFlags OR cmsFLAGS_LOWRESPRECALC;
- end;
- ComputeFlags := dwFlags
- end;
- procedure TForm1.Button1Click(Sender: TObject);
- var
- Source, Dest: String;
- hSrc, hDest: cmsHPROFILE;
- xform: cmsHTRANSFORM;
- i, PicW, PicH: Integer;
- Intent: Integer;
- dwFlags: DWORD;
- begin
- Source := SelectedFile(ComboBoxInput);
- Dest := SelectedFile(ComboBoxOutput);
- dwFlags := ComputeFlags;
- Intent := IntentCodes[ComboBoxIntent.ItemIndex];
- cmsSetAdaptationState( ScrollBar1.Position / 100.0 );
- if (Source <> '') AND (Dest <> '') then
- begin
- hSrc := cmsOpenProfileFromFile(PAnsiChar(AnsiString(Source)), 'r');
- hDest := cmsOpenProfileFromFile(PAnsiChar(AnsiString(Dest)), 'r');
- if (hSrc <> Nil) and (hDest <> Nil) then
- begin
- xform := cmsCreateTransform(hSrc, TYPE_BGR_8, hDest, TYPE_BGR_8, Intent,
- dwFlags);
- end
- else
- begin
- xform := nil;
- end;
- if hSrc <> nil then
- begin
- cmsCloseProfile(hSrc);
- end;
- if hDest <> Nil then
- begin
- cmsCloseProfile(hDest);
- end;
- if (xform <> nil) then
- begin
- PicW := Image2.Picture.width;
- PicH := Image2.Picture.height;
- ProgressBar1.Min := 0;
- ProgressBar1.Max := PicH;
- ProgressBar1.Step := 1;
- for i := 0 TO (PicH - 1) do
- begin
- if ((i MOD 100) = 0) then
- ProgressBar1.Position := i;
- cmsDoTransform(xform, Image1.Picture.Bitmap.Scanline[i],
- Image2.Picture.Bitmap.Scanline[i], PicW);
- end;
- ProgressBar1.Position := PicH;
- cmsDeleteTransform(xform);
- end;
- Image2.Repaint;
- ProgressBar1.Position := 0;
- end
- end;
- procedure TForm1.Button3Click(Sender: TObject);
- begin
- if OpenDialog1.Execute then
- ComboBoxInput.Text := OpenDialog1.FileName;
- end;
- procedure TForm1.Button4Click(Sender: TObject);
- begin
- if OpenDialog1.Execute then
- ComboBoxOutput.Text := OpenDialog1.FileName;
- end;
- end.
|