mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-01 23:40:26 +02:00
TAChart: Fix SIGFPE on very small charts.
git-svn-id: trunk@19706 -
This commit is contained in:
parent
469effabc4
commit
c4221ad3ac
@ -434,41 +434,45 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TChart.CalculateTransformationCoeffs(const AMargin: TRect);
|
procedure TChart.CalculateTransformationCoeffs(const AMargin: TRect);
|
||||||
var
|
type
|
||||||
|
TConvFunc = function (AX: Integer): Double of object;
|
||||||
|
|
||||||
|
procedure CalcOneCoord(
|
||||||
|
AInverted: boolean; AConv: TConvFunc; var AGraphMin, AGraphMax: Double;
|
||||||
|
AImageLo, AImageHi, AMarginLo, AMarginHi, ASign: Integer;
|
||||||
|
out AScale, AOffset: Double);
|
||||||
|
var
|
||||||
lo, hi: Integer;
|
lo, hi: Integer;
|
||||||
|
begin
|
||||||
|
lo := AImageLo + AMarginLo;
|
||||||
|
hi := AImageHi + AMarginHi;
|
||||||
|
|
||||||
|
if (AGraphMax = AGraphMin) or (Sign(hi - lo) <> ASign) then begin
|
||||||
|
AScale := 1;
|
||||||
|
AOffset := 0;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if AInverted then
|
||||||
|
Exchange(lo, hi);
|
||||||
|
|
||||||
|
AScale := (hi - lo) / (AGraphMax - AGraphMin);
|
||||||
|
AOffset := hi - AScale * AGraphMax;
|
||||||
|
AGraphMin := AConv(AImageLo);
|
||||||
|
AGraphMax := AConv(AImageHi);;
|
||||||
|
if AInverted then
|
||||||
|
Exchange(AGraphMin, AGraphMax);
|
||||||
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
if XGraphMax <> XGraphMin then begin
|
CalcOneCoord(
|
||||||
lo := FClipRect.Left + AMargin.Left;
|
BottomAxis.Inverted, @XImageToGraph, FCurrentExtent.a.X, FCurrentExtent.b.X,
|
||||||
hi := FClipRect.Right - AMargin.Right;
|
FClipRect.Left, FClipRect.Right, AMargin.Left, -AMargin.Right, 1,
|
||||||
if BottomAxis.Inverted then
|
FScale.X, FOffset.X);
|
||||||
Exchange(lo, hi);
|
CalcOneCoord(
|
||||||
FScale.X := (hi - lo) / (XGraphMax - XGraphMin);
|
LeftAxis.Inverted, @YImageToGraph, FCurrentExtent.a.Y, FCurrentExtent.b.Y,
|
||||||
FOffset.X := hi - FScale.X * XGraphMax;
|
FClipRect.Bottom, FClipRect.Top, -AMargin.Bottom, AMargin.Top, -1,
|
||||||
FCurrentExtent.a.X := XImageToGraph(FClipRect.Left);
|
FScale.Y, FOffset.Y);
|
||||||
FCurrentExtent.b.X := XImageToGraph(FClipRect.Right);
|
|
||||||
if BottomAxis.Inverted then
|
|
||||||
Exchange(FCurrentExtent.a.X, FCurrentExtent.b.X);
|
|
||||||
end
|
|
||||||
else begin
|
|
||||||
FScale.X := 1;
|
|
||||||
FOffset.X := 0;
|
|
||||||
end;
|
|
||||||
if YGraphMax <> YGraphMin then begin
|
|
||||||
lo := FClipRect.Bottom - AMargin.Bottom;
|
|
||||||
hi := FClipRect.Top + AMargin.Top;
|
|
||||||
if LeftAxis.Inverted then
|
|
||||||
Exchange(lo, hi);
|
|
||||||
FScale.Y := (hi - lo) / (YGraphMax - YGraphMin);
|
|
||||||
FOffset.Y := hi - FScale.Y * YGraphMax;
|
|
||||||
FCurrentExtent.a.Y := YImageToGraph(FClipRect.Bottom);
|
|
||||||
FCurrentExtent.b.Y := YImageToGraph(FClipRect.Top);
|
|
||||||
if LeftAxis.Inverted then
|
|
||||||
Exchange(FCurrentExtent.a.Y, FCurrentExtent.b.Y);
|
|
||||||
end
|
|
||||||
else begin
|
|
||||||
FScale.Y := 1;
|
|
||||||
FOffset.Y := 0;
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TChart.Clean(ACanvas: TCanvas; ARect: TRect);
|
procedure TChart.Clean(ACanvas: TCanvas; ARect: TRect);
|
||||||
|
Loading…
Reference in New Issue
Block a user