Modified: trunk/Source/WebCore/platform/graphics/Font.cpp (239914 => 239915)
--- trunk/Source/WebCore/platform/graphics/Font.cpp 2019-01-14 05:55:02 UTC (rev 239914)
+++ trunk/Source/WebCore/platform/graphics/Font.cpp 2019-01-14 07:59:00 UTC (rev 239915)
@@ -263,6 +263,50 @@
return result;
}
+#if !USE(FREETYPE)
+static void overrideControlCharacters(Vector<UChar>& buffer, unsigned start, unsigned end)
+{
+ auto overwriteCodePoints = [&](unsigned minimum, unsigned maximum, UChar newCodePoint) {
+ unsigned begin = std::max(start, minimum);
+ unsigned complete = std::min(end, maximum);
+ for (unsigned i = begin; i < complete; ++i) {
+ ASSERT(codePointSupportIndex(i));
+ buffer[i - start] = newCodePoint;
+ }
+ };
+
+ auto overwriteCodePoint = [&](UChar codePoint, UChar newCodePoint) {
+ ASSERT(codePointSupportIndex(codePoint));
+ if (codePoint >= start && codePoint < end)
+ buffer[codePoint - start] = newCodePoint;
+ };
+
+ // Code points 0x0 - 0x20 and 0x7F - 0xA0 are control character and shouldn't render. Map them to ZERO WIDTH SPACE.
+ overwriteCodePoints(0x0, 0x20, zeroWidthSpace);
+ overwriteCodePoints(0x7F, 0xA0, zeroWidthSpace);
+ overwriteCodePoint(softHyphen, zeroWidthSpace);
+ overwriteCodePoint('\n', space);
+ overwriteCodePoint('\t', space);
+ overwriteCodePoint(noBreakSpace, space);
+ overwriteCodePoint(narrowNoBreakSpace, zeroWidthSpace);
+ overwriteCodePoint(leftToRightMark, zeroWidthSpace);
+ overwriteCodePoint(rightToLeftMark, zeroWidthSpace);
+ overwriteCodePoint(leftToRightEmbed, zeroWidthSpace);
+ overwriteCodePoint(rightToLeftEmbed, zeroWidthSpace);
+ overwriteCodePoint(leftToRightOverride, zeroWidthSpace);
+ overwriteCodePoint(rightToLeftOverride, zeroWidthSpace);
+ overwriteCodePoint(leftToRightIsolate, zeroWidthSpace);
+ overwriteCodePoint(rightToLeftIsolate, zeroWidthSpace);
+ overwriteCodePoint(zeroWidthNonJoiner, zeroWidthSpace);
+ overwriteCodePoint(zeroWidthJoiner, zeroWidthSpace);
+ overwriteCodePoint(popDirectionalFormatting, zeroWidthSpace);
+ overwriteCodePoint(popDirectionalIsolate, zeroWidthSpace);
+ overwriteCodePoint(firstStrongIsolate, zeroWidthSpace);
+ overwriteCodePoint(objectReplacementCharacter, zeroWidthSpace);
+ overwriteCodePoint(zeroWidthNoBreakSpace, zeroWidthSpace);
+}
+#endif
+
static RefPtr<GlyphPage> createAndFillGlyphPage(unsigned pageNumber, const Font& font)
{
#if PLATFORM(IOS_FAMILY)
@@ -276,7 +320,6 @@
unsigned glyphPageSize = GlyphPage::sizeForPageNumber(pageNumber);
unsigned start = GlyphPage::startingCodePointInPageNumber(pageNumber);
- unsigned end = start + glyphPageSize;
Vector<UChar> buffer(glyphPageSize * 2 + 2);
unsigned bufferLength;
// Fill in a buffer with the entire "page" of characters that we want to look up glyphs for.
@@ -285,44 +328,9 @@
for (unsigned i = 0; i < bufferLength; i++)
buffer[i] = start + i;
- // Code points 0x0 - 0x20 and 0x7F - 0xA0 are control character and shouldn't render. Map them to ZERO WIDTH SPACE.
- auto overwriteCodePoints = [&](unsigned minimum, unsigned maximum, UChar newCodePoint) {
- unsigned begin = std::max(start, minimum);
- unsigned complete = std::min(end, maximum);
- for (unsigned i = begin; i < complete; ++i) {
- ASSERT(codePointSupportIndex(i));
- buffer[i - start] = newCodePoint;
- }
- };
-
- auto overwriteCodePoint = [&](UChar codePoint, UChar newCodePoint) {
- ASSERT(codePointSupportIndex(codePoint));
- if (codePoint >= start && codePoint < end)
- buffer[codePoint - start] = newCodePoint;
- };
-
- overwriteCodePoints(0x0, 0x20, zeroWidthSpace);
- overwriteCodePoints(0x7F, 0xA0, zeroWidthSpace);
- overwriteCodePoint(softHyphen, zeroWidthSpace);
- overwriteCodePoint('\n', space);
- overwriteCodePoint('\t', space);
- overwriteCodePoint(noBreakSpace, space);
- overwriteCodePoint(narrowNoBreakSpace, zeroWidthSpace);
- overwriteCodePoint(leftToRightMark, zeroWidthSpace);
- overwriteCodePoint(rightToLeftMark, zeroWidthSpace);
- overwriteCodePoint(leftToRightEmbed, zeroWidthSpace);
- overwriteCodePoint(rightToLeftEmbed, zeroWidthSpace);
- overwriteCodePoint(leftToRightOverride, zeroWidthSpace);
- overwriteCodePoint(rightToLeftOverride, zeroWidthSpace);
- overwriteCodePoint(leftToRightIsolate, zeroWidthSpace);
- overwriteCodePoint(rightToLeftIsolate, zeroWidthSpace);
- overwriteCodePoint(zeroWidthNonJoiner, zeroWidthSpace);
- overwriteCodePoint(zeroWidthJoiner, zeroWidthSpace);
- overwriteCodePoint(popDirectionalFormatting, zeroWidthSpace);
- overwriteCodePoint(popDirectionalIsolate, zeroWidthSpace);
- overwriteCodePoint(firstStrongIsolate, zeroWidthSpace);
- overwriteCodePoint(objectReplacementCharacter, zeroWidthSpace);
- overwriteCodePoint(zeroWidthNoBreakSpace, zeroWidthSpace);
+#if !USE(FREETYPE)
+ overrideControlCharacters(buffer, start, start + glyphPageSize);
+#endif
} else {
bufferLength = glyphPageSize * 2;
for (unsigned i = 0; i < glyphPageSize; i++) {
Modified: trunk/Source/WebCore/platform/graphics/freetype/GlyphPageTreeNodeFreeType.cpp (239914 => 239915)
--- trunk/Source/WebCore/platform/graphics/freetype/GlyphPageTreeNodeFreeType.cpp 2019-01-14 05:55:02 UTC (rev 239914)
+++ trunk/Source/WebCore/platform/graphics/freetype/GlyphPageTreeNodeFreeType.cpp 2019-01-14 07:59:00 UTC (rev 239915)
@@ -33,6 +33,7 @@
#include "CairoUtilities.h"
#include "Font.h"
+#include "FontCascade.h"
#include "UTF16UChar32Iterator.h"
#include <cairo-ft.h>
#include <cairo.h>
@@ -58,7 +59,11 @@
if (character == iterator.end())
break;
- Glyph glyph = FcFreeTypeCharIndex(face, character);
+ Glyph glyph = FcFreeTypeCharIndex(face, FontCascade::treatAsSpace(character) ? space : character);
+ // If the font doesn't support a Default_Ignorable character, replace it with zero with space.
+ if (!glyph && u_hasBinaryProperty(character, UCHAR_DEFAULT_IGNORABLE_CODE_POINT))
+ glyph = FcFreeTypeCharIndex(face, zeroWidthSpace);
+
if (!glyph)
setGlyphForIndex(i, 0);
else {