Changeset 165608 in webkit
- Timestamp:
- Mar 14, 2014 1:36:07 AM (10 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r165607 r165608 1 2014-03-14 Frédéric Wang <fred.wang@free.fr> 2 3 Migrate the MathML stretchy code from UChar to Glyph. 4 https://bugs.webkit.org/show_bug.cgi?id=128907 5 6 Reviewed by Chris Fleizach. 7 8 This prepares the MathML stretchy code for future support for the MATH 9 table. In particular, this uses the glyph index for measuring and 10 drawing instead of Unicode code point since the MATH table uses glyph 11 indices. Also, this merges the preferred width and stretchy character 12 selection into one common path since they will also have to share the 13 size variants measuring/selection. Finally, we expose a drawGlyphs() 14 method so that we can draw a glyph by index. 15 16 No new tests. This should not change the behavior of the stretchy code. 17 18 * platform/graphics/Font.h: 19 * platform/graphics/GraphicsContext.cpp: 20 (WebCore::GraphicsContext::drawGlyphs): 21 * platform/graphics/GraphicsContext.h: 22 * rendering/mathml/RenderMathMLOperator.cpp: 23 (WebCore::RenderMathMLOperator::RenderMathMLOperator): 24 (WebCore::RenderMathMLOperator::boundsForGlyph): 25 (WebCore::RenderMathMLOperator::heightForGlyph): 26 (WebCore::RenderMathMLOperator::advanceForGlyph): 27 (WebCore::RenderMathMLOperator::computePreferredLogicalWidths): 28 (WebCore::RenderMathMLOperator::findStretchyData): 29 (WebCore::RenderMathMLOperator::updateStyle): 30 (WebCore::RenderMathMLOperator::firstLineBaseline): 31 (WebCore::RenderMathMLOperator::computeLogicalHeight): 32 (WebCore::RenderMathMLOperator::paintGlyph): 33 (WebCore::RenderMathMLOperator::fillWithExtensionGlyph): 34 (WebCore::RenderMathMLOperator::paint): 35 (WebCore::RenderMathMLOperator::paintChildren): 36 * rendering/mathml/RenderMathMLOperator.h: 37 1 38 2014-03-12 Sergio Villar Senin <svillar@igalia.com> 2 39 -
trunk/Source/WebCore/platform/graphics/Font.h
r164842 r165608 112 112 enum CustomFontNotReadyAction { DoNotPaintIfFontNotReady, UseFallbackIfFontNotReady }; 113 113 float drawText(GraphicsContext*, const TextRun&, const FloatPoint&, int from = 0, int to = -1, CustomFontNotReadyAction = DoNotPaintIfFontNotReady) const; 114 void drawGlyphs(GraphicsContext*, const SimpleFontData*, const GlyphBuffer&, int from, int numGlyphs, const FloatPoint&) const; 114 115 void drawEmphasisMarks(GraphicsContext*, const TextRun&, const AtomicString& mark, const FloatPoint&, int from = 0, int to = -1) const; 115 116 … … 195 196 float drawSimpleText(GraphicsContext*, const TextRun&, const FloatPoint&, int from, int to) const; 196 197 void drawEmphasisMarksForSimpleText(GraphicsContext*, const TextRun&, const AtomicString& mark, const FloatPoint&, int from, int to) const; 197 void drawGlyphs(GraphicsContext*, const SimpleFontData*, const GlyphBuffer&, int from, int to, const FloatPoint&) const;198 198 void drawGlyphBuffer(GraphicsContext*, const TextRun&, const GlyphBuffer&, FloatPoint&) const; 199 199 void drawEmphasisMarks(GraphicsContext*, const TextRun&, const GlyphBuffer&, const AtomicString&, const FloatPoint&) const; -
trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp
r165055 r165608 459 459 #endif // !PLATFORM(IOS) 460 460 461 void GraphicsContext::drawGlyphs(const Font& font, const SimpleFontData& fontData, const GlyphBuffer& buffer, int from, int numGlyphs, const FloatPoint& point) 462 { 463 if (paintingDisabled()) 464 return; 465 466 font.drawGlyphs(this, &fontData, buffer, from, numGlyphs, point); 467 } 468 461 469 void GraphicsContext::drawEmphasisMarks(const Font& font, const TextRun& run, const AtomicString& mark, const FloatPoint& point, int from, int to) 462 470 { -
trunk/Source/WebCore/platform/graphics/GraphicsContext.h
r165055 r165608 351 351 float drawText(const Font&, const TextRun&, const FloatPoint&, int from = 0, int to = -1); 352 352 #endif 353 void drawGlyphs(const Font&, const SimpleFontData&, const GlyphBuffer&, int from, int numGlyphs, const FloatPoint&); 353 354 void drawEmphasisMarks(const Font&, const TextRun& , const AtomicString& mark, const FloatPoint&, int from = 0, int to = -1); 354 355 #if !PLATFORM(IOS) -
trunk/Source/WebCore/rendering/mathml/RenderMathMLOperator.cpp
r165464 r165608 41 41 #include "TransformOperations.h" 42 42 #include <wtf/MathExtras.h> 43 #include <wtf/unicode/CharacterNames.h> 43 44 44 45 namespace WebCore { … … 47 48 48 49 // FIXME: The OpenType MATH table contains information that should override this table (http://wkbug/122297). 49 static RenderMathMLOperator::StretchyCharacter stretchyCharacters[14] = { 50 struct StretchyCharacter { 51 UChar character; 52 UChar topChar; 53 UChar extensionChar; 54 UChar bottomChar; 55 UChar middleChar; 56 }; 57 static const StretchyCharacter stretchyCharacters[14] = { 50 58 { 0x28 , 0x239b, 0x239c, 0x239d, 0x0 }, // left parenthesis 51 59 { 0x29 , 0x239e, 0x239f, 0x23a0, 0x0 }, // right parenthesis … … 1124 1132 , m_stretchDepthBelowBaseline(0) 1125 1133 , m_operator(0) 1126 , m_stretchyCharacter(nullptr)1127 1134 { 1128 1135 updateTokenContent(); … … 1134 1141 , m_stretchDepthBelowBaseline(0) 1135 1142 , m_operator(0) 1136 , m_stretchyCharacter(nullptr)1137 1143 , m_operatorForm(form) 1138 1144 , m_operatorFlags(flag) … … 1277 1283 } 1278 1284 1279 FloatRect RenderMathMLOperator::glyphBoundsForCharacter(UChar character) 1280 { 1281 GlyphData data = style().font().glyphDataForCharacter(character, false); 1285 FloatRect RenderMathMLOperator::boundsForGlyph(const GlyphData& data) 1286 { 1282 1287 return data.fontData->boundsForGlyph(data.glyph); 1283 1288 } 1284 1289 1285 float RenderMathMLOperator::glyphHeightForCharacter(UChar character) 1286 { 1287 return glyphBoundsForCharacter(character).height(); 1288 } 1289 1290 float RenderMathMLOperator::advanceForCharacter(UChar character) 1291 { 1292 GlyphData data = style().font().glyphDataForCharacter(character, false); 1290 float RenderMathMLOperator::heightForGlyph(const GlyphData& data) 1291 { 1292 return boundsForGlyph(data).height(); 1293 } 1294 1295 float RenderMathMLOperator::advanceForGlyph(const GlyphData& data) 1296 { 1293 1297 return data.fontData->widthForGlyph(data.glyph); 1294 1298 } … … 1305 1309 if (isInvisibleOperator()) { 1306 1310 // In some fonts, glyphs for invisible operators have nonzero width. Consequently, we subtract that width here to avoid wide gaps. 1307 float glyphWidth = advanceForCharacter(m_operator); 1311 GlyphData data = style().font().glyphDataForCharacter(m_operator, false); 1312 float glyphWidth = advanceForGlyph(data); 1308 1313 ASSERT(glyphWidth <= m_minPreferredLogicalWidth); 1309 1314 m_minPreferredLogicalWidth -= glyphWidth; … … 1313 1318 } 1314 1319 1315 float maximumGlyphWidth = advanceForCharacter(stretchedCharacter); 1316 for (unsigned index = 0; index < WTF_ARRAY_LENGTH(stretchyCharacters); ++index) { 1317 if (stretchyCharacters[index].character != stretchedCharacter) 1318 continue; 1319 1320 StretchyCharacter& character = stretchyCharacters[index]; 1321 if (character.topGlyph) 1322 maximumGlyphWidth = std::max(maximumGlyphWidth, advanceForCharacter(character.topGlyph)); 1323 if (character.extensionGlyph) 1324 maximumGlyphWidth = std::max(maximumGlyphWidth, advanceForCharacter(character.extensionGlyph)); 1325 if (character.bottomGlyph) 1326 maximumGlyphWidth = std::max(maximumGlyphWidth, advanceForCharacter(character.bottomGlyph)); 1327 if (character.middleGlyph) 1328 maximumGlyphWidth = std::max(maximumGlyphWidth, advanceForCharacter(character.middleGlyph)); 1329 m_maxPreferredLogicalWidth = m_minPreferredLogicalWidth = m_leadingSpace + maximumGlyphWidth + m_trailingSpace; 1330 return; 1331 } 1332 1320 GlyphData data = style().font().glyphDataForCharacter(stretchedCharacter, false); 1321 float maximumGlyphWidth = advanceForGlyph(data); 1322 findStretchyData(stretchedCharacter, &maximumGlyphWidth); 1333 1323 m_maxPreferredLogicalWidth = m_minPreferredLogicalWidth = m_leadingSpace + maximumGlyphWidth + m_trailingSpace; 1334 1324 } … … 1392 1382 1393 1383 // FIXME: We should also look at alternate characters defined in the OpenType MATH table (http://wkbug/122297). 1394 RenderMathMLOperator::StretchyCharacter* RenderMathMLOperator::findAcceptableStretchyCharacter(UChar character) 1395 { 1396 StretchyCharacter* stretchyCharacter = 0; 1384 RenderMathMLOperator::StretchyData RenderMathMLOperator::findStretchyData(UChar character, float* maximumGlyphWidth) 1385 { 1386 // FIXME: This function should first try size variants. 1387 StretchyData data; 1388 1389 const StretchyCharacter* stretchyCharacter = 0; 1397 1390 const int maxIndex = WTF_ARRAY_LENGTH(stretchyCharacters); 1398 1391 for (int index = 0; index < maxIndex; ++index) { … … 1405 1398 // If we didn't find a stretchy character set for this character, we don't know how to stretch it. 1406 1399 if (!stretchyCharacter) 1407 return 0; 1408 1409 float height = glyphHeightForCharacter(stretchyCharacter->topGlyph) + glyphHeightForCharacter(stretchyCharacter->bottomGlyph); 1410 if (stretchyCharacter->middleGlyph) 1411 height += glyphHeightForCharacter(stretchyCharacter->middleGlyph); 1412 1400 return data; 1401 1402 // We convert the list of Unicode characters into a list of glyph data. 1403 GlyphData top = style().font().glyphDataForCharacter(stretchyCharacter->topChar, false); 1404 GlyphData extension = style().font().glyphDataForCharacter(stretchyCharacter->extensionChar, false); 1405 GlyphData bottom = style().font().glyphDataForCharacter(stretchyCharacter->bottomChar, false); 1406 GlyphData middle; 1407 if (stretchyCharacter->middleChar) 1408 middle = style().font().glyphDataForCharacter(stretchyCharacter->middleChar, false); 1409 1410 // If we are measuring the maximum width, verify each component. 1411 if (maximumGlyphWidth) { 1412 *maximumGlyphWidth = std::max(*maximumGlyphWidth, advanceForGlyph(top)); 1413 *maximumGlyphWidth = std::max(*maximumGlyphWidth, advanceForGlyph(extension)); 1414 if (middle.glyph) 1415 *maximumGlyphWidth = std::max(*maximumGlyphWidth, advanceForGlyph(middle)); 1416 *maximumGlyphWidth = std::max(*maximumGlyphWidth, advanceForGlyph(bottom)); 1417 return data; 1418 } 1419 1420 float height = heightForGlyph(top) + heightForGlyph(bottom); 1421 if (middle.glyph) 1422 height += heightForGlyph(middle); 1413 1423 if (height > stretchSize()) 1414 return 0; 1415 1416 return stretchyCharacter; 1424 return data; 1425 1426 data.setGlyphAssemblyMode(top, extension, bottom, middle); 1427 return data; 1417 1428 } 1418 1429 … … 1427 1438 1428 1439 float stretchedCharacterHeight = style().fontMetrics().floatHeight(); 1429 m_ isStretched = allowStretching && stretchSize() > stretchedCharacterHeight;1440 m_stretchyData.setNormalMode(); 1430 1441 1431 1442 // Sometimes we cannot stretch an operator properly, so in that case, we should just use the original size. 1432 m_stretchyCharacter = m_isStretched ? findAcceptableStretchyCharacter(stretchedCharacter) : 0; 1433 if (!m_stretchyCharacter) 1434 m_isStretched = false; 1443 if (allowStretching && stretchSize() > stretchedCharacterHeight) 1444 m_stretchyData = findStretchyData(stretchedCharacter, nullptr); 1435 1445 1436 1446 // We add spacing around the operator. … … 1447 1457 int RenderMathMLOperator::firstLineBaseline() const 1448 1458 { 1449 if (m_ isStretched)1459 if (m_stretchyData.mode() != DrawNormal) 1450 1460 return m_stretchHeightAboveBaseline; 1451 1461 return RenderMathMLToken::firstLineBaseline(); … … 1454 1464 void RenderMathMLOperator::computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logicalTop, LogicalExtentComputedValues& computedValues) const 1455 1465 { 1456 if (m_ isStretched)1466 if (m_stretchyData.mode() != DrawNormal) 1457 1467 logicalHeight = stretchSize(); 1458 1468 RenderBox::computeLogicalHeight(logicalHeight, logicalTop, computedValues); 1459 1469 } 1460 1470 1461 LayoutRect RenderMathMLOperator::paintCharacter(PaintInfo& info, UChar character, const LayoutPoint& origin, CharacterPaintTrimming trim) 1462 { 1463 GlyphData data = style().font().glyphDataForCharacter(character, false); 1464 FloatRect glyphBounds = data.fontData->boundsForGlyph(data.glyph); 1471 LayoutRect RenderMathMLOperator::paintGlyph(PaintInfo& info, const GlyphData& data, const LayoutPoint& origin, GlyphPaintTrimming trim) 1472 { 1473 FloatRect glyphBounds = boundsForGlyph(data); 1465 1474 1466 1475 LayoutRect glyphPaintRect(origin, LayoutSize(glyphBounds.x() + glyphBounds.width(), glyphBounds.height())); … … 1493 1502 info.context->clip(clipBounds); 1494 1503 1495 info.context->drawText(style().font(), TextRun(&character, 1), origin); 1504 GlyphBuffer buffer; 1505 buffer.add(data.glyph, data.fontData, advanceForGlyph(data)); 1506 info.context->drawGlyphs(style().font(), *data.fontData, buffer, 0, 1, origin); 1496 1507 1497 1508 return glyphPaintRect; … … 1500 1511 void RenderMathMLOperator::fillWithExtensionGlyph(PaintInfo& info, const LayoutPoint& from, const LayoutPoint& to) 1501 1512 { 1502 ASSERT(m_stretchy Character);1503 ASSERT(m_stretchy Character->extensionGlyph);1513 ASSERT(m_stretchyData.mode() == DrawGlyphAssembly); 1514 ASSERT(m_stretchyData.extension().glyph); 1504 1515 ASSERT(from.y() <= to.y()); 1505 1516 … … 1510 1521 GraphicsContextStateSaver stateSaver(*info.context); 1511 1522 1512 FloatRect glyphBounds = glyphBoundsForCharacter(m_stretchyCharacter->extensionGlyph);1523 FloatRect glyphBounds = boundsForGlyph(m_stretchyData.extension()); 1513 1524 1514 1525 // Clipping the extender region here allows us to draw the bottom extender glyph into the … … 1525 1536 1526 1537 while (lastPaintedGlyphRect.maxY() < to.y()) { 1527 lastPaintedGlyphRect = paint Character(info, m_stretchyCharacter->extensionGlyph, glyphOrigin, TrimTopAndBottom);1538 lastPaintedGlyphRect = paintGlyph(info, m_stretchyData.extension(), glyphOrigin, TrimTopAndBottom); 1528 1539 glyphOrigin.setY(glyphOrigin.y() + lastPaintedGlyphRect.height()); 1529 1540 … … 1541 1552 return; 1542 1553 1543 if ( !m_isStretched && !m_stretchyCharacter) {1554 if (m_stretchyData.mode() == DrawNormal) { 1544 1555 RenderMathMLToken::paint(info, paintOffset); 1545 1556 return; … … 1551 1562 info.context->setFillColor(style().visitedDependentColor(CSSPropertyColor), style().colorSpace()); 1552 1563 1553 ASSERT(m_stretchyCharacter->topGlyph); 1554 ASSERT(m_stretchyCharacter->bottomGlyph); 1564 ASSERT(m_stretchyData.mode() == DrawGlyphAssembly); 1565 ASSERT(m_stretchyData.top().glyph); 1566 ASSERT(m_stretchyData.bottom().glyph); 1555 1567 1556 1568 // We are positioning the glyphs so that the edge of the tight glyph bounds line up exactly with the edges of our paint box. … … 1558 1570 operatorTopLeft.move(m_leadingSpace, 0); 1559 1571 operatorTopLeft = ceiledIntPoint(operatorTopLeft); 1560 FloatRect topGlyphBounds = glyphBoundsForCharacter(m_stretchyCharacter->topGlyph);1572 FloatRect topGlyphBounds = boundsForGlyph(m_stretchyData.top()); 1561 1573 LayoutPoint topGlyphOrigin(operatorTopLeft.x(), operatorTopLeft.y() - topGlyphBounds.y()); 1562 LayoutRect topGlyphPaintRect = paint Character(info, m_stretchyCharacter->topGlyph, topGlyphOrigin, TrimBottom);1563 1564 FloatRect bottomGlyphBounds = glyphBoundsForCharacter(m_stretchyCharacter->bottomGlyph);1574 LayoutRect topGlyphPaintRect = paintGlyph(info, m_stretchyData.top(), topGlyphOrigin, TrimBottom); 1575 1576 FloatRect bottomGlyphBounds = boundsForGlyph(m_stretchyData.bottom()); 1565 1577 LayoutPoint bottomGlyphOrigin(operatorTopLeft.x(), operatorTopLeft.y() + offsetHeight() - (bottomGlyphBounds.height() + bottomGlyphBounds.y())); 1566 LayoutRect bottomGlyphPaintRect = paint Character(info, m_stretchyCharacter->bottomGlyph, bottomGlyphOrigin, TrimTop);1567 1568 if (m_stretchy Character->middleGlyph) {1578 LayoutRect bottomGlyphPaintRect = paintGlyph(info, m_stretchyData.bottom(), bottomGlyphOrigin, TrimTop); 1579 1580 if (m_stretchyData.middle().glyph) { 1569 1581 // Center the glyph origin between the start and end glyph paint extents. Then shift it half the paint height toward the bottom glyph. 1570 FloatRect middleGlyphBounds = glyphBoundsForCharacter(m_stretchyCharacter->middleGlyph);1582 FloatRect middleGlyphBounds = boundsForGlyph(m_stretchyData.middle()); 1571 1583 LayoutPoint middleGlyphOrigin(operatorTopLeft.x(), topGlyphOrigin.y()); 1572 1584 middleGlyphOrigin.moveBy(LayoutPoint(0, (bottomGlyphPaintRect.y() - topGlyphPaintRect.maxY()) / 2.0)); 1573 1585 middleGlyphOrigin.moveBy(LayoutPoint(0, middleGlyphBounds.height() / 2.0)); 1574 1586 1575 LayoutRect middleGlyphPaintRect = paint Character(info, m_stretchyCharacter->middleGlyph, middleGlyphOrigin, TrimTopAndBottom);1587 LayoutRect middleGlyphPaintRect = paintGlyph(info, m_stretchyData.middle(), middleGlyphOrigin, TrimTopAndBottom); 1576 1588 fillWithExtensionGlyph(info, topGlyphPaintRect.minXMaxYCorner(), middleGlyphPaintRect.minXMinYCorner()); 1577 1589 fillWithExtensionGlyph(info, middleGlyphPaintRect.minXMaxYCorner(), bottomGlyphPaintRect.minXMinYCorner()); … … 1582 1594 void RenderMathMLOperator::paintChildren(PaintInfo& paintInfo, const LayoutPoint& paintOffset, PaintInfo& paintInfoForChild, bool usePrintRect) 1583 1595 { 1584 if (m_ isStretched)1596 if (m_stretchyData.mode() != DrawNormal) 1585 1597 return; 1586 1598 RenderMathMLToken::paintChildren(paintInfo, paintOffset, paintInfoForChild, usePrintRect); -
trunk/Source/WebCore/rendering/mathml/RenderMathMLOperator.h
r165464 r165608 29 29 #if ENABLE(MATHML) 30 30 31 #include "GlyphPage.h" 31 32 #include "MathMLElement.h" 32 33 #include "RenderMathMLToken.h" 33 #include <wtf/unicode/CharacterNames.h>34 34 35 35 namespace WebCore { … … 71 71 void paint(PaintInfo&, const LayoutPoint&); 72 72 73 struct StretchyCharacter {74 UChar character;75 UChar topGlyph;76 UChar extensionGlyph;77 UChar bottomGlyph;78 UChar middleGlyph;79 };80 81 73 void updateTokenContent(const String& operatorString); 82 74 void updateTokenContent() override final; … … 99 91 100 92 bool shouldAllowStretching(UChar& characterForStretching); 101 StretchyCharacter* findAcceptableStretchyCharacter(UChar);102 93 103 FloatRect glyphBoundsForCharacter(UChar);104 float glyphHeightForCharacter(UChar);105 float advanceFor Character(UChar);94 FloatRect boundsForGlyph(const GlyphData&); 95 float heightForGlyph(const GlyphData&); 96 float advanceForGlyph(const GlyphData&); 106 97 107 enum CharacterPaintTrimming { 98 // FIXME: DrawSizeVariant is not implemented yet. 99 enum DrawMode { 100 DrawNormal, DrawSizeVariant, DrawGlyphAssembly 101 }; 102 class StretchyData { 103 public: 104 DrawMode mode() const { return m_mode; } 105 GlyphData variant() const { return m_data[0]; } 106 GlyphData top() const { return m_data[0]; } 107 GlyphData extension() const { return m_data[1]; } 108 GlyphData bottom() const { return m_data[2]; } 109 GlyphData middle() const { return m_data[3]; } 110 111 void setNormalMode() 112 { 113 m_mode = DrawNormal; 114 } 115 void setSizeVariantMode(const GlyphData& variant) 116 { 117 m_mode = DrawSizeVariant; 118 m_data[0] = variant; 119 } 120 void setGlyphAssemblyMode(const GlyphData& top, const GlyphData& extension, const GlyphData& bottom, const GlyphData& middle) 121 { 122 m_mode = DrawGlyphAssembly; 123 m_data[0] = top; 124 m_data[1] = extension; 125 m_data[2] = bottom; 126 m_data[3] = middle; 127 } 128 StretchyData() 129 : m_mode(DrawNormal) { } 130 StretchyData(const StretchyData& data) 131 { 132 switch (data.m_mode) { 133 case DrawNormal: 134 setNormalMode(); 135 break; 136 case DrawSizeVariant: 137 setSizeVariantMode(data.variant()); 138 break; 139 case DrawGlyphAssembly: 140 setGlyphAssemblyMode(data.top(), data.extension(), data.bottom(), data.middle()); 141 break; 142 } 143 } 144 private: 145 DrawMode m_mode; 146 // FIXME: For OpenType fonts with a MATH table all the glyphs are from the same font, so we would only need to store the glyph indices here. 147 GlyphData m_data[4]; 148 }; 149 StretchyData findStretchyData(UChar, float* maximumGlyphWidth); 150 151 enum GlyphPaintTrimming { 108 152 TrimTop, 109 153 TrimBottom, … … 111 155 }; 112 156 113 LayoutRect paint Character(PaintInfo&, UChar, const LayoutPoint& origin, CharacterPaintTrimming);157 LayoutRect paintGlyph(PaintInfo&, const GlyphData&, const LayoutPoint& origin, GlyphPaintTrimming); 114 158 void fillWithExtensionGlyph(PaintInfo&, const LayoutPoint& from, const LayoutPoint& to); 115 159 116 160 LayoutUnit m_stretchHeightAboveBaseline; 117 161 LayoutUnit m_stretchDepthBelowBaseline; 118 bool m_isStretched;119 162 120 163 UChar m_operator; 121 Stretchy Character* m_stretchyCharacter;164 StretchyData m_stretchyData; 122 165 MathMLOperatorDictionary::Form m_operatorForm; 123 166 unsigned short m_operatorFlags;
Note: See TracChangeset
for help on using the changeset viewer.