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:
Masayuki Nakano 2015-06-24 09:35:04 +09:00
Родитель 9037f64bb7
Коммит 1b42eb60f1
4 изменённых файлов: 215 добавлений и 6 удалений

Просмотреть файл

@ -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