зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1273154 - Re-land followup to handle word-initial NNBSP shaping in Mongolian, with its reftest. r=jrmuizel
This commit is contained in:
Родитель
d63df96367
Коммит
1233cee71f
|
@ -2637,17 +2637,37 @@ gfxFontGroup::FindFontForChar(uint32_t aCh, uint32_t aPrevCh, uint32_t aNextCh,
|
||||||
Script aRunScript, gfxFont *aPrevMatchedFont,
|
Script aRunScript, gfxFont *aPrevMatchedFont,
|
||||||
uint8_t *aMatchType)
|
uint8_t *aMatchType)
|
||||||
{
|
{
|
||||||
// If the char is a cluster extender or NNBSP, we want to use the same
|
// If the char is a cluster extender, we want to use the same font as the
|
||||||
// font as the preceding character if possible. This is preferable to using
|
// preceding character if possible. This is preferable to using the font
|
||||||
// the font group because it avoids breaks in shaping within a cluster.
|
// group because it avoids breaks in shaping within a cluster.
|
||||||
const uint32_t NARROW_NO_BREAK_SPACE = 0x202f;
|
if (aPrevMatchedFont && IsClusterExtender(aCh) &&
|
||||||
if (aPrevMatchedFont &&
|
|
||||||
(IsClusterExtender(aCh) || aCh == NARROW_NO_BREAK_SPACE) &&
|
|
||||||
aPrevMatchedFont->HasCharacter(aCh)) {
|
aPrevMatchedFont->HasCharacter(aCh)) {
|
||||||
RefPtr<gfxFont> ret = aPrevMatchedFont;
|
RefPtr<gfxFont> ret = aPrevMatchedFont;
|
||||||
return ret.forget();
|
return ret.forget();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Special cases for NNBSP (as used in Mongolian):
|
||||||
|
const uint32_t NARROW_NO_BREAK_SPACE = 0x202f;
|
||||||
|
if (aCh == NARROW_NO_BREAK_SPACE) {
|
||||||
|
// If there is no preceding character, try the font that we'd use
|
||||||
|
// for the next char (unless it's just another NNBSP; we don't try
|
||||||
|
// to look ahead through a whole run of them).
|
||||||
|
if (!aPrevCh && aNextCh && aNextCh != NARROW_NO_BREAK_SPACE) {
|
||||||
|
RefPtr<gfxFont> nextFont =
|
||||||
|
FindFontForChar(aNextCh, 0, 0, aRunScript, aPrevMatchedFont,
|
||||||
|
aMatchType);
|
||||||
|
if (nextFont && nextFont->HasCharacter(aCh)) {
|
||||||
|
return nextFont.forget();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Otherwise, treat NNBSP like a cluster extender (as above) and try
|
||||||
|
// to continue the preceding font run.
|
||||||
|
if (aPrevMatchedFont && aPrevMatchedFont->HasCharacter(aCh)) {
|
||||||
|
RefPtr<gfxFont> ret = aPrevMatchedFont;
|
||||||
|
return ret.forget();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// To optimize common cases, try the first font in the font-group
|
// To optimize common cases, try the first font in the font-group
|
||||||
// before going into the more detailed checks below
|
// before going into the more detailed checks below
|
||||||
uint32_t nextIndex = 0;
|
uint32_t nextIndex = 0;
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
/* Force a large line-height so that we don't get a positioning
|
||||||
|
discrepancy on the test span depending on which font's metrics
|
||||||
|
are used in line-height computation. */
|
||||||
|
font: 64px/2 serif;
|
||||||
|
}
|
||||||
|
span {
|
||||||
|
font-family: "Mongolian Baiti", "Times New Roman", serif;
|
||||||
|
font-size: 32px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<span> ᠤᠨ</span>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,23 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
/* Force a large line-height so that we don't get a positioning
|
||||||
|
discrepancy on the test span depending on which font's metrics
|
||||||
|
are used in line-height computation. */
|
||||||
|
font: 64px/2 serif;
|
||||||
|
}
|
||||||
|
span {
|
||||||
|
/* Times does NOT support Mongolian characters, so the entire text
|
||||||
|
should be rendered as a single Mongolian Baiti run, including
|
||||||
|
the initial U+202F, even though it _is_ available in Times. */
|
||||||
|
font-family: "Times New Roman", "Mongolian Baiti", serif;
|
||||||
|
font-size: 32px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<span> ᠤᠨ</span>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -1954,4 +1954,5 @@ fuzzy(100,2000) == 1239564.html 1239564-ref.html
|
||||||
== 1260543-1.html 1260543-1-ref.html
|
== 1260543-1.html 1260543-1-ref.html
|
||||||
== 1272997-1.html 1272997-1-ref.html
|
== 1272997-1.html 1272997-1-ref.html
|
||||||
random-if(!winWidget) == 1273154-1.html 1273154-1-ref.html # depends on Windows font
|
random-if(!winWidget) == 1273154-1.html 1273154-1-ref.html # depends on Windows font
|
||||||
|
random-if(!winWidget) == 1273154-2.html 1273154-2-ref.html # depends on Windows font
|
||||||
== 1274368-1.html 1274368-1-ref.html
|
== 1274368-1.html 1274368-1-ref.html
|
||||||
|
|
Загрузка…
Ссылка в новой задаче