--- oup/current/Tools/TxmpReplace.pas 2007/05/24 17:48:18 192 +++ oup/current/Tools/TxmpReplace.pas 2007/06/18 14:49:24 224 @@ -1,32 +1,36 @@ unit TxmpReplace; + interface + uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, Template, StdCtrls, ExtCtrls, - Functions, Data, OniImgClass, Menus, Buttons, TypeDefs; + Dialogs, _TemplateFileList, Menus, StdCtrls, Buttons, ComCtrls, ExtCtrls, + OniImgClass, TypeDefs; type - TForm_TxmpReplace = class(TForm_ToolTemplate) + TForm_TxmpReplace = class(TForm_TemplateFileList) group_options: TGroupBox; btn_replace: TButton; check_transparency: TCheckBox; check_fading: TCheckBox; - panel_txmppreview: TPanel; - btn_save: TButton; - image_txmppreview: TImage; - splitter_txmp: TSplitter; + GroupBox1: TGroupBox; + Splitter1: TSplitter; group_bmpselect: TGroupBox; image_bmppreview: TImage; panel_load: TPanel; btn_load: TButton; - opend: TOpenDialog; + image_txmppreview: TImage; + panel_txmppreview: TPanel; + btn_save: TButton; saved: TSaveDialog; + opend: TOpenDialog; procedure SelectFile(fileinfo: TFileInfo); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure btn_saveClick(Sender: TObject); procedure btn_loadClick(Sender: TObject); procedure btn_replaceClick(Sender: TObject); + procedure Splitter1Moved(Sender: TObject); private OniImage_Old: TOniImage; OniImage_New: TOniImage; @@ -35,18 +39,13 @@ type public end; -var - Form_TxmpReplace: TForm_TxmpReplace; - implementation {$R *.dfm} -uses Main, ConnectionManager, ImagingTypes; - - +uses + _TemplateFile, ConnectionManager, ImagingTypes; procedure TForm_TxmpReplace.SelectFile(fileinfo: TFileInfo); var - mem: TMemoryStream; fadingbyte, depthbyte, storebyte: Byte; begin fileid := fileinfo.ID; @@ -56,7 +55,7 @@ begin OniImage_Old.LoadFromTXMP(ConnectionID, fileid); old_size := OniImage_Old.GetImageSize(True); - OniImage_Old.DrawOnCanvas(image_txmppreview.Canvas, 0); + OniImage_Old.DrawOnCanvas(image_txmppreview.Canvas, 1); check_fading.Checked := OniImage_Old.HasMipMaps; // check_transparency.Checked := (depthbyte and $04) > 0; @@ -66,14 +65,23 @@ begin end; +procedure TForm_TxmpReplace.Splitter1Moved(Sender: TObject); +begin + inherited; + image_txmppreview.Picture.Assign(nil); + image_bmppreview.Picture.Assign(nil); + if Length(OniImage_Old.Images) > 0 then + OniImage_Old.DrawOnCanvas(image_txmppreview.Canvas, 1); + if Length(OniImage_New.Images) > 0 then + OniImage_New.DrawOnCanvas(image_bmppreview.Canvas, 1); +end; + procedure TForm_TxmpReplace.btn_loadClick(Sender: TObject); -var - mem: TMemoryStream; begin if opend.Execute then begin OniImage_New.LoadFromFile(opend.FileName); - OniImage_New.DrawOnCanvas(image_bmppreview.Canvas, 0); + OniImage_New.DrawOnCanvas(image_bmppreview.Canvas, 1); group_options.Enabled := True; end; end; @@ -88,6 +96,10 @@ var oldfading: Byte; datbyte: Word; mem: TMemoryStream; + new_storetype: Byte; + i: Integer; +const + powers: array[0..8] of Integer = (1, 2, 4, 8, 16, 32, 64, 128, 256); begin if filelist.ItemIndex >= 0 then begin @@ -97,6 +109,28 @@ begin else ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $9C, 4, @old_rawaddr); + if (OniImage_New.Width[1] > 256) or (OniImage_New.Height[1] > 256) then + begin + ShowMessage('Widht and height have to be smaller than or equal to 256.'); + Exit; + end; + for i := 0 to High(powers) do + if OniImage_New.Width[1] = powers[i] then + Break; + if i = Length(powers) then + begin + ShowMessage('Width has to be a power of 2 (1, 2, 4, 8, 16 ...)'); + Exit; + end; + for i := 0 to High(powers) do + if OniImage_New.Height[1] = powers[i] then + Break; + if i = Length(powers) then + begin + ShowMessage('Height has to be a power of 2 (1, 2, 4, 8, 16 ...)'); + Exit; + end; + if (OniImage_Old.Width[1] <> OniImage_New.Width[1]) or (OniImage_Old.Height[1] <> OniImage_New.Height[1]) then begin @@ -114,6 +148,29 @@ begin mem := TMemoryStream.Create; + case OniImage_New.Format of + ifX1R5G5B5: new_storetype := 1; + ifA1R5G5B5: new_storetype := 2; + ifA4R4G4B4: new_storetype := 0; + ifA8R8G8B8: + begin + new_storetype := 8; + OniImage_New.Format := ifX8R8G8B8; + end; + ifX8R8G8B8: new_storetype := 8; + ifDXT1: new_storetype := 9; + else + if OniImage_New.FormatInfo.HasAlphaChannel then + ShowMessage('Loaded image has an alpha-channel.' + #13#10 + + 'Because the format is neither ARGB1555' +#13#10 + + 'nor ARGB4444 it can not be imported without conversion.' + #13#10 + + 'It is converted to RGB888, so alpha gets dropped.' + #13#10 + + 'If you need alpha you have to save your image in' + #13#10 + + 'one of the previously named formats.'); + OniImage_New.Format := ifX8R8G8B8; + new_storetype := 8; + end; + OniImage_New.SaveDataToStream(check_fading.Checked, TStream(mem)); newsize := mem.Size; @@ -121,17 +178,17 @@ begin if (newsize > old_size) and (ConManager.Connection[ConnectionID].Backend = DB_ONI) then new_rawaddr := ConManager.Connection[ConnectionID].AppendRawFile( - not (ConManager.Connection[ConnectionID].DataOS = DOS_WIN), - mem.Size, mem) + not (ConManager.Connection[ConnectionID].DataOS = DOS_WIN), mem) else begin new_rawaddr := old_rawaddr; ConManager.Connection[ConnectionID].UpdateRawFile(fileid, $9C, mem); end; - datbyte := $00; if check_fading.Checked then - datbyte := datbyte or $01; + oldfading := oldfading or $01 + else + oldfading := oldfading and (not Byte($01)); ConManager.Connection[ConnectionID].UpdateDatFilePart(fileid, $88, 1, @datbyte); datbyte := $10; // if check_transparency.Checked then @@ -141,27 +198,14 @@ begin ConManager.Connection[ConnectionID].UpdateDatFilePart(fileid, $8C, 2, @datbyte); datbyte := OniImage_New.Height[1]; ConManager.Connection[ConnectionID].UpdateDatFilePart(fileid, $8E, 2, @datbyte); - case OniImage_New.Format of - ifA1R5G5B5: datbyte := 2; - ifA4R4G4B4: datbyte := 0; - ifA8R8G8B8: - begin - datbyte := 8; - OniImage_New.Format := ifX8R8G8B8; - end; - ifX8R8G8B8: datbyte := 8; - ifDXT1: datbyte := 9; - else - OniImage_New.Format := ifX8R8G8B8; - datbyte := 8; - end; - ConManager.Connection[ConnectionID].UpdateDatFilePart(fileid, $90, 1, @datbyte); + ConManager.Connection[ConnectionID].UpdateDatFilePart(fileid, $90, 1, @new_storetype); if not (ConManager.Connection[ConnectionID].DataOS = DOS_WIN) then ConManager.Connection[ConnectionID].UpdateDatFilePart(fileid, $A0, 4, @new_rawaddr) else ConManager.Connection[ConnectionID].UpdateDatFilePart(fileid, $9C, 4, @new_rawaddr); ShowMessage('TXMP-image replaced'); + Self.listClick(Self); end; end; @@ -199,4 +243,5 @@ end; begin AddToolListEntry('txmpreplace', 'TXMP Replacer', 'TXMP'); -end. \ No newline at end of file +end. +