--- oup/current/Global/OniImgClass.pas 2007/02/21 03:12:33 109 +++ oup/current/Global/OniImgClass.pas 2007/03/23 03:07:58 124 @@ -19,7 +19,6 @@ type function ResizeImage(oldx, oldy: Integer; img: TByteData): TByteData; procedure RevertImage; - procedure DecodeImage; procedure DecompressImage; protected public @@ -38,6 +37,8 @@ type function LoadFromTXMB(ConnectionID, FileID: Integer): Boolean; function GetImageDataSize(fading: Boolean): Integer; + procedure DecodeImageTo32bit; + procedure GetAsData(var Target: TStream); overload; procedure GetAsData(var Target: TByteData); overload; procedure GetAs32bit(var Target: TStream); overload; @@ -131,7 +132,7 @@ end; -procedure TOniImage.DecodeImage; +procedure TOniImage.DecodeImageTo32bit; var x, y: Integer; tempd: TByteData; @@ -140,7 +141,7 @@ begin begin SetLength(tempd, Self.FWidth * Self.FHeight * 4); case Self.FStoreType of - 0: + 0: // 16bit, RGB444, A4? begin for y := 0 to Self.FHeight - 1 do begin @@ -159,7 +160,7 @@ begin end; end; end; - 1, 2: + 1, 2: // 16bit, RGB555, A1? begin for y := 0 to Self.FHeight - 1 do begin @@ -178,7 +179,9 @@ begin end; end; end; - 9: + 8: // 32bit, RGB888, A8? + begin end; + 9: // Compressed, RGB565 begin DecompressImage; end; @@ -309,7 +312,6 @@ end; function TOniImage.Load(ConnectionID, FileID: Integer): Boolean; var FileInfo: TFileInfo; - ext: String; begin FileInfo := ConManager.Connection[ConnectionID].GetFileInfo(fileid); if FileInfo.Extension = 'PSpc' then @@ -369,7 +371,7 @@ begin end; txmpimg := TOniImage.Create; txmpimg.LoadFromTXMP(ConnectionID, PSpc.TXMP); - txmpimg.DecodeImage; + txmpimg.DecodeImageTo32bit; // txmpimg.WriteToBMP('C:\file.bmp'); txmpimg.GetAs32bit(txmpdata); { ShowMessage(IntToStr(txmpimg.Width)+'x'+IntToStr(txmpimg.Height)); @@ -534,7 +536,7 @@ begin link := link div 256; images_decoded[i] := TOniImage.Create; images_decoded[i].LoadFromTXMP(ConnectionID, link); - images_decoded[i].DecodeImage; + images_decoded[i].DecodeImageTo32bit; images_decoded[i].RevertImage; end; SetLength(Self.FData, Self.FWidth * Self.FHeight * 4); @@ -587,10 +589,15 @@ var size: Integer; x, y: Word; bpp: Byte; + minside: Byte; begin + minside := 1; case Self.FStoreType of 9: - bpp := 8; + begin + bpp := 4; + minside := 4; + end; 0, 1, 2: bpp := 16; 8: @@ -602,14 +609,14 @@ begin x := Self.FWidth; y := Self.FHeight; - size := x * y * bpp div 8; + size := (x * y * bpp) div 8; if fading then begin repeat x := x div 2; y := y div 2; - size := size + x * y * bpp div 8; - until (x = 1) or (y = 1); + size := size + (x * y * bpp) div 8; + until (x = minside) or (y = minside); end; Result := size; end; @@ -619,7 +626,6 @@ end; procedure TOniImage.GetAsData(var Target: TStream); var - i: Integer; revert: Boolean; begin // if not (DT_Decoded32 in Self.FDataType) then @@ -654,7 +660,7 @@ end; procedure TOniImage.GetAs32bit(var Target: TStream); begin if not (DT_Decoded32 in Self.FDataType) then - Self.DecodeImage; + Self.DecodeImageTo32bit; if not Assigned(Target) then Target := TMemoryStream.Create; Target.Write(FData[0], Length(FData)); @@ -683,7 +689,7 @@ var i, x, y: Integer; begin if not (DT_Decoded32 in Self.FDataType) then - Self.DecodeImage; + Self.DecodeImageTo32bit; SetLength(Target, Self.FWidth * Self.FHeight * 3 + 54); for y := 0 to Self.FHeight - 1 do