Use parameters from the OpenType MATH table for <munderover>
authorfred.wang@free.fr <fred.wang@free.fr@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 11 Jul 2016 18:46:10 +0000 (18:46 +0000)
committerfred.wang@free.fr <fred.wang@free.fr@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 11 Jul 2016 18:46:10 +0000 (18:46 +0000)
https://bugs.webkit.org/show_bug.cgi?id=155756

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

Source/WebCore:

We follow the description from the MathML in HTML5 implementation
to improve the layout of <munderover> using some constants from the MATH table.

Tests: imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-1.html
       imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-2.html
       imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-3.html
       imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-4.html
       mathml/presentation/attributes-accent-accentunder-dynamic.html

* mathml/mathattrs.in: Add accentunder attribute.
* rendering/mathml/MathMLOperatorDictionary.h: Remove FIXME comment.
* rendering/mathml/RenderMathMLUnderOver.cpp:
(WebCore::RenderMathMLUnderOver::hasAccent): Helper function to determine whether
the over/under script should be treated as an accent.
(WebCore::RenderMathMLUnderOver::getVerticalParameters): Helper function to read
some vertical parameters from the MATH table.
(WebCore::RenderMathMLUnderOver::layoutBlock): Take into account the new vertical
parameters for the layout of <munderover>.
* rendering/mathml/RenderMathMLUnderOver.h: Define new helper functions.

LayoutTests:

Import some tests from the MathML in HTML5 test suite to verify
the layout of the <munderover> element. We also write a test to
verify dynamic change of accent/accentunder attributes and adjust
other tests.

* imported/mathml-in-html5/fonts/math/limits-lowerlimitbaselinedropmin3000.woff: Added.
* imported/mathml-in-html5/fonts/math/limits-lowerlimitgapmin11000.woff: Added.
* imported/mathml-in-html5/fonts/math/limits-upperlimitbaselinerisemin5000.woff: Added.
* imported/mathml-in-html5/fonts/math/limits-upperlimitgapmin7000.woff: Added.
* imported/mathml-in-html5/fonts/math/stretchstack-bottomshiftdown3000.woff: Added.
* imported/mathml-in-html5/fonts/math/stretchstack-gapabovemin7000.woff: Added.
* imported/mathml-in-html5/fonts/math/stretchstack-gapbelowmin11000.woff: Added.
* imported/mathml-in-html5/fonts/math/stretchstack-topshiftup5000.woff: Added.
* imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-overbarextraascender3000.woff: Added.
* imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-overbarverticalgap11000.woff: Added.
* imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-underbarextradescender5000.woff: Added.
* imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-underbarverticalgap7000.woff: Added.
* imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-1-expected.txt: Added.
* imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-1.html: Added.
* imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-2-expected.txt: Added.
* imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-2.html: Added.
* imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-3-expected.txt: Added.
* imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-3.html: Added.
* imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-4-expected.txt: Added.
* imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-4.html: Added.
* mathml/presentation/attributes-accent-accentunder-dynamic.html: Added.
Test dynamic changes of accent and accentunder.
* mathml/presentation/attributes-accent-accentunder-dynamic-expected.html: Added.
* mathml/presentation/scripts-underover.html: Remove one of the test since munderover
with an empty script is no longer equivalent to munder or mover.
* mathml/presentation/scripts-underover-expected.html: Ditto.
* platform/gtk/mathml/opentype/horizontal-expected.png: Updated due to change in
vertical metrics of scripts.
* platform/gtk/mathml/opentype/horizontal-expected.txt: Ditto.
* platform/gtk/mathml/opentype/horizontal-munderover-expected.png: Ditto.
* platform/gtk/mathml/opentype/horizontal-munderover-expected.txt: Ditto.
* platform/gtk/mathml/presentation/roots-expected.txt: Udapted due to script baseline fix.
* platform/gtk/mathml/presentation/roots-expected.png: ditto.
* mathml/presentation/underover-nonstretchy-or-vertical.html: Prevent the <mo> to be treated
as an accent so that we always get the same spacing as the reference. We also use the Ahem
font to make the result more reliable.

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

36 files changed:
LayoutTests/ChangeLog
LayoutTests/imported/mathml-in-html5/fonts/math/limits-lowerlimitbaselinedropmin3000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/fonts/math/limits-lowerlimitgapmin11000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/fonts/math/limits-upperlimitbaselinerisemin5000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/fonts/math/limits-upperlimitgapmin7000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/fonts/math/stretchstack-bottomshiftdown3000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/fonts/math/stretchstack-gapabovemin7000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/fonts/math/stretchstack-gapbelowmin11000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/fonts/math/stretchstack-topshiftup5000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-overbarextraascender3000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-overbarverticalgap11000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-underbarextradescender5000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-underbarverticalgap7000.woff [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-1-expected.txt [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-1.html [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-2-expected.txt [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-2.html [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-3-expected.txt [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-3.html [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-4-expected.txt [new file with mode: 0644]
LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-4.html [new file with mode: 0644]
LayoutTests/mathml/presentation/attributes-accent-accentunder-dynamic-expected.html [new file with mode: 0644]
LayoutTests/mathml/presentation/attributes-accent-accentunder-dynamic.html [new file with mode: 0644]
LayoutTests/mathml/presentation/scripts-underover-expected.html
LayoutTests/mathml/presentation/scripts-underover.html
LayoutTests/mathml/presentation/underover-nonstretchy-or-vertical-expected.html
LayoutTests/mathml/presentation/underover-nonstretchy-or-vertical.html
LayoutTests/platform/gtk/mathml/opentype/horizontal-expected.png
LayoutTests/platform/gtk/mathml/opentype/horizontal-expected.txt
LayoutTests/platform/gtk/mathml/opentype/horizontal-munderover-expected.png
LayoutTests/platform/gtk/mathml/opentype/horizontal-munderover-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/mathml/mathattrs.in
Source/WebCore/rendering/mathml/MathMLOperatorDictionary.h
Source/WebCore/rendering/mathml/RenderMathMLUnderOver.cpp
Source/WebCore/rendering/mathml/RenderMathMLUnderOver.h

index aae6aba..2182bc8 100644 (file)
@@ -1,5 +1,54 @@
 2016-07-11  Frederic Wang  <fwang@igalia.com>
 
+        Use parameters from the OpenType MATH table for <munderover>
+        https://bugs.webkit.org/show_bug.cgi?id=155756
+
+        Reviewed by Brent Fulgham.
+
+        Import some tests from the MathML in HTML5 test suite to verify
+        the layout of the <munderover> element. We also write a test to
+        verify dynamic change of accent/accentunder attributes and adjust
+        other tests.
+
+        * imported/mathml-in-html5/fonts/math/limits-lowerlimitbaselinedropmin3000.woff: Added.
+        * imported/mathml-in-html5/fonts/math/limits-lowerlimitgapmin11000.woff: Added.
+        * imported/mathml-in-html5/fonts/math/limits-upperlimitbaselinerisemin5000.woff: Added.
+        * imported/mathml-in-html5/fonts/math/limits-upperlimitgapmin7000.woff: Added.
+        * imported/mathml-in-html5/fonts/math/stretchstack-bottomshiftdown3000.woff: Added.
+        * imported/mathml-in-html5/fonts/math/stretchstack-gapabovemin7000.woff: Added.
+        * imported/mathml-in-html5/fonts/math/stretchstack-gapbelowmin11000.woff: Added.
+        * imported/mathml-in-html5/fonts/math/stretchstack-topshiftup5000.woff: Added.
+        * imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-overbarextraascender3000.woff: Added.
+        * imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-overbarverticalgap11000.woff: Added.
+        * imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-underbarextradescender5000.woff: Added.
+        * imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-underbarverticalgap7000.woff: Added.
+        * imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-1-expected.txt: Added.
+        * imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-1.html: Added.
+        * imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-2-expected.txt: Added.
+        * imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-2.html: Added.
+        * imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-3-expected.txt: Added.
+        * imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-3.html: Added.
+        * imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-4-expected.txt: Added.
+        * imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-4.html: Added.
+        * mathml/presentation/attributes-accent-accentunder-dynamic.html: Added.
+        Test dynamic changes of accent and accentunder.
+        * mathml/presentation/attributes-accent-accentunder-dynamic-expected.html: Added.
+        * mathml/presentation/scripts-underover.html: Remove one of the test since munderover
+        with an empty script is no longer equivalent to munder or mover.
+        * mathml/presentation/scripts-underover-expected.html: Ditto.
+        * platform/gtk/mathml/opentype/horizontal-expected.png: Updated due to change in
+        vertical metrics of scripts.
+        * platform/gtk/mathml/opentype/horizontal-expected.txt: Ditto.
+        * platform/gtk/mathml/opentype/horizontal-munderover-expected.png: Ditto.
+        * platform/gtk/mathml/opentype/horizontal-munderover-expected.txt: Ditto.
+        * platform/gtk/mathml/presentation/roots-expected.txt: Udapted due to script baseline fix.
+        * platform/gtk/mathml/presentation/roots-expected.png: ditto.
+        * mathml/presentation/underover-nonstretchy-or-vertical.html: Prevent the <mo> to be treated
+        as an accent so that we always get the same spacing as the reference. We also use the Ahem
+        font to make the result more reliable.
+
+2016-07-11  Frederic Wang  <fwang@igalia.com>
+
         Use Stack* parameters from the OpenType MATH table
         https://bugs.webkit.org/show_bug.cgi?id=155714
 
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/limits-lowerlimitbaselinedropmin3000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/limits-lowerlimitbaselinedropmin3000.woff
new file mode 100644 (file)
index 0000000..340ec1a
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/limits-lowerlimitbaselinedropmin3000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/limits-lowerlimitgapmin11000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/limits-lowerlimitgapmin11000.woff
new file mode 100644 (file)
index 0000000..a699e2e
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/limits-lowerlimitgapmin11000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/limits-upperlimitbaselinerisemin5000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/limits-upperlimitbaselinerisemin5000.woff
new file mode 100644 (file)
index 0000000..09fd356
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/limits-upperlimitbaselinerisemin5000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/limits-upperlimitgapmin7000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/limits-upperlimitgapmin7000.woff
new file mode 100644 (file)
index 0000000..d9bda46
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/limits-upperlimitgapmin7000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/stretchstack-bottomshiftdown3000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/stretchstack-bottomshiftdown3000.woff
new file mode 100644 (file)
index 0000000..3edfb7a
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/stretchstack-bottomshiftdown3000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/stretchstack-gapabovemin7000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/stretchstack-gapabovemin7000.woff
new file mode 100644 (file)
index 0000000..2c1aff6
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/stretchstack-gapabovemin7000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/stretchstack-gapbelowmin11000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/stretchstack-gapbelowmin11000.woff
new file mode 100644 (file)
index 0000000..e2323c1
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/stretchstack-gapbelowmin11000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/stretchstack-topshiftup5000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/stretchstack-topshiftup5000.woff
new file mode 100644 (file)
index 0000000..98785d3
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/stretchstack-topshiftup5000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-overbarextraascender3000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-overbarextraascender3000.woff
new file mode 100644 (file)
index 0000000..e2a657c
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-overbarextraascender3000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-overbarverticalgap11000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-overbarverticalgap11000.woff
new file mode 100644 (file)
index 0000000..26ae034
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-overbarverticalgap11000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-underbarextradescender5000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-underbarextradescender5000.woff
new file mode 100644 (file)
index 0000000..6d25131
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-underbarextradescender5000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-underbarverticalgap7000.woff b/LayoutTests/imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-underbarverticalgap7000.woff
new file mode 100644 (file)
index 0000000..d201ea3
Binary files /dev/null and b/LayoutTests/imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-underbarverticalgap7000.woff differ
diff --git a/LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-1-expected.txt b/LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-1-expected.txt
new file mode 100644 (file)
index 0000000..1067d58
--- /dev/null
@@ -0,0 +1,18 @@
+∑
+∑
+
+∑
+∑
+
+∑
+∑
+
+∑
+∑
+
+
+PASS LowerLimitBaselineDropMin 
+PASS LowerLimitGapMin 
+PASS UpperLimitBaselineRiseMin 
+PASS UpperLimitGapMin 
+
diff --git a/LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-1.html b/LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-1.html
new file mode 100644 (file)
index 0000000..1f436e4
--- /dev/null
@@ -0,0 +1,145 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Underscripts and Overscripts parameters</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS4">
+<meta name="assert" content="Elements munder, mover, munderover correctly use the limit parameters from the MATH table.">
+<script src="../../../../../resources/testharness.js"></script>
+<script src="../../../../../resources/testharnessreport.js"></script>
+<style>
+  math, mspace, mo {
+    font-size: 10px;
+  }
+  @font-face {
+    font-family: lowerlimitbaselinedropmin3000;
+    src: url("../../../fonts/math/limits-lowerlimitbaselinedropmin3000.woff");
+  }
+  @font-face {
+    font-family: lowerlimitgapmin11000;
+    src: url("../../../fonts/math/limits-lowerlimitgapmin11000.woff");
+  }
+  @font-face {
+    font-family: upperlimitbaselinerisemin5000;
+    src: url("../../../fonts/math/limits-upperlimitbaselinerisemin5000.woff");
+  }
+  @font-face {
+    font-family: upperlimitgapmin7000;
+    src: url("../../../fonts/math/limits-upperlimitgapmin7000.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 v = 3000 * emToPx;
+      assert_approx_equals(getBox("under00011").top - getBox("ref0001").bottom,
+                           v, epsilon, "munder: under shift");
+      assert_approx_equals(getBox("under00012").top - getBox("ref0001").bottom,
+                           v, epsilon, "munderover: under shift");
+    }, "LowerLimitBaselineDropMin");
+
+    test(function() {
+      var v = 11000 * emToPx;
+      assert_approx_equals(getBox("under00021").top - getBox("ref0002").bottom,
+                           v, epsilon, "munder: under gap");
+      assert_approx_equals(getBox("under00022").top - getBox("ref0002").bottom,
+                           v, epsilon, "munderover: under gap");
+    }, "LowerLimitGapMin");
+
+    test(function() {
+      var v = 5000 * emToPx;
+      assert_approx_equals(getBox("ref0003").top - getBox("over00031").bottom,
+                           v, epsilon, "munder: over shift");
+      assert_approx_equals(getBox("ref0003").top - getBox("over00032").bottom,
+                           v, epsilon, "munderover: over shift");
+    }, "UpperLimitBaselineRiseMin");
+
+    test(function() {
+      var v = 7000 * emToPx;
+      assert_approx_equals(getBox("ref0004").top - getBox("over00041").bottom,
+                           v, epsilon, "munder: over shift");
+      assert_approx_equals(getBox("ref0004").top - getBox("over00042").bottom,
+                           v, epsilon, "munderover: over shift");
+    }, "UpperLimitGapMin");
+
+    done();
+  }
+</script>
+</head>
+<body>
+    <p>
+      <math style="font-family: lowerlimitbaselinedropmin3000;">
+        <mspace id="ref0001" height="1em" width="3em" mathbackground="green"/>
+        <munder>
+          <mo movablelimits="false">&#x2211;</mo>
+          <mspace id="under00011" depth="1em" width="3em" mathbackground="blue"/>
+        </munder>
+        <munderover>
+          <mo movablelimits="false">&#x2211;</mo>
+          <mspace id="under00012" depth="1em" width="3em" mathbackground="blue"/>
+          <mspace height="1em" width="3em" mathbackground="black"/>
+        </munderover>
+      </math>
+    </p>
+    <hr/>
+    <p>
+      <math style="font-family: lowerlimitgapmin11000;">
+        <mspace id="ref0002" height="1em" width="3em" mathbackground="green"/>
+        <munder>
+          <mo movablelimits="false">&#x2211;</mo>
+          <mspace id="under00021" depth="1em" width="3em" mathbackground="blue"/>
+        </munder>
+        <munderover>
+          <mo movablelimits="false">&#x2211;</mo>
+          <mspace id="under00022" depth="1em" width="3em" mathbackground="blue"/>
+          <mspace height="1em" width="3em" mathbackground="black"/>
+        </munderover>
+      </math>
+    </p>
+    <hr/>
+    <p>
+      <math style="font-family: upperlimitbaselinerisemin5000;">
+        <mspace id="ref0003" height="1em" width="3em" mathbackground="green"/>
+        <mover>
+          <mo movablelimits="false">&#x2211;</mo>
+          <mspace id="over00031" height="1em" width="3em" mathbackground="blue"/>
+        </mover>
+        <munderover>
+          <mo movablelimits="false">&#x2211;</mo>
+          <mspace height="1em" width="3em" mathbackground="black"/>
+          <mspace id="over00032" height="1em" width="3em" mathbackground="blue"/>
+        </munderover>
+      </math>
+    </p>
+    <hr/>
+    <p>
+      <math style="font-family: upperlimitgapmin7000;">
+        <mspace id="ref0004" height="1em" width="3em" mathbackground="green"/>
+        <mover>
+          <mo movablelimits="false">&#x2211;</mo>
+          <mspace id="over00041" depth="1em" width="3em" mathbackground="blue"/>
+        </mover>
+        <munderover>
+          <mo movablelimits="false">&#x2211;</mo>
+          <mspace height="1em" width="3em" mathbackground="black"/>
+          <mspace id="over00042" depth="1em" width="3em" mathbackground="blue"/>
+        </munderover>
+      </math>
+    </p>
+    <hr/>
+</body>
+</html>
diff --git a/LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-2-expected.txt b/LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-2-expected.txt
new file mode 100644 (file)
index 0000000..1a02e28
--- /dev/null
@@ -0,0 +1,18 @@
+→
+→
+
+→
+→
+
+→
+→
+
+→
+→
+
+
+PASS StretchStackBottomShiftDown 
+PASS StretchStackGapBelowMin 
+PASS StretchStackTopShiftUp 
+PASS StretchStackGapAboveMin 
+
diff --git a/LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-2.html b/LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-2.html
new file mode 100644 (file)
index 0000000..c577dab
--- /dev/null
@@ -0,0 +1,145 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Underscripts and Overscripts parameters</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS4">
+<meta name="assert" content="Elements munder, mover, munderover correctly use the stretch stack parameters from the MATH table.">
+<script src="../../../../../resources/testharness.js"></script>
+<script src="../../../../../resources/testharnessreport.js"></script>
+<style>
+  math, mspace, mo {
+    font-size: 10px;
+  }
+  @font-face {
+    font-family: bottomshiftdown3000;
+    src: url("../../../fonts/math/stretchstack-bottomshiftdown3000.woff");
+  }
+  @font-face {
+    font-family: gapbelowmin11000;
+    src: url("../../../fonts/math/stretchstack-gapbelowmin11000.woff");
+  }
+  @font-face {
+    font-family: topshiftup5000;
+    src: url("../../../fonts/math/stretchstack-topshiftup5000.woff");
+  }
+  @font-face {
+    font-family: gapabovemin7000;
+    src: url("../../../fonts/math/stretchstack-gapabovemin7000.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 v = 3000 * emToPx;
+      assert_approx_equals(getBox("under00011").top - getBox("ref0001").bottom,
+                           v, epsilon, "munder: under shift");
+      assert_approx_equals(getBox("under00012").top - getBox("ref0001").bottom,
+                           v, epsilon, "munderover: under shift");
+    }, "StretchStackBottomShiftDown");
+
+    test(function() {
+      var v = 11000 * emToPx;
+      assert_approx_equals(getBox("under00021").top - getBox("ref0002").bottom,
+                           v, epsilon, "munder: under gap");
+      assert_approx_equals(getBox("under00022").top - getBox("ref0002").bottom,
+                           v, epsilon, "munderover: under gap");
+    }, "StretchStackGapBelowMin");
+
+    test(function() {
+      var v = 5000 * emToPx;
+      assert_approx_equals(getBox("ref0003").top - getBox("over00031").bottom,
+                           v, epsilon, "mover: over shift");
+      assert_approx_equals(getBox("ref0003").top - getBox("over00032").bottom,
+                           v, epsilon, "munderover: over shift");
+    }, "StretchStackTopShiftUp");
+
+    test(function() {
+      var v = 7000 * emToPx;
+      assert_approx_equals(getBox("ref0004").top - getBox("over00041").bottom,
+                           v, epsilon, "mover: over shift");
+      assert_approx_equals(getBox("ref0004").top - getBox("over00042").bottom,
+                           v, epsilon, "munderover: over shift");
+    }, "StretchStackGapAboveMin");
+
+    done();
+  }
+</script>
+</head>
+<body>
+    <p>
+      <math style="font-family: bottomshiftdown3000;">
+        <mspace id="ref0001" height="1em" width="3em" mathbackground="green"/>
+        <munder>
+          <mo>&#x2192;</mo>
+          <mspace id="under00011" depth="1em" width="3em" mathbackground="blue"/>
+        </munder>
+        <munderover>
+          <mo>&#x2192;</mo>
+          <mspace id="under00012" depth="1em" width="3em" mathbackground="blue"/>
+          <mspace height="1em" width="3em" mathbackground="black"/>
+        </munderover>
+      </math>
+    </p>
+    <hr/>
+    <p>
+      <math style="font-family: gapbelowmin11000;">
+        <mspace id="ref0002" height="1em" width="3em" mathbackground="green"/>
+        <munder>
+          <mo>&#x2192;</mo>
+          <mspace id="under00021" depth="1em" width="3em" mathbackground="blue"/>
+        </munder>
+        <munderover>
+          <mo>&#x2192;</mo>
+          <mspace id="under00022" depth="1em" width="3em" mathbackground="blue"/>
+          <mspace height="1em" width="3em" mathbackground="black"/>
+        </munderover>
+      </math>
+    </p>
+    <hr/>
+    <p>
+      <math style="font-family: topshiftup5000;">
+        <mspace id="ref0003" height="1em" width="3em" mathbackground="green"/>
+        <mover>
+          <mo>&#x2192;</mo>
+          <mspace id="over00031" height="1em" width="3em" mathbackground="blue"/>
+        </mover>
+        <munderover>
+          <mo>&#x2192;</mo>
+          <mspace height="1em" width="3em" mathbackground="black"/>
+          <mspace id="over00032" height="1em" width="3em" mathbackground="blue"/>
+        </munderover>
+      </math>
+    </p>
+    <hr/>
+    <p>
+      <math style="font-family: gapabovemin7000;">
+        <mspace id="ref0004" height="1em" width="3em" mathbackground="green"/>
+        <mover>
+          <mo>&#x2192;</mo>
+          <mspace id="over00041" depth="1em" width="3em" mathbackground="blue"/>
+        </mover>
+        <munderover>
+          <mo>&#x2192;</mo>
+          <mspace height="1em" width="3em" mathbackground="black"/>
+          <mspace id="over00042" depth="1em" width="3em" mathbackground="blue"/>
+        </munderover>
+      </math>
+    </p>
+    <hr/>
+</body>
+</html>
diff --git a/LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-3-expected.txt b/LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-3-expected.txt
new file mode 100644 (file)
index 0000000..4871e56
--- /dev/null
@@ -0,0 +1,8 @@
+
+PASS Baseline alignment 
+PASS Heights of bases 
+PASS AccentBaseHeight, UnderbarExtraDescender 
+PASS AccentBaseHeight, UnderbarVerticalGap 
+PASS AccentBaseHeight, OverbarExtraAscender 
+PASS AccentBaseHeight, OverbarVerticalGap 
+
diff --git a/LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-3.html b/LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-3.html
new file mode 100644 (file)
index 0000000..67abf59
--- /dev/null
@@ -0,0 +1,324 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Underscripts and Overscripts parameters</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS4">
+<meta name="assert" content="Elements munder, mover, munderover correctly use underbar/overbar and AccentBaseHeight parameters from the MATH table.">
+<script src="../../../../../resources/testharness.js"></script>
+<script src="../../../../../resources/testharnessreport.js"></script>
+<style>
+  math, mspace, mo {
+    font-size: 10px;
+  }
+  @font-face {
+    font-family: accentbaseheight4000underbarextradescender5000;
+    src: url("../../../fonts/math/underover-accentbaseheight4000-underbarextradescender5000.woff");
+  }
+  @font-face {
+    font-family: accentbaseheight4000underbarverticalgap7000;
+    src: url("../../../fonts/math/underover-accentbaseheight4000-underbarverticalgap7000.woff");
+  }
+  @font-face {
+    font-family: accentbaseheight4000overbarextraascender3000;
+    src: url("../../../fonts/math/underover-accentbaseheight4000-overbarextraascender3000.woff");
+  }
+  @font-face {
+    font-family: accentbaseheight4000overbarverticalgap11000;
+    src: url("../../../fonts/math/underover-accentbaseheight4000-overbarverticalgap11000.woff");
+  }
+</style>
+<script>
+  var emToPx = 10 / 1000; // font-size: 10px, font.em = 1000
+  var epsilon = 2;
+  var axisBaseHeight = 4000 *  emToPx;
+  var shortBaseHeight = 3000 * emToPx; // shortBaseHeight < axisBaseHeight
+  var tallBaseHeight = 5000 * emToPx; // tallBaseHeight > axisBaseHeight
+
+  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() {
+      for (var i = 1; i <= 4; i++) {
+        for (var j = 1; j <= 6; j++) {
+           var baseId = ("base00" + i) + j;
+           assert_approx_equals(getBox("ref00" + i).bottom,
+                                getBox(baseId).bottom,
+                                epsilon,
+                                "alignment of " + baseId);
+        }
+      }
+    }, "Baseline alignment");
+
+    test(function() {
+      for (var i = 1; i <= 4; i++) {
+        for (var j = 1; j <= 6; j++) {
+           var baseId = ("base00" + i) + j;
+           assert_approx_equals(getBox(baseId).height,
+                                j == 2 || j == 5 ?
+                                tallBaseHeight :shortBaseHeight,
+                                epsilon,
+                                "height of " + baseId);
+        }
+      }
+    }, "Heights of bases");
+
+    test(function() {
+      var v = 5000 * emToPx;
+      assert_approx_equals(getBox("ref001").bottom - getBox("over0014").bottom,
+                           shortBaseHeight, epsilon,
+                           "munderover: nonaccent over short base");
+      assert_approx_equals(getBox("ref001").bottom - getBox("over0015").bottom,
+                           tallBaseHeight, epsilon,
+                           "munderover: accent over tall base");
+      assert_approx_equals(getBox("ref001").bottom - getBox("over0016").bottom,
+                           axisBaseHeight, epsilon,
+                           "munderover: accent over short base");
+      for (var j = 1; j <= 6; j++) {
+        var elId = "el001" + j;
+        var baseId = "base001" + j;
+        var underId = "under001" + j;
+        assert_approx_equals(getBox(underId).top - getBox(baseId).bottom,
+                             0, epsilon,
+                             "gap between " + baseId + " and " + underId);
+        assert_approx_equals(getBox(elId).bottom - getBox(underId).bottom,
+                             v, epsilon,
+                             "extra descender below " + underId);
+      }
+    }, "AccentBaseHeight, UnderbarExtraDescender");
+
+    test(function() {
+      var v = 7000 * emToPx;
+      assert_approx_equals(getBox("ref002").bottom - getBox("over0024").bottom,
+                           shortBaseHeight, epsilon,
+                           "munderover: nonaccent over short base");
+      assert_approx_equals(getBox("ref002").bottom - getBox("over0025").bottom,
+                           tallBaseHeight, epsilon,
+                           "munderover: accent over tall base");
+      assert_approx_equals(getBox("ref002").bottom - getBox("over0026").bottom,
+                           axisBaseHeight, epsilon,
+                           "munderover: accent over short base");
+      for (var j = 1; j <= 6; j++) {
+        var elId = "el002" + j;
+        var baseId = "base002" + j;
+        var underId = "under002" + j;
+        var gap = document.getElementById(elId).getAttribute("accentunder") === "true" ? 0 : v;
+        assert_approx_equals(getBox(underId).top - getBox(baseId).bottom,
+                             gap, epsilon,
+                             "gap between " + baseId + " and " + underId);
+      }
+    }, "AccentBaseHeight, UnderbarVerticalGap");
+
+    test(function() {
+      var v = 3000 * emToPx;
+      assert_approx_equals(getBox("ref003").bottom - getBox("over0031").bottom,
+                           shortBaseHeight, epsilon,
+                           "mover: nonaccent over short base");
+      assert_approx_equals(getBox("ref003").bottom - getBox("over0032").bottom,
+                           tallBaseHeight, epsilon,
+                           "mover: accent over tall base");
+      assert_approx_equals(getBox("ref003").bottom - getBox("over0033").bottom,
+                           axisBaseHeight, epsilon,
+                           "mover: accent over short base");
+      assert_approx_equals(getBox("ref003").bottom - getBox("over0034").bottom,
+                           shortBaseHeight, epsilon,
+                           "munderover: nonaccent over short base");
+      assert_approx_equals(getBox("ref003").bottom - getBox("over0035").bottom,
+                           tallBaseHeight, epsilon,
+                           "munderover: accent over tall base");
+      assert_approx_equals(getBox("ref003").bottom - getBox("over0036").bottom,
+                           axisBaseHeight, epsilon,
+                           "munderover: accent over short base");
+      for (var j = 1; j <= 6; j++) {
+        var elId = "el003" + j;
+        var baseId = "base003" + j;
+        if (j >= 4) {
+          var underId = "under003" + j;
+          assert_approx_equals(getBox(underId).top - getBox(baseId).bottom,
+                               0, epsilon,
+                               "gap between " + baseId + " and " + underId);
+        }
+        var overId = "over003" + j;
+        assert_approx_equals(getBox(overId).top - getBox(elId).top,
+                             v, epsilon,
+                             "extra ascender below " + overId);
+      }
+    }, "AccentBaseHeight, OverbarExtraAscender");
+
+    test(function() {
+      v = 11000 * emToPx;
+      assert_approx_equals(getBox("ref004").bottom - getBox("over0041").bottom,
+                           shortBaseHeight + v, epsilon,
+                           "mover: nonaccent over short base");
+      assert_approx_equals(getBox("ref004").bottom - getBox("over0042").bottom,
+                           tallBaseHeight, epsilon,
+                           "mover: accent over tall base");
+      assert_approx_equals(getBox("ref004").bottom - getBox("over0043").bottom,
+                           axisBaseHeight, epsilon,
+                           "mover: accent over short base");
+      assert_approx_equals(getBox("ref004").bottom - getBox("over0044").bottom,
+                           shortBaseHeight + v, epsilon,
+                           "munderover: nonaccent over short base");
+      assert_approx_equals(getBox("ref004").bottom - getBox("over0045").bottom,
+                           tallBaseHeight, epsilon,
+                           "munderover: accent over tall base");
+      assert_approx_equals(getBox("ref004").bottom - getBox("over0046").bottom,
+                           axisBaseHeight, epsilon,
+                           "munderover: accent over short base");
+      for (var j = 4; j <= 6; j++) {
+        var baseId = "base004" + j;
+        var underId = "under004" + j;
+        assert_approx_equals(getBox(underId).top - getBox(baseId).bottom,
+                             0, epsilon,
+                             "gap between " + baseId + " and " + underId);
+      }
+    }, "AccentBaseHeight, OverbarVerticalGap");
+
+    done();
+  }
+</script>
+</head>
+<body>
+    <p>
+      <math style="font-family: accentbaseheight4000underbarextradescender5000;">
+        <mspace id="ref001" height="1em" width="3em" mathbackground="green"/>
+        <munder mathbackground="cyan" id="el0011">
+          <mspace id="base0011" height="3em" width="1em" mathbackground="black"/>
+          <mspace id="under0011" height="1em" width="3em" mathbackground="blue"/>
+        </munder>
+        <munder mathbackground="cyan" id="el0012" accentunder="true">
+          <mspace id="base0012" height="5em" width="1em" mathbackground="black"/>
+          <mspace id="under0012" height="1em" width="3em" mathbackground="blue"/>
+        </munder>
+        <munder mathbackground="cyan" id="el0013" accentunder="true">
+          <mspace id="base0013" height="3em" width="1em" mathbackground="black"/>
+          <mspace id="under0013" height="1em" width="3em" mathbackground="blue"/>
+        </munder>
+        <munderover mathbackground="cyan" id="el0014">
+          <mspace id="base0014" height="3em" width="1em" mathbackground="black"/>
+          <mspace id="under0014" height="1em" width="3em" mathbackground="blue"/>
+          <mspace id="over0014" height="1em" width="3em" mathbackground="red"/>
+        </munderover>
+        <munderover mathbackground="cyan" id="el0015" accent="true">
+          <mspace id="base0015" height="5em" width="1em" mathbackground="black"/>
+          <mspace id="under0015" height="1em" width="3em" mathbackground="blue"/>
+          <mspace id="over0015" height="1em" width="3em" mathbackground="red"/>
+        </munderover>
+        <munderover mathbackground="cyan" id="el0016" accent="true">
+          <mspace id="base0016" height="3em" width="1em" mathbackground="black"/>
+          <mspace id="under0016" height="1em" width="3em" mathbackground="blue"/>
+          <mspace id="over0016" height="1em" width="3em" mathbackground="red"/>
+        </munderover>
+      </math>
+    </p>
+    <hr/>
+    <p>
+      <math style="font-family: accentbaseheight4000underbarverticalgap7000;">
+        <mspace id="ref002" height="1em" width="3em" mathbackground="green"/>
+        <munder mathbackground="cyan" id="el0021">
+          <mspace id="base0021" height="3em" width="1em" mathbackground="black"/>
+          <mspace id="under0021" height="1em" width="3em" mathbackground="blue"/>
+        </munder>
+        <munder mathbackground="cyan" id="el0022" accentunder="true">
+          <mspace id="base0022" height="5em" width="1em" mathbackground="black"/>
+          <mspace id="under0022" height="1em" width="3em" mathbackground="blue"/>
+        </munder>
+        <munder mathbackground="cyan" id="el0023" accentunder="true">
+          <mspace id="base0023" height="3em" width="1em" mathbackground="black"/>
+          <mspace id="under0023" height="1em" width="3em" mathbackground="blue"/>
+        </munder>
+        <munderover mathbackground="cyan" id="el0024">
+          <mspace id="base0024" height="3em" width="1em" mathbackground="black"/>
+          <mspace id="under0024" height="1em" width="3em" mathbackground="blue"/>
+          <mspace id="over0024" height="1em" width="3em" mathbackground="red"/>
+        </munderover>
+        <munderover mathbackground="cyan" id="el0025" accent="true">
+          <mspace id="base0025" height="5em" width="1em" mathbackground="black"/>
+          <mspace id="under0025" height="1em" width="3em" mathbackground="blue"/>
+          <mspace id="over0025" height="1em" width="3em" mathbackground="red"/>
+        </munderover>
+        <munderover mathbackground="cyan" id="el0026" accent="true">
+          <mspace id="base0026" height="3em" width="1em" mathbackground="black"/>
+          <mspace id="under0026" height="1em" width="3em" mathbackground="blue"/>
+          <mspace id="over0026" height="1em" width="3em" mathbackground="red"/>
+        </munderover>
+      </math>
+    </p>
+    <hr/>
+    <p>
+      <math style="font-family: accentbaseheight4000overbarextraascender3000;">
+        <mspace id="ref003" height="1em" width="3em" mathbackground="green"/>
+        <mover mathbackground="cyan" id="el0031">
+          <mspace id="base0031" height="3em" width="1em" mathbackground="black"/>
+          <mspace id="over0031" height="1em" width="3em" mathbackground="red"/>
+        </mover>
+        <mover mathbackground="cyan" id="el0032" accent="true">
+          <mspace id="base0032" height="5em" width="1em" mathbackground="black"/>
+          <mspace id="over0032" height="1em" width="3em" mathbackground="red"/>
+        </mover>
+        <mover mathbackground="cyan" id="el0033" accent="true">
+          <mspace id="base0033" height="3em" width="1em" mathbackground="black"/>
+          <mspace id="over0033" height="1em" width="3em" mathbackground="red"/>
+        </mover>
+        <munderover mathbackground="cyan" id="el0034">
+          <mspace id="base0034" height="3em" width="1em" mathbackground="black"/>
+          <mspace id="under0034" height="1em" width="3em" mathbackground="blue"/>
+          <mspace id="over0034" height="1em" width="3em" mathbackground="red"/>
+        </munderover>
+        <munderover mathbackground="cyan" id="el0035" accent="true">
+          <mspace id="base0035" height="5em" width="1em" mathbackground="black"/>
+          <mspace id="under0035" height="1em" width="3em" mathbackground="blue"/>
+          <mspace id="over0035" height="1em" width="3em" mathbackground="red"/>
+        </munderover>
+        <munderover mathbackground="cyan" id="el0036" accent="true">
+          <mspace id="base0036" height="3em" width="1em" mathbackground="black"/>
+          <mspace id="under0036" height="1em" width="3em" mathbackground="blue"/>
+          <mspace id="over0036" height="1em" width="3em" mathbackground="red"/>
+        </munderover>
+      </math>
+    </p>
+    <hr/>
+    <p>
+      <math style="font-family: accentbaseheight4000overbarverticalgap11000;">
+        <mspace id="ref004" height="1em" width="3em" mathbackground="green"/>
+        <mover mathbackground="cyan" id="el0041">
+          <mspace id="base0041" height="3em" width="1em" mathbackground="black"/>
+          <mspace id="over0041" height="1em" width="3em" mathbackground="red"/>
+        </mover>
+        <mover mathbackground="cyan" id="el0042" accent="true">
+          <mspace id="base0042" height="5em" width="1em" mathbackground="black"/>
+          <mspace id="over0042" height="1em" width="3em" mathbackground="red"/>
+        </mover>
+        <mover mathbackground="cyan" id="el0043" accent="true">
+          <mspace id="base0043" height="3em" width="1em" mathbackground="black"/>
+          <mspace id="over0043" height="1em" width="3em" mathbackground="red"/>
+        </mover>
+        <munderover mathbackground="cyan" id="el0044">
+          <mspace id="base0044" height="3em" width="1em" mathbackground="black"/>
+          <mspace id="under0044" height="1em" width="3em" mathbackground="blue"/>
+          <mspace id="over0044" height="1em" width="3em" mathbackground="red"/>
+        </munderover>
+        <munderover mathbackground="cyan" id="el0045" accent="true">
+          <mspace id="base0045" height="5em" width="1em" mathbackground="black"/>
+          <mspace id="under0045" height="1em" width="3em" mathbackground="blue"/>
+          <mspace id="over0045" height="1em" width="3em" mathbackground="red"/>
+        </munderover>
+        <munderover mathbackground="cyan" id="el0046" accent="true">
+          <mspace id="base0046" height="3em" width="1em" mathbackground="black"/>
+          <mspace id="under0046" height="1em" width="3em" mathbackground="blue"/>
+          <mspace id="over0046" height="1em" width="3em" mathbackground="red"/>
+        </munderover>
+      </math>
+    </p>
+    <hr/>
+</body>
+</html>
diff --git a/LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-4-expected.txt b/LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-4-expected.txt
new file mode 100644 (file)
index 0000000..22c7b15
--- /dev/null
@@ -0,0 +1,48 @@
+
+
+
+
+
+PASS Baseline alignment 
+PASS Heights of bases 
+PASS AccentBaseHeight, UnderbarExtraDescender 
+PASS AccentBaseHeight, UnderbarVerticalGap 
+PASS AccentBaseHeight, OverbarExtraAscender 
+PASS AccentBaseHeight, OverbarVerticalGap 
+
diff --git a/LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-4.html b/LayoutTests/imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-4.html
new file mode 100644 (file)
index 0000000..8029614
--- /dev/null
@@ -0,0 +1,324 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Underscripts and Overscripts parameters</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS4">
+<meta name="assert" content="Elements munder, mover, munderover correctly use underbar/overbar and AccentBaseHeight parameters from the MATH table.">
+<script src="../../../../../resources/testharness.js"></script>
+<script src="../../../../../resources/testharnessreport.js"></script>
+<style>
+  math, mspace, mo {
+    font-size: 10px;
+  }
+  @font-face {
+    font-family: accentbaseheight4000underbarextradescender5000;
+    src: url("../../../fonts/math/underover-accentbaseheight4000-underbarextradescender5000.woff");
+  }
+  @font-face {
+    font-family: accentbaseheight4000underbarverticalgap7000;
+    src: url("../../../fonts/math/underover-accentbaseheight4000-underbarverticalgap7000.woff");
+  }
+  @font-face {
+    font-family: accentbaseheight4000overbarextraascender3000;
+    src: url("../../../fonts/math/underover-accentbaseheight4000-overbarextraascender3000.woff");
+  }
+  @font-face {
+    font-family: accentbaseheight4000overbarverticalgap11000;
+    src: url("../../../fonts/math/underover-accentbaseheight4000-overbarverticalgap11000.woff");
+  }
+</style>
+<script>
+  var emToPx = 10 / 1000; // font-size: 10px, font.em = 1000
+  var epsilon = 2;
+  var axisBaseHeight = 4000 *  emToPx;
+  var shortBaseHeight = 3000 * emToPx; // shortBaseHeight < axisBaseHeight
+  var tallBaseHeight = 5000 * emToPx; // tallBaseHeight > axisBaseHeight
+
+  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() {
+      for (var i = 1; i <= 4; i++) {
+        for (var j = 1; j <= 6; j++) {
+           var baseId = ("base00" + i) + j;
+           assert_approx_equals(getBox("ref00" + i).bottom,
+                                getBox(baseId).bottom,
+                                epsilon,
+                                "alignment of " + baseId);
+        }
+      }
+    }, "Baseline alignment");
+
+    test(function() {
+      for (var i = 1; i <= 4; i++) {
+        for (var j = 1; j <= 6; j++) {
+           var baseId = ("base00" + i) + j;
+           assert_approx_equals(getBox(baseId).height,
+                                j == 2 || j == 5 ?
+                                tallBaseHeight :shortBaseHeight,
+                                epsilon,
+                                "height of " + baseId);
+        }
+      }
+    }, "Heights of bases");
+
+    test(function() {
+      var v = 5000 * emToPx;
+      assert_approx_equals(getBox("ref001").bottom - getBox("over0014").bottom,
+                           shortBaseHeight, epsilon,
+                           "munderover: nonaccent over short base");
+      assert_approx_equals(getBox("ref001").bottom - getBox("over0015").bottom,
+                           tallBaseHeight, epsilon,
+                           "munderover: accent over tall base");
+      assert_approx_equals(getBox("ref001").bottom - getBox("over0016").bottom,
+                           axisBaseHeight, epsilon,
+                           "munderover: accent over short base");
+      for (var j = 1; j <= 6; j++) {
+        var elId = "el001" + j;
+        var baseId = "base001" + j;
+        var underId = "under001" + j;
+        assert_approx_equals(getBox(underId).top - getBox(baseId).bottom,
+                             0, epsilon,
+                             "gap between " + baseId + " and " + underId);
+        assert_approx_equals(getBox(elId).bottom - getBox(underId).bottom,
+                             v, epsilon,
+                             "extra descender below " + underId);
+      }
+    }, "AccentBaseHeight, UnderbarExtraDescender");
+
+    test(function() {
+      var v = 7000 * emToPx;
+      assert_approx_equals(getBox("ref002").bottom - getBox("over0024").bottom,
+                           shortBaseHeight, epsilon,
+                           "munderover: nonaccent over short base");
+      assert_approx_equals(getBox("ref002").bottom - getBox("over0025").bottom,
+                           tallBaseHeight, epsilon,
+                           "munderover: accent over tall base");
+      assert_approx_equals(getBox("ref002").bottom - getBox("over0026").bottom,
+                           axisBaseHeight, epsilon,
+                           "munderover: accent over short base");
+      for (var j = 1; j <= 6; j++) {
+        var elId = "el002" + j;
+        var baseId = "base002" + j;
+        var underId = "under002" + j;
+        var gap = (j == 2 || j == 3 ? 0 : v);
+        assert_approx_equals(getBox(underId).top - getBox(baseId).bottom,
+                             gap, epsilon,
+                             "gap between " + baseId + " and " + underId);
+      }
+    }, "AccentBaseHeight, UnderbarVerticalGap");
+
+    test(function() {
+      var v = 3000 * emToPx;
+      assert_approx_equals(getBox("ref003").bottom - getBox("over0031").bottom,
+                           shortBaseHeight, epsilon,
+                           "mover: nonaccent over short base");
+      assert_approx_equals(getBox("ref003").bottom - getBox("over0032").bottom,
+                           tallBaseHeight, epsilon,
+                           "mover: accent over tall base");
+      assert_approx_equals(getBox("ref003").bottom - getBox("over0033").bottom,
+                           axisBaseHeight, epsilon,
+                           "mover: accent over short base");
+      assert_approx_equals(getBox("ref003").bottom - getBox("over0034").bottom,
+                           shortBaseHeight, epsilon,
+                           "munderover: nonaccent over short base");
+      assert_approx_equals(getBox("ref003").bottom - getBox("over0035").bottom,
+                           tallBaseHeight, epsilon,
+                           "munderover: accent over tall base");
+      assert_approx_equals(getBox("ref003").bottom - getBox("over0036").bottom,
+                           axisBaseHeight, epsilon,
+                           "munderover: accent over short base");
+      for (var j = 1; j <= 6; j++) {
+        var elId = "el003" + j;
+        var baseId = "base003" + j;
+        if (j >= 4) {
+          var underId = "under003" + j;
+          assert_approx_equals(getBox(underId).top - getBox(baseId).bottom,
+                               0, epsilon,
+                               "gap between " + baseId + " and " + underId);
+        }
+        var overId = "over003" + j;
+        assert_approx_equals(getBox(overId).top - getBox(elId).top,
+                             v, epsilon,
+                             "extra ascender below " + overId);
+      }
+    }, "AccentBaseHeight, OverbarExtraAscender");
+
+    test(function() {
+      v = 11000 * emToPx;
+      assert_approx_equals(getBox("ref004").bottom - getBox("over0041").bottom,
+                           shortBaseHeight + v, epsilon,
+                           "mover: nonaccent over short base");
+      assert_approx_equals(getBox("ref004").bottom - getBox("over0042").bottom,
+                           tallBaseHeight, epsilon,
+                           "mover: accent over tall base");
+      assert_approx_equals(getBox("ref004").bottom - getBox("over0043").bottom,
+                           axisBaseHeight, epsilon,
+                           "mover: accent over short base");
+      assert_approx_equals(getBox("ref004").bottom - getBox("over0044").bottom,
+                           shortBaseHeight + v, epsilon,
+                           "munderover: nonaccent over short base");
+      assert_approx_equals(getBox("ref004").bottom - getBox("over0045").bottom,
+                           tallBaseHeight, epsilon,
+                           "munderover: accent over tall base");
+      assert_approx_equals(getBox("ref004").bottom - getBox("over0046").bottom,
+                           axisBaseHeight, epsilon,
+                           "munderover: accent over short base");
+      for (var j = 4; j <= 6; j++) {
+        var baseId = "base004" + j;
+        var underId = "under004" + j;
+        assert_approx_equals(getBox(underId).top - getBox(baseId).bottom,
+                             0, epsilon,
+                             "gap between " + baseId + " and " + underId);
+      }
+    }, "AccentBaseHeight, OverbarVerticalGap");
+
+    done();
+  }
+</script>
+</head>
+<body>
+    <p>
+      <math style="font-family: accentbaseheight4000underbarextradescender5000;">
+        <mspace id="ref001" height="1em" width="3em" mathbackground="green"/>
+        <munder mathbackground="cyan" id="el0011">
+          <mspace id="base0011" height="3em" width="1em" mathbackground="black"/>
+          <mo id="under0011" mathcolor="blue">&#xB0;</mo>
+        </munder>
+        <munder mathbackground="cyan" id="el0012">
+          <mspace id="base0012" height="5em" width="1em" mathbackground="black"/>
+          <mo id="under0012" mathcolor="blue">&#x2D8;</mo>
+        </munder>
+        <munder mathbackground="cyan" id="el0013">
+          <mspace id="base0013" height="3em" width="1em" mathbackground="black"/>
+          <mo id="under0013" mathcolor="blue">&#x2D8;</mo>
+        </munder>
+        <munderover mathbackground="cyan" id="el0014">
+          <mspace id="base0014" height="3em" width="1em" mathbackground="black"/>
+          <mo id="under0014" mathcolor="blue">&#xB0;</mo>
+          <mo id="over0014" mathcolor="red">&#xB0;</mo>
+        </munderover>
+        <munderover mathbackground="cyan" id="el0015" accent="true">
+          <mspace id="base0015" height="5em" width="1em" mathbackground="black"/>
+          <mo id="under0015" mathcolor="blue">&#x2D8;</mo>
+          <mo id="over0015" mathcolor="red">&#x2D8;</mo>
+        </munderover>
+        <munderover mathbackground="cyan" id="el0016" accent="true">
+          <mspace id="base0016" height="3em" width="1em" mathbackground="black"/>
+          <mo id="under0016" mathcolor="blue">&#x2D8;</mo>
+          <mo id="over0016" mathcolor="red">&#x2D8;</mo>
+        </munderover>
+      </math>
+    </p>
+    <hr/>
+    <p>
+      <math style="font-family: accentbaseheight4000underbarverticalgap7000;">
+        <mspace id="ref002" height="1em" width="3em" mathbackground="green"/>
+        <munder mathbackground="cyan" id="el0021" accentunder="false">
+          <mspace id="base0021" height="3em" width="1em" mathbackground="black"/>
+          <mo id="under0021" mathcolor="blue">&#x2D8;</mo>
+        </munder>
+        <munder mathbackground="cyan" id="el0022">
+          <mspace id="base0022" height="5em" width="1em" mathbackground="black"/>
+          <mo id="under0022" mathcolor="blue" accent="true">&#x2D8;</mo>
+        </munder>
+        <munder mathbackground="cyan" id="el0023">
+          <mspace id="base0023" height="3em" width="1em" mathbackground="black"/>
+          <mo id="under0023" mathcolor="blue" accent="true">&#xB0;</mo>
+        </munder>
+        <munderover mathbackground="cyan" id="el0024">
+          <mspace id="base0024" height="3em" width="1em" mathbackground="black"/>
+          <mo id="under0024" mathcolor="blue" accent="false">&#x2D8;</mo>
+          <mo id="over0024" mathcolor="red" accent="false">&#x2D8;</mo>
+        </munderover>
+        <munderover mathbackground="cyan" id="el0025">
+          <mspace id="base0025" height="5em" width="1em" mathbackground="black"/>
+          <mo id="under0025" mathcolor="blue" accent="false">&#x2D8;</mo>
+          <mo id="over0025" mathcolor="red">&#x2D8;</mo>
+        </munderover>
+        <munderover mathbackground="cyan" id="el0026">
+          <mspace id="base0026" height="3em" width="1em" mathbackground="black"/>
+          <mo id="under0026" mathcolor="blue" accent="false">&#x2D8;</mo>
+          <mo id="over0026" mathcolor="red">&#x2D8;</mo>
+        </munderover>
+      </math>
+    </p>
+    <hr/>
+    <p>
+      <math style="font-family: accentbaseheight4000overbarextraascender3000;">
+        <mspace id="ref003" height="1em" width="3em" mathbackground="green"/>
+        <mover mathbackground="cyan" id="el0031">
+          <mspace id="base0031" height="3em" width="1em" mathbackground="black"/>
+          <mo id="over0031" mathcolor="red">&#xB0;</mo>
+        </mover>
+        <mover mathbackground="cyan" id="el0032" accent="true">
+          <mspace id="base0032" height="5em" width="1em" mathbackground="black"/>
+          <mo id="over0032" mathcolor="red">&#xB0;</mo>
+        </mover>
+        <mover mathbackground="cyan" id="el0033">
+          <mspace id="base0033" height="3em" width="1em" mathbackground="black"/>
+          <mo id="over0033" mathcolor="red">&#x2D8;</mo>
+        </mover>
+        <munderover mathbackground="cyan" id="el0034">
+          <mspace id="base0034" height="3em" width="1em" mathbackground="black"/>
+          <mo id="under0034" mathcolor="blue">&#xB0;</mo>
+          <mo id="over0034" mathcolor="red" accent="false">&#x2D8;</mo>
+        </munderover>
+        <munderover mathbackground="cyan" id="el0035" accent="true">
+          <mspace id="base0035" height="5em" width="1em" mathbackground="black"/>
+          <mo id="under0035" mathcolor="blue">&#x2D8;</mo>
+          <mo id="over0035" mathcolor="red">&#x2D8;</mo>
+        </munderover>
+        <munderover mathbackground="cyan" id="el0036" accent="true">
+          <mspace id="base0036" height="3em" width="1em" mathbackground="black"/>
+          <mo id="under0036" mathcolor="blue">&#x2D8;</mo>
+          <mo id="over0036" mathcolor="red">&#x2D8;</mo>
+        </munderover>
+      </math>
+    </p>
+    <hr/>
+    <p>
+      <math style="font-family: accentbaseheight4000overbarverticalgap11000;">
+        <mspace id="ref004" height="1em" width="3em" mathbackground="green"/>
+        <mover mathbackground="cyan" id="el0041">
+          <mspace id="base0041" height="3em" width="1em" mathbackground="black"/>
+          <mo id="over0041" mathcolor="red">&#xB0;</mo>
+        </mover>
+        <mover mathbackground="cyan" id="el0042" accent="true">
+          <mspace id="base0042" height="5em" width="1em" mathbackground="black"/>
+          <mo id="over0042" mathcolor="red">&#xB0;</mo>
+        </mover>
+        <mover mathbackground="cyan" id="el0043">
+          <mspace id="base0043" height="3em" width="1em" mathbackground="black"/>
+          <mo id="over0043" mathcolor="red">&#x2D8;</mo>
+        </mover>
+        <munderover mathbackground="cyan" id="el0044">
+          <mspace id="base0044" height="3em" width="1em" mathbackground="black"/>
+          <mo id="under0044" mathcolor="blue">&#xB0;</mo>
+          <mo id="over0044" mathcolor="red" accent="false">&#x2D8;</mo>
+        </munderover>
+        <munderover mathbackground="cyan" id="el0045" accent="true">
+          <mspace id="base0045" height="5em" width="1em" mathbackground="black"/>
+          <mo id="under0045" mathcolor="blue">&#x2D8;</mo>
+          <mo id="over0045" mathcolor="red">&#x2D8;</mo>
+        </munderover>
+        <munderover mathbackground="cyan" id="el0046" accent="true">
+          <mspace id="base0046" height="3em" width="1em" mathbackground="black"/>
+          <mo id="under0046" mathcolor="blue">&#x2D8;</mo>
+          <mo id="over0046" mathcolor="red">&#x2D8;</mo>
+        </munderover>
+      </math>
+    </p>
+    <hr/>
+</body>
+</html>
diff --git a/LayoutTests/mathml/presentation/attributes-accent-accentunder-dynamic-expected.html b/LayoutTests/mathml/presentation/attributes-accent-accentunder-dynamic-expected.html
new file mode 100644 (file)
index 0000000..0b4d79f
--- /dev/null
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+   <head>
+     <title>accent / accentunder</title>
+     <meta charset="utf-8"/>
+     <style>
+       * {
+         font-size: 12pt;
+       }
+     </style>
+   </head>
+   <body>
+    <math>
+      <munder>
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo id="ra1">O</mo>
+      </munder>
+    </math>
+    <math>
+      <mover>
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo id="ra2">O</mo>
+      </mover>
+    </math>
+    <math>
+      <munderover>
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo id="ra3">O</mo>
+        <mo>O</mo>
+      </munderover>
+    </math>
+    <math>
+      <munderover>
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo>O</mo>
+        <mo id="ra4">O</mo>
+      </munderover>
+    </math>
+    <math>
+      <mover id="ra5">
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo>O</mo>
+      </mover>
+    </math>
+    <math>
+      <munderover id="ra6">
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo>O</mo>
+        <mo>O</mo>
+      </munderover>
+    </math>
+    <math>
+      <munder id="rau1">
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo>O</mo>
+      </munder>
+    </math>
+    <math>
+      <munderover id="rau2">
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo>O</mo>
+        <mo>O</mo>
+      </munderover>
+    </math>
+    <hr/>
+    <math>
+      <munder>
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo id="aa1" accent="true">O</mo>
+      </munder>
+    </math>
+    <math>
+      <mover>
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo id="aa2" accent="true">O</mo>
+      </mover>
+    </math>
+    <math>
+      <munderover>
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo id="aa3" accent="true">O</mo>
+        <mo>O</mo>
+      </munderover>
+    </math>
+    <math>
+      <munderover>
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo>O</mo>
+        <mo id="aa4" accent="true">O</mo>
+      </munderover>
+    </math>
+    <math>
+      <mover id="aa5" accent="true">
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo>O</mo>
+      </mover>
+    </math>
+    <math>
+      <munderover id="aa6" accent="true">
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo>O</mo>
+        <mo>O</mo>
+      </munderover>
+    </math>
+    <math>
+      <munder id="aau1" accentunder="true">
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo>O</mo>
+      </munder>
+    </math>
+    <math>
+      <munderover id="aau2" accentunder="true">
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo>O</mo>
+        <mo>O</mo>
+      </munderover>
+    </math>
+    </body>
+</html>
diff --git a/LayoutTests/mathml/presentation/attributes-accent-accentunder-dynamic.html b/LayoutTests/mathml/presentation/attributes-accent-accentunder-dynamic.html
new file mode 100644 (file)
index 0000000..b6a450f
--- /dev/null
@@ -0,0 +1,134 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+   <head>
+     <title>accent / accentunder</title>
+     <meta charset="utf-8"/>
+     <style>
+       * {
+         font-size: 12pt;
+       }
+     </style>
+     <script type="text/javascript">
+       function doTest() {
+         var i;
+         for (i = 1; i <= 6; i++) {
+           document.getElementById('ra' + i).removeAttribute('accent');
+           document.getElementById('aa' + i).setAttribute('accent', 'true');
+         }
+         for (i = 1; i <= 2; i++) {
+           document.getElementById('rau' + i).removeAttribute('accentunder');
+           document.getElementById('aau' + i).setAttribute('accentunder', 'true');
+         }
+         document.documentElement.removeAttribute("class");
+       }
+       window.addEventListener("load", doTest, false);
+     </script>
+   </head>
+   <body>
+    <math>
+      <munder>
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo id="ra1" accent="true">O</mo>
+      </munder>
+    </math>
+    <math>
+      <mover>
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo id="ra2" accent="true">O</mo>
+      </mover>
+    </math>
+    <math>
+      <munderover>
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo id="ra3" accent="true">O</mo>
+        <mo>O</mo>
+      </munderover>
+    </math>
+    <math>
+      <munderover>
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo>O</mo>
+        <mo id="ra4" accent="true">O</mo>
+      </munderover>
+    </math>
+    <math>
+      <mover id="ra5" accent="true">
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo>O</mo>
+      </mover>
+    </math>
+    <math>
+      <munderover id="ra6" accent="true">
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo>O</mo>
+        <mo>O</mo>
+      </munderover>
+    </math>
+    <math>
+      <munder id="rau1" accentunder="true">
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo>O</mo>
+      </munder>
+    </math>
+    <math>
+      <munderover id="rau2" accentunder="true">
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo>O</mo>
+        <mo>O</mo>
+      </munderover>
+    </math>
+    <hr/>
+    <math>
+      <munder>
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo id="aa1">O</mo>
+      </munder>
+    </math>
+    <math>
+      <mover>
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo id="aa2">O</mo>
+      </mover>
+    </math>
+    <math>
+      <munderover>
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo id="aa3">O</mo>
+        <mo>O</mo>
+      </munderover>
+    </math>
+    <math>
+      <munderover>
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo>O</mo>
+        <mo id="aa4">O</mo>
+      </munderover>
+    </math>
+    <math>
+      <mover id="aa5">
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo>O</mo>
+      </mover>
+    </math>
+    <math>
+      <munderover id="aa6">
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo>O</mo>
+        <mo>O</mo>
+      </munderover>
+    </math>
+    <math>
+      <munder id="aau1">
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo>O</mo>
+      </munder>
+    </math>
+    <math>
+      <munderover id="aau2">
+        <mspace width="1em" height="3em" mathbackground="red"/>
+        <mo>O</mo>
+        <mo>O</mo>
+      </munderover>
+    </math>
+    </body>
+</html>
index 00e0b22..ed3fa1e 100644 (file)
           <mi>C</mi>
         </munderover>
       </math>
-      <math>
-        <munder>
-          <mi>A</mi>
-          <mi>B</mi>
-        </munder>
-        <mover>
-          <mi>A</mi>
-          <mi>B</mi>
-        </mover>
-      </math>
     </div>
 
   </body>
index 4755a0d..c813a0f 100644 (file)
           <mi style="font-size: 0.75em !important">C</mi>
         </munderover>
       </math>
-
-      <!-- This verifies that <munderscript> with an empty script is
-           equivalent to the corresponding constructions with only one script.
-        -->
-      <math>
-        <munderover>
-          <mi>A</mi>
-          <mi>B</mi>
-          <mspace/>
-        </munderover>
-        <munderover>
-          <mi>A</mi>
-          <mspace/>
-          <mi>B</mi>
-        </munderover>
-      </math>
     </div>
 
   </body>
index bb3f0c1..5661f72 100644 (file)
@@ -1,6 +1,6 @@
 <!DOCTYPE html>
 <p>Vertical or non-stretchy operators inside an munderover element should not stretch.</p>
-<math>
+<math style="font: 20px Ahem">
   <munderover>
     <mspace width="100px" height="10px" mathbackground="red"/>
     <mtext>|</mtext>
index d301f6d..82c777d 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE html>
 <p>Vertical or non-stretchy operators inside an munderover element should not stretch.</p>
-<math>
+<math style="font: 20px Ahem">
   <munderover>
     <mspace width="100px" height="10px" mathbackground="red"/>
     <mo lspace="0px" rspace="0px">|</mo> <!-- stretchy vertical operator -->
-    <mo lspace="0px" rspace="0px" stretchy="false" >_</mo> <!-- non-stretchy horizontal operator -->
+    <mo lspace="0px" rspace="0px" stretchy="false" accent="false">_</mo> <!-- non-stretchy horizontal operator -->
   </munderover>
 </math>
index b7b3e1c..a96ef55 100644 (file)
Binary files a/LayoutTests/platform/gtk/mathml/opentype/horizontal-expected.png and b/LayoutTests/platform/gtk/mathml/opentype/horizontal-expected.png differ
index 5d35f32..728025b 100644 (file)
 layer at (0,0) size 800x600
   RenderView at (0,0) size 800x600
-layer at (0,0) size 800x166
-  RenderBlock {HTML} at (0,0) size 800x166
-    RenderBody {BODY} at (8,16) size 784x134
-      RenderBlock {P} at (0,0) size 784x17
-        RenderMathMLMath {math} at (0,4) size 24x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 22x10
-            RenderMathMLSpace {mspace} at (0,8) size 22x2 [bgcolor=#0000FF]
-            RenderMathMLOperator {mo} at (1,0) size 20x8
+layer at (0,0) size 800x190
+  RenderBlock {HTML} at (0,0) size 800x190
+    RenderBody {BODY} at (8,16) size 784x158
+      RenderBlock {P} at (0,0) size 784x21
+        RenderMathMLMath {math} at (0,2) size 24x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 22x16
+            RenderMathMLSpace {mspace} at (0,13) size 22x3 [bgcolor=#0000FF]
+            RenderMathMLOperator {mo} at (1,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{2190}"
-        RenderText {#text} at (24,0) size 4x17
-          text run at (24,0) width 4: " "
-        RenderMathMLMath {math} at (28,4) size 24x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 22x10
-            RenderMathMLSpace {mspace} at (0,8) size 22x2 [bgcolor=#0000FF]
-            RenderMathMLOperator {mo} at (1,0) size 20x8
+        RenderText {#text} at (24,4) size 4x17
+          text run at (24,4) width 4: " "
+        RenderMathMLMath {math} at (28,2) size 24x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 22x16
+            RenderMathMLSpace {mspace} at (0,13) size 22x3 [bgcolor=#0000FF]
+            RenderMathMLOperator {mo} at (1,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{2192}"
-        RenderText {#text} at (52,0) size 4x17
-          text run at (52,0) width 4: " "
-        RenderMathMLMath {math} at (56,4) size 24x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 22x10
-            RenderMathMLSpace {mspace} at (0,8) size 22x2 [bgcolor=#0000FF]
-            RenderMathMLOperator {mo} at (1,0) size 20x8
+        RenderText {#text} at (52,4) size 4x17
+          text run at (52,4) width 4: " "
+        RenderMathMLMath {math} at (56,2) size 24x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 22x16
+            RenderMathMLSpace {mspace} at (0,13) size 22x3 [bgcolor=#0000FF]
+            RenderMathMLOperator {mo} at (1,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{2194}"
-        RenderText {#text} at (80,0) size 4x17
-          text run at (80,0) width 4: " "
-        RenderMathMLMath {math} at (84,4) size 24x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 22x10
-            RenderMathMLSpace {mspace} at (0,8) size 22x2 [bgcolor=#0000FF]
-            RenderMathMLOperator {mo} at (1,0) size 20x8
+        RenderText {#text} at (80,4) size 4x17
+          text run at (80,4) width 4: " "
+        RenderMathMLMath {math} at (84,2) size 24x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 22x16
+            RenderMathMLSpace {mspace} at (0,13) size 22x3 [bgcolor=#0000FF]
+            RenderMathMLOperator {mo} at (1,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21A4}"
-        RenderText {#text} at (108,0) size 4x17
-          text run at (108,0) width 4: " "
-        RenderMathMLMath {math} at (112,4) size 24x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 22x10
-            RenderMathMLSpace {mspace} at (0,8) size 22x2 [bgcolor=#0000FF]
-            RenderMathMLOperator {mo} at (1,0) size 20x8
+        RenderText {#text} at (108,4) size 4x17
+          text run at (108,4) width 4: " "
+        RenderMathMLMath {math} at (112,2) size 24x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 22x16
+            RenderMathMLSpace {mspace} at (0,13) size 22x3 [bgcolor=#0000FF]
+            RenderMathMLOperator {mo} at (1,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21A6}"
-        RenderText {#text} at (136,0) size 4x17
-          text run at (136,0) width 4: " "
-        RenderMathMLMath {math} at (140,5) size 24x9 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 22x9
-            RenderMathMLSpace {mspace} at (0,7) size 22x2 [bgcolor=#0000FF]
-            RenderMathMLOperator {mo} at (1,0) size 20x7
+        RenderText {#text} at (136,4) size 4x17
+          text run at (136,4) width 4: " "
+        RenderMathMLMath {math} at (140,3) size 24x15 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 22x15
+            RenderMathMLSpace {mspace} at (0,12) size 22x3 [bgcolor=#0000FF]
+            RenderMathMLOperator {mo} at (1,0) size 20x8
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21BC}"
-        RenderText {#text} at (164,0) size 4x17
-          text run at (164,0) width 4: " "
-        RenderMathMLMath {math} at (168,7) size 24x7 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 22x7
-            RenderMathMLSpace {mspace} at (0,5) size 22x2 [bgcolor=#0000FF]
-            RenderMathMLOperator {mo} at (1,0) size 20x5
+        RenderText {#text} at (164,4) size 4x17
+          text run at (164,4) width 4: " "
+        RenderMathMLMath {math} at (168,5) size 24x13 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 22x13
+            RenderMathMLSpace {mspace} at (0,10) size 22x3 [bgcolor=#0000FF]
+            RenderMathMLOperator {mo} at (1,0) size 20x6
               RenderBlock (anonymous) at (0,0) size 12x5
                 RenderText {#text} at (0,-39) size 12x80
                   text run at (0,-39) width 12: "\x{21BD}"
-        RenderText {#text} at (192,0) size 4x17
-          text run at (192,0) width 4: " "
-        RenderMathMLMath {math} at (196,5) size 24x9 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 22x9
-            RenderMathMLSpace {mspace} at (0,7) size 22x2 [bgcolor=#0000FF]
-            RenderMathMLOperator {mo} at (1,0) size 20x7
+        RenderText {#text} at (192,4) size 4x17
+          text run at (192,4) width 4: " "
+        RenderMathMLMath {math} at (196,3) size 24x15 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 22x15
+            RenderMathMLSpace {mspace} at (0,12) size 22x3 [bgcolor=#0000FF]
+            RenderMathMLOperator {mo} at (1,0) size 20x8
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21C0}"
-        RenderText {#text} at (220,0) size 4x17
-          text run at (220,0) width 4: " "
-        RenderMathMLMath {math} at (224,4) size 24x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 22x10
-            RenderMathMLSpace {mspace} at (0,8) size 22x2 [bgcolor=#0000FF]
-            RenderMathMLOperator {mo} at (1,0) size 20x8
+        RenderText {#text} at (220,4) size 4x17
+          text run at (220,4) width 4: " "
+        RenderMathMLMath {math} at (224,2) size 24x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 22x16
+            RenderMathMLSpace {mspace} at (0,13) size 22x3 [bgcolor=#0000FF]
+            RenderMathMLOperator {mo} at (1,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21D0}"
-        RenderText {#text} at (248,0) size 4x17
-          text run at (248,0) width 4: " "
-        RenderMathMLMath {math} at (252,4) size 24x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 22x10
-            RenderMathMLSpace {mspace} at (0,8) size 22x2 [bgcolor=#0000FF]
-            RenderMathMLOperator {mo} at (1,0) size 20x8
+        RenderText {#text} at (248,4) size 4x17
+          text run at (248,4) width 4: " "
+        RenderMathMLMath {math} at (252,2) size 24x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 22x16
+            RenderMathMLSpace {mspace} at (0,13) size 22x3 [bgcolor=#0000FF]
+            RenderMathMLOperator {mo} at (1,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21D2}"
-        RenderText {#text} at (276,0) size 4x17
-          text run at (276,0) width 4: " "
-        RenderMathMLMath {math} at (280,4) size 24x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 22x10
-            RenderMathMLSpace {mspace} at (0,8) size 22x2 [bgcolor=#0000FF]
-            RenderMathMLOperator {mo} at (1,0) size 20x8
+        RenderText {#text} at (276,4) size 4x17
+          text run at (276,4) width 4: " "
+        RenderMathMLMath {math} at (280,2) size 24x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 22x16
+            RenderMathMLSpace {mspace} at (0,13) size 22x3 [bgcolor=#0000FF]
+            RenderMathMLOperator {mo} at (1,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21D4}"
-        RenderText {#text} at (304,0) size 4x17
-          text run at (304,0) width 4: " "
-        RenderMathMLMath {math} at (308,2) size 24x12 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 22x12
-            RenderMathMLSpace {mspace} at (0,10) size 22x2 [bgcolor=#0000FF]
-            RenderMathMLOperator {mo} at (1,0) size 20x10
+        RenderText {#text} at (304,4) size 4x17
+          text run at (304,4) width 4: " "
+        RenderMathMLMath {math} at (308,0) size 24x18 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 22x18
+            RenderMathMLSpace {mspace} at (0,15) size 22x3 [bgcolor=#0000FF]
+            RenderMathMLOperator {mo} at (1,0) size 20x11
               RenderBlock (anonymous) at (0,0) size 12x10
                 RenderText {#text} at (0,-35) size 12x80
                   text run at (0,-35) width 12: "\x{21DA}"
-        RenderText {#text} at (332,0) size 4x17
-          text run at (332,0) width 4: " "
-        RenderMathMLMath {math} at (336,2) size 24x12 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 22x12
-            RenderMathMLSpace {mspace} at (0,10) size 22x2 [bgcolor=#0000FF]
-            RenderMathMLOperator {mo} at (1,0) size 20x10
+        RenderText {#text} at (332,4) size 4x17
+          text run at (332,4) width 4: " "
+        RenderMathMLMath {math} at (336,0) size 24x18 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 22x18
+            RenderMathMLSpace {mspace} at (0,15) size 22x3 [bgcolor=#0000FF]
+            RenderMathMLOperator {mo} at (1,0) size 20x11
               RenderBlock (anonymous) at (0,0) size 12x10
                 RenderText {#text} at (0,-35) size 12x80
                   text run at (0,-35) width 12: "\x{21DB}"
-        RenderText {#text} at (360,0) size 4x17
-          text run at (360,0) width 4: " "
-        RenderMathMLMath {math} at (364,9) size 24x5 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 22x5
-            RenderMathMLSpace {mspace} at (0,3) size 22x2 [bgcolor=#0000FF]
-            RenderMathMLOperator {mo} at (9,0) size 4x3
+        RenderText {#text} at (360,4) size 4x17
+          text run at (360,4) width 4: " "
+        RenderMathMLMath {math} at (364,7) size 24x11 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 22x11
+            RenderMathMLSpace {mspace} at (0,8) size 22x3 [bgcolor=#0000FF]
+            RenderMathMLOperator {mo} at (9,0) size 4x4
               RenderBlock (anonymous) at (0,0) size 4x10
                 RenderText {#text} at (0,-34) size 4x80
                   text run at (0,-34) width 4: "\x{23B4}"
-        RenderText {#text} at (388,0) size 4x17
-          text run at (388,0) width 4: " "
-        RenderMathMLMath {math} at (392,9) size 24x5 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 22x5
-            RenderMathMLSpace {mspace} at (0,3) size 22x2 [bgcolor=#0000FF]
-            RenderMathMLOperator {mo} at (9,0) size 4x3
+        RenderText {#text} at (388,4) size 4x17
+          text run at (388,4) width 4: " "
+        RenderMathMLMath {math} at (392,7) size 24x11 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 22x11
+            RenderMathMLSpace {mspace} at (0,8) size 22x3 [bgcolor=#0000FF]
+            RenderMathMLOperator {mo} at (9,0) size 4x4
               RenderBlock (anonymous) at (0,0) size 4x4
                 RenderText {#text} at (0,-43) size 4x80
                   text run at (0,-43) width 4: "\x{23B5}"
-        RenderText {#text} at (416,0) size 4x17
-          text run at (416,0) width 4: " "
-        RenderMathMLMath {math} at (420,8) size 24x6 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 22x6
-            RenderMathMLSpace {mspace} at (0,4) size 22x2 [bgcolor=#0000FF]
-            RenderMathMLOperator {mo} at (8,0) size 6x4
+        RenderText {#text} at (416,4) size 4x17
+          text run at (416,4) width 4: " "
+        RenderMathMLMath {math} at (420,6) size 24x12 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 22x12
+            RenderMathMLSpace {mspace} at (0,9) size 22x3 [bgcolor=#0000FF]
+            RenderMathMLOperator {mo} at (8,0) size 6x5
               RenderBlock (anonymous) at (0,0) size 6x10
                 RenderText {#text} at (0,-34) size 6x80
                   text run at (0,-34) width 6: "\x{23DC}"
-        RenderText {#text} at (444,0) size 4x17
-          text run at (444,0) width 4: " "
-        RenderMathMLMath {math} at (448,7) size 24x7 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 22x7
-            RenderMathMLSpace {mspace} at (0,5) size 22x2 [bgcolor=#0000FF]
-            RenderMathMLOperator {mo} at (8,0) size 6x5
+        RenderText {#text} at (444,4) size 4x17
+          text run at (444,4) width 4: " "
+        RenderMathMLMath {math} at (448,5) size 24x13 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 22x13
+            RenderMathMLSpace {mspace} at (0,10) size 22x3 [bgcolor=#0000FF]
+            RenderMathMLOperator {mo} at (8,0) size 6x6
               RenderBlock (anonymous) at (0,0) size 6x4
                 RenderText {#text} at (0,-43) size 6x80
                   text run at (0,-43) width 6: "\x{23DD}"
-        RenderText {#text} at (472,0) size 4x17
-          text run at (472,0) width 4: " "
-        RenderMathMLMath {math} at (476,8) size 24x6 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 22x6
-            RenderMathMLSpace {mspace} at (0,4) size 22x2 [bgcolor=#0000FF]
-            RenderMathMLOperator {mo} at (8,0) size 6x4
+        RenderText {#text} at (472,4) size 4x17
+          text run at (472,4) width 4: " "
+        RenderMathMLMath {math} at (476,6) size 24x12 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 22x12
+            RenderMathMLSpace {mspace} at (0,9) size 22x3 [bgcolor=#0000FF]
+            RenderMathMLOperator {mo} at (8,0) size 6x5
               RenderBlock (anonymous) at (0,0) size 6x11
                 RenderText {#text} at (0,-33) size 6x80
                   text run at (0,-33) width 6: "\x{23DE}"
-        RenderText {#text} at (500,0) size 4x17
-          text run at (500,0) width 4: " "
-        RenderMathMLMath {math} at (504,7) size 24x7 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 22x7
-            RenderMathMLSpace {mspace} at (0,5) size 22x2 [bgcolor=#0000FF]
-            RenderMathMLOperator {mo} at (8,0) size 6x5
+        RenderText {#text} at (500,4) size 4x17
+          text run at (500,4) width 4: " "
+        RenderMathMLMath {math} at (504,5) size 24x13 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 22x13
+            RenderMathMLSpace {mspace} at (0,10) size 22x3 [bgcolor=#0000FF]
+            RenderMathMLOperator {mo} at (8,0) size 6x6
               RenderBlock (anonymous) at (0,0) size 6x5
                 RenderText {#text} at (0,-43) size 6x80
                   text run at (0,-43) width 6: "\x{23DF}"
         RenderText {#text} at (0,0) size 0x0
-      RenderBlock {P} at (0,33) size 784x34
-        RenderMathMLMath {math} at (0,4) size 52x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 50x10
-            RenderMathMLSpace {mspace} at (0,8) size 50x2 [bgcolor=#008000]
-            RenderMathMLOperator {mo} at (15,0) size 20x8
+      RenderBlock {P} at (0,37) size 784x43
+        RenderMathMLMath {math} at (0,2) size 52x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 50x16
+            RenderMathMLSpace {mspace} at (0,13) size 50x3 [bgcolor=#008000]
+            RenderMathMLOperator {mo} at (15,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{2190}"
-        RenderText {#text} at (52,0) size 4x17
-          text run at (52,0) width 4: " "
-        RenderMathMLMath {math} at (56,4) size 52x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 50x10
-            RenderMathMLSpace {mspace} at (0,8) size 50x2 [bgcolor=#008000]
-            RenderMathMLOperator {mo} at (15,0) size 20x8
+        RenderText {#text} at (52,4) size 4x17
+          text run at (52,4) width 4: " "
+        RenderMathMLMath {math} at (56,2) size 52x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 50x16
+            RenderMathMLSpace {mspace} at (0,13) size 50x3 [bgcolor=#008000]
+            RenderMathMLOperator {mo} at (15,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{2192}"
-        RenderText {#text} at (108,0) size 4x17
-          text run at (108,0) width 4: " "
-        RenderMathMLMath {math} at (112,4) size 52x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 50x10
-            RenderMathMLSpace {mspace} at (0,8) size 50x2 [bgcolor=#008000]
-            RenderMathMLOperator {mo} at (15,0) size 20x8
+        RenderText {#text} at (108,4) size 4x17
+          text run at (108,4) width 4: " "
+        RenderMathMLMath {math} at (112,2) size 52x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 50x16
+            RenderMathMLSpace {mspace} at (0,13) size 50x3 [bgcolor=#008000]
+            RenderMathMLOperator {mo} at (15,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{2194}"
-        RenderText {#text} at (164,0) size 4x17
-          text run at (164,0) width 4: " "
-        RenderMathMLMath {math} at (168,4) size 52x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 50x10
-            RenderMathMLSpace {mspace} at (0,8) size 50x2 [bgcolor=#008000]
-            RenderMathMLOperator {mo} at (15,0) size 20x8
+        RenderText {#text} at (164,4) size 4x17
+          text run at (164,4) width 4: " "
+        RenderMathMLMath {math} at (168,2) size 52x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 50x16
+            RenderMathMLSpace {mspace} at (0,13) size 50x3 [bgcolor=#008000]
+            RenderMathMLOperator {mo} at (15,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21A4}"
-        RenderText {#text} at (220,0) size 4x17
-          text run at (220,0) width 4: " "
-        RenderMathMLMath {math} at (224,4) size 52x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 50x10
-            RenderMathMLSpace {mspace} at (0,8) size 50x2 [bgcolor=#008000]
-            RenderMathMLOperator {mo} at (15,0) size 20x8
+        RenderText {#text} at (220,4) size 4x17
+          text run at (220,4) width 4: " "
+        RenderMathMLMath {math} at (224,2) size 52x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 50x16
+            RenderMathMLSpace {mspace} at (0,13) size 50x3 [bgcolor=#008000]
+            RenderMathMLOperator {mo} at (15,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21A6}"
-        RenderText {#text} at (276,0) size 4x17
-          text run at (276,0) width 4: " "
-        RenderMathMLMath {math} at (280,5) size 52x9 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 50x9
-            RenderMathMLSpace {mspace} at (0,7) size 50x2 [bgcolor=#008000]
-            RenderMathMLOperator {mo} at (15,0) size 20x7
+        RenderText {#text} at (276,4) size 4x17
+          text run at (276,4) width 4: " "
+        RenderMathMLMath {math} at (280,3) size 52x15 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 50x15
+            RenderMathMLSpace {mspace} at (0,12) size 50x3 [bgcolor=#008000]
+            RenderMathMLOperator {mo} at (15,0) size 20x8
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21BC}"
-        RenderText {#text} at (332,0) size 4x17
-          text run at (332,0) width 4: " "
-        RenderMathMLMath {math} at (336,7) size 52x7 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 50x7
-            RenderMathMLSpace {mspace} at (0,5) size 50x2 [bgcolor=#008000]
-            RenderMathMLOperator {mo} at (15,0) size 20x5
+        RenderText {#text} at (332,4) size 4x17
+          text run at (332,4) width 4: " "
+        RenderMathMLMath {math} at (336,5) size 52x13 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 50x13
+            RenderMathMLSpace {mspace} at (0,10) size 50x3 [bgcolor=#008000]
+            RenderMathMLOperator {mo} at (15,0) size 20x6
               RenderBlock (anonymous) at (0,0) size 12x5
                 RenderText {#text} at (0,-39) size 12x80
                   text run at (0,-39) width 12: "\x{21BD}"
-        RenderText {#text} at (388,0) size 4x17
-          text run at (388,0) width 4: " "
-        RenderMathMLMath {math} at (392,5) size 52x9 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 50x9
-            RenderMathMLSpace {mspace} at (0,7) size 50x2 [bgcolor=#008000]
-            RenderMathMLOperator {mo} at (15,0) size 20x7
+        RenderText {#text} at (388,4) size 4x17
+          text run at (388,4) width 4: " "
+        RenderMathMLMath {math} at (392,3) size 52x15 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 50x15
+            RenderMathMLSpace {mspace} at (0,12) size 50x3 [bgcolor=#008000]
+            RenderMathMLOperator {mo} at (15,0) size 20x8
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21C0}"
-        RenderText {#text} at (444,0) size 4x17
-          text run at (444,0) width 4: " "
-        RenderMathMLMath {math} at (448,4) size 52x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 50x10
-            RenderMathMLSpace {mspace} at (0,8) size 50x2 [bgcolor=#008000]
-            RenderMathMLOperator {mo} at (15,0) size 20x8
+        RenderText {#text} at (444,4) size 4x17
+          text run at (444,4) width 4: " "
+        RenderMathMLMath {math} at (448,2) size 52x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 50x16
+            RenderMathMLSpace {mspace} at (0,13) size 50x3 [bgcolor=#008000]
+            RenderMathMLOperator {mo} at (15,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21D0}"
-        RenderText {#text} at (500,0) size 4x17
-          text run at (500,0) width 4: " "
-        RenderMathMLMath {math} at (504,4) size 52x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 50x10
-            RenderMathMLSpace {mspace} at (0,8) size 50x2 [bgcolor=#008000]
-            RenderMathMLOperator {mo} at (15,0) size 20x8
+        RenderText {#text} at (500,4) size 4x17
+          text run at (500,4) width 4: " "
+        RenderMathMLMath {math} at (504,2) size 52x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 50x16
+            RenderMathMLSpace {mspace} at (0,13) size 50x3 [bgcolor=#008000]
+            RenderMathMLOperator {mo} at (15,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21D2}"
-        RenderText {#text} at (556,0) size 4x17
-          text run at (556,0) width 4: " "
-        RenderMathMLMath {math} at (560,4) size 52x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 50x10
-            RenderMathMLSpace {mspace} at (0,8) size 50x2 [bgcolor=#008000]
-            RenderMathMLOperator {mo} at (15,0) size 20x8
+        RenderText {#text} at (556,4) size 4x17
+          text run at (556,4) width 4: " "
+        RenderMathMLMath {math} at (560,2) size 52x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 50x16
+            RenderMathMLSpace {mspace} at (0,13) size 50x3 [bgcolor=#008000]
+            RenderMathMLOperator {mo} at (15,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21D4}"
-        RenderText {#text} at (612,0) size 4x17
-          text run at (612,0) width 4: " "
-        RenderMathMLMath {math} at (616,2) size 52x12 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 50x12
-            RenderMathMLSpace {mspace} at (0,10) size 50x2 [bgcolor=#008000]
-            RenderMathMLOperator {mo} at (15,0) size 20x10
+        RenderText {#text} at (612,4) size 4x17
+          text run at (612,4) width 4: " "
+        RenderMathMLMath {math} at (616,0) size 52x18 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 50x18
+            RenderMathMLSpace {mspace} at (0,15) size 50x3 [bgcolor=#008000]
+            RenderMathMLOperator {mo} at (15,0) size 20x11
               RenderBlock (anonymous) at (0,0) size 12x10
                 RenderText {#text} at (0,-35) size 12x80
                   text run at (0,-35) width 12: "\x{21DA}"
-        RenderText {#text} at (668,0) size 4x17
-          text run at (668,0) width 4: " "
-        RenderMathMLMath {math} at (672,2) size 52x12 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 50x12
-            RenderMathMLSpace {mspace} at (0,10) size 50x2 [bgcolor=#008000]
-            RenderMathMLOperator {mo} at (15,0) size 20x10
+        RenderText {#text} at (668,4) size 4x17
+          text run at (668,4) width 4: " "
+        RenderMathMLMath {math} at (672,0) size 52x18 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 50x18
+            RenderMathMLSpace {mspace} at (0,15) size 50x3 [bgcolor=#008000]
+            RenderMathMLOperator {mo} at (15,0) size 20x11
               RenderBlock (anonymous) at (0,0) size 12x10
                 RenderText {#text} at (0,-35) size 12x80
                   text run at (0,-35) width 12: "\x{21DB}"
-        RenderText {#text} at (724,0) size 4x17
-          text run at (724,0) width 4: " "
-        RenderMathMLMath {math} at (728,2) size 52x12 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 50x12
-            RenderMathMLSpace {mspace} at (0,10) size 50x2 [bgcolor=#008000]
-            RenderMathMLOperator {mo} at (23,0) size 4x10
+        RenderText {#text} at (724,4) size 4x17
+          text run at (724,4) width 4: " "
+        RenderMathMLMath {math} at (728,0) size 52x18 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 50x18
+            RenderMathMLSpace {mspace} at (0,15) size 50x3 [bgcolor=#008000]
+            RenderMathMLOperator {mo} at (23,0) size 4x11
               RenderBlock (anonymous) at (0,0) size 4x10
                 RenderText {#text} at (0,-34) size 4x80
                   text run at (0,-34) width 4: "\x{23B4}"
         RenderText {#text} at (0,0) size 0x0
-        RenderMathMLMath {math} at (0,24) size 52x7 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 50x7
-            RenderMathMLSpace {mspace} at (0,5) size 50x2 [bgcolor=#008000]
-            RenderMathMLOperator {mo} at (23,0) size 4x5
+        RenderMathMLMath {math} at (0,27) size 52x13 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 50x13
+            RenderMathMLSpace {mspace} at (0,10) size 50x3 [bgcolor=#008000]
+            RenderMathMLOperator {mo} at (23,0) size 4x6
               RenderBlock (anonymous) at (0,0) size 4x4
                 RenderText {#text} at (0,-43) size 4x80
                   text run at (0,-43) width 4: "\x{23B5}"
-        RenderText {#text} at (52,17) size 4x17
-          text run at (52,17) width 4: " "
-        RenderMathMLMath {math} at (56,19) size 52x12 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 50x12
-            RenderMathMLSpace {mspace} at (0,10) size 50x2 [bgcolor=#008000]
-            RenderMathMLOperator {mo} at (22,0) size 6x10
+        RenderText {#text} at (52,26) size 4x17
+          text run at (52,26) width 4: " "
+        RenderMathMLMath {math} at (56,22) size 52x18 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 50x18
+            RenderMathMLSpace {mspace} at (0,15) size 50x3 [bgcolor=#008000]
+            RenderMathMLOperator {mo} at (22,0) size 6x11
               RenderBlock (anonymous) at (0,0) size 6x10
                 RenderText {#text} at (0,-34) size 6x80
                   text run at (0,-34) width 6: "\x{23DC}"
-        RenderText {#text} at (108,17) size 4x17
-          text run at (108,17) width 4: " "
-        RenderMathMLMath {math} at (112,24) size 52x7 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 50x7
-            RenderMathMLSpace {mspace} at (0,5) size 50x2 [bgcolor=#008000]
-            RenderMathMLOperator {mo} at (22,0) size 6x5
+        RenderText {#text} at (108,26) size 4x17
+          text run at (108,26) width 4: " "
+        RenderMathMLMath {math} at (112,27) size 52x13 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 50x13
+            RenderMathMLSpace {mspace} at (0,10) size 50x3 [bgcolor=#008000]
+            RenderMathMLOperator {mo} at (22,0) size 6x6
               RenderBlock (anonymous) at (0,0) size 6x4
                 RenderText {#text} at (0,-43) size 6x80
                   text run at (0,-43) width 6: "\x{23DD}"
-        RenderText {#text} at (164,17) size 4x17
-          text run at (164,17) width 4: " "
-        RenderMathMLMath {math} at (168,18) size 52x13 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 50x13
-            RenderMathMLSpace {mspace} at (0,11) size 50x2 [bgcolor=#008000]
-            RenderMathMLOperator {mo} at (22,0) size 6x11
+        RenderText {#text} at (164,26) size 4x17
+          text run at (164,26) width 4: " "
+        RenderMathMLMath {math} at (168,21) size 52x19 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 50x19
+            RenderMathMLSpace {mspace} at (0,16) size 50x3 [bgcolor=#008000]
+            RenderMathMLOperator {mo} at (22,0) size 6x12
               RenderBlock (anonymous) at (0,0) size 6x11
                 RenderText {#text} at (0,-33) size 6x80
                   text run at (0,-33) width 6: "\x{23DE}"
-        RenderText {#text} at (220,17) size 4x17
-          text run at (220,17) width 4: " "
-        RenderMathMLMath {math} at (224,23) size 52x8 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 50x8
-            RenderMathMLSpace {mspace} at (0,6) size 50x2 [bgcolor=#008000]
-            RenderMathMLOperator {mo} at (22,0) size 6x6
+        RenderText {#text} at (220,26) size 4x17
+          text run at (220,26) width 4: " "
+        RenderMathMLMath {math} at (224,26) size 52x14 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 50x14
+            RenderMathMLSpace {mspace} at (0,11) size 50x3 [bgcolor=#008000]
+            RenderMathMLOperator {mo} at (22,0) size 6x7
               RenderBlock (anonymous) at (0,0) size 6x5
                 RenderText {#text} at (0,-43) size 6x80
                   text run at (0,-43) width 6: "\x{23DF}"
         RenderText {#text} at (0,0) size 0x0
-      RenderBlock {P} at (0,83) size 784x51
-        RenderMathMLMath {math} at (0,4) size 102x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 100x10
-            RenderMathMLSpace {mspace} at (0,8) size 100x2 [bgcolor=#FF0000]
-            RenderMathMLOperator {mo} at (40,0) size 20x8
+      RenderBlock {P} at (0,96) size 784x62
+        RenderMathMLMath {math} at (0,0) size 102x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 100x16
+            RenderMathMLSpace {mspace} at (0,13) size 100x3 [bgcolor=#FF0000]
+            RenderMathMLOperator {mo} at (40,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{2190}"
-        RenderText {#text} at (102,0) size 4x17
-          text run at (102,0) width 4: " "
-        RenderMathMLMath {math} at (106,4) size 102x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 100x10
-            RenderMathMLSpace {mspace} at (0,8) size 100x2 [bgcolor=#FF0000]
-            RenderMathMLOperator {mo} at (40,0) size 20x8
+        RenderText {#text} at (102,2) size 4x17
+          text run at (102,2) width 4: " "
+        RenderMathMLMath {math} at (106,0) size 102x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 100x16
+            RenderMathMLSpace {mspace} at (0,13) size 100x3 [bgcolor=#FF0000]
+            RenderMathMLOperator {mo} at (40,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{2192}"
-        RenderText {#text} at (208,0) size 4x17
-          text run at (208,0) width 4: " "
-        RenderMathMLMath {math} at (212,4) size 102x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 100x10
-            RenderMathMLSpace {mspace} at (0,8) size 100x2 [bgcolor=#FF0000]
-            RenderMathMLOperator {mo} at (40,0) size 20x8
+        RenderText {#text} at (208,2) size 4x17
+          text run at (208,2) width 4: " "
+        RenderMathMLMath {math} at (212,0) size 102x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 100x16
+            RenderMathMLSpace {mspace} at (0,13) size 100x3 [bgcolor=#FF0000]
+            RenderMathMLOperator {mo} at (40,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{2194}"
-        RenderText {#text} at (314,0) size 4x17
-          text run at (314,0) width 4: " "
-        RenderMathMLMath {math} at (318,4) size 102x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 100x10
-            RenderMathMLSpace {mspace} at (0,8) size 100x2 [bgcolor=#FF0000]
-            RenderMathMLOperator {mo} at (40,0) size 20x8
+        RenderText {#text} at (314,2) size 4x17
+          text run at (314,2) width 4: " "
+        RenderMathMLMath {math} at (318,0) size 102x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 100x16
+            RenderMathMLSpace {mspace} at (0,13) size 100x3 [bgcolor=#FF0000]
+            RenderMathMLOperator {mo} at (40,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21A4}"
-        RenderText {#text} at (420,0) size 4x17
-          text run at (420,0) width 4: " "
-        RenderMathMLMath {math} at (424,4) size 102x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 100x10
-            RenderMathMLSpace {mspace} at (0,8) size 100x2 [bgcolor=#FF0000]
-            RenderMathMLOperator {mo} at (40,0) size 20x8
+        RenderText {#text} at (420,2) size 4x17
+          text run at (420,2) width 4: " "
+        RenderMathMLMath {math} at (424,0) size 102x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 100x16
+            RenderMathMLSpace {mspace} at (0,13) size 100x3 [bgcolor=#FF0000]
+            RenderMathMLOperator {mo} at (40,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21A6}"
-        RenderText {#text} at (526,0) size 4x17
-          text run at (526,0) width 4: " "
-        RenderMathMLMath {math} at (530,5) size 102x9 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 100x9
-            RenderMathMLSpace {mspace} at (0,7) size 100x2 [bgcolor=#FF0000]
-            RenderMathMLOperator {mo} at (40,0) size 20x7
+        RenderText {#text} at (526,2) size 4x17
+          text run at (526,2) width 4: " "
+        RenderMathMLMath {math} at (530,1) size 102x15 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 100x15
+            RenderMathMLSpace {mspace} at (0,12) size 100x3 [bgcolor=#FF0000]
+            RenderMathMLOperator {mo} at (40,0) size 20x8
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21BC}"
-        RenderText {#text} at (632,0) size 4x17
-          text run at (632,0) width 4: " "
-        RenderMathMLMath {math} at (636,7) size 102x7 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 100x7
-            RenderMathMLSpace {mspace} at (0,5) size 100x2 [bgcolor=#FF0000]
-            RenderMathMLOperator {mo} at (40,0) size 20x5
+        RenderText {#text} at (632,2) size 4x17
+          text run at (632,2) width 4: " "
+        RenderMathMLMath {math} at (636,3) size 102x13 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 100x13
+            RenderMathMLSpace {mspace} at (0,10) size 100x3 [bgcolor=#FF0000]
+            RenderMathMLOperator {mo} at (40,0) size 20x6
               RenderBlock (anonymous) at (0,0) size 12x5
                 RenderText {#text} at (0,-39) size 12x80
                   text run at (0,-39) width 12: "\x{21BD}"
         RenderText {#text} at (0,0) size 0x0
-        RenderMathMLMath {math} at (0,22) size 102x9 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 100x9
-            RenderMathMLSpace {mspace} at (0,7) size 100x2 [bgcolor=#FF0000]
-            RenderMathMLOperator {mo} at (40,0) size 20x7
+        RenderMathMLMath {math} at (0,22) size 102x15 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 100x15
+            RenderMathMLSpace {mspace} at (0,12) size 100x3 [bgcolor=#FF0000]
+            RenderMathMLOperator {mo} at (40,0) size 20x8
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21C0}"
-        RenderText {#text} at (102,17) size 4x17
-          text run at (102,17) width 4: " "
-        RenderMathMLMath {math} at (106,21) size 102x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 100x10
-            RenderMathMLSpace {mspace} at (0,8) size 100x2 [bgcolor=#FF0000]
-            RenderMathMLOperator {mo} at (40,0) size 20x8
+        RenderText {#text} at (102,23) size 4x17
+          text run at (102,23) width 4: " "
+        RenderMathMLMath {math} at (106,21) size 102x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 100x16
+            RenderMathMLSpace {mspace} at (0,13) size 100x3 [bgcolor=#FF0000]
+            RenderMathMLOperator {mo} at (40,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21D0}"
-        RenderText {#text} at (208,17) size 4x17
-          text run at (208,17) width 4: " "
-        RenderMathMLMath {math} at (212,21) size 102x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 100x10
-            RenderMathMLSpace {mspace} at (0,8) size 100x2 [bgcolor=#FF0000]
-            RenderMathMLOperator {mo} at (40,0) size 20x8
+        RenderText {#text} at (208,23) size 4x17
+          text run at (208,23) width 4: " "
+        RenderMathMLMath {math} at (212,21) size 102x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 100x16
+            RenderMathMLSpace {mspace} at (0,13) size 100x3 [bgcolor=#FF0000]
+            RenderMathMLOperator {mo} at (40,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21D2}"
-        RenderText {#text} at (314,17) size 4x17
-          text run at (314,17) width 4: " "
-        RenderMathMLMath {math} at (318,21) size 102x10 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 100x10
-            RenderMathMLSpace {mspace} at (0,8) size 100x2 [bgcolor=#FF0000]
-            RenderMathMLOperator {mo} at (40,0) size 20x8
+        RenderText {#text} at (314,23) size 4x17
+          text run at (314,23) width 4: " "
+        RenderMathMLMath {math} at (318,21) size 102x16 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 100x16
+            RenderMathMLSpace {mspace} at (0,13) size 100x3 [bgcolor=#FF0000]
+            RenderMathMLOperator {mo} at (40,0) size 20x9
               RenderBlock (anonymous) at (0,0) size 12x8
                 RenderText {#text} at (0,-36) size 12x80
                   text run at (0,-36) width 12: "\x{21D4}"
-        RenderText {#text} at (420,17) size 4x17
-          text run at (420,17) width 4: " "
-        RenderMathMLMath {math} at (424,19) size 102x12 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 100x12
-            RenderMathMLSpace {mspace} at (0,10) size 100x2 [bgcolor=#FF0000]
-            RenderMathMLOperator {mo} at (40,0) size 20x10
+        RenderText {#text} at (420,23) size 4x17
+          text run at (420,23) width 4: " "
+        RenderMathMLMath {math} at (424,19) size 102x18 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 100x18
+            RenderMathMLSpace {mspace} at (0,15) size 100x3 [bgcolor=#FF0000]
+            RenderMathMLOperator {mo} at (40,0) size 20x11
               RenderBlock (anonymous) at (0,0) size 12x10
                 RenderText {#text} at (0,-35) size 12x80
                   text run at (0,-35) width 12: "\x{21DA}"
-        RenderText {#text} at (526,17) size 4x17
-          text run at (526,17) width 4: " "
-        RenderMathMLMath {math} at (530,19) size 102x12 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 100x12
-            RenderMathMLSpace {mspace} at (0,10) size 100x2 [bgcolor=#FF0000]
-            RenderMathMLOperator {mo} at (40,0) size 20x10
+        RenderText {#text} at (526,23) size 4x17
+          text run at (526,23) width 4: " "
+        RenderMathMLMath {math} at (530,19) size 102x18 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 100x18
+            RenderMathMLSpace {mspace} at (0,15) size 100x3 [bgcolor=#FF0000]
+            RenderMathMLOperator {mo} at (40,0) size 20x11
               RenderBlock (anonymous) at (0,0) size 12x10
                 RenderText {#text} at (0,-35) size 12x80
                   text run at (0,-35) width 12: "\x{21DB}"
-        RenderText {#text} at (632,17) size 4x17
-          text run at (632,17) width 4: " "
-        RenderMathMLMath {math} at (636,19) size 102x12 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 100x12
-            RenderMathMLSpace {mspace} at (0,10) size 100x2 [bgcolor=#FF0000]
-            RenderMathMLOperator {mo} at (48,0) size 4x10
+        RenderText {#text} at (632,23) size 4x17
+          text run at (632,23) width 4: " "
+        RenderMathMLMath {math} at (636,19) size 102x18 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 100x18
+            RenderMathMLSpace {mspace} at (0,15) size 100x3 [bgcolor=#FF0000]
+            RenderMathMLOperator {mo} at (48,0) size 4x11
               RenderBlock (anonymous) at (0,0) size 4x10
                 RenderText {#text} at (0,-34) size 4x80
                   text run at (0,-34) width 4: "\x{23B4}"
         RenderText {#text} at (0,0) size 0x0
-        RenderMathMLMath {math} at (0,41) size 102x7 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 100x7
-            RenderMathMLSpace {mspace} at (0,5) size 100x2 [bgcolor=#FF0000]
-            RenderMathMLOperator {mo} at (48,0) size 4x5
+        RenderMathMLMath {math} at (0,46) size 102x13 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 100x13
+            RenderMathMLSpace {mspace} at (0,10) size 100x3 [bgcolor=#FF0000]
+            RenderMathMLOperator {mo} at (48,0) size 4x6
               RenderBlock (anonymous) at (0,0) size 4x4
                 RenderText {#text} at (0,-43) size 4x80
                   text run at (0,-43) width 4: "\x{23B5}"
-        RenderText {#text} at (102,34) size 4x17
-          text run at (102,34) width 4: " "
-        RenderMathMLMath {math} at (106,36) size 102x12 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 100x12
-            RenderMathMLSpace {mspace} at (0,10) size 100x2 [bgcolor=#FF0000]
-            RenderMathMLOperator {mo} at (47,0) size 6x10
+        RenderText {#text} at (102,45) size 4x17
+          text run at (102,45) width 4: " "
+        RenderMathMLMath {math} at (106,41) size 102x18 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 100x18
+            RenderMathMLSpace {mspace} at (0,15) size 100x3 [bgcolor=#FF0000]
+            RenderMathMLOperator {mo} at (47,0) size 6x11
               RenderBlock (anonymous) at (0,0) size 6x10
                 RenderText {#text} at (0,-34) size 6x80
                   text run at (0,-34) width 6: "\x{23DC}"
-        RenderText {#text} at (208,34) size 4x17
-          text run at (208,34) width 4: " "
-        RenderMathMLMath {math} at (212,41) size 102x7 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 100x7
-            RenderMathMLSpace {mspace} at (0,5) size 100x2 [bgcolor=#FF0000]
-            RenderMathMLOperator {mo} at (47,0) size 6x5
+        RenderText {#text} at (208,45) size 4x17
+          text run at (208,45) width 4: " "
+        RenderMathMLMath {math} at (212,46) size 102x13 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 100x13
+            RenderMathMLSpace {mspace} at (0,10) size 100x3 [bgcolor=#FF0000]
+            RenderMathMLOperator {mo} at (47,0) size 6x6
               RenderBlock (anonymous) at (0,0) size 6x4
                 RenderText {#text} at (0,-43) size 6x80
                   text run at (0,-43) width 6: "\x{23DD}"
-        RenderText {#text} at (314,34) size 4x17
-          text run at (314,34) width 4: " "
-        RenderMathMLMath {math} at (318,35) size 102x13 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 100x13
-            RenderMathMLSpace {mspace} at (0,11) size 100x2 [bgcolor=#FF0000]
-            RenderMathMLOperator {mo} at (47,0) size 6x11
+        RenderText {#text} at (314,45) size 4x17
+          text run at (314,45) width 4: " "
+        RenderMathMLMath {math} at (318,40) size 102x19 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 100x19
+            RenderMathMLSpace {mspace} at (0,16) size 100x3 [bgcolor=#FF0000]
+            RenderMathMLOperator {mo} at (47,0) size 6x12
               RenderBlock (anonymous) at (0,0) size 6x11
                 RenderText {#text} at (0,-33) size 6x80
                   text run at (0,-33) width 6: "\x{23DE}"
-        RenderText {#text} at (420,34) size 4x17
-          text run at (420,34) width 4: " "
-        RenderMathMLMath {math} at (424,40) size 102x8 [padding: 0 1 0 1]
-          RenderMathMLUnderOver {mover} at (1,0) size 100x8
-            RenderMathMLSpace {mspace} at (0,6) size 100x2 [bgcolor=#FF0000]
-            RenderMathMLOperator {mo} at (47,0) size 6x6
+        RenderText {#text} at (420,45) size 4x17
+          text run at (420,45) width 4: " "
+        RenderMathMLMath {math} at (424,45) size 102x14 [padding: 0 1 0 1]
+          RenderMathMLUnderOver {mover} at (1,0) size 100x14
+            RenderMathMLSpace {mspace} at (0,11) size 100x3 [bgcolor=#FF0000]
+            RenderMathMLOperator {mo} at (47,0) size 6x7
               RenderBlock (anonymous) at (0,0) size 6x5
                 RenderText {#text} at (0,-43) size 6x80
                   text run at (0,-43) width 6: "\x{23DF}"
index a266bc1..6d09a44 100644 (file)
Binary files a/LayoutTests/platform/gtk/mathml/opentype/horizontal-munderover-expected.png and b/LayoutTests/platform/gtk/mathml/opentype/horizontal-munderover-expected.png differ
index 773d29e..421c295 100644 (file)
@@ -1,91 +1,91 @@
 layer at (0,0) size 800x600
   RenderView at (0,0) size 800x600
-layer at (0,0) size 800x63
-  RenderBlock {HTML} at (0,0) size 800x63
-    RenderBody {BODY} at (8,16) size 784x31
-      RenderBlock {P} at (0,0) size 784x31
-        RenderMathMLMath {math} at (0,4) size 50x16 [padding: 0 1 0 1]
-          RenderMathMLRow {mstyle} at (1,0) size 48x16
-            RenderMathMLUnderOver {mover} at (0,0) size 48x8
-              RenderMathMLOperator {mo} at (20,2) size 8x6
+layer at (0,0) size 800x70
+  RenderBlock {HTML} at (0,0) size 800x70
+    RenderBody {BODY} at (8,16) size 784x38
+      RenderBlock {P} at (0,0) size 784x38
+        RenderMathMLMath {math} at (0,8) size 50x19 [padding: 0 1 0 1]
+          RenderMathMLRow {mstyle} at (1,0) size 48x19
+            RenderMathMLUnderOver {mover} at (0,0) size 48x12
+              RenderMathMLOperator {mo} at (20,5) size 8x7
                 RenderBlock (anonymous) at (0,0) size 8x14
                   RenderText {#text} at (0,-44) size 8x106
                     text run at (0,-44) width 8: "\x{23DE}"
               RenderMathMLSpace {mspace} at (0,0) size 48x2 [bgcolor=#FF0000]
-        RenderText {#text} at (50,6) size 4x17
-          text run at (50,6) width 4: " "
-        RenderMathMLMath {math} at (54,7) size 66x13 [padding: 0 1 0 1]
-          RenderMathMLRow {mstyle} at (1,0) size 64x13
-            RenderMathMLUnderOver {mover} at (0,0) size 64x13
-              RenderMathMLSpace {mspace} at (0,11) size 64x2 [bgcolor=#FF0000]
-              RenderMathMLOperator {mo} at (29,0) size 6x11
+        RenderText {#text} at (50,13) size 4x17
+          text run at (50,13) width 4: " "
+        RenderMathMLMath {math} at (54,8) size 66x19 [padding: 0 1 0 1]
+          RenderMathMLRow {mstyle} at (1,0) size 64x19
+            RenderMathMLUnderOver {mover} at (0,0) size 64x19
+              RenderMathMLSpace {mspace} at (0,16) size 64x3 [bgcolor=#FF0000]
+              RenderMathMLOperator {mo} at (29,0) size 6x12
                 RenderBlock (anonymous) at (0,0) size 6x11
                   RenderText {#text} at (0,-33) size 6x80
                     text run at (0,-33) width 6: "\x{23DE}"
-        RenderText {#text} at (120,6) size 4x17
-          text run at (120,6) width 4: " "
-        RenderMathMLMath {math} at (124,6) size 50x14 [padding: 0 1 0 1]
-          RenderMathMLRow {mstyle} at (1,0) size 48x14
-            RenderMathMLUnderOver {munder} at (0,0) size 48x8
+        RenderText {#text} at (120,13) size 4x17
+          text run at (120,13) width 4: " "
+        RenderMathMLMath {math} at (124,13) size 50x16 [padding: 0 1 0 1]
+          RenderMathMLRow {mstyle} at (1,0) size 48x16
+            RenderMathMLUnderOver {munder} at (0,0) size 48x16
               RenderMathMLOperator {mo} at (20,0) size 8x6
                 RenderBlock (anonymous) at (0,0) size 8x14
                   RenderText {#text} at (0,-44) size 8x106
                     text run at (0,-44) width 8: "\x{23DE}"
-              RenderMathMLSpace {mspace} at (0,6) size 48x2 [bgcolor=#FF0000]
-        RenderText {#text} at (174,6) size 4x17
-          text run at (174,6) width 4: " "
-        RenderMathMLMath {math} at (178,7) size 66x24 [padding: 0 1 0 1]
-          RenderMathMLRow {mstyle} at (1,0) size 64x24
-            RenderMathMLUnderOver {munderover} at (0,0) size 64x24
-              RenderMathMLSpace {mspace} at (0,11) size 64x2 [bgcolor=#FF0000]
-              RenderMathMLOperator {mo} at (29,13) size 6x11
+              RenderMathMLSpace {mspace} at (0,13) size 48x3 [bgcolor=#FF0000]
+        RenderText {#text} at (174,13) size 4x17
+          text run at (174,13) width 4: " "
+        RenderMathMLMath {math} at (178,8) size 66x31 [padding: 0 1 0 1]
+          RenderMathMLRow {mstyle} at (1,0) size 64x31
+            RenderMathMLUnderOver {munderover} at (0,0) size 64x31
+              RenderMathMLSpace {mspace} at (0,16) size 64x3 [bgcolor=#FF0000]
+              RenderMathMLOperator {mo} at (29,18) size 6x12
                 RenderBlock (anonymous) at (0,0) size 6x11
                   RenderText {#text} at (0,-33) size 6x80
                     text run at (0,-33) width 6: "\x{23DE}"
-              RenderMathMLOperator {mo} at (29,0) size 6x11
+              RenderMathMLOperator {mo} at (29,0) size 6x12
                 RenderBlock (anonymous) at (0,0) size 6x11
                   RenderText {#text} at (0,-33) size 6x80
                     text run at (0,-33) width 6: "\x{23DE}"
-        RenderText {#text} at (244,6) size 4x17
-          text run at (244,6) width 4: " "
-        RenderMathMLMath {math} at (248,0) size 50x20 [padding: 0 1 0 1]
-          RenderMathMLRow {mstyle} at (1,0) size 48x20
-            RenderMathMLUnderOver {munderover} at (0,0) size 48x14
-              RenderMathMLOperator {mo} at (20,6) size 8x6
+        RenderText {#text} at (244,13) size 4x17
+          text run at (244,13) width 4: " "
+        RenderMathMLMath {math} at (248,0) size 50x29 [padding: 0 1 0 1]
+          RenderMathMLRow {mstyle} at (1,0) size 48x29
+            RenderMathMLUnderOver {munderover} at (0,0) size 48x29
+              RenderMathMLOperator {mo} at (20,12) size 8x7
                 RenderBlock (anonymous) at (0,0) size 8x14
                   RenderText {#text} at (0,-44) size 8x106
                     text run at (0,-44) width 8: "\x{23DE}"
-              RenderMathMLSpace {mspace} at (0,12) size 48x2 [bgcolor=#FF0000]
+              RenderMathMLSpace {mspace} at (0,26) size 48x3 [bgcolor=#FF0000]
               RenderMathMLOperator {mo} at (21,0) size 6x6
                 RenderBlock (anonymous) at (0,0) size 6x11
                   RenderText {#text} at (0,-33) size 6x80
                     text run at (0,-33) width 6: "\x{23DE}"
-        RenderText {#text} at (298,6) size 4x17
-          text run at (298,6) width 4: " "
-        RenderMathMLMath {math} at (302,4) size 50x16 [padding: 0 1 0 1]
-          RenderMathMLRow {mstyle} at (1,0) size 48x16
-            RenderMathMLUnderOver {munderover} at (0,0) size 48x14
-              RenderMathMLOperator {mo} at (20,2) size 8x6
+        RenderText {#text} at (298,13) size 4x17
+          text run at (298,13) width 4: " "
+        RenderMathMLMath {math} at (302,8) size 50x20 [padding: 0 1 0 1]
+          RenderMathMLRow {mstyle} at (1,0) size 48x20
+            RenderMathMLUnderOver {munderover} at (0,0) size 48x20
+              RenderMathMLOperator {mo} at (20,5) size 8x7
                 RenderBlock (anonymous) at (0,0) size 8x14
                   RenderText {#text} at (0,-44) size 8x106
                     text run at (0,-44) width 8: "\x{23DE}"
-              RenderMathMLOperator {mo} at (21,8) size 6x6
+              RenderMathMLOperator {mo} at (21,13) size 6x7
                 RenderBlock (anonymous) at (0,0) size 6x11
                   RenderText {#text} at (0,-33) size 6x80
                     text run at (0,-33) width 6: "\x{23DE}"
               RenderMathMLSpace {mspace} at (0,0) size 48x2 [bgcolor=#FF0000]
-        RenderText {#text} at (352,6) size 4x17
-          text run at (352,6) width 4: " "
-        RenderMathMLMath {math} at (356,4) size 50x16 [padding: 0 1 0 1]
-          RenderMathMLRow {mstyle} at (1,0) size 48x16
-            RenderMathMLUnderOver {munder} at (0,0) size 48x14
-              RenderMathMLUnderOver {mover} at (0,0) size 48x8
-                RenderMathMLOperator {mo} at (20,2) size 8x6
+        RenderText {#text} at (352,13) size 4x17
+          text run at (352,13) width 4: " "
+        RenderMathMLMath {math} at (356,8) size 50x20 [padding: 0 1 0 1]
+          RenderMathMLRow {mstyle} at (1,0) size 48x20
+            RenderMathMLUnderOver {munder} at (0,0) size 48x20
+              RenderMathMLUnderOver {mover} at (0,0) size 48x12
+                RenderMathMLOperator {mo} at (20,5) size 8x7
                   RenderBlock (anonymous) at (0,0) size 8x14
                     RenderText {#text} at (0,-44) size 8x106
                       text run at (0,-44) width 8: "\x{23DE}"
                 RenderMathMLSpace {mspace} at (0,0) size 48x2 [bgcolor=#FF0000]
-              RenderMathMLOperator {mo} at (21,8) size 6x6
+              RenderMathMLOperator {mo} at (21,13) size 6x7
                 RenderBlock (anonymous) at (0,0) size 6x11
                   RenderText {#text} at (0,-33) size 6x80
                     text run at (0,-33) width 6: "\x{23DE}"
index fcb9162..e677319 100644 (file)
@@ -1,5 +1,32 @@
 2016-07-11  Frederic Wang  <fwang@igalia.com>
 
+        Use parameters from the OpenType MATH table for <munderover>
+        https://bugs.webkit.org/show_bug.cgi?id=155756
+
+        Reviewed by Brent Fulgham.
+
+        We follow the description from the MathML in HTML5 implementation
+        to improve the layout of <munderover> using some constants from the MATH table.
+
+        Tests: imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-1.html
+               imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-2.html
+               imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-3.html
+               imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-4.html
+               mathml/presentation/attributes-accent-accentunder-dynamic.html
+
+        * mathml/mathattrs.in: Add accentunder attribute.
+        * rendering/mathml/MathMLOperatorDictionary.h: Remove FIXME comment.
+        * rendering/mathml/RenderMathMLUnderOver.cpp:
+        (WebCore::RenderMathMLUnderOver::hasAccent): Helper function to determine whether
+        the over/under script should be treated as an accent.
+        (WebCore::RenderMathMLUnderOver::getVerticalParameters): Helper function to read
+        some vertical parameters from the MATH table.
+        (WebCore::RenderMathMLUnderOver::layoutBlock): Take into account the new vertical
+        parameters for the layout of <munderover>.
+        * rendering/mathml/RenderMathMLUnderOver.h: Define new helper functions.
+
+2016-07-11  Frederic Wang  <fwang@igalia.com>
+
         Use Stack* parameters from the OpenType MATH table
         https://bugs.webkit.org/show_bug.cgi?id=155714
 
index d7c04a8..87cb7d1 100644 (file)
@@ -4,6 +4,7 @@ guardFactoryWith="ENABLE(MATHML)"
 attrsNullNamespace
 
 accent
+accentunder
 actiontype
 alttext
 background
index e9c4ef6..1c1897a 100644 (file)
@@ -35,7 +35,7 @@ namespace WebCore {
 namespace MathMLOperatorDictionary {
 enum Form { Infix, Prefix, Postfix };
 enum Flag {
-    Accent = 0x1, // FIXME: This must be used to implement accentunder/accent on munderover (https://bugs.webkit.org/show_bug.cgi?id=124826).
+    Accent = 0x1,
     Fence = 0x2, // This has no visual effect but allows to expose semantic information via the accessibility tree.
     LargeOp = 0x4,
     MovableLimits = 0x8,
index c1414b0..fd22e76 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "MathMLElement.h"
 #include "MathMLNames.h"
+#include "MathMLOperatorDictionary.h"
 #include "RenderIterator.h"
 #include "RenderMathMLOperator.h"
 
@@ -160,6 +161,68 @@ LayoutUnit RenderMathMLUnderOver::horizontalOffset(const RenderBox& child) const
     return (logicalWidth() - child.logicalWidth()) / 2;
 }
 
+bool RenderMathMLUnderOver::hasAccent(bool accentUnder) const
+{
+    ASSERT(m_scriptType == UnderOver || (accentUnder && m_scriptType == Under) || (!accentUnder && m_scriptType == Over));
+
+    const AtomicString& attributeValue = element()->fastGetAttribute(accentUnder ? accentunderAttr : accentAttr);
+    if (attributeValue == "true")
+        return true;
+    if (attributeValue == "false")
+        return false;
+    RenderBox& script = accentUnder ? under() : over();
+    if (!is<RenderMathMLBlock>(script))
+        return false;
+    auto* scriptOperator = downcast<RenderMathMLBlock>(script).unembellishedOperator();
+    return scriptOperator && scriptOperator->hasOperatorFlag(MathMLOperatorDictionary::Accent);
+}
+
+bool RenderMathMLUnderOver::getVerticalParameters(LayoutUnit& underGapMin, LayoutUnit& overGapMin, LayoutUnit& underShiftMin, LayoutUnit& overShiftMin, LayoutUnit& underExtraDescender, LayoutUnit& overExtraAscender, LayoutUnit& accentBaseHeight) const
+{
+    // By default, we set all values to zero.
+    underGapMin = overGapMin = underShiftMin = overShiftMin = underExtraDescender = overExtraAscender = accentBaseHeight = 0;
+
+    const auto& primaryFont = style().fontCascade().primaryFont();
+    auto* mathData = primaryFont.mathData();
+    if (!mathData) {
+        // The MATH table specification does not really provide any suggestions, except for some underbar/overbar values and AccentBaseHeight.
+        LayoutUnit defaultLineThickness = ruleThicknessFallback();
+        underGapMin = overGapMin = 3 * defaultLineThickness;
+        underExtraDescender = overExtraAscender = defaultLineThickness;
+        accentBaseHeight = style().fontMetrics().xHeight();
+        return true;
+    }
+
+    if (is<RenderMathMLBlock>(base())) {
+        if (auto* baseOperator = downcast<RenderMathMLBlock>(base()).unembellishedOperator()) {
+            if (baseOperator->hasOperatorFlag(MathMLOperatorDictionary::LargeOp)) {
+                // The base is a large operator so we read UpperLimit/LowerLimit constants from the MATH table.
+                underGapMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::LowerLimitGapMin);
+                overGapMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::UpperLimitGapMin);
+                underShiftMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::LowerLimitBaselineDropMin);
+                overShiftMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::UpperLimitBaselineRiseMin);
+                return false;
+            }
+            if (baseOperator->hasOperatorFlag(MathMLOperatorDictionary::Stretchy) && !baseOperator->isVertical()) {
+                // The base is a horizontal stretchy operator, so we read StretchStack constants from the MATH table.
+                underGapMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::StretchStackGapBelowMin);
+                overGapMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::StretchStackGapAboveMin);
+                underShiftMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::StretchStackBottomShiftDown);
+                overShiftMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::StretchStackTopShiftUp);
+                return false;
+            }
+        }
+    }
+
+    // By default, we just use the underbar/overbar constants.
+    underGapMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::UnderbarVerticalGap);
+    overGapMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::OverbarVerticalGap);
+    underExtraDescender = mathData->getMathConstant(primaryFont, OpenTypeMathData::UnderbarExtraDescender);
+    overExtraAscender = mathData->getMathConstant(primaryFont, OpenTypeMathData::OverbarExtraAscender);
+    accentBaseHeight = mathData->getMathConstant(primaryFont, OpenTypeMathData::AccentBaseHeight);
+    return true;
+}
+
 void RenderMathMLUnderOver::layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight)
 {
     ASSERT(needsLayout());
@@ -196,16 +259,38 @@ void RenderMathMLUnderOver::layoutBlock(bool relayoutChildren, LayoutUnit pageLo
         logicalWidth = std::max(logicalWidth, over().logicalWidth());
     setLogicalWidth(logicalWidth);
 
+    LayoutUnit underGapMin, overGapMin, underShiftMin, overShiftMin, underExtraDescender, overExtraAscender, accentBaseHeight;
+    bool underOverBarFall = getVerticalParameters(underGapMin, overGapMin, underShiftMin, overShiftMin, underExtraDescender, overExtraAscender, accentBaseHeight);
     LayoutUnit verticalOffset = 0;
     if (m_scriptType == Over || m_scriptType == UnderOver) {
-        over().setLocation(LayoutPoint(horizontalOffset(over()), 0));
-        verticalOffset += over().logicalHeight();
+        verticalOffset += overExtraAscender;
+        over().setLocation(LayoutPoint(horizontalOffset(over()), verticalOffset));
+        if (underOverBarFall) {
+            verticalOffset += over().logicalHeight();
+            if (hasAccent()) {
+                LayoutUnit baseAscent = ascentForChild(base());
+                if (baseAscent < accentBaseHeight)
+                    verticalOffset += accentBaseHeight - baseAscent;
+            } else
+                verticalOffset += overGapMin;
+        } else {
+            LayoutUnit overAscent = ascentForChild(over());
+            verticalOffset += std::max(over().logicalHeight() + overGapMin, overAscent + overShiftMin);
+        }
     }
     base().setLocation(LayoutPoint(horizontalOffset(base()), verticalOffset));
     verticalOffset += base().logicalHeight();
     if (m_scriptType == Under || m_scriptType == UnderOver) {
+        if (underOverBarFall) {
+            if (!hasAccentUnder())
+                verticalOffset += underGapMin;
+        } else {
+            LayoutUnit underAscent = ascentForChild(under());
+            verticalOffset += std::max(underGapMin, underShiftMin - underAscent);
+        }
         under().setLocation(LayoutPoint(horizontalOffset(under()), verticalOffset));
         verticalOffset += under().logicalHeight();
+        verticalOffset += underExtraDescender;
     }
 
     setLogicalHeight(verticalOffset);
index 97a51e1..56b1a4c 100644 (file)
@@ -51,6 +51,9 @@ private:
     RenderBox& under() const;
     RenderBox& over() const;
     LayoutUnit horizontalOffset(const RenderBox&) const;
+    bool hasAccent(bool accentUnder = false) const;
+    bool hasAccentUnder() const { return hasAccent(true); };
+    bool getVerticalParameters(LayoutUnit& underGapMin, LayoutUnit& overGapMin, LayoutUnit& underShiftMin, LayoutUnit& overShiftMin, LayoutUnit& underExtraDescender, LayoutUnit& overExtraAscender, LayoutUnit& accentBaseHeight) const;
 };
 
 }