[NOT PART OF THE DEFAULT BUILD] Compute the actual bounding metrics of the minus sign ('-') to get a more acurate math axis

This commit is contained in:
rbs%maths.uq.edu.au 2000-04-17 04:23:03 +00:00
Родитель 4731458891
Коммит 7467ba48c7
9 изменённых файлов: 123 добавлений и 56 удалений

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

@ -158,22 +158,20 @@ nsMathMLContainerFrame::GetRuleThickness(nsIRenderingContext& aRenderingContext,
{
// get the bounding metrics of the overbar char, the rendering context
// is assumed to have been set with the font of the current style context
nsBoundingMetrics bm;
nscoord xHeight;
aFontMetrics->GetXHeight(xHeight);
PRUnichar overBar = 0x00AF;
nsBoundingMetrics bm;
nsresult rv = aRenderingContext.GetBoundingMetrics(&overBar, PRUint32(1), bm);
if (NS_SUCCEEDED(rv)) {
aRuleThickness = bm.ascent + bm.descent;
}
else {
printf("GetBoundingMetrics() failed in GetRuleThickness()\n");
if (NS_FAILED(rv) || aRuleThickness <= 0 || aRuleThickness >= xHeight) {
// fall-back to the other version
GetRuleThickness(aFontMetrics, aRuleThickness);
}
#if 0
nscoord xHeight;
aRuleThickness->GetXHeight(xHeight);
nscoord oldRuleThickness;
GetRuleThickness(aFontMetrics, oldRuleThickness);
@ -186,6 +184,39 @@ nsMathMLContainerFrame::GetRuleThickness(nsIRenderingContext& aRenderingContext,
#endif
}
void
nsMathMLContainerFrame::GetAxisHeight(nsIRenderingContext& aRenderingContext,
nsIFontMetrics* aFontMetrics,
nscoord& aAxisHeight)
{
// get the bounding metrics of the minus sign, the rendering context
// is assumed to have been set with the font of the current style context
nscoord xHeight;
aFontMetrics->GetXHeight(xHeight);
PRUnichar minus = '-';
nsBoundingMetrics bm;
nsresult rv = aRenderingContext.GetBoundingMetrics(&minus, PRUint32(1), bm);
if (NS_SUCCEEDED(rv)) {
aAxisHeight = bm.ascent - (bm.ascent + bm.descent)/2;
}
if (NS_FAILED(rv) || aAxisHeight <= 0 || aAxisHeight >= xHeight) {
// fall-back to the other version
GetAxisHeight(aFontMetrics, aAxisHeight);
}
#if 0
nscoord oldAxis;
GetAxisHeight(aFontMetrics, oldAxis);
PRUnichar plus = '+';
rv = aRenderingContext.GetBoundingMetrics(&plus, PRUint32(1), bm);
nscoord plusAxis = bm.ascent - (bm.ascent + bm.descent)/2;;
printf("xheight:%4d Axis:%4d oldAxis:%4d plusAxis:%4d\n",
xHeight, aAxisHeight, oldAxis, plusAxis);
#endif
}
// ================
// Utilities for parsing and retrieving numeric values
// All returned values are in twips.

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

@ -441,14 +441,19 @@ public:
ruleThickness = NSToCoordRound (40.000f/430.556f * xHeight);
}
// the rule thickness is not accurately obtained using the x-height.
// Here is a slow GetRuleThickness() which obtains the rule
// thickness by actually measuring the overbar char U+00AF
// Some parameters are not accurately obtained using the x-height.
// Here are some slower variants to obtain the desired metrics
// by actually measuring some characters
static void
GetRuleThickness(nsIRenderingContext& aRenderingContext,
nsIFontMetrics* aFontMetrics,
nscoord& aRuleThickness);
static void
GetAxisHeight(nsIRenderingContext& aRenderingContext,
nsIFontMetrics* aFontMetrics,
nscoord& aAxisHeight);
protected:
// information about the presentation policy of the frame

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

@ -330,9 +330,10 @@ nsMathMLmfencedFrame::Reflow(nsIPresContext* aPresContext,
nsStyleFont font;
mStyleContext->GetStyle(eStyleStruct_Font, font);
nsCOMPtr<nsIFontMetrics> fm;
aPresContext->GetMetricsFor(font.mFont, getter_AddRefs(fm));
aReflowState.rendContext->SetFont(font.mFont);
aReflowState.rendContext->GetFontMetrics(*getter_AddRefs(fm));
nscoord axisHeight, em;
GetAxisHeight(fm, axisHeight);
GetAxisHeight(*aReflowState.rendContext, fm, axisHeight);
em = NSToCoordRound(float(font.mFont.size));
nscoord fontAscent, fontDescent;

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

@ -355,7 +355,8 @@ nsMathMLmfracFrame::Place(nsIPresContext* aPresContext,
}
else {
// Rule 15d, App. G, TeXbook
GetAxisHeight (fm, axisHeight);
// GetAxisHeight (fm, axisHeight);
GetAxisHeight(aRenderingContext, fm, axisHeight);
// min clearance between numerator or denominator and middle of bar

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

@ -131,9 +131,6 @@ nsMathMLmoFrame::Paint(nsIPresContext* aPresContext,
aRenderingContext.SetColor(NS_RGB(0,255,255));
nscoord x = mReference.x + mBoundingMetrics.leftBearing;
nscoord y = mReference.y - mBoundingMetrics.ascent;
//nsRect rect;
//mMathMLChar.GetRect(rect);
//y = rect.y;
nscoord w = mBoundingMetrics.rightBearing - mBoundingMetrics.leftBearing;
nscoord h = mBoundingMetrics.ascent + mBoundingMetrics.descent;
aRenderingContext.DrawRect(x,y,w,h);
@ -558,9 +555,10 @@ nsMathMLmoFrame::Stretch(nsIPresContext* aPresContext,
nsStyleFont font;
mStyleContext->GetStyle(eStyleStruct_Font, font);
nsCOMPtr<nsIFontMetrics> fm;
aPresContext->GetMetricsFor(font.mFont, getter_AddRefs(fm));
aRenderingContext.SetFont(font.mFont);
aRenderingContext.GetFontMetrics(*getter_AddRefs(fm));
nscoord fontAscent, fontDescent, axisHeight;
GetAxisHeight(fm, axisHeight);
GetAxisHeight(aRenderingContext, fm, axisHeight);
fm->GetMaxAscent(fontAscent);
fm->GetMaxDescent(fontDescent);

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

@ -45,11 +45,14 @@
// <msqrt> and <mroot> -- form a radical - implementation
//
//TODO:
// The code assumes that TeX fonts are picked! Another separate version of
// Reflow() is needed as a fall-back for cases where TeX fonts (CMSY/CMEX)
// are not installed on the system, e.g., the fall-back could explicitly
// draw the branches of the radical using th default rule thickness.
//NOTE:
// The code assumes that TeX fonts are picked.
// There is not fall-back to draw the branches of the sqrt explicitly
// in the case where TeX fonts are not there. In general, there is not
// fall-back(s) in MathML when some (freely-downloadable) fonts are missing.
// Otherwise, this will add much work and unnecessary complexity to the core
// MathML engine. Assuming that authors have the free fonts is part of the
// deal. We are not responsible for cases of misconfigurations out there.
// additional style context to be used by our MathMLChar.
#define NS_SQR_CHAR_STYLE_CONTEXT_INDEX 0
@ -109,20 +112,26 @@ nsMathMLmrootFrame::Paint(nsIPresContext* aPresContext,
{
nsresult rv = NS_OK;
/////////////
// paint the content we are square-rooting
rv = nsMathMLContainerFrame::Paint(aPresContext, aRenderingContext,
aDirtyRect, aWhichLayer);
/////////////
// paint the sqrt symbol
if ((NS_FRAME_PAINT_LAYER_FOREGROUND == aWhichLayer) &&
!NS_MATHML_HAS_ERROR(mPresentationData.flags))
if (!NS_MATHML_HAS_ERROR(mPresentationData.flags))
{
mSqrChar.Paint(aPresContext, aRenderingContext,
aDirtyRect, aWhichLayer, this);
// paint the overline bar
nsStyleColor color;
mStyleContext->GetStyle(eStyleStruct_Color, color);
aRenderingContext.SetColor(color.mColor);
aRenderingContext.FillRect(mBarRect.x, mBarRect.y,
mBarRect.width, mBarRect.height);
if (NS_FRAME_PAINT_LAYER_FOREGROUND == aWhichLayer)
{
// paint the overline bar
nsStyleColor color;
mStyleContext->GetStyle(eStyleStruct_Color, color);
aRenderingContext.SetColor(color.mColor);
aRenderingContext.FillRect(mBarRect.x, mBarRect.y,
mBarRect.width, mBarRect.height);
}
#if defined(NS_DEBUG) && defined(SHOW_BOUNDING_BOX)
// for visual debug
@ -144,10 +153,6 @@ nsMathMLmrootFrame::Paint(nsIPresContext* aPresContext,
#endif
}
/////////////
// paint the content we are square-rooting
rv = nsMathMLContainerFrame::Paint(aPresContext, aRenderingContext,
aDirtyRect, aWhichLayer);
return rv;
}

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

@ -45,11 +45,14 @@
// <msqrt> and <mroot> -- form a radical - implementation
//
//TODO:
// The code assumes that TeX fonts are picked! Another separate version of
// Reflow() is needed as a fall-back for cases where TeX fonts (CMSY/CMEX)
// are not installed on the system, e.g., the fall-back could explicitly
// draw the branches of the radical using th default rule thickness.
//NOTE:
// The code assumes that TeX fonts are picked.
// There is not fall-back to draw the branches of the sqrt explicitly
// in the case where TeX fonts are not there. In general, there is not
// fall-back(s) in MathML when some (freely-downloadable) fonts are missing.
// Otherwise, this will add much work and unnecessary complexity to the core
// MathML engine. Assuming that authors have the free fonts is part of the
// deal. We are not responsible for cases of misconfigurations out there.
// additional style context to be used by our MathMLChar.
#define NS_SQR_CHAR_STYLE_CONTEXT_INDEX 0
@ -90,7 +93,7 @@ nsMathMLmsqrtFrame::Init(nsIPresContext* aPresContext,
rv = nsMathMLContainerFrame::Init(aPresContext, aContent, aParent,
aContext, aPrevInFlow);
mEmbellishData.flags = NS_MATHML_STRETCH_ALL_CHILDREN_VERTICALLY;
mEmbellishData.flags |= NS_MATHML_STRETCH_ALL_CHILDREN_VERTICALLY;
mSqrChar.SetEnum(aPresContext, eMathMLChar_Sqrt);
ResolveMathMLCharStyle(aPresContext, mContent, mStyleContext, &mSqrChar);
@ -109,20 +112,26 @@ nsMathMLmsqrtFrame::Paint(nsIPresContext* aPresContext,
{
nsresult rv = NS_OK;
/////////////
// paint the content we are square-rooting
rv = nsMathMLContainerFrame::Paint(aPresContext, aRenderingContext,
aDirtyRect, aWhichLayer);
/////////////
// paint the sqrt symbol
if ((NS_FRAME_PAINT_LAYER_FOREGROUND == aWhichLayer) &&
!NS_MATHML_HAS_ERROR(mPresentationData.flags))
if (!NS_MATHML_HAS_ERROR(mPresentationData.flags))
{
mSqrChar.Paint(aPresContext, aRenderingContext,
aDirtyRect, aWhichLayer, this);
// paint the overline bar
nsStyleColor color;
mStyleContext->GetStyle(eStyleStruct_Color, color);
aRenderingContext.SetColor(color.mColor);
aRenderingContext.FillRect(mBarRect.x, mBarRect.y,
mBarRect.width, mBarRect.height);
if (NS_FRAME_PAINT_LAYER_FOREGROUND == aWhichLayer)
{
// paint the overline bar
nsStyleColor color;
mStyleContext->GetStyle(eStyleStruct_Color, color);
aRenderingContext.SetColor(color.mColor);
aRenderingContext.FillRect(mBarRect.x, mBarRect.y,
mBarRect.width, mBarRect.height);
}
#if defined(NS_DEBUG) && defined(SHOW_BOUNDING_BOX)
// for visual debug
@ -144,10 +153,6 @@ nsMathMLmsqrtFrame::Paint(nsIPresContext* aPresContext,
#endif
}
/////////////
// paint the content we are square-rooting
rv = nsMathMLContainerFrame::Paint(aPresContext, aRenderingContext,
aDirtyRect, aWhichLayer);
return rv;
}

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

@ -111,10 +111,11 @@ nsMathMLmtableOuterFrame::Reflow(nsIPresContext* aPresContext,
nsStyleFont font;
mStyleContext->GetStyle(eStyleStruct_Font, font);
nsCOMPtr<nsIFontMetrics> fm;
aPresContext->GetMetricsFor(font.mFont, getter_AddRefs(fm));
aReflowState.rendContext->SetFont(font.mFont);
aReflowState.rendContext->GetFontMetrics(*getter_AddRefs(fm));
nscoord axisHeight;
GetAxisHeight(fm, axisHeight);
GetAxisHeight(*aReflowState.rendContext, fm, axisHeight);
// center about the axis
aDesiredSize.ascent = aDesiredSize.height/2 + axisHeight;

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

@ -159,6 +159,26 @@ public:
axisHeight = NSToCoordRound (250.000f/430.556f * axisHeight);
}
static void
GetAxisHeight(nsIRenderingContext& aRenderingContext,
nsIFontMetrics* aFontMetrics,
nscoord& aAxisHeight)
{
// get the bounding metrics of the minus sign, the rendering context
// is assumed to have been set with the font of the current style context
nsBoundingMetrics bm;
PRUnichar minus = '-';
nsresult rv = aRenderingContext.GetBoundingMetrics(&minus, PRUint32(1), bm);
if (NS_SUCCEEDED(rv)) {
aAxisHeight = bm.ascent - (bm.ascent + bm.descent)/2;
}
if (NS_FAILED(rv) || aAxisHeight <= 0) {
// fall-back to the other version
GetAxisHeight(aFontMetrics, aAxisHeight);
}
}
protected:
nsMathMLmtableOuterFrame();
virtual ~nsMathMLmtableOuterFrame();