diff options
-rw-r--r-- | doc/ScintillaDoc.html | 6 | ||||
-rw-r--r-- | doc/ScintillaHistory.html | 4 | ||||
-rw-r--r-- | src/EditView.cxx | 2 | ||||
-rw-r--r-- | src/Style.h | 4 | ||||
-rw-r--r-- | src/ViewStyle.cxx | 20 | ||||
-rw-r--r-- | src/ViewStyle.h | 4 |
6 files changed, 27 insertions, 13 deletions
diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html index 5dfd16585..37a99a0f2 100644 --- a/doc/ScintillaDoc.html +++ b/doc/ScintillaDoc.html @@ -128,7 +128,7 @@ <h1>Scintilla Documentation</h1> - <p>Last edited 25 August 2021 NH</p> + <p>Last edited 12 September 2021 NH</p> <p style="background:#90F0C0">Scintilla 5 has moved the lexers from Scintilla into a new <a href="Lexilla.html">Lexilla</a> project.<br /> @@ -2448,6 +2448,10 @@ struct Sci_TextToFind { maximum descent (<code>SCI_SETEXTRADESCENT</code>) to allow for more space between lines. This may done to make the text easier to read or to accommodate underlines or highlights. </p> + <p> + The extra ascent and descent values can be negative but that should be done with care as it + may lead to unexpected interference when lines share space. + </p> <h2 id="Cursor">Cursor</h2> <a class="message" href="#SCI_SETCURSOR">SCI_SETCURSOR(int cursorType)</a><br /> diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index 080c223a3..1b16f2d18 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -594,6 +594,10 @@ Allow SCI_HIDELINES to hide the first line or all lines which can be useful for filtered views. </li> <li> + Make negative settings for extra ascent and descent safer by ensuring calculated ascent and thus + line height is at least 1 pixel. + </li> + <li> Fix display of fold lines when wrapped so they are only drawn once per line, not on each subline. </li> <li> diff --git a/src/EditView.cxx b/src/EditView.cxx index 0f69dd7b3..732a0f72e 100644 --- a/src/EditView.cxx +++ b/src/EditView.cxx @@ -2700,7 +2700,7 @@ Sci::Position EditView::FormatRange(bool draw, const RangeToFormat *pfr, Surface vsPrint.styles[StyleLineNumber].font.get(), number); surface->FlushCachedState(); surface->DrawTextNoClip(rcNumber, vsPrint.styles[StyleLineNumber].font.get(), - static_cast<XYPOSITION>(ypos + vsPrint.maxAscent), number, + ypos + vsPrint.maxAscent, number, vsPrint.styles[StyleLineNumber].fore, vsPrint.styles[StyleLineNumber].back); } diff --git a/src/Style.h b/src/Style.h index a3ce336ed..14112e092 100644 --- a/src/Style.h +++ b/src/Style.h @@ -27,8 +27,8 @@ struct FontSpecification { }; struct FontMeasurements { - unsigned int ascent = 1; - unsigned int descent = 1; + XYPOSITION ascent = 1; + XYPOSITION descent = 1; XYPOSITION capitalHeight = 1; // Top of capital letter to baseline: ascent - internal leading XYPOSITION aveCharWidth = 1; XYPOSITION spaceWidth = 1; diff --git a/src/ViewStyle.cxx b/src/ViewStyle.cxx index 8c3872611..ad1340d0d 100644 --- a/src/ViewStyle.cxx +++ b/src/ViewStyle.cxx @@ -8,6 +8,7 @@ #include <cstddef> #include <cassert> #include <cstring> +#include <cmath> #include <stdexcept> #include <string> @@ -48,16 +49,20 @@ bool MarginStyle::ShowsFolding() const noexcept { void FontRealised::Realise(Surface &surface, int zoomLevel, Technology technology, const FontSpecification &fs, const char *localeName) { PLATFORM_ASSERT(fs.fontName); measurements.sizeZoomed = fs.size + zoomLevel * FontSizeMultiplier; - if (measurements.sizeZoomed <= 2 * FontSizeMultiplier) // Hangs if sizeZoomed <= 1 - measurements.sizeZoomed = 2 * FontSizeMultiplier; + if (measurements.sizeZoomed <= FontSizeMultiplier) // May fail if sizeZoomed < 1 + measurements.sizeZoomed = FontSizeMultiplier; const float deviceHeight = static_cast<float>(surface.DeviceHeightFont(measurements.sizeZoomed)); const FontParameters fp(fs.fontName, deviceHeight / FontSizeMultiplier, fs.weight, fs.italic, fs.extraFontFlag, technology, fs.characterSet, localeName); font = Font::Allocate(fp); - measurements.ascent = static_cast<unsigned int>(surface.Ascent(font.get())); - measurements.descent = static_cast<unsigned int>(surface.Descent(font.get())); + // floor here is historical as platform layers have tweaked their values to match. + // ceil would likely be better to ensure (nearly) all of the ink of a character is seen + // but that would require platform layer changes. + measurements.ascent = std::floor(surface.Ascent(font.get())); + measurements.descent = std::floor(surface.Descent(font.get())); + measurements.capitalHeight = surface.Ascent(font.get()) - surface.InternalLeading(font.get()); measurements.aveCharWidth = surface.AverageCharWidth(font.get()); measurements.spaceWidth = surface.WidthText(font.get(), " "); @@ -356,9 +361,10 @@ void ViewStyle::Refresh(Surface &surface, int tabInChars) { maxAscent = 1; maxDescent = 1; FindMaxAscentDescent(); - maxAscent += extraAscent; - maxDescent += extraDescent; - lineHeight = maxAscent + maxDescent; + // Ensure reasonable values: lines less than 1 pixel high will not work + maxAscent = std::max(1.0, maxAscent + extraAscent); + maxDescent = std::max(0.0, maxDescent + extraDescent); + lineHeight = lround(maxAscent + maxDescent); lineOverlap = lineHeight / 10; if (lineOverlap < 2) lineOverlap = 2; diff --git a/src/ViewStyle.h b/src/ViewStyle.h index edebee7ce..f6d1bdbb4 100644 --- a/src/ViewStyle.h +++ b/src/ViewStyle.h @@ -122,8 +122,8 @@ public: Scintilla::Technology technology; int lineHeight; int lineOverlap; - unsigned int maxAscent; - unsigned int maxDescent; + XYPOSITION maxAscent; + XYPOSITION maxDescent; XYPOSITION aveCharWidth; XYPOSITION spaceWidth; XYPOSITION tabWidth; |