The Windows Calculator graphing mode is built on a common graphing API defined in the src/GraphingInterfaces directory. This API provides interfaces for graphing functionality, although developer builds use a mock implementation (in src/GraphingImpl/Mocks) since the proprietary Microsoft graphing engine is not included in the open-source repository.
Developer builds use mock implementations of the graphing engine. The real graphing engine powers graphing in Microsoft Mathematics and OneNote but is not part of the open-source repository.
Core Interfaces
IGraphingOptions
The IGraphingOptions interface controls graphing behavior, visualization options, and key graph feature detection.
Location: /src/GraphingInterfaces/IGraphingOptions.h
Key Graph Features
Control which mathematical features are automatically detected and marked on graphs:
virtual bool GetMarkZeros() const = 0;
virtual void SetMarkZeros(bool value) = 0;
virtual bool GetMarkYIntercept() const = 0;
virtual void SetMarkYIntercept(bool value) = 0;
virtual bool GetMarkMinima() const = 0;
virtual void SetMarkMinima(bool value) = 0;
virtual bool GetMarkMaxima() const = 0;
virtual void SetMarkMaxima(bool value) = 0;
virtual bool GetMarkInflectionPoints() const = 0;
virtual void SetMarkInflectionPoints(bool value) = 0;
virtual bool GetMarkVerticalAsymptotes() const = 0;
virtual void SetMarkVerticalAsymptotes(bool value) = 0;
virtual bool GetMarkHorizontalAsymptotes() const = 0;
virtual void SetMarkHorizontalAsymptotes(bool value) = 0;
virtual bool GetMarkObliqueAsymptotes() const = 0;
virtual void SetMarkObliqueAsymptotes(bool value) = 0;
Color Configuration
Customize colors for graph elements and features:
// Graph line colors
virtual std::vector<Graphing::Color> GetGraphColors() const = 0;
virtual bool SetGraphColors(const std::vector<Graphing::Color>& colors) = 0;
virtual void ResetGraphColors() = 0;
// Background color
virtual Graphing::Color GetBackColor() const = 0;
virtual void SetBackColor(const Graphing::Color& value) = 0;
virtual void ResetBackColor() = 0;
// Feature colors
virtual Graphing::Color GetZerosColor() const = 0;
virtual void SetZerosColor(const Graphing::Color& value) = 0;
virtual Graphing::Color GetExtremaColor() const = 0;
virtual void SetExtremaColor(const Graphing::Color& value) = 0;
virtual Graphing::Color GetInflectionPointsColor() const = 0;
virtual void SetInflectionPointsColor(const Graphing::Color& value) = 0;
virtual Graphing::Color GetAsymptotesColor() const = 0;
virtual void SetAsymptotesColor(const Graphing::Color& value) = 0;
// UI element colors
virtual Graphing::Color GetAxisColor() const = 0;
virtual void SetAxisColor(const Graphing::Color& value) = 0;
virtual Graphing::Color GetBoxColor() const = 0;
virtual void SetBoxColor(const Graphing::Color& value) = 0;
virtual Graphing::Color GetGridColor() const = 0;
virtual void SetGridColor(const Graphing::Color& value) = 0;
virtual Graphing::Color GetFontColor() const = 0;
virtual void SetFontColor(const Graphing::Color& value) = 0;
Display Options
Control visual elements of the graph:
virtual bool GetShowAxis() const = 0;
virtual void SetShowAxis(bool value) = 0;
virtual void ResetShowAxis() = 0;
virtual bool GetShowGrid() const = 0;
virtual void SetShowGrid(bool value) = 0;
virtual void ResetShowGrid() = 0;
virtual bool GetShowBox() const = 0;
virtual void SetShowBox(bool value) = 0;
virtual void ResetShowBox() = 0;
virtual bool GetForceProportional() const = 0;
virtual void SetForceProportional(bool value) = 0;
virtual void ResetForceProportional() = 0;
Axis Configuration
Customize axis labels and default ranges:
// Axis aliases (custom variable names)
virtual std::wstring GetAliasX() const = 0;
virtual void SetAliasX(const std::wstring& value) = 0;
virtual void ResetAliasX() = 0;
virtual std::wstring GetAliasY() const = 0;
virtual void SetAliasY(const std::wstring& value) = 0;
virtual void ResetAliasY() = 0;
// Default ranges
virtual std::pair<double, double> GetDefaultXRange() const = 0;
virtual bool SetDefaultXRange(const std::pair<double, double>& minmax) = 0;
virtual void ResetDefaultXRange() = 0;
virtual std::pair<double, double> GetDefaultYRange() const = 0;
virtual bool SetDefaultYRange(const std::pair<double, double>& minmax) = 0;
virtual void ResetDefaultYRange() = 0;
Line Style
virtual Graphing::Renderer::LineStyle GetLineStyle() const = 0;
virtual void SetLineStyle(Graphing::Renderer::LineStyle value) = 0;
virtual void ResetLineStyle() = 0;
See LineStyle enum for available values.
virtual unsigned long long GetMaxExecutionTime() const = 0;
virtual void SetMaxExecutionTime(unsigned long long value) = 0;
virtual void ResetMaxExecutionTime() = 0;
virtual void SetAllowKeyGraphFeaturesForFunctionsWithParameters(bool kgf) = 0;
virtual bool GetAllowKeyGraphFeaturesForFunctionsWithParameters() const = 0;
virtual void ResetAllowKeyGraphFeaturesForFunctionsWithParameters() = 0;
IMathSolver
The IMathSolver interface provides the core mathematical engine for parsing, evaluating, and analyzing expressions.
Location: /src/GraphingInterfaces/IMathSolver.h
Factory Method
static GRAPHINGAPI std::unique_ptr<IMathSolver> CreateMathSolver();
Options Access
virtual IParsingOptions& ParsingOptions() = 0;
virtual IEvalOptions& EvalOptions() = 0;
virtual IFormatOptions& FormatOptions() = 0;
Expression Parsing
virtual std::unique_ptr<IExpression> ParseInput(
const std::wstring& input,
int& errorCodeOut,
int& errorTypeOut
) = 0;
virtual void HRErrorToErrorInfo(
HRESULT hr,
int& errorCodeOut,
int& errorTypeOut
) = 0;
Graph Creation
virtual std::shared_ptr<IGraph> CreateGrapher(const IExpression* expression) = 0;
virtual std::shared_ptr<Graphing::IGraph> CreateGrapher() = 0;
Serialization and Analysis
virtual std::wstring Serialize(const IExpression* expression) = 0;
virtual Graphing::IGraphFunctionAnalysisData Analyze(
const Graphing::Analyzer::IGraphAnalyzer* analyzer
) = 0;
IGraphFunctionAnalysisData
Structure containing comprehensive analysis results for a graphed function:
struct IGraphFunctionAnalysisData
{
std::wstring Domain;
std::wstring Range;
int Parity;
int PeriodicityDirection;
std::wstring PeriodicityExpression;
std::wstring Zeros;
std::wstring YIntercept;
std::vector<std::wstring> Minima;
std::vector<std::wstring> Maxima;
std::vector<std::wstring> InflectionPoints;
std::vector<std::wstring> VerticalAsymptotes;
std::vector<std::wstring> HorizontalAsymptotes;
std::vector<std::wstring> ObliqueAsymptotes;
std::map<std::wstring, int> MonotoneIntervals;
int TooComplexFeatures; // bitwise flag
};
Option Interfaces
IParsingOptions
Controls how mathematical expressions are parsed:
virtual void SetFormatType(FormatType type) = 0;
virtual void SetLocalizationType(LocalizationType value) = 0;
IEvalOptions
Controls expression evaluation behavior:
virtual EvalTrigUnitMode GetTrigUnitMode() const = 0;
virtual void SetTrigUnitMode(EvalTrigUnitMode value) = 0;
Controls output formatting:
virtual void SetFormatType(FormatType type) = 0;
virtual void SetMathMLPrefix(const std::wstring& value) = 0;
virtual void SetLocalizationType(LocalizationType value) = 0;
Enumerations
LineStyle
Defines the visual style of graph lines:
enum class LineStyle
{
Solid,
Dot,
Dash,
DashDot,
DashDotDot
};
LocalizationType
Defines number formatting based on locale:
enum class LocalizationType
{
Unknown,
DecimalPointAndListComma, // e.g., 3.14, list: 1,2,3
DecimalPointAndListSemicolon, // e.g., 3.14, list: 1;2;3
DecimalCommaAndListSemicolon // e.g., 3,14, list: 1;2;3
};
EvalTrigUnitMode
Defines the unit mode for trigonometric functions:
enum class EvalTrigUnitMode
{
Invalid,
Radians, // Period of sin is 2π
Degrees, // Period of sin is 360°
Grads // Period of sin is 400 grads
};
This only affects standard trigonometric functions (Sin, Cos, Tan, Cot, Sec, Csc, ASin, ACos, ATan, ACot, ASec, ACsc). Hyperbolic trig operators and other functions are not affected.
Defines various format types for expression representation:
enum class FormatType
{
Formula, // Machine-readable: Sum[1,Divide[2,x]]
InvariantFormula, // Variables as Var(0), Var(1)
FormulaWithoutAggregate, // Formula without grouping parentheses
Linear, // Human-readable: 1+2/x
LinearInput, // ASCII-only linear format
MathML, // Standard MathML with root element
MathMLNoWrapper, // MathML without root element
MathRichEdit, // RichEdit format: 1 + \frac{2,x}
InlineMathRichEdit, // Horizontal fractions: 1 + x/(2 a)
Binary, // Compact binary format
InvariantBinary, // Binary with variable IDs
Base64, // Base-64 encoded binary
InvariantBase64, // Base-64 encoded invariant binary
Latex // LaTeX format: \frac{1}{2}
};
Source Files
/src/GraphingInterfaces/IGraphingOptions.h - Main graphing options interface
/src/GraphingInterfaces/IMathSolver.h - Math solver and expression interfaces
/src/GraphingInterfaces/GraphingEnums.h - Enumeration definitions
/src/GraphingImpl/Mocks - Mock implementation for developer builds