source: oup/current/Tool_TxmpReplace.pas @ 43

Last change on this file since 43 was 43, checked in by alloc, 17 years ago

DevTree 0.33a.

File size: 6.9 KB
Line 
1unit Tool_TxmpReplace;
2
3interface
4
5uses
6  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7  Dialogs, ExtCtrls, StdCtrls, StrUtils, Code_Functions, Data, Code_OniImgClass;
8
9type
10  TForm_TxmpReplace = class(TForm)
11    panel_12: TPanel;
12    group_txmpselect: TGroupBox;
13    splitter_txmp: TSplitter;
14    list_txmp: TListBox;
15    Splitter1: TSplitter;
16    group_bmpselect: TGroupBox;
17    panel_load: TPanel;
18    btn_load: TButton;
19    image_bmppreview: TImage;
20    opend:    TOpenDialog;
21    group_options: TGroupBox;
22    btn_replace: TButton;
23    check_transparency: TCheckBox;
24    check_fading: TCheckBox;
25    panel_txmppreview: TPanel;
26    btn_save: TButton;
27    image_txmppreview: TImage;
28    saved:    TSaveDialog;
29    procedure FormCreate(Sender: TObject);
30    procedure btn_saveClick(Sender: TObject);
31    procedure FormClose(Sender: TObject; var Action: TCloseAction);
32    procedure btn_replaceClick(Sender: TObject);
33    procedure btn_loadClick(Sender: TObject);
34    procedure list_txmpClick(Sender: TObject);
35    procedure Recreatelist;
36    procedure list_txmpMouseDown(Sender: TObject; Button: TMouseButton;
37      Shift: TShiftState; X, Y: Integer);
38  private
39    OniImage_Old: TOniImage;
40    OniImage_New: TOniImage;
41  public
42  end;
43
44var
45  Form_TxmpReplace: TForm_TxmpReplace;
46
47implementation
48
49uses Main, Code_OniDataClass;
50
51{$R *.dfm}
52
53
54
55procedure TForm_TxmpReplace.Recreatelist;
56var
57  files: TStringArray;
58  i:     LongWord;
59begin
60  list_txmp.Items.Clear;
61  files := OniDataConnection.GetFilesList('TXMP', '', True);
62  if Length(files) > 0 then
63    for i := 0 to High(files) do
64      list_txmp.Items.Add(files[i]);
65  group_bmpselect.Enabled := False;
66  check_transparency.Checked := False;
67  check_fading.Checked := False;
68end;
69
70
71
72
73procedure TForm_TxmpReplace.list_txmpClick(Sender: TObject);
74var
75  id:   LongWord;
76  Data: Tdata;
77  mem:  TMemoryStream;
78  fadingbyte, depthbyte, storebyte: Byte;
79begin
80  id := OniDataConnection.ExtractFileID(list_txmp.Items.Strings[list_txmp.ItemIndex]);
81  OniDataConnection.LoadDatFilePart(id, $88, SizeOf(fadingbyte), @fadingbyte);
82  OniDataConnection.LoadDatFilePart(id, $89, SizeOf(depthbyte), @depthbyte);
83  OniDataConnection.LoadDatFilePart(id, $90, SizeOf(storebyte), @storebyte);
84  check_fading.Checked := (fadingbyte and $01) > 0;
85  check_transparency.Checked := (depthbyte and $04) > 0;
86
87  OniImage_Old.LoadFromTXMP(id);
88  Data := OniImage_Old.GetAsBMP;
89  mem  := TMemoryStream.Create;
90  mem.Write(Data[0], Length(Data));
91  mem.Seek(0, soFromBeginning);
92  image_txmppreview.Picture.Bitmap.LoadFromStream(mem);
93  mem.Free;
94
95  group_bmpselect.Enabled := True;
96end;
97
98
99
100
101procedure TForm_TxmpReplace.list_txmpMouseDown(Sender: TObject;
102  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
103var
104  pt: TPoint;
105begin
106  pt.X := x;
107  pt.Y := y;
108  list_txmp.ItemIndex := list_txmp.ItemAtPos(pt, true);
109  if list_txmp.ItemIndex > -1 then
110    Self.list_txmpClick(Self);
111end;
112
113procedure TForm_TxmpReplace.btn_loadClick(Sender: TObject);
114var
115  mem:   TMemoryStream;
116  tempd: Tdata;
117begin
118  if opend.Execute then
119  begin
120    OniImage_New.LoadFromBMP(opend.FileName);
121    tempd := OniImage_New.GetAsBMP;
122    mem   := TMemoryStream.Create;
123    mem.Write(tempd[0], Length(tempd));
124    mem.Seek(0, soFromBeginning);
125    image_bmppreview.Picture.Bitmap.LoadFromStream(mem);
126    mem.Free;
127    group_options.Enabled := True;
128  end;
129end;
130
131
132
133
134procedure TForm_TxmpReplace.btn_replaceClick(Sender: TObject);
135var
136  id: LongWord;
137
138  oldsize, newsize: LongWord;
139  old_rawaddr, new_rawaddr: LongWord;
140  oldfading: Byte;
141  tempd:     Tdata;
142
143  datbyte: Word;
144begin
145  if list_txmp.ItemIndex >= 0 then
146  begin
147    id := OniDataConnection.ExtractFileID(list_txmp.Items.Strings[list_txmp.ItemIndex]);
148    OniDataConnection.LoadDatFilePart(id, $88, 1, @oldfading);
149    if OniDataConnection.OSisMac then
150      OniDataConnection.UpdateDatFilePart(id, $A0, 4, @old_rawaddr)
151    else
152      OniDataConnection.LoadDatFilePart(id, $9C, 4, @old_rawaddr);
153
154    if (OniImage_Old.Width <> OniImage_New.Width) or
155      (OniImage_Old.Height <> OniImage_New.Height) then
156    begin
157      if MessageBox(Self.Handle, PChar(
158        'Current image and new image have different size' + CrLf +
159        '(Current: ' + IntToStr(OniImage_Old.Width) +
160        'x' + IntToStr(OniImage_Old.Height) + ' - New: ' +
161        IntToStr(OniImage_New.Width) + 'x' + IntToStr(OniImage_New.Height) + ')' + CrLf +
162        'Replace anyways?'),
163        PChar(list_txmp.Items.Strings[list_txmp.ItemIndex]),
164        MB_YESNO) = idNo then
165        Exit;
166    end;
167
168    oldsize := OniImage_Old.GetImageDataSize((oldfading and $01) > 0);
169
170    if check_fading.Checked then
171      if not OniImage_New.GetMipMappedImage(tempd) then
172        if MessageBox(Self.Handle,
173          PChar('Can not create a MipMapped-image (probably because of a wrong dimension).' +
174          #13 + #10 + 'Do you want to continue without MipMapping?'), PChar('Warning'),
175          MB_YESNO) = ID_YES then
176          check_fading.Checked := False
177        else
178          Exit;
179
180    if not check_fading.Checked then
181      tempd := OniImage_New.GetAsData;
182
183    newsize := OniImage_New.GetImageDataSize(check_fading.Checked);
184    ShowMessage(IntToStr(newsize));
185
186    if (newsize > oldsize) and (OniDataConnection.Backend = ODB_Dat) then
187      new_rawaddr := OniDataConnection.AppendRawFile(
188        OniDataConnection.OSisMac, Length(tempd), tempd)
189    else
190    begin
191      new_rawaddr := old_rawaddr;
192      OniDataConnection.UpdateRawFile(id, $9C, Length(tempd), tempd);
193    end;
194
195    datbyte := $00;
196    if check_fading.Checked then
197      datbyte := datbyte or $01;
198    OniDataConnection.UpdateDatFilePart(id, $88, 1, @datbyte);
199    datbyte := $10;
200    if check_transparency.Checked then
201      datbyte := datbyte or $04;
202    OniDataConnection.UpdateDatFilePart(id, $89, 1, @datbyte);
203    OniDataConnection.UpdateDatFilePart(id, $8C, 2, @OniImage_New.Width);
204    OniDataConnection.UpdateDatFilePart(id, $8E, 2, @OniImage_New.Height);
205    datbyte := $08;
206    OniDataConnection.UpdateDatFilePart(id, $90, 1, @datbyte);
207    if OniDataConnection.OSisMac then
208      OniDataConnection.UpdateDatFilePart(id, $A0, 4, @new_rawaddr)
209    else
210      OniDataConnection.UpdateDatFilePart(id, $9C, 4, @new_rawaddr);
211
212    ShowMessage('TXMP-image replaced');
213  end;
214end;
215
216
217
218
219procedure TForm_TxmpReplace.FormClose(Sender: TObject; var Action: TCloseAction);
220begin
221  OniImage_Old.Free;
222  OniImage_New.Free;
223  Action := caFree;
224end;
225
226
227
228
229procedure TForm_TxmpReplace.FormCreate(Sender: TObject);
230begin
231  OniImage_Old := TOniImage.Create;
232  OniImage_New := TOniImage.Create;
233end;
234
235
236
237
238procedure TForm_TxmpReplace.btn_saveClick(Sender: TObject);
239begin
240  if saved.Execute then
241    OniImage_Old.WriteToBMP(saved.FileName);
242end;
243
244end.
Note: See TracBrowser for help on using the repository browser.