improved DefineProperties to read/write endian independent

git-svn-id: trunk@5790 -
This commit is contained in:
mattias 2004-08-15 17:00:58 +00:00
parent 05cae27203
commit 2d80b0247f
7 changed files with 390 additions and 53 deletions

View File

@ -37,9 +37,10 @@ unit ComCtrls;
interface
uses
SysUtils, Classes, Math, FPCAdds, LCLStrConsts, LCLIntf, LCLType, LCLProc,
AvgLvlTree, vclGlobals, LMessages, ImgList, ActnList, GraphType, Graphics,
Menus, Controls, Forms, StdCtrls, ExtCtrls, ToolWin, CommCtrl, Buttons;
SysUtils, Classes, Math, FPCAdds, LCLStrConsts, LResources, LCLIntf, LCLType,
LCLProc, AvgLvlTree, vclGlobals, LMessages, ImgList, ActnList, GraphType,
Graphics, Menus, Controls, Forms, StdCtrls, ExtCtrls, ToolWin, CommCtrl,
Buttons;
type
TStatusPanelStyle = (psText, psOwnerDraw);
@ -2306,6 +2307,9 @@ end.
{ =============================================================================
$Log$
Revision 1.142 2004/08/15 17:00:58 mattias
improved DefineProperties to read/write endian independent
Revision 1.141 2004/08/04 09:35:38 mattias
implemented setting TTabSheet.TabIndex

View File

@ -45,8 +45,8 @@ interface
{$endif}
uses
SysUtils, Classes, LCLStrConsts, LCLProc, Controls, Forms, StdCtrls,
vclGlobals, lMessages, GraphType, Graphics, LCLIntf, CustomTimer;
SysUtils, Classes, LCLStrConsts, LCLProc, LResources, Controls, Forms,
StdCtrls, vclGlobals, lMessages, GraphType, Graphics, LCLIntf, CustomTimer;
type
{ workaround problem with fcl }
@ -967,6 +967,9 @@ end.
{
$Log$
Revision 1.114 2004/08/15 17:00:58 mattias
improved DefineProperties to read/write endian independent
Revision 1.113 2004/08/04 09:57:17 mattias
TStaticText.CanTab=false

View File

@ -35,7 +35,7 @@ History
- Add TCustomImageList.Assign()
- Add TCustomImageList.WriteData()
- Add TCustomImageList.ReadData()
- Add overrite TCustomImageList.DefineProperties()
- Add override TCustomImageList.DefineProperties()
Warning : the delphi or kylix format of datas is not compatible.
- Modify Delete and Clear for preserve memory
}
@ -219,6 +219,9 @@ end.
{
$Log$
Revision 1.23 2004/08/15 17:00:58 mattias
improved DefineProperties to read/write endian independent
Revision 1.22 2004/04/29 18:08:17 mattias
fixed 1.0.10 compilation

View File

@ -221,7 +221,7 @@ var
i: Integer;
v: Integer;
begin
Stream.ReadBuffer(ChecksCount, SizeOf(Integer));
ChecksCount:=ReadLRSInteger(Stream);
if ChecksCount>0 then begin
SetLength(Checks,ChecksCount);
Stream.ReadBuffer(Checks[1], ChecksCount);
@ -241,7 +241,7 @@ var
v: Integer;
begin
ChecksCount:=FItems.Count;
Stream.WriteBuffer(ChecksCount, SizeOf(Integer));
WriteLRSInteger(Stream,ChecksCount);
if ChecksCount>0 then begin
SetLength(Checks,ChecksCount);
for i:=0 to ChecksCount-1 do begin
@ -278,6 +278,9 @@ end;
{
$Log$
Revision 1.9 2004/08/15 17:00:58 mattias
improved DefineProperties to read/write endian independent
Revision 1.8 2004/07/16 21:49:00 mattias
added RTTI controls

View File

@ -792,7 +792,7 @@ begin
AStream.Write(Signature,SizeOf(Signature));
//Count of image
AStream.WriteWord(Count);
WriteLRSWord(AStream,Count);
for i:=0 to Count-1 do
begin
@ -805,9 +805,9 @@ begin
AStream.Write(Signature,SizeOf(Signature));
//Count of image
AStream.WriteDWord(Count);
AStream.WriteDWord(Width);
AStream.WriteDWord(Height);
WriteLRSInteger(AStream,Count);
WriteLRSInteger(AStream,Width);
WriteLRSInteger(AStream,Height);
for i:=0 to Count-1 do
begin
@ -842,7 +842,7 @@ var
for i := 0 to NewCount - 1 do
begin
bmp := TBitMap.Create;
AStream.Read(Size, SizeOf(Size));
Size:=ReadLRSInteger(AStream);
bmp.ReadStream(AStream, True, Size);
bmp.Transparent := True;
AddDirect(bmp, nil);
@ -855,15 +855,15 @@ var
bmp: TBitmap;
begin
//DebugLn('TCustomImageList.ReadData DoReadLaz2');
NewCount := AStream.ReadDWord;
Width := AStream.ReadDWord;
Height := AStream.ReadDWord;
NewCount := ReadLRSCardinal(AStream);
Width := ReadLRSCardinal(AStream);
Height := ReadLRSCardinal(AStream);
//DebugLn('TCustomImageList.ReadData DoReadLaz2 NewCount=',NewCount,' Width=',Width,' Height=',Height);
for i := 0 to NewCount - 1 do
begin
bmp := TBitMap.Create;
//DebugLn('TCustomImageList.ReadData DoReadLaz2 i=',i,' ',AStream.Position);
AStream.Read(Size, SizeOf(Size));
Size:=ReadLRSCardinal(AStream);
//DebugLn('TCustomImageList.ReadData DoReadLaz2 Size=',Size,' ',AStream.Position);
bmp.ReadStream(AStream, True, Size);
AddDirect(bmp, nil);
@ -1004,17 +1004,17 @@ begin
if Signature = SIG_D3
then begin
AStream.ReadWord; //Skip ?
NewCount := AStream.ReadWord;
NewCount := ReadLRSWord(AStream);
//DebugLn('NewCount=',NewCount);
AStream.ReadWord; //Skip Capacity
AStream.ReadWord; //Skip Grow
FWidth := AStream.ReadWord;
FWidth := ReadLRSWord(AStream);
//DebugLn('NewWidth=',FWidth);
FHeight := AStream.ReadWord;
FHeight := ReadLRSWord(AStream);
//DebugLn('NewHeight=',FHeight);
FBKColor := TColor(AStream.ReadDWord);
FBKColor := TColor(ReadLRSInteger(AStream));
{$IFNDEF DisableFPImage}
HasMask := (AStream.ReadWord and 1) = 1;
HasMask := (ReadLRSWord(AStream) and 1) = 1;
AStream.ReadDWord; //Skip ?
AStream.ReadDWord; //Skip ?
@ -1024,12 +1024,13 @@ begin
else begin
// D2 has no signature, so restore original position
AStream.Position := StreamPos;
AStream.ReadBuffer(Size, SizeOf(Size));
AStream.ReadBuffer(NewCount, SizeOf(NewCount));
Size:=ReadLRSInteger(AStream);
NewCount:=ReadLRSInteger(AStream);
{$IFNDEF DisableFPImage}
ReadDelphiImageAndMask(false,NewCount);
{$ENDIF}
AStream.Position := StreamPos+Size;
end;
end;
@ -1261,6 +1262,9 @@ end;
{
$Log$
Revision 1.40 2004/08/15 17:00:58 mattias
improved DefineProperties to read/write endian independent
Revision 1.39 2004/05/11 11:42:27 mattias
replaced writeln by debugln

View File

@ -278,17 +278,25 @@ var
begin
Clear;
//Flag:=False;
Stream.ReadBuffer(Size, SizeOf(Integer));
Size:=ReadLRSInteger(Stream);
ItemHeader := AllocMem(Size);
Owner.BeginUpdate;
try
Stream.ReadBuffer(ItemHeader^.Count, Size - SizeOf(Integer));
ItemHeader^.Count:=ReadLRSInteger(Stream);
Stream.ReadBuffer(ItemHeader^.Items, Size - 8);
ItemInfo := @ItemHeader^.Items;
PStr := nil;
for I := 0 to ItemHeader^.Count - 1 do
begin
with Add do
begin
{$IFDEF Endian_BIG}
ReverseBytes(@ItemInfo^.ImageIndex,4);
ReverseBytes(@ItemInfo^.StateIndex,4);
ReverseBytes(@ItemInfo^.OverlayIndex,4);
ReverseBytes(@ItemInfo^.SubItemCount,4);
ReverseBytes(@ItemInfo^.Data,4);
{$ENDIF}
//Flag:=True;
Caption := ItemInfo^.Caption;
ImageIndex := ItemInfo^.ImageIndex;
@ -317,6 +325,9 @@ begin
then begin
for J := 0 to Item[I].SubItems.Count - 1 do
begin
{$ifdef Endian_Little}
ReverseBytes(@PInt,4);
{$endif}
Item[I].SubItemImages[J] := PInt^;
Inc(PInt);
end;
@ -364,6 +375,10 @@ begin
try
ItemHeader^.Size := Size;
ItemHeader^.Count := Count;
{$ifdef Endian_Little}
ReverseBytes(@ItemHeader^.Size,4);
ReverseBytes(@ItemHeader^.Count,4);
{$endif}
ItemInfo := @ItemHeader^.Items;
PStr := nil;
for I := 0 to Count - 1 do
@ -372,10 +387,17 @@ begin
begin
ItemInfo^.Caption := Caption;
ItemInfo^.ImageIndex := ImageIndex;
ItemInfo^.OverlayIndex := -1 {OverlayIndex};
ItemInfo^.StateIndex := -1 {StateIndex};
ItemInfo^.Data := Data;
ItemInfo^.OverlayIndex := -1 {OverlayIndex};
ItemInfo^.SubItemCount := SubItems.Count;
ItemInfo^.Data := Data;
{$IFDEF Endian_BIG}
ReverseBytes(@ItemInfo^.ImageIndex,4);
ReverseBytes(@ItemInfo^.StateIndex,4);
ReverseBytes(@ItemInfo^.OverlayIndex,4);
ReverseBytes(@ItemInfo^.SubItemCount,4);
ReverseBytes(@ItemInfo^.Data,4);
{$ENDIF}
PStr := @ItemInfo^.Caption;
Inc(Integer(PStr), Length(ItemInfo^.Caption) + 1);
Len := 0;
@ -397,8 +419,11 @@ begin
begin
for J := 0 to Item[I].SubItems.Count - 1 do
begin
PInt^ := Item[I].SubItemImages[J];
Inc(PInt);
PInt^ := Item[I].SubItemImages[J];
{$ifdef Endian_Little}
ReverseBytes(@PInt,4);
{$endif}
Inc(PInt);
end;
end;
@ -411,6 +436,9 @@ end;
{ =============================================================================
$Log$
Revision 1.24 2004/08/15 17:00:58 mattias
improved DefineProperties to read/write endian independent
Revision 1.23 2004/07/11 17:20:47 marc
* Implemented most of TListColoum/Item in the Ws for gtk and win32

View File

@ -192,22 +192,59 @@ function FindLFMClassName(LFMStream: TStream):AnsiString;
function CreateLFMFile(AComponent: TComponent; LFMStream: TStream): integer;
type
TDelphiStreamOriginalFormat = (sofUnknown, sofBinary, sofText);
TLRSStreamOriginalFormat = (sofUnknown, sofBinary, sofText);
procedure DelphiObjectBinaryToText(Input, Output: TStream);
procedure DelphiObjectToText(Input, Output: TStream;
var OriginalFormat: TDelphiStreamOriginalFormat);
procedure LRSObjectBinaryToText(Input, Output: TStream);
procedure LRSObjectToText(Input, Output: TStream;
var OriginalFormat: TLRSStreamOriginalFormat);
procedure DelphiObjectResourceToText(Input, Output: TStream);
procedure DelphiObjectResToText(Input, Output: TStream;
var OriginalFormat: TDelphiStreamOriginalFormat);
procedure LRSObjectResourceToText(Input, Output: TStream);
procedure LRSObjectResToText(Input, Output: TStream;
var OriginalFormat: TLRSStreamOriginalFormat);
function TestFormStreamFormat(Stream: TStream): TDelphiStreamOriginalFormat;
function TestFormStreamFormat(Stream: TStream): TLRSStreamOriginalFormat;
procedure FormDataToText(FormStream, TextStream: TStream);
procedure ReverseBytes(p: Pointer; Count: integer);
procedure ReverseByteOrderInWords(p: PWord; Count: integer);
function ReadLRSWord(s: TStream): word;
function ReadLRSInteger(s: TStream): integer;
function ReadLRSCardinal(s: TStream): cardinal;
function ReadLRSInt64(s: TStream): int64;
function ReadLRSSingle(s: TStream): Single;
function ReadLRSDouble(s: TStream): Double;
function ReadLRSExtended(s: TStream): Extended;
{$ifdef HASCURRENCY}
function ReadLRSCurrency(s: TStream): Currency;
{$endif HASCURRENCY}
{$ifdef HASWIDESTRING}
function ReadLRSWideString(s: TStream): WideString;
{$endif HASWIDESTRING}
procedure WriteLRSWord(s: TStream; const w: word);
procedure WriteLRSInteger(s: TStream; const i: integer);
procedure WriteLRSCardinal(s: TStream; const c: cardinal);
procedure WriteLRSSingle(s: TStream; const si: Single);
procedure WriteLRSDouble(s: TStream; const d: Double);
procedure WriteLRSExtended(s: TStream; const e: extended);
procedure WriteLRSInt64(s: TStream; const i: int64);
{$ifdef HASCURRENCY}
procedure WriteLRSCurrency(s: TStream; const c: Currency);
{$endif HASCURRENCY}
{$ifdef HASWIDESTRING}
procedure WriteLRSWideStringContent(s: TStream; const w: WideString);
{$endif HASWIDESTRING}
procedure WriteLRSReversedWord(s: TStream; w: word);
procedure WriteLRS4BytesReversed(s: TStream; p: Pointer);
procedure WriteLRS8BytesReversed(s: TStream; p: Pointer);
procedure WriteLRS10BytesReversed(s: TStream; p: Pointer);
procedure WriteLRSNull(s: TStream; Count: integer);
procedure WriteLRSEndianBigDoubleAsEndianLittleExtended(s: TStream;
PPCDouble: PByte);
implementation
@ -1114,7 +1151,7 @@ begin
end;
end;
procedure DelphiObjectBinaryToText(Input, Output: TStream);
procedure LRSObjectBinaryToText(Input, Output: TStream);
var
NestingLevel: Integer;
SaveSeparator: Char;
@ -1449,7 +1486,7 @@ begin
end;
end;
function TestFormStreamFormat(Stream: TStream): TDelphiStreamOriginalFormat;
function TestFormStreamFormat(Stream: TStream): TLRSStreamOriginalFormat;
var
Pos: TStreamSeekType;
Signature: Integer;
@ -1470,8 +1507,8 @@ end;
type
TObjectTextConvertProc = procedure (Input, Output: TStream);
procedure InternalDelphiBinaryToText(Input, Output: TStream;
var OriginalFormat: TDelphiStreamOriginalFormat;
procedure InternalLRSBinaryToText(Input, Output: TStream;
var OriginalFormat: TLRSStreamOriginalFormat;
ConvertProc: TObjectTextConvertProc;
BinarySignature: Integer; SignatureLength: Byte);
var
@ -1517,31 +1554,31 @@ begin
end;
end;
procedure DelphiObjectToText(Input, Output: TStream;
var OriginalFormat: TDelphiStreamOriginalFormat);
procedure LRSObjectToText(Input, Output: TStream;
var OriginalFormat: TLRSStreamOriginalFormat);
begin
InternalDelphiBinaryToText(Input, Output, OriginalFormat,
@DelphiObjectBinaryToText, Integer(FilerSignature), sizeof(Integer));
InternalLRSBinaryToText(Input, Output, OriginalFormat,
@LRSObjectBinaryToText, Integer(FilerSignature), sizeof(Integer));
end;
procedure DelphiObjectResToText(Input, Output: TStream;
var OriginalFormat: TDelphiStreamOriginalFormat);
procedure LRSObjectResToText(Input, Output: TStream;
var OriginalFormat: TLRSStreamOriginalFormat);
begin
InternalDelphiBinaryToText(Input, Output, OriginalFormat,
@DelphiObjectResourceToText, $FF, 1);
InternalLRSBinaryToText(Input, Output, OriginalFormat,
@LRSObjectResourceToText, $FF, 1);
end;
procedure DelphiObjectResourceToText(Input, Output: TStream);
procedure LRSObjectResourceToText(Input, Output: TStream);
begin
Input.ReadResHeader;
DelphiObjectBinaryToText(Input, Output);
LRSObjectBinaryToText(Input, Output);
end;
procedure FormDataToText(FormStream, TextStream: TStream);
begin
case TestFormStreamFormat(FormStream) of
sofBinary:
DelphiObjectResourceToText(FormStream, TextStream);
LRSObjectResourceToText(FormStream, TextStream);
sofText:
TextStream.CopyFrom(FormStream,FormStream.Size);
@ -1663,6 +1700,261 @@ begin
Result:=TWriter.Create(Driver);
end;
function ReadLRSWord(s: TStream): word;
begin
s.Read(Result,2);
{$IFDEF Endian_BIG}
Result:=((Result and $ff) shl 8) or (Result shr 8);
{$ENDIF}
end;
function ReadLRSInteger(s: TStream): integer;
begin
s.Read(Result,4);
{$IFDEF Endian_BIG}
ReverseBytes(@Result,4);
{$ENDIF}
end;
function ReadLRSCardinal(s: TStream): cardinal;
begin
s.Read(Result,4);
{$IFDEF Endian_BIG}
ReverseBytes(@Result,4);
{$ENDIF}
end;
function ReadLRSInt64(s: TStream): int64;
begin
s.Read(Result,8);
{$IFDEF Endian_BIG}
ReverseBytes(@Result,8);
{$ENDIF}
end;
function ReadLRSSingle(s: TStream): Single;
begin
s.Read(Result,4);
{$IFDEF Endian_BIG}
ReverseBytes(@Result,4);
{$ENDIF}
end;
function ReadLRSDouble(s: TStream): Double;
begin
s.Read(Result,8);
{$IFDEF Endian_BIG}
ReverseBytes(@Result,8);
{$ENDIF}
end;
{$IFDEF CPUPowerPC}
function ReadLRSExtentedAndConvertToExtended(s: TStream): Extended;
// TODO - does not work
const
F: extended = 1.0/65536.0 ;
var
le: array [1..5] of word;
begin { Ignores NaN & Inf }
s.Read(le[1],10);
ReverseBytes(@le[1],10);
Result := 2.0 * (((le[2]*F+le[3])*F+le[4])*F+le[5])*F;
if le[1]>32767 then Result := -Result ;
Result:=intpower(2,integer(le[1] and $7fff)-$4000);
end;
{$ENDIF}
function ReadLRSExtended(s: TStream): Extended;
begin
{$IFDEF CPUi386}
s.Read(Result,10);
{$ENDIF}
{$IFDEF CPUPowerPC}
Result:=ReadLRSExtentedAndConvertToExtended(s);
{$ENDIF}
end;
{$ifdef HASCURRENCY}
function ReadLRSCurrency(s: TStream): Currency;
begin
s.Read(Result,8);
{$IFDEF Endian_BIG}
ReverseBytes(@Result,8);
{$ENDIF}
end;
{$endif HASCURRENCY}
{$ifdef HASWIDESTRING}
function ReadLRSWideString(s: TStream): WideString;
var
Len: LongInt;
begin
Len:=ReadLRSInteger(s);
SetLength(Result,Len);
if Len>0 then begin
s.Read(Result[1],Len*2);
{$IFDEF Endian_BIG}
ReverseByteOrderInWords(PWord(@Result[1]),Len);
{$ENDIF}
end;
end;
{$endif HASWIDESTRING}
procedure WriteLRSReversedWord(s: TStream; w: word);
begin
w:=(w shr 8) or ((w and $ff) shl 8);
s.Write(w,2);
end;
procedure WriteLRS4BytesReversed(s: TStream; p: Pointer);
var
a: array[0..3] of char;
i: Integer;
begin
for i:=0 to 3 do
a[i]:=PChar(p)[3-i];
s.Write(a[0],4);
end;
procedure WriteLRS8BytesReversed(s: TStream; p: Pointer);
var
a: array[0..7] of char;
i: Integer;
begin
for i:=0 to 7 do
a[i]:=PChar(p)[7-i];
s.Write(a[0],8);
end;
procedure WriteLRS10BytesReversed(s: TStream; p: Pointer);
var
a: array[0..9] of char;
i: Integer;
begin
for i:=0 to 9 do
a[i]:=PChar(p)[9-i];
s.Write(a[0],10);
end;
procedure WriteLRSNull(s: TStream; Count: integer);
var
c: char;
i: Integer;
begin
c:=#0;
for i:=0 to Count-1 do
s.Write(c,1);
end;
procedure WriteLRSEndianBigDoubleAsEndianLittleExtended(s: TStream;
PPCDouble: PByte);
// TODO
var
i: Integer;
begin
i:=0;
s.Write(i,4);
s.Write(i,4);
s.Write(i,2);
end;
procedure WriteLRSWord(s: TStream; const w: word);
begin
{$IFDEF Endian_Little}
s.Write(w,2);
{$ELSE}
WriteLRSReversedWord(s,w);
{$ENDIF}
end;
procedure WriteLRSInteger(s: TStream; const i: integer);
begin
{$IFDEF Endian_Little}
s.Write(i,4);
{$ELSE}
WriteLRS4BytesReversed(s,@i);
{$ENDIF}
end;
procedure WriteLRSCardinal(s: TStream; const c: cardinal);
begin
{$IFDEF Endian_Little}
s.Write(c,4);
{$ELSE}
WriteLRS4BytesReversed(s,@c);
{$ENDIF}
end;
procedure WriteLRSSingle(s: TStream; const si: Single);
begin
{$IFDEF Endian_Little}
s.Write(si,4);
{$ELSE}
WriteLRS4BytesReversed(s,@si);
{$ENDIF}
end;
procedure WriteLRSDouble(s: TStream; const d: Double);
begin
{$IFDEF Endian_Little}
s.Write(d,8);
{$ELSE}
WriteLRS8BytesReversed(s,@d);
{$ENDIF}
end;
procedure WriteLRSExtended(s: TStream; const e: extended);
begin
{$IFDEF CPUi386}
s.Write(e,10);
{$ENDIF}
{$IFDEF CPUPowerPC}
if SizeOf(e)=10 then
WriteLRS10BytesReversed(s,@e)
else if SizeOf(e)=8 then
WriteLRSEndianBigDoubleAsEndianLittleExtended(s,@e)
else begin
debugln('WARNING: WriteLRSExtended not implemented yet for PowerPC');
WriteLRSNull(s,10);
end;
{$ENDIF}
end;
procedure WriteLRSInt64(s: TStream; const i: int64);
begin
{$IFDEF Endian_Little}
s.Write(i,8);
{$ELSE}
WriteLRS8BytesReversed(s,@i);
{$ENDIF}
end;
{$ifdef HASCURRENCY}
procedure WriteLRSCurrency(s: TStream; const c: Currency);
begin
{$IFDEF Endian_Little}
s.Write(c,8);
{$ELSE}
WriteLRS8BytesReversed(s,@c);
{$ENDIF}
end;
{$endif HASCURRENCY}
{$ifdef HASWIDESTRING}
procedure WriteLRSWideStringContent(s: TStream; const w: WideString);
var
Size: Integer;
begin
Size:=length(w);
if Size=0 then exit;
{$IFDEF Endian_Little}
s.Write(w[1], Size * 2);
{$ELSE}
WriteLRSReversedWords(s,@w[1],Size);
{$ENDIF}
end;
{$endif HASWIDESTRING}
{ TLRSObjectReader }
procedure TLRSObjectReader.Read(var Buf; Count: LongInt);