<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>183155</bug_id>
          
          <creation_ts>2018-02-26 18:13:45 -0800</creation_ts>
          <short_desc>[FreeType] Color emojis in WebKitGTK+ for great justice</short_desc>
          <delta_ts>2018-03-01 12:02:34 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKitGTK</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=183210</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Jeff Fortin">nekohayo</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>bugs-noreply</cc>
    
    <cc>cgarcia</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>fujii</cc>
    
    <cc>mcatanzaro</cc>
    
    <cc>mmaxfield</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1402239</commentid>
    <comment_count>0</comment_count>
    <who name="Jeff Fortin">nekohayo</who>
    <bug_when>2018-02-26 18:13:45 -0800</bug_when>
    <thetext>With Fedora 27, GTK now renders color emojis, which took me by surprise as I now see them rendered properly in Evolution&apos;s messages listview widget... but they don&apos;t get rendered correctly in the webkit view of the messages themselves.

Opening http://www.fileformat.info/info/emoji/browsertest.htm with Epiphany also makes me suspect that color emojis are not implemented in WebkitGtk... am I correct in presuming it&apos;s a webkitgtk issue and that once it is done there it will automagically work in applications like Evolution?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1402255</commentid>
    <comment_count>1</comment_count>
    <who name="Michael Catanzaro">mcatanzaro</who>
    <bug_when>2018-02-26 19:44:37 -0800</bug_when>
    <thetext>You don&apos;t get color emoji? Did you try turning your computer upside-down? That is the first thing you should check before reporting a bug.

































OK, enough trolling... yes, I enjoyed that....

(In reply to Jeff Fortin from comment #0)
&gt; Opening http://www.fileformat.info/info/emoji/browsertest.htm with Epiphany
&gt; also makes me suspect that color emojis are not implemented in WebkitGtk...
&gt; am I correct in presuming it&apos;s a webkitgtk issue and that once it is done
&gt; there it will automagically work in applications like Evolution?

In theory, we already support color emoji since bug #156579. I don&apos;t know if that got backported to 2.18 or not, so you might need 2.20.

But I&apos;ve never seen it work. Your test page does not work in Epiphany Tech Preview. Maybe GNOME&apos;s flatpak runtime is pinned to an older version of some dependency, though it uses git master for most dependencies... but it also doesn&apos;t work in Fedora 27, which should have the latest versions of all relevant dependencies. I wonder what is wrong. Maybe Carlos Garcia would know.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1402256</commentid>
    <comment_count>2</comment_count>
    <who name="Michael Catanzaro">mcatanzaro</who>
    <bug_when>2018-02-26 19:45:22 -0800</bug_when>
    <thetext>Note: many emoji will look like crap due to bug #177040, but they should at least be colorful!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1402299</commentid>
    <comment_count>3</comment_count>
    <who name="Fujii Hironori">fujii</who>
    <bug_when>2018-02-26 23:53:40 -0800</bug_when>
    <thetext>jhbuild patch to bump Cairo 1.15.10
https://gist.github.com/fujii/05ae2fb4f2e3d92bcef3b44647f8c876

./Tools/jhbuild/jhbuild-wrapper --gtk uninstall cairo
./Tools/jhbuild/jhbuild-wrapper --gtk buildone cairo

Screenshot.
https://photos.app.goo.gl/2Lqm0Lll6BToh2bo2

Something wrong with the font selections. I need to download the test case (Bug Comment 5) to show color emoji.
I don&apos;t know how GTK selects fonts. I might need to configure my Linux box.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1402316</commentid>
    <comment_count>4</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2018-02-27 04:13:58 -0800</bug_when>
    <thetext>You need an emoji font installed. In this case the problem is not that we don&apos;t support colored emojis. The ones we are showing are not taken from the emoji font, but from other font that contains the character. So, the problem here is that we are not looking for the character in the emoji font for whatever reason.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1402348</commentid>
    <comment_count>5</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2018-02-27 09:35:57 -0800</bug_when>
    <thetext>Font fallbacks are indeed working fine, here the emojione font is selected, but we end up rendering tiny icons instead. This is because for some reason the matrix we are getting from font config contains a scale, which we don&apos;t expect. We only get the font matrix to appply rotations in case of oblique fonts, but then we always apply the scale for the computed pixel font size. Ignoring the fc matrix scale fixes the issue, see this screenshot:

https://people.igalia.com/cgarcia/mb-emojis.png

I&apos;ll submit a patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1402350</commentid>
    <comment_count>6</comment_count>
      <attachid>334693</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2018-02-27 09:43:52 -0800</bug_when>
    <thetext>Created attachment 334693
Patch

I haven&apos;t had time to run the tests with the patch, I&apos;ll do it tomorrow.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1402361</commentid>
    <comment_count>7</comment_count>
      <attachid>334693</attachid>
    <who name="Michael Catanzaro">mcatanzaro</who>
    <bug_when>2018-02-27 10:27:52 -0800</bug_when>
    <thetext>Comment on attachment 334693
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=334693&amp;action=review

&gt; Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp:73
&gt; +    bool italic = fontDescription.italic();
&gt; +    if (!FcPatternAddInteger(pattern, FC_SLANT, italic ? FC_SLANT_ITALIC : FC_SLANT_ROMAN))

Since you&apos;re moving this code, might as well take the opportunity to get rid of the unnecessary local variable and do fontDescription.italic() ? FC_SLANT_ITALIC : FC_SLANT_ROMAN

&gt; Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp:98
&gt; +    if (!configurePatternForFontDescription(pattern.get(), fontDescription))
&gt; +        return nullptr;

Nit: to make this more readable, add one blank line above and below. It&apos;s unrelated to forcing scalable fonts and unrelated to the FcConfigSubstitute/cairo_ft_font_options_substitute/FcDefaultSubstitute dance.

&gt; Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp:112
&gt; -    return FcFontSetMatch(nullptr, &amp;fallbacks, 1, pattern, &amp;fontConfigResult);
&gt; +    return adoptRef(FcFontSetMatch(nullptr, &amp;fallbacks, 1, pattern, &amp;fontConfigResult));

Good catch.

&gt; Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp:126
&gt; +    // Try first a direct match.
&gt; +    FcResult fontConfigResult;
&gt; +    if (RefPtr&lt;FcPattern&gt; resultPattern = adoptRef(FcFontMatch(nullptr, pattern.get(), &amp;fontConfigResult))) {
&gt; +        FontPlatformData alternateFontData(resultPattern.get(), description);
&gt; +        return fontForPlatformData(alternateFontData);
&gt; +    }

I&apos;m pretty sure this is wrong. I think Fontconfig will always return a pattern here, whatever works best. Now you&apos;ll never consider the fallback case. In short: I suspect this disables CSS font fallback. E.g. if you have, say:

font: Cantarell; Liberation Sans; sans

I suspect that, with this change, fontconfig will always return some best-effort result for Cantarell, whatever its closest match is, without ever considering the fallbacks Liberation Sans or sans.

If I&apos;m wrong, please explain why.

&gt; Source/WebCore/platform/graphics/freetype/FontPlatformDataFreeType.cpp:310
&gt; -    cairo_matrix_init(&amp;fontMatrix, fontConfigMatrix.xx, -fontConfigMatrix.yx,
&gt; -        -fontConfigMatrix.xy, fontConfigMatrix.yy, 0, 0);
&gt; +
&gt; +    cairo_matrix_init(&amp;fontMatrix, 1, -fontConfigMatrix.yx, -fontConfigMatrix.xy, 1, 0, 0);

Is ignoring the scale really the right thing to do? This seems quite doubtful....</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1402370</commentid>
    <comment_count>8</comment_count>
    <who name="Jeff Fortin">nekohayo</who>
    <bug_when>2018-02-27 11:43:25 -0800</bug_when>
    <thetext>&gt; You don&apos;t get color emoji? Did you try turning your computer upside-down?

I did, but all I got was this 🙃 (and it was still in black &amp; white)
This time I don&apos;t think it&apos;s my computer overheating ;)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1402562</commentid>
    <comment_count>9</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2018-02-28 02:54:34 -0800</bug_when>
    <thetext>(In reply to Michael Catanzaro from comment #7)
&gt; Comment on attachment 334693 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=334693&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp:73
&gt; &gt; +    bool italic = fontDescription.italic();
&gt; &gt; +    if (!FcPatternAddInteger(pattern, FC_SLANT, italic ? FC_SLANT_ITALIC : FC_SLANT_ROMAN))
&gt; 
&gt; Since you&apos;re moving this code, might as well take the opportunity to get rid
&gt; of the unnecessary local variable and do fontDescription.italic() ?
&gt; FC_SLANT_ITALIC : FC_SLANT_ROMAN

Sure.

&gt; &gt; Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp:98
&gt; &gt; +    if (!configurePatternForFontDescription(pattern.get(), fontDescription))
&gt; &gt; +        return nullptr;
&gt; 
&gt; Nit: to make this more readable, add one blank line above and below. It&apos;s
&gt; unrelated to forcing scalable fonts and unrelated to the
&gt; FcConfigSubstitute/cairo_ft_font_options_substitute/FcDefaultSubstitute
&gt; dance.

Ok.

&gt; &gt; Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp:112
&gt; &gt; -    return FcFontSetMatch(nullptr, &amp;fallbacks, 1, pattern, &amp;fontConfigResult);
&gt; &gt; +    return adoptRef(FcFontSetMatch(nullptr, &amp;fallbacks, 1, pattern, &amp;fontConfigResult));
&gt; 
&gt; Good catch.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp:126
&gt; &gt; +    // Try first a direct match.
&gt; &gt; +    FcResult fontConfigResult;
&gt; &gt; +    if (RefPtr&lt;FcPattern&gt; resultPattern = adoptRef(FcFontMatch(nullptr, pattern.get(), &amp;fontConfigResult))) {
&gt; &gt; +        FontPlatformData alternateFontData(resultPattern.get(), description);
&gt; &gt; +        return fontForPlatformData(alternateFontData);
&gt; &gt; +    }
&gt; 
&gt; I&apos;m pretty sure this is wrong. I think Fontconfig will always return a
&gt; pattern here, whatever works best. Now you&apos;ll never consider the fallback
&gt; case. In short: I suspect this disables CSS font fallback. E.g. if you have,
&gt; say:
&gt; 
&gt; font: Cantarell; Liberation Sans; sans
&gt; 
&gt; I suspect that, with this change, fontconfig will always return some
&gt; best-effort result for Cantarell, whatever its closest match is, without
&gt; ever considering the fallbacks Liberation Sans or sans.
&gt; 
&gt; If I&apos;m wrong, please explain why.

Yes, but only in part :-) It seems you are right that direct match always returns a pattern, so the fallbacks code is never used. But this has nothing to do with CSS fallbacks, those are handled by WebCore, not by fonconfig. The CSS fallbacks are used when we fail to find a font for the given family, then trying with the next fallbacks. In all those cases FontCache::createFontPlatformData() is called with the font family. When we have a match for the font family, but we fail to find a glyph, then we try the system fallbacks, ignoring the font family simply looking for a font that contains glyphs for the given characters. In this case is when we call FontCache::systemFallbackForCharacters(). So, it seems to me that in the case of system fallbacks the direct match and the fallbacks match are doing pretty much the same thing, so we can simply get rid of the fontconfig fallbacks. I&apos;ve made several tests cases with a few debug output to see how this works (with this patch applied):

- test-glyph-in-css-fallbacks.html
&lt;span style=&quot;font-family: Cantarell, Liberation Sans, sans; font-size: 128px&quot;&gt;&amp;#x2460;&lt;/span&gt;

DBG: Match found for  sans-serif - DejaVu Sans at /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf
DBG: Match found for  Cantarell - Cantarell at /usr/share/fonts/opentype/cantarell/Cantarell-Regular.otf
DBG: Match found for  Liberation Sans - Liberation Sans at /usr/share/fonts/truetype/liberation2/LiberationSans-Regular.ttf
DBG: Match found for  sans - DejaVu Sans at /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf
DBG: draw glyphs with DejaVuSans

Cantarell doesn&apos;t have a glyph for the character, and libration either, so we end up using DejaVuSans. Note that systemFallbackForCharacters() is not called at all, because there&apos;s a font in the CSS fallbacks that contains the glyph.

- test-main-font-not-found-glyph-in-css-fallbacks.html
&lt;span style=&quot;font-family: TheGreatFooFont, Cantarell, sans; font-size: 128px&quot;&gt;&amp;#x2248;&lt;/span&gt;

DBG: Match found for  sans-serif - DejaVu Sans at /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf
DBG: No matchedFontFamily for TheGreatFooFont - TheGreatFooFont
DBG: Match found for  Cantarell - Cantarell at /usr/share/fonts/opentype/cantarell/Cantarell-Regular.otf
DBG: draw glyphs with Cantarell-Regular

The first font doesn&apos;t exist, but Cantarell has a glyph to render the character, so Cantarell-Regular is used. No systemFallbackForCharacters() in this case either.

 - test-glyph-not-in-css-fallbacks-but-in-system.html
&lt;span style=&quot;font-family: Cantarell, Liberation Sans, sans; font-size: 128px&quot;&gt;&amp;#x1F354;&lt;/span&gt;

DBG: Match found for  sans-serif - DejaVu Sans at /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf
DBG: Match found for  Cantarell - Cantarell at /usr/share/fonts/opentype/cantarell/Cantarell-Regular.otf
DBG: Match found for  Liberation Sans - Liberation Sans at /usr/share/fonts/truetype/liberation2/LiberationSans-Regular.ttf
DBG: Match found for  sans - DejaVu Sans at /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf
DBG: systemFallbackForCharacters: d83c df54
DBG: Direct fallback found for d83c df54 at /home/cgarcia/.local/share/fonts/emojione-android.ttf
DBG: draw glyphs with EmojiOne

It&apos;s an emoji that is not present in any of the CSS fallbacks, but it&apos;s present in EmojiOne, installed in my system. systemFallbackForCharacters() is called in this case and the direct match find the right font. Doing the fallbacks before the direct match in this case provides the exactly same result.

 - test-glyph-not-in-css-fallbacks-nor-in-system.html
&lt;span style=&quot;font-family: Cantarell, Liberation Sans, sans; font-size: 128px&quot;&gt;&amp;#x1F3F1;&lt;/span&gt;

DBG: Match found for  sans-serif - DejaVu Sans at /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf
DBG: Match found for  Cantarell - Cantarell at /usr/share/fonts/opentype/cantarell/Cantarell-Regular.otf
DBG: Match found for  Liberation Sans - Liberation Sans at /usr/share/fonts/truetype/liberation2/LiberationSans-Regular.ttf
DBG: Match found for  sans - DejaVu Sans at /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf
DBG: systemFallbackForCharacters: d83c dff1
DBG: Direct fallback found for d83c dff1 at /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf
DBG: draw glyphs with Cantarell-Regular

There isn&apos;t any font in the system with the glyph required to render the character, so the system fallback returned is DejaVuSans, but since it doesn&apos;t contain the glyph either, the main font is used to render the square that indicates there&apos;s no glyph. In this case doing the fallbacks before the direct match provides the exactly same result.

So, I think we can get rid of the fontconfig fallbacks entirely. They were implemented in 2008 (see r36309) and only the fallbacks were used in FontCache::getFontDataForCharacters(). Then, the direct match after the fallbacks was added in 2010 (see r70688), including a layout test (platform/gtk/fonts/custom-font-missing-glyphs.html) that still passes with this patch.

&gt; &gt; Source/WebCore/platform/graphics/freetype/FontPlatformDataFreeType.cpp:310
&gt; &gt; -    cairo_matrix_init(&amp;fontMatrix, fontConfigMatrix.xx, -fontConfigMatrix.yx,
&gt; &gt; -        -fontConfigMatrix.xy, fontConfigMatrix.yy, 0, 0);
&gt; &gt; +
&gt; &gt; +    cairo_matrix_init(&amp;fontMatrix, 1, -fontConfigMatrix.yx, -fontConfigMatrix.xy, 1, 0, 0);
&gt; 
&gt; Is ignoring the scale really the right thing to do? This seems quite
&gt; doubtful....

We don&apos;t expect to get a scale change from the fontconfig matrix, that&apos;s what is causing this bug. See the emoji browser test linked in description, we are actually rendering the icons using emojione, but they are tiny, because the scale is broken. See the comments in the code:

// FontConfig may return a list of transformation matrices with the pattern, for instance,                                                                                                
// for fonts that are oblique. We use that to initialize the cairo font matrix.  

We don&apos;t expect a scale change, only in rotation for oblique fonts.

// The matrix from FontConfig does not include the scale. Scaling a font with width zero size leads                                                                                       
// to a failed cairo_scaled_font_t instantiations. Instead we scale the font to a very tiny                                                                                               
// size and just abort rendering later on.

Even clearer in this comment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1402564</commentid>
    <comment_count>10</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2018-02-28 03:12:03 -0800</bug_when>
    <thetext>Note that in some cases we still don&apos;t get colored emojis, this is because the glyph is found in another font before emojione, for example U+231A the watch is found in several fonts in my system. We only get the colored emoji one when Emoji One is used explicitly in the font family.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1402565</commentid>
    <comment_count>11</comment_count>
      <attachid>334735</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2018-02-28 03:21:35 -0800</bug_when>
    <thetext>Created attachment 334735
Updated patch

Addressed review comments. I&apos;ve left the fallbacks changes out in the end, because it&apos;s kind of unrelated to this patch. I&apos;ll handle that in a separate bug. This patch doesn&apos;t introduce any regression (nor progression) in layout tests.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1402639</commentid>
    <comment_count>12</comment_count>
      <attachid>334735</attachid>
    <who name="Michael Catanzaro">mcatanzaro</who>
    <bug_when>2018-02-28 09:49:26 -0800</bug_when>
    <thetext>Comment on attachment 334735
Updated patch

View in context: https://bugs.webkit.org/attachment.cgi?id=334735&amp;action=review

I still don&apos;t understand why ignoring the scale is correct, but since this doesn&apos;t break anything, let&apos;s do it.

How hard is it to add a test for this? You could just have an HTML page that displays a single character and save the expected result as an image, right? Then we could at least see that it is colored.

&gt; Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp:132
&gt;      FcResult fontConfigResult;
&gt; -    RefPtr&lt;FcPattern&gt; resultPattern = adoptRef(FcFontMatch(nullptr, pattern.get(), &amp;fontConfigResult));
&gt; -    if (!resultPattern)
&gt; -        return nullptr;
&gt; -    FontPlatformData alternateFontData(resultPattern.get(), description);
&gt; -    return fontForPlatformData(alternateFontData);
&gt; +    if (RefPtr&lt;FcPattern&gt; resultPattern = adoptRef(FcFontMatch(nullptr, pattern.get(), &amp;fontConfigResult))) {
&gt; +        FontPlatformData alternateFontData(resultPattern.get(), description);
&gt; +        return fontForPlatformData(alternateFontData);
&gt; +    }

I don&apos;t think this change is unrelated. It used to be live code, and now you&apos;ve turned it into dead code, right? But very subtle dead code that most developers would not notice. So I would address bug #183210 in this same patch. Up to you, as long as you follow up promptly so that we don&apos;t forget about this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1402648</commentid>
    <comment_count>13</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2018-02-28 10:04:38 -0800</bug_when>
    <thetext>(In reply to Michael Catanzaro from comment #12)
&gt; Comment on attachment 334735 [details]
&gt; Updated patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=334735&amp;action=review
&gt; 
&gt; I still don&apos;t understand why ignoring the scale is correct, but since this
&gt; doesn&apos;t break anything, let&apos;s do it.
&gt; 
&gt; How hard is it to add a test for this? You could just have an HTML page that
&gt; displays a single character and save the expected result as an image, right?
&gt; Then we could at least see that it is colored.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp:132
&gt; &gt;      FcResult fontConfigResult;
&gt; &gt; -    RefPtr&lt;FcPattern&gt; resultPattern = adoptRef(FcFontMatch(nullptr, pattern.get(), &amp;fontConfigResult));
&gt; &gt; -    if (!resultPattern)
&gt; &gt; -        return nullptr;
&gt; &gt; -    FontPlatformData alternateFontData(resultPattern.get(), description);
&gt; &gt; -    return fontForPlatformData(alternateFontData);
&gt; &gt; +    if (RefPtr&lt;FcPattern&gt; resultPattern = adoptRef(FcFontMatch(nullptr, pattern.get(), &amp;fontConfigResult))) {
&gt; &gt; +        FontPlatformData alternateFontData(resultPattern.get(), description);
&gt; &gt; +        return fontForPlatformData(alternateFontData);
&gt; &gt; +    }
&gt; 
&gt; I don&apos;t think this change is unrelated. It used to be live code, and now
&gt; you&apos;ve turned it into dead code, right? But very subtle dead code that most
&gt; developers would not notice. So I would address bug #183210 in this same
&gt; patch. Up to you, as long as you follow up promptly so that we don&apos;t forget
&gt; about this.

Why was it live code? I haven&apos;t changed anything here in behavior, it&apos;s just a cleanup.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1402662</commentid>
    <comment_count>14</comment_count>
      <attachid>334735</attachid>
    <who name="Michael Catanzaro">mcatanzaro</who>
    <bug_when>2018-02-28 11:02:25 -0800</bug_when>
    <thetext>Comment on attachment 334735
Updated patch

View in context: https://bugs.webkit.org/attachment.cgi?id=334735&amp;action=review

&gt;&gt;&gt; Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp:132
&gt;&gt;&gt; +    }
&gt;&gt; 
&gt;&gt; I don&apos;t think this change is unrelated. It used to be live code, and now you&apos;ve turned it into dead code, right? But very subtle dead code that most developers would not notice. So I would address bug #183210 in this same patch. Up to you, as long as you follow up promptly so that we don&apos;t forget about this.
&gt; 
&gt; Why was it live code? I haven&apos;t changed anything here in behavior, it&apos;s just a cleanup.

Oops, I didn&apos;t look closely enough... I see this is different from your original patch. Yes, moving the declarations into the conditional tests is good. OK then!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1402829</commentid>
    <comment_count>15</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2018-02-28 22:51:44 -0800</bug_when>
    <thetext>(In reply to Michael Catanzaro from comment #12)
&gt; Comment on attachment 334735 [details]
&gt; Updated patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=334735&amp;action=review
&gt; 
&gt; I still don&apos;t understand why ignoring the scale is correct, but since this
&gt; doesn&apos;t break anything, let&apos;s do it.
&gt; 
&gt; How hard is it to add a test for this? You could just have an HTML page that
&gt; displays a single character and save the expected result as an image, right?
&gt; Then we could at least see that it is colored.

Again, the problem is not that emojis aren&apos;t colored, they are. The problem is that we are applying the wrong matrix and the scale makes the icons tiny, almost invisible. This only happens when the font is used as a system fallback, so a possible test would be to use Emoji One explicitly in the reference and the default font in the test for the same character. Both should render the same emoji at the same scale. I wrote this test indeed, but it didn&apos;t work because emojis are not positioned at the same place in both cases. This is because of the font line, used to position the characters in a line. In the case of using Emoji One explicitly the font line is Emoji One, so the metrics used for the line are the Emoji One. But then Emoji One is used as a fallback DejaVu or Liberation are the font line and the metrics used are not the Emoji One. At first I thought it was a WebKit bug, but then I noticed that Firefox and Chromium do exactly the same thing. I&apos;ll try to make a non-ref test, but I&apos;m not sure if the render tree is different.

&gt; &gt; Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp:132
&gt; &gt;      FcResult fontConfigResult;
&gt; &gt; -    RefPtr&lt;FcPattern&gt; resultPattern = adoptRef(FcFontMatch(nullptr, pattern.get(), &amp;fontConfigResult));
&gt; &gt; -    if (!resultPattern)
&gt; &gt; -        return nullptr;
&gt; &gt; -    FontPlatformData alternateFontData(resultPattern.get(), description);
&gt; &gt; -    return fontForPlatformData(alternateFontData);
&gt; &gt; +    if (RefPtr&lt;FcPattern&gt; resultPattern = adoptRef(FcFontMatch(nullptr, pattern.get(), &amp;fontConfigResult))) {
&gt; &gt; +        FontPlatformData alternateFontData(resultPattern.get(), description);
&gt; &gt; +        return fontForPlatformData(alternateFontData);
&gt; &gt; +    }
&gt; 
&gt; I don&apos;t think this change is unrelated. It used to be live code, and now
&gt; you&apos;ve turned it into dead code, right? But very subtle dead code that most
&gt; developers would not notice. So I would address bug #183210 in this same
&gt; patch. Up to you, as long as you follow up promptly so that we don&apos;t forget
&gt; about this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1402846</commentid>
    <comment_count>16</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2018-03-01 01:26:20 -0800</bug_when>
    <thetext>Committed r229128: &lt;https://trac.webkit.org/changeset/229128&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1402892</commentid>
    <comment_count>17</comment_count>
    <who name="Michael Catanzaro">mcatanzaro</who>
    <bug_when>2018-03-01 07:24:22 -0800</bug_when>
    <thetext>I would use a non-ref test, because a reftest would be difficult. And I would use an image for the expected results rather than the render tree. That way it will be obvious enough if the emoji is no longer there.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1402899</commentid>
    <comment_count>18</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2018-03-01 08:39:17 -0800</bug_when>
    <thetext>(In reply to Michael Catanzaro from comment #17)
&gt; I would use a non-ref test, because a reftest would be difficult. And I
&gt; would use an image for the expected results rather than the render tree.
&gt; That way it will be obvious enough if the emoji is no longer there.

We don&apos;t have pixels tests enabled. And the thing is that this is not reproducible in the test env because of our custom fontconfig configuration.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1402978</commentid>
    <comment_count>19</comment_count>
    <who name="Michael Catanzaro">mcatanzaro</who>
    <bug_when>2018-03-01 12:02:34 -0800</bug_when>
    <thetext>(In reply to Carlos Garcia Campos from comment #18)
&gt; (In reply to Michael Catanzaro from comment #17)
&gt; &gt; I would use a non-ref test, because a reftest would be difficult. And I
&gt; &gt; would use an image for the expected results rather than the render tree.
&gt; &gt; That way it will be obvious enough if the emoji is no longer there.
&gt; 
&gt; We don&apos;t have pixels tests enabled. 

Ah, yes, good point... the pixel tests are basically useless, then.

&gt; And the thing is that this is not
&gt; reproducible in the test env because of our custom fontconfig configuration.

That&apos;s not a problem, because we control the configuration. It&apos;s kind of expected that it will have to be updated when adding new font tests. But I think the only sane way to do this would be as a pixel test, and there&apos;s no value in adding pixel tests, so I wouldn&apos;t worry about it.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>334693</attachid>
            <date>2018-02-27 09:43:52 -0800</date>
            <delta_ts>2018-02-28 03:21:35 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>wcore-ft-emojis.diff</filename>
            <type>text/plain</type>
            <size>9846</size>
            <attacher name="Carlos Garcia Campos">cgarcia</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA5NGU4MzYzNGI3MS4uMDVhN2Q5MTE3N2UgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwyNSBAQAorMjAxOC0wMi0yNyAgQ2FybG9zIEdhcmNpYSBDYW1wb3MgIDxjZ2FyY2lhQGln
YWxpYS5jb20+CisKKyAgICAgICAgW0ZyZWVUeXBlXSBDb2xvciBlbW9qaXMgaW4gV2ViS2l0R1RL
KyBmb3IgZ3JlYXQganVzdGljZQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTgzMTU1CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgRW1vamlzIGFyZSBhY3R1YWxseSByZW5kZXJlZCBpZiB0aGVyZSdzIGFuIGVt
b2ppIGZvbnQgaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0sIGJ1dCB0aGUgc2l6ZSBpcyBzbyB0aW55
IHRoYXQgd2UKKyAgICAgICAgZG9uJ3Qgc2VlIHRoZW0uIFRoaXMgaXMgYmVjYXVzZSBmb3Igc29t
ZSByZWFzb24gdGhlIG1hdHJpeCB3ZSBhcmUgZ2V0dGluZyBmcm9tIGZvbnRjb25maWcgY29udGFp
bnMgYSBzY2FsZSwKKyAgICAgICAgd2hpY2ggd2UgZG9uJ3QgZXhwZWN0LiBXZSBvbmx5IGdldCB0
aGUgZm9udGNvbmZpZyBtYXRyaXggdG8gYXBwbHkgcm90YXRpb25zIGluIGNhc2Ugb2Ygb2JsaXF1
ZSBmb250cywgYW5kIHRoZW4gd2UKKyAgICAgICAgYWx3YXlzIGFwcGx5IHRoZSBzY2FsZSBmb3Ig
dGhlIGNvbXB1dGVkIHBpeGVsIGZvbnQgc2l6ZS4gSWdub3JpbmcgdGhlIGZvbnRjb25maWcgbWF0
cml4IHNjYWxlIGZpeGVzIHRoZSBpc3N1ZS4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L2ZyZWV0eXBlL0ZvbnRDYWNoZUZyZWVUeXBlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmZvbnRX
ZWlnaHRUb0ZvbnRjb25maWdXZWlnaHQpOiBNb3ZlZCBoZXJlIHNpbmNlIGl0J3Mgbm93IHVzZWQg
YnkgY29uZmlndXJlUGF0dGVybkZvckZvbnREZXNjcmlwdGlvbigpLgorICAgICAgICAoV2ViQ29y
ZTo6Y29uZmlndXJlUGF0dGVybkZvckZvbnREZXNjcmlwdGlvbik6IEhlbHBlciBmdW5jdGlvbiB0
byBhcHBseSB0aGUgc2FtZSBvcHRpb25zIGZvciBmYWxsYmFjayBwYXR0ZXJuLgorICAgICAgICAo
V2ViQ29yZTo6Y3JlYXRlRm9udENvbmZpZ1BhdHRlcm5Gb3JDaGFyYWN0ZXJzKTogVXNlIGNvbmZp
Z3VyZVBhdHRlcm5Gb3JGb250RGVzY3JpcHRpb24oKS4KKyAgICAgICAgKFdlYkNvcmU6OmZpbmRC
ZXN0Rm9udEdpdmVuRmFsbGJhY2tzKTogQWRvcHQgdGhlIHJldHVybmVkIHJlZmVyZW5jZS4KKyAg
ICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6c3lzdGVtRmFsbGJhY2tGb3JDaGFyYWN0ZXJzKTog
VHJ5IGZpcnN0IGEgZGlyZWN0IG1hdGNoIGFuZCB0aGVuIHRoZSBmYWxsYmFja3MuCisgICAgICAg
IChXZWJDb3JlOjpGb250Q2FjaGU6OmNyZWF0ZUZvbnRQbGF0Zm9ybURhdGEpOiBVc2UgY29uZmln
dXJlUGF0dGVybkZvckZvbnREZXNjcmlwdGlvbigpLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL2ZyZWV0eXBlL0ZvbnRQbGF0Zm9ybURhdGFGcmVlVHlwZS5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpGb250UGxhdGZvcm1EYXRhOjpidWlsZFNjYWxlZEZvbnQpOiBJZ25vcmUgdGhlIHNjYWxl
IHJldHVybmVkIGJ5IGZvbnRjb25maWcgbWF0cml4LgorCiAyMDE4LTAyLTI2ICBDYXJsb3MgR2Fy
Y2lhIENhbXBvcyAgPGNnYXJjaWFAaWdhbGlhLmNvbT4KIAogICAgICAgICBbR1N0cmVhbWVyXSBV
c2VyIGN1cnJlbnQgZXhlY3V0YWJsZSBuYW1lIGluc3RlYWQgb2YgZ19nZXRfcHJnbmFtZSgpIGZv
ciBnc3RfaW5pdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
ZnJlZXR5cGUvRm9udENhY2hlRnJlZVR5cGUuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvZnJlZXR5cGUvRm9udENhY2hlRnJlZVR5cGUuY3BwCmluZGV4IDFkM2UwZGZmZGVm
Li42NmU5MjIzMTVlMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvZnJlZXR5cGUvRm9udENhY2hlRnJlZVR5cGUuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2ZyZWV0eXBlL0ZvbnRDYWNoZUZyZWVUeXBlLmNwcApAQCAtNDYsNyAr
NDYsNDAgQEAgdm9pZCBGb250Q2FjaGU6OnBsYXRmb3JtSW5pdCgpCiAgICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOwogfQogCi1zdGF0aWMgUmVmUHRyPEZjUGF0dGVybj4gY3JlYXRlRm9udENv
bmZpZ1BhdHRlcm5Gb3JDaGFyYWN0ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgYnVm
ZmVyTGVuZ3RoKQorc3RhdGljIGludCBmb250V2VpZ2h0VG9Gb250Y29uZmlnV2VpZ2h0KEZvbnRT
ZWxlY3Rpb25WYWx1ZSB3ZWlnaHQpCit7CisgICAgaWYgKHdlaWdodCA8IEZvbnRTZWxlY3Rpb25W
YWx1ZSgxNTApKQorICAgICAgICByZXR1cm4gRkNfV0VJR0hUX1RISU47CisgICAgaWYgKHdlaWdo
dCA8IEZvbnRTZWxlY3Rpb25WYWx1ZSgyNTApKQorICAgICAgICByZXR1cm4gRkNfV0VJR0hUX1VM
VFJBTElHSFQ7CisgICAgaWYgKHdlaWdodCA8IEZvbnRTZWxlY3Rpb25WYWx1ZSgzNTApKQorICAg
ICAgICByZXR1cm4gRkNfV0VJR0hUX0xJR0hUOworICAgIGlmICh3ZWlnaHQgPCBGb250U2VsZWN0
aW9uVmFsdWUoNDUwKSkKKyAgICAgICAgcmV0dXJuIEZDX1dFSUdIVF9SRUdVTEFSOworICAgIGlm
ICh3ZWlnaHQgPCBGb250U2VsZWN0aW9uVmFsdWUoNTUwKSkKKyAgICAgICAgcmV0dXJuIEZDX1dF
SUdIVF9NRURJVU07CisgICAgaWYgKHdlaWdodCA8IEZvbnRTZWxlY3Rpb25WYWx1ZSg2NTApKQor
ICAgICAgICByZXR1cm4gRkNfV0VJR0hUX1NFTUlCT0xEOworICAgIGlmICh3ZWlnaHQgPCBGb250
U2VsZWN0aW9uVmFsdWUoNzUwKSkKKyAgICAgICAgcmV0dXJuIEZDX1dFSUdIVF9CT0xEOworICAg
IGlmICh3ZWlnaHQgPCBGb250U2VsZWN0aW9uVmFsdWUoODUwKSkKKyAgICAgICAgcmV0dXJuIEZD
X1dFSUdIVF9FWFRSQUJPTEQ7CisgICAgcmV0dXJuIEZDX1dFSUdIVF9VTFRSQUJMQUNLOworfQor
CitzdGF0aWMgYm9vbCBjb25maWd1cmVQYXR0ZXJuRm9yRm9udERlc2NyaXB0aW9uKEZjUGF0dGVy
biogcGF0dGVybiwgY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pCit7Cisg
ICAgYm9vbCBpdGFsaWMgPSBmb250RGVzY3JpcHRpb24uaXRhbGljKCk7CisgICAgaWYgKCFGY1Bh
dHRlcm5BZGRJbnRlZ2VyKHBhdHRlcm4sIEZDX1NMQU5ULCBpdGFsaWMgPyBGQ19TTEFOVF9JVEFM
SUMgOiBGQ19TTEFOVF9ST01BTikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIUZj
UGF0dGVybkFkZEludGVnZXIocGF0dGVybiwgRkNfV0VJR0hULCBmb250V2VpZ2h0VG9Gb250Y29u
ZmlnV2VpZ2h0KGZvbnREZXNjcmlwdGlvbi53ZWlnaHQoKSkpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgaWYgKCFGY1BhdHRlcm5BZGREb3VibGUocGF0dGVybiwgRkNfUElYRUxfU0laRSwg
Zm9udERlc2NyaXB0aW9uLmNvbXB1dGVkUGl4ZWxTaXplKCkpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBSZWZQdHI8RmNQYXR0ZXJuPiBjcmVh
dGVGb250Q29uZmlnUGF0dGVybkZvckNoYXJhY3RlcnMoY29uc3QgRm9udERlc2NyaXB0aW9uJiBm
b250RGVzY3JpcHRpb24sIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgYnVmZmVyTGVuZ3Ro
KQogewogICAgIFJlZlB0cjxGY1BhdHRlcm4+IHBhdHRlcm4gPSBhZG9wdFJlZihGY1BhdHRlcm5D
cmVhdGUoKSk7CiAgICAgRmNVbmlxdWVQdHI8RmNDaGFyU2V0PiBmb250Q29uZmlnQ2hhclNldChG
Y0NoYXJTZXRDcmVhdGUoKSk7CkBAIC02MSw2ICs5NCw4IEBAIHN0YXRpYyBSZWZQdHI8RmNQYXR0
ZXJuPiBjcmVhdGVGb250Q29uZmlnUGF0dGVybkZvckNoYXJhY3RlcnMoY29uc3QgVUNoYXIqIGNo
YXJhCiAgICAgRmNQYXR0ZXJuQWRkQ2hhclNldChwYXR0ZXJuLmdldCgpLCBGQ19DSEFSU0VULCBm
b250Q29uZmlnQ2hhclNldC5nZXQoKSk7CiAKICAgICBGY1BhdHRlcm5BZGRCb29sKHBhdHRlcm4u
Z2V0KCksIEZDX1NDQUxBQkxFLCBGY1RydWUpOworICAgIGlmICghY29uZmlndXJlUGF0dGVybkZv
ckZvbnREZXNjcmlwdGlvbihwYXR0ZXJuLmdldCgpLCBmb250RGVzY3JpcHRpb24pKQorICAgICAg
ICByZXR1cm4gbnVsbHB0cjsKICAgICBGY0NvbmZpZ1N1YnN0aXR1dGUobnVsbHB0ciwgcGF0dGVy
bi5nZXQoKSwgRmNNYXRjaFBhdHRlcm4pOwogICAgIGNhaXJvX2Z0X2ZvbnRfb3B0aW9uc19zdWJz
dGl0dXRlKGdldERlZmF1bHRDYWlyb0ZvbnRPcHRpb25zKCksIHBhdHRlcm4uZ2V0KCkpOwogICAg
IEZjRGVmYXVsdFN1YnN0aXR1dGUocGF0dGVybi5nZXQoKSk7CkBAIC03NCwyNiArMTA5LDI5IEBA
IHN0YXRpYyBSZWZQdHI8RmNQYXR0ZXJuPiBmaW5kQmVzdEZvbnRHaXZlbkZhbGxiYWNrcyhjb25z
dCBGb250UGxhdGZvcm1EYXRhJiBmb250CiAgICAgICAgIHJldHVybiBudWxscHRyOwogCiAgICAg
RmNSZXN1bHQgZm9udENvbmZpZ1Jlc3VsdDsKLSAgICByZXR1cm4gRmNGb250U2V0TWF0Y2gobnVs
bHB0ciwgJmZhbGxiYWNrcywgMSwgcGF0dGVybiwgJmZvbnRDb25maWdSZXN1bHQpOworICAgIHJl
dHVybiBhZG9wdFJlZihGY0ZvbnRTZXRNYXRjaChudWxscHRyLCAmZmFsbGJhY2tzLCAxLCBwYXR0
ZXJuLCAmZm9udENvbmZpZ1Jlc3VsdCkpOwogfQogCiBSZWZQdHI8Rm9udD4gRm9udENhY2hlOjpz
eXN0ZW1GYWxsYmFja0ZvckNoYXJhY3RlcnMoY29uc3QgRm9udERlc2NyaXB0aW9uJiBkZXNjcmlw
dGlvbiwgY29uc3QgRm9udCogb3JpZ2luYWxGb250RGF0YSwgYm9vbCwgY29uc3QgVUNoYXIqIGNo
YXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCkKIHsKLSAgICBSZWZQdHI8RmNQYXR0ZXJuPiBwYXR0
ZXJuID0gY3JlYXRlRm9udENvbmZpZ1BhdHRlcm5Gb3JDaGFyYWN0ZXJzKGNoYXJhY3RlcnMsIGxl
bmd0aCk7Ci0gICAgY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgZm9udERhdGEgPSBvcmlnaW5hbEZv
bnREYXRhLT5wbGF0Zm9ybURhdGEoKTsKKyAgICBSZWZQdHI8RmNQYXR0ZXJuPiBwYXR0ZXJuID0g
Y3JlYXRlRm9udENvbmZpZ1BhdHRlcm5Gb3JDaGFyYWN0ZXJzKGRlc2NyaXB0aW9uLCBjaGFyYWN0
ZXJzLCBsZW5ndGgpOworICAgIGlmICghcGF0dGVybikKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7
CisKKyAgICAvLyBUcnkgZmlyc3QgYSBkaXJlY3QgbWF0Y2guCisgICAgRmNSZXN1bHQgZm9udENv
bmZpZ1Jlc3VsdDsKKyAgICBpZiAoUmVmUHRyPEZjUGF0dGVybj4gcmVzdWx0UGF0dGVybiA9IGFk
b3B0UmVmKEZjRm9udE1hdGNoKG51bGxwdHIsIHBhdHRlcm4uZ2V0KCksICZmb250Q29uZmlnUmVz
dWx0KSkpIHsKKyAgICAgICAgRm9udFBsYXRmb3JtRGF0YSBhbHRlcm5hdGVGb250RGF0YShyZXN1
bHRQYXR0ZXJuLmdldCgpLCBkZXNjcmlwdGlvbik7CisgICAgICAgIHJldHVybiBmb250Rm9yUGxh
dGZvcm1EYXRhKGFsdGVybmF0ZUZvbnREYXRhKTsKKyAgICB9CiAKLSAgICBSZWZQdHI8RmNQYXR0
ZXJuPiBmYWxsYmFja1BhdHRlcm4gPSBmaW5kQmVzdEZvbnRHaXZlbkZhbGxiYWNrcyhmb250RGF0
YSwgcGF0dGVybi5nZXQoKSk7Ci0gICAgaWYgKGZhbGxiYWNrUGF0dGVybikgeworICAgIC8vIFRo
ZW4gdHJ5IGZhbGxiYWNrcy4KKyAgICBpZiAoUmVmUHRyPEZjUGF0dGVybj4gZmFsbGJhY2tQYXR0
ZXJuID0gZmluZEJlc3RGb250R2l2ZW5GYWxsYmFja3Mob3JpZ2luYWxGb250RGF0YS0+cGxhdGZv
cm1EYXRhKCksIHBhdHRlcm4uZ2V0KCkpKSB7CiAgICAgICAgIEZvbnRQbGF0Zm9ybURhdGEgYWx0
ZXJuYXRlRm9udERhdGEoZmFsbGJhY2tQYXR0ZXJuLmdldCgpLCBkZXNjcmlwdGlvbik7CiAgICAg
ICAgIHJldHVybiBmb250Rm9yUGxhdGZvcm1EYXRhKGFsdGVybmF0ZUZvbnREYXRhKTsKICAgICB9
CiAKLSAgICBGY1Jlc3VsdCBmb250Q29uZmlnUmVzdWx0OwotICAgIFJlZlB0cjxGY1BhdHRlcm4+
IHJlc3VsdFBhdHRlcm4gPSBhZG9wdFJlZihGY0ZvbnRNYXRjaChudWxscHRyLCBwYXR0ZXJuLmdl
dCgpLCAmZm9udENvbmZpZ1Jlc3VsdCkpOwotICAgIGlmICghcmVzdWx0UGF0dGVybikKLSAgICAg
ICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgRm9udFBsYXRmb3JtRGF0YSBhbHRlcm5hdGVGb250RGF0
YShyZXN1bHRQYXR0ZXJuLmdldCgpLCBkZXNjcmlwdGlvbik7Ci0gICAgcmV0dXJuIGZvbnRGb3JQ
bGF0Zm9ybURhdGEoYWx0ZXJuYXRlRm9udERhdGEpOworICAgIHJldHVybiBudWxscHRyOwogfQog
CiBzdGF0aWMgVmVjdG9yPFN0cmluZz4gcGF0dGVyblRvRmFtaWxpZXMoRmNQYXR0ZXJuJiBwYXR0
ZXJuKQpAQCAtMTcwLDI3ICsyMDgsNiBAQCBzdGF0aWMgU3RyaW5nIGdldEZhbWlseU5hbWVTdHJp
bmdGcm9tRmFtaWx5KGNvbnN0IEF0b21pY1N0cmluZyYgZmFtaWx5KQogICAgIHJldHVybiAiIjsK
IH0KIAotc3RhdGljIGludCBmb250V2VpZ2h0VG9Gb250Y29uZmlnV2VpZ2h0KEZvbnRTZWxlY3Rp
b25WYWx1ZSB3ZWlnaHQpCi17Ci0gICAgaWYgKHdlaWdodCA8IEZvbnRTZWxlY3Rpb25WYWx1ZSgx
NTApKQotICAgICAgICByZXR1cm4gRkNfV0VJR0hUX1RISU47Ci0gICAgaWYgKHdlaWdodCA8IEZv
bnRTZWxlY3Rpb25WYWx1ZSgyNTApKQotICAgICAgICByZXR1cm4gRkNfV0VJR0hUX1VMVFJBTElH
SFQ7Ci0gICAgaWYgKHdlaWdodCA8IEZvbnRTZWxlY3Rpb25WYWx1ZSgzNTApKQotICAgICAgICBy
ZXR1cm4gRkNfV0VJR0hUX0xJR0hUOwotICAgIGlmICh3ZWlnaHQgPCBGb250U2VsZWN0aW9uVmFs
dWUoNDUwKSkKLSAgICAgICAgcmV0dXJuIEZDX1dFSUdIVF9SRUdVTEFSOwotICAgIGlmICh3ZWln
aHQgPCBGb250U2VsZWN0aW9uVmFsdWUoNTUwKSkKLSAgICAgICAgcmV0dXJuIEZDX1dFSUdIVF9N
RURJVU07Ci0gICAgaWYgKHdlaWdodCA8IEZvbnRTZWxlY3Rpb25WYWx1ZSg2NTApKQotICAgICAg
ICByZXR1cm4gRkNfV0VJR0hUX1NFTUlCT0xEOwotICAgIGlmICh3ZWlnaHQgPCBGb250U2VsZWN0
aW9uVmFsdWUoNzUwKSkKLSAgICAgICAgcmV0dXJuIEZDX1dFSUdIVF9CT0xEOwotICAgIGlmICh3
ZWlnaHQgPCBGb250U2VsZWN0aW9uVmFsdWUoODUwKSkKLSAgICAgICAgcmV0dXJuIEZDX1dFSUdI
VF9FWFRSQUJPTEQ7Ci0gICAgcmV0dXJuIEZDX1dFSUdIVF9VTFRSQUJMQUNLOwotfQotCiAvLyBU
aGlzIGlzIGJhc2VkIG9uIENocm9taXVtIEJTRCBjb2RlIGZyb20gU2tpYSAoc3JjL3BvcnRzL1Nr
Rm9udE1ncl9mb250Y29uZmlnLmNwcCkuIEl0IGlzIGEKIC8vIGhhY2sgZm9yIGxhY2sgb2YgQVBJ
IGluIEZvbnRjb25maWc6IGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dp
P2lkPTE5Mzc1CiAvLyBGSVhNRTogVGhpcyBpcyBob3JyaWJsZS4gSXQgc2hvdWxkIGJlIGRlbGV0
ZWQgb25jZSBGb250Y29uZmlnIGNhbiBkbyB0aGlzIGl0c2VsZi4KQEAgLTM0NSwxMiArMzYyLDcg
QEAgc3RkOjp1bmlxdWVfcHRyPEZvbnRQbGF0Zm9ybURhdGE+IEZvbnRDYWNoZTo6Y3JlYXRlRm9u
dFBsYXRmb3JtRGF0YShjb25zdCBGb250RGUKICAgICBpZiAoIUZjUGF0dGVybkFkZFN0cmluZyhw
YXR0ZXJuLmdldCgpLCBGQ19GQU1JTFksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRmNDaGFyOCo+
KGZhbWlseU5hbWVTdHJpbmcudXRmOCgpLmRhdGEoKSkpKQogICAgICAgICByZXR1cm4gbnVsbHB0
cjsKIAotICAgIGJvb2wgaXRhbGljID0gZm9udERlc2NyaXB0aW9uLml0YWxpYygpOwotICAgIGlm
ICghRmNQYXR0ZXJuQWRkSW50ZWdlcihwYXR0ZXJuLmdldCgpLCBGQ19TTEFOVCwgaXRhbGljID8g
RkNfU0xBTlRfSVRBTElDIDogRkNfU0xBTlRfUk9NQU4pKQotICAgICAgICByZXR1cm4gbnVsbHB0
cjsKLSAgICBpZiAoIUZjUGF0dGVybkFkZEludGVnZXIocGF0dGVybi5nZXQoKSwgRkNfV0VJR0hU
LCBmb250V2VpZ2h0VG9Gb250Y29uZmlnV2VpZ2h0KGZvbnREZXNjcmlwdGlvbi53ZWlnaHQoKSkp
KQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICBpZiAoIUZjUGF0dGVybkFkZERvdWJsZShw
YXR0ZXJuLmdldCgpLCBGQ19QSVhFTF9TSVpFLCBmb250RGVzY3JpcHRpb24uY29tcHV0ZWRQaXhl
bFNpemUoKSkpCisgICAgaWYgKCFjb25maWd1cmVQYXR0ZXJuRm9yRm9udERlc2NyaXB0aW9uKHBh
dHRlcm4uZ2V0KCksIGZvbnREZXNjcmlwdGlvbikpCiAgICAgICAgIHJldHVybiBudWxscHRyOwog
CiAgICAgLy8gVGhlIHN0cmF0ZWd5IGlzIG9yaWdpbmFsbHkgZnJvbSBTa2lhIChzcmMvcG9ydHMv
U2tGb250SG9zdF9mb250Y29uZmlnLmNwcCk6CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9mcmVldHlwZS9Gb250UGxhdGZvcm1EYXRhRnJlZVR5cGUuY3BwIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZnJlZXR5cGUvRm9udFBsYXRmb3JtRGF0
YUZyZWVUeXBlLmNwcAppbmRleCBkMTIwZjQwMDBmZi4uOGE4N2U3ZDMzNzMgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2ZyZWV0eXBlL0ZvbnRQbGF0Zm9ybURh
dGFGcmVlVHlwZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZnJl
ZXR5cGUvRm9udFBsYXRmb3JtRGF0YUZyZWVUeXBlLmNwcApAQCAtMzA2LDExICszMDYsMTEgQEAg
dm9pZCBGb250UGxhdGZvcm1EYXRhOjpidWlsZFNjYWxlZEZvbnQoY2Fpcm9fZm9udF9mYWNlX3Qq
IGZvbnRGYWNlKQogICAgIC8vIFRoZXNlIG1hdHJpY2VzIG1heSBiZSBzdGFja2VkIGluIHRoZSBw
YXR0ZXJuLCBzbyBpdCdzIG91ciBqb2IgdG8gZ2V0IHRoZW0gYWxsIGFuZCBtdWx0aXBseSB0aGVt
LgogICAgIGZvciAoaW50IGkgPSAwOyBGY1BhdHRlcm5HZXRNYXRyaXgob3B0aW9uc1BhdHRlcm4s
IEZDX01BVFJJWCwgaSwgJnRlbXBGb250Q29uZmlnTWF0cml4KSA9PSBGY1Jlc3VsdE1hdGNoOyBp
KyspCiAgICAgICAgIEZjTWF0cml4TXVsdGlwbHkoJmZvbnRDb25maWdNYXRyaXgsICZmb250Q29u
ZmlnTWF0cml4LCB0ZW1wRm9udENvbmZpZ01hdHJpeCk7Ci0gICAgY2Fpcm9fbWF0cml4X2luaXQo
JmZvbnRNYXRyaXgsIGZvbnRDb25maWdNYXRyaXgueHgsIC1mb250Q29uZmlnTWF0cml4Lnl4LAot
ICAgICAgICAtZm9udENvbmZpZ01hdHJpeC54eSwgZm9udENvbmZpZ01hdHJpeC55eSwgMCwgMCk7
CisKKyAgICBjYWlyb19tYXRyaXhfaW5pdCgmZm9udE1hdHJpeCwgMSwgLWZvbnRDb25maWdNYXRy
aXgueXgsIC1mb250Q29uZmlnTWF0cml4Lnh5LCAxLCAwLCAwKTsKIAogICAgIC8vIFRoZSBtYXRy
aXggZnJvbSBGb250Q29uZmlnIGRvZXMgbm90IGluY2x1ZGUgdGhlIHNjYWxlLiBTY2FsaW5nIGEg
Zm9udCB3aXRoIHdpZHRoIHplcm8gc2l6ZSBsZWFkcwotICAgIC8vIHRvIGEgZmFpbGVkIGNhaXJv
X3NjYWxlZF9mb250X3QgaW5zdGFudGlhdGlvbnMuIEluc3RlYWQgd2Ugc2NhbGUgd2Ugc2NhbGUg
dGhlIGZvbnQgdG8gYSB2ZXJ5IHRpbnkKKyAgICAvLyB0byBhIGZhaWxlZCBjYWlyb19zY2FsZWRf
Zm9udF90IGluc3RhbnRpYXRpb25zLiBJbnN0ZWFkIHdlIHNjYWxlIHRoZSBmb250IHRvIGEgdmVy
eSB0aW55CiAgICAgLy8gc2l6ZSBhbmQganVzdCBhYm9ydCByZW5kZXJpbmcgbGF0ZXIgb24uCiAg
ICAgZmxvYXQgcmVhbFNpemUgPSBtX3NpemUgPyBtX3NpemUgOiAxOwogICAgIGNhaXJvX21hdHJp
eF9zY2FsZSgmZm9udE1hdHJpeCwgcmVhbFNpemUsIHJlYWxTaXplKTsK
</data>
<flag name="review"
          id="353418"
          type_id="1"
          status="-"
          setter="mcatanzaro"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>334735</attachid>
            <date>2018-02-28 03:21:35 -0800</date>
            <delta_ts>2018-02-28 09:49:26 -0800</delta_ts>
            <desc>Updated patch</desc>
            <filename>wcore-ft-emojis.diff</filename>
            <type>text/plain</type>
            <size>9696</size>
            <attacher name="Carlos Garcia Campos">cgarcia</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA5NGU4MzYzNGI3MS4uMDcyZjA0MDVlYmQgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwyNSBAQAorMjAxOC0wMi0yOCAgQ2FybG9zIEdhcmNpYSBDYW1wb3MgIDxjZ2FyY2lhQGln
YWxpYS5jb20+CisKKyAgICAgICAgW0ZyZWVUeXBlXSBDb2xvciBlbW9qaXMgaW4gV2ViS2l0R1RL
KyBmb3IgZ3JlYXQganVzdGljZQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTgzMTU1CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgRW1vamlzIGFyZSBhY3R1YWxseSByZW5kZXJlZCBpZiB0aGVyZSdzIGFuIGVt
b2ppIGZvbnQgaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0sIGJ1dCB0aGUgc2l6ZSBpcyBzbyB0aW55
IHRoYXQgd2UKKyAgICAgICAgZG9uJ3Qgc2VlIHRoZW0uIFRoaXMgaXMgYmVjYXVzZSBmb3Igc29t
ZSByZWFzb24gdGhlIG1hdHJpeCB3ZSBhcmUgZ2V0dGluZyBmcm9tIGZvbnRjb25maWcgY29udGFp
bnMgYSBzY2FsZSwKKyAgICAgICAgd2hpY2ggd2UgZG9uJ3QgZXhwZWN0LiBXZSBvbmx5IGdldCB0
aGUgZm9udGNvbmZpZyBtYXRyaXggdG8gYXBwbHkgcm90YXRpb25zIGluIGNhc2Ugb2Ygb2JsaXF1
ZSBmb250cywgYW5kIHRoZW4gd2UKKyAgICAgICAgYWx3YXlzIGFwcGx5IHRoZSBzY2FsZSBmb3Ig
dGhlIGNvbXB1dGVkIHBpeGVsIGZvbnQgc2l6ZS4gSWdub3JpbmcgdGhlIGZvbnRjb25maWcgbWF0
cml4IHNjYWxlIGZpeGVzIHRoZSBpc3N1ZS4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L2ZyZWV0eXBlL0ZvbnRDYWNoZUZyZWVUeXBlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmZvbnRX
ZWlnaHRUb0ZvbnRjb25maWdXZWlnaHQpOiBNb3ZlZCBoZXJlIHNpbmNlIGl0J3Mgbm93IHVzZWQg
YnkgY29uZmlndXJlUGF0dGVybkZvckZvbnREZXNjcmlwdGlvbigpLgorICAgICAgICAoV2ViQ29y
ZTo6Y29uZmlndXJlUGF0dGVybkZvckZvbnREZXNjcmlwdGlvbik6IEhlbHBlciBmdW5jdGlvbiB0
byBhcHBseSB0aGUgc2FtZSBvcHRpb25zIGZvciBmYWxsYmFjayBwYXR0ZXJuLgorICAgICAgICAo
V2ViQ29yZTo6Y3JlYXRlRm9udENvbmZpZ1BhdHRlcm5Gb3JDaGFyYWN0ZXJzKTogVXNlIGNvbmZp
Z3VyZVBhdHRlcm5Gb3JGb250RGVzY3JpcHRpb24oKS4KKyAgICAgICAgKFdlYkNvcmU6OmZpbmRC
ZXN0Rm9udEdpdmVuRmFsbGJhY2tzKTogQWRvcHQgdGhlIHJldHVybmVkIHJlZmVyZW5jZS4KKyAg
ICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6c3lzdGVtRmFsbGJhY2tGb3JDaGFyYWN0ZXJzKTog
Q2xlYW4gaXQgdXAuCisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OmNyZWF0ZUZvbnRQbGF0
Zm9ybURhdGEpOiBVc2UgY29uZmlndXJlUGF0dGVybkZvckZvbnREZXNjcmlwdGlvbigpLgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2ZyZWV0eXBlL0ZvbnRQbGF0Zm9ybURhdGFGcmVlVHlw
ZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGb250UGxhdGZvcm1EYXRhOjpidWlsZFNjYWxlZEZv
bnQpOiBJZ25vcmUgdGhlIHNjYWxlIHJldHVybmVkIGJ5IGZvbnRjb25maWcgbWF0cml4LgorCiAy
MDE4LTAyLTI2ICBDYXJsb3MgR2FyY2lhIENhbXBvcyAgPGNnYXJjaWFAaWdhbGlhLmNvbT4KIAog
ICAgICAgICBbR1N0cmVhbWVyXSBVc2VyIGN1cnJlbnQgZXhlY3V0YWJsZSBuYW1lIGluc3RlYWQg
b2YgZ19nZXRfcHJnbmFtZSgpIGZvciBnc3RfaW5pdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvZnJlZXR5cGUvRm9udENhY2hlRnJlZVR5cGUuY3BwIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZnJlZXR5cGUvRm9udENhY2hlRnJlZVR5cGUu
Y3BwCmluZGV4IDFkM2UwZGZmZGVmLi40Y2ViZDczYWQyYiAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZnJlZXR5cGUvRm9udENhY2hlRnJlZVR5cGUuY3BwCisr
KyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2ZyZWV0eXBlL0ZvbnRDYWNoZUZy
ZWVUeXBlLmNwcApAQCAtNDYsNyArNDYsMzkgQEAgdm9pZCBGb250Q2FjaGU6OnBsYXRmb3JtSW5p
dCgpCiAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwogfQogCi1zdGF0aWMgUmVmUHRyPEZj
UGF0dGVybj4gY3JlYXRlRm9udENvbmZpZ1BhdHRlcm5Gb3JDaGFyYWN0ZXJzKGNvbnN0IFVDaGFy
KiBjaGFyYWN0ZXJzLCBpbnQgYnVmZmVyTGVuZ3RoKQorc3RhdGljIGludCBmb250V2VpZ2h0VG9G
b250Y29uZmlnV2VpZ2h0KEZvbnRTZWxlY3Rpb25WYWx1ZSB3ZWlnaHQpCit7CisgICAgaWYgKHdl
aWdodCA8IEZvbnRTZWxlY3Rpb25WYWx1ZSgxNTApKQorICAgICAgICByZXR1cm4gRkNfV0VJR0hU
X1RISU47CisgICAgaWYgKHdlaWdodCA8IEZvbnRTZWxlY3Rpb25WYWx1ZSgyNTApKQorICAgICAg
ICByZXR1cm4gRkNfV0VJR0hUX1VMVFJBTElHSFQ7CisgICAgaWYgKHdlaWdodCA8IEZvbnRTZWxl
Y3Rpb25WYWx1ZSgzNTApKQorICAgICAgICByZXR1cm4gRkNfV0VJR0hUX0xJR0hUOworICAgIGlm
ICh3ZWlnaHQgPCBGb250U2VsZWN0aW9uVmFsdWUoNDUwKSkKKyAgICAgICAgcmV0dXJuIEZDX1dF
SUdIVF9SRUdVTEFSOworICAgIGlmICh3ZWlnaHQgPCBGb250U2VsZWN0aW9uVmFsdWUoNTUwKSkK
KyAgICAgICAgcmV0dXJuIEZDX1dFSUdIVF9NRURJVU07CisgICAgaWYgKHdlaWdodCA8IEZvbnRT
ZWxlY3Rpb25WYWx1ZSg2NTApKQorICAgICAgICByZXR1cm4gRkNfV0VJR0hUX1NFTUlCT0xEOwor
ICAgIGlmICh3ZWlnaHQgPCBGb250U2VsZWN0aW9uVmFsdWUoNzUwKSkKKyAgICAgICAgcmV0dXJu
IEZDX1dFSUdIVF9CT0xEOworICAgIGlmICh3ZWlnaHQgPCBGb250U2VsZWN0aW9uVmFsdWUoODUw
KSkKKyAgICAgICAgcmV0dXJuIEZDX1dFSUdIVF9FWFRSQUJPTEQ7CisgICAgcmV0dXJuIEZDX1dF
SUdIVF9VTFRSQUJMQUNLOworfQorCitzdGF0aWMgYm9vbCBjb25maWd1cmVQYXR0ZXJuRm9yRm9u
dERlc2NyaXB0aW9uKEZjUGF0dGVybiogcGF0dGVybiwgY29uc3QgRm9udERlc2NyaXB0aW9uJiBm
b250RGVzY3JpcHRpb24pCit7CisgICAgaWYgKCFGY1BhdHRlcm5BZGRJbnRlZ2VyKHBhdHRlcm4s
IEZDX1NMQU5ULCBmb250RGVzY3JpcHRpb24uaXRhbGljKCkgPyBGQ19TTEFOVF9JVEFMSUMgOiBG
Q19TTEFOVF9ST01BTikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIUZjUGF0dGVy
bkFkZEludGVnZXIocGF0dGVybiwgRkNfV0VJR0hULCBmb250V2VpZ2h0VG9Gb250Y29uZmlnV2Vp
Z2h0KGZvbnREZXNjcmlwdGlvbi53ZWlnaHQoKSkpKQorICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgaWYgKCFGY1BhdHRlcm5BZGREb3VibGUocGF0dGVybiwgRkNfUElYRUxfU0laRSwgZm9udERl
c2NyaXB0aW9uLmNvbXB1dGVkUGl4ZWxTaXplKCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBSZWZQdHI8RmNQYXR0ZXJuPiBjcmVhdGVGb250
Q29uZmlnUGF0dGVybkZvckNoYXJhY3RlcnMoY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVz
Y3JpcHRpb24sIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgYnVmZmVyTGVuZ3RoKQogewog
ICAgIFJlZlB0cjxGY1BhdHRlcm4+IHBhdHRlcm4gPSBhZG9wdFJlZihGY1BhdHRlcm5DcmVhdGUo
KSk7CiAgICAgRmNVbmlxdWVQdHI8RmNDaGFyU2V0PiBmb250Q29uZmlnQ2hhclNldChGY0NoYXJT
ZXRDcmVhdGUoKSk7CkBAIC02MSw2ICs5MywxMCBAQCBzdGF0aWMgUmVmUHRyPEZjUGF0dGVybj4g
Y3JlYXRlRm9udENvbmZpZ1BhdHRlcm5Gb3JDaGFyYWN0ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYQog
ICAgIEZjUGF0dGVybkFkZENoYXJTZXQocGF0dGVybi5nZXQoKSwgRkNfQ0hBUlNFVCwgZm9udENv
bmZpZ0NoYXJTZXQuZ2V0KCkpOwogCiAgICAgRmNQYXR0ZXJuQWRkQm9vbChwYXR0ZXJuLmdldCgp
LCBGQ19TQ0FMQUJMRSwgRmNUcnVlKTsKKworICAgIGlmICghY29uZmlndXJlUGF0dGVybkZvckZv
bnREZXNjcmlwdGlvbihwYXR0ZXJuLmdldCgpLCBmb250RGVzY3JpcHRpb24pKQorICAgICAgICBy
ZXR1cm4gbnVsbHB0cjsKKwogICAgIEZjQ29uZmlnU3Vic3RpdHV0ZShudWxscHRyLCBwYXR0ZXJu
LmdldCgpLCBGY01hdGNoUGF0dGVybik7CiAgICAgY2Fpcm9fZnRfZm9udF9vcHRpb25zX3N1YnN0
aXR1dGUoZ2V0RGVmYXVsdENhaXJvRm9udE9wdGlvbnMoKSwgcGF0dGVybi5nZXQoKSk7CiAgICAg
RmNEZWZhdWx0U3Vic3RpdHV0ZShwYXR0ZXJuLmdldCgpKTsKQEAgLTc0LDI2ICsxMTAsMjggQEAg
c3RhdGljIFJlZlB0cjxGY1BhdHRlcm4+IGZpbmRCZXN0Rm9udEdpdmVuRmFsbGJhY2tzKGNvbnN0
IEZvbnRQbGF0Zm9ybURhdGEmIGZvbnQKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKICAgICBG
Y1Jlc3VsdCBmb250Q29uZmlnUmVzdWx0OwotICAgIHJldHVybiBGY0ZvbnRTZXRNYXRjaChudWxs
cHRyLCAmZmFsbGJhY2tzLCAxLCBwYXR0ZXJuLCAmZm9udENvbmZpZ1Jlc3VsdCk7CisgICAgcmV0
dXJuIGFkb3B0UmVmKEZjRm9udFNldE1hdGNoKG51bGxwdHIsICZmYWxsYmFja3MsIDEsIHBhdHRl
cm4sICZmb250Q29uZmlnUmVzdWx0KSk7CiB9CiAKIFJlZlB0cjxGb250PiBGb250Q2FjaGU6OnN5
c3RlbUZhbGxiYWNrRm9yQ2hhcmFjdGVycyhjb25zdCBGb250RGVzY3JpcHRpb24mIGRlc2NyaXB0
aW9uLCBjb25zdCBGb250KiBvcmlnaW5hbEZvbnREYXRhLCBib29sLCBjb25zdCBVQ2hhciogY2hh
cmFjdGVycywgdW5zaWduZWQgbGVuZ3RoKQogewotICAgIFJlZlB0cjxGY1BhdHRlcm4+IHBhdHRl
cm4gPSBjcmVhdGVGb250Q29uZmlnUGF0dGVybkZvckNoYXJhY3RlcnMoY2hhcmFjdGVycywgbGVu
Z3RoKTsKLSAgICBjb25zdCBGb250UGxhdGZvcm1EYXRhJiBmb250RGF0YSA9IG9yaWdpbmFsRm9u
dERhdGEtPnBsYXRmb3JtRGF0YSgpOworICAgIFJlZlB0cjxGY1BhdHRlcm4+IHBhdHRlcm4gPSBj
cmVhdGVGb250Q29uZmlnUGF0dGVybkZvckNoYXJhY3RlcnMoZGVzY3JpcHRpb24sIGNoYXJhY3Rl
cnMsIGxlbmd0aCk7CisgICAgaWYgKCFwYXR0ZXJuKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsK
KwogCi0gICAgUmVmUHRyPEZjUGF0dGVybj4gZmFsbGJhY2tQYXR0ZXJuID0gZmluZEJlc3RGb250
R2l2ZW5GYWxsYmFja3MoZm9udERhdGEsIHBhdHRlcm4uZ2V0KCkpOwotICAgIGlmIChmYWxsYmFj
a1BhdHRlcm4pIHsKKyAgICBpZiAoUmVmUHRyPEZjUGF0dGVybj4gZmFsbGJhY2tQYXR0ZXJuID0g
ZmluZEJlc3RGb250R2l2ZW5GYWxsYmFja3Mob3JpZ2luYWxGb250RGF0YS0+cGxhdGZvcm1EYXRh
KCksIHBhdHRlcm4uZ2V0KCkpKSB7CiAgICAgICAgIEZvbnRQbGF0Zm9ybURhdGEgYWx0ZXJuYXRl
Rm9udERhdGEoZmFsbGJhY2tQYXR0ZXJuLmdldCgpLCBkZXNjcmlwdGlvbik7CiAgICAgICAgIHJl
dHVybiBmb250Rm9yUGxhdGZvcm1EYXRhKGFsdGVybmF0ZUZvbnREYXRhKTsKICAgICB9CiAKICAg
ICBGY1Jlc3VsdCBmb250Q29uZmlnUmVzdWx0OwotICAgIFJlZlB0cjxGY1BhdHRlcm4+IHJlc3Vs
dFBhdHRlcm4gPSBhZG9wdFJlZihGY0ZvbnRNYXRjaChudWxscHRyLCBwYXR0ZXJuLmdldCgpLCAm
Zm9udENvbmZpZ1Jlc3VsdCkpOwotICAgIGlmICghcmVzdWx0UGF0dGVybikKLSAgICAgICAgcmV0
dXJuIG51bGxwdHI7Ci0gICAgRm9udFBsYXRmb3JtRGF0YSBhbHRlcm5hdGVGb250RGF0YShyZXN1
bHRQYXR0ZXJuLmdldCgpLCBkZXNjcmlwdGlvbik7Ci0gICAgcmV0dXJuIGZvbnRGb3JQbGF0Zm9y
bURhdGEoYWx0ZXJuYXRlRm9udERhdGEpOworICAgIGlmIChSZWZQdHI8RmNQYXR0ZXJuPiByZXN1
bHRQYXR0ZXJuID0gYWRvcHRSZWYoRmNGb250TWF0Y2gobnVsbHB0ciwgcGF0dGVybi5nZXQoKSwg
JmZvbnRDb25maWdSZXN1bHQpKSkgeworICAgICAgICBGb250UGxhdGZvcm1EYXRhIGFsdGVybmF0
ZUZvbnREYXRhKHJlc3VsdFBhdHRlcm4uZ2V0KCksIGRlc2NyaXB0aW9uKTsKKyAgICAgICAgcmV0
dXJuIGZvbnRGb3JQbGF0Zm9ybURhdGEoYWx0ZXJuYXRlRm9udERhdGEpOworICAgIH0KKworICAg
IHJldHVybiBudWxscHRyOwogfQogCiBzdGF0aWMgVmVjdG9yPFN0cmluZz4gcGF0dGVyblRvRmFt
aWxpZXMoRmNQYXR0ZXJuJiBwYXR0ZXJuKQpAQCAtMTcwLDI3ICsyMDgsNiBAQCBzdGF0aWMgU3Ry
aW5nIGdldEZhbWlseU5hbWVTdHJpbmdGcm9tRmFtaWx5KGNvbnN0IEF0b21pY1N0cmluZyYgZmFt
aWx5KQogICAgIHJldHVybiAiIjsKIH0KIAotc3RhdGljIGludCBmb250V2VpZ2h0VG9Gb250Y29u
ZmlnV2VpZ2h0KEZvbnRTZWxlY3Rpb25WYWx1ZSB3ZWlnaHQpCi17Ci0gICAgaWYgKHdlaWdodCA8
IEZvbnRTZWxlY3Rpb25WYWx1ZSgxNTApKQotICAgICAgICByZXR1cm4gRkNfV0VJR0hUX1RISU47
Ci0gICAgaWYgKHdlaWdodCA8IEZvbnRTZWxlY3Rpb25WYWx1ZSgyNTApKQotICAgICAgICByZXR1
cm4gRkNfV0VJR0hUX1VMVFJBTElHSFQ7Ci0gICAgaWYgKHdlaWdodCA8IEZvbnRTZWxlY3Rpb25W
YWx1ZSgzNTApKQotICAgICAgICByZXR1cm4gRkNfV0VJR0hUX0xJR0hUOwotICAgIGlmICh3ZWln
aHQgPCBGb250U2VsZWN0aW9uVmFsdWUoNDUwKSkKLSAgICAgICAgcmV0dXJuIEZDX1dFSUdIVF9S
RUdVTEFSOwotICAgIGlmICh3ZWlnaHQgPCBGb250U2VsZWN0aW9uVmFsdWUoNTUwKSkKLSAgICAg
ICAgcmV0dXJuIEZDX1dFSUdIVF9NRURJVU07Ci0gICAgaWYgKHdlaWdodCA8IEZvbnRTZWxlY3Rp
b25WYWx1ZSg2NTApKQotICAgICAgICByZXR1cm4gRkNfV0VJR0hUX1NFTUlCT0xEOwotICAgIGlm
ICh3ZWlnaHQgPCBGb250U2VsZWN0aW9uVmFsdWUoNzUwKSkKLSAgICAgICAgcmV0dXJuIEZDX1dF
SUdIVF9CT0xEOwotICAgIGlmICh3ZWlnaHQgPCBGb250U2VsZWN0aW9uVmFsdWUoODUwKSkKLSAg
ICAgICAgcmV0dXJuIEZDX1dFSUdIVF9FWFRSQUJPTEQ7Ci0gICAgcmV0dXJuIEZDX1dFSUdIVF9V
TFRSQUJMQUNLOwotfQotCiAvLyBUaGlzIGlzIGJhc2VkIG9uIENocm9taXVtIEJTRCBjb2RlIGZy
b20gU2tpYSAoc3JjL3BvcnRzL1NrRm9udE1ncl9mb250Y29uZmlnLmNwcCkuIEl0IGlzIGEKIC8v
IGhhY2sgZm9yIGxhY2sgb2YgQVBJIGluIEZvbnRjb25maWc6IGh0dHBzOi8vYnVncy5mcmVlZGVz
a3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTE5Mzc1CiAvLyBGSVhNRTogVGhpcyBpcyBob3JyaWJs
ZS4gSXQgc2hvdWxkIGJlIGRlbGV0ZWQgb25jZSBGb250Y29uZmlnIGNhbiBkbyB0aGlzIGl0c2Vs
Zi4KQEAgLTM0NSwxMiArMzYyLDcgQEAgc3RkOjp1bmlxdWVfcHRyPEZvbnRQbGF0Zm9ybURhdGE+
IEZvbnRDYWNoZTo6Y3JlYXRlRm9udFBsYXRmb3JtRGF0YShjb25zdCBGb250RGUKICAgICBpZiAo
IUZjUGF0dGVybkFkZFN0cmluZyhwYXR0ZXJuLmdldCgpLCBGQ19GQU1JTFksIHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgRmNDaGFyOCo+KGZhbWlseU5hbWVTdHJpbmcudXRmOCgpLmRhdGEoKSkpKQog
ICAgICAgICByZXR1cm4gbnVsbHB0cjsKIAotICAgIGJvb2wgaXRhbGljID0gZm9udERlc2NyaXB0
aW9uLml0YWxpYygpOwotICAgIGlmICghRmNQYXR0ZXJuQWRkSW50ZWdlcihwYXR0ZXJuLmdldCgp
LCBGQ19TTEFOVCwgaXRhbGljID8gRkNfU0xBTlRfSVRBTElDIDogRkNfU0xBTlRfUk9NQU4pKQot
ICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICBpZiAoIUZjUGF0dGVybkFkZEludGVnZXIocGF0
dGVybi5nZXQoKSwgRkNfV0VJR0hULCBmb250V2VpZ2h0VG9Gb250Y29uZmlnV2VpZ2h0KGZvbnRE
ZXNjcmlwdGlvbi53ZWlnaHQoKSkpKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICBpZiAo
IUZjUGF0dGVybkFkZERvdWJsZShwYXR0ZXJuLmdldCgpLCBGQ19QSVhFTF9TSVpFLCBmb250RGVz
Y3JpcHRpb24uY29tcHV0ZWRQaXhlbFNpemUoKSkpCisgICAgaWYgKCFjb25maWd1cmVQYXR0ZXJu
Rm9yRm9udERlc2NyaXB0aW9uKHBhdHRlcm4uZ2V0KCksIGZvbnREZXNjcmlwdGlvbikpCiAgICAg
ICAgIHJldHVybiBudWxscHRyOwogCiAgICAgLy8gVGhlIHN0cmF0ZWd5IGlzIG9yaWdpbmFsbHkg
ZnJvbSBTa2lhIChzcmMvcG9ydHMvU2tGb250SG9zdF9mb250Y29uZmlnLmNwcCk6CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9mcmVldHlwZS9Gb250UGxhdGZv
cm1EYXRhRnJlZVR5cGUuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZnJl
ZXR5cGUvRm9udFBsYXRmb3JtRGF0YUZyZWVUeXBlLmNwcAppbmRleCBkMTIwZjQwMDBmZi4uOGE4
N2U3ZDMzNzMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Zy
ZWV0eXBlL0ZvbnRQbGF0Zm9ybURhdGFGcmVlVHlwZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvZnJlZXR5cGUvRm9udFBsYXRmb3JtRGF0YUZyZWVUeXBlLmNwcApA
QCAtMzA2LDExICszMDYsMTEgQEAgdm9pZCBGb250UGxhdGZvcm1EYXRhOjpidWlsZFNjYWxlZEZv
bnQoY2Fpcm9fZm9udF9mYWNlX3QqIGZvbnRGYWNlKQogICAgIC8vIFRoZXNlIG1hdHJpY2VzIG1h
eSBiZSBzdGFja2VkIGluIHRoZSBwYXR0ZXJuLCBzbyBpdCdzIG91ciBqb2IgdG8gZ2V0IHRoZW0g
YWxsIGFuZCBtdWx0aXBseSB0aGVtLgogICAgIGZvciAoaW50IGkgPSAwOyBGY1BhdHRlcm5HZXRN
YXRyaXgob3B0aW9uc1BhdHRlcm4sIEZDX01BVFJJWCwgaSwgJnRlbXBGb250Q29uZmlnTWF0cml4
KSA9PSBGY1Jlc3VsdE1hdGNoOyBpKyspCiAgICAgICAgIEZjTWF0cml4TXVsdGlwbHkoJmZvbnRD
b25maWdNYXRyaXgsICZmb250Q29uZmlnTWF0cml4LCB0ZW1wRm9udENvbmZpZ01hdHJpeCk7Ci0g
ICAgY2Fpcm9fbWF0cml4X2luaXQoJmZvbnRNYXRyaXgsIGZvbnRDb25maWdNYXRyaXgueHgsIC1m
b250Q29uZmlnTWF0cml4Lnl4LAotICAgICAgICAtZm9udENvbmZpZ01hdHJpeC54eSwgZm9udENv
bmZpZ01hdHJpeC55eSwgMCwgMCk7CisKKyAgICBjYWlyb19tYXRyaXhfaW5pdCgmZm9udE1hdHJp
eCwgMSwgLWZvbnRDb25maWdNYXRyaXgueXgsIC1mb250Q29uZmlnTWF0cml4Lnh5LCAxLCAwLCAw
KTsKIAogICAgIC8vIFRoZSBtYXRyaXggZnJvbSBGb250Q29uZmlnIGRvZXMgbm90IGluY2x1ZGUg
dGhlIHNjYWxlLiBTY2FsaW5nIGEgZm9udCB3aXRoIHdpZHRoIHplcm8gc2l6ZSBsZWFkcwotICAg
IC8vIHRvIGEgZmFpbGVkIGNhaXJvX3NjYWxlZF9mb250X3QgaW5zdGFudGlhdGlvbnMuIEluc3Rl
YWQgd2Ugc2NhbGUgd2Ugc2NhbGUgdGhlIGZvbnQgdG8gYSB2ZXJ5IHRpbnkKKyAgICAvLyB0byBh
IGZhaWxlZCBjYWlyb19zY2FsZWRfZm9udF90IGluc3RhbnRpYXRpb25zLiBJbnN0ZWFkIHdlIHNj
YWxlIHRoZSBmb250IHRvIGEgdmVyeSB0aW55CiAgICAgLy8gc2l6ZSBhbmQganVzdCBhYm9ydCBy
ZW5kZXJpbmcgbGF0ZXIgb24uCiAgICAgZmxvYXQgcmVhbFNpemUgPSBtX3NpemUgPyBtX3NpemUg
OiAxOwogICAgIGNhaXJvX21hdHJpeF9zY2FsZSgmZm9udE1hdHJpeCwgcmVhbFNpemUsIHJlYWxT
aXplKTsK
</data>
<flag name="review"
          id="353455"
          type_id="1"
          status="+"
          setter="mcatanzaro"
    />
          </attachment>
      

    </bug>

</bugzilla>