mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-09 23:34:20 +00:00
Fix font sizing with the software and OpenGL renderers when ascent override is used
This commit is contained in:
parent
39ff0f91f4
commit
b72343cf8c
44 changed files with 158 additions and 3 deletions
67
modules/juce_graphics/detail/juce_FontRendering.h
Normal file
67
modules/juce_graphics/detail/juce_FontRendering.h
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE framework.
|
||||
Copyright (c) Raw Material Software Limited
|
||||
|
||||
JUCE is an open source framework subject to commercial or open source
|
||||
licensing.
|
||||
|
||||
By downloading, installing, or using the JUCE framework, or combining the
|
||||
JUCE framework with any other source code, object code, content or any other
|
||||
copyrightable work, you agree to the terms of the JUCE End User Licence
|
||||
Agreement, and all incorporated terms including the JUCE Privacy Policy and
|
||||
the JUCE Website Terms of Service, as applicable, which will bind you. If you
|
||||
do not agree to the terms of these agreements, we will not license the JUCE
|
||||
framework to you, and you must discontinue the installation or download
|
||||
process and cease use of the JUCE framework.
|
||||
|
||||
JUCE End User Licence Agreement: https://juce.com/legal/juce-8-licence/
|
||||
JUCE Privacy Policy: https://juce.com/juce-privacy-policy
|
||||
JUCE Website Terms of Service: https://juce.com/juce-website-terms-of-service/
|
||||
|
||||
Or:
|
||||
|
||||
You may also use this code under the terms of the AGPLv3:
|
||||
https://www.gnu.org/licenses/agpl-3.0.en.html
|
||||
|
||||
THE JUCE FRAMEWORK IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL
|
||||
WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF
|
||||
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce::detail
|
||||
{
|
||||
|
||||
struct FontRendering
|
||||
{
|
||||
FontRendering() = delete;
|
||||
|
||||
/*
|
||||
Returns the total height of this font, in pixels, subject to the ascent and descent override
|
||||
values.
|
||||
|
||||
If no ascent or descent override is set, this will return the same value as getHeight().
|
||||
*/
|
||||
static float getEffectiveHeight (const Font& font)
|
||||
{
|
||||
const auto ptr = font.getTypefacePtr();
|
||||
|
||||
if (ptr == nullptr)
|
||||
return font.getHeight();
|
||||
|
||||
const auto original = ptr->getMetrics (font.getMetricsKind()).heightToPoints;
|
||||
const auto actual = font.getHeightToPointsFactor();
|
||||
|
||||
const auto sanity = 1e-6 < original && original < 1e6 && actual < 1e6;
|
||||
|
||||
if (! sanity)
|
||||
return font.getHeight();
|
||||
|
||||
return font.getHeight() * actual / original;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace juce::detail
|
||||
|
|
@ -659,12 +659,19 @@ public:
|
|||
*/
|
||||
Native getNativeDetails() const;
|
||||
|
||||
/* @internal
|
||||
The factor by which a JUCE font height should be multiplied in order to convert to a font
|
||||
size in points.
|
||||
|
||||
May be inf if the font ascent and descent overrides have both been set to 0!
|
||||
*/
|
||||
float getHeightToPointsFactor() const;
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
static bool compare (const Font&, const Font&) noexcept;
|
||||
|
||||
void dupeInternalIfShared();
|
||||
float getHeightToPointsFactor() const;
|
||||
|
||||
friend struct GraphicsFontHelpers;
|
||||
|
||||
|
|
|
|||
|
|
@ -148,6 +148,7 @@ namespace juce
|
|||
#include "fonts/juce_TextLayout.h"
|
||||
#include "contexts/juce_LowLevelGraphicsContext.h"
|
||||
#include "images/juce_ScaledImage.h"
|
||||
#include "detail/juce_FontRendering.h"
|
||||
#include "native/juce_RenderingHelpers.h"
|
||||
#include "contexts/juce_LowLevelGraphicsSoftwareRenderer.h"
|
||||
#include "effects/juce_ImageEffectFilter.h"
|
||||
|
|
|
|||
|
|
@ -203,7 +203,7 @@ public:
|
|||
{
|
||||
return cache.get (Key { font, glyphNumber }, [] (const auto& key)
|
||||
{
|
||||
auto fontHeight = key.font.getHeight();
|
||||
auto fontHeight = detail::FontRendering::getEffectiveHeight (key.font);
|
||||
auto typeface = key.font.getTypefacePtr();
|
||||
return typeface->getLayersForGlyph (key.font.getMetricsKind(),
|
||||
key.glyph,
|
||||
|
|
@ -2660,7 +2660,7 @@ protected:
|
|||
return std::tuple (cache.get (f, i), drawPos);
|
||||
}
|
||||
|
||||
const auto fontHeight = stack->font.getHeight();
|
||||
const auto fontHeight = detail::FontRendering::getEffectiveHeight (stack->font);
|
||||
const auto fontTransform = AffineTransform::scale (fontHeight * stack->font.getHorizontalScale(),
|
||||
fontHeight).followedBy (t);
|
||||
const auto fullTransform = stack->transform.getTransformWith (fontTransform);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue