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

#ifndef FONTINFO_H
#define FONTINFO_H

#include <boost/scoped_array.hpp>

#include <string>

namespace lyx {
namespace frontend {

/** This class manages a font.
    The idea is to create a FontInfo object with a font name pattern with a
    wildcard at the size field. Then this object can host request for font-
    instances of any given size. If no exact match is found, the closest size
    is chosen instead. If the font is scalable, the flag
    lyxrc.use_scalable_fonts determines whether to allow scalable fonts to
    give an exact match.
*/
class FontInfo {
public:
	///
	FontInfo() { init(); }

	///
	explicit FontInfo(std::string const & pat)
		: pattern(pat) { init(); }

	/// Does any font match our pattern?
	bool exist() {
		query();
		return matches != 0;
	}

	/// Is this font scalable?
	bool isScalable() {
		query();
		return scalable;
	}

	/// Get existing pattern
	std::string const & getPattern() const { return pattern; }

	/// Set new pattern
	void setPattern(std::string const & pat);

	/** Return full name of font close to this size.
	  If impossible, result is the empty string */
	std::string const getFontname(int size);
private:
	/// Font pattern (with wildcard for size)
	std::string pattern;

	/// Available size list
	boost::scoped_array<int> sizes;

	/// Corresponding name list
	boost::scoped_array<std::string> strings;

	/// Number of matches
	int matches;

	/// Did we query X about this font?
	bool queried;

	/// Is this font scalable?
	bool scalable;

	/// Which index points to scalable font entry?
	int scaleindex;

	/// Initialize empty record
	void init();

	/// Ask X11 about this font pattern
	void query();

	/// Build newly sized font string
	std::string const resize(std::string const &, int size) const;
};

} // namespace frontend
} // namespace lyx

#endif // FONTINFO_H
