--- oup/rewrite/Global/OniImgClass.pas 2007/02/20 20:43:29 101 +++ oup/rewrite/Global/OniImgClass.pas 2007/02/21 00:29:27 105 @@ -38,13 +38,16 @@ type function LoadFromTXMB(ConnectionID, FileID: Integer): Boolean; function GetImageDataSize(fading: Boolean): Integer; - function GetAsData: TByteData; - function GetAs32bit: TByteData; - procedure GetAsBMP(var Target: TByteData); overload; + procedure GetAsData(var Target: TStream); overload; + procedure GetAsData(var Target: TByteData); overload; + procedure GetAs32bit(var Target: TStream); overload; + procedure GetAs32bit(var Target: TByteData); overload; procedure GetAsBMP(var Target: TStream); overload; + procedure GetAsBMP(var Target: TByteData); overload; function LoadFromBMP(filename: String): Boolean; function WriteToBMP(filename: String): Boolean; - function GetMipMappedImage(var faded: TByteData): Boolean; + function GetMipMappedImage(var Target: TStream): Boolean; overload; + function GetMipMappedImage(var Target: TByteData): Boolean; overload; published end; @@ -368,7 +371,7 @@ begin txmpimg.LoadFromTXMP(ConnectionID, PSpc.TXMP); txmpimg.DecodeImage; // txmpimg.WriteToBMP('C:\file.bmp'); - txmpdata := txmpimg.GetAs32bit; + txmpimg.GetAs32bit(txmpdata); { ShowMessage(IntToStr(txmpimg.Width)+'x'+IntToStr(txmpimg.Height)); for i:=0 to High(txmpdata) do txmpimg.Data[i]:=txmpdata[i]; @@ -614,7 +617,7 @@ end; -function TOniImage.GetAsData: TByteData; +procedure TOniImage.GetAsData(var Target: TStream); var i: Integer; revert: Boolean; @@ -628,28 +631,46 @@ begin end else revert := False; - SetLength(Result, Length(Self.FData)); - for i := 0 to High(Result) do - Result[i] := Self.FData[i]; + if not Assigned(Target) then + Target := TMemoryStream.Create; + Target.Write(FData[0], Length(FData)); + Target.Seek(0, soFromBeginning); if revert then Self.RevertImage; end; +procedure TOniImage.GetAsData(var Target: TByteData); +var + mem: TStream; +begin + mem := TMemoryStream.Create; + GetAsData(mem); + SetLength(Target, mem.Size); + mem.Read(Target[0], mem.Size); + mem.Free; +end; - -function TOniImage.GetAs32bit: TByteData; -var - i: Integer; +procedure TOniImage.GetAs32bit(var Target: TStream); begin if not (DT_Decoded32 in Self.FDataType) then Self.DecodeImage; - SetLength(Result, Length(Self.FData)); - for i := 0 to High(Result) do - Result[i] := Self.FData[i]; + if not Assigned(Target) then + Target := TMemoryStream.Create; + Target.Write(FData[0], Length(FData)); + Target.Seek(0, soFromBeginning); end; - +procedure TOniImage.GetAs32bit(var Target: TByteData); +var + mem: TStream; +begin + mem := TMemoryStream.Create; + GetAs32bit(mem); + SetLength(Target, mem.Size); + mem.Read(Target[0], mem.Size); + mem.Free; +end; procedure TOniImage.GetAsBMP(var Target: TByteData); @@ -785,8 +806,7 @@ end; - -function TOniImage.GetMipMappedImage(var faded: TByteData): Boolean; +function TOniImage.GetMipMappedImage(var Target: TByteData): Boolean; var i: Integer; x, y: Word; @@ -809,20 +829,20 @@ begin x := Self.FWidth; y := Self.FHeight; - SetLength(faded, x * y * Self.FDepth div 8); + SetLength(Target, x * y * Self.FDepth div 8); SetLength(fadelvldata, x * y * Self.FDepth div 8); - for i := 0 to Length(faded) - 1 do + for i := 0 to Length(Target) - 1 do begin - faded[i] := Self.FData[i]; + Target[i] := Self.FData[i]; fadelvldata[i] := Self.FData[i]; end; repeat fadelvldata := Self.ResizeImage(x, y, fadelvldata); x := x div 2; y := y div 2; - SetLength(faded, Length(faded) + x * y * Self.FDepth div 8); + SetLength(Target, Length(Target) + x * y * Self.FDepth div 8); for i := 0 to Length(fadelvldata) - 1 do - faded[Length(faded) - x * y * Self.FDepth div 8 + i] := fadelvldata[i]; + Target[Length(Target) - x * y * Self.FDepth div 8 + i] := fadelvldata[i]; until (x = 1) or (y = 1) or ((x mod 2) = 1) or ((y mod 2) = 1); if (x > 1) and (y > 1) then Exit; @@ -833,4 +853,18 @@ begin end; +function TOniImage.GetMipMappedImage(var Target: TStream): Boolean; +var + data: TByteData; + streampos: Integer; +begin + Result := GetMipMappedImage(data); + if not Assigned(Target) then + Target := TMemoryStream.Create; + streampos := Target.Position; + Target.Write(data[0], Length(data)); + Target.Seek(streampos, soFromBeginning); +end; + + end. \ No newline at end of file