Use Fraction* parameters from the OpenType MATH table
authorfred.wang@free.fr <fred.wang@free.fr@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 8 Jul 2016 15:30:50 +0000 (15:30 +0000)
committerfred.wang@free.fr <fred.wang@free.fr@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 8 Jul 2016 15:30:50 +0000 (15:30 +0000)
https://bugs.webkit.org/show_bug.cgi?id=155639

Source/WebCore:

Patch by Frederic Wang <fwang@igalia.com> on 2016-03-20
Reviewed by Brent Fulgham.

We improve the RenderMathMLFraction so minimal vertical shifts and gaps
from the MATH table (or arbitrary fallback) are used for fractions.
We also change the interpretation of "thick" and "thin" linethickness values
to match Gecko's behavior and the one suggested in the MathML in HTML5 implementation note.

Test: imported/mathml-in-html5/mathml/presentation-markup/fractions/frac-parameters-1.html

* rendering/mathml/MathMLStyle.cpp:
(WebCore::MathMLStyle::updateStyleIfNeeded): set NeedsLayout after displaystyle change
so that dynamic MathML tests still work.
* rendering/mathml/RenderMathMLFraction.cpp:
(WebCore::RenderMathMLFraction::RenderMathMLFraction): Init LayoutUnit members to zero.
(WebCore::RenderMathMLFraction::updateFromElement):
Set new members for fraction gaps and shifts using Fraction* constants or some fallback
values. Change the interpretation of "thick" and "thin".
(WebCore::RenderMathMLFraction::layoutBlock): Use new constants affecting vertical
positions of numerator and denominator.
(WebCore::RenderMathMLFraction::paint): Use m_ascent to set the vertical position
of the fraction bar.
(WebCore::RenderMathMLFraction::firstLineBaseline): We just return m_ascent.
* rendering/mathml/RenderMathMLFraction.h: Make updateFromElement public so that
it can be used in MathMLStyle. Add LayoutUnit members for the ascent of the fraction
and for minimal shifts/gaps values.

LayoutTests:

Patch by Frederic Wang <fwang@igalia.com> on 2016-07-08
Reviewed by Brent Fulgham.

We import a test from the MathML in HTML5 test suite to verify Fraction* parameters.
We also do some small test adjustments.

* TestExpectations: We disable fractions-positions.html for now until it is replaced with a more reliable test.
* imported/mathml-in-html5/fonts/math/fraction-axisheight7000-rulethickness1000.woff: Added.
* imported/mathml-in-html5/fonts/math/fraction-denominatordisplaystylegapmin5000-rulethickness1000.woff: Added.
* imported/mathml-in-html5/fonts/math/fraction-denominatordisplaystyleshiftdown6000-rulethickness1000.woff: Added.
* imported/mathml-in-html5/fonts/math/fraction-denominatorgapmin4000-rulethickness1000.woff: Added.
* imported/mathml-in-html5/fonts/math/fraction-denominatorshiftdown3000-rulethickness1000.woff: Added.
* imported/mathml-in-html5/fonts/math/fraction-numeratordisplaystylegapmin8000-rulethickness1000.woff: Added.
* imported/mathml-in-html5/fonts/math/fraction-numeratordisplaystyleshiftup2000-rulethickness1000.woff: Added.
* imported/mathml-in-html5/fonts/math/fraction-numeratorgapmin9000-rulethickness1000.woff: Added.
* imported/mathml-in-html5/fonts/math/fraction-numeratorshiftup11000-rulethickness1000.woff: Added.
* imported/mathml-in-html5/fonts/math/fraction-rulethickness10000.woff: Added.
* imported/mathml-in-html5/mathml/presentation-markup/fractions/frac-parameters-1-expected.txt: Added.
* imported/mathml-in-html5/mathml/presentation-markup/fractions/frac-parameters-1.html: Added.
* mathml/presentation/fractions-linethickness-expected.html: Adjust the test to interpret
"thick" and "thin" as suggested the MathML in HTML5 implementation note.
* mathml/presentation/stretchy-depth-height-symmetric.html: Increase error tolerance.
* platform/gtk/mathml/presentation/roots-expected.png: Handle small rendering changes.
* platform/gtk/mathml/presentation/roots-expected.txt: Ditto.
* platform/ios-simulator/mathml/presentation/roots-expected.txt: Ditto.
* platform/mac/mathml/presentation/roots-expected.txt: Ditto.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@202979 268f45cc-cd09-0410-ab3c-d52691b4dbfc

26 files changed:
LayoutTests/ChangeLog
LayoutTests/TestExpectations
LayoutTests/imported/mathml-in-html5/fonts/math/fraction-axisheight7000-rulethickness1000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/fonts/math/fraction-denominatordisplaystylegapmin5000-rulethickness1000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/fonts/math/fraction-denominatordisplaystyleshiftdown6000-rulethickness1000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/fonts/math/fraction-denominatorgapmin4000-rulethickness1000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/fonts/math/fraction-denominatorshiftdown3000-rulethickness1000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/fonts/math/fraction-numeratordisplaystylegapmin8000-rulethickness1000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/fonts/math/fraction-numeratordisplaystyleshiftup2000-rulethickness1000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/fonts/math/fraction-numeratorgapmin9000-rulethickness1000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/fonts/math/fraction-numeratorshiftup11000-rulethickness1000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/fonts/math/fraction-rulethickness10000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/fractions/frac-parameters-1-expected.txt [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/fractions/frac-parameters-1.html [new file with mode: 0644]
LayoutTests/mathml/opentype/fraction-line-expected.html
LayoutTests/mathml/opentype/fraction-line.html
LayoutTests/mathml/presentation/fractions-linethickness-expected.html
LayoutTests/mathml/presentation/stretchy-depth-height-symmetric.html
LayoutTests/platform/gtk/mathml/presentation/roots-expected.png
LayoutTests/platform/gtk/mathml/presentation/roots-expected.txt
LayoutTests/platform/ios-simulator/mathml/presentation/roots-expected.txt
LayoutTests/platform/mac/mathml/presentation/roots-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/rendering/mathml/MathMLStyle.cpp
Source/WebCore/rendering/mathml/RenderMathMLFraction.cpp
Source/WebCore/rendering/mathml/RenderMathMLFraction.h

index cc3ec4c..473373b 100644 (file)
@@ -1,5 +1,36 @@
 2016-07-08  Frederic Wang  <fwang@igalia.com>
 
+        Use Fraction* parameters from the OpenType MATH table
+        https://bugs.webkit.org/show_bug.cgi?id=155639
+
+        Reviewed by Brent Fulgham.
+
+        We import a test from the MathML in HTML5 test suite to verify Fraction* parameters.
+        We also do some small test adjustments.
+
+        * TestExpectations: We disable fractions-positions.html for now until it is replaced with a more reliable test.
+        * imported/mathml-in-html5/fonts/math/fraction-axisheight7000-rulethickness1000.woff: Added.
+        * imported/mathml-in-html5/fonts/math/fraction-denominatordisplaystylegapmin5000-rulethickness1000.woff: Added.
+        * imported/mathml-in-html5/fonts/math/fraction-denominatordisplaystyleshiftdown6000-rulethickness1000.woff: Added.
+        * imported/mathml-in-html5/fonts/math/fraction-denominatorgapmin4000-rulethickness1000.woff: Added.
+        * imported/mathml-in-html5/fonts/math/fraction-denominatorshiftdown3000-rulethickness1000.woff: Added.
+        * imported/mathml-in-html5/fonts/math/fraction-numeratordisplaystylegapmin8000-rulethickness1000.woff: Added.
+        * imported/mathml-in-html5/fonts/math/fraction-numeratordisplaystyleshiftup2000-rulethickness1000.woff: Added.
+        * imported/mathml-in-html5/fonts/math/fraction-numeratorgapmin9000-rulethickness1000.woff: Added.
+        * imported/mathml-in-html5/fonts/math/fraction-numeratorshiftup11000-rulethickness1000.woff: Added.
+        * imported/mathml-in-html5/fonts/math/fraction-rulethickness10000.woff: Added.
+        * imported/mathml-in-html5/mathml/presentation-markup/fractions/frac-parameters-1-expected.txt: Added.
+        * imported/mathml-in-html5/mathml/presentation-markup/fractions/frac-parameters-1.html: Added.
+        * mathml/presentation/fractions-linethickness-expected.html: Adjust the test to interpret
+        "thick" and "thin" as suggested the MathML in HTML5 implementation note.
+        * mathml/presentation/stretchy-depth-height-symmetric.html: Increase error tolerance.
+        * platform/gtk/mathml/presentation/roots-expected.png: Handle small rendering changes.
+        * platform/gtk/mathml/presentation/roots-expected.txt: Ditto.
+        * platform/ios-simulator/mathml/presentation/roots-expected.txt: Ditto.
+        * platform/mac/mathml/presentation/roots-expected.txt: Ditto.
+
+2016-07-08  Frederic Wang  <fwang@igalia.com>
+
         Use Radical* constants from the OpenType MATH table.
         https://bugs.webkit.org/show_bug.cgi?id=155638
 
index 65cc3d1..6f12b94 100644 (file)
@@ -121,6 +121,9 @@ webkit.org/b/83618 fast/dom/inline-event-attributes-release.html [ Failure ]
 
 webkit.org/b/129057 media/controls-styling-strict.html [ Pass Failure ]
 
+# Skip this MathML test for now until it is rewritten to be more reliable.
+webkit.org/b/159558 mathml/presentation/fractions-positions.html [ Skip ]
+
 # These tests will be rewritten, just skip them until that time.
 webkit.org/b/148036 http/tests/inspector/css/ [ Skip ]
 webkit.org/b/148036 http/tests/inspector/page/ [ Skip ]
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-axisheight7000-rulethickness1000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-axisheight7000-rulethickness1000.woff
new file mode 100644 (file)
index 0000000..3640f67
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-axisheight7000-rulethickness1000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-denominatordisplaystylegapmin5000-rulethickness1000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-denominatordisplaystylegapmin5000-rulethickness1000.woff
new file mode 100644 (file)
index 0000000..a8cf5c0
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-denominatordisplaystylegapmin5000-rulethickness1000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-denominatordisplaystyleshiftdown6000-rulethickness1000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-denominatordisplaystyleshiftdown6000-rulethickness1000.woff
new file mode 100644 (file)
index 0000000..3255864
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-denominatordisplaystyleshiftdown6000-rulethickness1000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-denominatorgapmin4000-rulethickness1000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-denominatorgapmin4000-rulethickness1000.woff
new file mode 100644 (file)
index 0000000..ba384f7
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-denominatorgapmin4000-rulethickness1000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-denominatorshiftdown3000-rulethickness1000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-denominatorshiftdown3000-rulethickness1000.woff
new file mode 100644 (file)
index 0000000..9831efb
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-denominatorshiftdown3000-rulethickness1000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-numeratordisplaystylegapmin8000-rulethickness1000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-numeratordisplaystylegapmin8000-rulethickness1000.woff
new file mode 100644 (file)
index 0000000..c66124a
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-numeratordisplaystylegapmin8000-rulethickness1000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-numeratordisplaystyleshiftup2000-rulethickness1000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-numeratordisplaystyleshiftup2000-rulethickness1000.woff
new file mode 100644 (file)
index 0000000..1fd165e
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-numeratordisplaystyleshiftup2000-rulethickness1000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-numeratorgapmin9000-rulethickness1000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-numeratorgapmin9000-rulethickness1000.woff
new file mode 100644 (file)
index 0000000..16378f9
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-numeratorgapmin9000-rulethickness1000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-numeratorshiftup11000-rulethickness1000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-numeratorshiftup11000-rulethickness1000.woff
new file mode 100644 (file)
index 0000000..7afb42f
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-numeratorshiftup11000-rulethickness1000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-rulethickness10000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-rulethickness10000.woff
new file mode 100644 (file)
index 0000000..cf2387b
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/fraction-rulethickness10000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/fractions/frac-parameters-1-expected.txt b/LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/fractions/frac-parameters-1-expected.txt
new file mode 100644 (file)
index 0000000..9ddfd1b
--- /dev/null
@@ -0,0 +1,12 @@
+
+PASS AxisHeight 
+PASS DenominatorDisplayStyleGapMin 
+PASS DenominatorDisplayStyleShiftDown 
+PASS DenominatorGapMin 
+PASS DenominatorShiftDown 
+PASS NumeratorDisplayStyleGapMin 
+PASS NumeratorDisplayStyleShiftDown 
+PASS NumeratorGapMin 
+PASS NumeratorShiftDown 
+PASS FractionRuleThickness 
+
diff --git a/LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/fractions/frac-parameters-1.html b/LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/fractions/frac-parameters-1.html
new file mode 100644 (file)
index 0000000..9d04f48
--- /dev/null
@@ -0,0 +1,243 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Fraction parameters</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS3.SSS2">
+<meta name="assert" content="Element mfrac correctly uses the fraction parameters from the MATH table.">
+<script src="../../../../../resources/testharness.js"></script>
+<script src="../../../../../resources/testharnessreport.js"></script>
+<style>
+  math, mspace {
+    font-size: 10px;
+  }
+  @font-face {
+    font-family: axisheight7000-rulethickness1000;
+    src: url("../../../fonts/math/fraction-axisheight7000-rulethickness1000.woff");
+  }
+  @font-face {
+    font-family: denominatordisplaystylegapmin5000-rulethickness1000;
+    src: url("../../../fonts/math/fraction-denominatordisplaystylegapmin5000-rulethickness1000.woff");
+  }
+  @font-face {
+    font-family: denominatordisplaystyleshiftdown6000-rulethickness1000;
+    src: url("../../../fonts/math/fraction-denominatordisplaystyleshiftdown6000-rulethickness1000.woff");
+  }
+  @font-face {
+    font-family: denominatorgapmin4000-rulethickness1000;
+    src: url("../../../fonts/math/fraction-denominatorgapmin4000-rulethickness1000.woff");
+  }
+  @font-face {
+    font-family: denominatorshiftdown3000-rulethickness1000;
+    src: url("../../../fonts/math/fraction-denominatorshiftdown3000-rulethickness1000.woff");
+  }
+  @font-face {
+    font-family: numeratordisplaystylegapmin8000-rulethickness1000;
+    src: url("../../../fonts/math/fraction-numeratordisplaystylegapmin8000-rulethickness1000.woff");
+  }
+  @font-face {
+    font-family: numeratordisplaystyleshiftup2000-rulethickness1000;
+    src: url("../../../fonts/math/fraction-numeratordisplaystyleshiftup2000-rulethickness1000.woff");
+  }
+  @font-face {
+    font-family: numeratorgapmin9000-rulethickness1000;
+    src: url("../../../fonts/math/fraction-numeratorgapmin9000-rulethickness1000.woff");
+  }
+  @font-face {
+    font-family: numeratorshiftup11000-rulethickness1000;
+    src: url("../../../fonts/math/fraction-numeratorshiftup11000-rulethickness1000.woff");
+  }
+  @font-face {
+    font-family: rulethickness10000;
+    src: url("../../../fonts/math/fraction-rulethickness10000.woff");
+  }
+</style>
+<script>
+  var emToPx = 10 / 1000; // font-size: 10px, font.em = 1000
+  var epsilon = 1;
+
+  function getBox(aId) {
+    return document.getElementById(aId).getBoundingClientRect();
+  }
+
+  setup({ explicit_done: true });
+  window.addEventListener("load", function() {
+    document.fonts.ready.then(function() {
+      window.setTimeout(runTests, 250);
+    });
+  });
+
+  function runTests() {
+    test(function() {
+      var v1 = 7000 * emToPx;
+      var v2 = 1000 * emToPx;
+      assert_approx_equals(getBox("ref0001").top - getBox("num0001").bottom,
+                           v1 + v2 / 2, epsilon, "mfrac: axis height");
+    }, "AxisHeight");
+
+    test(function() {
+      var v1 = 5000 * emToPx;
+      assert_approx_equals(getBox("den0002").top - getBox("ref0002").bottom,
+                           v1, epsilon, "mfrac: denominator gap");
+    }, "DenominatorDisplayStyleGapMin");
+
+    test(function() {
+      var v1 = 6000 * emToPx;
+      assert_approx_equals(getBox("den0003").top - getBox("ref0003").bottom,
+                           v1, epsilon, "mfrac: denominator shift");
+    }, "DenominatorDisplayStyleShiftDown");
+
+    test(function() {
+      var v1 = 4000 * emToPx;
+      assert_approx_equals(getBox("den0004").top - getBox("ref0004").bottom,
+                           v1, epsilon, "mfrac: denominator gap");
+    }, "DenominatorGapMin");
+
+    test(function() {
+      var v1 = 3000 * emToPx;
+      assert_approx_equals(getBox("den0005").top - getBox("ref0005").bottom,
+                           v1, epsilon, "mfrac: denominator shift");
+    }, "DenominatorShiftDown");
+
+    test(function() {
+      var v1 = 8000 * emToPx;
+      assert_approx_equals(getBox("ref0006").top - getBox("num0006").bottom,
+                           v1, epsilon, "mfrac: numerator gap");
+    }, "NumeratorDisplayStyleGapMin");
+
+    test(function() {
+      var v1 = 2000 * emToPx;
+      assert_approx_equals(getBox("ref0007").top - getBox("num0007").bottom,
+                           v1, epsilon, "mfrac: numerator shift");
+    }, "NumeratorDisplayStyleShiftDown");
+
+    test(function() {
+      var v1 = 9000 * emToPx;
+      assert_approx_equals(getBox("ref0008").top - getBox("num0008").bottom,
+                           v1, epsilon, "mfrac: numerator gap");
+    }, "NumeratorGapMin");
+
+    test(function() {
+      var v1 = 11000 * emToPx;
+      assert_approx_equals(getBox("ref0009").top - getBox("num0009").bottom,
+                           v1, epsilon, "mfrac: numerator shift");
+    }, "NumeratorShiftDown");
+
+    test(function() {
+      var v1 = 10000 * emToPx;
+      assert_approx_equals(getBox("den0010").top - getBox("num0010").bottom,
+                           v1, epsilon, "mfrac: rule thickness");
+    }, "FractionRuleThickness");
+
+    done();
+  }
+</script>
+</head>
+<body>
+  <p>
+    <math style="font-family: axisheight7000-rulethickness1000;">
+      <mspace id="ref0001" depth="1em" width="3em" mathbackground="green"/>
+      <mfrac>
+        <mspace width="3em" height="1em" id="num0001" mathbackground="blue"/>
+        <mspace width="3em"/>
+      </mfrac>
+    </math>
+  </p>
+  <hr/>
+  <p>
+    <math display="block" style="font-family: denominatordisplaystylegapmin5000-rulethickness1000;">
+      <mspace id="ref0002" width="3em"
+              height=".5em" depth=".5em" mathbackground="green"/>
+      <mfrac>
+        <mspace width="3em"/>
+        <mspace width="3em" height="1em" id="den0002" mathbackground="blue"/>
+      </mfrac>
+    </math>
+  </p>
+  <hr/>
+  <p>
+    <math display="block" style="font-family: denominatordisplaystyleshiftdown6000-rulethickness1000;">
+      <mspace id="ref0003" width="3em" height="1em" mathbackground="green"/>
+      <mfrac>
+        <mspace width="3em"/>
+        <mspace width="3em" depth="1em" id="den0003" mathbackground="blue"/>
+      </mfrac>
+    </math>
+  </p>
+  <hr/>
+  <p>
+    <math style="font-family: denominatorgapmin4000-rulethickness1000;">
+      <mspace id="ref0004" width="3em"
+              height=".5em" depth=".5em" mathbackground="green"/>
+      <mfrac>
+        <mspace width="3em"/>
+        <mspace width="3em" height="1em" id="den0004" mathbackground="blue"/>
+      </mfrac>
+    </math>
+  </p>
+  <hr/>
+  <p>
+    <math style="font-family: denominatorshiftdown3000-rulethickness1000;">
+      <mspace id="ref0005" width="3em" height="1em" mathbackground="green"/>
+      <mfrac>
+        <mspace width="3em"/>
+        <mspace width="3em" depth="1em" id="den0005" mathbackground="blue"/>
+      </mfrac>
+    </math>
+  </p>
+  <hr/>
+  <p>
+    <math display="block" style="font-family: numeratordisplaystylegapmin8000-rulethickness1000;">
+      <mspace id="ref0006" width="3em"
+              height=".5em" depth=".5em" mathbackground="green"/>
+      <mfrac>
+        <mspace width="3em" depth="1em" id="num0006" mathbackground="blue"/>
+        <mspace width="3em"/>
+      </mfrac>
+    </math>
+  </p>
+  <hr/>
+  <p>
+    <math display="block" style="font-family: numeratordisplaystyleshiftup2000-rulethickness1000;">
+      <mspace id="ref0007" width="3em"
+              depth="1em" mathbackground="green"/>
+      <mfrac>
+        <mspace width="3em" height="1em" id="num0007" mathbackground="blue"/>
+        <mspace width="3em"/>
+      </mfrac>
+    </math>
+  </p>
+  <hr/>
+  <p>
+    <math style="font-family: numeratorgapmin9000-rulethickness1000;">
+      <mspace id="ref0008" width="3em"
+              height=".5em" depth=".5em" mathbackground="green"/>
+      <mfrac>
+        <mspace width="3em" depth="1em" id="num0008" mathbackground="blue"/>
+        <mspace width="3em"/>
+      </mfrac>
+    </math>
+  </p>
+  <hr/>
+  <p>
+    <math style="font-family: numeratorshiftup11000-rulethickness1000;">
+      <mspace id="ref0009" width="3em"
+              depth="1em" mathbackground="green"/>
+      <mfrac>
+        <mspace width="3em" height="1em" id="num0009" mathbackground="blue"/>
+        <mspace width="3em"/>
+      </mfrac>
+    </math>
+  </p>
+  <hr/>
+  <p>
+    <math style="font-family: rulethickness10000">
+      <mfrac>
+        <mspace width="3em" height="1em" id="num0010" mathbackground="blue"/>
+        <mspace width="3em" depth="1em" id="den0010" mathbackground="green"/>
+      </mfrac>
+    </math>
+  </p>
+  <hr/>
+</body>
+</html>
index da6bce1..b8d33ae 100644 (file)
@@ -14,7 +14,7 @@
 
     <div style="position: absolute; left: 0px; top: -25px;">
       <math>
-        <mspace height="50px" depth="50px"/>
+        <mspace height="100px" depth="100px" width="1px" mathbackground="black"/>
         <mspace width="100px" height="2px" depth="2px" mathbackground="green"/>
       </math>
     </div>
index 5072426..875a87f 100644 (file)
@@ -19,7 +19,7 @@
     <!-- This test passes if the (red) fraction bar is hidden by the green bar -->
     <div style="position: absolute; left: 0px; top: 0px;">
       <math>
-        <mspace height="50px" depth="50px"/>
+        <mspace height="100px" depth="100px" width="1px"/>
         <mfrac mathcolor="red">
           <mspace width="50px"/>
           <mspace width="50px"/>
@@ -30,7 +30,7 @@
     <!-- This green bar is moved up by AxisHeight and has thickness height + depth = FractionRuleThickness. -->
     <div style="position: absolute; left: 0px; top: -25px;">
       <math>
-        <mspace height="50px" depth="50px"/>
+        <mspace height="100px" depth="100px" width="1px" mathbackground="black"/>
         <mspace width="100px" height="2px" depth="2px" mathbackground="green"/>
       </math>
     </div>
index 2eb8456..716a5d1 100644 (file)
          'A number without a unit is intepreted as a multiple of the default
          value.'
          
-         Here are the linethickness values used by WebKit:
-         
-         gLineThin = 0.33f;
-         gLineMedium = 1.f;
-         gLineThick = 3.f;
+         We follow the suggestion of the MathML in HTML5 implementation note and interpret thin as 50% and thick as 200%.
       -->
 
     <math>
-      <mfrac linethickness="0.33px"><mn>1</mn><mn>2</mn></mfrac>
+      <mfrac linethickness="0.5px"><mn>1</mn><mn>2</mn></mfrac>
       <mfrac linethickness="1px"><mn>1</mn><mn>2</mn></mfrac>
-      <mfrac linethickness="3px"><mn>1</mn><mn>2</mn></mfrac>
+      <mfrac linethickness="2px"><mn>1</mn><mn>2</mn></mfrac>
       <mfrac linethickness="5px"><mn>1</mn><mn>2</mn></mfrac>
     </math>
 
index 0048751..92063b4 100644 (file)
@@ -6,7 +6,7 @@
     <script src="../../resources/testharnessreport.js"></script>
     <script type="text/javascript">
       setup({ "explicit_done": true });
-      var epsilon = 2;
+      var epsilon = 3;
 
       function getAxis(id) {
           var frac = document.getElementById("frac" + id).getBoundingClientRect();
index 4066917..d699281 100644 (file)
Binary files a/LayoutTests/platform/gtk/mathml/presentation/roots-expected.png and b/LayoutTests/platform/gtk/mathml/presentation/roots-expected.png differ
index 9493d89..8f5c4a8 100644 (file)
@@ -1,8 +1,8 @@
 layer at (0,0) size 800x600
   RenderView at (0,0) size 800x600
-layer at (0,0) size 800x563
-  RenderBlock {html} at (0,0) size 800x563
-    RenderBody {body} at (8,16) size 784x531
+layer at (0,0) size 800x559
+  RenderBlock {html} at (0,0) size 800x559
+    RenderBody {body} at (8,16) size 784x527
       RenderBlock {p} at (0,0) size 784x18
         RenderText {#text} at (0,0) size 177x17
           text run at (0,0) width 177: "square root (should be red): "
@@ -53,11 +53,11 @@ layer at (0,0) size 800x563
                 RenderText {#text} at (0,-46) size 8x106
                   text run at (0,-46) width 8: "1"
       RenderBlock {p} at (0,103) size 784x40
-        RenderText {#text} at (0,8) size 113x17
-          text run at (0,8) width 113: "root of a fraction: "
+        RenderText {#text} at (0,9) size 113x17
+          text run at (0,9) width 113: "root of a fraction: "
         RenderMathMLMath {math} at (113,0) size 55x41 [padding: 0 1 0 1]
           RenderMathMLRoot {msqrt} at (1,0) size 53x41
-            RenderMathMLFraction {mfrac} at (16,2) size 37x34
+            RenderMathMLFraction {mfrac} at (16,2) size 37x32
               RenderMathMLRow {mrow} at (0,0) size 37x13
                 RenderMathMLToken {mi} at (0,3) size 9x9 [padding: 0 2 0 0]
                   RenderBlock (anonymous) at (0,0) size 8x8
@@ -71,7 +71,7 @@ layer at (0,0) size 800x563
                   RenderBlock (anonymous) at (0,0) size 8x12
                     RenderText {#text} at (0,-46) size 8x106
                       text run at (0,-46) width 8: "1"
-              RenderMathMLRow {mrow} at (0,20) size 37x14
+              RenderMathMLRow {mrow} at (0,18) size 37x14
                 RenderMathMLToken {mi} at (0,3) size 9x9 [padding: 0 2 0 0]
                   RenderBlock (anonymous) at (0,0) size 8x8
                     RenderText {#text} at (0,-50) size 8x106
@@ -128,11 +128,11 @@ layer at (0,0) size 800x563
                   RenderText {#text} at (0,-29) size 4x61
                     text run at (0,-29) width 4: "z"
       RenderBlock {p} at (0,227) size 784x40
-        RenderText {#text} at (0,8) size 185x17
-          text run at (0,8) width 185: "long index w/ complex base: "
+        RenderText {#text} at (0,9) size 185x17
+          text run at (0,9) width 185: "long index w/ complex base: "
         RenderMathMLMath {math} at (185,0) size 85x41 [padding: 0 1 0 1]
           RenderMathMLRoot {mroot} at (1,0) size 83x41
-            RenderMathMLFraction {mfrac} at (46,2) size 37x34
+            RenderMathMLFraction {mfrac} at (46,2) size 37x32
               RenderMathMLRow {mrow} at (0,0) size 37x13
                 RenderMathMLToken {mi} at (0,3) size 9x9 [padding: 0 2 0 0]
                   RenderBlock (anonymous) at (0,0) size 8x8
@@ -146,7 +146,7 @@ layer at (0,0) size 800x563
                   RenderBlock (anonymous) at (0,0) size 8x12
                     RenderText {#text} at (0,-46) size 8x106
                       text run at (0,-46) width 8: "1"
-              RenderMathMLRow {mrow} at (0,20) size 37x14
+              RenderMathMLRow {mrow} at (0,18) size 37x14
                 RenderMathMLToken {mi} at (0,3) size 9x9 [padding: 0 2 0 0]
                   RenderBlock (anonymous) at (0,0) size 8x8
                     RenderText {#text} at (0,-50) size 8x106
@@ -180,16 +180,16 @@ layer at (0,0) size 800x563
                 RenderBlock (anonymous) at (0,0) size 4x5
                   RenderText {#text} at (0,-29) size 4x61
                     text run at (0,-29) width 4: "z"
-      RenderBlock {p} at (0,283) size 784x34
-        RenderText {#text} at (0,16) size 75x17
-          text run at (0,16) width 75: "high index: "
-        RenderMathMLMath {math} at (75,0) size 24x35 [padding: 0 1 0 1]
-          RenderMathMLRoot {mroot} at (1,0) size 22x35
-            RenderMathMLToken {mn} at (13,18) size 9x13
+      RenderBlock {p} at (0,283) size 784x30
+        RenderText {#text} at (0,12) size 75x17
+          text run at (0,12) width 75: "high index: "
+        RenderMathMLMath {math} at (75,0) size 24x31 [padding: 0 1 0 1]
+          RenderMathMLRoot {mroot} at (1,0) size 22x31
+            RenderMathMLToken {mn} at (13,14) size 9x13
               RenderBlock (anonymous) at (0,0) size 8x12
                 RenderText {#text} at (0,-46) size 8x106
                   text run at (0,-46) width 8: "2"
-            RenderMathMLFraction {mfrac} at (4,0) size 6x24
+            RenderMathMLFraction {mfrac} at (4,0) size 6x21
               RenderMathMLFraction {mfrac} at (0,0) size 5x15
                 RenderMathMLToken {mi} at (0,0) size 5x5 [padding: 0 1 0 0]
                   RenderBlock (anonymous) at (0,0) size 5x5
@@ -199,11 +199,11 @@ layer at (0,0) size 800x563
                   RenderBlock (anonymous) at (0,0) size 5x6
                     RenderText {#text} at (0,-29) size 5x61
                       text run at (0,-29) width 5: "y"
-              RenderMathMLToken {mi} at (0,18) size 5x6 [padding: 0 1 0 0]
+              RenderMathMLToken {mi} at (0,15) size 5x6 [padding: 0 1 0 0]
                 RenderBlock (anonymous) at (0,0) size 4x5
                   RenderText {#text} at (0,-29) size 4x61
                     text run at (0,-29) width 4: "z"
-      RenderBlock {p} at (0,333) size 784x54
+      RenderBlock {p} at (0,329) size 784x54
         RenderText {#text} at (0,14) size 155x17
           text run at (0,14) width 155: "Imbricated square roots: "
         RenderMathMLMath {math} at (155,0) size 332x55 [padding: 0 1 0 1]
@@ -282,86 +282,86 @@ layer at (0,0) size 800x563
                                           RenderText {#text} at (0,-45) size 12x106
                                             text run at (0,-45) width 12: "A"
         RenderText {#text} at (0,0) size 0x0
-      RenderBlock {p} at (0,403) size 784x56
-        RenderText {#text} at (0,24) size 110x17
-          text run at (0,24) width 110: "Imbricated roots: "
+      RenderBlock {p} at (0,399) size 784x56
+        RenderText {#text} at (0,22) size 110x17
+          text run at (0,22) width 110: "Imbricated roots: "
         RenderMathMLMath {math} at (110,0) size 353x57 [padding: 0 1 0 1]
           RenderMathMLRoot {mroot} at (1,0) size 351x57
             RenderMathMLRow {mrow} at (17,2) size 334x55
-              RenderMathMLToken {mn} at (0,25) size 8x12
+              RenderMathMLToken {mn} at (0,23) size 8x12
                 RenderBlock (anonymous) at (0,0) size 8x12
                   RenderText {#text} at (0,-46) size 8x106
                     text run at (0,-46) width 8: "1"
-              RenderMathMLOperator {mo} at (8,26) size 20x12
+              RenderMathMLOperator {mo} at (8,24) size 20x12
                 RenderBlock (anonymous) at (3,0) size 13x12
                   RenderText {#text} at (0,-47) size 12x106
                     text run at (0,-47) width 12: "+"
               RenderMathMLRoot {mroot} at (27,0) size 306x55
                 RenderMathMLRow {mrow} at (17,2) size 289x53
-                  RenderMathMLToken {mn} at (0,23) size 8x12
+                  RenderMathMLToken {mn} at (0,21) size 8x12
                     RenderBlock (anonymous) at (0,0) size 8x12
                       RenderText {#text} at (0,-46) size 8x106
                         text run at (0,-46) width 8: "2"
-                  RenderMathMLOperator {mo} at (8,24) size 20x12
+                  RenderMathMLOperator {mo} at (8,22) size 20x12
                     RenderBlock (anonymous) at (3,0) size 13x12
                       RenderText {#text} at (0,-47) size 12x106
                         text run at (0,-47) width 12: "+"
                   RenderMathMLRoot {mroot} at (27,0) size 261x53
                     RenderMathMLRow {mrow} at (17,2) size 244x51
-                      RenderMathMLToken {mn} at (0,21) size 8x12
+                      RenderMathMLToken {mn} at (0,19) size 8x12
                         RenderBlock (anonymous) at (0,0) size 8x12
                           RenderText {#text} at (0,-46) size 8x106
                             text run at (0,-46) width 8: "3"
-                      RenderMathMLOperator {mo} at (8,22) size 20x12
+                      RenderMathMLOperator {mo} at (8,20) size 20x12
                         RenderBlock (anonymous) at (3,0) size 13x12
                           RenderText {#text} at (0,-47) size 12x106
                             text run at (0,-47) width 12: "+"
                       RenderMathMLRoot {mroot} at (27,0) size 217x51
                         RenderMathMLRow {mrow} at (17,2) size 200x49
-                          RenderMathMLToken {mn} at (0,19) size 8x12
+                          RenderMathMLToken {mn} at (0,17) size 8x12
                             RenderBlock (anonymous) at (0,0) size 8x12
                               RenderText {#text} at (0,-46) size 8x106
                                 text run at (0,-46) width 8: "4"
-                          RenderMathMLOperator {mo} at (8,20) size 20x12
+                          RenderMathMLOperator {mo} at (8,18) size 20x12
                             RenderBlock (anonymous) at (3,0) size 13x12
                               RenderText {#text} at (0,-47) size 12x106
                                 text run at (0,-47) width 12: "+"
                           RenderMathMLRoot {mroot} at (27,0) size 172x49
                             RenderMathMLRow {mrow} at (16,2) size 156x41
-                              RenderMathMLToken {mn} at (0,17) size 8x12
+                              RenderMathMLToken {mn} at (0,15) size 8x12
                                 RenderBlock (anonymous) at (0,0) size 8x12
                                   RenderText {#text} at (0,-46) size 8x106
                                     text run at (0,-46) width 8: "5"
-                              RenderMathMLOperator {mo} at (8,18) size 20x12
+                              RenderMathMLOperator {mo} at (8,16) size 20x12
                                 RenderBlock (anonymous) at (3,0) size 13x12
                                   RenderText {#text} at (0,-47) size 12x106
                                     text run at (0,-47) width 12: "+"
                               RenderMathMLRoot {mroot} at (27,0) size 128x41
                                 RenderMathMLRow {mrow} at (16,2) size 112x31
-                                  RenderMathMLToken {mn} at (0,15) size 8x12
+                                  RenderMathMLToken {mn} at (0,13) size 8x12
                                     RenderBlock (anonymous) at (0,0) size 8x12
                                       RenderText {#text} at (0,-46) size 8x106
                                         text run at (0,-46) width 8: "6"
-                                  RenderMathMLOperator {mo} at (8,16) size 20x12
+                                  RenderMathMLOperator {mo} at (8,14) size 20x12
                                     RenderBlock (anonymous) at (3,0) size 13x12
                                       RenderText {#text} at (0,-47) size 12x106
                                         text run at (0,-47) width 12: "+"
                                   RenderMathMLRoot {mroot} at (27,0) size 85x31
-                                    RenderMathMLRow {mrow} at (16,2) size 69x28
-                                      RenderMathMLToken {mn} at (0,13) size 8x12
+                                    RenderMathMLRow {mrow} at (16,2) size 69x26
+                                      RenderMathMLToken {mn} at (0,11) size 8x12
                                         RenderBlock (anonymous) at (0,0) size 8x12
                                           RenderText {#text} at (0,-46) size 8x106
                                             text run at (0,-46) width 8: "7"
-                                      RenderMathMLOperator {mo} at (8,14) size 20x12
+                                      RenderMathMLOperator {mo} at (8,12) size 20x12
                                         RenderBlock (anonymous) at (3,0) size 13x12
                                           RenderText {#text} at (0,-47) size 12x106
                                             text run at (0,-47) width 12: "+"
-                                      RenderMathMLRoot {mroot} at (27,0) size 41x28
-                                        RenderMathMLToken {mi} at (28,11) size 13x13 [padding: 0 2 0 0]
+                                      RenderMathMLRoot {mroot} at (27,0) size 41x26
+                                        RenderMathMLToken {mi} at (28,9) size 13x13 [padding: 0 2 0 0]
                                           RenderBlock (anonymous) at (0,0) size 12x13
                                             RenderText {#text} at (0,-45) size 12x106
                                               text run at (0,-45) width 12: "A"
-                                        RenderMathMLFraction {mfrac} at (4,0) size 21x17
+                                        RenderMathMLFraction {mfrac} at (4,0) size 21x16
                                           RenderMathMLRow {mrow} at (0,0) size 20x8
                                             RenderMathMLToken {mi} at (0,2) size 5x5 [padding: 0 1 0 0]
                                               RenderBlock (anonymous) at (0,0) size 5x5
@@ -375,7 +375,7 @@ layer at (0,0) size 800x563
                                               RenderBlock (anonymous) at (0,0) size 5x6
                                                 RenderText {#text} at (0,-29) size 5x61
                                                   text run at (0,-29) width 5: "y"
-                                          RenderMathMLToken {mi} at (8,11) size 4x6 [padding: 0 1 0 0]
+                                          RenderMathMLToken {mi} at (8,10) size 4x6 [padding: 0 1 0 0]
                                             RenderBlock (anonymous) at (0,0) size 4x5
                                               RenderText {#text} at (0,-29) size 4x61
                                                 text run at (0,-29) width 4: "z"
@@ -408,86 +408,86 @@ layer at (0,0) size 800x563
                 RenderText {#text} at (0,-27) size 5x61
                   text run at (0,-27) width 5: "3"
         RenderText {#text} at (0,0) size 0x0
-      RenderBlock {p} at (0,475) size 784x56
-        RenderText {#text} at (0,24) size 74x17
-          text run at (0,24) width 74: "RTL roots: "
+      RenderBlock {p} at (0,471) size 784x56
+        RenderText {#text} at (0,22) size 74x17
+          text run at (0,22) width 74: "RTL roots: "
         RenderMathMLMath {math} at (74,0) size 353x57 [padding: 0 1 0 1]
           RenderMathMLRoot {mroot} at (1,0) size 351x57
             RenderMathMLRow {mrow} at (0,2) size 333x55
-              RenderMathMLToken {mn} at (324,25) size 9x12
+              RenderMathMLToken {mn} at (324,23) size 9x12
                 RenderBlock (anonymous) at (0,0) size 8x12
                   RenderText {#text} at (0,-46) size 8x106
                     text run at (0,-46) width 8: "1"
-              RenderMathMLOperator {mo} at (305,26) size 20x12
+              RenderMathMLOperator {mo} at (305,24) size 20x12
                 RenderBlock (anonymous) at (3,0) size 13x12
                   RenderText {#text} at (0,-47) size 12x106
                     text run at (0,-47) width 12 RTL: "+"
               RenderMathMLRoot {mroot} at (0,0) size 306x55
                 RenderMathMLRow {mrow} at (0,2) size 288x53
-                  RenderMathMLToken {mn} at (279,23) size 9x12
+                  RenderMathMLToken {mn} at (279,21) size 9x12
                     RenderBlock (anonymous) at (0,0) size 8x12
                       RenderText {#text} at (0,-46) size 8x106
                         text run at (0,-46) width 8: "2"
-                  RenderMathMLOperator {mo} at (260,24) size 20x12
+                  RenderMathMLOperator {mo} at (260,22) size 20x12
                     RenderBlock (anonymous) at (3,0) size 13x12
                       RenderText {#text} at (0,-47) size 12x106
                         text run at (0,-47) width 12 RTL: "+"
                   RenderMathMLRoot {mroot} at (0,0) size 261x53
                     RenderMathMLRow {mrow} at (0,2) size 244x51
-                      RenderMathMLToken {mn} at (235,21) size 9x12
+                      RenderMathMLToken {mn} at (235,19) size 9x12
                         RenderBlock (anonymous) at (0,0) size 8x12
                           RenderText {#text} at (0,-46) size 8x106
                             text run at (0,-46) width 8: "3"
-                      RenderMathMLOperator {mo} at (216,22) size 20x12
+                      RenderMathMLOperator {mo} at (216,20) size 20x12
                         RenderBlock (anonymous) at (3,0) size 13x12
                           RenderText {#text} at (0,-47) size 12x106
                             text run at (0,-47) width 12 RTL: "+"
                       RenderMathMLRoot {mroot} at (0,0) size 217x51
                         RenderMathMLRow {mrow} at (0,2) size 199x49
-                          RenderMathMLToken {mn} at (190,19) size 9x12
+                          RenderMathMLToken {mn} at (190,17) size 9x12
                             RenderBlock (anonymous) at (0,0) size 8x12
                               RenderText {#text} at (0,-46) size 8x106
                                 text run at (0,-46) width 8: "4"
-                          RenderMathMLOperator {mo} at (171,20) size 20x12
+                          RenderMathMLOperator {mo} at (171,18) size 20x12
                             RenderBlock (anonymous) at (3,0) size 13x12
                               RenderText {#text} at (0,-47) size 12x106
                                 text run at (0,-47) width 12 RTL: "+"
                           RenderMathMLRoot {mroot} at (0,0) size 172x49
                             RenderMathMLRow {mrow} at (0,2) size 155x41
-                              RenderMathMLToken {mn} at (146,17) size 9x12
+                              RenderMathMLToken {mn} at (146,15) size 9x12
                                 RenderBlock (anonymous) at (0,0) size 8x12
                                   RenderText {#text} at (0,-46) size 8x106
                                     text run at (0,-46) width 8: "5"
-                              RenderMathMLOperator {mo} at (127,18) size 20x12
+                              RenderMathMLOperator {mo} at (127,16) size 20x12
                                 RenderBlock (anonymous) at (3,0) size 13x12
                                   RenderText {#text} at (0,-47) size 12x106
                                     text run at (0,-47) width 12 RTL: "+"
                               RenderMathMLRoot {mroot} at (0,0) size 128x41
                                 RenderMathMLRow {mrow} at (0,2) size 112x31
-                                  RenderMathMLToken {mn} at (103,15) size 9x12
+                                  RenderMathMLToken {mn} at (103,13) size 9x12
                                     RenderBlock (anonymous) at (0,0) size 8x12
                                       RenderText {#text} at (0,-46) size 8x106
                                         text run at (0,-46) width 8: "6"
-                                  RenderMathMLOperator {mo} at (84,16) size 20x12
+                                  RenderMathMLOperator {mo} at (84,14) size 20x12
                                     RenderBlock (anonymous) at (3,0) size 13x12
                                       RenderText {#text} at (0,-47) size 12x106
                                         text run at (0,-47) width 12 RTL: "+"
                                   RenderMathMLRoot {mroot} at (0,0) size 85x31
-                                    RenderMathMLRow {mrow} at (0,2) size 68x28
-                                      RenderMathMLToken {mn} at (59,13) size 9x12
+                                    RenderMathMLRow {mrow} at (0,2) size 68x26
+                                      RenderMathMLToken {mn} at (59,11) size 9x12
                                         RenderBlock (anonymous) at (0,0) size 8x12
                                           RenderText {#text} at (0,-46) size 8x106
                                             text run at (0,-46) width 8: "7"
-                                      RenderMathMLOperator {mo} at (40,14) size 20x12
+                                      RenderMathMLOperator {mo} at (40,12) size 20x12
                                         RenderBlock (anonymous) at (3,0) size 13x12
                                           RenderText {#text} at (0,-47) size 12x106
                                             text run at (0,-47) width 12 RTL: "+"
-                                      RenderMathMLRoot {mroot} at (0,0) size 41x28
-                                        RenderMathMLToken {mi} at (0,11) size 12x13 [padding: 0 0 0 2]
+                                      RenderMathMLRoot {mroot} at (0,0) size 41x26
+                                        RenderMathMLToken {mi} at (0,9) size 12x13 [padding: 0 0 0 2]
                                           RenderBlock (anonymous) at (0,0) size 12x13
                                             RenderText {#text} at (0,-45) size 12x106
                                               text run at (0,-45) width 12: "A"
-                                        RenderMathMLFraction {mfrac} at (16,0) size 21x17
+                                        RenderMathMLFraction {mfrac} at (16,0) size 21x16
                                           RenderMathMLRow {mrow} at (0,0) size 20x8
                                             RenderMathMLToken {mi} at (15,2) size 5x5 [padding: 0 0 0 1]
                                               RenderBlock (anonymous) at (0,0) size 5x5
@@ -501,7 +501,7 @@ layer at (0,0) size 800x563
                                               RenderBlock (anonymous) at (0,0) size 5x6
                                                 RenderText {#text} at (0,-29) size 5x61
                                                   text run at (0,-29) width 5: "y"
-                                          RenderMathMLToken {mi} at (8,11) size 4x6 [padding: 0 0 0 1]
+                                          RenderMathMLToken {mi} at (8,10) size 4x6 [padding: 0 0 0 1]
                                             RenderBlock (anonymous) at (0,0) size 4x5
                                               RenderText {#text} at (0,-29) size 4x61
                                                 text run at (0,-29) width 4: "z"
index f1baebb..3d53fb3 100644 (file)
@@ -1,8 +1,8 @@
 layer at (0,0) size 800x600
   RenderView at (0,0) size 800x600
-layer at (0,0) size 800x531
-  RenderBlock {html} at (0,0) size 800x531
-    RenderBody {body} at (8,16) size 784x499
+layer at (0,0) size 800x511
+  RenderBlock {html} at (0,0) size 800x511
+    RenderBody {body} at (8,16) size 784x479
       RenderBlock {p} at (0,0) size 784x20
         RenderText {#text} at (0,0) size 181x19
           text run at (0,0) width 181: "square root (should be red): "
@@ -52,12 +52,12 @@ layer at (0,0) size 800x531
               RenderBlock (anonymous) at (0,0) size 8x12
                 RenderText {#text} at (0,-1) size 8x17
                   text run at (0,-1) width 8: "1"
-      RenderBlock {p} at (0,111) size 784x32
-        RenderText {#text} at (0,6) size 117x19
-          text run at (0,6) width 117: "root of a fraction: "
-        RenderMathMLMath {math} at (116,0) size 45x33 [padding: 0 1 0 1]
-          RenderMathMLRoot {msqrt} at (1,0) size 43x33
-            RenderMathMLFraction {mfrac} at (8,1) size 35x32
+      RenderBlock {p} at (0,111) size 784x28
+        RenderText {#text} at (0,4) size 117x19
+          text run at (0,4) width 117: "root of a fraction: "
+        RenderMathMLMath {math} at (116,0) size 45x29 [padding: 0 1 0 1]
+          RenderMathMLRoot {msqrt} at (1,0) size 43x29
+            RenderMathMLFraction {mfrac} at (8,1) size 35x28
               RenderMathMLRow {mrow} at (0,0) size 34x12
                 RenderMathMLToken {mi} at (0,3) size 10x9 [padding: 0 2 0 0]
                   RenderBlock (anonymous) at (0,0) size 8x9
@@ -71,7 +71,7 @@ layer at (0,0) size 800x531
                   RenderBlock (anonymous) at (0,0) size 8x12
                     RenderText {#text} at (0,-1) size 8x17
                       text run at (0,-1) width 8: "1"
-              RenderMathMLRow {mrow} at (0,19) size 34x13
+              RenderMathMLRow {mrow} at (0,14) size 34x13
                 RenderMathMLToken {mi} at (0,3) size 10x9 [padding: 0 2 0 0]
                   RenderBlock (anonymous) at (0,0) size 8x9
                     RenderText {#text} at (0,-4) size 8x17
@@ -84,7 +84,7 @@ layer at (0,0) size 800x531
                   RenderBlock (anonymous) at (0,0) size 8x12
                     RenderText {#text} at (0,-1) size 8x17
                       text run at (0,-1) width 8: "2"
-      RenderBlock {p} at (0,159) size 784x20
+      RenderBlock {p} at (0,155) size 784x20
         RenderText {#text} at (0,0) size 177x19
           text run at (0,0) width 177: "cube root (should be blue): "
         RenderMathMLMath {math} at (176,0) size 20x16 [color=#0000FF] [padding: 0 1 0 1]
@@ -97,7 +97,7 @@ layer at (0,0) size 800x531
               RenderBlock (anonymous) at (0,0) size 5x8
                 RenderText {#text} at (0,0) size 5x10
                   text run at (0,0) width 5: "3"
-      RenderBlock {p} at (0,195) size 784x20
+      RenderBlock {p} at (0,191) size 784x20
         RenderText {#text} at (0,0) size 77x19
           text run at (0,0) width 77: "long index: "
         RenderMathMLMath {math} at (76,1) size 49x15 [padding: 0 1 0 1]
@@ -127,12 +127,12 @@ layer at (0,0) size 800x531
                 RenderBlock (anonymous) at (0,0) size 4x6
                   RenderText {#text} at (0,-2) size 4x10
                     text run at (0,-2) width 4: "z"
-      RenderBlock {p} at (0,231) size 784x33
-        RenderText {#text} at (0,7) size 188x19
-          text run at (0,7) width 188: "long index w/ complex base: "
-        RenderMathMLMath {math} at (187,0) size 75x34 [padding: 0 1 0 1]
-          RenderMathMLRoot {mroot} at (1,0) size 72x34
-            RenderMathMLFraction {mfrac} at (37,2) size 35x32
+      RenderBlock {p} at (0,227) size 784x28
+        RenderText {#text} at (0,5) size 188x19
+          text run at (0,5) width 188: "long index w/ complex base: "
+        RenderMathMLMath {math} at (187,0) size 75x29 [padding: 0 1 0 1]
+          RenderMathMLRoot {mroot} at (1,0) size 72x29
+            RenderMathMLFraction {mfrac} at (37,2) size 35x27
               RenderMathMLRow {mrow} at (0,0) size 34x12
                 RenderMathMLToken {mi} at (0,3) size 10x9 [padding: 0 2 0 0]
                   RenderBlock (anonymous) at (0,0) size 8x9
@@ -146,7 +146,7 @@ layer at (0,0) size 800x531
                   RenderBlock (anonymous) at (0,0) size 8x12
                     RenderText {#text} at (0,-1) size 8x17
                       text run at (0,-1) width 8: "1"
-              RenderMathMLRow {mrow} at (0,19) size 34x13
+              RenderMathMLRow {mrow} at (0,14) size 34x13
                 RenderMathMLToken {mi} at (0,3) size 10x9 [padding: 0 2 0 0]
                   RenderBlock (anonymous) at (0,0) size 8x9
                     RenderText {#text} at (0,-4) size 8x17
@@ -159,7 +159,7 @@ layer at (0,0) size 800x531
                   RenderBlock (anonymous) at (0,0) size 8x12
                     RenderText {#text} at (0,-1) size 8x17
                       text run at (0,-1) width 8: "2"
-            RenderMathMLRow {mrow} at (4,8) size 35x8
+            RenderMathMLRow {mrow} at (4,6) size 35x8
               RenderMathMLToken {mi} at (0,0) size 6x6 [padding: 0 1 0 0]
                 RenderBlock (anonymous) at (0,0) size 5x6
                   RenderText {#text} at (0,-2) size 5x10
@@ -180,30 +180,30 @@ layer at (0,0) size 800x531
                 RenderBlock (anonymous) at (0,0) size 4x6
                   RenderText {#text} at (0,-2) size 4x10
                     text run at (0,-2) width 4: "z"
-      RenderBlock {p} at (0,280) size 784x39
-        RenderText {#text} at (0,19) size 77x19
-          text run at (0,19) width 77: "high index: "
-        RenderMathMLMath {math} at (76,0) size 21x36 [padding: 0 1 0 1]
-          RenderMathMLRoot {mroot} at (1,0) size 18x36
-            RenderMathMLToken {mn} at (9,23) size 9x13
+      RenderBlock {p} at (0,271) size 784x34
+        RenderText {#text} at (0,14) size 77x19
+          text run at (0,14) width 77: "high index: "
+        RenderMathMLMath {math} at (76,0) size 21x30 [padding: 0 1 0 1]
+          RenderMathMLRoot {mroot} at (1,0) size 18x30
+            RenderMathMLToken {mn} at (9,17) size 9x13
               RenderBlock (anonymous) at (0,0) size 8x12
                 RenderText {#text} at (0,-1) size 8x17
                   text run at (0,-1) width 8: "2"
-            RenderMathMLFraction {mfrac} at (4,0) size 6x28
-              RenderMathMLFraction {mfrac} at (0,0) size 6x18
+            RenderMathMLFraction {mfrac} at (4,0) size 6x22
+              RenderMathMLFraction {mfrac} at (0,0) size 6x15
                 RenderMathMLToken {mi} at (0,0) size 6x6 [padding: 0 1 0 0]
                   RenderBlock (anonymous) at (0,0) size 5x6
                     RenderText {#text} at (0,-2) size 5x10
                       text run at (0,-2) width 5: "x"
-                RenderMathMLToken {mi} at (0,10) size 6x8 [padding: 0 1 0 0]
+                RenderMathMLToken {mi} at (0,7) size 6x8 [padding: 0 1 0 0]
                   RenderBlock (anonymous) at (0,0) size 5x7
                     RenderText {#text} at (0,-2) size 5x10
                       text run at (0,-2) width 5: "y"
-              RenderMathMLToken {mi} at (0,21) size 6x7 [padding: 0 1 0 0]
+              RenderMathMLToken {mi} at (0,15) size 6x7 [padding: 0 1 0 0]
                 RenderBlock (anonymous) at (0,0) size 4x6
                   RenderText {#text} at (0,-2) size 4x10
                     text run at (0,-2) width 4: "z"
-      RenderBlock {p} at (0,335) size 784x32
+      RenderBlock {p} at (0,321) size 784x32
         RenderText {#text} at (0,12) size 160x19
           text run at (0,12) width 160: "Imbricated square roots: "
         RenderMathMLMath {math} at (159,0) size 254x28 [padding: 0 1 0 1]
@@ -282,86 +282,86 @@ layer at (0,0) size 800x531
                                           RenderText {#text} at (0,-1) size 12x17
                                             text run at (0,-1) width 12: "A"
         RenderText {#text} at (0,0) size 0x0
-      RenderBlock {p} at (0,383) size 784x50
-        RenderText {#text} at (0,30) size 114x19
-          text run at (0,30) width 114: "Imbricated roots: "
-        RenderMathMLMath {math} at (113,0) size 269x46 [padding: 0 1 0 1]
-          RenderMathMLRoot {mroot} at (1,0) size 267x46
-            RenderMathMLRow {mrow} at (8,2) size 259x44
-              RenderMathMLToken {mn} at (0,31) size 8x12
+      RenderBlock {p} at (0,369) size 784x47
+        RenderText {#text} at (0,27) size 114x19
+          text run at (0,27) width 114: "Imbricated roots: "
+        RenderMathMLMath {math} at (113,0) size 269x43 [padding: 0 1 0 1]
+          RenderMathMLRoot {mroot} at (1,0) size 267x43
+            RenderMathMLRow {mrow} at (8,2) size 259x41
+              RenderMathMLToken {mn} at (0,28) size 8x12
                 RenderBlock (anonymous) at (0,0) size 8x12
                   RenderText {#text} at (0,-1) size 8x17
                     text run at (0,-1) width 8: "1"
-              RenderMathMLOperator {mo} at (8,34) size 16x9
+              RenderMathMLOperator {mo} at (8,31) size 16x9
                 RenderBlock (anonymous) at (3,0) size 10x9
                   RenderText {#text} at (0,-4) size 9x17
                     text run at (0,-4) width 9: "+"
-              RenderMathMLRoot {mroot} at (23,0) size 235x43
-                RenderMathMLRow {mrow} at (8,2) size 226x41
-                  RenderMathMLToken {mn} at (0,28) size 8x12
+              RenderMathMLRoot {mroot} at (23,0) size 235x40
+                RenderMathMLRow {mrow} at (8,2) size 226x38
+                  RenderMathMLToken {mn} at (0,25) size 8x12
                     RenderBlock (anonymous) at (0,0) size 8x12
                       RenderText {#text} at (0,-1) size 8x17
                         text run at (0,-1) width 8: "2"
-                  RenderMathMLOperator {mo} at (8,31) size 16x9
+                  RenderMathMLOperator {mo} at (8,28) size 16x9
                     RenderBlock (anonymous) at (3,0) size 10x9
                       RenderText {#text} at (0,-4) size 9x17
                         text run at (0,-4) width 9: "+"
-                  RenderMathMLRoot {mroot} at (23,0) size 202x40
-                    RenderMathMLRow {mrow} at (8,2) size 193x38
-                      RenderMathMLToken {mn} at (0,25) size 8x12
+                  RenderMathMLRoot {mroot} at (23,0) size 202x37
+                    RenderMathMLRow {mrow} at (8,2) size 193x35
+                      RenderMathMLToken {mn} at (0,22) size 8x12
                         RenderBlock (anonymous) at (0,0) size 8x12
                           RenderText {#text} at (0,-1) size 8x17
                             text run at (0,-1) width 8: "3"
-                      RenderMathMLOperator {mo} at (8,28) size 16x9
+                      RenderMathMLOperator {mo} at (8,25) size 16x9
                         RenderBlock (anonymous) at (3,0) size 10x9
                           RenderText {#text} at (0,-4) size 9x17
                             text run at (0,-4) width 9: "+"
-                      RenderMathMLRoot {mroot} at (23,0) size 169x37
-                        RenderMathMLRow {mrow} at (8,2) size 161x35
-                          RenderMathMLToken {mn} at (0,22) size 8x12
+                      RenderMathMLRoot {mroot} at (23,0) size 169x34
+                        RenderMathMLRow {mrow} at (8,2) size 161x32
+                          RenderMathMLToken {mn} at (0,19) size 8x12
                             RenderBlock (anonymous) at (0,0) size 8x12
                               RenderText {#text} at (0,-1) size 8x17
                                 text run at (0,-1) width 8: "4"
-                          RenderMathMLOperator {mo} at (8,25) size 16x9
+                          RenderMathMLOperator {mo} at (8,22) size 16x9
                             RenderBlock (anonymous) at (3,0) size 10x9
                               RenderText {#text} at (0,-4) size 9x17
                                 text run at (0,-4) width 9: "+"
-                          RenderMathMLRoot {mroot} at (23,0) size 137x34
-                            RenderMathMLRow {mrow} at (8,2) size 128x32
-                              RenderMathMLToken {mn} at (0,19) size 8x12
+                          RenderMathMLRoot {mroot} at (23,0) size 137x31
+                            RenderMathMLRow {mrow} at (8,2) size 128x29
+                              RenderMathMLToken {mn} at (0,16) size 8x12
                                 RenderBlock (anonymous) at (0,0) size 8x12
                                   RenderText {#text} at (0,-1) size 8x17
                                     text run at (0,-1) width 8: "5"
-                              RenderMathMLOperator {mo} at (8,22) size 16x9
+                              RenderMathMLOperator {mo} at (8,19) size 16x9
                                 RenderBlock (anonymous) at (3,0) size 10x9
                                   RenderText {#text} at (0,-4) size 9x17
                                     text run at (0,-4) width 9: "+"
-                              RenderMathMLRoot {mroot} at (23,0) size 104x31
-                                RenderMathMLRow {mrow} at (8,2) size 95x29
-                                  RenderMathMLToken {mn} at (0,16) size 8x12
+                              RenderMathMLRoot {mroot} at (23,0) size 104x28
+                                RenderMathMLRow {mrow} at (8,2) size 95x26
+                                  RenderMathMLToken {mn} at (0,13) size 8x12
                                     RenderBlock (anonymous) at (0,0) size 8x12
                                       RenderText {#text} at (0,-1) size 8x17
                                         text run at (0,-1) width 8: "6"
-                                  RenderMathMLOperator {mo} at (8,19) size 16x9
+                                  RenderMathMLOperator {mo} at (8,16) size 16x9
                                     RenderBlock (anonymous) at (3,0) size 10x9
                                       RenderText {#text} at (0,-4) size 9x17
                                         text run at (0,-4) width 9: "+"
-                                  RenderMathMLRoot {mroot} at (23,0) size 71x28
-                                    RenderMathMLRow {mrow} at (8,2) size 62x26
-                                      RenderMathMLToken {mn} at (0,13) size 8x12
+                                  RenderMathMLRoot {mroot} at (23,0) size 71x25
+                                    RenderMathMLRow {mrow} at (8,2) size 62x23
+                                      RenderMathMLToken {mn} at (0,10) size 8x12
                                         RenderBlock (anonymous) at (0,0) size 8x12
                                           RenderText {#text} at (0,-1) size 8x17
                                             text run at (0,-1) width 8: "7"
-                                      RenderMathMLOperator {mo} at (8,16) size 16x9
+                                      RenderMathMLOperator {mo} at (8,13) size 16x9
                                         RenderBlock (anonymous) at (3,0) size 10x9
                                           RenderText {#text} at (0,-4) size 9x17
                                             text run at (0,-4) width 9: "+"
-                                      RenderMathMLRoot {mroot} at (23,0) size 39x25
-                                        RenderMathMLToken {mi} at (24,13) size 14x12 [padding: 0 2 0 0]
+                                      RenderMathMLRoot {mroot} at (23,0) size 39x23
+                                        RenderMathMLToken {mi} at (24,10) size 14x13 [padding: 0 2 0 0]
                                           RenderBlock (anonymous) at (0,0) size 12x12
                                             RenderText {#text} at (0,-1) size 12x17
                                               text run at (0,-1) width 12: "A"
-                                        RenderMathMLFraction {mfrac} at (4,0) size 21x18
+                                        RenderMathMLFraction {mfrac} at (4,0) size 21x15
                                           RenderMathMLRow {mrow} at (0,0) size 20x7
                                             RenderMathMLToken {mi} at (0,0) size 6x6 [padding: 0 1 0 0]
                                               RenderBlock (anonymous) at (0,0) size 5x6
@@ -375,119 +375,119 @@ layer at (0,0) size 800x531
                                               RenderBlock (anonymous) at (0,0) size 5x7
                                                 RenderText {#text} at (0,-2) size 5x10
                                                   text run at (0,-2) width 5: "y"
-                                          RenderMathMLToken {mi} at (7,11) size 6x7 [padding: 0 1 0 0]
+                                          RenderMathMLToken {mi} at (7,8) size 6x7 [padding: 0 1 0 0]
                                             RenderBlock (anonymous) at (0,0) size 4x6
                                               RenderText {#text} at (0,-2) size 4x10
                                                 text run at (0,-2) width 4: "z"
-                                    RenderMathMLToken {mn} at (4,4) size 5x9
+                                    RenderMathMLToken {mn} at (4,3) size 5x9
                                       RenderBlock (anonymous) at (0,0) size 5x8
                                         RenderText {#text} at (0,0) size 5x10
                                           text run at (0,0) width 5: "9"
-                                RenderMathMLToken {mn} at (4,5) size 5x9
+                                RenderMathMLToken {mn} at (4,4) size 5x9
                                   RenderBlock (anonymous) at (0,0) size 5x8
                                     RenderText {#text} at (0,0) size 5x10
                                       text run at (0,0) width 5: "8"
-                            RenderMathMLToken {mn} at (4,8) size 5x7
+                            RenderMathMLToken {mn} at (4,6) size 5x8
                               RenderBlock (anonymous) at (0,0) size 5x7
                                 RenderText {#text} at (0,-1) size 5x10
                                   text run at (0,-1) width 5: "7"
-                        RenderMathMLToken {mn} at (4,8) size 5x9
+                        RenderMathMLToken {mn} at (4,7) size 5x8
                           RenderBlock (anonymous) at (0,0) size 5x8
                             RenderText {#text} at (0,0) size 5x10
                               text run at (0,0) width 5: "6"
-                    RenderMathMLToken {mn} at (4,9) size 5x9
+                    RenderMathMLToken {mn} at (4,8) size 5x9
                       RenderBlock (anonymous) at (0,0) size 5x8
                         RenderText {#text} at (0,0) size 5x10
                           text run at (0,0) width 5: "5"
-                RenderMathMLToken {mn} at (4,10) size 5x9
+                RenderMathMLToken {mn} at (4,9) size 5x9
                   RenderBlock (anonymous) at (0,0) size 5x8
                     RenderText {#text} at (0,0) size 5x10
                       text run at (0,0) width 5: "4"
-            RenderMathMLToken {mn} at (4,11) size 5x9
+            RenderMathMLToken {mn} at (4,10) size 5x9
               RenderBlock (anonymous) at (0,0) size 5x8
                 RenderText {#text} at (0,0) size 5x10
                   text run at (0,0) width 5: "3"
         RenderText {#text} at (0,0) size 0x0
-      RenderBlock {p} at (0,449) size 784x50
-        RenderText {#text} at (0,30) size 74x19
-          text run at (0,30) width 74: "RTL roots: "
-        RenderMathMLMath {math} at (73,0) size 269x46 [padding: 0 1 0 1]
-          RenderMathMLRoot {mroot} at (1,0) size 267x46
-            RenderMathMLRow {mrow} at (0,2) size 258x44
-              RenderMathMLToken {mn} at (249,31) size 9x12
+      RenderBlock {p} at (0,432) size 784x47
+        RenderText {#text} at (0,27) size 74x19
+          text run at (0,27) width 74: "RTL roots: "
+        RenderMathMLMath {math} at (73,0) size 269x43 [padding: 0 1 0 1]
+          RenderMathMLRoot {mroot} at (1,0) size 267x43
+            RenderMathMLRow {mrow} at (0,2) size 258x41
+              RenderMathMLToken {mn} at (249,28) size 9x12
                 RenderBlock (anonymous) at (0,0) size 8x12
                   RenderText {#text} at (0,-1) size 8x17
                     text run at (0,-1) width 8: "1"
-              RenderMathMLOperator {mo} at (233,34) size 17x9
+              RenderMathMLOperator {mo} at (233,31) size 17x9
                 RenderBlock (anonymous) at (3,0) size 10x9
                   RenderText {#text} at (0,-4) size 9x17
                     text run at (0,-4) width 9 RTL: "+"
-              RenderMathMLRoot {mroot} at (0,0) size 234x43
-                RenderMathMLRow {mrow} at (0,2) size 225x41
-                  RenderMathMLToken {mn} at (216,28) size 9x12
+              RenderMathMLRoot {mroot} at (0,0) size 234x40
+                RenderMathMLRow {mrow} at (0,2) size 225x38
+                  RenderMathMLToken {mn} at (216,25) size 9x12
                     RenderBlock (anonymous) at (0,0) size 8x12
                       RenderText {#text} at (0,-1) size 8x17
                         text run at (0,-1) width 8: "2"
-                  RenderMathMLOperator {mo} at (200,31) size 17x9
+                  RenderMathMLOperator {mo} at (200,28) size 17x9
                     RenderBlock (anonymous) at (3,0) size 10x9
                       RenderText {#text} at (0,-4) size 9x17
                         text run at (0,-4) width 9 RTL: "+"
-                  RenderMathMLRoot {mroot} at (0,0) size 201x40
-                    RenderMathMLRow {mrow} at (0,2) size 192x38
-                      RenderMathMLToken {mn} at (183,25) size 9x12
+                  RenderMathMLRoot {mroot} at (0,0) size 201x37
+                    RenderMathMLRow {mrow} at (0,2) size 192x35
+                      RenderMathMLToken {mn} at (183,22) size 9x12
                         RenderBlock (anonymous) at (0,0) size 8x12
                           RenderText {#text} at (0,-1) size 8x17
                             text run at (0,-1) width 8: "3"
-                      RenderMathMLOperator {mo} at (168,28) size 16x9
+                      RenderMathMLOperator {mo} at (168,25) size 16x9
                         RenderBlock (anonymous) at (3,0) size 10x9
                           RenderText {#text} at (0,-4) size 9x17
                             text run at (0,-4) width 9 RTL: "+"
-                      RenderMathMLRoot {mroot} at (0,0) size 169x37
-                        RenderMathMLRow {mrow} at (0,2) size 160x35
-                          RenderMathMLToken {mn} at (151,22) size 9x12
+                      RenderMathMLRoot {mroot} at (0,0) size 169x34
+                        RenderMathMLRow {mrow} at (0,2) size 160x32
+                          RenderMathMLToken {mn} at (151,19) size 9x12
                             RenderBlock (anonymous) at (0,0) size 8x12
                               RenderText {#text} at (0,-1) size 8x17
                                 text run at (0,-1) width 8: "4"
-                          RenderMathMLOperator {mo} at (135,25) size 17x9
+                          RenderMathMLOperator {mo} at (135,22) size 17x9
                             RenderBlock (anonymous) at (3,0) size 10x9
                               RenderText {#text} at (0,-4) size 9x17
                                 text run at (0,-4) width 9 RTL: "+"
-                          RenderMathMLRoot {mroot} at (0,0) size 136x34
-                            RenderMathMLRow {mrow} at (0,2) size 127x32
-                              RenderMathMLToken {mn} at (118,19) size 9x12
+                          RenderMathMLRoot {mroot} at (0,0) size 136x31
+                            RenderMathMLRow {mrow} at (0,2) size 127x29
+                              RenderMathMLToken {mn} at (118,16) size 9x12
                                 RenderBlock (anonymous) at (0,0) size 8x12
                                   RenderText {#text} at (0,-1) size 8x17
                                     text run at (0,-1) width 8: "5"
-                              RenderMathMLOperator {mo} at (102,22) size 17x9
+                              RenderMathMLOperator {mo} at (102,19) size 17x9
                                 RenderBlock (anonymous) at (3,0) size 10x9
                                   RenderText {#text} at (0,-4) size 9x17
                                     text run at (0,-4) width 9 RTL: "+"
-                              RenderMathMLRoot {mroot} at (0,0) size 103x31
-                                RenderMathMLRow {mrow} at (0,2) size 94x29
-                                  RenderMathMLToken {mn} at (85,16) size 9x12
+                              RenderMathMLRoot {mroot} at (0,0) size 103x28
+                                RenderMathMLRow {mrow} at (0,2) size 94x26
+                                  RenderMathMLToken {mn} at (85,13) size 9x12
                                     RenderBlock (anonymous) at (0,0) size 8x12
                                       RenderText {#text} at (0,-1) size 8x17
                                         text run at (0,-1) width 8: "6"
-                                  RenderMathMLOperator {mo} at (69,19) size 17x9
+                                  RenderMathMLOperator {mo} at (69,16) size 17x9
                                     RenderBlock (anonymous) at (3,0) size 10x9
                                       RenderText {#text} at (0,-4) size 9x17
                                         text run at (0,-4) width 9 RTL: "+"
-                                  RenderMathMLRoot {mroot} at (0,0) size 70x28
-                                    RenderMathMLRow {mrow} at (0,2) size 62x26
-                                      RenderMathMLToken {mn} at (53,13) size 9x12
+                                  RenderMathMLRoot {mroot} at (0,0) size 70x25
+                                    RenderMathMLRow {mrow} at (0,2) size 62x23
+                                      RenderMathMLToken {mn} at (53,10) size 9x12
                                         RenderBlock (anonymous) at (0,0) size 8x12
                                           RenderText {#text} at (0,-1) size 8x17
                                             text run at (0,-1) width 8: "7"
-                                      RenderMathMLOperator {mo} at (37,16) size 17x9
+                                      RenderMathMLOperator {mo} at (37,13) size 17x9
                                         RenderBlock (anonymous) at (3,0) size 10x9
                                           RenderText {#text} at (0,-4) size 9x17
                                             text run at (0,-4) width 9 RTL: "+"
-                                      RenderMathMLRoot {mroot} at (0,0) size 38x25
-                                        RenderMathMLToken {mi} at (0,13) size 14x12 [padding: 0 0 0 2]
+                                      RenderMathMLRoot {mroot} at (0,0) size 38x23
+                                        RenderMathMLToken {mi} at (0,10) size 14x13 [padding: 0 0 0 2]
                                           RenderBlock (anonymous) at (1,0) size 13x12
                                             RenderText {#text} at (0,-1) size 12x17
                                               text run at (0,-1) width 12: "A"
-                                        RenderMathMLFraction {mfrac} at (13,0) size 20x18
+                                        RenderMathMLFraction {mfrac} at (13,0) size 20x15
                                           RenderMathMLRow {mrow} at (0,0) size 20x7
                                             RenderMathMLToken {mi} at (14,0) size 6x6 [padding: 0 0 0 1]
                                               RenderBlock (anonymous) at (0,0) size 6x6
@@ -501,35 +501,35 @@ layer at (0,0) size 800x531
                                               RenderBlock (anonymous) at (0,0) size 6x7
                                                 RenderText {#text} at (0,-2) size 5x10
                                                   text run at (0,-2) width 5: "y"
-                                          RenderMathMLToken {mi} at (7,11) size 6x7 [padding: 0 0 0 1]
+                                          RenderMathMLToken {mi} at (7,8) size 6x7 [padding: 0 0 0 1]
                                             RenderBlock (anonymous) at (0,0) size 5x6
                                               RenderText {#text} at (0,-2) size 4x10
                                                 text run at (0,-2) width 4: "z"
-                                    RenderMathMLToken {mn} at (61,4) size 5x9
+                                    RenderMathMLToken {mn} at (61,3) size 5x9
                                       RenderBlock (anonymous) at (0,0) size 5x8
                                         RenderText {#text} at (0,0) size 5x10
                                           text run at (0,0) width 5: "9"
-                                RenderMathMLToken {mn} at (93,5) size 6x9
+                                RenderMathMLToken {mn} at (93,4) size 6x9
                                   RenderBlock (anonymous) at (0,0) size 5x8
                                     RenderText {#text} at (0,0) size 5x10
                                       text run at (0,0) width 5: "8"
-                            RenderMathMLToken {mn} at (126,8) size 5x7
+                            RenderMathMLToken {mn} at (126,6) size 5x8
                               RenderBlock (anonymous) at (0,0) size 5x7
                                 RenderText {#text} at (0,-1) size 5x10
                                   text run at (0,-1) width 5: "7"
-                        RenderMathMLToken {mn} at (159,8) size 5x9
+                        RenderMathMLToken {mn} at (159,7) size 5x8
                           RenderBlock (anonymous) at (0,0) size 5x8
                             RenderText {#text} at (0,0) size 5x10
                               text run at (0,0) width 5: "6"
-                    RenderMathMLToken {mn} at (191,9) size 6x9
+                    RenderMathMLToken {mn} at (191,8) size 6x9
                       RenderBlock (anonymous) at (0,0) size 5x8
                         RenderText {#text} at (0,0) size 5x10
                           text run at (0,0) width 5: "5"
-                RenderMathMLToken {mn} at (224,10) size 6x9
+                RenderMathMLToken {mn} at (224,9) size 6x9
                   RenderBlock (anonymous) at (0,0) size 5x8
                     RenderText {#text} at (0,0) size 5x10
                       text run at (0,0) width 5: "4"
-            RenderMathMLToken {mn} at (257,11) size 5x9
+            RenderMathMLToken {mn} at (257,10) size 5x9
               RenderBlock (anonymous) at (0,0) size 5x8
                 RenderText {#text} at (0,0) size 5x10
                   text run at (0,0) width 5: "3"
index 84f914a..1f7bcf9 100644 (file)
@@ -1,8 +1,8 @@
 layer at (0,0) size 800x600
   RenderView at (0,0) size 800x600
-layer at (0,0) size 800x514
-  RenderBlock {html} at (0,0) size 800x514
-    RenderBody {body} at (8,16) size 784x482
+layer at (0,0) size 800x494
+  RenderBlock {html} at (0,0) size 800x494
+    RenderBody {body} at (8,16) size 784x462
       RenderBlock {p} at (0,0) size 784x20
         RenderText {#text} at (0,0) size 181x18
           text run at (0,0) width 181: "square root (should be red): "
@@ -52,12 +52,12 @@ layer at (0,0) size 800x514
               RenderBlock (anonymous) at (0,0) size 8x12
                 RenderText {#text} at (0,-6) size 8x24
                   text run at (0,-6) width 8: "1"
-      RenderBlock {p} at (0,110) size 784x32
-        RenderText {#text} at (0,7) size 117x18
-          text run at (0,7) width 117: "root of a fraction: "
-        RenderMathMLMath {math} at (116,0) size 53x33 [padding: 0 1 0 1]
-          RenderMathMLRoot {msqrt} at (1,0) size 50x33
-            RenderMathMLFraction {mfrac} at (14,1) size 36x32
+      RenderBlock {p} at (0,110) size 784x28
+        RenderText {#text} at (0,5) size 117x18
+          text run at (0,5) width 117: "root of a fraction: "
+        RenderMathMLMath {math} at (116,0) size 53x29 [padding: 0 1 0 1]
+          RenderMathMLRoot {msqrt} at (1,0) size 50x29
+            RenderMathMLFraction {mfrac} at (14,1) size 36x28
               RenderMathMLRow {mrow} at (0,0) size 35x12
                 RenderMathMLToken {mi} at (0,4) size 9x8 [padding: 0 2 0 0]
                   RenderBlock (anonymous) at (0,0) size 8x9
@@ -71,7 +71,7 @@ layer at (0,0) size 800x514
                   RenderBlock (anonymous) at (0,0) size 8x12
                     RenderText {#text} at (0,-6) size 8x24
                       text run at (0,-6) width 8: "1"
-              RenderMathMLRow {mrow} at (0,19) size 35x13
+              RenderMathMLRow {mrow} at (0,14) size 35x13
                 RenderMathMLToken {mi} at (0,4) size 9x8 [padding: 0 2 0 0]
                   RenderBlock (anonymous) at (0,0) size 8x9
                     RenderText {#text} at (0,-9) size 8x24
@@ -84,7 +84,7 @@ layer at (0,0) size 800x514
                   RenderBlock (anonymous) at (0,0) size 8x12
                     RenderText {#text} at (0,-6) size 8x24
                       text run at (0,-6) width 8: "2"
-      RenderBlock {p} at (0,158) size 784x20
+      RenderBlock {p} at (0,154) size 784x20
         RenderText {#text} at (0,0) size 177x18
           text run at (0,0) width 177: "cube root (should be blue): "
         RenderMathMLMath {math} at (176,0) size 26x21 [color=#0000FF] [padding: 0 1 0 1]
@@ -97,7 +97,7 @@ layer at (0,0) size 800x514
               RenderBlock (anonymous) at (0,0) size 5x8
                 RenderText {#text} at (0,-2) size 5x13
                   text run at (0,-2) width 5: "3"
-      RenderBlock {p} at (0,194) size 784x20
+      RenderBlock {p} at (0,190) size 784x20
         RenderText {#text} at (0,0) size 77x18
           text run at (0,0) width 77: "long index: "
         RenderMathMLMath {math} at (76,0) size 56x21 [padding: 0 1 0 1]
@@ -127,12 +127,12 @@ layer at (0,0) size 800x514
                 RenderBlock (anonymous) at (0,0) size 4x6
                   RenderText {#text} at (0,-4) size 4x13
                     text run at (0,-4) width 4: "z"
-      RenderBlock {p} at (0,230) size 784x33
-        RenderText {#text} at (0,8) size 188x18
-          text run at (0,8) width 188: "long index w/ complex base: "
-        RenderMathMLMath {math} at (187,0) size 83x34 [padding: 0 1 0 1]
-          RenderMathMLRoot {mroot} at (1,0) size 80x34
-            RenderMathMLFraction {mfrac} at (44,2) size 36x32
+      RenderBlock {p} at (0,226) size 784x28
+        RenderText {#text} at (0,6) size 188x18
+          text run at (0,6) width 188: "long index w/ complex base: "
+        RenderMathMLMath {math} at (187,0) size 83x29 [padding: 0 1 0 1]
+          RenderMathMLRoot {mroot} at (1,0) size 80x29
+            RenderMathMLFraction {mfrac} at (44,2) size 36x27
               RenderMathMLRow {mrow} at (0,0) size 35x12
                 RenderMathMLToken {mi} at (0,4) size 9x8 [padding: 0 2 0 0]
                   RenderBlock (anonymous) at (0,0) size 8x9
@@ -146,7 +146,7 @@ layer at (0,0) size 800x514
                   RenderBlock (anonymous) at (0,0) size 8x12
                     RenderText {#text} at (0,-6) size 8x24
                       text run at (0,-6) width 8: "1"
-              RenderMathMLRow {mrow} at (0,19) size 35x13
+              RenderMathMLRow {mrow} at (0,14) size 35x13
                 RenderMathMLToken {mi} at (0,4) size 9x8 [padding: 0 2 0 0]
                   RenderBlock (anonymous) at (0,0) size 8x9
                     RenderText {#text} at (0,-9) size 8x24
@@ -159,7 +159,7 @@ layer at (0,0) size 800x514
                   RenderBlock (anonymous) at (0,0) size 8x12
                     RenderText {#text} at (0,-6) size 8x24
                       text run at (0,-6) width 8: "2"
-            RenderMathMLRow {mrow} at (4,8) size 35x8
+            RenderMathMLRow {mrow} at (4,6) size 35x8
               RenderMathMLToken {mi} at (0,1) size 5x5 [padding: 0 1 0 0]
                 RenderBlock (anonymous) at (0,0) size 5x6
                   RenderText {#text} at (0,-4) size 5x13
@@ -180,30 +180,30 @@ layer at (0,0) size 800x514
                 RenderBlock (anonymous) at (0,0) size 4x6
                   RenderText {#text} at (0,-4) size 4x13
                     text run at (0,-4) width 4: "z"
-      RenderBlock {p} at (0,279) size 784x33
-        RenderText {#text} at (0,13) size 77x18
-          text run at (0,13) width 77: "high index: "
-        RenderMathMLMath {math} at (76,0) size 26x34 [padding: 0 1 0 1]
-          RenderMathMLRoot {mroot} at (1,0) size 24x34
-            RenderMathMLToken {mn} at (15,15) size 9x13
+      RenderBlock {p} at (0,270) size 784x28
+        RenderText {#text} at (0,7) size 77x18
+          text run at (0,7) width 77: "high index: "
+        RenderMathMLMath {math} at (76,0) size 26x29 [padding: 0 1 0 1]
+          RenderMathMLRoot {mroot} at (1,0) size 24x29
+            RenderMathMLToken {mn} at (15,10) size 9x13
               RenderBlock (anonymous) at (0,0) size 8x12
                 RenderText {#text} at (0,-6) size 8x24
                   text run at (0,-6) width 8: "2"
-            RenderMathMLFraction {mfrac} at (4,0) size 6x22
-              RenderMathMLFraction {mfrac} at (0,0) size 5x14
+            RenderMathMLFraction {mfrac} at (4,0) size 6x17
+              RenderMathMLFraction {mfrac} at (0,0) size 5x11
                 RenderMathMLToken {mi} at (0,0) size 5x5 [padding: 0 1 0 0]
                   RenderBlock (anonymous) at (0,0) size 5x6
                     RenderText {#text} at (0,-4) size 5x13
                       text run at (0,-4) width 5: "x"
-                RenderMathMLToken {mi} at (0,8) size 5x6 [padding: 0 1 0 0]
+                RenderMathMLToken {mi} at (0,5) size 5x6 [padding: 0 1 0 0]
                   RenderBlock (anonymous) at (0,0) size 5x7
                     RenderText {#text} at (0,-4) size 5x13
                       text run at (0,-4) width 5: "y"
-              RenderMathMLToken {mi} at (0,17) size 5x5 [padding: 0 1 0 0]
+              RenderMathMLToken {mi} at (0,12) size 5x5 [padding: 0 1 0 0]
                 RenderBlock (anonymous) at (0,0) size 4x6
                   RenderText {#text} at (0,-4) size 4x13
                     text run at (0,-4) width 4: "z"
-      RenderBlock {p} at (0,328) size 784x32
+      RenderBlock {p} at (0,314) size 784x32
         RenderText {#text} at (0,13) size 160x18
           text run at (0,13) width 160: "Imbricated square roots: "
         RenderMathMLMath {math} at (159,0) size 316x33 [padding: 0 1 0 1]
@@ -282,86 +282,86 @@ layer at (0,0) size 800x514
                                           RenderText {#text} at (0,-6) size 12x24
                                             text run at (0,-6) width 12: "A"
         RenderText {#text} at (0,0) size 0x0
-      RenderBlock {p} at (0,376) size 784x45
-        RenderText {#text} at (0,27) size 114x18
-          text run at (0,27) width 114: "Imbricated roots: "
-        RenderMathMLMath {math} at (113,0) size 331x45 [padding: 0 1 0 1]
-          RenderMathMLRoot {mroot} at (1,0) size 329x45
-            RenderMathMLRow {mrow} at (14,2) size 315x43
-              RenderMathMLToken {mn} at (0,27) size 8x12
+      RenderBlock {p} at (0,362) size 784x42
+        RenderText {#text} at (0,24) size 114x18
+          text run at (0,24) width 114: "Imbricated roots: "
+        RenderMathMLMath {math} at (113,0) size 331x42 [padding: 0 1 0 1]
+          RenderMathMLRoot {mroot} at (1,0) size 329x42
+            RenderMathMLRow {mrow} at (14,2) size 315x40
+              RenderMathMLToken {mn} at (0,24) size 8x12
                 RenderBlock (anonymous) at (0,0) size 8x12
                   RenderText {#text} at (0,-6) size 8x24
                     text run at (0,-6) width 8: "1"
-              RenderMathMLOperator {mo} at (8,29) size 19x10
+              RenderMathMLOperator {mo} at (8,26) size 19x10
                 RenderBlock (anonymous) at (3,0) size 12x10
                   RenderText {#text} at (0,-8) size 11x24
                     text run at (0,-8) width 11: "+"
-              RenderMathMLRoot {mroot} at (26,0) size 288x43
-                RenderMathMLRow {mrow} at (14,2) size 274x41
-                  RenderMathMLToken {mn} at (0,24) size 8x12
+              RenderMathMLRoot {mroot} at (26,0) size 288x40
+                RenderMathMLRow {mrow} at (14,2) size 274x38
+                  RenderMathMLToken {mn} at (0,21) size 8x12
                     RenderBlock (anonymous) at (0,0) size 8x12
                       RenderText {#text} at (0,-6) size 8x24
                         text run at (0,-6) width 8: "2"
-                  RenderMathMLOperator {mo} at (8,26) size 19x10
+                  RenderMathMLOperator {mo} at (8,23) size 19x10
                     RenderBlock (anonymous) at (3,0) size 12x10
                       RenderText {#text} at (0,-8) size 11x24
                         text run at (0,-8) width 11: "+"
-                  RenderMathMLRoot {mroot} at (26,0) size 247x40
-                    RenderMathMLRow {mrow} at (14,2) size 233x38
-                      RenderMathMLToken {mn} at (0,21) size 8x12
+                  RenderMathMLRoot {mroot} at (26,0) size 247x37
+                    RenderMathMLRow {mrow} at (14,2) size 233x35
+                      RenderMathMLToken {mn} at (0,18) size 8x12
                         RenderBlock (anonymous) at (0,0) size 8x12
                           RenderText {#text} at (0,-6) size 8x24
                             text run at (0,-6) width 8: "3"
-                      RenderMathMLOperator {mo} at (8,23) size 19x10
+                      RenderMathMLOperator {mo} at (8,20) size 19x10
                         RenderBlock (anonymous) at (3,0) size 12x10
                           RenderText {#text} at (0,-8) size 11x24
                             text run at (0,-8) width 11: "+"
-                      RenderMathMLRoot {mroot} at (26,0) size 206x37
-                        RenderMathMLRow {mrow} at (14,2) size 192x35
-                          RenderMathMLToken {mn} at (0,18) size 8x12
+                      RenderMathMLRoot {mroot} at (26,0) size 206x35
+                        RenderMathMLRow {mrow} at (14,2) size 192x33
+                          RenderMathMLToken {mn} at (0,15) size 8x12
                             RenderBlock (anonymous) at (0,0) size 8x12
                               RenderText {#text} at (0,-6) size 8x24
                                 text run at (0,-6) width 8: "4"
-                          RenderMathMLOperator {mo} at (8,20) size 19x10
+                          RenderMathMLOperator {mo} at (8,17) size 19x10
                             RenderBlock (anonymous) at (3,0) size 12x10
                               RenderText {#text} at (0,-8) size 11x24
                                 text run at (0,-8) width 11: "+"
-                          RenderMathMLRoot {mroot} at (26,0) size 165x35
-                            RenderMathMLRow {mrow} at (14,2) size 151x33
-                              RenderMathMLToken {mn} at (0,14) size 8x13
+                          RenderMathMLRoot {mroot} at (26,0) size 165x32
+                            RenderMathMLRow {mrow} at (14,2) size 151x30
+                              RenderMathMLToken {mn} at (0,11) size 8x13
                                 RenderBlock (anonymous) at (0,0) size 8x13
                                   RenderText {#text} at (0,-5) size 8x24
                                     text run at (0,-5) width 8: "5"
-                              RenderMathMLOperator {mo} at (8,17) size 19x10
+                              RenderMathMLOperator {mo} at (8,14) size 19x10
                                 RenderBlock (anonymous) at (3,0) size 12x10
                                   RenderText {#text} at (0,-8) size 11x24
                                     text run at (0,-8) width 11: "+"
-                              RenderMathMLRoot {mroot} at (26,0) size 124x32
-                                RenderMathMLRow {mrow} at (14,2) size 110x30
-                                  RenderMathMLToken {mn} at (0,12) size 8x12
+                              RenderMathMLRoot {mroot} at (26,0) size 124x30
+                                RenderMathMLRow {mrow} at (14,2) size 110x28
+                                  RenderMathMLToken {mn} at (0,9) size 8x12
                                     RenderBlock (anonymous) at (0,0) size 8x12
                                       RenderText {#text} at (0,-6) size 8x24
                                         text run at (0,-6) width 8: "6"
-                                  RenderMathMLOperator {mo} at (8,14) size 19x10
+                                  RenderMathMLOperator {mo} at (8,11) size 19x10
                                     RenderBlock (anonymous) at (3,0) size 12x10
                                       RenderText {#text} at (0,-8) size 11x24
                                         text run at (0,-8) width 11: "+"
-                                  RenderMathMLRoot {mroot} at (26,0) size 83x30
-                                    RenderMathMLRow {mrow} at (14,2) size 69x28
-                                      RenderMathMLToken {mn} at (0,9) size 8x12
+                                  RenderMathMLRoot {mroot} at (26,0) size 83x27
+                                    RenderMathMLRow {mrow} at (14,2) size 69x25
+                                      RenderMathMLToken {mn} at (0,6) size 8x12
                                         RenderBlock (anonymous) at (0,0) size 8x12
                                           RenderText {#text} at (0,-6) size 8x24
                                             text run at (0,-6) width 8: "7"
-                                      RenderMathMLOperator {mo} at (8,11) size 19x10
+                                      RenderMathMLOperator {mo} at (8,8) size 19x10
                                         RenderBlock (anonymous) at (3,0) size 12x10
                                           RenderText {#text} at (0,-8) size 11x24
                                             text run at (0,-8) width 11: "+"
-                                      RenderMathMLRoot {mroot} at (26,0) size 42x27
-                                        RenderMathMLToken {mi} at (29,8) size 13x12 [padding: 0 2 0 0]
+                                      RenderMathMLRoot {mroot} at (26,0) size 42x24
+                                        RenderMathMLToken {mi} at (29,5) size 13x12 [padding: 0 2 0 0]
                                           RenderBlock (anonymous) at (0,0) size 12x12
                                             RenderText {#text} at (0,-6) size 12x24
                                               text run at (0,-6) width 12: "A"
-                                        RenderMathMLFraction {mfrac} at (4,0) size 20x15
+                                        RenderMathMLFraction {mfrac} at (4,0) size 20x13
                                           RenderMathMLRow {mrow} at (0,0) size 20x7
                                             RenderMathMLToken {mi} at (0,1) size 5x5 [padding: 0 1 0 0]
                                               RenderBlock (anonymous) at (0,0) size 5x6
@@ -375,119 +375,119 @@ layer at (0,0) size 800x514
                                               RenderBlock (anonymous) at (0,0) size 5x7
                                                 RenderText {#text} at (0,-4) size 5x13
                                                   text run at (0,-4) width 5: "y"
-                                          RenderMathMLToken {mi} at (7,10) size 6x5 [padding: 0 1 0 0]
+                                          RenderMathMLToken {mi} at (7,7) size 6x6 [padding: 0 1 0 0]
                                             RenderBlock (anonymous) at (0,0) size 4x6
                                               RenderText {#text} at (0,-4) size 4x13
                                                 text run at (0,-4) width 4: "z"
-                                    RenderMathMLToken {mn} at (4,5) size 5x9
+                                    RenderMathMLToken {mn} at (4,4) size 5x9
                                       RenderBlock (anonymous) at (0,0) size 5x8
                                         RenderText {#text} at (0,-2) size 5x13
                                           text run at (0,-2) width 5: "9"
-                                RenderMathMLToken {mn} at (4,6) size 5x9
+                                RenderMathMLToken {mn} at (4,5) size 5x9
                                   RenderBlock (anonymous) at (0,0) size 5x8
                                     RenderText {#text} at (0,-2) size 5x13
                                       text run at (0,-2) width 5: "8"
-                            RenderMathMLToken {mn} at (4,8) size 5x8
+                            RenderMathMLToken {mn} at (4,7) size 5x8
                               RenderBlock (anonymous) at (0,0) size 5x7
                                 RenderText {#text} at (0,-3) size 5x13
                                   text run at (0,-3) width 5: "7"
-                        RenderMathMLToken {mn} at (4,8) size 5x9
+                        RenderMathMLToken {mn} at (4,7) size 5x9
                           RenderBlock (anonymous) at (0,0) size 5x8
                             RenderText {#text} at (0,-2) size 5x13
                               text run at (0,-2) width 5: "6"
-                    RenderMathMLToken {mn} at (4,9) size 5x9
+                    RenderMathMLToken {mn} at (4,8) size 5x9
                       RenderBlock (anonymous) at (0,0) size 5x8
                         RenderText {#text} at (0,-2) size 5x13
                           text run at (0,-2) width 5: "5"
-                RenderMathMLToken {mn} at (4,10) size 5x9
+                RenderMathMLToken {mn} at (4,9) size 5x9
                   RenderBlock (anonymous) at (0,0) size 5x8
                     RenderText {#text} at (0,-2) size 5x13
                       text run at (0,-2) width 5: "4"
-            RenderMathMLToken {mn} at (4,11) size 5x9
+            RenderMathMLToken {mn} at (4,10) size 5x9
               RenderBlock (anonymous) at (0,0) size 5x8
                 RenderText {#text} at (0,-2) size 5x13
                   text run at (0,-2) width 5: "3"
         RenderText {#text} at (0,0) size 0x0
-      RenderBlock {p} at (0,437) size 784x45
-        RenderText {#text} at (0,27) size 74x18
-          text run at (0,27) width 74: "RTL roots: "
-        RenderMathMLMath {math} at (73,0) size 331x45 [padding: 0 1 0 1]
-          RenderMathMLRoot {mroot} at (1,0) size 329x45
-            RenderMathMLRow {mrow} at (0,2) size 314x43
-              RenderMathMLToken {mn} at (305,27) size 9x12
+      RenderBlock {p} at (0,420) size 784x42
+        RenderText {#text} at (0,24) size 74x18
+          text run at (0,24) width 74: "RTL roots: "
+        RenderMathMLMath {math} at (73,0) size 331x42 [padding: 0 1 0 1]
+          RenderMathMLRoot {mroot} at (1,0) size 329x42
+            RenderMathMLRow {mrow} at (0,2) size 314x40
+              RenderMathMLToken {mn} at (305,24) size 9x12
                 RenderBlock (anonymous) at (0,0) size 8x12
                   RenderText {#text} at (0,-6) size 8x24
                     text run at (0,-6) width 8: "1"
-              RenderMathMLOperator {mo} at (287,29) size 19x10
+              RenderMathMLOperator {mo} at (287,26) size 19x10
                 RenderBlock (anonymous) at (3,0) size 12x10
                   RenderText {#text} at (0,-8) size 11x24
                     text run at (0,-8) width 11 RTL: "+"
-              RenderMathMLRoot {mroot} at (0,0) size 288x43
-                RenderMathMLRow {mrow} at (0,2) size 273x41
-                  RenderMathMLToken {mn} at (264,24) size 9x12
+              RenderMathMLRoot {mroot} at (0,0) size 288x40
+                RenderMathMLRow {mrow} at (0,2) size 273x38
+                  RenderMathMLToken {mn} at (264,21) size 9x12
                     RenderBlock (anonymous) at (0,0) size 8x12
                       RenderText {#text} at (0,-6) size 8x24
                         text run at (0,-6) width 8: "2"
-                  RenderMathMLOperator {mo} at (246,26) size 19x10
+                  RenderMathMLOperator {mo} at (246,23) size 19x10
                     RenderBlock (anonymous) at (3,0) size 12x10
                       RenderText {#text} at (0,-8) size 11x24
                         text run at (0,-8) width 11 RTL: "+"
-                  RenderMathMLRoot {mroot} at (0,0) size 247x40
-                    RenderMathMLRow {mrow} at (0,2) size 232x38
-                      RenderMathMLToken {mn} at (223,21) size 9x12
+                  RenderMathMLRoot {mroot} at (0,0) size 247x37
+                    RenderMathMLRow {mrow} at (0,2) size 232x35
+                      RenderMathMLToken {mn} at (223,18) size 9x12
                         RenderBlock (anonymous) at (0,0) size 8x12
                           RenderText {#text} at (0,-6) size 8x24
                             text run at (0,-6) width 8: "3"
-                      RenderMathMLOperator {mo} at (205,23) size 19x10
+                      RenderMathMLOperator {mo} at (205,20) size 19x10
                         RenderBlock (anonymous) at (3,0) size 12x10
                           RenderText {#text} at (0,-8) size 11x24
                             text run at (0,-8) width 11 RTL: "+"
-                      RenderMathMLRoot {mroot} at (0,0) size 206x37
-                        RenderMathMLRow {mrow} at (0,2) size 191x35
-                          RenderMathMLToken {mn} at (182,18) size 9x12
+                      RenderMathMLRoot {mroot} at (0,0) size 206x35
+                        RenderMathMLRow {mrow} at (0,2) size 191x33
+                          RenderMathMLToken {mn} at (182,15) size 9x12
                             RenderBlock (anonymous) at (0,0) size 8x12
                               RenderText {#text} at (0,-6) size 8x24
                                 text run at (0,-6) width 8: "4"
-                          RenderMathMLOperator {mo} at (164,20) size 19x10
+                          RenderMathMLOperator {mo} at (164,17) size 19x10
                             RenderBlock (anonymous) at (3,0) size 12x10
                               RenderText {#text} at (0,-8) size 11x24
                                 text run at (0,-8) width 11 RTL: "+"
-                          RenderMathMLRoot {mroot} at (0,0) size 165x35
-                            RenderMathMLRow {mrow} at (0,2) size 150x33
-                              RenderMathMLToken {mn} at (141,14) size 9x13
+                          RenderMathMLRoot {mroot} at (0,0) size 165x32
+                            RenderMathMLRow {mrow} at (0,2) size 150x30
+                              RenderMathMLToken {mn} at (141,11) size 9x13
                                 RenderBlock (anonymous) at (0,0) size 8x13
                                   RenderText {#text} at (0,-5) size 8x24
                                     text run at (0,-5) width 8: "5"
-                              RenderMathMLOperator {mo} at (123,17) size 19x10
+                              RenderMathMLOperator {mo} at (123,14) size 19x10
                                 RenderBlock (anonymous) at (3,0) size 12x10
                                   RenderText {#text} at (0,-8) size 11x24
                                     text run at (0,-8) width 11 RTL: "+"
-                              RenderMathMLRoot {mroot} at (0,0) size 124x32
-                                RenderMathMLRow {mrow} at (0,2) size 109x30
-                                  RenderMathMLToken {mn} at (100,12) size 9x12
+                              RenderMathMLRoot {mroot} at (0,0) size 124x30
+                                RenderMathMLRow {mrow} at (0,2) size 109x28
+                                  RenderMathMLToken {mn} at (100,9) size 9x12
                                     RenderBlock (anonymous) at (0,0) size 8x12
                                       RenderText {#text} at (0,-6) size 8x24
                                         text run at (0,-6) width 8: "6"
-                                  RenderMathMLOperator {mo} at (82,14) size 19x10
+                                  RenderMathMLOperator {mo} at (82,11) size 19x10
                                     RenderBlock (anonymous) at (3,0) size 12x10
                                       RenderText {#text} at (0,-8) size 11x24
                                         text run at (0,-8) width 11 RTL: "+"
-                                  RenderMathMLRoot {mroot} at (0,0) size 83x30
-                                    RenderMathMLRow {mrow} at (0,2) size 68x28
-                                      RenderMathMLToken {mn} at (59,9) size 9x12
+                                  RenderMathMLRoot {mroot} at (0,0) size 83x27
+                                    RenderMathMLRow {mrow} at (0,2) size 68x25
+                                      RenderMathMLToken {mn} at (59,6) size 9x12
                                         RenderBlock (anonymous) at (0,0) size 8x12
                                           RenderText {#text} at (0,-6) size 8x24
                                             text run at (0,-6) width 8: "7"
-                                      RenderMathMLOperator {mo} at (41,11) size 19x10
+                                      RenderMathMLOperator {mo} at (41,8) size 19x10
                                         RenderBlock (anonymous) at (3,0) size 12x10
                                           RenderText {#text} at (0,-8) size 11x24
                                             text run at (0,-8) width 11 RTL: "+"
-                                      RenderMathMLRoot {mroot} at (0,0) size 42x27
-                                        RenderMathMLToken {mi} at (0,8) size 12x12 [padding: 0 0 0 2]
+                                      RenderMathMLRoot {mroot} at (0,0) size 42x24
+                                        RenderMathMLToken {mi} at (0,5) size 12x12 [padding: 0 0 0 2]
                                           RenderBlock (anonymous) at (0,0) size 12x12
                                             RenderText {#text} at (0,-6) size 12x24
                                               text run at (0,-6) width 12: "A"
-                                        RenderMathMLFraction {mfrac} at (17,0) size 20x15
+                                        RenderMathMLFraction {mfrac} at (17,0) size 20x13
                                           RenderMathMLRow {mrow} at (0,0) size 20x7
                                             RenderMathMLToken {mi} at (14,1) size 6x5 [padding: 0 0 0 1]
                                               RenderBlock (anonymous) at (0,0) size 5x6
@@ -501,35 +501,35 @@ layer at (0,0) size 800x514
                                               RenderBlock (anonymous) at (0,0) size 5x7
                                                 RenderText {#text} at (0,-4) size 5x13
                                                   text run at (0,-4) width 5: "y"
-                                          RenderMathMLToken {mi} at (7,10) size 6x5 [padding: 0 0 0 1]
+                                          RenderMathMLToken {mi} at (7,7) size 6x6 [padding: 0 0 0 1]
                                             RenderBlock (anonymous) at (0,0) size 4x6
                                               RenderText {#text} at (0,-4) size 4x13
                                                 text run at (0,-4) width 4: "z"
-                                    RenderMathMLToken {mn} at (73,5) size 5x9
+                                    RenderMathMLToken {mn} at (73,4) size 5x9
                                       RenderBlock (anonymous) at (0,0) size 5x8
                                         RenderText {#text} at (0,-2) size 5x13
                                           text run at (0,-2) width 5: "9"
-                                RenderMathMLToken {mn} at (114,6) size 5x9
+                                RenderMathMLToken {mn} at (114,5) size 5x9
                                   RenderBlock (anonymous) at (0,0) size 5x8
                                     RenderText {#text} at (0,-2) size 5x13
                                       text run at (0,-2) width 5: "8"
-                            RenderMathMLToken {mn} at (155,8) size 5x8
+                            RenderMathMLToken {mn} at (155,7) size 5x8
                               RenderBlock (anonymous) at (0,0) size 5x7
                                 RenderText {#text} at (0,-3) size 5x13
                                   text run at (0,-3) width 5: "7"
-                        RenderMathMLToken {mn} at (196,8) size 5x9
+                        RenderMathMLToken {mn} at (196,7) size 5x9
                           RenderBlock (anonymous) at (0,0) size 5x8
                             RenderText {#text} at (0,-2) size 5x13
                               text run at (0,-2) width 5: "6"
-                    RenderMathMLToken {mn} at (237,9) size 5x9
+                    RenderMathMLToken {mn} at (237,8) size 5x9
                       RenderBlock (anonymous) at (0,0) size 5x8
                         RenderText {#text} at (0,-2) size 5x13
                           text run at (0,-2) width 5: "5"
-                RenderMathMLToken {mn} at (278,10) size 5x9
+                RenderMathMLToken {mn} at (278,9) size 5x9
                   RenderBlock (anonymous) at (0,0) size 5x8
                     RenderText {#text} at (0,-2) size 5x13
                       text run at (0,-2) width 5: "4"
-            RenderMathMLToken {mn} at (319,11) size 5x9
+            RenderMathMLToken {mn} at (319,10) size 5x9
               RenderBlock (anonymous) at (0,0) size 5x8
                 RenderText {#text} at (0,-2) size 5x13
                   text run at (0,-2) width 5: "3"
index 601d532..9103acd 100644 (file)
@@ -1,3 +1,34 @@
+2016-03-20  Frederic Wang  <fwang@igalia.com>
+
+        Use Fraction* parameters from the OpenType MATH table
+        https://bugs.webkit.org/show_bug.cgi?id=155639
+
+        Reviewed by Brent Fulgham.
+
+        We improve the RenderMathMLFraction so minimal vertical shifts and gaps
+        from the MATH table (or arbitrary fallback) are used for fractions.
+        We also change the interpretation of "thick" and "thin" linethickness values
+        to match Gecko's behavior and the one suggested in the MathML in HTML5 implementation note.
+
+        Test: imported/mathml-in-html5/mathml/presentation-markup/fractions/frac-parameters-1.html
+
+        * rendering/mathml/MathMLStyle.cpp:
+        (WebCore::MathMLStyle::updateStyleIfNeeded): set NeedsLayout after displaystyle change
+        so that dynamic MathML tests still work.
+        * rendering/mathml/RenderMathMLFraction.cpp:
+        (WebCore::RenderMathMLFraction::RenderMathMLFraction): Init LayoutUnit members to zero.
+        (WebCore::RenderMathMLFraction::updateFromElement):
+        Set new members for fraction gaps and shifts using Fraction* constants or some fallback
+        values. Change the interpretation of "thick" and "thin".
+        (WebCore::RenderMathMLFraction::layoutBlock): Use new constants affecting vertical
+        positions of numerator and denominator.
+        (WebCore::RenderMathMLFraction::paint): Use m_ascent to set the vertical position
+        of the fraction bar.
+        (WebCore::RenderMathMLFraction::firstLineBaseline): We just return m_ascent.
+        * rendering/mathml/RenderMathMLFraction.h: Make updateFromElement public so that
+        it can be used in MathMLStyle. Add LayoutUnit members for the ascent of the fraction
+        and for minimal shifts/gaps values.
+
 2016-07-08  Frederic Wang  <fwang@igalia.com>
 
         Use Radical* constants from the OpenType MATH table.
index 0440f30..dc984b9 100644 (file)
@@ -83,11 +83,13 @@ RenderObject* MathMLStyle::getMathMLParentNode(RenderObject* renderer)
 void MathMLStyle::updateStyleIfNeeded(RenderObject* renderer, bool oldDisplayStyle)
 {
     if (oldDisplayStyle != m_displayStyle) {
-        renderer->setPreferredLogicalWidthsDirty(true);
+        renderer->setNeedsLayoutAndPrefWidthsRecalc();
         if (is<RenderMathMLToken>(renderer))
             downcast<RenderMathMLToken>(renderer)->updateTokenContent();
         else if (is<RenderMathMLRoot>(renderer))
             downcast<RenderMathMLRoot>(renderer)->updateStyle();
+        else if (is<RenderMathMLFraction>(renderer))
+            downcast<RenderMathMLFraction>(renderer)->updateFromElement();
     }
 }
 
index 719978b..89b23de 100644 (file)
 #include "config.h"
 
 #if ENABLE(MATHML)
-
 #include "RenderMathMLFraction.h"
 
 #include "GraphicsContext.h"
 #include "MathMLNames.h"
 #include "PaintInfo.h"
+#include <cmath>
 
 namespace WebCore {
 
 using namespace MathMLNames;
 
-// FIXME: The "MathML in HTML5" implementation note suggests the values 50% for "thin" and 200% for "thick" (http://webkit.org/b/155639).
-static const float gLineThin = 0.33f;
-static const float gLineMedium = 1.f;
-static const float gLineThick = 3.f;
-static const float gFractionBarWidth = 0.05f;
-
-// FIXME: We should read the gaps and shifts from the MATH table (http://webkit.org/b/155639).
-static const float gNumeratorGap = 0.2f;
-static const float gDenominatorGap = 0.2f;
-
 RenderMathMLFraction::RenderMathMLFraction(MathMLInlineContainerElement& element, RenderStyle&& style)
     : RenderMathMLBlock(element, WTFMove(style))
-    , m_defaultLineThickness(1)
-    , m_lineThickness(0)
-    , m_numeratorAlign(FractionAlignmentCenter)
-    , m_denominatorAlign(FractionAlignmentCenter)
 {
 }
 
@@ -95,27 +81,51 @@ void RenderMathMLFraction::updateFromElement()
     if (isEmpty())
         return;
 
+    // We try and read constants to draw the fraction from the OpenType MATH and use fallback values otherwise.
+    // We also parse presentation attributes of the <mfrac> element.
+
     // We first determine the default line thickness.
     const auto& primaryFont = style().fontCascade().primaryFont();
-    if (auto* mathData = style().fontCascade().primaryFont().mathData())
+    const auto* mathData = style().fontCascade().primaryFont().mathData();
+    if (mathData)
         m_defaultLineThickness = mathData->getMathConstant(primaryFont, OpenTypeMathData::FractionRuleThickness);
     else
-        m_defaultLineThickness = gFractionBarWidth * style().fontSize();
+        m_defaultLineThickness = ruleThicknessFallback();
 
     // Next, we parse the linethickness attribute.
+    // The MathML3 recommendation states that "medium" is the default thickness.
+    // However, it only states that "thin" and "thick" are respectively thiner and thicker.
+    // The MathML in HTML5 implementation note suggests 50% and 200% and these values are also used in Gecko.
     String thickness = element().getAttribute(MathMLNames::linethicknessAttr);
     if (equalLettersIgnoringASCIICase(thickness, "thin"))
-        m_lineThickness = m_defaultLineThickness * gLineThin;
+        m_lineThickness = m_defaultLineThickness / 2;
     else if (equalLettersIgnoringASCIICase(thickness, "medium"))
-        m_lineThickness = m_defaultLineThickness * gLineMedium;
+        m_lineThickness = m_defaultLineThickness;
     else if (equalLettersIgnoringASCIICase(thickness, "thick"))
-        m_lineThickness = m_defaultLineThickness * gLineThick;
+        m_lineThickness = m_defaultLineThickness * 2;
     else {
         // Parse the thickness using m_defaultLineThickness as the default value.
         m_lineThickness = m_defaultLineThickness;
         parseMathMLLength(thickness, m_lineThickness, &style(), false);
     }
 
+    // We now know whether we should layout as a normal fraction or as a stack (fraction without bar) and so determine the relevant constants.
+    // FIXME: If m_lineThickness == 0, we should read Stack* parameters. See http://wkb.ug/122297
+    bool display = mathMLStyle()->displayStyle();
+    if (mathData) {
+        m_numeratorGapMin = mathData->getMathConstant(primaryFont, display ? OpenTypeMathData::FractionNumDisplayStyleGapMin : OpenTypeMathData::FractionNumeratorGapMin);
+        m_denominatorGapMin = mathData->getMathConstant(primaryFont, display ? OpenTypeMathData::FractionDenomDisplayStyleGapMin : OpenTypeMathData::FractionDenominatorGapMin);
+        m_numeratorMinShiftUp = mathData->getMathConstant(primaryFont, display ? OpenTypeMathData::FractionNumeratorDisplayStyleShiftUp : OpenTypeMathData::FractionNumeratorShiftUp);
+        m_denominatorMinShiftDown = mathData->getMathConstant(primaryFont, display ? OpenTypeMathData::FractionDenominatorDisplayStyleShiftDown : OpenTypeMathData::FractionDenominatorShiftDown);
+    } else {
+        // The MATH table specification suggests default rule thickness or (in displaystyle) 3 times default rule thickness for the gaps.
+        m_numeratorGapMin = m_denominatorGapMin = display ? 3 * ruleThicknessFallback() : ruleThicknessFallback();
+
+        // The MATH table specification does not suggest any values for shifts, so we leave them at zero.
+        m_numeratorMinShiftUp = m_denominatorMinShiftDown = 0;
+    }
+
+    // Parse alignment attributes.
     m_numeratorAlign = parseAlignmentAttribute(element().getAttribute(MathMLNames::numalignAttr));
     m_denominatorAlign = parseAlignmentAttribute(element().getAttribute(MathMLNames::denomalignAttr));
 }
@@ -182,22 +192,27 @@ void RenderMathMLFraction::layoutBlock(bool relayoutChildren, LayoutUnit)
         return;
     }
 
-    LayoutUnit verticalOffset = 0;
-
     numerator().layoutIfNeeded();
     denominator().layoutIfNeeded();
 
     setLogicalWidth(std::max(numerator().logicalWidth(), denominator().logicalWidth()));
 
+    LayoutUnit verticalOffset = 0; // This is the top of the renderer.
     LayoutPoint numeratorLocation(horizontalOffset(numerator(), m_numeratorAlign), verticalOffset);
     numerator().setLocation(numeratorLocation);
 
-    verticalOffset += numerator().logicalHeight() + gNumeratorGap * style().fontSize() + m_lineThickness + gDenominatorGap * style().fontSize();
+    LayoutUnit numeratorAscent = ascentForChild(numerator());
+    verticalOffset += std::max(numerator().logicalHeight() + m_numeratorGapMin + m_lineThickness / 2, numeratorAscent + m_numeratorMinShiftUp); // This is the middle of the fraction bar.
+    m_ascent = verticalOffset + mathAxisHeight();
 
+    LayoutUnit denominatorAscent = ascentForChild(denominator());
+    LayoutUnit denominatorDescent = denominator().logicalHeight() - denominatorAscent;
+    verticalOffset += std::max(m_lineThickness / 2 + m_denominatorGapMin, m_denominatorMinShiftDown - denominatorAscent);
     LayoutPoint denominatorLocation(horizontalOffset(denominator(), m_denominatorAlign), verticalOffset);
     denominator().setLocation(denominatorLocation);
 
-    setLogicalHeight(verticalOffset + denominator().logicalHeight());
+    verticalOffset = std::max(verticalOffset + denominator().logicalHeight(), m_ascent + denominatorDescent); // This is the bottom of our renderer.
+    setLogicalHeight(verticalOffset);
 
     clearNeedsLayout();
 }
@@ -208,7 +223,7 @@ void RenderMathMLFraction::paint(PaintInfo& info, const LayoutPoint& paintOffset
     if (info.context().paintingDisabled() || info.phase != PaintPhaseForeground || style().visibility() != VISIBLE || !isValid())
         return;
 
-    IntPoint adjustedPaintOffset = roundedIntPoint(paintOffset + location() + LayoutPoint(0, numerator().logicalHeight() + gNumeratorGap * style().fontSize() + m_lineThickness / 2));
+    IntPoint adjustedPaintOffset = roundedIntPoint(paintOffset + location() + LayoutPoint(0, m_ascent - mathAxisHeight()));
 
     GraphicsContextStateSaver stateSaver(info.context());
 
@@ -220,10 +235,8 @@ void RenderMathMLFraction::paint(PaintInfo& info, const LayoutPoint& paintOffset
 
 Optional<int> RenderMathMLFraction::firstLineBaseline() const
 {
-    if (isValid()) {
-        LayoutUnit axisHeight = mathAxisHeight();
-        return Optional<int>(numerator().logicalHeight() + gNumeratorGap * style().fontSize() + static_cast<int>(lroundf(m_lineThickness / 2 + axisHeight)));
-    }
+    if (isValid())
+        return Optional<int>(std::lround(static_cast<float>(m_ascent)));
     return RenderMathMLBlock::firstLineBaseline();
 }
 
index 3a424a3..ea10ade 100644 (file)
@@ -43,6 +43,7 @@ public:
     float relativeLineThickness() const { return m_defaultLineThickness ? m_lineThickness / m_defaultLineThickness : LayoutUnit(0); }
 
     void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) final;
+    void updateFromElement() final;
 
 protected:
     void computePreferredLogicalWidths() final;
@@ -51,7 +52,6 @@ private:
     bool isRenderMathMLFraction() const final { return true; }
     const char* renderName() const final { return "RenderMathMLFraction"; }
 
-    void updateFromElement() final;
     Optional<int> firstLineBaseline() const final;
     void paint(PaintInfo&, const LayoutPoint&) final;
     RenderMathMLOperator* unembellishedOperator() final;
@@ -68,10 +68,15 @@ private:
     FractionAlignment parseAlignmentAttribute(const String& value);
     LayoutUnit horizontalOffset(RenderBox&, FractionAlignment);
 
-    LayoutUnit m_defaultLineThickness;
+    LayoutUnit m_ascent;
+    LayoutUnit m_defaultLineThickness = 1;
     LayoutUnit m_lineThickness;
-    FractionAlignment m_numeratorAlign;
-    FractionAlignment m_denominatorAlign;
+    LayoutUnit m_numeratorGapMin;
+    LayoutUnit m_denominatorGapMin;
+    LayoutUnit m_numeratorMinShiftUp;
+    LayoutUnit m_denominatorMinShiftDown;
+    FractionAlignment m_numeratorAlign = FractionAlignmentCenter;
+    FractionAlignment m_denominatorAlign = FractionAlignmentCenter;
 };
 
 } // namespace WebCore