From fad67e71ecd08a4c926e221f6553adadb9498aea Mon Sep 17 00:00:00 2001 From: Martin Date: Sun, 21 Jan 2024 00:49:38 +0100 Subject: [PATCH] SynEdit: Improve GetPhysicalCharWidths in paint. --- components/synedit/lazsyntextarea.pp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/components/synedit/lazsyntextarea.pp b/components/synedit/lazsyntextarea.pp index 9a265d0eb2..76454f0262 100644 --- a/components/synedit/lazsyntextarea.pp +++ b/components/synedit/lazsyntextarea.pp @@ -54,7 +54,7 @@ type FLinesView: TSynEditStrings; FMarkupManager: TSynEditMarkupManager; - FCharWidths: TPhysicalCharWidths; + FCharWidths, FCharWidths2: TPhysicalCharWidths; FCharWidthsLen: Integer; FCurTxtLineIdx : Integer; FCurLineByteLen: Integer; @@ -314,6 +314,7 @@ end; procedure TLazSynPaintTokenBreaker.Finish; begin FCharWidths := nil; + FCharWidths2 := nil; end; procedure TLazSynPaintTokenBreaker.SetHighlighterTokensLine(ALine: TLineIdx; out @@ -322,9 +323,17 @@ var LogLeftPos: Integer; begin FDisplayView.SetHighlighterTokensLine(ALine, ARealLine, LogLeftPos, FCurLineByteLen); - FCharWidths := FLinesView.GetPhysicalCharWidths(ARealLine); - FCharWidthsLen := Length(FCharWidths); - FLinesView.GetPhysicalCharWidths(ARealLine, FCharWidths, FCharWidthsLen); + if FLinesView.LogPhysConvertor.CurrentLine = ARealLine then begin + FCharWidths2 := FCharWidths; + FCharWidths :=FLinesView.LogPhysConvertor.CurrentWidthsDirect; + end + else begin + if FCharWidths2 <> nil then begin + FCharWidths := FCharWidths2; + FCharWidths2 := nil; + end; + FLinesView.GetPhysicalCharWidths(ARealLine, FCharWidths, FCharWidthsLen); + end; FCurLineByteLen := FCurLineByteLen + LogLeftPos - 1; FCurViewToken.TokenLength := 0; @@ -1790,6 +1799,7 @@ var rcLine.Left := DrawLeft; LineBufferRtlLogPos := -1; + CharWidths := nil; // keep refcnt = 1 -- in case they get resized FTokenBreaker.SetHighlighterTokensLine(TV + CurLine, CurTextIndex); CharWidths := FTokenBreaker.CharWidths; fMarkupManager.PrepareMarkupForRow(CurTextIndex+1);