[webkit-reviews] review denied: [Bug 34347] MathML Support for mrow and Stretchy Operators : [Attachment 48392] Updated patch to latest trunk with anonymous blocks removed.

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Tue Mar 2 05:09:45 PST 2010


Kenneth Rohde Christiansen <kenneth at webkit.org> has denied Alex Milowski
<alex at milowski.com>'s request for review:
Bug 34347: MathML Support for mrow and Stretchy Operators
https://bugs.webkit.org/show_bug.cgi?id=34347

Attachment 48392: Updated patch to latest trunk with anonymous blocks removed.
https://bugs.webkit.org/attachment.cgi?id=48392&action=review

------- Additional Comments from Kenneth Rohde Christiansen
<kenneth at webkit.org>

> +    int index = -1;
> +    if (firstChar) {
> +	   for (index++; stretchy[index][0]; index++) {
> +	       if (stretchy[index][0] == firstChar)
> +		   break;
> +	   }
> +    }
> +    
> +    bool noStretch = false;
> +    if (mo) {
> +	   AtomicString stretchyAttr =
mo->getAttribute(MathMLNames::stretchyAttr);
> +	   noStretch = equalIgnoringCase(stretchyAttr, "false");
> +    }

So you are checking if we are allowed to stretch? If so, couldn't this be above
the other if (firstChar)?

> +    // either we have no characters, the stretch height is small, or we have
a non-stretchable character
> +    // If so, then we just set the font size and wrap the text
> +    bool canStretch = index >= 0 && stretchy[index][0];

You only need the above index if you are going to stretch. Couldn't you
separate out the code in a private method, isStretchable or so?

The below if cases are huge, so it would be good to have them separated out in
methods as well.

> +    if (noStretch || !firstChar || m_stretchHeight <= 24 || !canStretch) {
> +
> +	   m_isStacked = false;
> +	   RenderBlock* container = new (renderArena()) RenderBlock(node());
> +	   
> +	   RefPtr<RenderStyle> newStyle = RenderStyle::create();
> +	   newStyle->inheritFrom(style());
> +	   newStyle->setDisplay(BLOCK);
> +
> +	   int currentFontSize = style()->fontSize();
> +	   if (!noStretch && m_stretchHeight > 0 && m_stretchHeight <= 24  &&
m_stretchHeight > currentFontSize && canStretch) {

24?

> +	       FontDescription* desc = new FontDescription();
> +	       desc->setIsAbsoluteSize(true);
> +	       desc->setSpecifiedSize(m_stretchHeight);
> +	       desc->setComputedSize(m_stretchHeight);
> +	       newStyle->setFontDescription(*desc);
> +	       newStyle->font().update(newStyle->font().fontSelector());
> +	   }
> +	   
> +	   newStyle->setVerticalAlign(BASELINE);
> +	   container->setStyle(newStyle.release());
> +	   addChild(container);
> +	
> +	   RenderText* text = new (renderArena()) RenderText(node(), m_operator
? StringImpl::create(&m_operator, 1) : StringImpl::create(mo->textContent()));
> +	   text->setStyle(container->style());
> +	   container->addChild(text);
> +    
> +    } else {
> +	   // build stretchable characters
> +	   m_isStacked = true;
> +	   
> +	   if (stretchy[index][4]) {
> +	   
> +	       // we have a middle glyph (e.g. a curly bracket)
> +	       
> +	       int half = (m_stretchHeight - 10) / 2;

You use a lot of constants in the code around here. Where do they come from? I
see 10, -2 and -4 in many places.

> +	       if (half <= 10) {
> +		   // we only have enough space for the top & bottom glyph
> +		   makeGlyph(stretchy[index][1], half);
> +		   makeGlyph(stretchy[index][4], 10, -2);
> +		   makeGlyph(stretchy[index][3], 0, -4);
> +	       } else {
> +		   // we have to extend both the top and bottom to the middle
> +		   makeGlyph(stretchy[index][1], 10);
> +		   int remaining = half-10;

Missing spaces around -

> +		   while (remaining > 0) {
> +		       if (remaining < 10) {
> +			   makeGlyph(stretchy[index][2], remaining);
> +			   remaining = 0;
> +		       } else {
> +			   makeGlyph(stretchy[index][2], 10);
> +			   remaining -= 10;
> +		       }
> +		   }
> +		   
> +		   // The middle glyph
> +		   makeGlyph(stretchy[index][4], 10, -2);
> +		   
> +		   remaining = half-10;

same thing

> +		   // make sure we have the full height in case the height is
odd
> +		   if (m_stretchHeight % 2 == 1)
> +		       remaining++;
> +		       
> +		   while (remaining > 0) {
> +		       if (remaining < 10) {
> +			   makeGlyph(stretchy[index][2], remaining);
> +			   remaining = 0;
> +		       } else {
> +			   makeGlyph(stretchy[index][2], 10);
> +			   remaining -= 10;
> +		       }
> +		   }
> +		   makeGlyph(stretchy[index][3], 0, -4);

For these indices 2, 3 etc, would it make sense using an enum?

> +	       }
> +	   } else {
> +	   
> +	       // we do not have a middle glyph
> +	       

Excessive newlining above

> +	       int remaining = m_stretchHeight - 20;
> +	       makeGlyph(stretchy[index][1], 10);
> +	       while (remaining > 0) {
> +		   if (remaining < 10) {
> +		       makeGlyph(stretchy[index][2], remaining);
> +		       remaining = 0;
> +		   } else {
> +		       makeGlyph(stretchy[index][2], 10);
> +		       remaining -= 10;
> +		   }
> +	       }
> +	       makeGlyph(stretchy[index][3], 0, -4);
> +	   }
> +    }
> +	  
> +}
> +
> +RefPtr<RenderStyle> RenderMathMLOperator::makeStackableStyle(int size, int
topRelative)
> +{
> +    RefPtr<RenderStyle> newStyle = RenderStyle::create();
> +    newStyle->inheritFrom(style());
> +    newStyle->setDisplay(BLOCK);
> +
> +    // 14px is the size we'll use for all characters

ok, why?

> +    FontDescription* desc = new FontDescription();
> +    desc->setIsAbsoluteSize(true);
> +    desc->setSpecifiedSize(14);
> +    desc->setComputedSize(14);
> +    newStyle->setFontDescription(*desc);
> +    newStyle->font().update(newStyle->font().fontSelector());
> +    newStyle->setLineHeight(Length(12, Fixed));

and 12?


> +    virtual void layout();
> +    virtual RefPtr<RenderStyle> makeStackableStyle(int size, int
topRelative);

create* is more common for RefPtr in WebKit, I guess.


> +	   } else if (current->isBoxModelObject()) {
> +
> +	       RenderBoxModelObject* box = toRenderBoxModelObject(current);

excessive newlining

> +
> +	       // Check to see if this box has a larger height
> +	       if (box->offsetHeight() > maxHeight)
> +		   maxHeight = box->offsetHeight();
> +		   
> +	   }

Why a newline above?

> +	   
> +    }
> +    return maxHeight;
> +}
> +
> +
> +
> +void RenderMathMLRow::layout() 

3 newlines? :-)


> +	       if (!block->hasBase() && !block->isRenderMathMLOperator()) {
> +
> +		   // Check to see if this box has a larger height

Newline

> +		   if (block->offsetHeight() > maxHeight)
> +		       maxHeight = block->offsetHeight();
> +	       }
> +	       if (block->isRenderMathMLOperator())
> +		   if (block->offsetHeight() > operatorHeight)
> +		       operatorHeight = block->offsetHeight();
> +	   } else if (current->isBoxModelObject()) {
> +
> +	       RenderBoxModelObject* box = toRenderBoxModelObject(current);
> +
> +	       // Check to see if this box has a larger height

enwlines


More information about the webkit-reviews mailing list