зеркало из https://github.com/mozilla/pjs.git
Support line-height property
This commit is contained in:
Родитель
a4b1c2a5f8
Коммит
bc145de122
|
@ -775,14 +775,30 @@ nsInlineReflow::VerticalAlignFrames(nsRect& aLineBox,
|
||||||
// Once we have finished the above abs(minYTop) represents the
|
// Once we have finished the above abs(minYTop) represents the
|
||||||
// maximum ascent of the line box.
|
// maximum ascent of the line box.
|
||||||
|
|
||||||
// XXX what about positive minY?
|
// CSS2 spec section 10.8: the line box height is the distance
|
||||||
|
// between the uppermost box top (minYTop) and the lowermost box
|
||||||
|
// bottom (maxYBottom).
|
||||||
nscoord lineHeight = maxYBottom - minYTop;
|
nscoord lineHeight = maxYBottom - minYTop;
|
||||||
if (lineHeight < maxHeight) {
|
if (lineHeight < maxHeight) {
|
||||||
// This ensures that any object aligned top/bottom will update the
|
// This ensures that any object aligned top/bottom will update the
|
||||||
// line height properly since they don't impact the minY or
|
// line height properly since they don't impact the minY or
|
||||||
// maxYBottom values.
|
// maxYBottom values computed above.
|
||||||
lineHeight = maxHeight;
|
lineHeight = maxHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nscoord topEdge = mTopEdge;
|
||||||
|
if (0 != lineHeight) {
|
||||||
|
nscoord newLineHeight = CalcLineHeightFor(mPresContext, mOuterFrame,
|
||||||
|
lineHeight);
|
||||||
|
// If the newLineHeight is larger then just use; otherwise if the
|
||||||
|
// outer frame is an inline frame then use it as well (line-height
|
||||||
|
// on block frames specify the minimal height while on inline
|
||||||
|
// frames it specifies the precise height).
|
||||||
|
if ((newLineHeight > lineHeight) || !mOuterIsBlock) {
|
||||||
|
topEdge += (newLineHeight - lineHeight) / 2;
|
||||||
|
lineHeight = newLineHeight;
|
||||||
|
}
|
||||||
|
}
|
||||||
aLineBox.height = lineHeight;
|
aLineBox.height = lineHeight;
|
||||||
nscoord maxAscent = -minYTop;
|
nscoord maxAscent = -minYTop;
|
||||||
|
|
||||||
|
@ -797,19 +813,19 @@ nsInlineReflow::VerticalAlignFrames(nsRect& aLineBox,
|
||||||
switch (verticalAlignEnum) {
|
switch (verticalAlignEnum) {
|
||||||
case NS_STYLE_VERTICAL_ALIGN_TOP:
|
case NS_STYLE_VERTICAL_ALIGN_TOP:
|
||||||
// XXX negative top margins on these will do weird things, maybe?
|
// XXX negative top margins on these will do weird things, maybe?
|
||||||
pfd->mBounds.y = mTopEdge + pfd->mMargin.top;
|
pfd->mBounds.y = topEdge + pfd->mMargin.top;
|
||||||
break;
|
break;
|
||||||
case NS_STYLE_VERTICAL_ALIGN_BOTTOM:
|
case NS_STYLE_VERTICAL_ALIGN_BOTTOM:
|
||||||
pfd->mBounds.y = mTopEdge + lineHeight - pfd->mBounds.height;
|
pfd->mBounds.y = topEdge + lineHeight - pfd->mBounds.height;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
pfd->mBounds.y = mTopEdge + maxAscent + pfd->mBounds.y -
|
pfd->mBounds.y = topEdge + maxAscent + pfd->mBounds.y -
|
||||||
pfd->mMargin.top;
|
pfd->mMargin.top;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
pfd->mBounds.y = mTopEdge + maxAscent + pfd->mBounds.y -
|
pfd->mBounds.y = topEdge + maxAscent + pfd->mBounds.y -
|
||||||
pfd->mMargin.top;
|
pfd->mMargin.top;
|
||||||
}
|
}
|
||||||
frame->SetRect(pfd->mBounds);
|
frame->SetRect(pfd->mBounds);
|
||||||
|
@ -817,7 +833,6 @@ nsInlineReflow::VerticalAlignFrames(nsRect& aLineBox,
|
||||||
aMaxAscent = maxAscent;
|
aMaxAscent = maxAscent;
|
||||||
aMaxDescent = lineHeight - maxAscent;
|
aMaxDescent = lineHeight - maxAscent;
|
||||||
|
|
||||||
// XXX Now we can apply 1/2 the line-height...
|
|
||||||
NS_RELEASE(fm);
|
NS_RELEASE(fm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -901,3 +916,76 @@ nsInlineReflow::RelativePositionFrames()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// XXX performance todo: this computation can be cached in the
|
||||||
|
// style-context
|
||||||
|
nscoord
|
||||||
|
nsInlineReflow::CalcLineHeightFor(nsIPresContext& aPresContext,
|
||||||
|
nsIFrame* aFrame,
|
||||||
|
nscoord aBaseLineHeight)
|
||||||
|
{
|
||||||
|
nscoord lineHeight = aBaseLineHeight;
|
||||||
|
|
||||||
|
nsIStyleContext* sc;
|
||||||
|
aFrame->GetStyleContext(&aPresContext, sc);
|
||||||
|
const nsStyleFont* elementFont = nsnull;
|
||||||
|
if (nsnull != sc) {
|
||||||
|
elementFont = (const nsStyleFont*)sc->GetStyleData(eStyleStruct_Font);
|
||||||
|
for (;;) {
|
||||||
|
const nsStyleText* text = (const nsStyleText*)
|
||||||
|
sc->GetStyleData(eStyleStruct_Text);
|
||||||
|
if (nsnull != text) {
|
||||||
|
nsStyleUnit unit = text->mLineHeight.GetUnit();
|
||||||
|
if (eStyleUnit_Enumerated == unit) {
|
||||||
|
// Normal value; we use 1.0 for normal
|
||||||
|
// XXX could come from somewhere else
|
||||||
|
break;
|
||||||
|
} else if (eStyleUnit_Factor == unit) {
|
||||||
|
if (nsnull != elementFont) {
|
||||||
|
// CSS2 spec says that the number is inherited, not the
|
||||||
|
// computed value. Therefore use the font size of the
|
||||||
|
// element times the inherited number.
|
||||||
|
nscoord size = elementFont->mFont.size;
|
||||||
|
lineHeight = nscoord(size * text->mLineHeight.GetFactorValue());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (eStyleUnit_Coord == unit) {
|
||||||
|
lineHeight = text->mLineHeight.GetCoordValue();
|
||||||
|
// CSS2 spec 10.8.1: negative length values are illegal.
|
||||||
|
if (lineHeight < 0) {
|
||||||
|
lineHeight = aBaseLineHeight;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (eStyleUnit_Percent == unit) {
|
||||||
|
// XXX This could arguably be the font-metrics actual height
|
||||||
|
// instead since the spec says use the computed height.
|
||||||
|
const nsStyleFont* font = (const nsStyleFont*)
|
||||||
|
sc->GetStyleData(eStyleStruct_Font);
|
||||||
|
nscoord size = font->mFont.size;
|
||||||
|
lineHeight = nscoord(size * text->mLineHeight.GetPercentValue());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (eStyleUnit_Inherit == unit) {
|
||||||
|
nsIStyleContext* parentSC;
|
||||||
|
parentSC = sc->GetParent();
|
||||||
|
if (nsnull == parentSC) {
|
||||||
|
// Note: Break before releasing to avoid double-releasing sc
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
NS_RELEASE(sc);
|
||||||
|
sc = parentSC;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// other units are not part of the spec so don't bother
|
||||||
|
// looping
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NS_RELEASE(sc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return lineHeight;
|
||||||
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче