Hi everybody!
Attached there is a patch for bug 53472.
It allows to use adaptively-sized integral symbols in Starmath by means of
a new command "intd".
Cheers,
Matteo
From 8960e64124a29fe77e75cd04c3609ba55ea2eefd Mon Sep 17 00:00:00 2001
From: matteocam <matteo.campanelli@gmail.com>
Date: Tue, 25 Feb 2014 14:37:55 -0500
Subject: [PATCH 1/5] Created Dynamic Integral Symbols class
Change-Id: Id86ea4292126b36c37d973ac4acbcc1e5cb7ed97
---
starmath/inc/node.hxx | 28 +++++++++++++++++++++++++++-
starmath/source/node.cxx | 23 +++++++++++++++++++++++
2 files changed, 50 insertions(+), 1 deletion(-)
diff --git a/starmath/inc/node.hxx b/starmath/inc/node.hxx
index bce53f2..5335e6a 100644
--- a/starmath/inc/node.hxx
+++ b/starmath/inc/node.hxx
@@ -73,7 +73,7 @@ enum SmNodeType
/*10*/ NBINDIAGONAL, NSUBSUP, NMATRIX, NPLACE, NTEXT,
/*15*/ NSPECIAL, NGLYPH_SPECIAL, NMATH, NBLANK, NERROR,
/*20*/ NLINE, NEXPRESSION, NPOLYLINE, NROOT, NROOTSYMBOL,
-/*25*/ NRECTANGLE, NVERTICAL_BRACE, NMATHIDENT
+/*25*/ NRECTANGLE, NVERTICAL_BRACE, NMATHIDENT, NDYNINT
};
@@ -618,6 +618,32 @@ public:
void Accept(SmVisitor* pVisitor);
};
+////////////////////////////////////////////////////////////////////////////////
+
+/** Dynamic Integral symbol node
+ *
+ * Node for drawing dynamicall sized integral symbols.
+ *
+ * XXX: It might be created a parent class SmDynamicSizedNode
+ (for both dynamic integrals, roots and other dynamic symbols)
+
+ */
+class SmDynIntegralNode : public SmMathSymbolNode
+{
+ sal_uLong nBodyWidth; // width of body (argument) of integral sign
+
+public:
+ SmDynIntegralNode(const SmToken &rNodeToken)
+ : SmMathSymbolNode(NDYNINT, rNodeToken)
+ {}
+
+ sal_uLong GetBodyWidth() const {return nBodyWidth;};
+ virtual void AdaptToX(const OutputDevice &rDev, sal_uLong nHeight);
+ virtual void AdaptToY(const OutputDevice &rDev, sal_uLong nHeight);
+
+ void Accept(SmVisitor* pVisitor);
+};
+
////////////////////////////////////////////////////////////////////////////////
diff --git a/starmath/source/node.cxx b/starmath/source/node.cxx
index 6ffd0fb..9268e55 100644
--- a/starmath/source/node.cxx
+++ b/starmath/source/node.cxx
@@ -622,6 +622,7 @@ void SmNode::DumpAsDot(std::ostream &out, OUString* label, int number, int& id,
case NRECTANGLE: out<<"SmRectangleNode"; break;
case NVERTICAL_BRACE: out<<"SmVerticalBraceNode"; break;
case NMATHIDENT: out<<"SmMathIdentifierNode"; break;
+ case NINTDYN: out<<"SmDynIntegralNode"; break;
default:
out<<"Unknown Node";
}
@@ -2296,6 +2297,24 @@ void SmRootSymbolNode::AdaptToY(const OutputDevice &rDev, sal_uLong nHeight)
/**************************************************************************/
+void SmDynIntegralNode::AdaptToX(const OutputDevice &/*rDev*/, sal_uLong nWidth)
+{
+ // XXX: copied from SmRootSymbol for now
+ //nBodyWidth = nWidth;
+}
+
+
+void SmDynIntegralNode::AdaptToY(const OutputDevice &rDev, sal_uLong nHeight)
+{
+ // XXX: copied from SmRootSymbol for now
+ // some additional length so that the horizontal
+ // bar will be positioned above the argument
+ //SmMathSymbolNode::AdaptToY(rDev, nHeight + nHeight / 10L);
+}
+
+
+/**************************************************************************/
+
void SmRectangleNode::AdaptToX(const OutputDevice &/*rDev*/, sal_uLong nWidth)
{
@@ -3194,6 +3213,10 @@ void SmRootSymbolNode::Accept(SmVisitor* pVisitor) {
pVisitor->Visit(this);
}
+void SmDynIntegralNode::Accept(SmVisitor* pVisitor) {
+ pVisitor->Visit(this);
+}
+
void SmRectangleNode::Accept(SmVisitor* pVisitor) {
pVisitor->Visit(this);
}
--
1.8.3.2
From a9019baf943d56c225e02d7c4f87119c2ba79d12 Mon Sep 17 00:00:00 2001
From: matteocam <matteo.campanelli@gmail.com>
Date: Tue, 25 Feb 2014 21:47:22 -0500
Subject: [PATCH 2/5] Added files
Change-Id: I71862f579784890d3075ff9f5a63bd756a55b93d
---
starmath/source/mathtype.cxx | 2 ++
starmath/source/mathtype.hxx | 2 +-
starmath/source/ooxmlexport.cxx | 1 +
starmath/source/rtfexport.cxx | 1 +
4 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/starmath/source/mathtype.cxx b/starmath/source/mathtype.cxx
index b90b79d..8212421 100644
--- a/starmath/source/mathtype.cxx
+++ b/starmath/source/mathtype.cxx
@@ -2516,6 +2516,7 @@ void MathType::HandleOperator(SmNode *pNode,int nLevel)
switch(pNode->GetToken().eType)
{
case TINT:
+ case TINTD:
if (nOldVariation != 0xff)
pS->WriteUChar( sal_uInt8(0x18) ); //selector
else
@@ -2640,6 +2641,7 @@ void MathType::HandleOperator(SmNode *pNode,int nLevel)
pS->WriteUChar( sal_uInt8(0x86) );
pS->WriteUInt16( sal_uInt16(0x222B) );
case TINT:
+ case TINTD:
case TLINT:
pS->WriteUChar( sal_uInt8(CHAR) );
pS->WriteUChar( sal_uInt8(0x86) );
diff --git a/starmath/source/mathtype.hxx b/starmath/source/mathtype.hxx
index 332cd27..8246769 100644
--- a/starmath/source/mathtype.hxx
+++ b/starmath/source/mathtype.hxx
@@ -157,7 +157,7 @@ private:
tmANGLE,tmPAREN,tmBRACE,tmBRACK,tmBAR,tmDBAR,tmFLOOR,tmCEILING,
tmLBLB,tmRBRB,tmRBLB,tmLBRP,tmLPRB,tmROOT,tmFRACT,tmSCRIPT,tmUBAR,
tmOBAR,tmLARROW,tmRARROW,tmBARROW,tmSINT,tmDINT,tmTINT,tmSSINT,
- tmDSINT,tmTSINT,tmUHBRACE,tmLHBRACE,tmSUM
+ tmDSINT,tmTSINT,tmUHBRACE,tmLHBRACE,tmSUM,tmTINTD
};
public:
static sal_Bool LookupChar(sal_Unicode nChar,OUString &rRet,
diff --git a/starmath/source/ooxmlexport.cxx b/starmath/source/ooxmlexport.cxx
index 8d1c808..c0c3be5 100644
--- a/starmath/source/ooxmlexport.cxx
+++ b/starmath/source/ooxmlexport.cxx
@@ -249,6 +249,7 @@ void SmOoxmlExport::HandleOperator( const SmOperNode* pNode, int nLevel )
switch( pNode->GetToken().eType )
{
case TINT:
+ case TINTD:
case TIINT:
case TIIINT:
case TLINT:
diff --git a/starmath/source/rtfexport.cxx b/starmath/source/rtfexport.cxx
index 45354fc..aa2dbe3 100644
--- a/starmath/source/rtfexport.cxx
+++ b/starmath/source/rtfexport.cxx
@@ -197,6 +197,7 @@ void SmRtfExport::HandleOperator(const SmOperNode* pNode, int nLevel)
switch (pNode->GetToken().eType)
{
case TINT:
+ case TINTD:
case TIINT:
case TIIINT:
case TLINT:
--
1.8.3.2
From aece34164a4c5235c38492800daa15b8952812a1 Mon Sep 17 00:00:00 2001
From: matteocam <matteo.campanelli@gmail.com>
Date: Sat, 1 Mar 2014 05:00:44 -0500
Subject: [PATCH 3/5] Created behavior for SmDynIntegralNode
Change-Id: I53182a5735c814a5c0f80c0521bf0bc2ccf63d2e
---
starmath/inc/node.hxx | 70 ++++++++++++++++++++++++---
starmath/inc/parse.hxx | 3 +-
starmath/inc/visitors.hxx | 14 ++++++
starmath/source/node.cxx | 88 +++++++++++++++++++++++++++++-----
starmath/source/parse.cxx | 10 +++-
starmath/source/visitors.cxx | 109 +++++++++++++++++++++++++++++++++++++++++++
6 files changed, 274 insertions(+), 20 deletions(-)
diff --git a/starmath/inc/node.hxx b/starmath/inc/node.hxx
index 5335e6a..b2c4df9 100644
--- a/starmath/inc/node.hxx
+++ b/starmath/inc/node.hxx
@@ -73,7 +73,7 @@ enum SmNodeType
/*10*/ NBINDIAGONAL, NSUBSUP, NMATRIX, NPLACE, NTEXT,
/*15*/ NSPECIAL, NGLYPH_SPECIAL, NMATH, NBLANK, NERROR,
/*20*/ NLINE, NEXPRESSION, NPOLYLINE, NROOT, NROOTSYMBOL,
-/*25*/ NRECTANGLE, NVERTICAL_BRACE, NMATHIDENT, NDYNINT
+/*25*/ NRECTANGLE, NVERTICAL_BRACE, NMATHIDENT, NDYNINT, NDYNINTSYMBOL
};
@@ -628,17 +628,15 @@ public:
(for both dynamic integrals, roots and other dynamic symbols)
*/
-class SmDynIntegralNode : public SmMathSymbolNode
+class SmDynIntegralSymbolNode : public SmMathSymbolNode
{
- sal_uLong nBodyWidth; // width of body (argument) of integral sign
+
public:
- SmDynIntegralNode(const SmToken &rNodeToken)
- : SmMathSymbolNode(NDYNINT, rNodeToken)
+ SmDynIntegralSymbolNode(const SmToken &rNodeToken)
+ : SmMathSymbolNode(NDYNINTSYMBOL, rNodeToken)
{}
- sal_uLong GetBodyWidth() const {return nBodyWidth;};
- virtual void AdaptToX(const OutputDevice &rDev, sal_uLong nHeight);
virtual void AdaptToY(const OutputDevice &rDev, sal_uLong nHeight);
void Accept(SmVisitor* pVisitor);
@@ -834,6 +832,42 @@ public:
////////////////////////////////////////////////////////////////////////////////
+/** Dynamic Integral node
+ *
+ * Used for create Dynamically sized integrals
+ *
+ * Children:<BR>
+ * 0: Argument (optional)<BR>
+ * 1: Symbol (instance of DynIntegralSymbolNode)<BR>
+ * 2: Body<BR>
+ * Where argument is optional and may be NULL.
+ */
+class SmDynIntegralNode : public SmStructureNode
+{
+protected:
+ void GetHeightVerOffset(const SmRect &rRect,
+ long &rHeight, long &rVerOffset) const;
+
+public:
+ SmDynIntegralNode(const SmToken &rNodeToken)
+ : SmStructureNode(NDYNINT, rNodeToken)
+ {
+ SetNumSubNodes(2);
+ }
+
+ virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
+ void CreateTextFromNode(OUString &rText);
+ void Accept(SmVisitor* pVisitor);
+
+ SmDynIntegralSymbolNode* Symbol();
+ const SmDynIntegralSymbolNode* Symbol() const;
+ SmNode* Body();
+ const SmNode* Body() const;
+};
+
+
+////////////////////////////////////////////////////////////////////////////////
+
/** Binary horizontial node
*
* This node is used for binary operators. In a formula such as "A + B".
@@ -1319,6 +1353,28 @@ inline const SmNode* SmRootNode::Body() const
return const_cast< SmRootNode* >( this )->Body();
}
+
+
+inline SmDynIntegralSymbolNode* SmDynIntegralNode::Symbol()
+{
+ OSL_ASSERT( GetNumSubNodes() > 0 && GetSubNode( 0 )->GetType() == NDYNINTSYMBOL );
+ return static_cast< SmDynIntegralSymbolNode* >( GetSubNode( 0 ));
+}
+inline const SmDynIntegralSymbolNode* SmDynIntegralNode::Symbol() const
+{
+ return const_cast< SmDynIntegralNode* >( this )->Symbol();
+}
+inline SmNode* SmDynIntegralNode::Body()
+{
+ OSL_ASSERT( GetNumSubNodes() > 1 );
+ return GetSubNode( 1 );
+}
+inline const SmNode* SmDynIntegralNode::Body() const
+{
+ return const_cast< SmDynIntegralNode* >( this )->Body();
+}
+
+
inline SmMathSymbolNode* SmBinHorNode::Symbol()
{
OSL_ASSERT( GetNumSubNodes() > 1 && GetSubNode( 1 )->GetType() == NMATH );
diff --git a/starmath/inc/parse.hxx b/starmath/inc/parse.hxx
index 996d914..104a2d3 100644
--- a/starmath/inc/parse.hxx
+++ b/starmath/inc/parse.hxx
@@ -102,7 +102,8 @@ enum SmTokenType
/*215*/ TSETR, TSETC, TWIDEVEC, TWIDETILDE, TWIDEHAT,
/*220*/ TWIDESLASH, TWIDEBACKSLASH, TLDBRACKET, TRDBRACKET, TNOSPACE,
/*225*/ TUNKNOWN, TDEBUG, TPRECEDES, TSUCCEEDS, TPRECEDESEQUAL,
-/*230*/ TSUCCEEDSEQUAL, TPRECEDESEQUIV, TSUCCEEDSEQUIV, TNOTPRECEDES, TNOTSUCCEEDS
+/*230*/ TSUCCEEDSEQUAL, TPRECEDESEQUIV, TSUCCEEDSEQUIV, TNOTPRECEDES, TNOTSUCCEEDS,
+/*235*/ TINTD
};
diff --git a/starmath/inc/visitors.hxx b/starmath/inc/visitors.hxx
index 5c872cf..ad9f72b 100644
--- a/starmath/inc/visitors.hxx
+++ b/starmath/inc/visitors.hxx
@@ -42,6 +42,8 @@ public:
virtual void Visit( SmLineNode* pNode ) = 0;
virtual void Visit( SmExpressionNode* pNode ) = 0;
virtual void Visit( SmPolyLineNode* pNode ) = 0;
+ virtual void Visit( SmDynIntegralNode* pNode ) = 0;
+ virtual void Visit( SmDynIntegralSymbolNode* pNode ) = 0;
virtual void Visit( SmRootNode* pNode ) = 0;
virtual void Visit( SmRootSymbolNode* pNode ) = 0;
virtual void Visit( SmRectangleNode* pNode ) = 0;
@@ -81,6 +83,8 @@ public:
void Visit( SmPolyLineNode* pNode );
void Visit( SmRootNode* pNode );
void Visit( SmRootSymbolNode* pNode );
+ void Visit( SmDynIntegralNode* pNode );
+ void Visit( SmDynIntegralSymbolNode* pNode );
void Visit( SmRectangleNode* pNode );
void Visit( SmVerticalBraceNode* pNode );
private:
@@ -124,6 +128,8 @@ public:
void Visit( SmPolyLineNode* pNode );
void Visit( SmRootNode* pNode );
void Visit( SmRootSymbolNode* pNode );
+ void Visit( SmDynIntegralNode* pNode );
+ void Visit( SmDynIntegralSymbolNode* pNode );
void Visit( SmRectangleNode* pNode );
void Visit( SmVerticalBraceNode* pNode );
protected:
@@ -227,6 +233,8 @@ public:
void Visit( SmPolyLineNode* pNode );
void Visit( SmRootNode* pNode );
void Visit( SmRootSymbolNode* pNode );
+ void Visit( SmDynIntegralNode* pNode );
+ void Visit( SmDynIntegralSymbolNode* pNode );
void Visit( SmRectangleNode* pNode );
void Visit( SmVerticalBraceNode* pNode );
private:
@@ -344,6 +352,8 @@ public:
void Visit( SmPolyLineNode* pNode );
void Visit( SmRootNode* pNode );
void Visit( SmRootSymbolNode* pNode );
+ void Visit( SmDynIntegralNode* pNode );
+ void Visit( SmDynIntegralSymbolNode* pNode );
void Visit( SmRectangleNode* pNode );
void Visit( SmVerticalBraceNode* pNode );
SmCaretPosGraph* takeGraph()
@@ -393,6 +403,8 @@ public:
void Visit( SmPolyLineNode* pNode );
void Visit( SmRootNode* pNode );
void Visit( SmRootSymbolNode* pNode );
+ void Visit( SmDynIntegralNode* pNode );
+ void Visit( SmDynIntegralSymbolNode* pNode );
void Visit( SmRectangleNode* pNode );
void Visit( SmVerticalBraceNode* pNode );
/** Clone a pNode */
@@ -465,6 +477,8 @@ public:
void Visit( SmPolyLineNode* pNode );
void Visit( SmRootNode* pNode );
void Visit( SmRootSymbolNode* pNode );
+ void Visit( SmDynIntegralNode* pNode );
+ void Visit( SmDynIntegralSymbolNode* pNode );
void Visit( SmRectangleNode* pNode );
void Visit( SmVerticalBraceNode* pNode );
private:
diff --git a/starmath/source/node.cxx b/starmath/source/node.cxx
index 9268e55..9cceb57 100644
--- a/starmath/source/node.cxx
+++ b/starmath/source/node.cxx
@@ -622,6 +622,7 @@ void SmNode::DumpAsDot(std::ostream &out, OUString* label, int number, int& id,
case NRECTANGLE: out<<"SmRectangleNode"; break;
case NVERTICAL_BRACE: out<<"SmVerticalBraceNode"; break;
case NMATHIDENT: out<<"SmMathIdentifierNode"; break;
+ case NINTDYNSYMBOL: out<<"SmDynIntegralSymbolNode"; break;
case NINTDYN: out<<"SmDynIntegralNode"; break;
default:
out<<"Unknown Node";
@@ -1116,6 +1117,74 @@ void SmRootNode::CreateTextFromNode(OUString &rText)
rText += "} ";
}
+/**************************************************************************/
+
+
+void SmDynIntegralNode::GetHeightVerOffset(const SmRect &rRect,
+ long &rHeight, long &rVerOffset) const
+ // calculate height and vertical offset of root sign suitable for 'rRect'
+ //! Code copied from SmRootNode
+{
+ rVerOffset = (rRect.GetBottom() - rRect.GetAlignB()) / 2;
+ rHeight = rRect.GetHeight() - rVerOffset;
+
+ OSL_ENSURE(rHeight >= 0, "Sm : Ooops...");
+ OSL_ENSURE(rVerOffset >= 0, "Sm : Ooops...");
+}
+
+
+void SmDynIntegralNode::Arrange(const OutputDevice &rDev, const SmFormat &rFormat)
+{
+
+ SmNode *pDynIntegralSym = GetSubNode(0),
+ *pBody = GetSubNode(1);
+ OSL_ENSURE(pDynIntegralSym, "Sm: NULL pointer");
+ OSL_ENSURE(pBody, "Sm: NULL pointer");
+
+ pBody->Arrange(rDev, rFormat);
+
+ long nHeight,
+ nVerOffset;
+ // XXX This is root-specific too
+ GetHeightVerOffset(*pBody, nHeight, nVerOffset);
+ //XXX I suppose I don't need the lines below which seem root-specific
+ //nHeight += rFormat.GetDistance(DIS_ROOT) // XXX
+ //* GetFont().GetSize().Height() / 100L;
+
+ pDynIntegralSym->AdaptToY(rDev, nHeight);
+
+ pDynIntegralSym->Arrange(rDev, rFormat);
+
+ Point aPos = pDynIntegralSym->AlignTo(*pBody, RP_LEFT, RHA_CENTER, RVA_BASELINE);
+ //! override calculated vertical position
+ aPos.Y() = pDynIntegralSym->GetTop() + pBody->GetBottom() - pDynIntegralSym->GetBottom();
+ aPos.Y() -= nVerOffset;
+ pDynIntegralSym->MoveTo(aPos);
+
+ // override its own rectangle with pBody's
+ SmRect::operator = (*pBody);
+ // extends this rectangle with the symbol's one
+ ExtendBy(*pDynIntegralSym, RCP_THIS);
+
+}
+
+
+void SmDynIntegralNode::CreateTextFromNode(OUString &rText)
+{
+
+ rText += "intd ";
+ SmNode *pBody = GetSubNode(1);
+
+ if (pBody->GetNumSubNodes() > 1)
+ rText += "{ ";
+
+ pBody->CreateTextFromNode(rText);
+
+ if (pBody->GetNumSubNodes() > 1)
+ rText += "} ";
+}
+
+
/**************************************************************************/
@@ -2297,19 +2366,11 @@ void SmRootSymbolNode::AdaptToY(const OutputDevice &rDev, sal_uLong nHeight)
/**************************************************************************/
-void SmDynIntegralNode::AdaptToX(const OutputDevice &/*rDev*/, sal_uLong nWidth)
-{
- // XXX: copied from SmRootSymbol for now
- //nBodyWidth = nWidth;
-}
-
-void SmDynIntegralNode::AdaptToY(const OutputDevice &rDev, sal_uLong nHeight)
+void SmDynIntegralSymbolNode::AdaptToY(const OutputDevice &rDev, sal_uLong nHeight)
{
- // XXX: copied from SmRootSymbol for now
- // some additional length so that the horizontal
- // bar will be positioned above the argument
- //SmMathSymbolNode::AdaptToY(rDev, nHeight + nHeight / 10L);
+ // XXX: testing with a slightly higher height
+ SmMathSymbolNode::AdaptToY(rDev, nHeight + nHeight / 2L);
}
@@ -3217,6 +3278,11 @@ void SmDynIntegralNode::Accept(SmVisitor* pVisitor) {
pVisitor->Visit(this);
}
+
+void SmDynIntegralSymbolNode::Accept(SmVisitor* pVisitor) {
+ pVisitor->Visit(this);
+}
+
void SmRectangleNode::Accept(SmVisitor* pVisitor) {
pVisitor->Visit(this);
}
diff --git a/starmath/source/parse.cxx b/starmath/source/parse.cxx
index 1ab966b0..6c42db6 100644
--- a/starmath/source/parse.cxx
+++ b/starmath/source/parse.cxx
@@ -160,6 +160,7 @@ static const SmTokenTableEntry aTokenTable[] =
{ "infinity" , TINFINITY, MS_INFINITY, TGSTANDALONE, 5},
{ "infty" , TINFINITY, MS_INFINITY, TGSTANDALONE, 5},
{ "int", TINT, MS_INT, TGOPER, 5},
+ { "intd", TINTD, MS_INT, TGOPER, 5},
{ "intersection", TINTERSECT, MS_INTERSECT, TGPRODUCT, 0},
{ "ital", TITALIC, '\0', TGFONTATTR, 5},
{ "italic", TITALIC, '\0', TGFONTATTR, 5},
@@ -1633,6 +1634,7 @@ void SmParser::Oper()
case TPROD :
case TCOPROD :
case TINT :
+ case TINTD:
case TIINT :
case TIIINT :
case TLINT :
@@ -1698,6 +1700,7 @@ void SmParser::UnOper()
{
case TABS :
case TSQRT :
+ case TINTD:
NextToken();
break;
@@ -1752,10 +1755,15 @@ void SmParser::UnOper()
pSNode->SetSubNodes(pLeft, pArg, pRight);
}
else if (eType == TSQRT || eType == TNROOT)
- { pSNode = new SmRootNode(aNodeToken);
+ { pSNode = new SmRootNode(aNodeToken);
pOper = new SmRootSymbolNode(aNodeToken);
pSNode->SetSubNodes(pExtra, pOper, pArg);
}
+ else if(eType == TINTD)
+ { pSNode = new SmDynIntegralNode(aNodeToken);
+ pOper = new SmDynIntegralSymbolNode(aNodeToken);
+ pSNode->SetSubNodes(pOper, pArg);
+ }
else
{ pSNode = new SmUnHorNode(aNodeToken);
diff --git a/starmath/source/visitors.cxx b/starmath/source/visitors.cxx
index 922d6c3..935c5bc 100644
--- a/starmath/source/visitors.cxx
+++ b/starmath/source/visitors.cxx
@@ -161,6 +161,18 @@ void SmVisitorTest::Visit( SmRootSymbolNode* pNode )
VisitChildren( pNode );
}
+void SmVisitorTest::Visit( SmDynIntegralNode* pNode )
+{
+ assert( pNode->GetType( ) == NDYNINT );
+ VisitChildren( pNode );
+}
+
+void SmVisitorTest::Visit( SmDynIntegralSymbolNode* pNode )
+{
+ assert( pNode->GetType( ) == NDYNINTSYMBOL );
+ VisitChildren( pNode );
+}
+
void SmVisitorTest::Visit( SmRectangleNode* pNode )
{
assert( pNode->GetType( ) == NRECTANGLE );
@@ -307,6 +319,16 @@ void SmDefaultingVisitor::Visit( SmRootSymbolNode* pNode )
DefaultVisit( pNode );
}
+void SmDefaultingVisitor::Visit( SmDynIntegralNode* pNode )
+{
+ DefaultVisit( pNode );
+}
+
+void SmDefaultingVisitor::Visit( SmDynIntegralSymbolNode* pNode )
+{
+ DefaultVisit( pNode );
+}
+
void SmDefaultingVisitor::Visit( SmRectangleNode* pNode )
{
DefaultVisit( pNode );
@@ -630,6 +652,11 @@ void SmDrawingVisitor::Visit( SmRootNode* pNode )
DrawChildren( pNode );
}
+void SmDrawingVisitor::Visit(SmDynIntegralNode* pNode)
+{
+ DrawChildren( pNode );
+}
+
void SmDrawingVisitor::Visit( SmVerticalBraceNode* pNode )
{
DrawChildren( pNode );
@@ -668,6 +695,22 @@ void SmDrawingVisitor::Visit( SmRootSymbolNode* pNode )
rDev.DrawRect( aBar );
}
+void SmDrawingVisitor::Visit( SmDynIntegralSymbolNode* pNode )
+{
+ if ( pNode->IsPhantom( ) )
+ return;
+
+ // draw integral-sign itself
+ DrawSpecialNode( pNode );
+
+ //! the rest of this may not be needed at all
+
+ // this should be something like:
+ // instead of just drawing the node, take some information about the body.
+ // This is also how SmRootSymbol does it (probably by means of SmRootNode)
+ // NEXT: Check out SmRootNode
+}
+
void SmDrawingVisitor::Visit( SmPolyLineNode* pNode )
{
if ( pNode->IsPhantom( ) )
@@ -1630,6 +1673,40 @@ void SmCaretPosGraphBuildingVisitor::Visit( SmRootNode* pNode )
pRightMost = right;
}
+
+void SmCaretPosGraphBuildingVisitor::Visit( SmDynIntegralNode* pNode )
+{
+ //! To be changed: Integrals don't have args.
+ SmNode *pBody = pNode->Body(); //Body of the root
+ SAL_WARN_IF( !pBody, "starmath", "pBody cannot be NULL" );
+
+ SmCaretPosGraphEntry *left,
+ *right,
+ *bodyLeft,
+ *bodyRight;
+
+ //Get left and save it
+ SAL_WARN_IF( !pRightMost, "starmath", "There must be a position in front of this" );
+ left = pRightMost;
+
+ //Create body left
+ bodyLeft = pGraph->Add( SmCaretPos( pBody, 0 ), left );
+ left->SetRight( bodyLeft );
+
+ //Create right
+ right = pGraph->Add( SmCaretPos( pNode, 1 ) );
+
+ //Visit body
+ pRightMost = bodyLeft;
+ pBody->Accept( this );
+ bodyRight = pRightMost;
+ bodyRight->SetRight( right );
+ right->SetLeft( bodyRight );
+
+ pRightMost = right;
+}
+
+
/** Build SmCaretPosGraph for SmPlaceNode
* Consider this a single character.
*/
@@ -1772,6 +1849,13 @@ void SmCaretPosGraphBuildingVisitor::Visit( SmRootSymbolNode* )
{
//Do nothing
}
+
+void SmCaretPosGraphBuildingVisitor::Visit( SmDynIntegralSymbolNode* )
+{
+ //Do nothing
+}
+
+
void SmCaretPosGraphBuildingVisitor::Visit( SmRectangleNode* )
{
//Do nothing
@@ -2016,6 +2100,20 @@ void SmCloningVisitor::Visit( SmRootSymbolNode* pNode )
CloneNodeAttr( pNode, pResult );
}
+void SmCloningVisitor::Visit( SmDynIntegralNode* pNode )
+{
+ SmDynIntegralNode* pClone = new SmDynIntegralNode( pNode->GetToken( ) );
+ CloneNodeAttr( pNode, pClone );
+ CloneKids( pNode, pClone );
+ pResult = pClone;
+}
+
+void SmCloningVisitor::Visit( SmDynIntegralSymbolNode* pNode )
+{
+ pResult = new SmDynIntegralSymbolNode( pNode->GetToken( ) );
+ CloneNodeAttr( pNode, pResult );
+}
+
void SmCloningVisitor::Visit( SmRectangleNode* pNode )
{
pResult = new SmRectangleNode( pNode->GetToken( ) );
@@ -2539,6 +2637,17 @@ void SmNodeToTextVisitor::Visit( SmRootSymbolNode* )
{
}
+void SmNodeToTextVisitor::Visit( SmDynIntegralNode* pNode )
+{
+ SmNode *pBody = pNode->Body();
+ Append( "intd" );
+ LineToText( pBody );
+}
+
+void SmNodeToTextVisitor::Visit( SmDynIntegralSymbolNode* )
+{
+}
+
void SmNodeToTextVisitor::Visit( SmRectangleNode* )
{
}
--
1.8.3.2
From 8bfd4be3b12aae73f8d4ed9fc12475f06a196fe7 Mon Sep 17 00:00:00 2001
From: matteocam <matteo.campanelli@gmail.com>
Date: Sat, 1 Mar 2014 06:27:47 -0500
Subject: [PATCH 4/5] Added code for keeping ratio and having right positioning
Change-Id: I1a35c90fd21b0786c7a98e8be3d26240e52fe527
---
starmath/source/node.cxx | 17 ++++++++++++-----
starmath/source/parse.cxx | 4 ++--
2 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/starmath/source/node.cxx b/starmath/source/node.cxx
index 9cceb57..e30ea17 100644
--- a/starmath/source/node.cxx
+++ b/starmath/source/node.cxx
@@ -1135,9 +1135,8 @@ void SmDynIntegralNode::GetHeightVerOffset(const SmRect &rRect,
void SmDynIntegralNode::Arrange(const OutputDevice &rDev, const SmFormat &rFormat)
{
-
- SmNode *pDynIntegralSym = GetSubNode(0),
- *pBody = GetSubNode(1);
+ SmNode *pDynIntegralSym = Symbol(),
+ *pBody = Body();
OSL_ENSURE(pDynIntegralSym, "Sm: NULL pointer");
OSL_ENSURE(pBody, "Sm: NULL pointer");
@@ -1158,9 +1157,10 @@ void SmDynIntegralNode::Arrange(const OutputDevice &rDev, const SmFormat
&rForma
Point aPos = pDynIntegralSym->AlignTo(*pBody, RP_LEFT, RHA_CENTER, RVA_BASELINE);
//! override calculated vertical position
aPos.Y() = pDynIntegralSym->GetTop() + pBody->GetBottom() - pDynIntegralSym->GetBottom();
- aPos.Y() -= nVerOffset;
+ //aPos.Y() -= nVerOffset;
pDynIntegralSym->MoveTo(aPos);
+
// override its own rectangle with pBody's
SmRect::operator = (*pBody);
// extends this rectangle with the symbol's one
@@ -2369,8 +2369,15 @@ void SmRootSymbolNode::AdaptToY(const OutputDevice &rDev, sal_uLong nHeight)
void SmDynIntegralSymbolNode::AdaptToY(const OutputDevice &rDev, sal_uLong nHeight)
{
+ long nFactor = 12L;
+
// XXX: testing with a slightly higher height
- SmMathSymbolNode::AdaptToY(rDev, nHeight + nHeight / 2L);
+ SmMathSymbolNode::AdaptToY(rDev, nHeight + nHeight / nFactor);
+
+ //XXX Assuming we can only increase the size?
+ // keep the ratio
+ long nCurWidth = GetSize().Width();
+ SmMathSymbolNode::AdaptToX(rDev, nCurWidth + nCurWidth / nFactor);
}
diff --git a/starmath/source/parse.cxx b/starmath/source/parse.cxx
index 6c42db6..d46ff63 100644
--- a/starmath/source/parse.cxx
+++ b/starmath/source/parse.cxx
@@ -160,7 +160,7 @@ static const SmTokenTableEntry aTokenTable[] =
{ "infinity" , TINFINITY, MS_INFINITY, TGSTANDALONE, 5},
{ "infty" , TINFINITY, MS_INFINITY, TGSTANDALONE, 5},
{ "int", TINT, MS_INT, TGOPER, 5},
- { "intd", TINTD, MS_INT, TGOPER, 5},
+ { "intd", TINTD, MS_INT, TGUNOPER, 5},
{ "intersection", TINTERSECT, MS_INTERSECT, TGPRODUCT, 0},
{ "ital", TITALIC, '\0', TGFONTATTR, 5},
{ "italic", TITALIC, '\0', TGFONTATTR, 5},
@@ -1634,7 +1634,7 @@ void SmParser::Oper()
case TPROD :
case TCOPROD :
case TINT :
- case TINTD:
+ //case TINTD:
case TIINT :
case TIIINT :
case TLINT :
--
1.8.3.2
From 614380cad5d0958a71e3c2ce369957a9a0fe3120 Mon Sep 17 00:00:00 2001
From: matteocam <matteo.campanelli@gmail.com>
Date: Thu, 13 Mar 2014 03:34:06 -0400
Subject: [PATCH 5/5] Cleaned code and comments
Change-Id: I0348155f2429cf7dd3cbe7d71f333879ec6de980
---
starmath/inc/node.hxx | 10 ++++------
starmath/source/node.cxx | 27 +++------------------------
starmath/source/parse.cxx | 4 +++-
3 files changed, 10 insertions(+), 31 deletions(-)
diff --git a/starmath/inc/node.hxx b/starmath/inc/node.hxx
index b2c4df9..bfb6ae9 100644
--- a/starmath/inc/node.hxx
+++ b/starmath/inc/node.hxx
@@ -624,7 +624,7 @@ public:
*
* Node for drawing dynamicall sized integral symbols.
*
- * XXX: It might be created a parent class SmDynamicSizedNode
+ * TODO: It might be created a parent class SmDynamicSizedNode
(for both dynamic integrals, roots and other dynamic symbols)
*/
@@ -834,13 +834,11 @@ public:
/** Dynamic Integral node
*
- * Used for create Dynamically sized integrals
+ * Used to create Dynamically sized integrals
*
* Children:<BR>
- * 0: Argument (optional)<BR>
- * 1: Symbol (instance of DynIntegralSymbolNode)<BR>
- * 2: Body<BR>
- * Where argument is optional and may be NULL.
+ * 0: Symbol (instance of DynIntegralSymbolNode)<BR>
+ * 1: Body<BR>
*/
class SmDynIntegralNode : public SmStructureNode
{
diff --git a/starmath/source/node.cxx b/starmath/source/node.cxx
index e30ea17..a85e14c 100644
--- a/starmath/source/node.cxx
+++ b/starmath/source/node.cxx
@@ -1120,19 +1120,6 @@ void SmRootNode::CreateTextFromNode(OUString &rText)
/**************************************************************************/
-void SmDynIntegralNode::GetHeightVerOffset(const SmRect &rRect,
- long &rHeight, long &rVerOffset) const
- // calculate height and vertical offset of root sign suitable for 'rRect'
- //! Code copied from SmRootNode
-{
- rVerOffset = (rRect.GetBottom() - rRect.GetAlignB()) / 2;
- rHeight = rRect.GetHeight() - rVerOffset;
-
- OSL_ENSURE(rHeight >= 0, "Sm : Ooops...");
- OSL_ENSURE(rVerOffset >= 0, "Sm : Ooops...");
-}
-
-
void SmDynIntegralNode::Arrange(const OutputDevice &rDev, const SmFormat &rFormat)
{
SmNode *pDynIntegralSym = Symbol(),
@@ -1142,14 +1129,7 @@ void SmDynIntegralNode::Arrange(const OutputDevice &rDev, const SmFormat
&rForma
pBody->Arrange(rDev, rFormat);
- long nHeight,
- nVerOffset;
- // XXX This is root-specific too
- GetHeightVerOffset(*pBody, nHeight, nVerOffset);
- //XXX I suppose I don't need the lines below which seem root-specific
- //nHeight += rFormat.GetDistance(DIS_ROOT) // XXX
- //* GetFont().GetSize().Height() / 100L;
-
+ long nHeight = pBody->GetHeight();
pDynIntegralSym->AdaptToY(rDev, nHeight);
pDynIntegralSym->Arrange(rDev, rFormat);
@@ -1157,7 +1137,6 @@ void SmDynIntegralNode::Arrange(const OutputDevice &rDev, const SmFormat
&rForma
Point aPos = pDynIntegralSym->AlignTo(*pBody, RP_LEFT, RHA_CENTER, RVA_BASELINE);
//! override calculated vertical position
aPos.Y() = pDynIntegralSym->GetTop() + pBody->GetBottom() - pDynIntegralSym->GetBottom();
- //aPos.Y() -= nVerOffset;
pDynIntegralSym->MoveTo(aPos);
@@ -2371,10 +2350,10 @@ void SmDynIntegralSymbolNode::AdaptToY(const OutputDevice &rDev, sal_uLong
nHeig
{
long nFactor = 12L;
- // XXX: testing with a slightly higher height
+ // The new height equals (1 + nFactor) * oldHeight
+ // nFactor was chosen for keeping the integral sign from becoming too "fat".
SmMathSymbolNode::AdaptToY(rDev, nHeight + nHeight / nFactor);
- //XXX Assuming we can only increase the size?
// keep the ratio
long nCurWidth = GetSize().Width();
SmMathSymbolNode::AdaptToX(rDev, nCurWidth + nCurWidth / nFactor);
diff --git a/starmath/source/parse.cxx b/starmath/source/parse.cxx
index d46ff63..db1359a 100644
--- a/starmath/source/parse.cxx
+++ b/starmath/source/parse.cxx
@@ -1634,7 +1634,6 @@ void SmParser::Oper()
case TPROD :
case TCOPROD :
case TINT :
- //case TINTD:
case TIINT :
case TIIINT :
case TLINT :
@@ -1700,6 +1699,9 @@ void SmParser::UnOper()
{
case TABS :
case TSQRT :
+ /* Dynamic integrals are handled as unary operators so we can wrap
+ the symbol together with the body in a upper level node and make
+ proper graphic arrangements */
case TINTD:
NextToken();
break;
--
1.8.3.2
Context
- [PATCH] · Matteo Campanelli
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.