// -*- C++ -*-
/**
 * \file font_metrics.h
 * This file is part of LyX, the document processor.
 * Licence details can be found in the file COPYING.
 *
 * \author unknown
 * \author John Levon
 *
 * Full author contact details are available in file CREDITS.
 */

#ifndef FONT_METRICS_H
#define FONT_METRICS_H

#include <string>


#ifdef I18N
#include "support/types.h"
#endif

class LyXFont;


/**
 * A namespace holding helper functions for determining
 * the screen dimensions of fonts.
 *
 * The geometry is the standard typographical geometry,
 * as follows :
 *
 * --------------+------------------<maxAscent
 *               |          |
 *               <-------> (right bearing)
 *               <-> (left bearing)
 * char ascent>___          |
 *               ^   oooo   |  oooo
 *   origin>____ |  oo  oo  | oo  oo
 *              \|  oo  oo  | oo  oo
 * --------------+---ooooo--|--oooo-<baseline
 *               |      oo  |
 * char          |  oo  oo  |
 * descent>______|   oooo   |
 *               <-  width ->
 * --------------+----------+-------<maxDescent
 *
 */
namespace font_metrics {
	/// return the maximum ascent of the font
	int maxAscent(LyXFont const & f);
	/// return the maximum descent of the font
	int maxDescent(LyXFont const & f);
	/// return the maximum descent of the font
	inline int maxHeight(LyXFont const & f) {
		return maxAscent(f) + maxDescent(f);
	}
	/// return the ascent of the char in the font
	int ascent(lyx::char_type c, LyXFont const & f);
	/// return the descent of the char in the font
	int descent(lyx::char_type c, LyXFont const & f);
	/// return the descent of the char in the font
	inline int height(lyx::char_type c, LyXFont const & f) {
		return ascent(c, f) + descent(c, f);
	}
	/// return the left bearing of the char in the font
	int lbearing(lyx::char_type c, LyXFont const & f);
	/// return the right bearing of the char in the font
	int rbearing(lyx::char_type c, LyXFont const & f);
	/// return the inner width of the char in the font
	inline int center(lyx::char_type c, LyXFont const & f) {
		return (rbearing(c, f) - lbearing(c, f)) / 2;
	}
	/// return the width of the string in the font
#ifdef I18N
        int width(wchar_t const *s, size_t n,LyXFont const & f) ;

#endif

	int width(char const * s, size_t n, LyXFont const & f);
	/// return the width of the char in the font
#ifdef I18N
          int width(wchar_t c,LyXFont const & f);
          int width(char c, LyXFont const & f);
#else

	inline int width(char c, LyXFont const & f) {
		return width(&c, 1, f);
	}
#endif
	/// return the width of the string in the font
#ifdef I18N
        int width(std::string const & s, LyXFont const & f);
#else

	inline int width(std::string const & s, LyXFont const & f) {
		return s.empty() ? 0 : width(s.data(), s.length(), f);
	}
#endif
	/// FIXME ??
	int signedWidth(std::string const & s, LyXFont const & f);
	/**
	 * fill in width,ascent,descent with the values for the
	 * given string in the font.
	 */
	void rectText(std::string const & str, LyXFont const & font,
		int & width,
		int & ascent,
		int & descent);
	/**
	 * fill in width,ascent,descent with the values for the
	 * given string in the font for a button.
	 */
	void buttonText(std::string const & str, LyXFont const & font,
		int & width,
		int & ascent,
		int & descent);
}

#endif // FONT_METRICS_H
