aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/EditView.cxx2
-rw-r--r--src/Style.h4
-rw-r--r--src/ViewStyle.cxx20
-rw-r--r--src/ViewStyle.h4
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;