diff options
Diffstat (limited to 'src')
-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 |
4 files changed, 18 insertions, 12 deletions
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; |