DEADSOFTWARE

system: implement zip support again
[d2df-editor.git] / src / editor / f_addresource_texture.pas
index 0ab28a5586e623ebc0580fdfca4cff372e36e060..b2551c5a661e7803d8ea043bcd1894a8bd2ab0f5 100644 (file)
@@ -10,7 +10,11 @@ uses
   StdCtrls, ExtCtrls, utils, Imaging, ImagingTypes, ImagingUtility;
 
 type
+
+  { TAddTextureForm }
+
   TAddTextureForm = class (TAddResourceForm)
+    lStats: TLabel;
     PanelTexPreview: TPanel;
     iPreview: TImage;
     eTextureName: TEdit;
@@ -35,6 +39,7 @@ type
 
 var
   AddTextureForm: TAddTextureForm;
+  NumFrames: Integer = 0;
 
 function IsAnim(Res: String): Boolean;
 function GetFrame(Res: String; var Data: Pointer; var DataLen: Integer;
@@ -56,7 +61,6 @@ var
   ResourceName: String;
   Data:         Pointer;
   Size:         Integer;
-  Sign:         Array [0..4] of Char;
   Sections,
   Resources:    SArray;
   a:            Integer;
@@ -81,16 +85,6 @@ begin
 
   WAD.FreeWAD();
 
-// Проверка сигнатуры. Если есть - это WAD внутри WAD:
-  CopyMemory(@Sign[0], Data, 5);
-
-  if not (Sign = DFWAD_SIGNATURE) then
-  begin
-    WAD.Free();
-    FreeMem(Data);
-    Exit;
-  end;
-
 // Пробуем прочитать данные:
   if not WAD.ReadMemory(Data, Size) then
   begin
@@ -142,7 +136,7 @@ begin
     Exit;
   end;
 
-// Ищем в них описание анимации - "AINM": 
+// Ищем в них описание анимации - "ANIM":
   ok := False;
   for a := 0 to High(Resources) do
     if Resources[a] = 'ANIM' then
@@ -157,8 +151,7 @@ begin
   Result := ok;
 end;
 
-function GetFrame(Res: String; var Data: Pointer; var DataLen: Integer;
-                  var Width, Height: Word): Boolean;
+function GetFrame(Res: String; var Data: Pointer; var DataLen: Integer; var Width, Height: Word): Boolean;
 var
   AnimWAD:      Pointer;
   WAD:          TWADEditor_1;
@@ -192,7 +185,7 @@ begin
     WAD.Free();
     Exit;
   end;
+
   WAD.FreeWAD();
 
 // Читаем WAD в WAD'е:
@@ -237,55 +230,51 @@ begin
   Result := True;
 end;
 
-function CreateBitMap(Data: Pointer; DataSize: Cardinal): TBitMap;
+function CreateBitMap (Data: Pointer; DataSize: Cardinal): TBitMap;
 var
-  img:        TImageData;
-  clr:        TColor32Rec;
-  bgc:        Byte;
-  ii:         PByte;
-  Width,
-  Height:     Integer;
-  x, y:       Integer;
-  BitMap:     TBitMap;
-
+  img: TImageData;
+  clr, bgc: TColor32Rec;
+  Width, Height: Integer;
+  x, y: Integer;
+  BitMap: TBitMap;
 begin
   Result := nil;
-
   InitImage(img);
   if not LoadImageFromMemory(Data, DataSize, img) then
     Exit;
 
   Width  := img.width;
   Height := img.height;
-
   BitMap := TBitMap.Create();
-  BitMap.PixelFormat := pf24bit;
-  
+  BitMap.PixelFormat := pf24bit;  
   BitMap.Width := Width;
   BitMap.Height := Height;
-
-// Копируем в BitMap:
-  ii := BitMap.RawImage.Data;
-  for y := 0 to height-1 do
+  for y := 0 to Height - 1 do
   begin
-    for x := 0 to width-1 do
+    for x := 0 to Width - 1 do
     begin
       clr := GetPixel32(img, x, y);
       // HACK: Lazarus's TBitMap doesn't seem to have a working 32 bit mode, so
       //       mix color with checkered background. Also, can't really read
       //       CHECKERS.tga from here. FUCK!
-      if (((x shr 3) and 1) = 0) xor (((y shr 3) and 1) = 0) then
-        bgc := 255
+      if UseCheckerboard then
+      begin
+        if (((x shr 3) and 1) = 0) xor (((y shr 3) and 1) = 0) then
+          bgc.Color := $FDFDFD
+        else
+          bgc.Color := $CBCBCB
+      end
       else
-        bgc := 200;
-      clr.r := ClampToByte((Byte(255 - clr.a) * bgc + clr.a * clr.r) div 255);
-      clr.g := ClampToByte((Byte(255 - clr.a) * bgc + clr.a * clr.g) div 255);
-      clr.b := ClampToByte((Byte(255 - clr.a) * bgc + clr.a * clr.b) div 255);
-      // TODO: check for RGB/BGR somehow?
-      ii^ := clr.b; Inc(ii);
-      ii^ := clr.g; Inc(ii);
-      ii^ := clr.r; Inc(ii);
-    end;
+      begin
+        bgc.r := GetRValue(PreviewColor);
+        bgc.g := GetGValue(PreviewColor);
+        bgc.b := GetBValue(PreviewColor)
+      end;
+      clr.r := ClampToByte((Byte(255 - clr.a) * bgc.r + clr.a * clr.r) div 255);
+      clr.g := ClampToByte((Byte(255 - clr.a) * bgc.g + clr.a * clr.g) div 255);
+      clr.b := ClampToByte((Byte(255 - clr.a) * bgc.b + clr.a * clr.b) div 255);
+      BitMap.Canvas.Pixels[x, y] := RGBToColor(clr.r, clr.g, clr.b)
+    end
   end;
   FreeImage(img);
   Result := BitMap;
@@ -302,7 +291,7 @@ var
   config:       TConfig;
   TextData:     Pointer;
   TextureData:  Pointer;
-  
+
 begin
   Result := nil;
   AnimWAD := nil;
@@ -326,18 +315,19 @@ begin
 
 // Читаем лист текстур:
   WAD.GetResource('TEXTURES', config.ReadStr('', 'resource', ''), TextureData, Len);
+  NumFrames := config.ReadInt('', 'framecount', 0);
 
   if (TextureData <> nil) and
      (WAD.GetLastError = DFWAD_NOERROR) then
   begin
   // Создаем BitMap из листа текстур:
     Result := CreateBitMap(TextureData, Len);
-    
+
   // Размеры одного кадра - виден только первый кадр:
     Result.Height := config.ReadInt('', 'frameheight', 0);
     Result.Width := config.ReadInt('', 'framewidth', 0);
   end;
+
   config.Free();
   WAD.Free();
 
@@ -385,7 +375,8 @@ procedure TAddTextureForm.FormActivate(Sender: TObject);
 begin
   Inherited;
 
-  cbWADList.Items.Add(_lc[I_WAD_SPECIAL_TEXS]);
+  lStats.Caption := '';
+  cbWADList.Items.Add(MsgWadSpecialTexs);
 
   eTextureName.Text := '';
   iPreview.Canvas.FillRect(iPreview.Canvas.ClipRect);
@@ -398,28 +389,37 @@ procedure TAddTextureForm.lbResourcesListClick(Sender: TObject);
 var
   Texture: TBitMap;
   wad: String;
+  Anim: Boolean;
 
 begin
   Inherited;
 
+  lStats.Caption := '';
   if lbResourcesList.ItemIndex = -1 then
     Exit;
   if FResourceName = '' then
     Exit;
-  if cbWADList.Text = _lc[I_WAD_SPECIAL_TEXS] then
+  if cbWADList.Text = MsgWadSpecialTexs then
     Exit;
 
   g_ProcessResourceStr(FFullResourceName, @wad, nil, nil);
-  if wad = _lc[I_WAD_SPECIAL_TEXS] then
+  if wad = MsgWadSpecialTexs then
     Exit;
 
-  if IsAnim(FFullResourceName) then
+  Anim := IsAnim(FFullResourceName);
+  if Anim then
     Texture := ShowAnim(FFullResourceName)
   else
     Texture := ShowTGATexture(FFullResourceName);
 
   if Texture = nil then
     Exit;
+
+  if Anim then
+    lStats.Caption := Format(MsgCapAnimation, [Texture.Width, Texture.Height, NumFrames])
+  else
+    lStats.Caption := Format(MsgCapTexture, [Texture.Width, Texture.Height]);
+
   iPreview.Canvas.FillRect(iPreview.Canvas.ClipRect);
   iPreview.Canvas.CopyRect(Texture.Canvas.ClipRect, Texture.Canvas, Texture.Canvas.ClipRect);
   Texture.Free();
@@ -462,7 +462,7 @@ end;
 
 procedure TAddTextureForm.cbWADListChange(Sender: TObject);
 begin
-  if cbWADList.Text = _lc[I_WAD_SPECIAL_TEXS] then
+  if cbWADList.Text = MsgWadSpecialTexs then
   begin
     cbSectionsList.Clear();
     cbSectionsList.Items.Add('..');
@@ -474,7 +474,7 @@ end;
 
 procedure TAddTextureForm.cbSectionsListChange(Sender: TObject);
 begin
-  if cbWADList.Text = _lc[I_WAD_SPECIAL_TEXS] then
+  if cbWADList.Text = MsgWadSpecialTexs then
   begin
     lbResourcesList.Clear();
     lbResourcesList.Items.Add(TEXTURE_NAME_WATER);