// -*- C++ -*-
-/* This file is part of
- * ======================================================
- *
- * LyX, The Document Processor
- *
- * Copyright 1995 Matthias Ettrich
- * Copyright 1995-2000 The LyX Team.
+/**
+ * \file src/lyxfont.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
*
- * ====================================================== */
+ * \author Lars Gullik Bjønnes
+ * \author Jean-Marc Lasgouttes
+ * \author Angus Leeming
+ * \author Dekel Tsur
+ *
+ * Full author contact details are available in file CREDITS.
+ */
#ifndef LYXFONT_H
#define LYXFONT_H
-#ifdef __GNUG__
-#pragma interface
-#endif
-
-#include <iosfwd>
-
-#include "LString.h"
-#include "language.h"
#include "LColor.h"
+#include "support/docstream.h"
-// It might happen that locale.h defines ON and OFF. This is not good
-// for us, since we use these names below. But of course this is due
-// to some old compilers. Than is broken when it comes to C++ scoping.
-#include "gettext.h" // so that we are sure tht it won't be included
-// later.
-#ifdef ON
-#undef ON
-#endif
-#ifdef OFF
-#undef OFF
-#endif
+namespace lyx {
+
class LyXLex;
class BufferParams;
+class Language;
+
///
class LyXFont {
///
SYMBOL_FAMILY,
///
+ CMR_FAMILY,
+ ///
+ CMSY_FAMILY,
+ ///
+ CMM_FAMILY,
+ ///
+ CMEX_FAMILY,
+ ///
+ MSA_FAMILY,
+ ///
+ MSB_FAMILY,
+ ///
+ EUFRAK_FAMILY,
+ ///
+ WASY_FAMILY,
+ ///
+ ESINT_FAMILY,
+ ///
INHERIT_FAMILY,
///
- IGNORE_FAMILY
+ IGNORE_FAMILY,
+ ///
+ NUM_FAMILIES = INHERIT_FAMILY
};
///
///
IGNORE_SIZE
};
-
+
/// Used for emph, underbar, noun and latex toggles
enum FONT_MISC_STATE {
///
ALL_SANE
};
+ struct FontBits {
+ ///
+ FONT_FAMILY family;
+ ///
+ FONT_SERIES series;
+ ///
+ FONT_SHAPE shape;
+ ///
+ FONT_SIZE size;
+ /** We store the LColor::color value as an int to get LColor.h out
+ * of the header file.
+ */
+ int color;
+ ///
+ FONT_MISC_STATE emph;
+ ///
+ FONT_MISC_STATE underbar;
+ ///
+ FONT_MISC_STATE noun;
+ ///
+ FONT_MISC_STATE number;
+ };
///
LyXFont();
- // LyXFont x(LyXFont ...) and LyXFont x = LyXFont ...
- LyXFont(LyXFont const & x);
-
/// Shortcut initialization
explicit
LyXFont(LyXFont::FONT_INIT1);
/// Shortcut initialization
LyXFont(LyXFont::FONT_INIT3, Language const * l);
- /// LyXFont x, y; x = y;
- LyXFont & operator=(LyXFont const & x);
-
/// Decreases font size by one
LyXFont & decSize();
-
/// Increases font size by one
LyXFont & incSize();
-
///
- FONT_FAMILY family() const;
-
+ FONT_FAMILY family() const { return bits.family; }
///
- FONT_SERIES series() const;
-
+ FONT_SERIES series() const { return bits.series; }
///
- FONT_SHAPE shape() const;
-
+ FONT_SHAPE shape() const { return bits.shape; }
///
- FONT_SIZE size() const;
-
+ FONT_SIZE size() const { return bits.size; }
///
- FONT_MISC_STATE emph() const;
-
+ FONT_MISC_STATE emph() const { return bits.emph; }
///
- FONT_MISC_STATE underbar() const;
-
+ FONT_MISC_STATE underbar() const { return bits.underbar; }
///
- FONT_MISC_STATE noun() const;
-
+ FONT_MISC_STATE noun() const { return bits.noun; }
///
- FONT_MISC_STATE latex() const;
-
+ FONT_MISC_STATE number() const { return bits.number; }
///
- FONT_MISC_STATE number() const;
-
+ LColor_color color() const;
///
- LColor::color color() const;
-
- ///
- Language const * language() const;
-
+ Language const * language() const { return lang; }
///
bool isRightToLeft() const;
-
///
bool isVisibleRightToLeft() const;
-
- ///
- LyXFont & setFamily(LyXFont::FONT_FAMILY f);
- ///
- LyXFont & setSeries(LyXFont::FONT_SERIES s);
- ///
- LyXFont & setShape(LyXFont::FONT_SHAPE s);
- ///
- LyXFont & setSize(LyXFont::FONT_SIZE s);
- ///
- LyXFont & setEmph(LyXFont::FONT_MISC_STATE e);
- ///
- LyXFont & setUnderbar(LyXFont::FONT_MISC_STATE u);
///
- LyXFont & setNoun(LyXFont::FONT_MISC_STATE n);
- ///
- LyXFont & setLatex(LyXFont::FONT_MISC_STATE l);
- ///
- LyXFont & setNumber(LyXFont::FONT_MISC_STATE n);
+ bool isSymbolFont() const;
+
///
- LyXFont & setColor(LColor::color c);
- ///
- LyXFont & setLanguage(Language const * l);
+ void setFamily(LyXFont::FONT_FAMILY f);
+ void setSeries(LyXFont::FONT_SERIES s);
+ void setShape(LyXFont::FONT_SHAPE s);
+ void setSize(LyXFont::FONT_SIZE s);
+ void setEmph(LyXFont::FONT_MISC_STATE e);
+ void setUnderbar(LyXFont::FONT_MISC_STATE u);
+ void setNoun(LyXFont::FONT_MISC_STATE n);
+ void setNumber(LyXFont::FONT_MISC_STATE n);
+ void setColor(LColor_color c);
+ void setLanguage(Language const * l);
/// Set family after LyX text format
- LyXFont & setLyXFamily(string const &);
-
+ LyXFont & setLyXFamily(std::string const &);
+
/// Set series after LyX text format
- LyXFont & setLyXSeries(string const &);
-
+ LyXFont & setLyXSeries(std::string const &);
+
/// Set shape after LyX text format
- LyXFont & setLyXShape(string const &);
-
+ LyXFont & setLyXShape(std::string const &);
+
/// Set size after LyX text format
- LyXFont & setLyXSize(string const &);
-
+ LyXFont & setLyXSize(std::string const &);
+
/// Returns misc flag after LyX text format
- LyXFont::FONT_MISC_STATE setLyXMisc(string const &);
+ LyXFont::FONT_MISC_STATE setLyXMisc(std::string const &);
/// Sets color after LyX text format
- LyXFont & setLyXColor(string const &);
+ LyXFont & setLyXColor(std::string const &);
-#if 0
- /// Sets size after GUI name
- LyXFont & setGUISize(string const &);
-#endif
-
/// Returns size of font in LaTeX text notation
- string const latexSize() const;
-
+ std::string const latexSize() const;
+
/** Updates font settings according to request.
If an attribute is IGNORE, the attribute is left as it is.
When toggleall = true, all properties that matches the font in use
a INHERIT_FAMILY was asked for. This is necessary for the
toggle-user-defined-style button on the toolbar.
*/
- void update(LyXFont const & newfont,
+ void update(LyXFont const & newfont,
Language const * default_lang,
bool toggleall = false);
-
+
/** Reduce font to fall back to template where possible.
Equal fields are reduced to INHERIT */
void reduce(LyXFont const & tmplt);
-
+
/// Realize font from a template (INHERIT are realized)
LyXFont & realize(LyXFont const & tmplt);
-
/// Is a given font fully resolved?
bool resolved() const;
-
+
/// Read a font specification from LyXLex. Used for layout files.
LyXFont & lyxRead(LyXLex &);
-
+
/// Writes the changes from this font to orgfont in .lyx format in file
void lyxWriteChanges(LyXFont const & orgfont, std::ostream &) const;
to this font. Returns number of chars written. Base is the
font state active now.
*/
- int latexWriteStartChanges(std::ostream &, LyXFont const & base,
- LyXFont const & prev) const;
+ int latexWriteStartChanges(odocstream &, LyXFont const & base,
+ LyXFont const & prev) const;
- /** Writes tha tail of the LaTeX needed to chagne to this font.
+ /** Writes the tail of the LaTeX needed to change to this font.
Returns number of chars written. Base is the font state we want
to achieve.
*/
- int latexWriteEndChanges(std::ostream &, LyXFont const & base,
- LyXFont const & next) const;
+ int latexWriteEndChanges(odocstream &, LyXFont const & base,
+ LyXFont const & next) const;
+
/// Build GUI description of font state
- string const stateText(BufferParams * params) const;
+ docstring const stateText(BufferParams * params) const;
///
- LColor::color realColor() const;
+ LColor_color realColor() const;
///
friend
bool operator==(LyXFont const & font1, LyXFont const & font2);
-
///
- friend
- bool operator!=(LyXFont const & font1, LyXFont const & font2);
-
- /// compares two fonts, ignoring the setting of the Latex part.
- bool equalExceptLatex(LyXFont const &) const;
+ friend
+ std::ostream & operator<<(std::ostream & os, LyXFont const & font);
/// Converts logical attributes to concrete shape attribute
- LyXFont::FONT_SHAPE realShape() const;
+ // Try hard to inline this as it shows up with 4.6 % in the profiler.
+ LyXFont::FONT_SHAPE realShape() const {
+ if (bits.noun == ON)
+ return SMALLCAPS_SHAPE;
+ if (bits.emph == ON)
+ return (bits.shape == UP_SHAPE) ? ITALIC_SHAPE : UP_SHAPE;
+ return bits.shape;
+ }
+
+
+ /** Compaq cxx 6.5 requires that the definition be public so that
+ it can compile operator==()
+ */
private:
- ///
- struct FontBits {
- ///
- bool operator==(FontBits const & fb1) const;
- ///
- bool operator!=(FontBits const & fb1) const;
- ///
- FONT_FAMILY family;
- ///
- FONT_SERIES series;
- ///
- FONT_SHAPE shape;
- ///
- FONT_SIZE size;
- ///
- LColor::color color;
- ///
- FONT_MISC_STATE emph;
- ///
- FONT_MISC_STATE underbar;
- ///
- FONT_MISC_STATE noun;
- ///
- FONT_MISC_STATE latex;
- };
///
FontBits bits;
///
Language const * lang;
- ///
- FONT_MISC_STATE number_;
-
/// Sane font
static FontBits sane;
-
/// All inherit font
static FontBits inherit;
-
/// All ignore font
static FontBits ignore;
-
/// Updates a misc setting according to request
LyXFont::FONT_MISC_STATE setMisc(LyXFont::FONT_MISC_STATE newfont,
LyXFont::FONT_MISC_STATE org);
};
-///
-std::ostream & operator<<(std::ostream &, LyXFont::FONT_MISC_STATE);
-
-///
-inline
-bool operator==(LyXFont const & font1, LyXFont const & font2) {
- return font1.bits == font2.bits &&
- font1.lang == font2.lang &&
- font1.number_ == font2.number_;
-}
-
-///
-inline
-bool operator!=(LyXFont const & font1, LyXFont const & font2) {
- return !(font1 == font2);
-}
-
-
-inline
-LyXFont::LyXFont()
-{
- bits = sane;
- lang = default_language;
- number_ = OFF;
-}
-
-
-inline
-LyXFont::LyXFont(LyXFont const & x)
-{
- bits = x.bits;
- lang = x.lang;
- number_ = x.number_;
-}
-
-
-inline
-LyXFont::LyXFont(LyXFont::FONT_INIT1)
-{
- bits = inherit;
- lang = default_language;
- number_ = OFF;
-}
-
-
-inline
-LyXFont::LyXFont(LyXFont::FONT_INIT2)
-{
- bits = ignore;
- lang = ignore_language;
- number_ = IGNORE;
-}
-
-
-inline
-LyXFont::LyXFont(LyXFont::FONT_INIT3)
-{
- bits = sane;
- lang = default_language;
- number_ = OFF;
-}
-
-
-inline
-LyXFont::LyXFont(LyXFont::FONT_INIT1, Language const * l)
-{
- bits = inherit;
- lang = l;
- number_ = OFF;
-}
-
-
-inline
-LyXFont::LyXFont(LyXFont::FONT_INIT2, Language const * l)
-{
- bits = ignore;
- lang = l;
- number_ = IGNORE;
-}
-
-
-inline
-LyXFont::LyXFont(LyXFont::FONT_INIT3, Language const * l)
-{
- bits = sane;
- lang = l;
- number_ = OFF;
-}
-
-
-inline
-LyXFont & LyXFont::operator=(LyXFont const & x)
-{
- bits = x.bits;
- lang = x.lang;
- number_ = x.number_;
- return *this;
-}
-
-
-inline
-LyXFont::FONT_FAMILY LyXFont::family() const
-{
- return bits.family;
-}
-
-
-inline
-LyXFont::FONT_SERIES LyXFont::series() const
-{
- return bits.series;
-}
-
-
-inline
-LyXFont::FONT_SHAPE LyXFont::shape() const
-{
- return bits.shape;
-}
-
-
-inline
-LyXFont::FONT_SIZE LyXFont::size() const
-{
- return bits.size;
-}
-
-
-inline
-LyXFont::FONT_MISC_STATE LyXFont::emph() const
-{
- return bits.emph;
-}
-
-
-inline
-LyXFont::FONT_MISC_STATE LyXFont::underbar() const
-{
- return bits.underbar;
-}
-
-
-inline
-LyXFont::FONT_MISC_STATE LyXFont::noun() const
-{
- return bits.noun;
-}
-
-
-inline
-LyXFont::FONT_MISC_STATE LyXFont::latex() const
-{
- return bits.latex;
-}
-
-
-inline
-LColor::color LyXFont::color() const
-{
- return bits.color;
-}
-
-
-inline
-Language const * LyXFont::language() const
-{
- return lang;
-}
-
-
-inline
-LyXFont::FONT_MISC_STATE LyXFont::number() const
-{
- return number_;
-}
-
-
-inline
-bool LyXFont::isRightToLeft() const
-{
- return lang->RightToLeft();
-}
-
-
-inline
-bool LyXFont::isVisibleRightToLeft() const
-{
- return (lang->RightToLeft() && latex() != ON && number() != ON);
-}
-
-
-inline
-LyXFont & LyXFont::setFamily(LyXFont::FONT_FAMILY f)
-{
- bits.family = f;
- return *this;
-}
-
-
-inline
-LyXFont & LyXFont::setSeries(LyXFont::FONT_SERIES s)
-{
- bits.series = s;
- return *this;
-}
-
-
-inline
-LyXFont & LyXFont::setShape(LyXFont::FONT_SHAPE s)
-{
- bits.shape = s;
- return *this;
-}
+/** \c LyXFont_size is a wrapper for LyXFont::FONT_SIZE.
+ * It can be forward-declared and passed as a function argument without
+ * having to expose lyxfont.h.
+ */
+class LyXFont_size {
+public:
+ ///
+ LyXFont_size(LyXFont::FONT_SIZE val) : val_(val) {}
+ ///
+ operator LyXFont::FONT_SIZE() const { return val_; }
+private:
+ ///
+ LyXFont::FONT_SIZE val_;
+};
-inline
-LyXFont & LyXFont::setSize(LyXFont::FONT_SIZE s)
-{
- bits.size = s;
- return *this;
-}
inline
-LyXFont & LyXFont::setEmph(LyXFont::FONT_MISC_STATE e)
+bool LyXFont::isSymbolFont() const
{
- bits.emph = e;
- return *this;
+ switch (family()) {
+ case LyXFont::SYMBOL_FAMILY:
+ case LyXFont::CMSY_FAMILY:
+ case LyXFont::CMM_FAMILY:
+ case LyXFont::CMEX_FAMILY:
+ case LyXFont::MSA_FAMILY:
+ case LyXFont::MSB_FAMILY:
+ case LyXFont::WASY_FAMILY:
+ case LyXFont::ESINT_FAMILY:
+ return true;
+ default:
+ return false;
+ }
}
+///
+std::ostream & operator<<(std::ostream &, LyXFont::FONT_MISC_STATE);
-inline
-LyXFont & LyXFont::setUnderbar(LyXFont::FONT_MISC_STATE u)
-{
- bits.underbar = u;
- return *this;
-}
-
-
-inline
-LyXFont & LyXFont::setNoun(LyXFont::FONT_MISC_STATE n)
-{
- bits.noun = n;
- return *this;
-}
+bool operator==(LyXFont::FontBits const & lhs, LyXFont::FontBits const & rhs);
inline
-LyXFont & LyXFont::setLatex(LyXFont::FONT_MISC_STATE l)
+bool operator!=(LyXFont::FontBits const & lhs, LyXFont::FontBits const & rhs)
{
- bits.latex = l;
- return *this;
+ return !(lhs == rhs);
}
-
+///
inline
-LyXFont & LyXFont::setColor(LColor::color c)
+bool operator==(LyXFont const & font1, LyXFont const & font2)
{
- bits.color = c;
- return *this;
+ return font1.bits == font2.bits && font1.lang == font2.lang;
}
-
+///
inline
-LyXFont & LyXFont::setLanguage(Language const * l)
+bool operator!=(LyXFont const & font1, LyXFont const & font2)
{
- lang = l;
- return *this;
+ return !(font1 == font2);
}
-inline
-LyXFont & LyXFont::setNumber(LyXFont::FONT_MISC_STATE n)
-{
- number_ = n;
- return *this;
-}
+} // namespace lyx
#endif