UNIT Unit7_txmpreplace;
INTERFACE
USES
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, StrUtils, Unit2_functions, Unit3_data, Unit6_imgfuncs;

TYPE
  TForm7 = Class(TForm)
    panel_12: TPanel;
    group_txmpselect: TGroupBox;
    splitter_txmp: TSplitter;
    list_txmp: TListBox;
    Splitter1: TSplitter;
    group_bmpselect: TGroupBox;
    panel_load: TPanel;
    btn_load: TButton;
    image_bmppreview: TImage;
    opend: TOpenDialog;
    group_options: TGroupBox;
    btn_replace: TButton;
    check_transparency: TCheckBox;
    check_fading: TCheckBox;
    panel_txmppreview: TPanel;
    btn_save: TButton;
    image_txmppreview: TImage;
    saved: TSaveDialog;
    procedure FormCreate(Sender: TObject);
    PROCEDURE btn_saveClick(Sender: TObject);
    PROCEDURE FormActivate(Sender: TObject);
    PROCEDURE FormClose(Sender: TObject; var Action: TCloseAction);
    PROCEDURE btn_replaceClick(Sender: TObject);
    PROCEDURE btn_loadClick(Sender: TObject);
    PROCEDURE list_txmpClick(Sender: TObject);
    PROCEDURE Recreatelist;
  PRIVATE
    OniImage_Old:TOniImage;
    OniImage_New:TOniImage;
  PUBLIC
  END;

VAR
  Form7: TForm7;

IMPLEMENTATION
USES Unit1_main, Unit15_Classes;
{$R *.dfm}

PROCEDURE TForm7.Recreatelist;
  VAR
    files:TStringArray;
    i:LongWord;
  BEGIN
    list_txmp.Items.Clear;
    files:=OniDataConnection.GetFilesList('TXMP','',True);
    IF Length(files)>0 THEN
      FOR i:=0 TO High(files) DO
        list_txmp.Items.Add(files[i]);
    group_bmpselect.Enabled:=False;
    check_transparency.Checked:=False;
    check_fading.Checked:=False;
  END;

  
PROCEDURE TForm7.list_txmpClick(Sender: TObject);
  VAR
    id:LongWord;
    data:Tdata;
    mem:TMemoryStream;
    fadingbyte,depthbyte,storebyte:Byte;
  BEGIN
    id:=OniDataConnection.ExtractFileID(list_txmp.Items.Strings[list_txmp.ItemIndex]);
    OniDataConnection.LoadDatFilePart(id,$88,SizeOf(fadingbyte),@fadingbyte);
    OniDataConnection.LoadDatFilePart(id,$89,SizeOf(depthbyte),@depthbyte);
    OniDataConnection.LoadDatFilePart(id,$90,SizeOf(storebyte),@storebyte);
    check_fading.Checked:=(fadingbyte AND $01)>0;
    check_transparency.Checked:=(depthbyte AND $04)>0;

    OniImage_Old.LoadFromTXMP(id);
    data:=OniImage_Old.GetAsBMP;
    mem:=TMemoryStream.Create;
    mem.Write(data[0],Length(data));
    mem.Seek(0,soFromBeginning);
    image_txmppreview.Picture.Bitmap.LoadFromStream(mem);
    mem.Free;

    group_bmpselect.Enabled:=True;
  END;

PROCEDURE TForm7.btn_loadClick(Sender: TObject);
  VAR
    mem:TMemoryStream;
    tempd:Tdata;
  BEGIN
    IF opend.Execute THEN BEGIN
      OniImage_New.LoadFromBMP(opend.FileName);
      tempd:=OniImage_New.GetAsBMP;
      mem:=TMemoryStream.Create;
      mem.Write(tempd[0],Length(tempd));
      mem.Seek(0,soFromBeginning);
      image_bmppreview.Picture.Bitmap.LoadFromStream(mem);
      mem.Free;
      group_options.Enabled:=True;
    END;
  END;

PROCEDURE TForm7.btn_replaceClick(Sender: TObject);
  VAR
    id:LongWord;

    oldsize,newsize:LongWord;
    old_rawaddr,new_rawaddr:LongWord;
    oldfading:Byte;
    tempd:Tdata;

    datbyte:Word;
  BEGIN
    IF list_txmp.ItemIndex>=0 THEN BEGIN
      id:=OniDataConnection.ExtractFileID(list_txmp.Items.Strings[list_txmp.ItemIndex]);
      OniDataConnection.LoadDatFilePart(id,$88,1,@oldfading);
      if OniDataConnection.OSisMac then
        OniDataConnection.UpdateDatFilePart(id,$A0,4,@old_rawaddr)
      else
        OniDataConnection.LoadDatFilePart(id,$9C,4,@old_rawaddr);

      IF (OniImage_Old.Width<>OniImage_New.Width) OR (OniImage_Old.Height<>OniImage_New.Height) THEN BEGIN
        IF MessageBox(Self.Handle,
                    PChar('Current image and new image have different size'+CrLf+
                            '(Current: '+IntToStr(OniImage_Old.Width)+'x'+IntToStr(OniImage_Old.Height)+
                            ' - New: '+IntToStr(OniImage_New.Width)+'x'+IntToStr(OniImage_New.Height)+')'+CrLf+
                            'Replace anyways?'),
                    PChar(list_txmp.Items.Strings[list_txmp.ItemIndex]),
                    MB_YESNO)=IDNO THEN Exit;
      END;

      oldsize:=OniImage_Old.GetImageDataSize((oldfading and $01)>0);

      IF check_fading.Checked THEN
        IF NOT OniImage_New.GetMipMappedImage(tempd) THEN
          IF MessageBox(Self.Handle, PChar('Can not create a MipMapped-image (probably because of a wrong dimension).'+#13+#10+'Do you want to continue without MipMapping?'), PChar('Warning'), MB_YESNO)=ID_YES THEN
            check_fading.Checked:=False
          ELSE
            Exit;

      IF NOT check_fading.Checked THEN
        tempd:=OniImage_New.GetAsData;

      newsize:=OniImage_New.GetImageDataSize(check_fading.Checked);
      ShowMessage(IntToStr(newsize));

      IF (newsize>oldsize) AND (OniDataConnection.Backend=ODB_Dat) THEN
        new_rawaddr:=OniDataConnection.AppendRawFile(OniDataConnection.OSisMac,Length(tempd),tempd)
      ELSE BEGIN
        new_rawaddr:=old_rawaddr;
        OniDataConnection.UpdateRawFile(id,$9C,Length(tempd),tempd);
      END;

      datbyte:=$00;
      IF check_fading.Checked THEN datbyte:=datbyte OR $01;
      OniDataConnection.UpdateDatFilePart(id,$88,1,@datbyte);
      datbyte:=$10;
      IF check_transparency.Checked THEN datbyte:=datbyte OR $04;
      OniDataConnection.UpdateDatFilePart(id,$89,1,@datbyte);
      OniDataConnection.UpdateDatFilePart(id,$8C,2,@OniImage_New.Width);
      OniDataConnection.UpdateDatFilePart(id,$8E,2,@OniImage_New.Height);
      datbyte:=$08;
      OniDataConnection.UpdateDatFilePart(id,$90,1,@datbyte);
      if OniDataConnection.OSisMac then
        OniDataConnection.UpdateDatFilePart(id,$A0,4,@new_rawaddr)
      else
        OniDataConnection.UpdateDatFilePart(id,$9C,4,@new_rawaddr);

      ShowMessage('TXMP-image replaced');
    END;
  END;

PROCEDURE TForm7.FormClose(Sender: TObject; var Action: TCloseAction);
  BEGIN
    OniImage_Old.Free;
    OniImage_New.Free;
    Action:=caFree;
    Form1.close_window(Self.Name);
  END;

PROCEDURE TForm7.FormCreate(Sender: TObject);
  BEGIN
    OniImage_Old:=TOniImage.Create;
    OniImage_New:=TOniImage.Create;
  END;

PROCEDURE TForm7.FormActivate(Sender: TObject);
  BEGIN
    Form1.SetActiveWindow(Self.Name);
  END;

PROCEDURE TForm7.btn_saveClick(Sender: TObject);
  BEGIN
    IF saved.Execute THEN
      OniImage_Old.WriteToBMP(saved.FileName);
  END;

END.
