summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/harfbuzz-ng/src
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2018-12-16 19:54:26 +0100
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2019-02-11 01:41:32 +0000
commit6f9e444c28c0095595b1b61cb0f399ac2790716b (patch)
tree9591ed554ef704af80de9b75b61335422868d94a /src/3rdparty/harfbuzz-ng/src
parent035d80407b693662c209cd4f156085d583ad428c (diff)
harbuzzng: Remove assumption about Core Text working in 96 DPI
Core Text doesn't actually have a concept of DPI internally, as it doesn't rasterize anything by itself, it just generates vector paths that get passed along to Core Graphics. In practice this means Core Text operates in the classical macOS logical DPI of 72, with one typographic point corresponding to one point in the Core Graphics coordinate system, which for a normal bitmap context then corresponds to one pixel -- or two pixels for a "retina" context with a 2x scale transform. Scaling the font point sizes given to HarfBuzz to an assumed DPI of 96 is problematic with this in mind, as fonts with optical features such as 'trak' tables for tracking, or color glyphs, will then base the metrics off of the wrong point size compared to what the client asked for. This in turn causes mismatches between the metrics of the shaped text and the actual rasterization, which doesn't include the 72 to 96 DPI scaling. If a 96 DPI is needed, such as on the Web, the scaling should be done outside of HarfBuzz, allowing the client to keep the DPI of the shaping in sync with the rasterization. The recommended way to do that is by scaling the font point size, not by applying a transform to the target Core Graphics context, to let Core Text choose the right optical features of the target point size, as described in WWDC 2015 session 804: https://developer.apple.com/videos/play/wwdc2015/804/ GitHub-PR: https://github.com/harfbuzz/harfbuzz/pull/1484 Change-Id: I830f0cd7a82552422bbe09226e2d571e246fe3f4 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/3rdparty/harfbuzz-ng/src')
-rw-r--r--src/3rdparty/harfbuzz-ng/src/hb-coretext.cc25
1 files changed, 4 insertions, 21 deletions
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-coretext.cc b/src/3rdparty/harfbuzz-ng/src/hb-coretext.cc
index 9431ba5fe1..d64cb7edbd 100644
--- a/src/3rdparty/harfbuzz-ng/src/hb-coretext.cc
+++ b/src/3rdparty/harfbuzz-ng/src/hb-coretext.cc
@@ -52,24 +52,6 @@ struct CoreTextFontEngineData {
/* https://developer.apple.com/documentation/coretext/1508745-ctfontcreatewithgraphicsfont */
#define HB_CORETEXT_DEFAULT_FONT_SIZE 12.f
-static CGFloat
-coretext_font_size_from_ptem (float ptem)
-{
- /* CoreText points are CSS pixels (96 per inch),
- * NOT typographic points (72 per inch).
- *
- * https://developer.apple.com/library/content/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html
- */
- ptem *= 96.f / 72.f;
- return ptem <= 0.f ? HB_CORETEXT_DEFAULT_FONT_SIZE : ptem;
-}
-static float
-coretext_font_size_to_ptem (CGFloat size)
-{
- size *= 72.f / 96.f;
- return size <= 0.f ? 0 : size;
-}
-
static void
release_table_data (void *user_data)
{
@@ -104,7 +86,7 @@ _hb_cg_font_release (void *data)
HB_SHAPER_DATA_ENSURE_DEFINE(coretext, face)
HB_SHAPER_DATA_ENSURE_DEFINE_WITH_CONDITION(coretext, font,
- fabs (CTFontGetSize((CTFontRef) data) - coretext_font_size_from_ptem (font->ptem)) <= .5
+ fabs (CTFontGetSize ((CTFontRef) data) - font->ptem) <= .5
)
static CTFontDescriptorRef
@@ -308,7 +290,8 @@ _hb_coretext_shaper_font_data_create (hb_font_t *font)
if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return nullptr;
CGFontRef cg_font = (CGFontRef) HB_SHAPER_DATA_GET (face);
- CTFontRef ct_font = create_ct_font (cg_font, coretext_font_size_from_ptem (font->ptem));
+ CGFloat font_size = font->ptem <= 0.f ? HB_CORETEXT_DEFAULT_FONT_SIZE : font->ptem;
+ CTFontRef ct_font = create_ct_font (cg_font, font_size);
if (unlikely (!ct_font))
{
@@ -340,7 +323,7 @@ hb_coretext_font_create (CTFontRef ct_font)
if (unlikely (hb_object_is_inert (font)))
return font;
- hb_font_set_ptem (font, coretext_font_size_to_ptem (CTFontGetSize(ct_font)));
+ hb_font_set_ptem (font, CTFontGetSize (ct_font));
/* Let there be dragons here... */
HB_SHAPER_DATA_GET (font) = (hb_coretext_shaper_font_data_t *) CFRetain (ct_font);