--- oup/rewrite/Global/OniImgClass.pas 2007/02/20 20:43:29 101 +++ 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,13 +37,18 @@ 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 DecodeImageTo32bit; + + 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; @@ -128,7 +132,7 @@ end; -procedure TOniImage.DecodeImage; +procedure TOniImage.DecodeImageTo32bit; var x, y: Integer; tempd: TByteData; @@ -137,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 @@ -156,7 +160,7 @@ begin end; end; end; - 1, 2: + 1, 2: // 16bit, RGB555, A1? begin for y := 0 to Self.FHeight - 1 do begin @@ -175,7 +179,9 @@ begin end; end; end; - 9: + 8: // 32bit, RGB888, A8? + begin end; + 9: // Compressed, RGB565 begin DecompressImage; end; @@ -306,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 @@ -366,9 +371,9 @@ begin end; txmpimg := TOniImage.Create; txmpimg.LoadFromTXMP(ConnectionID, PSpc.TXMP); - txmpimg.DecodeImage; + txmpimg.DecodeImageTo32bit; // 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]; @@ -531,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); @@ -583,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; @@ -614,9 +621,8 @@ end; -function TOniImage.GetAsData: TByteData; +procedure TOniImage.GetAsData(var Target: TStream); var - i: Integer; revert: Boolean; begin // if not (DT_Decoded32 in Self.FDataType) then @@ -628,28 +634,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; - - - -function TOniImage.GetAs32bit: TByteData; +procedure TOniImage.GetAsData(var Target: TByteData); var - i: Integer; + mem: 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]; + mem := TMemoryStream.Create; + GetAsData(mem); + SetLength(Target, mem.Size); + mem.Read(Target[0], mem.Size); + mem.Free; end; +procedure TOniImage.GetAs32bit(var Target: TStream); +begin + if not (DT_Decoded32 in Self.FDataType) then + Self.DecodeImageTo32bit; + 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); @@ -662,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 @@ -785,8 +809,7 @@ end; - -function TOniImage.GetMipMappedImage(var faded: TByteData): Boolean; +function TOniImage.GetMipMappedImage(var Target: TByteData): Boolean; var i: Integer; x, y: Word; @@ -809,20 +832,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 +856,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