Version 5.4.3.2, tag libreoffice-5.4.3.2
[LibreOffice.git] / include / svx / EnhancedCustomShapeFunctionParser.hxx
blob828a4ef4251bf586de25718357cf912824840bf7
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #ifndef INCLUDED_SVX_ENHANCEDCUSTOMSHAPEFUNCTIONPARSER_HXX
21 #define INCLUDED_SVX_ENHANCEDCUSTOMSHAPEFUNCTIONPARSER_HXX
23 #include <sal/config.h>
24 #include <com/sun/star/drawing/EnhancedCustomShapeParameter.hpp>
25 #include <com/sun/star/drawing/EnhancedCustomShapeParameterType.hpp>
26 #include <memory>
27 #include <ostream>
28 #include <vector>
30 #include <svx/svxdllapi.h>
32 struct EnhancedCustomShapeEquation
34 sal_Int32 nOperation;
35 sal_Int32 nPara[ 3 ];
37 EnhancedCustomShapeEquation() :
38 nOperation ( 0 )
40 nPara[ 0 ] = nPara[ 1 ] = nPara[ 2 ] = 0;
44 class EnhancedCustomShape2d;
46 namespace EnhancedCustomShape {
48 enum class ExpressionFunct
50 Const,
52 EnumPi,
53 EnumLeft,
54 EnumTop,
55 EnumRight,
56 EnumBottom,
57 EnumXStretch,
58 EnumYStretch,
59 EnumHasStroke,
60 EnumHasFill,
61 EnumWidth,
62 EnumHeight,
63 EnumLogWidth,
64 EnumLogHeight,
65 EnumAdjustment,
66 EnumEquation,
68 UnaryAbs,
69 UnarySqrt,
70 UnarySin,
71 UnaryCos,
72 UnaryTan,
73 UnaryAtan,
74 UnaryNeg,
76 BinaryPlus,
77 BinaryMinus,
78 BinaryMul,
79 BinaryDiv,
80 BinaryMin,
81 BinaryMax,
82 BinaryAtan2,
84 TernaryIf
87 template< typename charT, typename traits >
88 inline std::basic_ostream<charT, traits> & operator <<(
89 std::basic_ostream<charT, traits> & stream, const ExpressionFunct& eFunc )
91 switch (eFunc)
93 case ExpressionFunct::Const : return stream << "const";
95 case ExpressionFunct::EnumPi : return stream << "pi";
96 case ExpressionFunct::EnumLeft : return stream << "left";
97 case ExpressionFunct::EnumTop : return stream << "top";
98 case ExpressionFunct::EnumRight : return stream << "right";
99 case ExpressionFunct::EnumBottom : return stream << "bottom";
100 case ExpressionFunct::EnumXStretch : return stream << "xstretch";
101 case ExpressionFunct::EnumYStretch : return stream << "ystretch";
102 case ExpressionFunct::EnumHasStroke : return stream << "hasstroke";
103 case ExpressionFunct::EnumHasFill : return stream << "hasfill";
104 case ExpressionFunct::EnumWidth : return stream << "width";
105 case ExpressionFunct::EnumHeight : return stream << "height";
106 case ExpressionFunct::EnumLogWidth : return stream << "logwidth";
107 case ExpressionFunct::EnumLogHeight : return stream << "logheight";
108 case ExpressionFunct::EnumAdjustment : return stream << "adjustment";
109 case ExpressionFunct::EnumEquation : return stream << "equation";
111 case ExpressionFunct::UnaryAbs : return stream << "abs";
112 case ExpressionFunct::UnarySqrt : return stream << "sqrt";
113 case ExpressionFunct::UnarySin : return stream << "sin";
114 case ExpressionFunct::UnaryCos : return stream << "cos";
115 case ExpressionFunct::UnaryTan : return stream << "tan";
116 case ExpressionFunct::UnaryAtan : return stream << "atan";
117 case ExpressionFunct::UnaryNeg : return stream << "neg";
119 case ExpressionFunct::BinaryPlus : return stream << "plus";
120 case ExpressionFunct::BinaryMinus : return stream << "minus";
121 case ExpressionFunct::BinaryMul : return stream << "mul";
122 case ExpressionFunct::BinaryDiv : return stream << "div";
123 case ExpressionFunct::BinaryMin : return stream << "min";
124 case ExpressionFunct::BinaryMax : return stream << "max";
125 case ExpressionFunct::BinaryAtan2 : return stream << "atan2";
127 case ExpressionFunct::TernaryIf : return stream << "if";
129 default: return stream << "?(" << (int)eFunc << ")";
133 #define EXPRESSION_FLAG_SUMANGLE_MODE 1
135 SVX_DLLPUBLIC void FillEquationParameter( const css::drawing::EnhancedCustomShapeParameter&, const sal_Int32, EnhancedCustomShapeEquation& );
137 class ExpressionNode
139 public:
140 virtual ~ExpressionNode();
142 /** Predicate whether this node is constant.
144 This predicate returns true, if this node is
145 neither time- nor ViewInfo dependent. This allows
146 for certain obtimizations, i.e. not the full
147 expression tree needs be represented by
148 ExpressionNodes.
150 @returns true, if the note is constant
152 virtual bool isConstant() const = 0;
154 /** Operator to calculate function value.
156 This method calculates the function value.
158 virtual double operator()() const = 0;
160 /** Operator to retrieve the type of expression node
162 virtual ExpressionFunct getType() const = 0;
164 /** Operator to retrieve the ms version of expression
166 virtual css::drawing::EnhancedCustomShapeParameter fillNode(
167 std::vector< EnhancedCustomShapeEquation >& rEquations, ExpressionNode* pOptionalArg, sal_uInt32 nFlags ) = 0;
170 /** This exception is thrown, when the arithmetic expression
171 parser failed to parse a string.
173 struct ParseError
175 ParseError( const char* ) {}
178 class FunctionParser
180 public:
182 /** Parse a string
184 The following grammar is accepted by this method:
185 <code>
187 number_digit = '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'
189 number = number number_digit | number_digit
191 identifier = 'pi'|'left'|'top'|'right'|'bottom'|'xstretch'|'ystretch'|
192 'hasstroke'|'hasfill'|'width'|'height'|'logwidth'|'logheight'
194 unary_function = 'abs'|'sqrt'|'sin'|'cos'|'tan'|'atan'
195 binary_function = 'min'|'max'|'atan2'
196 ternary_function = 'if'
198 function_reference = '?' 'a-z,A-Z,0-9' ' '
199 modifier_reference = '$' '0-9' ' '
201 basic_expression =
202 number |
203 identifier |
204 function_reference |
205 unary_function '(' additive_expression ')' |
206 binary_function '(' additive_expression ',' additive_expression ')' |
207 ternary_function '(' additive_expression ',' additive_expression ',
208 ' additive_expression ')' | '(' additive_expression ')'
210 unary_expression = '-' basic_expression
212 multiplicative_expression =
213 basic_expression |
214 multiplicative_expression '*' basic_expression |
215 multiplicative_expression '/' basic_expression
217 additive_expression =
218 multiplicative_expression |
219 additive_expression '+' multiplicative_expression |
220 additive_expression '-' multiplicative_expression
222 </code>
224 @param rFunction
225 The string to parse
227 @param rCustoShape
228 The CustomShape is required for calculation of dynamic values such
229 "hasstroke", function references and or modifier references ...
231 @throws ParseError if an invalid expression is given.
233 @return the generated function object.
236 SVX_DLLPUBLIC static std::shared_ptr<ExpressionNode> parseFunction( const OUString& rFunction, const EnhancedCustomShape2d& rCustoShape );
238 // this is a singleton
239 FunctionParser() = delete;
240 FunctionParser(const FunctionParser&) = delete;
241 FunctionParser& operator=( const FunctionParser& ) = delete;
246 #endif // INCLUDED_SVX_ENHANCEDCUSTOMSHAPEFUNCTIONPARSER_HXX
248 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */