Index: oup/current/Global/Img_DDSTypes.pas
===================================================================
--- oup/current/Global/Img_DDSTypes.pas	(revision 181)
+++ oup/current/Global/Img_DDSTypes.pas	(revision 181)
@@ -0,0 +1,69 @@
+unit Img_DDSTypes;
+interface
+
+type
+  TPIXELFORMAT = packed record
+    Size         : Integer;
+    Flags        : Integer;
+    FOURCC       : array[1..4] of Char;
+    RGBBitCount  : Integer;
+    RBitMask     : LongWord;
+    GBitMask     : LongWord;
+    BBitMask     : LongWord;
+    AlphaBitMask : LongWord;
+  end;
+
+  TDDSCAPS2 = packed record
+    Caps1       : Integer;
+    Caps2       : Integer;
+    Reserved    : array[1..2] of Integer;
+  end;
+
+  TSURFACEDESC2 = packed record
+    Size        : Integer;
+    Flags       : Integer;
+    Height      : Integer;
+    Width       : Integer;
+    PitchOrLinearSize : Integer;
+    Depth       : Integer;
+    MipMapCount : Integer;
+    Reserved    : array[1..11] of Integer;
+    PIXELFORMAT : TPIXELFORMAT;
+    DDSCAPS2    : TDDSCAPS2;
+    Reserved2   : Integer;
+  end;
+
+  TDDSDXTHeader = packed record
+    FOURCC       : array[1..4] of Char;
+    SURFACEDESC2 : TSURFACEDESC2;
+  end;
+
+const
+  DDSD_CAPS : Integer = $00000001;
+  DDSD_HEIGHT : Integer = $00000002;
+  DDSD_WIDTH : Integer = $00000004;
+  DDSD_PITCH : Integer = $00000008;
+  DDSD_PIXELFORMAT : Integer = $00001000;
+  DDSD_MIPMAPCOUNT : Integer = $00020000;
+  DDSD_LINEARSIZE : Integer = $00080000;
+  DDSD_DEPTH : Integer = $00800000;
+
+  DDPF_ALPHAPIXELS : Integer = $00000001;
+  DDPF_FOURCC : Integer = $00000004;
+  DDPF_RGB : Integer = $00000040;
+
+  DDSCAPS_COMPLEX : Integer = $00000008;
+  DDSCAPS_TEXTURE : Integer = $00001000;
+  DDSCAPS_MIPMAP : Integer = $00400000;
+
+  DDSCAPS2_CUBEMAP : Integer = $00000200;
+  DDSCAPS2_CUBEMAP_POSITIVEX : Integer = $00000400;
+  DDSCAPS2_CUBEMAP_NEGATIVEX : Integer = $00000800;
+  DDSCAPS2_CUBEMAP_POSITIVEY : Integer = $00001000;
+  DDSCAPS2_CUBEMAP_NEGATIVEY : Integer = $00002000;
+  DDSCAPS2_CUBEMAP_POSITIVEZ : Integer = $00004000;
+  DDSCAPS2_CUBEMAP_NEGATIVEZ : Integer = $00008000;
+  DDSCAPS2_VOLUME : Integer = $00200000;
+
+implementation
+end.
Index: oup/current/Global/OniImgClass.pas
===================================================================
--- oup/current/Global/OniImgClass.pas	(revision 178)
+++ oup/current/Global/OniImgClass.pas	(revision 181)
@@ -3,8 +3,10 @@
 interface
 
-uses Math, Dialogs, Types, SysUtils, Classes, Data, ConnectionManager, TypeDefs;
+uses Math, Dialogs, Types, SysUtils, Classes, Data, ConnectionManager, TypeDefs,
+  Imaging, ImagingTypes;
 
 type
   TImgDataType = set of (DT_OniReverted, DT_Oni, DT_Decoded32);
+
 
 type
@@ -18,4 +20,6 @@
     FStoreType: Byte;
 
+    FImage:     TImageData;
+
     function ResizeImage(oldx, oldy: Integer; img: TByteData): TByteData;
     procedure RevertImage;
@@ -23,4 +27,5 @@
   protected
   public
+    property Image:     TImageData   Read FImage     Write FImage;
     property Loaded:    Boolean      Read FLoaded    Write FLoaded;
     property DataType:  TImgDataType Read FDataType  Write FDataType;
@@ -36,4 +41,5 @@
     function LoadFromTXMP(ConnectionID, FileID: Integer): Boolean;
     function LoadFromTXMB(ConnectionID, FileID: Integer): Boolean;
+    function GetImgSize(w,h, storetype: Integer): Integer;
     function GetImageDataSize(fading: Boolean): Integer;
 
@@ -57,6 +63,5 @@
 
 //uses Functions;
-
-
+uses Img_DDSTypes;
 
 
@@ -70,4 +75,6 @@
   Self.FDepth     := 0;
   Self.FStoreType := 0;
+
+  InitImage(FImage);
 end;
 
@@ -473,10 +480,14 @@
 var
   img_addr: Integer;
+  data: TMemoryStream;
+  hdr: TDDSDXTHeader;
+  imginfo: Integer;
+  x,y, i: Integer;
 begin
   Result := True;
   ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $8C, SizeOf(Self.FWidth), @Self.FWidth);
   ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $8E, SizeOf(Self.FHeight), @Self.FHeight);
-  ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $90, SizeOf(Self.FStoreType),
-    @Self.FStoreType);
+  ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $90, SizeOf(Self.FStoreType), @Self.FStoreType);
+  ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $88, SizeOf(imginfo), @imginfo);
   if ConManager.Connection[ConnectionID].DataOS = DOS_WIN then
     ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $9C, SizeOf(img_addr), @img_addr)
@@ -486,18 +497,9 @@
   case Self.FStoreType of
     0, 1, 2:
-    begin
-      SetLength(Self.FData, Self.FWidth * Self.FHeight * 2);
       Self.FDepth := 16;
-    end;
     8:
-    begin
-      SetLength(Self.FData, Self.FWidth * Self.FHeight * 4);
       Self.FDepth := 32;
-    end;
     9:
-    begin
-      SetLength(Self.FData, Self.FWidth * Self.FHeight div 2);
       Self.FDepth := 16;
-    end;
     else
       Result := False;
@@ -505,9 +507,57 @@
   end;
 
+  if ConManager.Connection[ConnectionID].DataOS = DOS_WIN then
+    ConManager.Connection[ConnectionID].LoadRawFile(fileid, $9C, TStream(data))
+  else
+    ConManager.Connection[ConnectionID].LoadRawFile(fileid, $A0, TStream(data));
+
+  with hdr do
+  begin
+    FOURCC := 'DDS ';
+    with SURFACEDESC2 do
+    begin
+      Size := 124;
+      Flags := DDSD_CAPS or DDSD_PIXELFORMAT or DDSD_WIDTH or DDSD_HEIGHT;
+      if FStoreType = 9 then
+        Flags := Flags or DDSD_LINEARSIZE
+      else
+        Flags := Flags or DDSD_PITCH;
+      if (imginfo and $01) > 0 then
+        Flags := Flags or DDSD_MIPMAPCOUNT;
+      Height := FHeight;
+      Width := FWidth;
+      if FStoreType = 9 then
+        PitchOrLinearSize := FWidth * FHeight div 2
+      else
+        PitchOrLinearSize := FWidth * FDepth div 2;
+      Depth := 0;
+      MipMapCount := 1;
+      x := FWidth;
+      y := FHeight;
+      while (x > 1) and (y > 1) do
+      begin
+        x := x div 2;
+        y := y div 2;
+        Inc(MipMapCount);
+      end;
+      for i := 1 to 11 do
+        Reserved[i] := 0;
+      with PIXELFORMAT do
+      begin
+        Size := 32;
+        if FStoreType = 9 then
+          Flags := DDPF_FOURCC
+        else
+          Flags := DDPF_RGB;
+      end;
+    end;
+  end; 
+  LoadImageFromStream(data, FImage);
+{
   if ConManager.Connection[ConnectionID].DataOS = DOS_WIN then
     ConManager.Connection[ConnectionID].LoadRawFile(fileid, $9C, FData)
   else
     ConManager.Connection[ConnectionID].LoadRawFile(fileid, $A0, FData);
-
+}
   Self.FDataType := [DT_OniReverted, DT_Oni];
 end;
@@ -584,4 +634,18 @@
 
 
+function TOniImage.GetImgSize(w,h, storetype: Integer): Integer;
+begin
+  case storetype of
+    0, 1, 2:
+      Result := w*h*2;
+    8:
+      Result := w*h*4;
+    9:
+      Result := Max(1, w div 4) * Max(1, h div 4) * 8;
+  else
+    Result := -1;
+  end;
+end;
+
 
 function TOniImage.GetImageDataSize(fading: Boolean): Integer;
@@ -589,19 +653,4 @@
   size: Integer;
   x, y: Word;
-
-  function GetImgSize(w,h, storetype: Integer): Integer;
-  begin
-    case storetype of
-      0, 1, 2:
-        Result := w*h*2;
-      8:
-        Result := w*h*4;
-      9:
-        Result :=  Max(1, w div 4) * Max(1, h div 4) * 8;
-    else
-      Result := -1;
-    end;
-  end;
-
 begin
   x    := Self.FWidth;
