• R/O
  • SSH
  • HTTPS

tortoisesvn: Commit


Commit MetaInfo

Révision28967 (tree)
l'heure2020-09-16 02:13:19
Auteurstefankueng

Message de Log

Merged revision(s) r28963, r28964, r28965, r28966 from trunk:
* use DrawText instead of ExtTextOut because DrawText uses fallback fonts if a char can't be drawn in the selected font.
* use DrawText instead of ExtTextOut in all other places where necessary.
* update to Scintilla 4.4.5
* apply the background colors patch.

Change Summary

Modification

--- branches/1.14.x/ext/scintilla/.hg_archival.txt (revision 28966)
+++ branches/1.14.x/ext/scintilla/.hg_archival.txt (revision 28967)
@@ -1,6 +1,6 @@
11 repo: bdf8c3ef2fb01ea24578e726337888e706d10b92
2-node: 5fbdb19e6cee93d98a2894cbf7f080d640cb71be
2+node: a4107157801b54d9c8cd0f627d0196a3089c3df1
33 branch: default
4-latesttag: rel-4-4-4
4+latesttag: rel-4-4-5
55 latesttagdistance: 1
66 changessincelatesttag: 1
--- branches/1.14.x/ext/scintilla/backgroundcolors.patch (revision 28966)
+++ branches/1.14.x/ext/scintilla/backgroundcolors.patch (revision 28967)
@@ -1,8 +1,8 @@
11 Index: include/Scintilla.h
22 ===================================================================
3---- include/Scintilla.h (revision 28958)
3+--- include/Scintilla.h (revision 28965)
44 +++ include/Scintilla.h (working copy)
5-@@ -1172,6 +1172,8 @@
5+@@ -1173,6 +1173,8 @@
66
77 #endif
88
@@ -13,7 +13,7 @@
1313 * So older code that treats Scintilla as a RichEdit will work. */
1414 Index: src/Editor.cxx
1515 ===================================================================
16---- src/Editor.cxx (revision 28958)
16+--- src/Editor.cxx (revision 28965)
1717 +++ src/Editor.cxx (working copy)
1818 @@ -110,6 +110,7 @@
1919 }
@@ -25,7 +25,7 @@
2525 stylesValid = false;
2626 Index: src/Editor.h
2727 ===================================================================
28---- src/Editor.h (revision 28958)
28+--- src/Editor.h (revision 28965)
2929 +++ src/Editor.h (working copy)
3030 @@ -623,6 +623,7 @@
3131 public:
@@ -37,7 +37,7 @@
3737 // Public so scintilla_send_message can use it.
3838 Index: src/EditView.cxx
3939 ===================================================================
40---- src/EditView.cxx (revision 28958)
40+--- src/EditView.cxx (revision 28965)
4141 +++ src/EditView.cxx (working copy)
4242 @@ -56,6 +56,7 @@
4343 #include "MarginView.h"
@@ -76,7 +76,7 @@
7676
7777 Index: src/EditView.h
7878 ===================================================================
79---- src/EditView.h (revision 28958)
79+--- src/EditView.h (revision 28965)
8080 +++ src/EditView.h (working copy)
8181 @@ -77,6 +77,7 @@
8282 std::unique_ptr<Surface> pixmapLine;
@@ -88,7 +88,7 @@
8888 PositionCache posCache;
8989 Index: win32/ScintillaWin.cxx
9090 ===================================================================
91---- win32/ScintillaWin.cxx (revision 28958)
91+--- win32/ScintillaWin.cxx (revision 28965)
9292 +++ win32/ScintillaWin.cxx (working copy)
9393 @@ -424,6 +424,7 @@
9494 void SetCtrlID(int identifier) override;
@@ -98,7 +98,7 @@
9898 void NotifyDoubleClick(Point pt, int modifiers) override;
9999 CaseFolder *CaseFolderForEncoding() override;
100100 std::string CaseMapString(const std::string &s, int caseMapping) override;
101-@@ -2279,6 +2280,13 @@
101+@@ -2284,6 +2285,13 @@
102102 GetCtrlID(), reinterpret_cast<LPARAM>(&scn));
103103 }
104104
--- branches/1.14.x/ext/scintilla/doc/ScintillaDoc.html (revision 28966)
+++ branches/1.14.x/ext/scintilla/doc/ScintillaDoc.html (revision 28967)
@@ -119,7 +119,7 @@
119119
120120 <h1>Scintilla Documentation</h1>
121121
122- <p>Last edited 29 March 2020 NH</p>
122+ <p>Last edited 9 September 2020 NH</p>
123123
124124 <p>There is <a class="jump" href="Design.html">an overview of the internal design of
125125 Scintilla</a>.<br />
@@ -289,6 +289,16 @@
289289 As the protocol only supports object lexers, an additional function <code>CreateLexer(const char *name)</code>
290290 is exposed which will create a lexer object (ILexer5 *) for any object lexer or function lexer.
291291 </p>
292+
293+ <p>Lexer libraries that provide the same functions as Lexilla may provide lexers for use by Scintilla,
294+ augmenting or replacing those provided by Lexilla.
295+ To allow initialisation of lexer libraries, a <code>SetLibraryProperty(const char *key, const char *value)</code>
296+ may optionally be implemented. For example, a lexer library that uses XML based lexer definitions may
297+ be provided with a directory to search for such definitions.
298+ Lexer libraries should ignore any properties that they do not understand.
299+ The set of properties supported by a lexer library is specified as a '\n' separated list of property names by
300+ an optional <code>const char *GetLibraryPropertyNames()</code> function.
301+ </p>
292302
293303 <p>A lexer created by Lexilla may be used in Scintilla by calling
294304 <a class="seealso" href="#SCI_SETILEXER">SCI_SETILEXER</a>.</p>
@@ -6856,6 +6866,8 @@
68566866 <br />
68576867 <a class="message" href="#SCI_MULTIEDGEADDLINE">SCI_MULTIEDGEADDLINE(position column, colour edgeColour)</a><br />
68586868 <a class="message" href="#SCI_MULTIEDGECLEARALL">SCI_MULTIEDGECLEARALL</a><br />
6869+ <a class="message" href="#SCI_GETMULTIEDGECOLUMN">SCI_GETMULTIEDGECOLUMN(int which)</a>
6870+ <br />
68596871 </code>
68606872
68616873 <p><b id="SCI_SETEDGEMODE">SCI_SETEDGEMODE(int edgeMode)</b><br />
@@ -6933,10 +6945,13 @@
69336945 <p><b id="SCI_MULTIEDGEADDLINE">SCI_MULTIEDGEADDLINE(position column,
69346946 <a class="jump" href="#colour">colour</a> edgeColour)</b><br />
69356947 <b id="SCI_MULTIEDGECLEARALL">SCI_MULTIEDGECLEARALL</b><br />
6948+ <b id="SCI_GETMULTIEDGECOLUMN">SCI_GETMULTIEDGECOLUMN(int which)</b><br />
69366949 <code>SCI_MULTIEDGEADDLINE</code> adds a new vertical edge to the view. The edge will be
69376950 displayed at the given column number. The resulting edge position depends on the metric
69386951 of a space character in <code>STYLE_DEFAULT</code>. All the edges can be cleared with
6939- <code>SCI_MULTIEDGECLEARALL</code>.</p>
6952+ <code>SCI_MULTIEDGECLEARALL</code>. <code>SCI_GETMULTIEDGECOLUMN</code> returns the column of the
6953+ Nth vertical edge (indexed from 0). If <code class="parameter">which</code> is greater or equal
6954+ to the number of vertical edges, this returns -1.</p>
69406955
69416956 <h2 id="Accessibility">Accessibility</h2>
69426957
--- branches/1.14.x/ext/scintilla/doc/ScintillaDownload.html (revision 28966)
+++ branches/1.14.x/ext/scintilla/doc/ScintillaDownload.html (revision 28967)
@@ -26,9 +26,9 @@
2626 <table bgcolor="#CCCCCC" width="100%" cellspacing="0" cellpadding="8" border="0">
2727 <tr>
2828 <td>
29- <font size="4"> <a href="https://www.scintilla.org/scintilla444.zip">
29+ <font size="4"> <a href="https://www.scintilla.org/scintilla445.zip">
3030 Windows</a>&nbsp;&nbsp;
31- <a href="https://www.scintilla.org/scintilla444.tgz">
31+ <a href="https://www.scintilla.org/scintilla445.tgz">
3232 GTK/Linux</a>&nbsp;&nbsp;
3333 </font>
3434 </td>
@@ -42,7 +42,7 @@
4242 containing very few restrictions.
4343 </p>
4444 <h3>
45- Release 4.4.4
45+ Release 4.4.5
4646 </h3>
4747 <h4>
4848 Source Code
@@ -50,8 +50,8 @@
5050 The source code package contains all of the source code for Scintilla but no binary
5151 executable code and is available in
5252 <ul>
53- <li><a href="https://www.scintilla.org/scintilla444.zip">zip format</a> (1.8M) commonly used on Windows</li>
54- <li><a href="https://www.scintilla.org/scintilla444.tgz">tgz format</a> (1.6M) commonly used on Linux and compatible operating systems</li>
53+ <li><a href="https://www.scintilla.org/scintilla445.zip">zip format</a> (1.8M) commonly used on Windows</li>
54+ <li><a href="https://www.scintilla.org/scintilla445.tgz">tgz format</a> (1.6M) commonly used on Linux and compatible operating systems</li>
5555 </ul>
5656 Instructions for building on both Windows and Linux are included in the readme file.
5757 <h4>
--- branches/1.14.x/ext/scintilla/doc/ScintillaHistory.html (revision 28966)
+++ branches/1.14.x/ext/scintilla/doc/ScintillaHistory.html (revision 28967)
@@ -558,6 +558,9 @@
558558 <td>Prakash Sahni</td>
559559 </tr><tr>
560560 <td>Michel Sauvard</td>
561+ <td>uhf7</td>
562+ <td>gnombat</td>
563+ <td>Derek Brown</td>
561564 </tr>
562565 </table>
563566 <p>
@@ -570,6 +573,75 @@
570573 </li>
571574 </ul>
572575 <h3>
576+ <a href="https://www.scintilla.org/scite445.zip">Release 4.4.5</a>
577+ </h3>
578+ <ul>
579+ <li>
580+ Released 11 September 2020.
581+ </li>
582+ <li>
583+ Lexilla interface supports setting initialisation properties on lexer libraries with
584+ SetLibraryProperty and GetLibraryPropertyNames functions.
585+ These are called by SciTE which will forward properties to lexer libraries that are prefixed with
586+ "lexilla.context.".
587+ </li>
588+ <li>
589+ Allow cross-building for GTK by choosing pkg-config.
590+ <a href="https://sourceforge.net/p/scintilla/bugs/2189/">Bug #2189</a>.
591+ </li>
592+ <li>
593+ On GTK, allow setting CPPFLAGS (and LDFLAGS for SciTE) to support hardening.
594+ <a href="https://sourceforge.net/p/scintilla/bugs/2191/">Bug #2191</a>.
595+ </li>
596+ <li>
597+ Changed SciTE's indent.auto mode to set tab size to indent size when file uses tabs for indentation.
598+ <a href="https://sourceforge.net/p/scintilla/bugs/2198/">Bug #2198</a>.
599+ </li>
600+ <li>
601+ Fix position of marker symbols for SC_MARGIN_RTEXT which were being moved based on
602+ width of text.
603+ </li>
604+ <li>
605+ Fixed bug on Win32 where cursor was flickering between hand and text over an
606+ indicator with hover style.
607+ <a href="https://sourceforge.net/p/scintilla/bugs/2170/">Bug #2170</a>.
608+ </li>
609+ <li>
610+ Fixed bug where hovered indicator was not returning to non-hover
611+ appearance when mouse moved out of window or into margin.
612+ <a href="https://sourceforge.net/p/scintilla/bugs/2193/">Bug #2193</a>.
613+ </li>
614+ <li>
615+ Fixed bug where a hovered INDIC_TEXTFORE indicator was not applying the hover
616+ colour to the whole range.
617+ <a href="https://sourceforge.net/p/scintilla/bugs/2199/">Bug #2199</a>.
618+ </li>
619+ <li>
620+ Fixed bug where gradient indicators were not showing hovered appearance.
621+ </li>
622+ <li>
623+ Fixed bug where layout caching was ineffective.
624+ <a href="https://sourceforge.net/p/scintilla/bugs/2197/">Bug #2197</a>.
625+ </li>
626+ <li>
627+ For SciTE, don't show the output pane for quiet jobs.
628+ <a href="https://sourceforge.net/p/scintilla/feature-requests/1365/">Feature #1365</a>.
629+ </li>
630+ <li>
631+ Support command.quiet for SciTE on GTK.
632+ <a href="https://sourceforge.net/p/scintilla/feature-requests/1365/">Feature #1365</a>.
633+ </li>
634+ <li>
635+ Fixed a bug in SciTE with stack balance when a syntax error in the Lua startup script
636+ caused continuing failures to find functions after the syntax error was corrected.
637+ <a href="https://sourceforge.net/p/scintilla/bugs/2176/">Bug #2176</a>.
638+ </li>
639+ <li>
640+ Added method for iterating through multiple vertical edges: SCI_GETMULTIEDGECOLUMN.
641+ <a href="https://sourceforge.net/p/scintilla/feature-requests/1350/">Feature #1350</a>.
642+ </li>
643+ </ul>
644+ <h3>
573645 <a href="https://www.scintilla.org/scite444.zip">Release 4.4.4</a>
574646 </h3>
575647 <ul>
--- branches/1.14.x/ext/scintilla/doc/index.html (revision 28966)
+++ branches/1.14.x/ext/scintilla/doc/index.html (revision 28967)
@@ -9,7 +9,7 @@
99 <meta name="keywords" content="Scintilla, SciTE, Editing Component, Text Editor" />
1010 <meta name="Description"
1111 content="www.scintilla.org is the home of the Scintilla editing component and SciTE text editor application." />
12- <meta name="Date.Modified" content="20200721" />
12+ <meta name="Date.Modified" content="20200911" />
1313 <meta name="viewport" content="width=device-width, initial-scale=1" />
1414 <style type="text/css">
1515 #versionlist {
@@ -56,8 +56,8 @@
5656 GTK, and OS X</font>
5757 </td>
5858 <td width="40%" align="right">
59- <font color="#FFCC99" size="3"> Release version 4.4.4<br />
60- Site last modified July 21 2020</font>
59+ <font color="#FFCC99" size="3"> Release version 4.4.5<br />
60+ Site last modified September 11 2020</font>
6161 </td>
6262 <td width="20%">
6363 &nbsp;
@@ -72,12 +72,12 @@
7272 </tr>
7373 </table>
7474 <ul id="versionlist">
75+ <li>Version 4.4.5 fixes bugs with indicators, margin text, and ineffective layout caching.</li>
7576 <li>Version 4.4.4 implements end of line annotations.</li>
7677 <li>Version 4.4.3 was released just to fix SciTE.</li>
7778 <li>Version 4.4.2 fixes Lexilla build problems with Xcode and as a static library on Win32.</li>
7879 <li>Version 4.4.0 builds Scintilla without lexers as a shared library for GTK,
7980 and adds Xcode projects for Scintilla without lexers and Lexilla on macOS.</li>
80- <li>Version 4.3.3 adds methods for iterating marker handles and marker numbers on a line.</li>
8181 </ul>
8282 <ul id="menu">
8383 <li id="remote1"><a href="https://www.scintilla.org/SciTEImage.html">Screenshot</a></li>
--- branches/1.14.x/ext/scintilla/include/Scintilla.h (revision 28966)
+++ branches/1.14.x/ext/scintilla/include/Scintilla.h (revision 28967)
@@ -703,6 +703,7 @@
703703 #define SCI_SETEDGECOLOUR 2365
704704 #define SCI_MULTIEDGEADDLINE 2694
705705 #define SCI_MULTIEDGECLEARALL 2695
706+#define SCI_GETMULTIEDGECOLUMN 2749
706707 #define SCI_SEARCHANCHOR 2366
707708 #define SCI_SEARCHNEXT 2367
708709 #define SCI_SEARCHPREV 2368
--- branches/1.14.x/ext/scintilla/lexilla/scripts/LexillaGen.py (revision 28966)
+++ branches/1.14.x/ext/scintilla/lexilla/scripts/LexillaGen.py (revision 28967)
@@ -117,7 +117,7 @@
117117
118118 lexerReferences = ScintillaData.FindLexersInXcode(lexillaXcodeProject)
119119
120- UpdateLineInPlistFile(lexillaXcode / "Lexilla" / "Info.plist",
120+ UpdateLineInPlistFile(lexillaXcode / "Info.plist",
121121 "CFBundleShortVersionString", versionDotted)
122122
123123 ReplaceREInFile(lexillaXcodeProject, "CURRENT_PROJECT_VERSION = [0-9.]+;",
--- branches/1.14.x/ext/scintilla/lexilla/src/Lexilla/Lexilla/Info.plist (revision 28966)
+++ branches/1.14.x/ext/scintilla/lexilla/src/Lexilla/Lexilla/Info.plist (nonexistent)
@@ -1,24 +0,0 @@
1-<?xml version="1.0" encoding="UTF-8"?>
2-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3-<plist version="1.0">
4-<dict>
5- <key>CFBundleDevelopmentRegion</key>
6- <string>$(DEVELOPMENT_LANGUAGE)</string>
7- <key>CFBundleExecutable</key>
8- <string>$(EXECUTABLE_NAME)</string>
9- <key>CFBundleIdentifier</key>
10- <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
11- <key>CFBundleInfoDictionaryVersion</key>
12- <string>6.0</string>
13- <key>CFBundleName</key>
14- <string>$(PRODUCT_NAME)</string>
15- <key>CFBundlePackageType</key>
16- <string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
17- <key>CFBundleShortVersionString</key>
18- <string>4.4.3</string>
19- <key>CFBundleVersion</key>
20- <string>$(CURRENT_PROJECT_VERSION)</string>
21- <key>NSHumanReadableCopyright</key>
22- <string>Copyright © 2020 Neil Hodgson. All rights reserved.</string>
23-</dict>
24-</plist>
--- branches/1.14.x/ext/scintilla/lexilla/version.txt (revision 28966)
+++ branches/1.14.x/ext/scintilla/lexilla/version.txt (revision 28967)
@@ -1 +1 @@
1-444
1+445
--- branches/1.14.x/ext/scintilla/src/Document.cxx (revision 28966)
+++ branches/1.14.x/ext/scintilla/src/Document.cxx (revision 28967)
@@ -2366,10 +2366,12 @@
23662366 }
23672367
23682368 void Document::AnnotationSetStyle(Sci::Line line, int style) {
2369- Annotations()->SetStyle(line, style);
2370- const DocModification mh(SC_MOD_CHANGEANNOTATION, LineStart(line),
2371- 0, 0, 0, line);
2372- NotifyModified(mh);
2369+ if (line >= 0 && line < LinesTotal()) {
2370+ Annotations()->SetStyle(line, style);
2371+ const DocModification mh(SC_MOD_CHANGEANNOTATION, LineStart(line),
2372+ 0, 0, 0, line);
2373+ NotifyModified(mh);
2374+ }
23732375 }
23742376
23752377 void Document::AnnotationSetStyles(Sci::Line line, const unsigned char *styles) {
@@ -2406,10 +2408,12 @@
24062408 }
24072409
24082410 void Document::EOLAnnotationSetStyle(Sci::Line line, int style) {
2409- EOLAnnotations()->SetStyle(line, style);
2410- const DocModification mh(SC_MOD_CHANGEEOLANNOTATION, LineStart(line),
2411- 0, 0, 0, line);
2412- NotifyModified(mh);
2411+ if (line >= 0 && line < LinesTotal()) {
2412+ EOLAnnotations()->SetStyle(line, style);
2413+ const DocModification mh(SC_MOD_CHANGEEOLANNOTATION, LineStart(line),
2414+ 0, 0, 0, line);
2415+ NotifyModified(mh);
2416+ }
24132417 }
24142418
24152419 void Document::EOLAnnotationClearAll() {
--- branches/1.14.x/ext/scintilla/src/EditView.cxx (revision 28966)
+++ branches/1.14.x/ext/scintilla/src/EditView.cxx (revision 28967)
@@ -389,6 +389,9 @@
389389 if (posLineEnd >(posLineStart + ll->maxLineLength)) {
390390 posLineEnd = posLineStart + ll->maxLineLength;
391391 }
392+ // Hard to cope when too narrow, so just assume there is space
393+ width = std::max(width, 20);
394+
392395 if (ll->validity == LineLayout::ValidLevel::checkTextAndStyle) {
393396 Sci::Position lineLength = posLineEnd - posLineStart;
394397 if (!vstyle.viewEOL) {
@@ -398,23 +401,21 @@
398401 // See if chars, styles, indicators, are all the same
399402 bool allSame = true;
400403 // Check base line layout
401- int styleByte = 0;
402- int numCharsInLine = 0;
403404 char chPrevious = 0;
404- while (numCharsInLine < lineLength) {
405+ for (Sci::Position numCharsInLine = 0; numCharsInLine < lineLength; numCharsInLine++) {
405406 const Sci::Position charInDoc = numCharsInLine + posLineStart;
406407 const char chDoc = model.pdoc->CharAt(charInDoc);
407- styleByte = model.pdoc->StyleIndexAt(charInDoc);
408+ const int styleByte = model.pdoc->StyleIndexAt(charInDoc);
408409 allSame = allSame &&
409410 (ll->styles[numCharsInLine] == styleByte);
410411 allSame = allSame &&
411412 (ll->chars[numCharsInLine] == CaseForce(vstyle.styles[styleByte].caseForce, chDoc, chPrevious));
412413 chPrevious = chDoc;
413- numCharsInLine++;
414414 }
415- allSame = allSame && (ll->styles[numCharsInLine] == styleByte); // For eolFilled
415+ const int styleByteLast = (posLineEnd > posLineStart) ? model.pdoc->StyleIndexAt(posLineEnd - 1) : 0;
416+ allSame = allSame && (ll->styles[lineLength] == styleByteLast); // For eolFilled
416417 if (allSame) {
417- ll->validity = LineLayout::ValidLevel::positions;
418+ ll->validity = (ll->widthLine != width) ? LineLayout::ValidLevel::positions : LineLayout::ValidLevel::lines;
418419 } else {
419420 ll->validity = LineLayout::ValidLevel::invalid;
420421 }
@@ -508,10 +509,6 @@
508509 ll->numCharsBeforeEOL = numCharsBeforeEOL;
509510 ll->validity = LineLayout::ValidLevel::positions;
510511 }
511- // Hard to cope when too narrow, so just assume there is space
512- if (width < 20) {
513- width = 20;
514- }
515512 if ((ll->validity == LineLayout::ValidLevel::positions) || (ll->widthLine != width)) {
516513 ll->widthLine = width;
517514 if (width == LineLayout::wrapWidthInfinite) {
@@ -1900,9 +1897,12 @@
19001897 const int indicatorValue = deco->ValueAt(ts.start + posLineStart);
19011898 if (indicatorValue) {
19021899 const Indicator &indicator = vsDraw.indicators[deco->Indicator()];
1903- const bool hover = indicator.IsDynamic() &&
1904- ((model.hoverIndicatorPos >= ts.start + posLineStart) &&
1905- (model.hoverIndicatorPos <= ts.end() + posLineStart));
1900+ bool hover = false;
1901+ if (indicator.IsDynamic()) {
1902+ const Sci::Position startPos = ts.start + posLineStart;
1903+ const Range rangeRun(deco->StartRun(startPos), deco->EndRun(startPos));
1904+ hover = rangeRun.ContainsCharacter(model.hoverIndicatorPos);
1905+ }
19061906 if (hover) {
19071907 if (indicator.sacHover.style == INDIC_TEXTFORE) {
19081908 textFore = indicator.sacHover.fore;
--- branches/1.14.x/ext/scintilla/src/Editor.cxx (revision 28966)
+++ branches/1.14.x/ext/scintilla/src/Editor.cxx (revision 28967)
@@ -4437,7 +4437,8 @@
44374437 }
44384438
44394439 void Editor::LineSelection(Sci::Position lineCurrentPos_, Sci::Position lineAnchorPos_, bool wholeLine) {
4440- Sci::Position selCurrentPos, selAnchorPos;
4440+ Sci::Position selCurrentPos;
4441+ Sci::Position selAnchorPos;
44414442 if (wholeLine) {
44424443 const Sci::Line lineCurrent_ = pdoc->SciLineFromPosition(lineCurrentPos_);
44434444 const Sci::Line lineAnchor_ = pdoc->SciLineFromPosition(lineAnchorPos_);
@@ -4507,6 +4508,7 @@
45074508
45084509 void Editor::MouseLeave() {
45094510 SetHotSpotRange(nullptr);
4511+ SetHoverIndicatorPosition(Sci::invalidPosition);
45104512 if (!HaveMouseCapture()) {
45114513 ptMouseLast = Point(-1, -1);
45124514 DwellEnd(true);
@@ -4586,7 +4588,8 @@
45864588 charPos = MovePositionOutsideChar(charPos, -1);
45874589 }
45884590
4589- Sci::Position startWord, endWord;
4591+ Sci::Position startWord;
4592+ Sci::Position endWord;
45904593 if ((sel.MainCaret() >= originalAnchorPos) && !pdoc->IsLineEndPosition(charPos)) {
45914594 startWord = pdoc->ExtendWordSelect(pdoc->MovePositionOutsideChar(charPos + 1, 1), -1);
45924595 endWord = pdoc->ExtendWordSelect(charPos, 1);
@@ -4875,6 +4878,7 @@
48754878 if (PointInSelMargin(pt)) {
48764879 DisplayCursor(GetMarginCursor(pt));
48774880 SetHotSpotRange(nullptr);
4881+ SetHoverIndicatorPosition(Sci::invalidPosition);
48784882 return; // No need to test for selection
48794883 }
48804884 }
@@ -4881,6 +4885,7 @@
48814885 // Display regular (drag) cursor over selection
48824886 if (PointInSelection(pt) && !SelectionEmpty()) {
48834887 DisplayCursor(Window::cursorArrow);
4888+ SetHoverIndicatorPosition(Sci::invalidPosition);
48844889 } else {
48854890 SetHoverIndicatorPoint(pt);
48864891 if (PointIsHotspot(pt)) {
@@ -5616,7 +5621,7 @@
56165621 targetRange.end = targetRange.start;
56175622
56185623 // Realize virtual space of target start
5619- Sci::Position startAfterSpaceInsertion = RealizeVirtualSpace(targetRange.start.Position(), targetRange.start.VirtualSpace());
5624+ const Sci::Position startAfterSpaceInsertion = RealizeVirtualSpace(targetRange.start.Position(), targetRange.start.VirtualSpace());
56205625 targetRange.start.SetPosition(startAfterSpaceInsertion);
56215626 targetRange.end = targetRange.start;
56225627
@@ -5763,6 +5768,9 @@
57635768 }
57645769
57655770 void Editor::SetSelectionNMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
5771+ if (wParam >= sel.Count()) {
5772+ return;
5773+ }
57665774 InvalidateRange(sel.Range(wParam).Start().Position(), sel.Range(wParam).End().Position());
57675775
57685776 switch (iMessage) {
@@ -7698,7 +7706,7 @@
76987706 break;
76997707
77007708 case SCI_MULTIEDGEADDLINE:
7701- vs.theMultiEdge.push_back(EdgeProperties(wParam, lParam));
7709+ vs.AddMultiEdge(wParam, lParam);
77027710 InvalidateStyleRedraw();
77037711 break;
77047712
@@ -7707,6 +7715,15 @@
77077715 InvalidateStyleRedraw();
77087716 break;
77097717
7718+ case SCI_GETMULTIEDGECOLUMN: {
7719+ const size_t which = wParam;
7720+ // size_t is unsigned so this also handles negative inputs.
7721+ if (which >= vs.theMultiEdge.size()) {
7722+ return -1;
7723+ }
7724+ return vs.theMultiEdge[which].column;
7725+ }
7726+
77107727 case SCI_GETACCESSIBILITY:
77117728 return SC_ACCESSIBILITY_DISABLED;
77127729
--- branches/1.14.x/ext/scintilla/src/Indicator.cxx (revision 28966)
+++ branches/1.14.x/ext/scintilla/src/Indicator.cxx (revision 28967)
@@ -172,8 +172,8 @@
172172 rcBox.top = rcLine.top + 1;
173173 rcBox.bottom = rcLine.bottom;
174174 const Surface::GradientOptions options = Surface::GradientOptions::topToBottom;
175- const ColourAlpha start(sacNormal.fore, fillAlpha);
176- const ColourAlpha end(sacNormal.fore, 0);
175+ const ColourAlpha start(sacDraw.fore, fillAlpha);
176+ const ColourAlpha end(sacDraw.fore, 0);
177177 std::vector<ColourStop> stops;
178178 switch (sacDraw.style) {
179179 case INDIC_GRADIENT:
--- branches/1.14.x/ext/scintilla/src/MarginView.cxx (revision 28966)
+++ branches/1.14.x/ext/scintilla/src/MarginView.cxx (revision 28967)
@@ -365,9 +365,11 @@
365365
366366 marks &= vs.ms[margin].mask;
367367
368- PRectangle rcMarker = rcSelMargin;
369- rcMarker.top = static_cast<XYPOSITION>(yposScreen);
370- rcMarker.bottom = static_cast<XYPOSITION>(yposScreen + vs.lineHeight);
368+ PRectangle rcMarker(
369+ rcSelMargin.left,
370+ static_cast<XYPOSITION>(yposScreen),
371+ rcSelMargin.right,
372+ static_cast<XYPOSITION>(yposScreen + vs.lineHeight));
371373 if (vs.ms[margin].style == SC_MARGIN_NUMBER) {
372374 if (firstSubLine) {
373375 std::string sNumber;
@@ -413,11 +415,12 @@
413415 if (firstSubLine) {
414416 surface->FillRectangle(rcMarker,
415417 vs.styles[stMargin.StyleAt(0) + vs.marginStyleOffset].back);
418+ PRectangle rcText = rcMarker;
416419 if (vs.ms[margin].style == SC_MARGIN_RTEXT) {
417420 const int width = WidestLineWidth(surface, vs, vs.marginStyleOffset, stMargin);
418- rcMarker.left = rcMarker.right - width - 3;
421+ rcText.left = rcText.right - width - 3;
419422 }
420- DrawStyledText(surface, vs, vs.marginStyleOffset, rcMarker,
423+ DrawStyledText(surface, vs, vs.marginStyleOffset, rcText,
421424 stMargin, 0, stMargin.length, drawAll);
422425 } else {
423426 // if we're displaying annotation lines, colour the margin to match the associated document line
--- branches/1.14.x/ext/scintilla/src/RESearch.cxx (revision 28966)
+++ branches/1.14.x/ext/scintilla/src/RESearch.cxx (revision 28967)
@@ -780,7 +780,7 @@
780780 lp++;
781781 if (lp >= endp) /* if EOS, fail, else fall through. */
782782 return 0;
783- // Falls through.
783+ [[fallthrough]];
784784 default: /* regular matching all the way. */
785785 while (lp < endp) {
786786 ep = PMatch(ci, lp, endp, ap);
--- branches/1.14.x/ext/scintilla/src/ViewStyle.cxx (revision 28966)
+++ branches/1.14.x/ext/scintilla/src/ViewStyle.cxx (revision 28967)
@@ -504,6 +504,17 @@
504504 return styles[STYLE_DEFAULT].fore;
505505 }
506506
507+// Insert new edge in sorted order.
508+void ViewStyle::AddMultiEdge(uptr_t wParam, sptr_t lParam) {
509+ const int column = static_cast<int>(wParam);
510+ theMultiEdge.insert(
511+ std::upper_bound(theMultiEdge.begin(), theMultiEdge.end(), column,
512+ [](const EdgeProperties &a, const EdgeProperties &b) {
513+ return a.column < b.column;
514+ }),
515+ EdgeProperties(column, lParam));
516+}
517+
507518 bool ViewStyle::SetWrapState(int wrapState_) noexcept {
508519 WrapMode wrapStateWanted;
509520 switch (wrapState_) {
--- branches/1.14.x/ext/scintilla/src/ViewStyle.h (revision 28966)
+++ branches/1.14.x/ext/scintilla/src/ViewStyle.h (revision 28967)
@@ -193,6 +193,8 @@
193193 bool WhitespaceBackgroundDrawn() const noexcept;
194194 ColourDesired WrapColour() const noexcept;
195195
196+ void AddMultiEdge(uptr_t wParam, sptr_t lParam);
197+
196198 bool SetWrapState(int wrapState_) noexcept;
197199 bool SetWrapVisualFlags(int wrapVisualFlags_) noexcept;
198200 bool SetWrapVisualFlagsLocation(int wrapVisualFlagsLocation_) noexcept;
--- branches/1.14.x/ext/scintilla/version.txt (revision 28966)
+++ branches/1.14.x/ext/scintilla/version.txt (revision 28967)
@@ -1 +1 @@
1-444
1+445
--- branches/1.14.x/ext/scintilla/win32/PlatWin.cxx (revision 28966)
+++ branches/1.14.x/ext/scintilla/win32/PlatWin.cxx (revision 28967)
@@ -978,7 +978,7 @@
978978 ::BitBlt(hdc,
979979 static_cast<int>(rc.left), static_cast<int>(rc.top),
980980 static_cast<int>(rc.Width()), static_cast<int>(rc.Height()),
981- static_cast<SurfaceGDI &>(surfaceSource).hdc,
981+ dynamic_cast<SurfaceGDI &>(surfaceSource).hdc,
982982 static_cast<int>(from.x), static_cast<int>(from.y), SRCCOPY);
983983 }
984984
@@ -1176,6 +1176,7 @@
11761176
11771177 void Clear() noexcept;
11781178 void SetFont(const Font &font_) noexcept;
1179+ HRESULT GetBitmap(ID2D1Bitmap **ppBitmap);
11791180
11801181 public:
11811182 SurfaceD2D() noexcept;
@@ -1332,6 +1333,11 @@
13321333 SetDBCSMode(psurfOther->codePage);
13331334 }
13341335
1336+HRESULT SurfaceD2D::GetBitmap(ID2D1Bitmap **ppBitmap) {
1337+ PLATFORM_ASSERT(pBitmapRenderTarget);
1338+ return pBitmapRenderTarget->GetBitmap(ppBitmap);
1339+}
1340+
13351341 void SurfaceD2D::PenColour(ColourDesired fore) {
13361342 D2DPenColour(fore);
13371343 }
@@ -1434,11 +1440,8 @@
14341440 void SurfaceD2D::Polygon(Point *pts, size_t npts, ColourDesired fore, ColourDesired back) {
14351441 PLATFORM_ASSERT(pRenderTarget && (npts > 2));
14361442 if (pRenderTarget) {
1437- ID2D1Factory *pFactory = nullptr;
1438- pRenderTarget->GetFactory(&pFactory);
1439- PLATFORM_ASSERT(pFactory);
14401443 ID2D1PathGeometry *geometry = nullptr;
1441- HRESULT hr = pFactory->CreatePathGeometry(&geometry);
1444+ HRESULT hr = pD2DFactory->CreatePathGeometry(&geometry);
14421445 PLATFORM_ASSERT(geometry);
14431446 if (SUCCEEDED(hr) && geometry) {
14441447 ID2D1GeometrySink *sink = nullptr;
@@ -1483,10 +1486,10 @@
14831486
14841487 void SurfaceD2D::FillRectangle(PRectangle rc, Surface &surfacePattern) {
14851488 SurfaceD2D *psurfOther = dynamic_cast<SurfaceD2D *>(&surfacePattern);
1486- PLATFORM_ASSERT(psurfOther && psurfOther->pBitmapRenderTarget);
1489+ PLATFORM_ASSERT(psurfOther);
14871490 psurfOther->FlushDrawing();
14881491 ID2D1Bitmap *pBitmap = nullptr;
1489- HRESULT hr = psurfOther->pBitmapRenderTarget->GetBitmap(&pBitmap);
1492+ HRESULT hr = psurfOther->GetBitmap(&pBitmap);
14901493 if (SUCCEEDED(hr) && pBitmap) {
14911494 ID2D1BitmapBrush *pBitmapBrush = nullptr;
14921495 const D2D1_BITMAP_BRUSH_PROPERTIES brushProperties =
@@ -1639,14 +1642,11 @@
16391642 }
16401643
16411644 void SurfaceD2D::Copy(PRectangle rc, Point from, Surface &surfaceSource) {
1642- SurfaceD2D &surfOther = static_cast<SurfaceD2D &>(surfaceSource);
1645+ SurfaceD2D &surfOther = dynamic_cast<SurfaceD2D &>(surfaceSource);
16431646 surfOther.FlushDrawing();
1644- ID2D1BitmapRenderTarget *pCompatibleRenderTarget = reinterpret_cast<ID2D1BitmapRenderTarget *>(
1645- surfOther.pRenderTarget);
1646- PLATFORM_ASSERT(pCompatibleRenderTarget);
16471647 ID2D1Bitmap *pBitmap = nullptr;
1648- HRESULT hr = pCompatibleRenderTarget->GetBitmap(&pBitmap);
1649- if (SUCCEEDED(hr)) {
1648+ HRESULT hr = surfOther.GetBitmap(&pBitmap);
1649+ if (SUCCEEDED(hr) && pBitmap) {
16501650 const D2D1_RECT_F rcDestination = RectangleFromPRectangle(rc);
16511651 D2D1_RECT_F rcSource = {from.x, from.y, from.x + rc.Width(), from.y + rc.Height()};
16521652 pRenderTarget->DrawBitmap(pBitmap, rcDestination, 1.0f,
--- branches/1.14.x/ext/scintilla/win32/ScintillaWin.cxx (revision 28966)
+++ branches/1.14.x/ext/scintilla/win32/ScintillaWin.cxx (revision 28967)
@@ -450,7 +450,7 @@
450450 void ChangeScrollPos(int barType, Sci::Position pos);
451451 sptr_t GetTextLength();
452452 sptr_t GetText(uptr_t wParam, sptr_t lParam);
453- Window::Cursor ContextCursor();
453+ Window::Cursor ContextCursor(Point pt);
454454 sptr_t ShowContextMenu(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
455455 void SizeWindow();
456456 sptr_t MouseMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
@@ -1364,19 +1364,20 @@
13641364 }
13651365 }
13661366
1367-Window::Cursor ScintillaWin::ContextCursor() {
1367+Window::Cursor ScintillaWin::ContextCursor(Point pt) {
13681368 if (inDragDrop == ddDragging) {
13691369 return Window::cursorUp;
13701370 } else {
13711371 // Display regular (drag) cursor over selection
1372- POINT pt;
1373- if (0 != ::GetCursorPos(&pt)) {
1374- ::ScreenToClient(MainHWND(), &pt);
1375- if (PointInSelMargin(PointFromPOINT(pt))) {
1376- return GetMarginCursor(PointFromPOINT(pt));
1377- } else if (PointInSelection(PointFromPOINT(pt)) && !SelectionEmpty()) {
1378- return Window::cursorArrow;
1379- } else if (PointIsHotspot(PointFromPOINT(pt))) {
1372+ if (PointInSelMargin(pt)) {
1373+ return GetMarginCursor(pt);
1374+ } else if (!SelectionEmpty() && PointInSelection(pt)) {
1375+ return Window::cursorArrow;
1376+ } else if (PointIsHotspot(pt)) {
1377+ return Window::cursorHand;
1378+ } else if (hoverIndicatorPos != Sci::invalidPosition) {
1379+ const Sci::Position pos = PositionFromLocation(pt, true, true);
1380+ if (pos != Sci::invalidPosition) {
13801381 return Window::cursorHand;
13811382 }
13821383 }
@@ -1920,7 +1921,11 @@
19201921
19211922 case WM_SETCURSOR:
19221923 if (LOWORD(lParam) == HTCLIENT) {
1923- DisplayCursor(ContextCursor());
1924+ POINT pt;
1925+ if (::GetCursorPos(&pt)) {
1926+ ::ScreenToClient(MainHWND(), &pt);
1927+ DisplayCursor(ContextCursor(PointFromPOINT(pt)));
1928+ }
19241929 return TRUE;
19251930 } else {
19261931 return ::DefWindowProc(MainHWND(), iMessage, wParam, lParam);
--- branches/1.14.x/src/SVN/SVNStatusListCtrl.cpp (revision 28966)
+++ branches/1.14.x/src/SVN/SVNStatusListCtrl.cpp (revision 28967)
@@ -4869,7 +4869,7 @@
48694869 RECT labelRect = { 0 };
48704870 labelRect.top = LVGGR_LABEL;
48714871 SendMessage(LVM_GETGROUPRECT, pLVCD->nmcd.dwItemSpec, (LPARAM)&labelRect);
4872- ExtTextOut(pLVCD->nmcd.hdc, labelRect.left, labelRect.top, ETO_CLIPPED, &labelRect, gInfo.pszHeader, gInfo.cchHeader, nullptr);
4872+ ::DrawText(pLVCD->nmcd.hdc, gInfo.pszHeader, gInfo.cchHeader, &labelRect, DT_HIDEPREFIX | DT_NOPREFIX | DT_SINGLELINE);
48734873
48744874 RECT groupRect = { 0 };
48754875 groupRect.top = LVGGR_HEADER;
--- branches/1.14.x/src/TortoiseBlame/TortoiseBlame.cpp (revision 28966)
+++ branches/1.14.x/src/TortoiseBlame/TortoiseBlame.cpp (revision 28967)
@@ -1635,7 +1635,10 @@
16351635 else
16361636 wcscpy_s(buf, L" ---- ");
16371637 rc.right = rc.left + m_revWidth;
1638- ::ExtTextOut(hDC, 0, (int)Y, ETO_CLIPPED, &rc, buf, (UINT)wcslen(buf), 0);
1638+ RECT drawRC = rc;
1639+ drawRC.left = 0;
1640+ drawRC.top = (LONG)Y;
1641+ ::DrawText(hDC, buf, (int)wcslen(buf), &drawRC, DT_HIDEPREFIX | DT_NOPREFIX | DT_SINGLELINE);
16391642 int Left = m_revWidth;
16401643 if (ShowDate)
16411644 {
@@ -1648,7 +1651,10 @@
16481651 {
16491652 rc.right = rc.left + Left + m_authorWidth;
16501653 swprintf_s(buf, L"%-30s ", author.c_str());
1651- ::ExtTextOut(hDC, Left, (int)Y, ETO_CLIPPED, &rc, buf, (UINT)wcslen(buf), 0);
1654+ drawRC = rc;
1655+ drawRC.left = Left;
1656+ drawRC.top = (LONG)Y;
1657+ ::DrawText(hDC, buf, (int)wcslen(buf), &drawRC, DT_HIDEPREFIX | DT_NOPREFIX | DT_SINGLELINE);
16521658 Left += m_authorWidth;
16531659 }
16541660 if (ShowPath && !m_mergedPaths.empty())
@@ -1655,7 +1661,10 @@
16551661 {
16561662 rc.right = rc.left + Left + m_pathWidth;
16571663 swprintf_s(buf, L"%-60s ", m_mergedPaths[i].c_str());
1658- ::ExtTextOut(hDC, Left, (int)Y, ETO_CLIPPED, &rc, buf, (UINT)wcslen(buf), 0);
1664+ drawRC = rc;
1665+ drawRC.left = Left;
1666+ drawRC.top = (LONG)Y;
1667+ ::DrawText(hDC, buf, (int)wcslen(buf), &drawRC, DT_HIDEPREFIX | DT_NOPREFIX | DT_SINGLELINE);
16591668 Left += m_authorWidth;
16601669 }
16611670 if ((i == m_selectedLine) && (currentDialog))
--- branches/1.14.x/src/TortoiseIDiff/PicWindow.cpp (revision 28966)
+++ branches/1.14.x/src/TortoiseIDiff/PicWindow.cpp (revision 28967)
@@ -631,25 +631,19 @@
631631 {
632632 int nStringLength = stringsize.cx;
633633 int texttop = pSecondPic ? textrect.top + (header_height /2) - stringsize.cy : textrect.top + (header_height /2) - stringsize.cy/2;
634- ExtTextOut(hDC,
635- max(textrect.left + ((textrect.right-textrect.left)-nStringLength)/2, 1),
636- texttop,
637- ETO_CLIPPED,
638- &textrect,
639- realtitle.c_str(),
640- (UINT)realtitle.size(),
641- nullptr);
634+
635+ RECT drawRC = textrect;
636+ drawRC.left = max(textrect.left + ((textrect.right - textrect.left) - nStringLength) / 2, 1);
637+ drawRC.top = texttop;
638+ ::DrawText(hDC, realtitle.c_str(), (int)realtitle.size(), &drawRC, DT_HIDEPREFIX | DT_NOPREFIX | DT_SINGLELINE);
639+
642640 if (pSecondPic)
643641 {
644642 realtitle = (pictitle2.empty() ? picpath2 : pictitle2);
645- ExtTextOut(hDC,
646- max(textrect.left + ((textrect.right-textrect.left)-nStringLength)/2, 1),
647- texttop + stringsize.cy,
648- ETO_CLIPPED,
649- &textrect,
650- realtitle.c_str(),
651- (UINT)realtitle.size(),
652- nullptr);
643+ drawRC = textrect;
644+ drawRC.left = max(textrect.left + ((textrect.right - textrect.left) - nStringLength) / 2, 1);
645+ drawRC.top = texttop + stringsize.cy;
646+ ::DrawText(hDC, realtitle.c_str(), (int)realtitle.size(), &drawRC, DT_HIDEPREFIX | DT_NOPREFIX | DT_SINGLELINE);
653647 }
654648 }
655649 if (HasMultipleImages())
@@ -658,14 +652,10 @@
658652 {
659653 int nStringLength = stringsize.cx;
660654
661- ExtTextOut(hDC,
662- max(textrect.left + ((textrect.right-textrect.left)-nStringLength)/2, 1),
663- textrect.top + header_height + (header_height /2) - stringsize.cy/2,
664- ETO_CLIPPED,
665- &textrect,
666- imgnumstring.c_str(),
667- (UINT)imgnumstring.size(),
668- nullptr);
655+ RECT drawRC = textrect;
656+ drawRC.left = max(textrect.left + ((textrect.right - textrect.left) - nStringLength) / 2, 1);
657+ drawRC.top = textrect.top + header_height + (header_height / 2) - stringsize.cy / 2;
658+ ::DrawText(hDC, imgnumstring.c_str(), (int)imgnumstring.size(), &drawRC, DT_HIDEPREFIX | DT_NOPREFIX | DT_SINGLELINE);
669659 }
670660 }
671661 SelectObject(hDC, (HGDIOBJ)hFontOld);
@@ -1375,14 +1365,10 @@
13751365 {
13761366 int nStringLength = stringsize.cx;
13771367
1378- ExtTextOut(memDC,
1379- max(rect.left + ((rect.right-rect.left)-nStringLength)/2, 1),
1380- rect.top + ((rect.bottom-rect.top) - stringsize.cy)/2,
1381- ETO_CLIPPED,
1382- &rect,
1383- str,
1384- (UINT)wcslen(str),
1385- nullptr);
1368+ RECT drawRC = rect;
1369+ drawRC.left = max(rect.left + ((rect.right - rect.left) - nStringLength) / 2, 1);
1370+ drawRC.top = rect.top + ((rect.bottom - rect.top) - stringsize.cy) / 2;
1371+ ::DrawText(memDC, str, (int)wcslen(str), &drawRC, DT_HIDEPREFIX | DT_NOPREFIX | DT_SINGLELINE);
13861372 }
13871373 SelectObject(memDC, (HGDIOBJ)hFontOld);
13881374 DeleteObject(hFont);
--- branches/1.14.x/src/TortoiseMerge/BaseView.cpp (revision 28966)
+++ branches/1.14.x/src/TortoiseMerge/BaseView.cpp (revision 28967)
@@ -1458,8 +1458,10 @@
14581458 int offset = std::min<int>(m_nOffsetChar, (nStringLength-rect.Width())/GetCharWidth()+1);
14591459 sViewTitle = m_sWindowName.Mid(offset);
14601460 }
1461- pdc->ExtTextOut(std::max<int>(rect.left + (rect.Width()-nStringLength)/2, 1),
1462- rect.top + (HEADERHEIGHT / 2), ETO_CLIPPED, textrect, sViewTitle, nullptr);
1461+ RECT titleRC = textrect;
1462+ titleRC.left = std::max<int>(rect.left + (rect.Width() - nStringLength) / 2, 1);
1463+ titleRC.top = rect.top + (HEADERHEIGHT / 2);
1464+ pdc->DrawText(sViewTitle, &titleRC, DT_HIDEPREFIX | DT_NOPREFIX | DT_SINGLELINE);
14631465 if (this->GetFocus() == this)
14641466 pdc->DrawEdge(textrect, EDGE_BUMP, BF_RECT);
14651467 else
@@ -1972,7 +1974,10 @@
19721974 leftcoord += lower > 0 ? posBuffer.get()[lower - 1] : 0;
19731975 }
19741976
1975- pDC->ExtTextOut(leftcoord, coords.y, ETO_CLIPPED, &rc, p_zBlockText+offset, min(nTextLength, 4094), nullptr);
1977+ RECT drawRC = rc;
1978+ drawRC.left = leftcoord;
1979+ drawRC.top = coords.y;
1980+ pDC->DrawText(p_zBlockText + offset, min(nTextLength, 4094), &drawRC, DT_HIDEPREFIX | DT_NOPREFIX | DT_SINGLELINE);
19761981 if ((second.shot != second.background) && (itStart->first == nStart + nTextOffset))
19771982 {
19781983 pDC->FillSolidRect(nLeft-1, rc.top, 1, rc.Height(), second.shot);
--- branches/1.14.x/src/TortoiseProc/RevisionGraph/RevisionGraphDlgDraw.cpp (revision 28966)
+++ branches/1.14.x/src/TortoiseProc/RevisionGraph/RevisionGraphDlgDraw.cpp (revision 28967)
@@ -958,7 +958,7 @@
958958 // iterate over all visible nodes
959959
960960 if (graphics.pDC)
961- graphics.pDC->SetTextAlign (TA_CENTER | TA_TOP);
961+ graphics.pDC->SetTextAlign (TA_LEFT | TA_TOP | TA_NOUPDATECP);
962962 CSyncPointer<const ILayoutTextList> texts (m_state.GetTexts());
963963 for ( index_t index = texts->GetFirstVisible (logRect)
964964 ; index != NO_INDEX
@@ -980,7 +980,7 @@
980980 ? CTheme::Instance().GetThemeColor(m_Colors.GetColor (CColors::gdpWCNodeBorder), true).ToCOLORREF()
981981 : standardTextColor );
982982 graphics.pDC->SelectObject (GetFont (FALSE, text.style != ILayoutTextList::SText::STYLE_DEFAULT));
983- graphics.pDC->ExtTextOut ((textRect.left + textRect.right)/2, textRect.top, 0, &textRect, text.text, NULL);
983+ graphics.pDC->DrawText(text.text, &textRect, DT_HIDEPREFIX | DT_NOPREFIX | DT_SINGLELINE | DT_CENTER | DT_TOP);
984984 }
985985 else if (graphics.pSVG)
986986 {
Afficher sur ancien navigateur de dépôt.