From 33da110a2dac78fc6bae6bb771c60edd3ec5613f Mon Sep 17 00:00:00 2001 From: wp Date: Sun, 3 Feb 2019 10:55:48 +0000 Subject: [PATCH] TAChart: Prioritize Chart.MinDataSpace when plot size is too small. Issue #34896. Patch by Marcin Wiazowski. git-svn-id: trunk@60311 - --- components/tachart/tachartaxis.pas | 33 ++++++++++++++++-------------- components/tachart/tagraph.pas | 2 -- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/components/tachart/tachartaxis.pas b/components/tachart/tachartaxis.pas index 50423e7393..3323dbf273 100644 --- a/components/tachart/tachartaxis.pas +++ b/components/tachart/tachartaxis.pas @@ -252,7 +252,7 @@ type function CalcScale(ASign: Integer): Double; constructor Init(AAxis: TChartAxis; AImageLo, AImageHi: Integer; AMarginLo, AMarginHi, ARequiredMarginLo, ARequiredMarginHi, AMinDataSpace: Integer; - AHasMarksInMargin, AAxisIsVertical: Boolean; AMin, AMax: PDouble); + AAxisIsVertical: Boolean; AMin, AMax: PDouble); procedure UpdateMinMax(AConv: TAxisConvFunc); end; @@ -1218,14 +1218,19 @@ end; procedure EnsureGuaranteedSpace(var AValue1, AValue2: Integer; AImage1, AImage2, AMargin1, AMargin2, AGuaranteed: Integer); var + HasMarksInMargin1, HasMarksInMargin2: Boolean; delta1, delta2: Integer; begin - if (AValue2 = AImage2 - AMargin2) then + HasMarksInMargin1 := (AValue1 = AImage1 + AMargin1); + HasMarksInMargin2 := (AValue2 = AImage2 - AMargin2); + + if HasMarksInMargin2 and not HasMarksInMargin1 then AValue1 := AValue2 - AGuaranteed else - if (AValue1 = AImage1 + AMargin1) then + if HasMarksInMargin1 and not HasMarksInMargin2 then AValue2 := AValue1 + AGuaranteed - else begin + else + begin delta1 := AImage1 - AValue1; delta2 := AImage2 - AValue2; AValue1 := (AImage1 + AImage2 - AGuaranteed) div 2; @@ -1243,7 +1248,7 @@ end; constructor TAxisCoeffHelper.Init(AAxis: TChartAxis; AImageLo, AImageHi: Integer; AMarginLo, AMarginHi, ARequiredMarginLo, ARequiredMarginHi, AMinDataSpace: Integer; - AHasMarksInMargin, AAxisIsVertical: Boolean; AMin, AMax: PDouble); + AAxisIsVertical: Boolean; AMin, AMax: PDouble); begin FAxisIsFlipped := (AAxis <> nil) and AAxis.IsFlipped; FImageLo := AImageLo; @@ -1253,16 +1258,14 @@ begin FLo := FImageLo + AMarginLo; FHi := FImageHi + AMarginHi; - if AHasMarksInMargin then begin - if AAxisIsVertical then begin - if (FHi + AMinDataSpace >= FLo) then - EnsureGuaranteedSpace(FHi, FLo, FImageHi, FImageLo, - ARequiredMarginHi, ARequiredMarginLo, AMinDataSpace); - end else begin - if (FLo + AMinDataSpace >= FHi) then - EnsureGuaranteedSpace(FLo, FHi, FImageLo, FImageHi, - ARequiredMarginLo, ARequiredMarginHi, AMinDataSpace); - end; + if AAxisIsVertical then begin + if (FHi + AMinDataSpace >= FLo) then + EnsureGuaranteedSpace(FHi, FLo, FImageHi, FImageLo, + ARequiredMarginHi, ARequiredMarginLo, AMinDataSpace); + end else begin + if (FLo + AMinDataSpace >= FHi) then + EnsureGuaranteedSpace(FLo, FHi, FImageLo, FImageHi, + ARequiredMarginLo, ARequiredMarginHi, AMinDataSpace); end; end; diff --git a/components/tachart/tagraph.pas b/components/tachart/tagraph.pas index 8b1c3bbc4f..e975407591 100644 --- a/components/tachart/tagraph.pas +++ b/components/tachart/tagraph.pas @@ -594,12 +594,10 @@ begin rX.Init( HorAxis, FClipRect.Left, FClipRect.Right, AMargin.Left, -AMargin.Right, AChartMargins.Left, AChartMargins.Right, AMinDataSpace, - (AMargin.Left <> AChartMargins.Left) or (AMargin.Right <> AChartMargins.Right), false, @FCurrentExtent.a.X, @FCurrentExtent.b.X); rY.Init( VertAxis, FClipRect.Bottom, FClipRect.Top, -AMargin.Bottom, AMargin.Top, AChartMargins.Bottom, AChartMargins.Top, AMinDataSpace, - (AMargin.Top <> AChartMargins.Top) or (AMargin.Bottom <> AChartMargins.Bottom), true, @FCurrentExtent.a.Y, @FCurrentExtent.b.Y); FScale.X := rX.CalcScale(1);