Improve font size edge cases.
This commit is contained in:
parent
86dc01e9bc
commit
d703a804df
1 changed files with 49 additions and 5 deletions
|
|
@ -198,9 +198,53 @@ struct Metrics {
|
||||||
const auto basicMetrics = QFontMetricsF(copy);
|
const auto basicMetrics = QFontMetricsF(copy);
|
||||||
|
|
||||||
static const auto Full = u"bdfghijklpqtyBDFGHIJKLPQTY1234567890[]{}()"_q;
|
static const auto Full = u"bdfghijklpqtyBDFGHIJKLPQTY1234567890[]{}()"_q;
|
||||||
static const auto Test = u"acemnorsuvwxz"_q;
|
|
||||||
|
|
||||||
const auto desired = basicMetrics.tightBoundingRect(Test).height();
|
// I tried to choose height in such way that
|
||||||
|
// - normal fonts won't be too large,
|
||||||
|
// - some exotic fonts, like Symbol (Greek), won't be too small,
|
||||||
|
// - some other exotic fonts, like Segoe Script, won't be too large.
|
||||||
|
const auto Height = [](const QFontMetricsF &metrics) {
|
||||||
|
//static const auto Test = u"acemnorsuvwxz"_q;
|
||||||
|
//return metrics.tightBoundingRect(Test).height();
|
||||||
|
|
||||||
|
//static const auto Test = u"acemnorsuvwxz"_q;
|
||||||
|
//auto result = metrics.boundingRect(Test[0]).height();
|
||||||
|
//for (const auto &ch : Test | ranges::views::drop(1)) {
|
||||||
|
// const auto single = metrics.boundingRect(ch).height();
|
||||||
|
// if (result > single) {
|
||||||
|
// result = single;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//return result;
|
||||||
|
|
||||||
|
//static const auto Test = u"acemnorsuvwxz"_q;
|
||||||
|
//auto result = 0.;
|
||||||
|
//for (const auto &ch : Test) {
|
||||||
|
// result -= metrics.boundingRect(ch).y();
|
||||||
|
//}
|
||||||
|
//return result / Test.size();
|
||||||
|
|
||||||
|
static const char16_t Test[] = u"acemnorsuvwxz";
|
||||||
|
constexpr auto kCount = int(std::size(Test)) - 1;
|
||||||
|
|
||||||
|
auto heights = std::array<float64, kCount>{};
|
||||||
|
for (auto i = 0; i != kCount; ++i) {
|
||||||
|
heights[i] = -metrics.boundingRect(QChar(Test[i])).y();
|
||||||
|
}
|
||||||
|
ranges::sort(heights);
|
||||||
|
//return heights[kCount / 2];
|
||||||
|
|
||||||
|
// Average the middle third.
|
||||||
|
const auto from = kCount / 3;
|
||||||
|
const auto till = kCount - from;
|
||||||
|
auto result = 0.;
|
||||||
|
for (auto i = from; i != till; ++i) {
|
||||||
|
result += heights[i];
|
||||||
|
}
|
||||||
|
return result / (till - from);
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto desired = Height(basicMetrics);
|
||||||
const auto desiredFull = basicMetrics.tightBoundingRect(Full);
|
const auto desiredFull = basicMetrics.tightBoundingRect(Full);
|
||||||
if (desired < 1. || desiredFull.height() < desired) {
|
if (desired < 1. || desiredFull.height() < desired) {
|
||||||
return simple();
|
return simple();
|
||||||
|
|
@ -221,7 +265,7 @@ struct Metrics {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
auto current = metrics.tightBoundingRect(Test).height();
|
auto current = Height(metrics);
|
||||||
if (current < 1.) {
|
if (current < 1.) {
|
||||||
return simple();
|
return simple();
|
||||||
} else if (std::abs(current - desired) < 0.2) {
|
} else if (std::abs(current - desired) < 0.2) {
|
||||||
|
|
@ -237,7 +281,7 @@ struct Metrics {
|
||||||
const auto shift = i + 1;
|
const auto shift = i + 1;
|
||||||
font.setPixelSize(startSize + shift);
|
font.setPixelSize(startSize + shift);
|
||||||
const auto metrics = QFontMetricsF(font);
|
const auto metrics = QFontMetricsF(font);
|
||||||
const auto now = metrics.tightBoundingRect(Test).height();
|
const auto now = Height(metrics);
|
||||||
if (now > desired) {
|
if (now > desired) {
|
||||||
const auto better = (now - desired) < (desired - current);
|
const auto better = (now - desired) < (desired - current);
|
||||||
if (better) {
|
if (better) {
|
||||||
|
|
@ -255,7 +299,7 @@ struct Metrics {
|
||||||
const auto shift = i + 1;
|
const auto shift = i + 1;
|
||||||
font.setPixelSize(startSize - shift);
|
font.setPixelSize(startSize - shift);
|
||||||
const auto metrics = QFontMetricsF(font);
|
const auto metrics = QFontMetricsF(font);
|
||||||
const auto now = metrics.tightBoundingRect(Test).height();
|
const auto now = Height(metrics);
|
||||||
if (now < desired) {
|
if (now < desired) {
|
||||||
const auto better = (desired - now) < (current - desired);
|
const auto better = (desired - now) < (current - desired);
|
||||||
if (better) {
|
if (better) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue