зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1175789 Draw underline as overline when it's in vertical writing mode and the language is Japanese or Korean r=dbaron
This commit is contained in:
Родитель
9037f64bb7
Коммит
1b42eb60f1
|
@ -4805,6 +4805,18 @@ LazyGetLineBaselineOffset(nsIFrame* aChildFrame, nsBlockFrame* aBlockFrame)
|
|||
}
|
||||
}
|
||||
|
||||
static bool IsUnderlineRight(nsIFrame* aFrame)
|
||||
{
|
||||
nsIAtom* langAtom = aFrame->StyleFont()->mLanguage;
|
||||
if (!langAtom) {
|
||||
return false;
|
||||
}
|
||||
nsAtomString langStr(langAtom);
|
||||
return (StringBeginsWith(langStr, NS_LITERAL_STRING("ja")) ||
|
||||
StringBeginsWith(langStr, NS_LITERAL_STRING("ko"))) &&
|
||||
(langStr.Length() == 2 || langStr[2] == '-');
|
||||
}
|
||||
|
||||
void
|
||||
nsTextFrame::GetTextDecorations(
|
||||
nsPresContext* aPresContext,
|
||||
|
@ -4903,11 +4915,19 @@ nsTextFrame::GetTextDecorations(
|
|||
color = nsLayoutUtils::GetColor(f, eCSSProperty_text_decoration_color);
|
||||
}
|
||||
|
||||
if (textDecorations & NS_STYLE_TEXT_DECORATION_LINE_UNDERLINE) {
|
||||
bool swapUnderlineAndOverline = vertical && IsUnderlineRight(f);
|
||||
const uint8_t kUnderline =
|
||||
swapUnderlineAndOverline ? NS_STYLE_TEXT_DECORATION_LINE_OVERLINE :
|
||||
NS_STYLE_TEXT_DECORATION_LINE_UNDERLINE;
|
||||
const uint8_t kOverline =
|
||||
swapUnderlineAndOverline ? NS_STYLE_TEXT_DECORATION_LINE_UNDERLINE :
|
||||
NS_STYLE_TEXT_DECORATION_LINE_OVERLINE;
|
||||
|
||||
if (textDecorations & kUnderline) {
|
||||
aDecorations.mUnderlines.AppendElement(
|
||||
nsTextFrame::LineDecoration(f, baselineOffset, color, style));
|
||||
}
|
||||
if (textDecorations & NS_STYLE_TEXT_DECORATION_LINE_OVERLINE) {
|
||||
if (textDecorations & kOverline) {
|
||||
aDecorations.mOverlines.AppendElement(
|
||||
nsTextFrame::LineDecoration(f, baselineOffset, color, style));
|
||||
}
|
||||
|
@ -5261,7 +5281,7 @@ static void DrawSelectionDecorations(gfxContext* aContext,
|
|||
const gfxPoint& aPt, gfxFloat aICoordInFrame, gfxFloat aWidth,
|
||||
gfxFloat aAscent, const gfxFont::Metrics& aFontMetrics,
|
||||
nsTextFrame::DrawPathCallbacks* aCallbacks,
|
||||
bool aVertical)
|
||||
bool aVertical, uint8_t aDecoration)
|
||||
{
|
||||
gfxPoint pt(aPt);
|
||||
gfxSize size(aWidth,
|
||||
|
@ -5339,8 +5359,10 @@ static void DrawSelectionDecorations(gfxContext* aContext,
|
|||
size.height *= relativeSize;
|
||||
PaintDecorationLine(aFrame, aContext, aDirtyRect, color, nullptr, pt,
|
||||
(aVertical ? (pt.y - aPt.y) : (pt.x - aPt.x)) + aICoordInFrame,
|
||||
size, aAscent, aFontMetrics.underlineOffset,
|
||||
NS_STYLE_TEXT_DECORATION_LINE_UNDERLINE, style, eSelectionDecoration,
|
||||
size, aAscent,
|
||||
aDecoration == NS_STYLE_TEXT_DECORATION_LINE_UNDERLINE ?
|
||||
aFontMetrics.underlineOffset : aFontMetrics.maxAscent,
|
||||
aDecoration, style, eSelectionDecoration,
|
||||
aCallbacks, aVertical, descentLimit);
|
||||
}
|
||||
|
||||
|
@ -5805,6 +5827,10 @@ nsTextFrame::PaintTextSelectionDecorations(gfxContext* aCtx,
|
|||
|
||||
gfxFont* firstFont = aProvider.GetFontGroup()->GetFirstValidFont();
|
||||
bool verticalRun = mTextRun->IsVertical();
|
||||
bool rightUnderline = verticalRun && IsUnderlineRight(this);
|
||||
const uint8_t kDecoration =
|
||||
rightUnderline ? NS_STYLE_TEXT_DECORATION_LINE_OVERLINE :
|
||||
NS_STYLE_TEXT_DECORATION_LINE_UNDERLINE;
|
||||
bool useVerticalMetrics = verticalRun && mTextRun->UseCenterBaseline();
|
||||
gfxFont::Metrics
|
||||
decorationMetrics(firstFont->GetMetrics(useVerticalMetrics ?
|
||||
|
@ -5851,7 +5877,7 @@ nsTextFrame::PaintTextSelectionDecorations(gfxContext* aCtx,
|
|||
DrawSelectionDecorations(aCtx, dirtyRect, aSelectionType, this,
|
||||
aTextPaintStyle, selectedStyle, pt, xInFrame,
|
||||
width, mAscent / app, decorationMetrics,
|
||||
aCallbacks, verticalRun);
|
||||
aCallbacks, verticalRun, kDecoration);
|
||||
}
|
||||
iterator.UpdateWithAdvance(advance);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,91 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Bug 1175789 - underline and overline in various language</title>
|
||||
<style type="text/css">
|
||||
body {
|
||||
font-family: "Arial", "Helvetica", "sans-serif";
|
||||
}
|
||||
div {
|
||||
padding: .5em 1em;
|
||||
line-height: 2em;
|
||||
}
|
||||
.underline {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.overline {
|
||||
text-decoration: overline;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<dl>
|
||||
<dt>lang="en-US"</dt>
|
||||
<dd lang="en-US">
|
||||
<div style="writing-mode: vertical-rl;">
|
||||
<span class="underline">underline</span><br>
|
||||
<span class="overline">overline</span>
|
||||
</div>
|
||||
<div style="writing-mode: vertical-lr;">
|
||||
<span class="underline">underline</span><br>
|
||||
<span class="overline">overline</span>
|
||||
</div>
|
||||
</dd>
|
||||
<dt>lang="ja"</dt>
|
||||
<dd lang="en-US">
|
||||
<div style="writing-mode: vertical-rl;">
|
||||
<span class="overline">underline</span><br>
|
||||
<span class="underline">overline</span>
|
||||
</div>
|
||||
<div style="writing-mode: vertical-lr;">
|
||||
<span class="overline">underline</span><br>
|
||||
<span class="underline">overline</span>
|
||||
</div>
|
||||
</dd>
|
||||
<dt>lang="ko"</dt>
|
||||
<dd lang="en-US">
|
||||
<div style="writing-mode: vertical-rl;">
|
||||
<span class="overline">underline</span><br>
|
||||
<span class="underline">overline</span>
|
||||
</div>
|
||||
<div style="writing-mode: vertical-lr;">
|
||||
<span class="overline">underline</span><br>
|
||||
<span class="underline">overline</span>
|
||||
</div>
|
||||
</dd>
|
||||
<dt>lang="ja-JP"</dt>
|
||||
<dd lang="en-US">
|
||||
<div style="writing-mode: vertical-rl;">
|
||||
<span class="overline">underline</span><br>
|
||||
<span class="underline">overline</span>
|
||||
</div>
|
||||
<div style="writing-mode: vertical-lr;">
|
||||
<span class="overline">underline</span><br>
|
||||
<span class="underline">overline</span>
|
||||
</div>
|
||||
</dd>
|
||||
<dt>lang="ko-KR"</dt>
|
||||
<dd lang="en-US">
|
||||
<div style="writing-mode: vertical-rl;">
|
||||
<span class="overline">underline</span><br>
|
||||
<span class="underline">overline</span>
|
||||
</div>
|
||||
<div style="writing-mode: vertical-lr;">
|
||||
<span class="overline">underline</span><br>
|
||||
<span class="underline">overline</span>
|
||||
</div>
|
||||
</dd>
|
||||
<dt>lang="zh"</dt>
|
||||
<dd lang="en-US">
|
||||
<div style="writing-mode: vertical-rl;">
|
||||
<span class="underline">underline</span><br>
|
||||
<span class="overline">overline</span>
|
||||
</div>
|
||||
<div style="writing-mode: vertical-lr;">
|
||||
<span class="underline">underline</span><br>
|
||||
<span class="overline">overline</span>
|
||||
</div>
|
||||
</dd>
|
||||
</dl>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,91 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Bug 1175789 - underline and overline in various language</title>
|
||||
<style type="text/css">
|
||||
body {
|
||||
font-family: "Arial", "Helvetica", "sans-serif";
|
||||
}
|
||||
div {
|
||||
padding: .5em 1em;
|
||||
line-height: 2em;
|
||||
}
|
||||
.underline {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.overline {
|
||||
text-decoration: overline;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<dl>
|
||||
<dt>lang="en-US"</dt>
|
||||
<dd lang="en-US">
|
||||
<div style="writing-mode: vertical-rl;">
|
||||
<span class="underline">underline</span><br>
|
||||
<span class="overline">overline</span>
|
||||
</div>
|
||||
<div style="writing-mode: vertical-lr;">
|
||||
<span class="underline">underline</span><br>
|
||||
<span class="overline">overline</span>
|
||||
</div>
|
||||
</dd>
|
||||
<dt>lang="ja"</dt>
|
||||
<dd lang="ja">
|
||||
<div style="writing-mode: vertical-rl;">
|
||||
<span class="underline">underline</span><br>
|
||||
<span class="overline">overline</span>
|
||||
</div>
|
||||
<div style="writing-mode: vertical-lr;">
|
||||
<span class="underline">underline</span><br>
|
||||
<span class="overline">overline</span>
|
||||
</div>
|
||||
</dd>
|
||||
<dt>lang="ko"</dt>
|
||||
<dd lang="ko">
|
||||
<div style="writing-mode: vertical-rl;">
|
||||
<span class="underline">underline</span><br>
|
||||
<span class="overline">overline</span>
|
||||
</div>
|
||||
<div style="writing-mode: vertical-lr;">
|
||||
<span class="underline">underline</span><br>
|
||||
<span class="overline">overline</span>
|
||||
</div>
|
||||
</dd>
|
||||
<dt>lang="ja-JP"</dt>
|
||||
<dd lang="ja-JP">
|
||||
<div style="writing-mode: vertical-rl;">
|
||||
<span class="underline">underline</span><br>
|
||||
<span class="overline">overline</span>
|
||||
</div>
|
||||
<div style="writing-mode: vertical-lr;">
|
||||
<span class="underline">underline</span><br>
|
||||
<span class="overline">overline</span>
|
||||
</div>
|
||||
</dd>
|
||||
<dt>lang="ko-KR"</dt>
|
||||
<dd lang="ko-KR">
|
||||
<div style="writing-mode: vertical-rl;">
|
||||
<span class="underline">underline</span><br>
|
||||
<span class="overline">overline</span>
|
||||
</div>
|
||||
<div style="writing-mode: vertical-lr;">
|
||||
<span class="underline">underline</span><br>
|
||||
<span class="overline">overline</span>
|
||||
</div>
|
||||
</dd>
|
||||
<dt>lang="zh"</dt>
|
||||
<dd lang="zh">
|
||||
<div style="writing-mode: vertical-rl;">
|
||||
<span class="underline">underline</span><br>
|
||||
<span class="overline">overline</span>
|
||||
</div>
|
||||
<div style="writing-mode: vertical-lr;">
|
||||
<span class="underline">underline</span><br>
|
||||
<span class="overline">overline</span>
|
||||
</div>
|
||||
</dd>
|
||||
</dl>
|
||||
</body>
|
||||
</html>
|
|
@ -149,6 +149,7 @@ fails == 1147834-relative-overconstrained-vertical-rl-rtl.html 1147834-top-left-
|
|||
== 1172774-percent-padding-3.html 1172774-percent-vertical-ref.html
|
||||
== 1172774-percent-padding-4.html 1172774-percent-vertical-ref.html
|
||||
== 1174450-intrinsic-sizing.html 1174450-intrinsic-sizing-ref.html
|
||||
== 1175789-underline-overline-1.html 1175789-underline-overline-1-ref.html
|
||||
|
||||
# Suite of tests from Gérard Talbot in bug 1079151
|
||||
include abspos/reftest.list
|
||||
|
|
Загрузка…
Ссылка в новой задаче