// -*- C++ -*-
/**
 * \file MathSupport.h
 * This file is part of LyX, the document processor.
 * Licence details can be found in the file COPYING.
 *
 * \author Alejandro Aguilar Sierra
 * \author André Pönitz
 *
 * Full author contact details are available in file CREDITS.
 */

#ifndef MATH_SUPPORT_H
#define MATH_SUPPORT_H

#include "MathParser_flags.h"
#include "support/strfwd.h"

namespace lyx {

class MetricsBase;
class MetricsInfo;
class PainterInfo;
class FontInfo;
class Dimension;
class MathData;
class MathAtom;
class InsetMath;
class latexkeys;
class LaTeXFeatures;


int mathed_font_em(FontInfo const &);

int mathed_font_x_height(FontInfo const & font);

int mathed_mu(FontInfo const & font, double mu);

int mathed_thinmuskip(FontInfo const & font);

int mathed_medmuskip(FontInfo const & font);

int mathed_thickmuskip(FontInfo const & font);

int mathed_char_width(FontInfo const &, char_type c);

int mathed_char_kerning(FontInfo const &, char_type c);

double mathed_char_slope(MetricsBase const & mb, char_type c);

void mathed_draw_deco(PainterInfo & pi, int x, int y, int w, int h,
	docstring const & name);

void mathed_string_dim(FontInfo const & font,
		       docstring const & s,
		       Dimension & dim);

int mathed_string_width(FontInfo const &, docstring const & s);

docstring const & mathedSymbol(MetricsBase & mb, latexkeys const * sym);

int mathedSymbolDim(MetricsBase & mb, Dimension & dim, latexkeys const * sym);

void mathedSymbolDraw(PainterInfo & pi, int x, int y, latexkeys const * sym);

void metricsStrRedBlack(MetricsInfo & mi, Dimension & dim, docstring const & s);

void drawStrRed(PainterInfo & pi, int x, int y, docstring const & s);
void drawStrBlack(PainterInfo & pi, int x, int y, docstring const & s);

void math_font_max_dim(FontInfo const &, int & asc, int & desc);

void augmentFont(FontInfo & f, std::string const & cmd);

bool isFontName(std::string const & name);

bool isMathFont(std::string const & name);

bool isTextFont(std::string const & name);

bool isAlphaSymbol(MathAtom const & at);

// converts single cell to string
docstring asString(MathData const & ar);
// converts single inset to string
docstring asString(InsetMath const &);
docstring asString(MathAtom const &);
// converts string to single cell
void asArray(docstring const &, MathData &, Parse::flags f = Parse::NORMAL);

// simulate axis height (font dimension sigma 22)
int axis_height(MetricsBase & mb);

void validate_math_word(LaTeXFeatures & features, docstring const & word);

} // namespace lyx

#endif
