--- oup/rewrite/Global/OniImgClass.pas 2007/02/21 00:29:27 105 +++ oup/current/Global/OniImgClass.pas 2007/03/28 00:57:53 128 @@ -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); @@ -586,30 +588,32 @@ function TOniImage.GetImageDataSize(fadi var size: Integer; x, y: Word; - bpp: Byte; -begin - case Self.FStoreType of - 9: - bpp := 8; - 0, 1, 2: - bpp := 16; - 8: - bpp := 32; + + 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 := 0; - Exit; + Result := -1; + end; end; +begin x := Self.FWidth; y := Self.FHeight; - size := x * y * bpp div 8; + size := GetImgSize(x, y, FStoreType); 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); + x := Max(x div 2, 1); + y := Max(y div 2, 1); + size := size + GetImgSize(x, y, FStoreType); + until (x = 1) and (y = 1); end; Result := size; end; @@ -619,7 +623,6 @@ end; procedure TOniImage.GetAsData(var Target: TStream); var - i: Integer; revert: Boolean; begin // if not (DT_Decoded32 in Self.FDataType) then @@ -654,7 +657,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 +686,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