mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 09:02:22 +01:00 
			
		
		
		
	* Fixed bug #33217, range check error when loading/saving colors, patch from Andreas Friess
git-svn-id: trunk@38325 -
This commit is contained in:
		
							parent
							
								
									80d8a73f05
								
							
						
					
					
						commit
						4a0072d43d
					
				@ -2296,6 +2296,11 @@ begin
 | 
			
		||||
  Result := (R shl 16) or (G shl 8) or B;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function QWordToReportColor(AQWord: QWord):TFPReportColor;
 | 
			
		||||
begin
 | 
			
		||||
  Result := TFPReportColor(AQWord and $FFFFFFFF);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function StretchModeToString(AEnum: TFPReportStretchMode): string; inline;
 | 
			
		||||
begin
 | 
			
		||||
  result := GetEnumName(TypeInfo(TFPReportStretchMode), Ord(AEnum));
 | 
			
		||||
@ -3403,7 +3408,11 @@ begin
 | 
			
		||||
    end;
 | 
			
		||||
  end
 | 
			
		||||
  else
 | 
			
		||||
  begin
 | 
			
		||||
    if not Assigned(FFont) then
 | 
			
		||||
      FFont := TFPReportFont.Create;
 | 
			
		||||
    Result := FFont;
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TFPReportCustomMemo.SetUseParentFont(AValue: Boolean);
 | 
			
		||||
@ -4369,11 +4378,11 @@ begin
 | 
			
		||||
  begin
 | 
			
		||||
    AWriter.WriteString('FontName', Font.Name);
 | 
			
		||||
    AWriter.WriteInteger('FontSize', Font.Size);
 | 
			
		||||
    AWriter.WriteInteger('FontColor', Font.Color);
 | 
			
		||||
    AWriter.WriteQWord('FontColor', Font.Color);
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  AWriter.WriteFloat('LineSpacing', LineSpacing);
 | 
			
		||||
  AWriter.WriteInteger('LinkColor', LinkColor);
 | 
			
		||||
  AWriter.WriteQWord('LinkColor', LinkColor);
 | 
			
		||||
  AWriter.WriteString('Options', MemoOptionsToString(Options));
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
@ -4537,10 +4546,10 @@ begin
 | 
			
		||||
  begin
 | 
			
		||||
    Font.Name := AReader.ReadString('FontName', Font.Name);
 | 
			
		||||
    Font.Size := AReader.ReadInteger('FontSize', Font.Size);
 | 
			
		||||
    Font.Color := AReader.ReadInteger('FontColor', Font.Color);
 | 
			
		||||
    Font.Color := QWordToReportColor(AReader.ReadQWord('FontColor', Font.Color));
 | 
			
		||||
  end;
 | 
			
		||||
  FLineSpacing := AReader.ReadFloat('LineSpacing', LineSpacing);
 | 
			
		||||
  FLinkColor := AReader.ReadInteger('LinkColor', LinkColor);
 | 
			
		||||
  FLinkColor := QWordToReportColor(AReader.ReadQWord('LinkColor', LinkColor));
 | 
			
		||||
  Options := StringToMemoOptions(AReader.ReadString('Options', ''));
 | 
			
		||||
  Changed;
 | 
			
		||||
end;
 | 
			
		||||
@ -4604,7 +4613,7 @@ begin
 | 
			
		||||
  AWriter.WriteString('ShapeType', ShapeTypeToString(ShapeType));
 | 
			
		||||
  AWriter.WriteString('Orientation', OrientationToString(Orientation));
 | 
			
		||||
  AWriter.WriteFloat('CornerRadius', CornerRadius);
 | 
			
		||||
  AWriter.WriteInteger('Color', Color);
 | 
			
		||||
  AWriter.WriteQWord('Color', Color);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
constructor TFPReportCustomShape.Create(AOwner: TComponent);
 | 
			
		||||
@ -5622,25 +5631,25 @@ var
 | 
			
		||||
begin
 | 
			
		||||
  if (AOriginal = nil) then
 | 
			
		||||
  begin
 | 
			
		||||
    AWriter.WriteInteger('Color', Color);
 | 
			
		||||
    AWriter.WriteQWord('Color', Color);
 | 
			
		||||
    AWriter.WriteString('Pen', FramePenToString(Pen));
 | 
			
		||||
    AWriter.WriteInteger('Width', Ord(Width));
 | 
			
		||||
    AWriter.WriteString('Shape', FrameShapeToString(Shape));
 | 
			
		||||
    //TODO Write out the enum values instead of the Integer value.
 | 
			
		||||
    I := integer(Lines);
 | 
			
		||||
    AWriter.WriteInteger('Lines', I);
 | 
			
		||||
    AWriter.WriteInteger('BackgroundColor', BackgroundColor);
 | 
			
		||||
    AWriter.WriteQWord('BackgroundColor', BackgroundColor);
 | 
			
		||||
  end
 | 
			
		||||
  else
 | 
			
		||||
  begin
 | 
			
		||||
    AWriter.WriteIntegerDiff('Color', Color, AOriginal.Color);
 | 
			
		||||
    AWriter.WriteQWordDiff('Color', Color, AOriginal.Color);
 | 
			
		||||
    AWriter.WriteStringDiff('Pen', FramePenToString(Pen), FramePenToString(AOriginal.Pen));
 | 
			
		||||
    AWriter.WriteIntegerDiff('Width', Ord(Width), AOriginal.Width);
 | 
			
		||||
    AWriter.WriteStringDiff('Shape', FrameShapeToString(Shape), FrameShapeToString(AOriginal.Shape));
 | 
			
		||||
    I := integer(Lines);
 | 
			
		||||
    J := integer(Aoriginal.Lines);
 | 
			
		||||
    AWriter.WriteIntegerDiff('Lines', I, J);
 | 
			
		||||
    AWriter.WriteIntegerDiff('BackgroundColor', BackgroundColor, AOriginal.BackgroundColor);
 | 
			
		||||
    AWriter.WriteQWordDiff('BackgroundColor', BackgroundColor, AOriginal.BackgroundColor);
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
@ -5648,13 +5657,13 @@ procedure TFPReportFrame.ReadElement(AReader: TFPReportStreamer);
 | 
			
		||||
var
 | 
			
		||||
  I: integer;
 | 
			
		||||
begin
 | 
			
		||||
  Color := AReader.ReadInteger('Color', Color);
 | 
			
		||||
  Color := QWordToReportColor(AReader.ReadQWord('Color', Color ));
 | 
			
		||||
  Pen := StringToFramePen(AReader.ReadString('Pen', 'psSolid'));
 | 
			
		||||
  Width := AReader.ReadInteger('Width', Ord(Width));
 | 
			
		||||
  Shape := StringToFrameShape(AReader.ReadString('Shape', 'fsNone'));
 | 
			
		||||
  I := integer(Lines);
 | 
			
		||||
  Lines := TFPReportFrameLines(AReader.ReadInteger('Lines', I));
 | 
			
		||||
  BackgroundColor := AReader.ReadInteger('BackgroundColor', BackgroundColor);
 | 
			
		||||
  BackgroundColor := QWordToReportColor(AReader.ReadQWord('BackgroundColor', BackgroundColor));
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{ TFPReportTextAlignment }
 | 
			
		||||
@ -6764,7 +6773,7 @@ begin
 | 
			
		||||
  Pagesize.Height := AReader.ReadFloat('PageSize.Height', 297);
 | 
			
		||||
  Font.Name := AReader.ReadString('FontName', Font.Name);
 | 
			
		||||
  Font.Size := AReader.ReadInteger('FontSize', Font.Size);
 | 
			
		||||
  Font.Color := AReader.ReadInteger('FontColor', Font.Color);
 | 
			
		||||
  Font.Color := QWordToReportColor(AReader.ReadQWord('FontColor', Font.Color));
 | 
			
		||||
  FDataName:=AReader.ReadString('Data','');
 | 
			
		||||
  if FDataName<>'' then
 | 
			
		||||
    RestoreDataFromNames;
 | 
			
		||||
@ -6804,7 +6813,7 @@ begin
 | 
			
		||||
  AWriter.WriteFloat('PageSize.Height', PageSize.Height);
 | 
			
		||||
  AWriter.WriteString('FontName', Font.Name);
 | 
			
		||||
  AWriter.WriteInteger('FontSize', Font.Size);
 | 
			
		||||
  AWriter.WriteInteger('FontColor', Font.Color);
 | 
			
		||||
  AWriter.WriteQWord('FontColor', Font.Color);
 | 
			
		||||
  if Assigned(FData) then
 | 
			
		||||
    AWriter.WriteString('Data',FData.Name);
 | 
			
		||||
  AWriter.PushElement('Margins');
 | 
			
		||||
@ -7963,7 +7972,7 @@ begin
 | 
			
		||||
  begin
 | 
			
		||||
    AWriter.WriteString('FontName', Font.Name);
 | 
			
		||||
    AWriter.WriteInteger('FontSize', Font.Size);
 | 
			
		||||
    AWriter.WriteInteger('FontColor', Font.Color);
 | 
			
		||||
    AWriter.WriteQWord('FontColor', Font.Color);
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
@ -8058,7 +8067,7 @@ begin
 | 
			
		||||
      begin
 | 
			
		||||
        Font.Name := AReader.ReadString('FontName', Font.Name);
 | 
			
		||||
        Font.Size := AReader.ReadInteger('FontSize', Font.Size);
 | 
			
		||||
        Font.Color := AReader.ReadInteger('FontColor', Font.Color);
 | 
			
		||||
        Font.Color := QWordToReportColor(AReader.ReadQWord('FontColor', Font.Color));
 | 
			
		||||
      end;
 | 
			
		||||
 | 
			
		||||
      // TODO: Read Data information
 | 
			
		||||
 | 
			
		||||
@ -42,6 +42,8 @@ type
 | 
			
		||||
 | 
			
		||||
    // Writing properties of the current element
 | 
			
		||||
    procedure   WriteInteger(AName: String; AValue: Integer); virtual; abstract;
 | 
			
		||||
    procedure   WriteInt64(AName: String; AValue: Int64); virtual; abstract;
 | 
			
		||||
    procedure   WriteQWord(AName: String; AValue: QWord); virtual; abstract;
 | 
			
		||||
    procedure   WriteFloat(AName: String; AValue: Extended); virtual; abstract;
 | 
			
		||||
    procedure   WriteString(AName: String; AValue: String); virtual; abstract;
 | 
			
		||||
    procedure   WriteBoolean(AName: String; AValue: Boolean); virtual; abstract;
 | 
			
		||||
@ -49,6 +51,8 @@ type
 | 
			
		||||
    procedure   WriteStream(AName: String; AValue: TStream); virtual; abstract;
 | 
			
		||||
    // Writing properties but only when different from original
 | 
			
		||||
    procedure   WriteIntegerDiff(AName: String; AValue, AOriginal: Integer); virtual; abstract;
 | 
			
		||||
    procedure   WriteInt64Diff(AName: String; AValue, AOriginal: Int64); virtual; abstract;
 | 
			
		||||
    procedure   WriteQWordDiff(AName: String; AValue, AOriginal: QWord); virtual; abstract;
 | 
			
		||||
    procedure   WriteFloatDiff(AName: String; AValue, AOriginal: Extended); virtual; abstract;
 | 
			
		||||
    procedure   WriteStringDiff(AName: String; AValue, AOriginal: String); virtual; abstract;
 | 
			
		||||
    procedure   WriteBooleanDiff(AName: String; AValue, AOriginal: Boolean); virtual; abstract;
 | 
			
		||||
@ -56,6 +60,8 @@ type
 | 
			
		||||
    procedure   WriteStreamDiff(AName: String; AValue, AOriginal: TStream); virtual; abstract;
 | 
			
		||||
    // Reading properties
 | 
			
		||||
    function    ReadInteger(AName: String; ADefault: Integer): Integer; virtual; abstract;
 | 
			
		||||
    function    ReadInt64(AName: String; ADefault: Int64): Int64; virtual; abstract;
 | 
			
		||||
    function    ReadQWord(AName: String; ADefault: QWord): QWord; virtual; abstract;
 | 
			
		||||
    function    ReadFloat(AName: String; ADefault: Extended): Extended; virtual; abstract;
 | 
			
		||||
    function    ReadString(AName: String; ADefault: String): String; virtual; abstract;
 | 
			
		||||
    function    ReadDateTime(AName: String; ADefault: TDateTime): TDateTime; virtual; abstract;
 | 
			
		||||
@ -81,18 +87,24 @@ type
 | 
			
		||||
  public
 | 
			
		||||
    // FPReportStreamer interface
 | 
			
		||||
    procedure   WriteInteger(AName: String; AValue: Integer); override;
 | 
			
		||||
    procedure   WriteInt64(AName: String; AValue: Int64); override;
 | 
			
		||||
    procedure   WriteQWord(AName: String; AValue: QWord); override;
 | 
			
		||||
    procedure   WriteFloat(AName: String; AValue: Extended); override;
 | 
			
		||||
    procedure   WriteString(AName: String; AValue: String); override;
 | 
			
		||||
    procedure   WriteBoolean(AName: String; AValue: Boolean); override;
 | 
			
		||||
    procedure   WriteDateTime(AName: String; AValue: TDateTime); override;
 | 
			
		||||
    procedure   WriteStream(AName: String; AValue: TStream); override;
 | 
			
		||||
    procedure   WriteIntegerDiff(AName: String; AValue, AOriginal: Integer); override;
 | 
			
		||||
    procedure   WriteInt64Diff(AName: String; AValue, AOriginal: Int64); override;
 | 
			
		||||
    procedure   WriteQWordDiff(AName: String; AValue, AOriginal: QWord); override;
 | 
			
		||||
    procedure   WriteFloatDiff(AName: String; AValue, AOriginal: Extended); override;
 | 
			
		||||
    procedure   WriteStringDiff(AName: String; AValue, AOriginal: String); override;
 | 
			
		||||
    procedure   WriteBooleanDiff(AName: String; AValue, AOriginal: Boolean); override;
 | 
			
		||||
    procedure   WriteDateTimeDiff(AName: String; AValue, AOriginal: TDateTime); override;
 | 
			
		||||
    procedure   WriteStreamDiff(AName: String; AValue, AOriginal: TStream); override;
 | 
			
		||||
    function    ReadInteger(AName: String; ADefault: Integer): Integer; override;
 | 
			
		||||
    function    ReadInt64(AName: String; ADefault: Int64): Int64; override;
 | 
			
		||||
    function    ReadQWord(AName: String; ADefault: QWord): QWord; override;
 | 
			
		||||
    function    ReadFloat(AName: String; ADefault: Extended): Extended; override;
 | 
			
		||||
    function    ReadString(AName: String; ADefault: String): String; override;
 | 
			
		||||
    function    ReadDateTime(AName: String; ADefault: TDateTime): TDateTime; override;
 | 
			
		||||
@ -205,6 +217,16 @@ begin
 | 
			
		||||
  CurrentElement.Add(AName, AValue);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TFPReportJSONStreamer.WriteInt64(AName: String; AValue: Int64);
 | 
			
		||||
begin
 | 
			
		||||
  CurrentElement.Add(AName, AValue);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TFPReportJSONStreamer.WriteQWord(AName: String; AValue: QWord);
 | 
			
		||||
begin
 | 
			
		||||
 CurrentElement.Add(AName, AValue);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TFPReportJSONStreamer.WriteFloat(AName: String; AValue: Extended);
 | 
			
		||||
begin
 | 
			
		||||
  CurrentElement.Add(AName, AValue);
 | 
			
		||||
@ -236,6 +258,20 @@ begin
 | 
			
		||||
    WriteInteger(AName, AValue);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TFPReportJSONStreamer.WriteInt64Diff(AName: String; AValue,
 | 
			
		||||
  AOriginal: Int64);
 | 
			
		||||
begin
 | 
			
		||||
  if (AValue <> AOriginal) then
 | 
			
		||||
    WriteInt64(AName, AValue);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TFPReportJSONStreamer.WriteQWordDiff(AName: String; AValue,
 | 
			
		||||
  AOriginal: QWord);
 | 
			
		||||
begin
 | 
			
		||||
  if (AValue <> AOriginal) then
 | 
			
		||||
    WriteQWord(AName, AValue);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TFPReportJSONStreamer.WriteFloatDiff(AName: String; AValue, AOriginal: Extended);
 | 
			
		||||
begin
 | 
			
		||||
  if (AValue <> AOriginal) then
 | 
			
		||||
@ -268,6 +304,22 @@ begin
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function TFPReportJSONStreamer.ReadInteger(AName: String; ADefault: Integer): Integer;
 | 
			
		||||
var
 | 
			
		||||
  d: TJSONData;
 | 
			
		||||
begin
 | 
			
		||||
  d := FindChild(AName) as TJSONData;
 | 
			
		||||
  if d = nil then
 | 
			
		||||
    Result := ADefault
 | 
			
		||||
  else
 | 
			
		||||
  begin
 | 
			
		||||
    if d.JSONType = jtNumber then
 | 
			
		||||
      Result := d.AsInteger
 | 
			
		||||
    else
 | 
			
		||||
      Result := ADefault;
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function TFPReportJSONStreamer.ReadInt64(AName: String; ADefault: Int64): Int64;
 | 
			
		||||
var
 | 
			
		||||
  d: TJSONData;
 | 
			
		||||
begin
 | 
			
		||||
@ -283,6 +335,22 @@ begin
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function TFPReportJSONStreamer.ReadQWord(AName: String; ADefault: QWord): QWord;
 | 
			
		||||
var
 | 
			
		||||
  d: TJSONData;
 | 
			
		||||
begin
 | 
			
		||||
  d := FindChild(AName) as TJSONData;
 | 
			
		||||
  if d = nil then
 | 
			
		||||
    Result := ADefault
 | 
			
		||||
  else
 | 
			
		||||
  begin
 | 
			
		||||
    if d.JSONType = jtNumber then
 | 
			
		||||
      Result := d.AsQWord
 | 
			
		||||
    else
 | 
			
		||||
      Result := ADefault;
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function TFPReportJSONStreamer.ReadFloat(AName: String; ADefault: Extended): Extended;
 | 
			
		||||
var
 | 
			
		||||
  d: TJSONData;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user