Changeset 203074 in webkit


Ignore:
Timestamp:
Jul 11, 2016 11:46:10 AM (8 years ago)
Author:
fred.wang@free.fr
Message:

Use parameters from the OpenType MATH table for <munderover>
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.

Location:
trunk
Files:
22 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r203073 r203074  
     12016-07-11  Frederic Wang  <fwang@igalia.com>
     2
     3        Use parameters from the OpenType MATH table for <munderover>
     4        https://bugs.webkit.org/show_bug.cgi?id=155756
     5
     6        Reviewed by Brent Fulgham.
     7
     8        Import some tests from the MathML in HTML5 test suite to verify
     9        the layout of the <munderover> element. We also write a test to
     10        verify dynamic change of accent/accentunder attributes and adjust
     11        other tests.
     12
     13        * imported/mathml-in-html5/fonts/math/limits-lowerlimitbaselinedropmin3000.woff: Added.
     14        * imported/mathml-in-html5/fonts/math/limits-lowerlimitgapmin11000.woff: Added.
     15        * imported/mathml-in-html5/fonts/math/limits-upperlimitbaselinerisemin5000.woff: Added.
     16        * imported/mathml-in-html5/fonts/math/limits-upperlimitgapmin7000.woff: Added.
     17        * imported/mathml-in-html5/fonts/math/stretchstack-bottomshiftdown3000.woff: Added.
     18        * imported/mathml-in-html5/fonts/math/stretchstack-gapabovemin7000.woff: Added.
     19        * imported/mathml-in-html5/fonts/math/stretchstack-gapbelowmin11000.woff: Added.
     20        * imported/mathml-in-html5/fonts/math/stretchstack-topshiftup5000.woff: Added.
     21        * imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-overbarextraascender3000.woff: Added.
     22        * imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-overbarverticalgap11000.woff: Added.
     23        * imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-underbarextradescender5000.woff: Added.
     24        * imported/mathml-in-html5/fonts/math/underover-accentbaseheight4000-underbarverticalgap7000.woff: Added.
     25        * imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-1-expected.txt: Added.
     26        * imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-1.html: Added.
     27        * imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-2-expected.txt: Added.
     28        * imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-2.html: Added.
     29        * imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-3-expected.txt: Added.
     30        * imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-3.html: Added.
     31        * imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-4-expected.txt: Added.
     32        * imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-4.html: Added.
     33        * mathml/presentation/attributes-accent-accentunder-dynamic.html: Added.
     34        Test dynamic changes of accent and accentunder.
     35        * mathml/presentation/attributes-accent-accentunder-dynamic-expected.html: Added.
     36        * mathml/presentation/scripts-underover.html: Remove one of the test since munderover
     37        with an empty script is no longer equivalent to munder or mover.
     38        * mathml/presentation/scripts-underover-expected.html: Ditto.
     39        * platform/gtk/mathml/opentype/horizontal-expected.png: Updated due to change in
     40        vertical metrics of scripts.
     41        * platform/gtk/mathml/opentype/horizontal-expected.txt: Ditto.
     42        * platform/gtk/mathml/opentype/horizontal-munderover-expected.png: Ditto.
     43        * platform/gtk/mathml/opentype/horizontal-munderover-expected.txt: Ditto.
     44        * platform/gtk/mathml/presentation/roots-expected.txt: Udapted due to script baseline fix.
     45        * platform/gtk/mathml/presentation/roots-expected.png: ditto.
     46        * mathml/presentation/underover-nonstretchy-or-vertical.html: Prevent the <mo> to be treated
     47        as an accent so that we always get the same spacing as the reference. We also use the Ahem
     48        font to make the result more reliable.
     49
    1502016-07-11  Frederic Wang  <fwang@igalia.com>
    251
  • trunk/LayoutTests/mathml/presentation/scripts-underover-expected.html

    r152777 r203074  
    130130        </munderover>
    131131      </math>
    132       <math>
    133         <munder>
    134           <mi>A</mi>
    135           <mi>B</mi>
    136         </munder>
    137         <mover>
    138           <mi>A</mi>
    139           <mi>B</mi>
    140         </mover>
    141       </math>
    142132    </div>
    143133
  • trunk/LayoutTests/mathml/presentation/scripts-underover.html

    r152777 r203074  
    133133        </munderover>
    134134      </math>
    135 
    136       <!-- This verifies that <munderscript> with an empty script is
    137            equivalent to the corresponding constructions with only one script.
    138         -->
    139       <math>
    140         <munderover>
    141           <mi>A</mi>
    142           <mi>B</mi>
    143           <mspace/>
    144         </munderover>
    145         <munderover>
    146           <mi>A</mi>
    147           <mspace/>
    148           <mi>B</mi>
    149         </munderover>
    150       </math>
    151135    </div>
    152136
  • trunk/LayoutTests/mathml/presentation/underover-nonstretchy-or-vertical-expected.html

    r199544 r203074  
    11<!DOCTYPE html>
    22<p>Vertical or non-stretchy operators inside an munderover element should not stretch.</p>
    3 <math>
     3<math style="font: 20px Ahem">
    44  <munderover>
    55    <mspace width="100px" height="10px" mathbackground="red"/>
  • trunk/LayoutTests/mathml/presentation/underover-nonstretchy-or-vertical.html

    r199544 r203074  
    11<!DOCTYPE html>
    22<p>Vertical or non-stretchy operators inside an munderover element should not stretch.</p>
    3 <math>
     3<math style="font: 20px Ahem">
    44  <munderover>
    55    <mspace width="100px" height="10px" mathbackground="red"/>
    66    <mo lspace="0px" rspace="0px">|</mo> <!-- stretchy vertical operator -->
    7     <mo lspace="0px" rspace="0px" stretchy="false" >_</mo> <!-- non-stretchy horizontal operator -->
     7    <mo lspace="0px" rspace="0px" stretchy="false" accent="false">_</mo> <!-- non-stretchy horizontal operator -->
    88  </munderover>
    99</math>
  • trunk/LayoutTests/platform/gtk/mathml/opentype/horizontal-expected.txt

    r202420 r203074  
    11layer at (0,0) size 800x600
    22  RenderView at (0,0) size 800x600
    3 layer at (0,0) size 800x166
    4   RenderBlock {HTML} at (0,0) size 800x166
    5     RenderBody {BODY} at (8,16) size 784x134
    6       RenderBlock {P} at (0,0) size 784x17
    7         RenderMathMLMath {math} at (0,4) size 24x10 [padding: 0 1 0 1]
    8           RenderMathMLUnderOver {mover} at (1,0) size 22x10
    9             RenderMathMLSpace {mspace} at (0,8) size 22x2 [bgcolor=#0000FF]
     3layer at (0,0) size 800x190
     4  RenderBlock {HTML} at (0,0) size 800x190
     5    RenderBody {BODY} at (8,16) size 784x158
     6      RenderBlock {P} at (0,0) size 784x21
     7        RenderMathMLMath {math} at (0,2) size 24x16 [padding: 0 1 0 1]
     8          RenderMathMLUnderOver {mover} at (1,0) size 22x16
     9            RenderMathMLSpace {mspace} at (0,13) size 22x3 [bgcolor=#0000FF]
     10            RenderMathMLOperator {mo} at (1,0) size 20x9
     11              RenderBlock (anonymous) at (0,0) size 12x8
     12                RenderText {#text} at (0,-36) size 12x80
     13                  text run at (0,-36) width 12: "\x{2190}"
     14        RenderText {#text} at (24,4) size 4x17
     15          text run at (24,4) width 4: " "
     16        RenderMathMLMath {math} at (28,2) size 24x16 [padding: 0 1 0 1]
     17          RenderMathMLUnderOver {mover} at (1,0) size 22x16
     18            RenderMathMLSpace {mspace} at (0,13) size 22x3 [bgcolor=#0000FF]
     19            RenderMathMLOperator {mo} at (1,0) size 20x9
     20              RenderBlock (anonymous) at (0,0) size 12x8
     21                RenderText {#text} at (0,-36) size 12x80
     22                  text run at (0,-36) width 12: "\x{2192}"
     23        RenderText {#text} at (52,4) size 4x17
     24          text run at (52,4) width 4: " "
     25        RenderMathMLMath {math} at (56,2) size 24x16 [padding: 0 1 0 1]
     26          RenderMathMLUnderOver {mover} at (1,0) size 22x16
     27            RenderMathMLSpace {mspace} at (0,13) size 22x3 [bgcolor=#0000FF]
     28            RenderMathMLOperator {mo} at (1,0) size 20x9
     29              RenderBlock (anonymous) at (0,0) size 12x8
     30                RenderText {#text} at (0,-36) size 12x80
     31                  text run at (0,-36) width 12: "\x{2194}"
     32        RenderText {#text} at (80,4) size 4x17
     33          text run at (80,4) width 4: " "
     34        RenderMathMLMath {math} at (84,2) size 24x16 [padding: 0 1 0 1]
     35          RenderMathMLUnderOver {mover} at (1,0) size 22x16
     36            RenderMathMLSpace {mspace} at (0,13) size 22x3 [bgcolor=#0000FF]
     37            RenderMathMLOperator {mo} at (1,0) size 20x9
     38              RenderBlock (anonymous) at (0,0) size 12x8
     39                RenderText {#text} at (0,-36) size 12x80
     40                  text run at (0,-36) width 12: "\x{21A4}"
     41        RenderText {#text} at (108,4) size 4x17
     42          text run at (108,4) width 4: " "
     43        RenderMathMLMath {math} at (112,2) size 24x16 [padding: 0 1 0 1]
     44          RenderMathMLUnderOver {mover} at (1,0) size 22x16
     45            RenderMathMLSpace {mspace} at (0,13) size 22x3 [bgcolor=#0000FF]
     46            RenderMathMLOperator {mo} at (1,0) size 20x9
     47              RenderBlock (anonymous) at (0,0) size 12x8
     48                RenderText {#text} at (0,-36) size 12x80
     49                  text run at (0,-36) width 12: "\x{21A6}"
     50        RenderText {#text} at (136,4) size 4x17
     51          text run at (136,4) width 4: " "
     52        RenderMathMLMath {math} at (140,3) size 24x15 [padding: 0 1 0 1]
     53          RenderMathMLUnderOver {mover} at (1,0) size 22x15
     54            RenderMathMLSpace {mspace} at (0,12) size 22x3 [bgcolor=#0000FF]
    1055            RenderMathMLOperator {mo} at (1,0) size 20x8
    1156              RenderBlock (anonymous) at (0,0) size 12x8
    1257                RenderText {#text} at (0,-36) size 12x80
    13                   text run at (0,-36) width 12: "\x{2190}"
    14         RenderText {#text} at (24,0) size 4x17
    15           text run at (24,0) width 4: " "
    16         RenderMathMLMath {math} at (28,4) size 24x10 [padding: 0 1 0 1]
    17           RenderMathMLUnderOver {mover} at (1,0) size 22x10
    18             RenderMathMLSpace {mspace} at (0,8) size 22x2 [bgcolor=#0000FF]
    19             RenderMathMLOperator {mo} at (1,0) size 20x8
    20               RenderBlock (anonymous) at (0,0) size 12x8
    21                 RenderText {#text} at (0,-36) size 12x80
    22                   text run at (0,-36) width 12: "\x{2192}"
    23         RenderText {#text} at (52,0) size 4x17
    24           text run at (52,0) width 4: " "
    25         RenderMathMLMath {math} at (56,4) size 24x10 [padding: 0 1 0 1]
    26           RenderMathMLUnderOver {mover} at (1,0) size 22x10
    27             RenderMathMLSpace {mspace} at (0,8) size 22x2 [bgcolor=#0000FF]
    28             RenderMathMLOperator {mo} at (1,0) size 20x8
    29               RenderBlock (anonymous) at (0,0) size 12x8
    30                 RenderText {#text} at (0,-36) size 12x80
    31                   text run at (0,-36) width 12: "\x{2194}"
    32         RenderText {#text} at (80,0) size 4x17
    33           text run at (80,0) width 4: " "
    34         RenderMathMLMath {math} at (84,4) size 24x10 [padding: 0 1 0 1]
    35           RenderMathMLUnderOver {mover} at (1,0) size 22x10
    36             RenderMathMLSpace {mspace} at (0,8) size 22x2 [bgcolor=#0000FF]
    37             RenderMathMLOperator {mo} at (1,0) size 20x8
    38               RenderBlock (anonymous) at (0,0) size 12x8
    39                 RenderText {#text} at (0,-36) size 12x80
    40                   text run at (0,-36) width 12: "\x{21A4}"
    41         RenderText {#text} at (108,0) size 4x17
    42           text run at (108,0) width 4: " "
    43         RenderMathMLMath {math} at (112,4) size 24x10 [padding: 0 1 0 1]
    44           RenderMathMLUnderOver {mover} at (1,0) size 22x10
    45             RenderMathMLSpace {mspace} at (0,8) size 22x2 [bgcolor=#0000FF]
    46             RenderMathMLOperator {mo} at (1,0) size 20x8
    47               RenderBlock (anonymous) at (0,0) size 12x8
    48                 RenderText {#text} at (0,-36) size 12x80
    49                   text run at (0,-36) width 12: "\x{21A6}"
    50         RenderText {#text} at (136,0) size 4x17
    51           text run at (136,0) width 4: " "
    52         RenderMathMLMath {math} at (140,5) size 24x9 [padding: 0 1 0 1]
    53           RenderMathMLUnderOver {mover} at (1,0) size 22x9
    54             RenderMathMLSpace {mspace} at (0,7) size 22x2 [bgcolor=#0000FF]
    55             RenderMathMLOperator {mo} at (1,0) size 20x7
    56               RenderBlock (anonymous) at (0,0) size 12x8
    57                 RenderText {#text} at (0,-36) size 12x80
    5858                  text run at (0,-36) width 12: "\x{21BC}"
    59         RenderText {#text} at (164,0) size 4x17
    60           text run at (164,0) width 4: " "
    61         RenderMathMLMath {math} at (168,7) size 24x7 [padding: 0 1 0 1]
    62           RenderMathMLUnderOver {mover} at (1,0) size 22x7
    63             RenderMathMLSpace {mspace} at (0,5) size 22x2 [bgcolor=#0000FF]
    64             RenderMathMLOperator {mo} at (1,0) size 20x5
     59        RenderText {#text} at (164,4) size 4x17
     60          text run at (164,4) width 4: " "
     61        RenderMathMLMath {math} at (168,5) size 24x13 [padding: 0 1 0 1]
     62          RenderMathMLUnderOver {mover} at (1,0) size 22x13
     63            RenderMathMLSpace {mspace} at (0,10) size 22x3 [bgcolor=#0000FF]
     64            RenderMathMLOperator {mo} at (1,0) size 20x6
    6565              RenderBlock (anonymous) at (0,0) size 12x5
    6666                RenderText {#text} at (0,-39) size 12x80
    6767                  text run at (0,-39) width 12: "\x{21BD}"
    68         RenderText {#text} at (192,0) size 4x17
    69           text run at (192,0) width 4: " "
    70         RenderMathMLMath {math} at (196,5) size 24x9 [padding: 0 1 0 1]
    71           RenderMathMLUnderOver {mover} at (1,0) size 22x9
    72             RenderMathMLSpace {mspace} at (0,7) size 22x2 [bgcolor=#0000FF]
    73             RenderMathMLOperator {mo} at (1,0) size 20x7
     68        RenderText {#text} at (192,4) size 4x17
     69          text run at (192,4) width 4: " "
     70        RenderMathMLMath {math} at (196,3) size 24x15 [padding: 0 1 0 1]
     71          RenderMathMLUnderOver {mover} at (1,0) size 22x15
     72            RenderMathMLSpace {mspace} at (0,12) size 22x3 [bgcolor=#0000FF]
     73            RenderMathMLOperator {mo} at (1,0) size 20x8
    7474              RenderBlock (anonymous) at (0,0) size 12x8
    7575                RenderText {#text} at (0,-36) size 12x80
    7676                  text run at (0,-36) width 12: "\x{21C0}"
    77         RenderText {#text} at (220,0) size 4x17
    78           text run at (220,0) width 4: " "
    79         RenderMathMLMath {math} at (224,4) size 24x10 [padding: 0 1 0 1]
    80           RenderMathMLUnderOver {mover} at (1,0) size 22x10
    81             RenderMathMLSpace {mspace} at (0,8) size 22x2 [bgcolor=#0000FF]
    82             RenderMathMLOperator {mo} at (1,0) size 20x8
     77        RenderText {#text} at (220,4) size 4x17
     78          text run at (220,4) width 4: " "
     79        RenderMathMLMath {math} at (224,2) size 24x16 [padding: 0 1 0 1]
     80          RenderMathMLUnderOver {mover} at (1,0) size 22x16
     81            RenderMathMLSpace {mspace} at (0,13) size 22x3 [bgcolor=#0000FF]
     82            RenderMathMLOperator {mo} at (1,0) size 20x9
    8383              RenderBlock (anonymous) at (0,0) size 12x8
    8484                RenderText {#text} at (0,-36) size 12x80
    8585                  text run at (0,-36) width 12: "\x{21D0}"
    86         RenderText {#text} at (248,0) size 4x17
    87           text run at (248,0) width 4: " "
    88         RenderMathMLMath {math} at (252,4) size 24x10 [padding: 0 1 0 1]
    89           RenderMathMLUnderOver {mover} at (1,0) size 22x10
    90             RenderMathMLSpace {mspace} at (0,8) size 22x2 [bgcolor=#0000FF]
    91             RenderMathMLOperator {mo} at (1,0) size 20x8
     86        RenderText {#text} at (248,4) size 4x17
     87          text run at (248,4) width 4: " "
     88        RenderMathMLMath {math} at (252,2) size 24x16 [padding: 0 1 0 1]
     89          RenderMathMLUnderOver {mover} at (1,0) size 22x16
     90            RenderMathMLSpace {mspace} at (0,13) size 22x3 [bgcolor=#0000FF]
     91            RenderMathMLOperator {mo} at (1,0) size 20x9
    9292              RenderBlock (anonymous) at (0,0) size 12x8
    9393                RenderText {#text} at (0,-36) size 12x80
    9494                  text run at (0,-36) width 12: "\x{21D2}"
    95         RenderText {#text} at (276,0) size 4x17
    96           text run at (276,0) width 4: " "
    97         RenderMathMLMath {math} at (280,4) size 24x10 [padding: 0 1 0 1]
    98           RenderMathMLUnderOver {mover} at (1,0) size 22x10
    99             RenderMathMLSpace {mspace} at (0,8) size 22x2 [bgcolor=#0000FF]
    100             RenderMathMLOperator {mo} at (1,0) size 20x8
     95        RenderText {#text} at (276,4) size 4x17
     96          text run at (276,4) width 4: " "
     97        RenderMathMLMath {math} at (280,2) size 24x16 [padding: 0 1 0 1]
     98          RenderMathMLUnderOver {mover} at (1,0) size 22x16
     99            RenderMathMLSpace {mspace} at (0,13) size 22x3 [bgcolor=#0000FF]
     100            RenderMathMLOperator {mo} at (1,0) size 20x9
    101101              RenderBlock (anonymous) at (0,0) size 12x8
    102102                RenderText {#text} at (0,-36) size 12x80
    103103                  text run at (0,-36) width 12: "\x{21D4}"
    104         RenderText {#text} at (304,0) size 4x17
    105           text run at (304,0) width 4: " "
    106         RenderMathMLMath {math} at (308,2) size 24x12 [padding: 0 1 0 1]
    107           RenderMathMLUnderOver {mover} at (1,0) size 22x12
    108             RenderMathMLSpace {mspace} at (0,10) size 22x2 [bgcolor=#0000FF]
    109             RenderMathMLOperator {mo} at (1,0) size 20x10
     104        RenderText {#text} at (304,4) size 4x17
     105          text run at (304,4) width 4: " "
     106        RenderMathMLMath {math} at (308,0) size 24x18 [padding: 0 1 0 1]
     107          RenderMathMLUnderOver {mover} at (1,0) size 22x18
     108            RenderMathMLSpace {mspace} at (0,15) size 22x3 [bgcolor=#0000FF]
     109            RenderMathMLOperator {mo} at (1,0) size 20x11
    110110              RenderBlock (anonymous) at (0,0) size 12x10
    111111                RenderText {#text} at (0,-35) size 12x80
    112112                  text run at (0,-35) width 12: "\x{21DA}"
    113         RenderText {#text} at (332,0) size 4x17
    114           text run at (332,0) width 4: " "
    115         RenderMathMLMath {math} at (336,2) size 24x12 [padding: 0 1 0 1]
    116           RenderMathMLUnderOver {mover} at (1,0) size 22x12
    117             RenderMathMLSpace {mspace} at (0,10) size 22x2 [bgcolor=#0000FF]
    118             RenderMathMLOperator {mo} at (1,0) size 20x10
     113        RenderText {#text} at (332,4) size 4x17
     114          text run at (332,4) width 4: " "
     115        RenderMathMLMath {math} at (336,0) size 24x18 [padding: 0 1 0 1]
     116          RenderMathMLUnderOver {mover} at (1,0) size 22x18
     117            RenderMathMLSpace {mspace} at (0,15) size 22x3 [bgcolor=#0000FF]
     118            RenderMathMLOperator {mo} at (1,0) size 20x11
    119119              RenderBlock (anonymous) at (0,0) size 12x10
    120120                RenderText {#text} at (0,-35) size 12x80
    121121                  text run at (0,-35) width 12: "\x{21DB}"
    122         RenderText {#text} at (360,0) size 4x17
    123           text run at (360,0) width 4: " "
    124         RenderMathMLMath {math} at (364,9) size 24x5 [padding: 0 1 0 1]
    125           RenderMathMLUnderOver {mover} at (1,0) size 22x5
    126             RenderMathMLSpace {mspace} at (0,3) size 22x2 [bgcolor=#0000FF]
    127             RenderMathMLOperator {mo} at (9,0) size 4x3
     122        RenderText {#text} at (360,4) size 4x17
     123          text run at (360,4) width 4: " "
     124        RenderMathMLMath {math} at (364,7) size 24x11 [padding: 0 1 0 1]
     125          RenderMathMLUnderOver {mover} at (1,0) size 22x11
     126            RenderMathMLSpace {mspace} at (0,8) size 22x3 [bgcolor=#0000FF]
     127            RenderMathMLOperator {mo} at (9,0) size 4x4
    128128              RenderBlock (anonymous) at (0,0) size 4x10
    129129                RenderText {#text} at (0,-34) size 4x80
    130130                  text run at (0,-34) width 4: "\x{23B4}"
    131         RenderText {#text} at (388,0) size 4x17
    132           text run at (388,0) width 4: " "
    133         RenderMathMLMath {math} at (392,9) size 24x5 [padding: 0 1 0 1]
    134           RenderMathMLUnderOver {mover} at (1,0) size 22x5
    135             RenderMathMLSpace {mspace} at (0,3) size 22x2 [bgcolor=#0000FF]
    136             RenderMathMLOperator {mo} at (9,0) size 4x3
     131        RenderText {#text} at (388,4) size 4x17
     132          text run at (388,4) width 4: " "
     133        RenderMathMLMath {math} at (392,7) size 24x11 [padding: 0 1 0 1]
     134          RenderMathMLUnderOver {mover} at (1,0) size 22x11
     135            RenderMathMLSpace {mspace} at (0,8) size 22x3 [bgcolor=#0000FF]
     136            RenderMathMLOperator {mo} at (9,0) size 4x4
    137137              RenderBlock (anonymous) at (0,0) size 4x4
    138138                RenderText {#text} at (0,-43) size 4x80
    139139                  text run at (0,-43) width 4: "\x{23B5}"
    140         RenderText {#text} at (416,0) size 4x17
    141           text run at (416,0) width 4: " "
    142         RenderMathMLMath {math} at (420,8) size 24x6 [padding: 0 1 0 1]
    143           RenderMathMLUnderOver {mover} at (1,0) size 22x6
    144             RenderMathMLSpace {mspace} at (0,4) size 22x2 [bgcolor=#0000FF]
    145             RenderMathMLOperator {mo} at (8,0) size 6x4
     140        RenderText {#text} at (416,4) size 4x17
     141          text run at (416,4) width 4: " "
     142        RenderMathMLMath {math} at (420,6) size 24x12 [padding: 0 1 0 1]
     143          RenderMathMLUnderOver {mover} at (1,0) size 22x12
     144            RenderMathMLSpace {mspace} at (0,9) size 22x3 [bgcolor=#0000FF]
     145            RenderMathMLOperator {mo} at (8,0) size 6x5
    146146              RenderBlock (anonymous) at (0,0) size 6x10
    147147                RenderText {#text} at (0,-34) size 6x80
    148148                  text run at (0,-34) width 6: "\x{23DC}"
    149         RenderText {#text} at (444,0) size 4x17
    150           text run at (444,0) width 4: " "
    151         RenderMathMLMath {math} at (448,7) size 24x7 [padding: 0 1 0 1]
    152           RenderMathMLUnderOver {mover} at (1,0) size 22x7
    153             RenderMathMLSpace {mspace} at (0,5) size 22x2 [bgcolor=#0000FF]
    154             RenderMathMLOperator {mo} at (8,0) size 6x5
     149        RenderText {#text} at (444,4) size 4x17
     150          text run at (444,4) width 4: " "
     151        RenderMathMLMath {math} at (448,5) size 24x13 [padding: 0 1 0 1]
     152          RenderMathMLUnderOver {mover} at (1,0) size 22x13
     153            RenderMathMLSpace {mspace} at (0,10) size 22x3 [bgcolor=#0000FF]
     154            RenderMathMLOperator {mo} at (8,0) size 6x6
    155155              RenderBlock (anonymous) at (0,0) size 6x4
    156156                RenderText {#text} at (0,-43) size 6x80
    157157                  text run at (0,-43) width 6: "\x{23DD}"
    158         RenderText {#text} at (472,0) size 4x17
    159           text run at (472,0) width 4: " "
    160         RenderMathMLMath {math} at (476,8) size 24x6 [padding: 0 1 0 1]
    161           RenderMathMLUnderOver {mover} at (1,0) size 22x6
    162             RenderMathMLSpace {mspace} at (0,4) size 22x2 [bgcolor=#0000FF]
    163             RenderMathMLOperator {mo} at (8,0) size 6x4
     158        RenderText {#text} at (472,4) size 4x17
     159          text run at (472,4) width 4: " "
     160        RenderMathMLMath {math} at (476,6) size 24x12 [padding: 0 1 0 1]
     161          RenderMathMLUnderOver {mover} at (1,0) size 22x12
     162            RenderMathMLSpace {mspace} at (0,9) size 22x3 [bgcolor=#0000FF]
     163            RenderMathMLOperator {mo} at (8,0) size 6x5
    164164              RenderBlock (anonymous) at (0,0) size 6x11
    165165                RenderText {#text} at (0,-33) size 6x80
    166166                  text run at (0,-33) width 6: "\x{23DE}"
    167         RenderText {#text} at (500,0) size 4x17
    168           text run at (500,0) width 4: " "
    169         RenderMathMLMath {math} at (504,7) size 24x7 [padding: 0 1 0 1]
    170           RenderMathMLUnderOver {mover} at (1,0) size 22x7
    171             RenderMathMLSpace {mspace} at (0,5) size 22x2 [bgcolor=#0000FF]
    172             RenderMathMLOperator {mo} at (8,0) size 6x5
     167        RenderText {#text} at (500,4) size 4x17
     168          text run at (500,4) width 4: " "
     169        RenderMathMLMath {math} at (504,5) size 24x13 [padding: 0 1 0 1]
     170          RenderMathMLUnderOver {mover} at (1,0) size 22x13
     171            RenderMathMLSpace {mspace} at (0,10) size 22x3 [bgcolor=#0000FF]
     172            RenderMathMLOperator {mo} at (8,0) size 6x6
    173173              RenderBlock (anonymous) at (0,0) size 6x5
    174174                RenderText {#text} at (0,-43) size 6x80
    175175                  text run at (0,-43) width 6: "\x{23DF}"
    176176        RenderText {#text} at (0,0) size 0x0
    177       RenderBlock {P} at (0,33) size 784x34
    178         RenderMathMLMath {math} at (0,4) size 52x10 [padding: 0 1 0 1]
    179           RenderMathMLUnderOver {mover} at (1,0) size 50x10
    180             RenderMathMLSpace {mspace} at (0,8) size 50x2 [bgcolor=#008000]
     177      RenderBlock {P} at (0,37) size 784x43
     178        RenderMathMLMath {math} at (0,2) size 52x16 [padding: 0 1 0 1]
     179          RenderMathMLUnderOver {mover} at (1,0) size 50x16
     180            RenderMathMLSpace {mspace} at (0,13) size 50x3 [bgcolor=#008000]
     181            RenderMathMLOperator {mo} at (15,0) size 20x9
     182              RenderBlock (anonymous) at (0,0) size 12x8
     183                RenderText {#text} at (0,-36) size 12x80
     184                  text run at (0,-36) width 12: "\x{2190}"
     185        RenderText {#text} at (52,4) size 4x17
     186          text run at (52,4) width 4: " "
     187        RenderMathMLMath {math} at (56,2) size 52x16 [padding: 0 1 0 1]
     188          RenderMathMLUnderOver {mover} at (1,0) size 50x16
     189            RenderMathMLSpace {mspace} at (0,13) size 50x3 [bgcolor=#008000]
     190            RenderMathMLOperator {mo} at (15,0) size 20x9
     191              RenderBlock (anonymous) at (0,0) size 12x8
     192                RenderText {#text} at (0,-36) size 12x80
     193                  text run at (0,-36) width 12: "\x{2192}"
     194        RenderText {#text} at (108,4) size 4x17
     195          text run at (108,4) width 4: " "
     196        RenderMathMLMath {math} at (112,2) size 52x16 [padding: 0 1 0 1]
     197          RenderMathMLUnderOver {mover} at (1,0) size 50x16
     198            RenderMathMLSpace {mspace} at (0,13) size 50x3 [bgcolor=#008000]
     199            RenderMathMLOperator {mo} at (15,0) size 20x9
     200              RenderBlock (anonymous) at (0,0) size 12x8
     201                RenderText {#text} at (0,-36) size 12x80
     202                  text run at (0,-36) width 12: "\x{2194}"
     203        RenderText {#text} at (164,4) size 4x17
     204          text run at (164,4) width 4: " "
     205        RenderMathMLMath {math} at (168,2) size 52x16 [padding: 0 1 0 1]
     206          RenderMathMLUnderOver {mover} at (1,0) size 50x16
     207            RenderMathMLSpace {mspace} at (0,13) size 50x3 [bgcolor=#008000]
     208            RenderMathMLOperator {mo} at (15,0) size 20x9
     209              RenderBlock (anonymous) at (0,0) size 12x8
     210                RenderText {#text} at (0,-36) size 12x80
     211                  text run at (0,-36) width 12: "\x{21A4}"
     212        RenderText {#text} at (220,4) size 4x17
     213          text run at (220,4) width 4: " "
     214        RenderMathMLMath {math} at (224,2) size 52x16 [padding: 0 1 0 1]
     215          RenderMathMLUnderOver {mover} at (1,0) size 50x16
     216            RenderMathMLSpace {mspace} at (0,13) size 50x3 [bgcolor=#008000]
     217            RenderMathMLOperator {mo} at (15,0) size 20x9
     218              RenderBlock (anonymous) at (0,0) size 12x8
     219                RenderText {#text} at (0,-36) size 12x80
     220                  text run at (0,-36) width 12: "\x{21A6}"
     221        RenderText {#text} at (276,4) size 4x17
     222          text run at (276,4) width 4: " "
     223        RenderMathMLMath {math} at (280,3) size 52x15 [padding: 0 1 0 1]
     224          RenderMathMLUnderOver {mover} at (1,0) size 50x15
     225            RenderMathMLSpace {mspace} at (0,12) size 50x3 [bgcolor=#008000]
    181226            RenderMathMLOperator {mo} at (15,0) size 20x8
    182227              RenderBlock (anonymous) at (0,0) size 12x8
    183228                RenderText {#text} at (0,-36) size 12x80
    184                   text run at (0,-36) width 12: "\x{2190}"
    185         RenderText {#text} at (52,0) size 4x17
    186           text run at (52,0) width 4: " "
    187         RenderMathMLMath {math} at (56,4) size 52x10 [padding: 0 1 0 1]
    188           RenderMathMLUnderOver {mover} at (1,0) size 50x10
    189             RenderMathMLSpace {mspace} at (0,8) size 50x2 [bgcolor=#008000]
    190             RenderMathMLOperator {mo} at (15,0) size 20x8
    191               RenderBlock (anonymous) at (0,0) size 12x8
    192                 RenderText {#text} at (0,-36) size 12x80
    193                   text run at (0,-36) width 12: "\x{2192}"
    194         RenderText {#text} at (108,0) size 4x17
    195           text run at (108,0) width 4: " "
    196         RenderMathMLMath {math} at (112,4) size 52x10 [padding: 0 1 0 1]
    197           RenderMathMLUnderOver {mover} at (1,0) size 50x10
    198             RenderMathMLSpace {mspace} at (0,8) size 50x2 [bgcolor=#008000]
    199             RenderMathMLOperator {mo} at (15,0) size 20x8
    200               RenderBlock (anonymous) at (0,0) size 12x8
    201                 RenderText {#text} at (0,-36) size 12x80
    202                   text run at (0,-36) width 12: "\x{2194}"
    203         RenderText {#text} at (164,0) size 4x17
    204           text run at (164,0) width 4: " "
    205         RenderMathMLMath {math} at (168,4) size 52x10 [padding: 0 1 0 1]
    206           RenderMathMLUnderOver {mover} at (1,0) size 50x10
    207             RenderMathMLSpace {mspace} at (0,8) size 50x2 [bgcolor=#008000]
    208             RenderMathMLOperator {mo} at (15,0) size 20x8
    209               RenderBlock (anonymous) at (0,0) size 12x8
    210                 RenderText {#text} at (0,-36) size 12x80
    211                   text run at (0,-36) width 12: "\x{21A4}"
    212         RenderText {#text} at (220,0) size 4x17
    213           text run at (220,0) width 4: " "
    214         RenderMathMLMath {math} at (224,4) size 52x10 [padding: 0 1 0 1]
    215           RenderMathMLUnderOver {mover} at (1,0) size 50x10
    216             RenderMathMLSpace {mspace} at (0,8) size 50x2 [bgcolor=#008000]
    217             RenderMathMLOperator {mo} at (15,0) size 20x8
    218               RenderBlock (anonymous) at (0,0) size 12x8
    219                 RenderText {#text} at (0,-36) size 12x80
    220                   text run at (0,-36) width 12: "\x{21A6}"
    221         RenderText {#text} at (276,0) size 4x17
    222           text run at (276,0) width 4: " "
    223         RenderMathMLMath {math} at (280,5) size 52x9 [padding: 0 1 0 1]
    224           RenderMathMLUnderOver {mover} at (1,0) size 50x9
    225             RenderMathMLSpace {mspace} at (0,7) size 50x2 [bgcolor=#008000]
    226             RenderMathMLOperator {mo} at (15,0) size 20x7
    227               RenderBlock (anonymous) at (0,0) size 12x8
    228                 RenderText {#text} at (0,-36) size 12x80
    229229                  text run at (0,-36) width 12: "\x{21BC}"
    230         RenderText {#text} at (332,0) size 4x17
    231           text run at (332,0) width 4: " "
    232         RenderMathMLMath {math} at (336,7) size 52x7 [padding: 0 1 0 1]
    233           RenderMathMLUnderOver {mover} at (1,0) size 50x7
    234             RenderMathMLSpace {mspace} at (0,5) size 50x2 [bgcolor=#008000]
    235             RenderMathMLOperator {mo} at (15,0) size 20x5
     230        RenderText {#text} at (332,4) size 4x17
     231          text run at (332,4) width 4: " "
     232        RenderMathMLMath {math} at (336,5) size 52x13 [padding: 0 1 0 1]
     233          RenderMathMLUnderOver {mover} at (1,0) size 50x13
     234            RenderMathMLSpace {mspace} at (0,10) size 50x3 [bgcolor=#008000]
     235            RenderMathMLOperator {mo} at (15,0) size 20x6
    236236              RenderBlock (anonymous) at (0,0) size 12x5
    237237                RenderText {#text} at (0,-39) size 12x80
    238238                  text run at (0,-39) width 12: "\x{21BD}"
    239         RenderText {#text} at (388,0) size 4x17
    240           text run at (388,0) width 4: " "
    241         RenderMathMLMath {math} at (392,5) size 52x9 [padding: 0 1 0 1]
    242           RenderMathMLUnderOver {mover} at (1,0) size 50x9
    243             RenderMathMLSpace {mspace} at (0,7) size 50x2 [bgcolor=#008000]
    244             RenderMathMLOperator {mo} at (15,0) size 20x7
     239        RenderText {#text} at (388,4) size 4x17
     240          text run at (388,4) width 4: " "
     241        RenderMathMLMath {math} at (392,3) size 52x15 [padding: 0 1 0 1]
     242          RenderMathMLUnderOver {mover} at (1,0) size 50x15
     243            RenderMathMLSpace {mspace} at (0,12) size 50x3 [bgcolor=#008000]
     244            RenderMathMLOperator {mo} at (15,0) size 20x8
    245245              RenderBlock (anonymous) at (0,0) size 12x8
    246246                RenderText {#text} at (0,-36) size 12x80
    247247                  text run at (0,-36) width 12: "\x{21C0}"
    248         RenderText {#text} at (444,0) size 4x17
    249           text run at (444,0) width 4: " "
    250         RenderMathMLMath {math} at (448,4) size 52x10 [padding: 0 1 0 1]
    251           RenderMathMLUnderOver {mover} at (1,0) size 50x10
    252             RenderMathMLSpace {mspace} at (0,8) size 50x2 [bgcolor=#008000]
    253             RenderMathMLOperator {mo} at (15,0) size 20x8
     248        RenderText {#text} at (444,4) size 4x17
     249          text run at (444,4) width 4: " "
     250        RenderMathMLMath {math} at (448,2) size 52x16 [padding: 0 1 0 1]
     251          RenderMathMLUnderOver {mover} at (1,0) size 50x16
     252            RenderMathMLSpace {mspace} at (0,13) size 50x3 [bgcolor=#008000]
     253            RenderMathMLOperator {mo} at (15,0) size 20x9
    254254              RenderBlock (anonymous) at (0,0) size 12x8
    255255                RenderText {#text} at (0,-36) size 12x80
    256256                  text run at (0,-36) width 12: "\x{21D0}"
    257         RenderText {#text} at (500,0) size 4x17
    258           text run at (500,0) width 4: " "
    259         RenderMathMLMath {math} at (504,4) size 52x10 [padding: 0 1 0 1]
    260           RenderMathMLUnderOver {mover} at (1,0) size 50x10
    261             RenderMathMLSpace {mspace} at (0,8) size 50x2 [bgcolor=#008000]
    262             RenderMathMLOperator {mo} at (15,0) size 20x8
     257        RenderText {#text} at (500,4) size 4x17
     258          text run at (500,4) width 4: " "
     259        RenderMathMLMath {math} at (504,2) size 52x16 [padding: 0 1 0 1]
     260          RenderMathMLUnderOver {mover} at (1,0) size 50x16
     261            RenderMathMLSpace {mspace} at (0,13) size 50x3 [bgcolor=#008000]
     262            RenderMathMLOperator {mo} at (15,0) size 20x9
    263263              RenderBlock (anonymous) at (0,0) size 12x8
    264264                RenderText {#text} at (0,-36) size 12x80
    265265                  text run at (0,-36) width 12: "\x{21D2}"
    266         RenderText {#text} at (556,0) size 4x17
    267           text run at (556,0) width 4: " "
    268         RenderMathMLMath {math} at (560,4) size 52x10 [padding: 0 1 0 1]
    269           RenderMathMLUnderOver {mover} at (1,0) size 50x10
    270             RenderMathMLSpace {mspace} at (0,8) size 50x2 [bgcolor=#008000]
    271             RenderMathMLOperator {mo} at (15,0) size 20x8
     266        RenderText {#text} at (556,4) size 4x17
     267          text run at (556,4) width 4: " "
     268        RenderMathMLMath {math} at (560,2) size 52x16 [padding: 0 1 0 1]
     269          RenderMathMLUnderOver {mover} at (1,0) size 50x16
     270            RenderMathMLSpace {mspace} at (0,13) size 50x3 [bgcolor=#008000]
     271            RenderMathMLOperator {mo} at (15,0) size 20x9
    272272              RenderBlock (anonymous) at (0,0) size 12x8
    273273                RenderText {#text} at (0,-36) size 12x80
    274274                  text run at (0,-36) width 12: "\x{21D4}"
    275         RenderText {#text} at (612,0) size 4x17
    276           text run at (612,0) width 4: " "
    277         RenderMathMLMath {math} at (616,2) size 52x12 [padding: 0 1 0 1]
    278           RenderMathMLUnderOver {mover} at (1,0) size 50x12
    279             RenderMathMLSpace {mspace} at (0,10) size 50x2 [bgcolor=#008000]
    280             RenderMathMLOperator {mo} at (15,0) size 20x10
     275        RenderText {#text} at (612,4) size 4x17
     276          text run at (612,4) width 4: " "
     277        RenderMathMLMath {math} at (616,0) size 52x18 [padding: 0 1 0 1]
     278          RenderMathMLUnderOver {mover} at (1,0) size 50x18
     279            RenderMathMLSpace {mspace} at (0,15) size 50x3 [bgcolor=#008000]
     280            RenderMathMLOperator {mo} at (15,0) size 20x11
    281281              RenderBlock (anonymous) at (0,0) size 12x10
    282282                RenderText {#text} at (0,-35) size 12x80
    283283                  text run at (0,-35) width 12: "\x{21DA}"
    284         RenderText {#text} at (668,0) size 4x17
    285           text run at (668,0) width 4: " "
    286         RenderMathMLMath {math} at (672,2) size 52x12 [padding: 0 1 0 1]
    287           RenderMathMLUnderOver {mover} at (1,0) size 50x12
    288             RenderMathMLSpace {mspace} at (0,10) size 50x2 [bgcolor=#008000]
    289             RenderMathMLOperator {mo} at (15,0) size 20x10
     284        RenderText {#text} at (668,4) size 4x17
     285          text run at (668,4) width 4: " "
     286        RenderMathMLMath {math} at (672,0) size 52x18 [padding: 0 1 0 1]
     287          RenderMathMLUnderOver {mover} at (1,0) size 50x18
     288            RenderMathMLSpace {mspace} at (0,15) size 50x3 [bgcolor=#008000]
     289            RenderMathMLOperator {mo} at (15,0) size 20x11
    290290              RenderBlock (anonymous) at (0,0) size 12x10
    291291                RenderText {#text} at (0,-35) size 12x80
    292292                  text run at (0,-35) width 12: "\x{21DB}"
    293         RenderText {#text} at (724,0) size 4x17
    294           text run at (724,0) width 4: " "
    295         RenderMathMLMath {math} at (728,2) size 52x12 [padding: 0 1 0 1]
    296           RenderMathMLUnderOver {mover} at (1,0) size 50x12
    297             RenderMathMLSpace {mspace} at (0,10) size 50x2 [bgcolor=#008000]
    298             RenderMathMLOperator {mo} at (23,0) size 4x10
     293        RenderText {#text} at (724,4) size 4x17
     294          text run at (724,4) width 4: " "
     295        RenderMathMLMath {math} at (728,0) size 52x18 [padding: 0 1 0 1]
     296          RenderMathMLUnderOver {mover} at (1,0) size 50x18
     297            RenderMathMLSpace {mspace} at (0,15) size 50x3 [bgcolor=#008000]
     298            RenderMathMLOperator {mo} at (23,0) size 4x11
    299299              RenderBlock (anonymous) at (0,0) size 4x10
    300300                RenderText {#text} at (0,-34) size 4x80
    301301                  text run at (0,-34) width 4: "\x{23B4}"
    302302        RenderText {#text} at (0,0) size 0x0
    303         RenderMathMLMath {math} at (0,24) size 52x7 [padding: 0 1 0 1]
    304           RenderMathMLUnderOver {mover} at (1,0) size 50x7
    305             RenderMathMLSpace {mspace} at (0,5) size 50x2 [bgcolor=#008000]
    306             RenderMathMLOperator {mo} at (23,0) size 4x5
     303        RenderMathMLMath {math} at (0,27) size 52x13 [padding: 0 1 0 1]
     304          RenderMathMLUnderOver {mover} at (1,0) size 50x13
     305            RenderMathMLSpace {mspace} at (0,10) size 50x3 [bgcolor=#008000]
     306            RenderMathMLOperator {mo} at (23,0) size 4x6
    307307              RenderBlock (anonymous) at (0,0) size 4x4
    308308                RenderText {#text} at (0,-43) size 4x80
    309309                  text run at (0,-43) width 4: "\x{23B5}"
    310         RenderText {#text} at (52,17) size 4x17
    311           text run at (52,17) width 4: " "
    312         RenderMathMLMath {math} at (56,19) size 52x12 [padding: 0 1 0 1]
    313           RenderMathMLUnderOver {mover} at (1,0) size 50x12
    314             RenderMathMLSpace {mspace} at (0,10) size 50x2 [bgcolor=#008000]
    315             RenderMathMLOperator {mo} at (22,0) size 6x10
     310        RenderText {#text} at (52,26) size 4x17
     311          text run at (52,26) width 4: " "
     312        RenderMathMLMath {math} at (56,22) size 52x18 [padding: 0 1 0 1]
     313          RenderMathMLUnderOver {mover} at (1,0) size 50x18
     314            RenderMathMLSpace {mspace} at (0,15) size 50x3 [bgcolor=#008000]
     315            RenderMathMLOperator {mo} at (22,0) size 6x11
    316316              RenderBlock (anonymous) at (0,0) size 6x10
    317317                RenderText {#text} at (0,-34) size 6x80
    318318                  text run at (0,-34) width 6: "\x{23DC}"
    319         RenderText {#text} at (108,17) size 4x17
    320           text run at (108,17) width 4: " "
    321         RenderMathMLMath {math} at (112,24) size 52x7 [padding: 0 1 0 1]
    322           RenderMathMLUnderOver {mover} at (1,0) size 50x7
    323             RenderMathMLSpace {mspace} at (0,5) size 50x2 [bgcolor=#008000]
    324             RenderMathMLOperator {mo} at (22,0) size 6x5
     319        RenderText {#text} at (108,26) size 4x17
     320          text run at (108,26) width 4: " "
     321        RenderMathMLMath {math} at (112,27) size 52x13 [padding: 0 1 0 1]
     322          RenderMathMLUnderOver {mover} at (1,0) size 50x13
     323            RenderMathMLSpace {mspace} at (0,10) size 50x3 [bgcolor=#008000]
     324            RenderMathMLOperator {mo} at (22,0) size 6x6
    325325              RenderBlock (anonymous) at (0,0) size 6x4
    326326                RenderText {#text} at (0,-43) size 6x80
    327327                  text run at (0,-43) width 6: "\x{23DD}"
    328         RenderText {#text} at (164,17) size 4x17
    329           text run at (164,17) width 4: " "
    330         RenderMathMLMath {math} at (168,18) size 52x13 [padding: 0 1 0 1]
    331           RenderMathMLUnderOver {mover} at (1,0) size 50x13
    332             RenderMathMLSpace {mspace} at (0,11) size 50x2 [bgcolor=#008000]
    333             RenderMathMLOperator {mo} at (22,0) size 6x11
     328        RenderText {#text} at (164,26) size 4x17
     329          text run at (164,26) width 4: " "
     330        RenderMathMLMath {math} at (168,21) size 52x19 [padding: 0 1 0 1]
     331          RenderMathMLUnderOver {mover} at (1,0) size 50x19
     332            RenderMathMLSpace {mspace} at (0,16) size 50x3 [bgcolor=#008000]
     333            RenderMathMLOperator {mo} at (22,0) size 6x12
    334334              RenderBlock (anonymous) at (0,0) size 6x11
    335335                RenderText {#text} at (0,-33) size 6x80
    336336                  text run at (0,-33) width 6: "\x{23DE}"
    337         RenderText {#text} at (220,17) size 4x17
    338           text run at (220,17) width 4: " "
    339         RenderMathMLMath {math} at (224,23) size 52x8 [padding: 0 1 0 1]
    340           RenderMathMLUnderOver {mover} at (1,0) size 50x8
    341             RenderMathMLSpace {mspace} at (0,6) size 50x2 [bgcolor=#008000]
    342             RenderMathMLOperator {mo} at (22,0) size 6x6
     337        RenderText {#text} at (220,26) size 4x17
     338          text run at (220,26) width 4: " "
     339        RenderMathMLMath {math} at (224,26) size 52x14 [padding: 0 1 0 1]
     340          RenderMathMLUnderOver {mover} at (1,0) size 50x14
     341            RenderMathMLSpace {mspace} at (0,11) size 50x3 [bgcolor=#008000]
     342            RenderMathMLOperator {mo} at (22,0) size 6x7
    343343              RenderBlock (anonymous) at (0,0) size 6x5
    344344                RenderText {#text} at (0,-43) size 6x80
    345345                  text run at (0,-43) width 6: "\x{23DF}"
    346346        RenderText {#text} at (0,0) size 0x0
    347       RenderBlock {P} at (0,83) size 784x51
    348         RenderMathMLMath {math} at (0,4) size 102x10 [padding: 0 1 0 1]
    349           RenderMathMLUnderOver {mover} at (1,0) size 100x10
    350             RenderMathMLSpace {mspace} at (0,8) size 100x2 [bgcolor=#FF0000]
     347      RenderBlock {P} at (0,96) size 784x62
     348        RenderMathMLMath {math} at (0,0) size 102x16 [padding: 0 1 0 1]
     349          RenderMathMLUnderOver {mover} at (1,0) size 100x16
     350            RenderMathMLSpace {mspace} at (0,13) size 100x3 [bgcolor=#FF0000]
     351            RenderMathMLOperator {mo} at (40,0) size 20x9
     352              RenderBlock (anonymous) at (0,0) size 12x8
     353                RenderText {#text} at (0,-36) size 12x80
     354                  text run at (0,-36) width 12: "\x{2190}"
     355        RenderText {#text} at (102,2) size 4x17
     356          text run at (102,2) width 4: " "
     357        RenderMathMLMath {math} at (106,0) size 102x16 [padding: 0 1 0 1]
     358          RenderMathMLUnderOver {mover} at (1,0) size 100x16
     359            RenderMathMLSpace {mspace} at (0,13) size 100x3 [bgcolor=#FF0000]
     360            RenderMathMLOperator {mo} at (40,0) size 20x9
     361              RenderBlock (anonymous) at (0,0) size 12x8
     362                RenderText {#text} at (0,-36) size 12x80
     363                  text run at (0,-36) width 12: "\x{2192}"
     364        RenderText {#text} at (208,2) size 4x17
     365          text run at (208,2) width 4: " "
     366        RenderMathMLMath {math} at (212,0) size 102x16 [padding: 0 1 0 1]
     367          RenderMathMLUnderOver {mover} at (1,0) size 100x16
     368            RenderMathMLSpace {mspace} at (0,13) size 100x3 [bgcolor=#FF0000]
     369            RenderMathMLOperator {mo} at (40,0) size 20x9
     370              RenderBlock (anonymous) at (0,0) size 12x8
     371                RenderText {#text} at (0,-36) size 12x80
     372                  text run at (0,-36) width 12: "\x{2194}"
     373        RenderText {#text} at (314,2) size 4x17
     374          text run at (314,2) width 4: " "
     375        RenderMathMLMath {math} at (318,0) size 102x16 [padding: 0 1 0 1]
     376          RenderMathMLUnderOver {mover} at (1,0) size 100x16
     377            RenderMathMLSpace {mspace} at (0,13) size 100x3 [bgcolor=#FF0000]
     378            RenderMathMLOperator {mo} at (40,0) size 20x9
     379              RenderBlock (anonymous) at (0,0) size 12x8
     380                RenderText {#text} at (0,-36) size 12x80
     381                  text run at (0,-36) width 12: "\x{21A4}"
     382        RenderText {#text} at (420,2) size 4x17
     383          text run at (420,2) width 4: " "
     384        RenderMathMLMath {math} at (424,0) size 102x16 [padding: 0 1 0 1]
     385          RenderMathMLUnderOver {mover} at (1,0) size 100x16
     386            RenderMathMLSpace {mspace} at (0,13) size 100x3 [bgcolor=#FF0000]
     387            RenderMathMLOperator {mo} at (40,0) size 20x9
     388              RenderBlock (anonymous) at (0,0) size 12x8
     389                RenderText {#text} at (0,-36) size 12x80
     390                  text run at (0,-36) width 12: "\x{21A6}"
     391        RenderText {#text} at (526,2) size 4x17
     392          text run at (526,2) width 4: " "
     393        RenderMathMLMath {math} at (530,1) size 102x15 [padding: 0 1 0 1]
     394          RenderMathMLUnderOver {mover} at (1,0) size 100x15
     395            RenderMathMLSpace {mspace} at (0,12) size 100x3 [bgcolor=#FF0000]
    351396            RenderMathMLOperator {mo} at (40,0) size 20x8
    352397              RenderBlock (anonymous) at (0,0) size 12x8
    353398                RenderText {#text} at (0,-36) size 12x80
    354                   text run at (0,-36) width 12: "\x{2190}"
    355         RenderText {#text} at (102,0) size 4x17
    356           text run at (102,0) width 4: " "
    357         RenderMathMLMath {math} at (106,4) size 102x10 [padding: 0 1 0 1]
    358           RenderMathMLUnderOver {mover} at (1,0) size 100x10
    359             RenderMathMLSpace {mspace} at (0,8) size 100x2 [bgcolor=#FF0000]
    360             RenderMathMLOperator {mo} at (40,0) size 20x8
    361               RenderBlock (anonymous) at (0,0) size 12x8
    362                 RenderText {#text} at (0,-36) size 12x80
    363                   text run at (0,-36) width 12: "\x{2192}"
    364         RenderText {#text} at (208,0) size 4x17
    365           text run at (208,0) width 4: " "
    366         RenderMathMLMath {math} at (212,4) size 102x10 [padding: 0 1 0 1]
    367           RenderMathMLUnderOver {mover} at (1,0) size 100x10
    368             RenderMathMLSpace {mspace} at (0,8) size 100x2 [bgcolor=#FF0000]
    369             RenderMathMLOperator {mo} at (40,0) size 20x8
    370               RenderBlock (anonymous) at (0,0) size 12x8
    371                 RenderText {#text} at (0,-36) size 12x80
    372                   text run at (0,-36) width 12: "\x{2194}"
    373         RenderText {#text} at (314,0) size 4x17
    374           text run at (314,0) width 4: " "
    375         RenderMathMLMath {math} at (318,4) size 102x10 [padding: 0 1 0 1]
    376           RenderMathMLUnderOver {mover} at (1,0) size 100x10
    377             RenderMathMLSpace {mspace} at (0,8) size 100x2 [bgcolor=#FF0000]
    378             RenderMathMLOperator {mo} at (40,0) size 20x8
    379               RenderBlock (anonymous) at (0,0) size 12x8
    380                 RenderText {#text} at (0,-36) size 12x80
    381                   text run at (0,-36) width 12: "\x{21A4}"
    382         RenderText {#text} at (420,0) size 4x17
    383           text run at (420,0) width 4: " "
    384         RenderMathMLMath {math} at (424,4) size 102x10 [padding: 0 1 0 1]
    385           RenderMathMLUnderOver {mover} at (1,0) size 100x10
    386             RenderMathMLSpace {mspace} at (0,8) size 100x2 [bgcolor=#FF0000]
    387             RenderMathMLOperator {mo} at (40,0) size 20x8
    388               RenderBlock (anonymous) at (0,0) size 12x8
    389                 RenderText {#text} at (0,-36) size 12x80
    390                   text run at (0,-36) width 12: "\x{21A6}"
    391         RenderText {#text} at (526,0) size 4x17
    392           text run at (526,0) width 4: " "
    393         RenderMathMLMath {math} at (530,5) size 102x9 [padding: 0 1 0 1]
    394           RenderMathMLUnderOver {mover} at (1,0) size 100x9
    395             RenderMathMLSpace {mspace} at (0,7) size 100x2 [bgcolor=#FF0000]
    396             RenderMathMLOperator {mo} at (40,0) size 20x7
    397               RenderBlock (anonymous) at (0,0) size 12x8
    398                 RenderText {#text} at (0,-36) size 12x80
    399399                  text run at (0,-36) width 12: "\x{21BC}"
    400         RenderText {#text} at (632,0) size 4x17
    401           text run at (632,0) width 4: " "
    402         RenderMathMLMath {math} at (636,7) size 102x7 [padding: 0 1 0 1]
    403           RenderMathMLUnderOver {mover} at (1,0) size 100x7
    404             RenderMathMLSpace {mspace} at (0,5) size 100x2 [bgcolor=#FF0000]
    405             RenderMathMLOperator {mo} at (40,0) size 20x5
     400        RenderText {#text} at (632,2) size 4x17
     401          text run at (632,2) width 4: " "
     402        RenderMathMLMath {math} at (636,3) size 102x13 [padding: 0 1 0 1]
     403          RenderMathMLUnderOver {mover} at (1,0) size 100x13
     404            RenderMathMLSpace {mspace} at (0,10) size 100x3 [bgcolor=#FF0000]
     405            RenderMathMLOperator {mo} at (40,0) size 20x6
    406406              RenderBlock (anonymous) at (0,0) size 12x5
    407407                RenderText {#text} at (0,-39) size 12x80
    408408                  text run at (0,-39) width 12: "\x{21BD}"
    409409        RenderText {#text} at (0,0) size 0x0
    410         RenderMathMLMath {math} at (0,22) size 102x9 [padding: 0 1 0 1]
    411           RenderMathMLUnderOver {mover} at (1,0) size 100x9
    412             RenderMathMLSpace {mspace} at (0,7) size 100x2 [bgcolor=#FF0000]
    413             RenderMathMLOperator {mo} at (40,0) size 20x7
     410        RenderMathMLMath {math} at (0,22) size 102x15 [padding: 0 1 0 1]
     411          RenderMathMLUnderOver {mover} at (1,0) size 100x15
     412            RenderMathMLSpace {mspace} at (0,12) size 100x3 [bgcolor=#FF0000]
     413            RenderMathMLOperator {mo} at (40,0) size 20x8
    414414              RenderBlock (anonymous) at (0,0) size 12x8
    415415                RenderText {#text} at (0,-36) size 12x80
    416416                  text run at (0,-36) width 12: "\x{21C0}"
    417         RenderText {#text} at (102,17) size 4x17
    418           text run at (102,17) width 4: " "
    419         RenderMathMLMath {math} at (106,21) size 102x10 [padding: 0 1 0 1]
    420           RenderMathMLUnderOver {mover} at (1,0) size 100x10
    421             RenderMathMLSpace {mspace} at (0,8) size 100x2 [bgcolor=#FF0000]
    422             RenderMathMLOperator {mo} at (40,0) size 20x8
     417        RenderText {#text} at (102,23) size 4x17
     418          text run at (102,23) width 4: " "
     419        RenderMathMLMath {math} at (106,21) size 102x16 [padding: 0 1 0 1]
     420          RenderMathMLUnderOver {mover} at (1,0) size 100x16
     421            RenderMathMLSpace {mspace} at (0,13) size 100x3 [bgcolor=#FF0000]
     422            RenderMathMLOperator {mo} at (40,0) size 20x9
    423423              RenderBlock (anonymous) at (0,0) size 12x8
    424424                RenderText {#text} at (0,-36) size 12x80
    425425                  text run at (0,-36) width 12: "\x{21D0}"
    426         RenderText {#text} at (208,17) size 4x17
    427           text run at (208,17) width 4: " "
    428         RenderMathMLMath {math} at (212,21) size 102x10 [padding: 0 1 0 1]
    429           RenderMathMLUnderOver {mover} at (1,0) size 100x10
    430             RenderMathMLSpace {mspace} at (0,8) size 100x2 [bgcolor=#FF0000]
    431             RenderMathMLOperator {mo} at (40,0) size 20x8
     426        RenderText {#text} at (208,23) size 4x17
     427          text run at (208,23) width 4: " "
     428        RenderMathMLMath {math} at (212,21) size 102x16 [padding: 0 1 0 1]
     429          RenderMathMLUnderOver {mover} at (1,0) size 100x16
     430            RenderMathMLSpace {mspace} at (0,13) size 100x3 [bgcolor=#FF0000]
     431            RenderMathMLOperator {mo} at (40,0) size 20x9
    432432              RenderBlock (anonymous) at (0,0) size 12x8
    433433                RenderText {#text} at (0,-36) size 12x80
    434434                  text run at (0,-36) width 12: "\x{21D2}"
    435         RenderText {#text} at (314,17) size 4x17
    436           text run at (314,17) width 4: " "
    437         RenderMathMLMath {math} at (318,21) size 102x10 [padding: 0 1 0 1]
    438           RenderMathMLUnderOver {mover} at (1,0) size 100x10
    439             RenderMathMLSpace {mspace} at (0,8) size 100x2 [bgcolor=#FF0000]
    440             RenderMathMLOperator {mo} at (40,0) size 20x8
     435        RenderText {#text} at (314,23) size 4x17
     436          text run at (314,23) width 4: " "
     437        RenderMathMLMath {math} at (318,21) size 102x16 [padding: 0 1 0 1]
     438          RenderMathMLUnderOver {mover} at (1,0) size 100x16
     439            RenderMathMLSpace {mspace} at (0,13) size 100x3 [bgcolor=#FF0000]
     440            RenderMathMLOperator {mo} at (40,0) size 20x9
    441441              RenderBlock (anonymous) at (0,0) size 12x8
    442442                RenderText {#text} at (0,-36) size 12x80
    443443                  text run at (0,-36) width 12: "\x{21D4}"
    444         RenderText {#text} at (420,17) size 4x17
    445           text run at (420,17) width 4: " "
    446         RenderMathMLMath {math} at (424,19) size 102x12 [padding: 0 1 0 1]
    447           RenderMathMLUnderOver {mover} at (1,0) size 100x12
    448             RenderMathMLSpace {mspace} at (0,10) size 100x2 [bgcolor=#FF0000]
    449             RenderMathMLOperator {mo} at (40,0) size 20x10
     444        RenderText {#text} at (420,23) size 4x17
     445          text run at (420,23) width 4: " "
     446        RenderMathMLMath {math} at (424,19) size 102x18 [padding: 0 1 0 1]
     447          RenderMathMLUnderOver {mover} at (1,0) size 100x18
     448            RenderMathMLSpace {mspace} at (0,15) size 100x3 [bgcolor=#FF0000]
     449            RenderMathMLOperator {mo} at (40,0) size 20x11
    450450              RenderBlock (anonymous) at (0,0) size 12x10
    451451                RenderText {#text} at (0,-35) size 12x80
    452452                  text run at (0,-35) width 12: "\x{21DA}"
    453         RenderText {#text} at (526,17) size 4x17
    454           text run at (526,17) width 4: " "
    455         RenderMathMLMath {math} at (530,19) size 102x12 [padding: 0 1 0 1]
    456           RenderMathMLUnderOver {mover} at (1,0) size 100x12
    457             RenderMathMLSpace {mspace} at (0,10) size 100x2 [bgcolor=#FF0000]
    458             RenderMathMLOperator {mo} at (40,0) size 20x10
     453        RenderText {#text} at (526,23) size 4x17
     454          text run at (526,23) width 4: " "
     455        RenderMathMLMath {math} at (530,19) size 102x18 [padding: 0 1 0 1]
     456          RenderMathMLUnderOver {mover} at (1,0) size 100x18
     457            RenderMathMLSpace {mspace} at (0,15) size 100x3 [bgcolor=#FF0000]
     458            RenderMathMLOperator {mo} at (40,0) size 20x11
    459459              RenderBlock (anonymous) at (0,0) size 12x10
    460460                RenderText {#text} at (0,-35) size 12x80
    461461                  text run at (0,-35) width 12: "\x{21DB}"
    462         RenderText {#text} at (632,17) size 4x17
    463           text run at (632,17) width 4: " "
    464         RenderMathMLMath {math} at (636,19) size 102x12 [padding: 0 1 0 1]
    465           RenderMathMLUnderOver {mover} at (1,0) size 100x12
    466             RenderMathMLSpace {mspace} at (0,10) size 100x2 [bgcolor=#FF0000]
    467             RenderMathMLOperator {mo} at (48,0) size 4x10
     462        RenderText {#text} at (632,23) size 4x17
     463          text run at (632,23) width 4: " "
     464        RenderMathMLMath {math} at (636,19) size 102x18 [padding: 0 1 0 1]
     465          RenderMathMLUnderOver {mover} at (1,0) size 100x18
     466            RenderMathMLSpace {mspace} at (0,15) size 100x3 [bgcolor=#FF0000]
     467            RenderMathMLOperator {mo} at (48,0) size 4x11
    468468              RenderBlock (anonymous) at (0,0) size 4x10
    469469                RenderText {#text} at (0,-34) size 4x80
    470470                  text run at (0,-34) width 4: "\x{23B4}"
    471471        RenderText {#text} at (0,0) size 0x0
    472         RenderMathMLMath {math} at (0,41) size 102x7 [padding: 0 1 0 1]
    473           RenderMathMLUnderOver {mover} at (1,0) size 100x7
    474             RenderMathMLSpace {mspace} at (0,5) size 100x2 [bgcolor=#FF0000]
    475             RenderMathMLOperator {mo} at (48,0) size 4x5
     472        RenderMathMLMath {math} at (0,46) size 102x13 [padding: 0 1 0 1]
     473          RenderMathMLUnderOver {mover} at (1,0) size 100x13
     474            RenderMathMLSpace {mspace} at (0,10) size 100x3 [bgcolor=#FF0000]
     475            RenderMathMLOperator {mo} at (48,0) size 4x6
    476476              RenderBlock (anonymous) at (0,0) size 4x4
    477477                RenderText {#text} at (0,-43) size 4x80
    478478                  text run at (0,-43) width 4: "\x{23B5}"
    479         RenderText {#text} at (102,34) size 4x17
    480           text run at (102,34) width 4: " "
    481         RenderMathMLMath {math} at (106,36) size 102x12 [padding: 0 1 0 1]
    482           RenderMathMLUnderOver {mover} at (1,0) size 100x12
    483             RenderMathMLSpace {mspace} at (0,10) size 100x2 [bgcolor=#FF0000]
    484             RenderMathMLOperator {mo} at (47,0) size 6x10
     479        RenderText {#text} at (102,45) size 4x17
     480          text run at (102,45) width 4: " "
     481        RenderMathMLMath {math} at (106,41) size 102x18 [padding: 0 1 0 1]
     482          RenderMathMLUnderOver {mover} at (1,0) size 100x18
     483            RenderMathMLSpace {mspace} at (0,15) size 100x3 [bgcolor=#FF0000]
     484            RenderMathMLOperator {mo} at (47,0) size 6x11
    485485              RenderBlock (anonymous) at (0,0) size 6x10
    486486                RenderText {#text} at (0,-34) size 6x80
    487487                  text run at (0,-34) width 6: "\x{23DC}"
    488         RenderText {#text} at (208,34) size 4x17
    489           text run at (208,34) width 4: " "
    490         RenderMathMLMath {math} at (212,41) size 102x7 [padding: 0 1 0 1]
    491           RenderMathMLUnderOver {mover} at (1,0) size 100x7
    492             RenderMathMLSpace {mspace} at (0,5) size 100x2 [bgcolor=#FF0000]
    493             RenderMathMLOperator {mo} at (47,0) size 6x5
     488        RenderText {#text} at (208,45) size 4x17
     489          text run at (208,45) width 4: " "
     490        RenderMathMLMath {math} at (212,46) size 102x13 [padding: 0 1 0 1]
     491          RenderMathMLUnderOver {mover} at (1,0) size 100x13
     492            RenderMathMLSpace {mspace} at (0,10) size 100x3 [bgcolor=#FF0000]
     493            RenderMathMLOperator {mo} at (47,0) size 6x6
    494494              RenderBlock (anonymous) at (0,0) size 6x4
    495495                RenderText {#text} at (0,-43) size 6x80
    496496                  text run at (0,-43) width 6: "\x{23DD}"
    497         RenderText {#text} at (314,34) size 4x17
    498           text run at (314,34) width 4: " "
    499         RenderMathMLMath {math} at (318,35) size 102x13 [padding: 0 1 0 1]
    500           RenderMathMLUnderOver {mover} at (1,0) size 100x13
    501             RenderMathMLSpace {mspace} at (0,11) size 100x2 [bgcolor=#FF0000]
    502             RenderMathMLOperator {mo} at (47,0) size 6x11
     497        RenderText {#text} at (314,45) size 4x17
     498          text run at (314,45) width 4: " "
     499        RenderMathMLMath {math} at (318,40) size 102x19 [padding: 0 1 0 1]
     500          RenderMathMLUnderOver {mover} at (1,0) size 100x19
     501            RenderMathMLSpace {mspace} at (0,16) size 100x3 [bgcolor=#FF0000]
     502            RenderMathMLOperator {mo} at (47,0) size 6x12
    503503              RenderBlock (anonymous) at (0,0) size 6x11
    504504                RenderText {#text} at (0,-33) size 6x80
    505505                  text run at (0,-33) width 6: "\x{23DE}"
    506         RenderText {#text} at (420,34) size 4x17
    507           text run at (420,34) width 4: " "
    508         RenderMathMLMath {math} at (424,40) size 102x8 [padding: 0 1 0 1]
    509           RenderMathMLUnderOver {mover} at (1,0) size 100x8
    510             RenderMathMLSpace {mspace} at (0,6) size 100x2 [bgcolor=#FF0000]
    511             RenderMathMLOperator {mo} at (47,0) size 6x6
     506        RenderText {#text} at (420,45) size 4x17
     507          text run at (420,45) width 4: " "
     508        RenderMathMLMath {math} at (424,45) size 102x14 [padding: 0 1 0 1]
     509          RenderMathMLUnderOver {mover} at (1,0) size 100x14
     510            RenderMathMLSpace {mspace} at (0,11) size 100x3 [bgcolor=#FF0000]
     511            RenderMathMLOperator {mo} at (47,0) size 6x7
    512512              RenderBlock (anonymous) at (0,0) size 6x5
    513513                RenderText {#text} at (0,-43) size 6x80
  • trunk/LayoutTests/platform/gtk/mathml/opentype/horizontal-munderover-expected.txt

    r202420 r203074  
    11layer at (0,0) size 800x600
    22  RenderView at (0,0) size 800x600
    3 layer at (0,0) size 800x63
    4   RenderBlock {HTML} at (0,0) size 800x63
    5     RenderBody {BODY} at (8,16) size 784x31
    6       RenderBlock {P} at (0,0) size 784x31
    7         RenderMathMLMath {math} at (0,4) size 50x16 [padding: 0 1 0 1]
    8           RenderMathMLRow {mstyle} at (1,0) size 48x16
    9             RenderMathMLUnderOver {mover} at (0,0) size 48x8
    10               RenderMathMLOperator {mo} at (20,2) size 8x6
     3layer at (0,0) size 800x70
     4  RenderBlock {HTML} at (0,0) size 800x70
     5    RenderBody {BODY} at (8,16) size 784x38
     6      RenderBlock {P} at (0,0) size 784x38
     7        RenderMathMLMath {math} at (0,8) size 50x19 [padding: 0 1 0 1]
     8          RenderMathMLRow {mstyle} at (1,0) size 48x19
     9            RenderMathMLUnderOver {mover} at (0,0) size 48x12
     10              RenderMathMLOperator {mo} at (20,5) size 8x7
    1111                RenderBlock (anonymous) at (0,0) size 8x14
    1212                  RenderText {#text} at (0,-44) size 8x106
    1313                    text run at (0,-44) width 8: "\x{23DE}"
    1414              RenderMathMLSpace {mspace} at (0,0) size 48x2 [bgcolor=#FF0000]
    15         RenderText {#text} at (50,6) size 4x17
    16           text run at (50,6) width 4: " "
    17         RenderMathMLMath {math} at (54,7) size 66x13 [padding: 0 1 0 1]
    18           RenderMathMLRow {mstyle} at (1,0) size 64x13
    19             RenderMathMLUnderOver {mover} at (0,0) size 64x13
    20               RenderMathMLSpace {mspace} at (0,11) size 64x2 [bgcolor=#FF0000]
    21               RenderMathMLOperator {mo} at (29,0) size 6x11
     15        RenderText {#text} at (50,13) size 4x17
     16          text run at (50,13) width 4: " "
     17        RenderMathMLMath {math} at (54,8) size 66x19 [padding: 0 1 0 1]
     18          RenderMathMLRow {mstyle} at (1,0) size 64x19
     19            RenderMathMLUnderOver {mover} at (0,0) size 64x19
     20              RenderMathMLSpace {mspace} at (0,16) size 64x3 [bgcolor=#FF0000]
     21              RenderMathMLOperator {mo} at (29,0) size 6x12
    2222                RenderBlock (anonymous) at (0,0) size 6x11
    2323                  RenderText {#text} at (0,-33) size 6x80
    2424                    text run at (0,-33) width 6: "\x{23DE}"
    25         RenderText {#text} at (120,6) size 4x17
    26           text run at (120,6) width 4: " "
    27         RenderMathMLMath {math} at (124,6) size 50x14 [padding: 0 1 0 1]
    28           RenderMathMLRow {mstyle} at (1,0) size 48x14
    29             RenderMathMLUnderOver {munder} at (0,0) size 48x8
     25        RenderText {#text} at (120,13) size 4x17
     26          text run at (120,13) width 4: " "
     27        RenderMathMLMath {math} at (124,13) size 50x16 [padding: 0 1 0 1]
     28          RenderMathMLRow {mstyle} at (1,0) size 48x16
     29            RenderMathMLUnderOver {munder} at (0,0) size 48x16
    3030              RenderMathMLOperator {mo} at (20,0) size 8x6
    3131                RenderBlock (anonymous) at (0,0) size 8x14
    3232                  RenderText {#text} at (0,-44) size 8x106
    3333                    text run at (0,-44) width 8: "\x{23DE}"
    34               RenderMathMLSpace {mspace} at (0,6) size 48x2 [bgcolor=#FF0000]
    35         RenderText {#text} at (174,6) size 4x17
    36           text run at (174,6) width 4: " "
    37         RenderMathMLMath {math} at (178,7) size 66x24 [padding: 0 1 0 1]
    38           RenderMathMLRow {mstyle} at (1,0) size 64x24
    39             RenderMathMLUnderOver {munderover} at (0,0) size 64x24
    40               RenderMathMLSpace {mspace} at (0,11) size 64x2 [bgcolor=#FF0000]
    41               RenderMathMLOperator {mo} at (29,13) size 6x11
     34              RenderMathMLSpace {mspace} at (0,13) size 48x3 [bgcolor=#FF0000]
     35        RenderText {#text} at (174,13) size 4x17
     36          text run at (174,13) width 4: " "
     37        RenderMathMLMath {math} at (178,8) size 66x31 [padding: 0 1 0 1]
     38          RenderMathMLRow {mstyle} at (1,0) size 64x31
     39            RenderMathMLUnderOver {munderover} at (0,0) size 64x31
     40              RenderMathMLSpace {mspace} at (0,16) size 64x3 [bgcolor=#FF0000]
     41              RenderMathMLOperator {mo} at (29,18) size 6x12
    4242                RenderBlock (anonymous) at (0,0) size 6x11
    4343                  RenderText {#text} at (0,-33) size 6x80
    4444                    text run at (0,-33) width 6: "\x{23DE}"
    45               RenderMathMLOperator {mo} at (29,0) size 6x11
     45              RenderMathMLOperator {mo} at (29,0) size 6x12
    4646                RenderBlock (anonymous) at (0,0) size 6x11
    4747                  RenderText {#text} at (0,-33) size 6x80
    4848                    text run at (0,-33) width 6: "\x{23DE}"
    49         RenderText {#text} at (244,6) size 4x17
    50           text run at (244,6) width 4: " "
    51         RenderMathMLMath {math} at (248,0) size 50x20 [padding: 0 1 0 1]
    52           RenderMathMLRow {mstyle} at (1,0) size 48x20
    53             RenderMathMLUnderOver {munderover} at (0,0) size 48x14
    54               RenderMathMLOperator {mo} at (20,6) size 8x6
     49        RenderText {#text} at (244,13) size 4x17
     50          text run at (244,13) width 4: " "
     51        RenderMathMLMath {math} at (248,0) size 50x29 [padding: 0 1 0 1]
     52          RenderMathMLRow {mstyle} at (1,0) size 48x29
     53            RenderMathMLUnderOver {munderover} at (0,0) size 48x29
     54              RenderMathMLOperator {mo} at (20,12) size 8x7
    5555                RenderBlock (anonymous) at (0,0) size 8x14
    5656                  RenderText {#text} at (0,-44) size 8x106
    5757                    text run at (0,-44) width 8: "\x{23DE}"
    58               RenderMathMLSpace {mspace} at (0,12) size 48x2 [bgcolor=#FF0000]
     58              RenderMathMLSpace {mspace} at (0,26) size 48x3 [bgcolor=#FF0000]
    5959              RenderMathMLOperator {mo} at (21,0) size 6x6
    6060                RenderBlock (anonymous) at (0,0) size 6x11
    6161                  RenderText {#text} at (0,-33) size 6x80
    6262                    text run at (0,-33) width 6: "\x{23DE}"
    63         RenderText {#text} at (298,6) size 4x17
    64           text run at (298,6) width 4: " "
    65         RenderMathMLMath {math} at (302,4) size 50x16 [padding: 0 1 0 1]
    66           RenderMathMLRow {mstyle} at (1,0) size 48x16
    67             RenderMathMLUnderOver {munderover} at (0,0) size 48x14
    68               RenderMathMLOperator {mo} at (20,2) size 8x6
     63        RenderText {#text} at (298,13) size 4x17
     64          text run at (298,13) width 4: " "
     65        RenderMathMLMath {math} at (302,8) size 50x20 [padding: 0 1 0 1]
     66          RenderMathMLRow {mstyle} at (1,0) size 48x20
     67            RenderMathMLUnderOver {munderover} at (0,0) size 48x20
     68              RenderMathMLOperator {mo} at (20,5) size 8x7
    6969                RenderBlock (anonymous) at (0,0) size 8x14
    7070                  RenderText {#text} at (0,-44) size 8x106
    7171                    text run at (0,-44) width 8: "\x{23DE}"
    72               RenderMathMLOperator {mo} at (21,8) size 6x6
     72              RenderMathMLOperator {mo} at (21,13) size 6x7
    7373                RenderBlock (anonymous) at (0,0) size 6x11
    7474                  RenderText {#text} at (0,-33) size 6x80
    7575                    text run at (0,-33) width 6: "\x{23DE}"
    7676              RenderMathMLSpace {mspace} at (0,0) size 48x2 [bgcolor=#FF0000]
    77         RenderText {#text} at (352,6) size 4x17
    78           text run at (352,6) width 4: " "
    79         RenderMathMLMath {math} at (356,4) size 50x16 [padding: 0 1 0 1]
    80           RenderMathMLRow {mstyle} at (1,0) size 48x16
    81             RenderMathMLUnderOver {munder} at (0,0) size 48x14
    82               RenderMathMLUnderOver {mover} at (0,0) size 48x8
    83                 RenderMathMLOperator {mo} at (20,2) size 8x6
     77        RenderText {#text} at (352,13) size 4x17
     78          text run at (352,13) width 4: " "
     79        RenderMathMLMath {math} at (356,8) size 50x20 [padding: 0 1 0 1]
     80          RenderMathMLRow {mstyle} at (1,0) size 48x20
     81            RenderMathMLUnderOver {munder} at (0,0) size 48x20
     82              RenderMathMLUnderOver {mover} at (0,0) size 48x12
     83                RenderMathMLOperator {mo} at (20,5) size 8x7
    8484                  RenderBlock (anonymous) at (0,0) size 8x14
    8585                    RenderText {#text} at (0,-44) size 8x106
    8686                      text run at (0,-44) width 8: "\x{23DE}"
    8787                RenderMathMLSpace {mspace} at (0,0) size 48x2 [bgcolor=#FF0000]
    88               RenderMathMLOperator {mo} at (21,8) size 6x6
     88              RenderMathMLOperator {mo} at (21,13) size 6x7
    8989                RenderBlock (anonymous) at (0,0) size 6x11
    9090                  RenderText {#text} at (0,-33) size 6x80
  • trunk/Source/WebCore/ChangeLog

    r203073 r203074  
     12016-07-11  Frederic Wang  <fwang@igalia.com>
     2
     3        Use parameters from the OpenType MATH table for <munderover>
     4        https://bugs.webkit.org/show_bug.cgi?id=155756
     5
     6        Reviewed by Brent Fulgham.
     7
     8        We follow the description from the MathML in HTML5 implementation
     9        to improve the layout of <munderover> using some constants from the MATH table.
     10
     11        Tests: imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-1.html
     12               imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-2.html
     13               imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-3.html
     14               imported/mathml-in-html5/mathml/presentation-markup/scripts/underover-parameters-4.html
     15               mathml/presentation/attributes-accent-accentunder-dynamic.html
     16
     17        * mathml/mathattrs.in: Add accentunder attribute.
     18        * rendering/mathml/MathMLOperatorDictionary.h: Remove FIXME comment.
     19        * rendering/mathml/RenderMathMLUnderOver.cpp:
     20        (WebCore::RenderMathMLUnderOver::hasAccent): Helper function to determine whether
     21        the over/under script should be treated as an accent.
     22        (WebCore::RenderMathMLUnderOver::getVerticalParameters): Helper function to read
     23        some vertical parameters from the MATH table.
     24        (WebCore::RenderMathMLUnderOver::layoutBlock): Take into account the new vertical
     25        parameters for the layout of <munderover>.
     26        * rendering/mathml/RenderMathMLUnderOver.h: Define new helper functions.
     27
    1282016-07-11  Frederic Wang  <fwang@igalia.com>
    229
  • trunk/Source/WebCore/mathml/mathattrs.in

    r202962 r203074  
    55
    66accent
     7accentunder
    78actiontype
    89alttext
  • trunk/Source/WebCore/rendering/mathml/MathMLOperatorDictionary.h

    r202970 r203074  
    3636enum Form { Infix, Prefix, Postfix };
    3737enum Flag {
    38     Accent = 0x1, // FIXME: This must be used to implement accentunder/accent on munderover (https://bugs.webkit.org/show_bug.cgi?id=124826).
     38    Accent = 0x1,
    3939    Fence = 0x2, // This has no visual effect but allows to expose semantic information via the accessibility tree.
    4040    LargeOp = 0x4,
  • trunk/Source/WebCore/rendering/mathml/RenderMathMLUnderOver.cpp

    r202970 r203074  
    3333#include "MathMLElement.h"
    3434#include "MathMLNames.h"
     35#include "MathMLOperatorDictionary.h"
    3536#include "RenderIterator.h"
    3637#include "RenderMathMLOperator.h"
     
    161162}
    162163
     164bool RenderMathMLUnderOver::hasAccent(bool accentUnder) const
     165{
     166    ASSERT(m_scriptType == UnderOver || (accentUnder && m_scriptType == Under) || (!accentUnder && m_scriptType == Over));
     167
     168    const AtomicString& attributeValue = element()->fastGetAttribute(accentUnder ? accentunderAttr : accentAttr);
     169    if (attributeValue == "true")
     170        return true;
     171    if (attributeValue == "false")
     172        return false;
     173    RenderBox& script = accentUnder ? under() : over();
     174    if (!is<RenderMathMLBlock>(script))
     175        return false;
     176    auto* scriptOperator = downcast<RenderMathMLBlock>(script).unembellishedOperator();
     177    return scriptOperator && scriptOperator->hasOperatorFlag(MathMLOperatorDictionary::Accent);
     178}
     179
     180bool RenderMathMLUnderOver::getVerticalParameters(LayoutUnit& underGapMin, LayoutUnit& overGapMin, LayoutUnit& underShiftMin, LayoutUnit& overShiftMin, LayoutUnit& underExtraDescender, LayoutUnit& overExtraAscender, LayoutUnit& accentBaseHeight) const
     181{
     182    // By default, we set all values to zero.
     183    underGapMin = overGapMin = underShiftMin = overShiftMin = underExtraDescender = overExtraAscender = accentBaseHeight = 0;
     184
     185    const auto& primaryFont = style().fontCascade().primaryFont();
     186    auto* mathData = primaryFont.mathData();
     187    if (!mathData) {
     188        // The MATH table specification does not really provide any suggestions, except for some underbar/overbar values and AccentBaseHeight.
     189        LayoutUnit defaultLineThickness = ruleThicknessFallback();
     190        underGapMin = overGapMin = 3 * defaultLineThickness;
     191        underExtraDescender = overExtraAscender = defaultLineThickness;
     192        accentBaseHeight = style().fontMetrics().xHeight();
     193        return true;
     194    }
     195
     196    if (is<RenderMathMLBlock>(base())) {
     197        if (auto* baseOperator = downcast<RenderMathMLBlock>(base()).unembellishedOperator()) {
     198            if (baseOperator->hasOperatorFlag(MathMLOperatorDictionary::LargeOp)) {
     199                // The base is a large operator so we read UpperLimit/LowerLimit constants from the MATH table.
     200                underGapMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::LowerLimitGapMin);
     201                overGapMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::UpperLimitGapMin);
     202                underShiftMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::LowerLimitBaselineDropMin);
     203                overShiftMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::UpperLimitBaselineRiseMin);
     204                return false;
     205            }
     206            if (baseOperator->hasOperatorFlag(MathMLOperatorDictionary::Stretchy) && !baseOperator->isVertical()) {
     207                // The base is a horizontal stretchy operator, so we read StretchStack constants from the MATH table.
     208                underGapMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::StretchStackGapBelowMin);
     209                overGapMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::StretchStackGapAboveMin);
     210                underShiftMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::StretchStackBottomShiftDown);
     211                overShiftMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::StretchStackTopShiftUp);
     212                return false;
     213            }
     214        }
     215    }
     216
     217    // By default, we just use the underbar/overbar constants.
     218    underGapMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::UnderbarVerticalGap);
     219    overGapMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::OverbarVerticalGap);
     220    underExtraDescender = mathData->getMathConstant(primaryFont, OpenTypeMathData::UnderbarExtraDescender);
     221    overExtraAscender = mathData->getMathConstant(primaryFont, OpenTypeMathData::OverbarExtraAscender);
     222    accentBaseHeight = mathData->getMathConstant(primaryFont, OpenTypeMathData::AccentBaseHeight);
     223    return true;
     224}
     225
    163226void RenderMathMLUnderOver::layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight)
    164227{
     
    197260    setLogicalWidth(logicalWidth);
    198261
     262    LayoutUnit underGapMin, overGapMin, underShiftMin, overShiftMin, underExtraDescender, overExtraAscender, accentBaseHeight;
     263    bool underOverBarFall = getVerticalParameters(underGapMin, overGapMin, underShiftMin, overShiftMin, underExtraDescender, overExtraAscender, accentBaseHeight);
    199264    LayoutUnit verticalOffset = 0;
    200265    if (m_scriptType == Over || m_scriptType == UnderOver) {
    201         over().setLocation(LayoutPoint(horizontalOffset(over()), 0));
    202         verticalOffset += over().logicalHeight();
     266        verticalOffset += overExtraAscender;
     267        over().setLocation(LayoutPoint(horizontalOffset(over()), verticalOffset));
     268        if (underOverBarFall) {
     269            verticalOffset += over().logicalHeight();
     270            if (hasAccent()) {
     271                LayoutUnit baseAscent = ascentForChild(base());
     272                if (baseAscent < accentBaseHeight)
     273                    verticalOffset += accentBaseHeight - baseAscent;
     274            } else
     275                verticalOffset += overGapMin;
     276        } else {
     277            LayoutUnit overAscent = ascentForChild(over());
     278            verticalOffset += std::max(over().logicalHeight() + overGapMin, overAscent + overShiftMin);
     279        }
    203280    }
    204281    base().setLocation(LayoutPoint(horizontalOffset(base()), verticalOffset));
    205282    verticalOffset += base().logicalHeight();
    206283    if (m_scriptType == Under || m_scriptType == UnderOver) {
     284        if (underOverBarFall) {
     285            if (!hasAccentUnder())
     286                verticalOffset += underGapMin;
     287        } else {
     288            LayoutUnit underAscent = ascentForChild(under());
     289            verticalOffset += std::max(underGapMin, underShiftMin - underAscent);
     290        }
    207291        under().setLocation(LayoutPoint(horizontalOffset(under()), verticalOffset));
    208292        verticalOffset += under().logicalHeight();
     293        verticalOffset += underExtraDescender;
    209294    }
    210295
  • trunk/Source/WebCore/rendering/mathml/RenderMathMLUnderOver.h

    r202970 r203074  
    5252    RenderBox& over() const;
    5353    LayoutUnit horizontalOffset(const RenderBox&) const;
     54    bool hasAccent(bool accentUnder = false) const;
     55    bool hasAccentUnder() const { return hasAccent(true); };
     56    bool getVerticalParameters(LayoutUnit& underGapMin, LayoutUnit& overGapMin, LayoutUnit& underShiftMin, LayoutUnit& overShiftMin, LayoutUnit& underExtraDescender, LayoutUnit& overExtraAscender, LayoutUnit& accentBaseHeight) const;
    5457};
    5558
Note: See TracChangeset for help on using the changeset viewer.