[OpenJDK 2D-Dev] [PATCH] Make automatic font substitution on macOS work for surrogate pairs

Sergey Bylokhov Sergey.Bylokhov at oracle.com
Tue Nov 1 14:40:16 UTC 2016


Looks fine to me, but the jtreg test will be helpful.

On 27.10.16 11:56, Dmitry Batrak wrote:
> Sure, here's the simplest test, that can be used for visual inspection:
>
> import javax.swing.*;
> import java.awt.*;
>
> public class SurrogatesFallbackTest {
>     public static void main(String[] args) {
>         SwingUtilities.invokeLater(() -> {
>             JFrame frame = new JFrame();
>             JLabel label = new JLabel(new
> String(Character.toChars(0x1d400))); // MATHEMATICAL BOLD CAPITAL A
>             label.setFont(new Font("Menlo", Font.PLAIN, 36)); //
> expected to fallback to STIXGeneral
>             frame.add(label);
>             frame.pack();
>             frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
>             frame.setLocationRelativeTo(null);
>             frame.setVisible(true);
>         });
>     }
> }
>
> I can convert it to an automatic test (rendering to a bitmap and
> comparing the result to rendering of 'missing' glyph), and add it to the
> webrev, if that makes sense.
>
> Best regards,
> Dmitry Batrak
>
> On Thu, Oct 27, 2016 at 2:17 AM, Philip Race <philip.race at oracle.com
> <mailto:philip.race at oracle.com>> wrote:
>
>     Hi,
>
>     I can file a bug on this if I can't find one.
>     If you can email me the test it will help even if it is not checked in.
>
>     -phil.
>
>     On 10/26/16, 6:28 AM, Dmitry Batrak wrote:
>>     Hello,
>>
>>     I'd like to propose a patch to make automatic font substitution on
>>     macOS work for surrogate pairs.
>>     I have a Contributor status via agreement signed by JetBrains,
>>     hope someone can sponsor the patch.
>>
>>     Currently, if requested font cannot render a Unicode character
>>     represented by a surrogate pair,
>>     no substitution is performed - Font.canDisplay will return false,
>>     and the character will be
>>     rendered as a 'missing' glyph. This behaviour doesn't violate any
>>     specification, but it looks like
>>     it can be easily improved, as underlying OS framework used under
>>     the hood does support surrogate pairs.
>>
>>     The proposed change consists of two parts. First part is adjusting
>>     the code in CoreTextSupport.m
>>     to handle surrogate pairs while performing char-to-glyph mapping,
>>     by encoding non-displayable
>>     surrogate pairs using negative values of the codepoint, similar to
>>     how non-displayable BMP characters
>>     are encoded. Second part is fixing the rendering code (in
>>     CGGlyphImages.m), where wrong type was used
>>     to pass character values around, so that code for surrogate pairs
>>     handling, already present there,
>>     could work.
>>
>>     I didn't include a test for this change, as it would depend on
>>     OS-specific font fallback mechanism
>>     and fonts installed, but I can create one that will work on a
>>     latest version of macOS with default
>>     fonts, if needed.
>>
>>     Webrev for the fix is available at
>>     http://cr.openjdk.java.net/~avu/rfe_surrogates/webrev.00/
>>     <http://cr.openjdk.java.net/%7Eavu/rfe_surrogates/webrev.00/>
>>     (kindly posted by my colleague, having access to
>>     cr.openjdk.java.net <http://cr.openjdk.java.net>).
>>
>>     To my knowledge, there's no ticket in OpenJDK issue tracker for
>>     the proposed enhancement.
>>     I can submit it via http://bugs.java.com/, if that's an obstacle.
>>
>>     Best regards,
>>     Dmitry Batrak
>
>
>
>
> --
> Dmitry Batrak
> Senior Software Developer
> JetBrains
> http://www.jetbrains.com
> The Drive to Develop


-- 
Best regards, Sergey.



More information about the 2d-dev mailing list