From 267efe922d0f94bf25b1427b2641b832cce13728 Mon Sep 17 00:00:00 2001 From: skalogryz Date: Fri, 29 Jul 2016 19:01:40 +0000 Subject: [PATCH] richmemo: speed up range style selection by comparing flag to initalStyle rather than all supported styles git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5050 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../richmemo/win32/win32richmemoproc.pas | 43 +++++++++++++------ 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/components/richmemo/win32/win32richmemoproc.pas b/components/richmemo/win32/win32richmemoproc.pas index b9cd19a36..72e14d838 100644 --- a/components/richmemo/win32/win32richmemoproc.pas +++ b/components/richmemo/win32/win32richmemoproc.pas @@ -521,10 +521,9 @@ var sel : TCHARRANGE; d : Integer; last : Integer; - + initMask : DWORD; const ALL_MASK = CFM_RICHMEMO_ATTRS; - begin Result := false; if (RichEditWnd = 0) then Exit; @@ -538,33 +537,47 @@ begin FillChar(fmt, sizeof(fmt), 0); fmt.cbSize := sizeof(fmt); + + sel.cpMin := TextStart; + sel.cpMax := TextStart; + SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel)); + SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt)); + initMask := fmt.dwMask and ALL_MASK; + FillChar(fmt, sizeof(fmt), 0); + fmt.cbSize := sizeof(fmt); + sel.cpMin := TextStart; sel.cpMax := len+1; SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel)); SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt)); - if (fmt.dwMask and ALL_MASK) <> ALL_MASK then begin + fmt.dwMask:=fmt.dwMask and ALL_MASK; + + if fmt.dwMask <> initMask then begin d := (len - sel.cpMin); while d > 1 do begin d := d div 2; - if (fmt.dwMask and ALL_MASK) = ALL_MASK then + if fmt.dwMask = initMask then sel.cpMax := sel.cpMax + d else sel.cpMax := sel.cpMax - d; SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel)); SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt)); + fmt.dwMask:=fmt.dwMask and ALL_MASK; end; - if (fmt.dwMask and ALL_MASK) = ALL_MASK then begin - while (sel.cpMax <= len) and ((fmt.dwMask and ALL_MASK) = ALL_MASK) do begin + if fmt.dwMask = initMask then begin + while (sel.cpMax <= len) and (fmt.dwMask = initMask) do begin inc(sel.cpMax); SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel)); SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt)); + fmt.dwMask:=fmt.dwMask and ALL_MASK; end; end else begin - while (sel.cpMax > sel.cpMin) and ((fmt.dwMask and ALL_MASK) <> ALL_MASK) do begin + while (sel.cpMax > sel.cpMin) and (fmt.dwMask <> initMask) do begin dec(sel.cpMax); SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel)); SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt)); + fmt.dwMask:=fmt.dwMask and ALL_MASK; end; inc(sel.cpMax); end; @@ -575,29 +588,33 @@ begin sel.cpMax := TextStart+1; SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel)); SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt)); - if (fmt.dwMask and ALL_MASK) <> ALL_MASK then begin + fmt.dwMask:=fmt.dwMask and ALL_MASK; + if fmt.dwMask <> initMask then begin d := TextStart; while d > 1 do begin d := d div 2; - if (fmt.dwMask and ALL_MASK) = ALL_MASK then + if fmt.dwMask = initMask then dec(sel.cpMin,d) else inc(sel.cpMin,d); SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel)); SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt)); + fmt.dwMask:=fmt.dwMask and ALL_MASK; end; - if (fmt.dwMask and ALL_MASK) = ALL_MASK then begin - while (sel.cpMin > 0) and ((fmt.dwMask and ALL_MASK) = ALL_MASK) do begin + if (fmt.dwMask = initMask) then begin + while (sel.cpMin > 0) and (fmt.dwMask = initMask) do begin dec(sel.cpMin); SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel)); SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt)); + fmt.dwMask:=fmt.dwMask and ALL_MASK; end; - if (fmt.dwMask and ALL_MASK) <> ALL_MASK then inc(sel.cpMin); + if (fmt.dwMask = initMask) then inc(sel.cpMin); end else begin - while (sel.cpMin < TextStart) and ((fmt.dwMask and ALL_MASK) <> ALL_MASK) do begin + while (sel.cpMin < TextStart) and (fmt.dwMask <> initMask) do begin inc(sel.cpMin); SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel)); SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt)); + fmt.dwMask:=fmt.dwMask and ALL_MASK; end; end; end;