Make computed style handle eStyleUnit_Chars. Bug 371043, r+sr=dbaron

This commit is contained in:
bzbarsky@mit.edu 2007-05-04 23:09:50 -07:00
parent 5a7814a82a
commit 64c3e5df8a
13 changed files with 98 additions and 37 deletions

View File

@ -1243,11 +1243,8 @@ static PRBool GetAbsoluteCoord(const nsStyleCoord& aStyle,
return PR_TRUE; return PR_TRUE;
} }
if (eStyleUnit_Chars == unit) { if (eStyleUnit_Chars == unit) {
SetFontFromStyle(aRenderingContext, aFrame->GetStyleContext()); aResult = nsLayoutUtils::CharsToCoord(aStyle, aRenderingContext,
nscoord fontWidth; aFrame->GetStyleContext());
aRenderingContext->SetTextRunRTL(PR_FALSE);
aRenderingContext->GetWidth('M', fontWidth);
aResult = aStyle.GetIntValue() * fontWidth;
return PR_TRUE; return PR_TRUE;
} }
return PR_FALSE; return PR_FALSE;
@ -2154,3 +2151,27 @@ nsLayoutUtils::DrawImage(nsIRenderingContext* aRenderingContext,
*/ */
#endif #endif
} }
void
nsLayoutUtils::SetFontFromStyle(nsIRenderingContext* aRC, nsStyleContext* aSC)
{
const nsStyleFont* font = aSC->GetStyleFont();
const nsStyleVisibility* visibility = aSC->GetStyleVisibility();
aRC->SetFont(font->mFont, visibility->mLangGroup);
}
nscoord
nsLayoutUtils::CharsToCoord(const nsStyleCoord& aStyle,
nsIRenderingContext* aRenderingContext,
nsStyleContext* aStyleContext)
{
NS_ASSERTION(aStyle.GetUnit() == eStyleUnit_Chars,
"Shouldn't have called this");
SetFontFromStyle(aRenderingContext, aStyleContext);
nscoord fontWidth;
aRenderingContext->SetTextRunRTL(PR_FALSE);
aRenderingContext->GetWidth('M', fontWidth);
return aStyle.GetIntValue() * fontWidth;
}

View File

@ -647,6 +647,22 @@ public:
const nsRect& aDestRect, const nsRect& aDestRect,
const nsRect& aDirtyRect, const nsRect& aDirtyRect,
const nsRect* aSourceRect = nsnull); const nsRect* aSourceRect = nsnull);
/**
* Set the font on aRC based on the style in aSC
*/
static void SetFontFromStyle(nsIRenderingContext* aRC, nsStyleContext* aSC);
/**
* Convert an eStyleUnit_Chars nsStyleCoord to an nscoord.
*
* @param aStyle the style coord
* @param aRenderingContext the rendering context to use for font measurement
* @param aStyleContext the style context to use for font infomation
*/
static nscoord CharsToCoord(const nsStyleCoord& aStyle,
nsIRenderingContext* aRenderingContext,
nsStyleContext* aStyleContext);
}; };
#endif // nsLayoutUtils_h__ #endif // nsLayoutUtils_h__

View File

@ -46,7 +46,7 @@
#include "nsGkAtoms.h" #include "nsGkAtoms.h"
#include "nsIFontMetrics.h" #include "nsIFontMetrics.h"
#include "nsIRenderingContext.h" #include "nsIRenderingContext.h"
#include "nsTextTransformer.h" #include "nsLayoutUtils.h"
#ifdef ACCESSIBILITY #ifdef ACCESSIBILITY
#include "nsIServiceManager.h" #include "nsIServiceManager.h"
@ -144,7 +144,7 @@ BRFrame::Reflow(nsPresContext* aPresContext,
// We also do this in strict mode because BR should act like a // We also do this in strict mode because BR should act like a
// normal inline frame. That line-height is used is important // normal inline frame. That line-height is used is important
// here for cases where the line-height is less that 1. // here for cases where the line-height is less that 1.
SetFontFromStyle(aReflowState.rendContext, mStyleContext); nsLayoutUtils::SetFontFromStyle(aReflowState.rendContext, mStyleContext);
nsCOMPtr<nsIFontMetrics> fm; nsCOMPtr<nsIFontMetrics> fm;
aReflowState.rendContext->GetFontMetrics(*getter_AddRefs(fm)); aReflowState.rendContext->GetFontMetrics(*getter_AddRefs(fm));
if (fm) { if (fm) {

View File

@ -437,15 +437,6 @@ nsresult NS_NewSelectionImageService(nsISelectionImageService** aResult)
//end selection service //end selection service
// a handy utility to set font
void SetFontFromStyle(nsIRenderingContext* aRC, nsStyleContext* aSC)
{
const nsStyleFont* font = aSC->GetStyleFont();
const nsStyleVisibility* visibility = aSC->GetStyleVisibility();
aRC->SetFont(font->mFont, visibility->mLangGroup);
}
void void
nsWeakFrame::Init(nsIFrame* aFrame) nsWeakFrame::Init(nsIFrame* aFrame)
{ {
@ -3059,11 +3050,8 @@ AddCoord(const nsStyleCoord& aStyle,
*aPercent += aStyle.GetPercentValue(); *aPercent += aStyle.GetPercentValue();
break; break;
case eStyleUnit_Chars: { case eStyleUnit_Chars: {
SetFontFromStyle(aRenderingContext, aFrame->GetStyleContext()); *aCoord += nsLayoutUtils::CharsToCoord(aStyle, aRenderingContext,
nscoord fontWidth; aFrame->GetStyleContext());
aRenderingContext->SetTextRunRTL(PR_FALSE);
aRenderingContext->GetWidth('M', fontWidth);
*aCoord += aStyle.GetIntValue() * fontWidth;
break; break;
} }
default: default:

View File

@ -113,10 +113,6 @@
#define NS_FRAME_TRACE_REFLOW_OUT(_method, _status) #define NS_FRAME_TRACE_REFLOW_OUT(_method, _status)
#endif #endif
// handy utilities
// XXXldb Move to nsLayoutUtils!
void SetFontFromStyle(nsIRenderingContext* aRC, nsStyleContext* aSC);
//---------------------------------------------------------------------- //----------------------------------------------------------------------
struct nsBoxLayoutMetrics; struct nsBoxLayoutMetrics;

View File

@ -941,7 +941,7 @@ nsImageFrame::DisplayAltText(nsPresContext* aPresContext,
{ {
// Set font and color // Set font and color
aRenderingContext.SetColor(GetStyleColor()->mColor); aRenderingContext.SetColor(GetStyleColor()->mColor);
SetFontFromStyle(&aRenderingContext, mStyleContext); nsLayoutUtils::SetFontFromStyle(&aRenderingContext, mStyleContext);
// Format the text to display within the formatting rect // Format the text to display within the formatting rect
nsIFontMetrics* fm; nsIFontMetrics* fm;

View File

@ -568,7 +568,7 @@ nsInlineFrame::ReflowFrames(nsPresContext* aPresContext,
: aReflowState.mComputedBorderPadding.left; : aReflowState.mComputedBorderPadding.left;
} }
SetFontFromStyle(aReflowState.rendContext, mStyleContext); nsLayoutUtils::SetFontFromStyle(aReflowState.rendContext, mStyleContext);
nsCOMPtr<nsIFontMetrics> fm; nsCOMPtr<nsIFontMetrics> fm;
aReflowState.rendContext->GetFontMetrics(*getter_AddRefs(fm)); aReflowState.rendContext->GetFontMetrics(*getter_AddRefs(fm));

View File

@ -1615,7 +1615,7 @@ nsLineLayout::VerticalAlignFrames(PerSpanData* psd)
// Get the parent frame's font for all of the frames in this span // Get the parent frame's font for all of the frames in this span
nsStyleContext* styleContext = spanFrame->GetStyleContext(); nsStyleContext* styleContext = spanFrame->GetStyleContext();
nsIRenderingContext* rc = mBlockReflowState->rendContext; nsIRenderingContext* rc = mBlockReflowState->rendContext;
SetFontFromStyle(mBlockReflowState->rendContext, styleContext); nsLayoutUtils::SetFontFromStyle(mBlockReflowState->rendContext, styleContext);
nsCOMPtr<nsIFontMetrics> fm; nsCOMPtr<nsIFontMetrics> fm;
rc->GetFontMetrics(*getter_AddRefs(fm)); rc->GetFontMetrics(*getter_AddRefs(fm));

View File

@ -893,7 +893,8 @@ nsTextStyle::nsTextStyle(nsPresContext* aPresContext,
PRUint8 originalDecorations = plainFont->decorations; PRUint8 originalDecorations = plainFont->decorations;
plainFont->decorations = NS_FONT_DECORATION_NONE; plainFont->decorations = NS_FONT_DECORATION_NONE;
mAveCharWidth = 0; mAveCharWidth = 0;
SetFontFromStyle(&aRenderingContext, sc); // some users of the struct expect this state // Set the font: some users of the struct expect this state
nsLayoutUtils::SetFontFromStyle(&aRenderingContext, sc);
aRenderingContext.GetFontMetrics(mNormalFont); aRenderingContext.GetFontMetrics(mNormalFont);
mNormalFont->GetSpaceWidth(mSpaceWidth); mNormalFont->GetSpaceWidth(mSpaceWidth);
mNormalFont->GetAveCharWidth(mAveCharWidth); mNormalFont->GetAveCharWidth(mAveCharWidth);
@ -2140,7 +2141,7 @@ nsTextFrame::FillClusterBuffer(nsPresContext *aPresContext, const PRUnichar *aTe
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
// Find the font metrics for this text // Find the font metrics for this text
SetFontFromStyle(acx, mStyleContext); nsLayoutUtils::SetFontFromStyle(acx, mStyleContext);
acx->GetHints(clusterHint); acx->GetHints(clusterHint);
clusterHint &= NS_RENDERING_HINT_TEXT_CLUSTERS; clusterHint &= NS_RENDERING_HINT_TEXT_CLUSTERS;
@ -4131,7 +4132,7 @@ nsTextFrame::GetPositionHelper(const nsPoint& aPoint,
} }
// Find the font metrics for this text // Find the font metrics for this text
SetFontFromStyle(rendContext, mStyleContext); nsLayoutUtils::SetFontFromStyle(rendContext, mStyleContext);
// Get the renderable form of the text // Get the renderable form of the text
nsTextTransformer tx(PresContext()); nsTextTransformer tx(PresContext());
@ -6173,7 +6174,7 @@ nsTextFrame::Reflow(nsPresContext* aPresContext,
#ifdef MOZ_MATHML #ifdef MOZ_MATHML
if (calcMathMLMetrics) { if (calcMathMLMetrics) {
SetFontFromStyle(aReflowState.rendContext, mStyleContext); nsLayoutUtils::SetFontFromStyle(aReflowState.rendContext, mStyleContext);
nsBoundingMetrics bm; nsBoundingMetrics bm;
rv = aReflowState.rendContext->GetBoundingMetrics(textBuffer.mBuffer, textLength, bm); rv = aReflowState.rendContext->GetBoundingMetrics(textBuffer.mBuffer, textLength, bm);
if (NS_SUCCEEDED(rv)) if (NS_SUCCEEDED(rv))
@ -6277,7 +6278,7 @@ nsTextFrame::TrimTrailingWhiteSpace(nsPresContext* aPresContext,
if (XP_IS_SPACE(ch)) { if (XP_IS_SPACE(ch)) {
// Get font metrics for a space so we can adjust the width by the // Get font metrics for a space so we can adjust the width by the
// right amount. // right amount.
SetFontFromStyle(&aRC, mStyleContext); nsLayoutUtils::SetFontFromStyle(&aRC, mStyleContext);
aRC.GetWidth(' ', dw); aRC.GetWidth(' ', dw);
// NOTE: Trailing whitespace includes word and letter spacing! // NOTE: Trailing whitespace includes word and letter spacing!

View File

@ -0,0 +1,9 @@
<!DOCTYPE html>
<body>
<div id="source" style="font-size: 10px; -moz-column-gap: 2ch">
<span id="test"
style="background: green; color: green; display: inline-block;
height: 30px; padding: 0 2px">MM
</span>
</div>
</body>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<body>
<div id="source" style="font-size: 10px; -moz-column-gap: 2ch">
<span id="test"
style="background: green; display: inline-block; height: 30px;
padding: 0 2px">
</span>
<script>
document.getElementById("test").style.width =
document.defaultView.getComputedStyle(document.getElementById("source"),
"").MozColumnGap;
</script>
</div>
</body>

View File

@ -210,6 +210,7 @@ fails == 368504-1.html 368504-1-ref.html # bug 368504
== 370629-2.html 370629-2-ref.html == 370629-2.html 370629-2-ref.html
== 370692-1.xhtml 370692-1-ref.xhtml == 370692-1.xhtml 370692-1-ref.xhtml
== 371041-1.html 371041-1-ref.html == 371041-1.html 371041-1-ref.html
== 371043-1.html 371043-1-ref.html
== 371925-1a.html 371925-1-ref.html == 371925-1a.html 371925-1-ref.html
== 371925-1b.html 371925-1-ref.html == 371925-1b.html 371925-1-ref.html
== 372553-1.html 372553-1-ref.html == 372553-1.html 372553-1-ref.html

View File

@ -68,6 +68,8 @@
#include "nsStyleSet.h" #include "nsStyleSet.h"
#include "imgIRequest.h" #include "imgIRequest.h"
#include "nsInspectorCSSUtils.h" #include "nsInspectorCSSUtils.h"
#include "nsLayoutUtils.h"
#include "nsFrameManager.h"
#if defined(DEBUG_bzbarsky) || defined(DEBUG_caillon) #if defined(DEBUG_bzbarsky) || defined(DEBUG_caillon)
#define DEBUG_ComputedDOMStyle #define DEBUG_ComputedDOMStyle
@ -2747,11 +2749,24 @@ nsComputedDOMStyle::SetValueToCoord(nsROCSSPrimitiveValue* aValue,
aTable)); aTable));
break; break;
case eStyleUnit_Chars: case eStyleUnit_Chars: {
// XXX we need a frame and a rendering context to calculate this, bug 281972, bug 282126. // Get a rendering context
aValue->SetAppUnits(0); nsCOMPtr<nsIRenderingContext> cx;
nsIFrame* frame = mPresShell->FrameManager()->GetRootFrame();
if (frame) {
mPresShell->CreateRenderingContext(frame, getter_AddRefs(cx));
}
if (cx) {
nscoord val =
nsLayoutUtils::CharsToCoord(aCoord, cx, mStyleContextHolder);
aValue->SetAppUnits(PR_MAX(aMinAppUnits, val));
} else {
// Oh, well. Give up.
aValue->SetAppUnits(0);
}
break; break;
}
case eStyleUnit_Null: case eStyleUnit_Null:
aValue->SetIdent(nsGkAtoms::none); aValue->SetIdent(nsGkAtoms::none);
break; break;