// -*- C++ -*-
-/* This file is part of
- * ======================================================
- *
- * LyX, The Document Processor
- *
- * Copyright (C) 1995 Matthias Ettrich
+/**
+ * \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 FORMS_H_LOCATION
-#include "LString.h"
-#include "debug.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
+#include "LColor.h"
-#ifdef OFF
-#undef OFF
-#endif
+#include <iosfwd>
+#include <string>
class LyXLex;
+class BufferParams;
+class Language;
+
///
class LyXFont {
public:
/** The value INHERIT_* means that the font attribute is
- inherited from the layout. In the case of layout fonts, the
- attribute is inherited from the default font.
- The value IGNORE_* is used with LyXFont::update() when the
- attribute should not be changed.
- */
+ inherited from the layout. In the case of layout fonts, the
+ attribute is inherited from the default font.
+ The value IGNORE_* is used with LyXFont::update() when the
+ attribute should not be changed.
+ */
enum FONT_FAMILY {
///
ROMAN_FAMILY, // fontstruct rely on this to be 0
///
SYMBOL_FAMILY,
///
+ CMR_FAMILY,
+ ///
+ CMSY_FAMILY,
+ ///
+ CMM_FAMILY,
+ ///
+ CMEX_FAMILY,
+ ///
+ MSA_FAMILY,
+ ///
+ MSB_FAMILY,
+ ///
+ EUFRAK_FAMILY,
+ ///
+ WASY_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 {
///
///
IGNORE
};
-
- ///
- enum FONT_COLOR {
- ///
- NONE,
- ///
- BLACK,
- ///
- WHITE,
- ///
- RED,
- ///
- GREEN,
- ///
- BLUE,
- ///
- CYAN,
- ///
- MAGENTA,
- ///
- YELLOW,
- ///
- MATH,
- ///
- INSET,
- ///
- INHERIT_COLOR,
- ///
- IGNORE_COLOR
- };
/// Trick to overload constructor and make it megafast
enum FONT_INIT1 {
///
LyXFont();
- /// LyXFont x(LyXFont ...) and LyXFont x = LyXFont ...
- LyXFont(LyXFont const & x);
-
/// Shortcut initialization
+ explicit
LyXFont(LyXFont::FONT_INIT1);
/// Shortcut initialization
+ explicit
LyXFont(LyXFont::FONT_INIT2);
/// Shortcut initialization
+ explicit
LyXFont(LyXFont::FONT_INIT3);
+ /// Shortcut initialization
+ LyXFont(LyXFont::FONT_INIT1, Language const * l);
+ /// Shortcut initialization
+ LyXFont(LyXFont::FONT_INIT2, Language const * l);
+ /// 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_SERIES series() const;
-
+
///
FONT_SHAPE shape() const;
-
+
///
FONT_SIZE size() const;
-
+
///
FONT_MISC_STATE emph() const;
-
+
///
FONT_MISC_STATE underbar() const;
-
+
///
FONT_MISC_STATE noun() const;
///
- FONT_MISC_STATE latex() const;
-
- ///
- FONT_COLOR color() const;
-
- ///
- LyXFont & setFamily(LyXFont::FONT_FAMILY f);
- ///
- LyXFont & setSeries(LyXFont::FONT_SERIES s);
- ///
- LyXFont & setShape(LyXFont::FONT_SHAPE s);
+ FONT_MISC_STATE number() const;
+
///
- LyXFont & setSize(LyXFont::FONT_SIZE s);
+ LColor_color color() const;
+
///
- LyXFont & setEmph(LyXFont::FONT_MISC_STATE e);
+ Language const * language() const;
+
///
- LyXFont & setUnderbar(LyXFont::FONT_MISC_STATE u);
+ bool isRightToLeft() const;
+
///
- LyXFont & setNoun(LyXFont::FONT_MISC_STATE n);
+ bool isVisibleRightToLeft() const;
+
///
- LyXFont & setLatex(LyXFont::FONT_MISC_STATE l);
+ bool isSymbolFont() const;
+
///
- LyXFont & setColor(LyXFont::FONT_COLOR c);
-
+ 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 &);
-
- /// Sets size after GUI name
- LyXFont & setGUISize(string const &);
-
+ LyXFont & setLyXColor(std::string const &);
+
/// Returns size of font in LaTeX text notation
- string 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
- * will have the effect that the properties is reset to the
- * default. If we have a text that is TYPEWRITER_FAMILY, and is
- * update()'ed with TYPEWRITER_FAMILY, the operation will be as if
- * a INHERIT_FAMILY was asked for. This is necessary for the
- * toggle-user-defined-style button on the toolbar.
- */
- void update(LyXFont const & newfont, bool toggleall=false);
-
+ 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
+ will have the effect that the properties is reset to the
+ default. If we have a text that is TYPEWRITER_FAMILY, and is
+ update()'ed with TYPEWRITER_FAMILY, the operation will be as if
+ a INHERIT_FAMILY was asked for. This is necessary for the
+ toggle-user-defined-style button on the toolbar.
+ */
+ 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 */
+ 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, FILE *) const;
-
- /** Writes the head of the LaTeX needed to change to this font.
- Writes to file, the head of the LaTeX needed to change to this font.
- Returns number of chars written. Base is the font state active now.
- */
- int latexWriteStartChanges(FILE *, LyXFont const & base) const;
+ LyXFont & lyxRead(LyXLex &);
- /** Writes to string, the head of the LaTeX needed to change
- to this font. Returns number of chars written. Base is the
- font state active now.
- */
- int latexWriteStartChanges(string &, LyXFont const & base) const;
+ /// Writes the changes from this font to orgfont in .lyx format in file
+ void lyxWriteChanges(LyXFont const & orgfont, std::ostream &) const;
- /** Writes the tail of the LaTeX needd to change to this font.
- Returns number of chars written. Base is the font state we want
- to achieve.
+ /** Writes the head of the LaTeX needed to change to this font.
+ Writes to string, the head of the LaTeX needed to change
+ to this font. Returns number of chars written. Base is the
+ font state active now.
*/
- int latexWriteEndChanges(FILE *, LyXFont const & base) const;
+ int latexWriteStartChanges(std::ostream &, LyXFont const & base,
+ LyXFont const & prev) const;
- /** Writes tha tail of the LaTeX needed to chagne to this font.
- Returns number of chars written. Base is the font state we want
+ /** 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(string &, LyXFont const & base) const;
-
- /// Build GUI description of font state
- string stateText() const;
-
- ///
- int maxAscent() const;
-
- ///
- int maxDescent() const;
-
- ///
- int ascent(char c) const;
-
- ///
- int descent(char c) const;
-
- ///
- int width(char c) const;
-
- ///
- int textWidth(char const *s, int n) const;
-
- ///
- int stringWidth(string const & s) const;
-
- ///
- int signedStringWidth(string const & s) const;
-
- /// Draws text and returns width of text
- int drawText(char const*, int n, Pixmap, int baseline, int x) const;
+ int latexWriteEndChanges(std::ostream &, LyXFont const & base,
+ LyXFont const & next) const;
- ///
- int drawString(string const &, Pixmap pm, int baseline, int x) const;
+ /// Build GUI description of font state
+ std::string const stateText(BufferParams * params) const;
///
- GC getGC() const;
+ LColor_color realColor() const;
///
- friend inline
- bool operator==(LyXFont const & font1, LyXFont const & font2) {
- return font1.bits == font2.bits;
- }
-
+ friend
+ bool operator==(LyXFont const & font1, LyXFont const & font2);
///
- friend inline
- bool operator!=(LyXFont const & font1, LyXFont const & font2) {
- return font1.bits != font2.bits;
- }
-
- /// 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);
-private:
- /// This have to be at least 32 bits, but 64 or more does not hurt
- typedef unsigned int ui32;
-
- /** Representation: bit table
- Layout of bit table:
- 11 1111 111 122 222 222 2233
- Bit 012 34 567 8901 2345 678 901 234 567 8901
- FFF SS SSS SSSS CCCC EEE UUU NNN LLL
- aaa ee hhh iiii oooo mmm nnn ooo aaa
- mmm rr aaa zzzz llll ppp ddd uuu ttt
-
- Some might think this is a dirty representation, but it gives
- us at least 25% speed-up, so why not?
- */
- ui32 bits;
+ /// Converts logical attributes to concrete shape attribute
+ LyXFont::FONT_SHAPE realShape() const;
- ///
- enum FONT_POSITION {
+ /** Compaq cxx 6.5 requires that the definition be public so that
+ it can compile operator==()
+ */
+ struct FontBits {
///
- Fam_Pos = 0,
+ FONT_FAMILY family;
///
- Ser_Pos = 3,
+ FONT_SERIES series;
///
- Sha_Pos = 5,
+ FONT_SHAPE shape;
///
- Siz_Pos = 8,
+ FONT_SIZE size;
+ /** We store the LColor::color value as an int to get LColor.h out
+ * of the header file.
+ */
+ int color;
///
- Col_Pos = 12,
+ FONT_MISC_STATE emph;
///
- Emp_Pos = 16,
+ FONT_MISC_STATE underbar;
///
- Und_Pos = 19,
+ FONT_MISC_STATE noun;
///
- Nou_Pos = 22,
- ///
- Lat_Pos = 25
+ FONT_MISC_STATE number;
};
-
+private:
///
- enum FONT_MASK {
- ///
- Fam_Mask = 0x07,
- ///
- Ser_Mask = 0x03,
- ///
- Sha_Mask = 0x07,
- ///
- Siz_Mask = 0x0f,
- ///
- Col_Mask = 0x0f,
- ///
- Misc_Mask = 0x07
- };
-
+ FontBits bits;
+ ///
+ Language const * lang;
/// Sane font
- enum { sane = ui32(ROMAN_FAMILY) << Fam_Pos
- | ui32(MEDIUM_SERIES) << Ser_Pos
- | ui32(UP_SHAPE) << Sha_Pos
- | ui32(SIZE_NORMAL) << Siz_Pos
- | ui32(NONE) << Col_Pos
- | ui32(OFF) << Emp_Pos
- | ui32(OFF) << Und_Pos
- | ui32(OFF) << Nou_Pos
- | ui32(OFF) << Lat_Pos};
-
+ static FontBits sane;
/// All inherit font
- enum{ inherit = ui32(INHERIT_FAMILY) << Fam_Pos
- | ui32(INHERIT_SERIES) << Ser_Pos
- | ui32(INHERIT_SHAPE) << Sha_Pos
- | ui32(INHERIT_SIZE) << Siz_Pos
- | ui32(INHERIT_COLOR) << Col_Pos
- | ui32(INHERIT) << Emp_Pos
- | ui32(INHERIT) << Und_Pos
- | ui32(INHERIT) << Nou_Pos
- | ui32(INHERIT) << Lat_Pos};
-
+ static FontBits inherit;
/// All ignore font
- enum{ ignore = ui32(IGNORE_FAMILY) << Fam_Pos
- | ui32(IGNORE_SERIES) << Ser_Pos
- | ui32(IGNORE_SHAPE) << Sha_Pos
- | ui32(IGNORE_SIZE) << Siz_Pos
- | ui32(IGNORE_COLOR) << Col_Pos
- | ui32(IGNORE) << Emp_Pos
- | ui32(IGNORE) << Und_Pos
- | ui32(IGNORE) << Nou_Pos
- | ui32(IGNORE) << Lat_Pos};
-
+ 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);
+};
- /// Converts logical attributes to concrete shape attribute
- LyXFont::FONT_SHAPE realShape() const;
+/** \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) {}
///
- XFontStruct* getXFontstruct() const;
+ operator LyXFont::FONT_SIZE() const { return val_; }
+private:
+ ///
+ LyXFont::FONT_SIZE val_;
};
-ostream & operator<<(ostream &, LyXFont::FONT_MISC_STATE);
-
-inline LyXFont::LyXFont()
-{
- bits = sane;
-}
-
-
-inline LyXFont::LyXFont(LyXFont const & x)
-{
- bits = x.bits;
-}
-
-
-inline LyXFont::LyXFont(LyXFont::FONT_INIT1)
-{
- bits = inherit;
-}
-
-
-inline LyXFont::LyXFont(LyXFont::FONT_INIT2)
-{
- bits = ignore;
-}
-inline LyXFont::LyXFont(LyXFont::FONT_INIT3)
+inline
+LyXFont::FONT_SHAPE LyXFont::shape() const
{
- bits = sane;
+ return bits.shape;
}
-inline LyXFont & LyXFont::operator=(LyXFont const & x)
+inline
+LyXFont::FONT_FAMILY LyXFont::family() const
{
- bits = x.bits;
- return *this;
+ return bits.family;
}
- // You don't have to understand the stuff below :-)
- // It works, and it's bloody fast. (Asger)
-inline LyXFont::FONT_FAMILY LyXFont::family() const
+inline
+LyXFont::FONT_SERIES LyXFont::series() const
{
- return LyXFont::FONT_FAMILY((bits >> Fam_Pos) & Fam_Mask);
+ return bits.series;
}
-inline LyXFont::FONT_SERIES LyXFont::series() const
+inline
+LyXFont::FONT_SIZE LyXFont::size() const
{
- return LyXFont::FONT_SERIES((bits >> Ser_Pos) & Ser_Mask);
+ return bits.size;
}
-inline LyXFont::FONT_SHAPE LyXFont::shape() const
+inline
+LyXFont::FONT_MISC_STATE LyXFont::emph() const
{
- return LyXFont::FONT_SHAPE((bits >> Sha_Pos) & Sha_Mask);
+ return bits.emph;
}
-inline LyXFont::FONT_SIZE LyXFont::size() const
+inline
+LyXFont::FONT_MISC_STATE LyXFont::noun() const
{
- return LyXFont::FONT_SIZE((bits >> Siz_Pos) & Siz_Mask);
+ return bits.noun;
}
-inline LyXFont::FONT_MISC_STATE LyXFont::emph() const
+inline
+bool LyXFont::isSymbolFont() const
{
- return LyXFont::FONT_MISC_STATE((bits >> Emp_Pos) & Misc_Mask);
-}
-
-
-inline LyXFont::FONT_MISC_STATE LyXFont::underbar() const
-{
- return LyXFont::FONT_MISC_STATE((bits >> Und_Pos) & Misc_Mask);
-}
-
-
-inline LyXFont::FONT_MISC_STATE LyXFont::noun() const
-{
- return LyXFont::FONT_MISC_STATE((bits >> Nou_Pos) & Misc_Mask);
-}
-
-
-inline LyXFont::FONT_MISC_STATE LyXFont::latex() const
-{
- return LyXFont::FONT_MISC_STATE((bits >> Lat_Pos) & Misc_Mask);
-}
-
-
-inline LyXFont::FONT_COLOR LyXFont::color() const
-{
- return LyXFont::FONT_COLOR((bits >> Col_Pos) & Col_Mask);
-}
-
-
-inline LyXFont & LyXFont::setFamily(LyXFont::FONT_FAMILY f)
-{
- bits &= ~(Fam_Mask << Fam_Pos);
- bits |= ui32(f) << Fam_Pos;
- return *this;
-}
-
-
-inline LyXFont & LyXFont::setSeries(LyXFont::FONT_SERIES s)
-{
- bits &= ~(Ser_Mask << Ser_Pos);
- bits |= ui32(s) << Ser_Pos;
- return *this;
-}
-
-
-inline LyXFont & LyXFont::setShape(LyXFont::FONT_SHAPE s)
-{
- bits &= ~(Sha_Mask << Sha_Pos);
- bits |= ui32(s) << Sha_Pos;
- return *this;
-}
-
-
-inline LyXFont & LyXFont::setSize(LyXFont::FONT_SIZE s)
-{
- bits &= ~(Siz_Mask << Siz_Pos);
- bits |= ui32(s) << Siz_Pos;
- 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:
+ return true;
+ default:
+ return false;
+ }
}
+///
+std::ostream & operator<<(std::ostream &, LyXFont::FONT_MISC_STATE);
-inline LyXFont & LyXFont::setEmph(LyXFont::FONT_MISC_STATE e)
-{
- bits &= ~(Misc_Mask << Emp_Pos);
- bits |= ui32(e) << Emp_Pos;
- return *this;
-}
-
+bool operator==(LyXFont::FontBits const & lhs, LyXFont::FontBits const & rhs);
-inline LyXFont & LyXFont::setUnderbar(LyXFont::FONT_MISC_STATE u)
+inline
+bool operator!=(LyXFont::FontBits const & lhs, LyXFont::FontBits const & rhs)
{
- bits &= ~(Misc_Mask << Und_Pos);
- bits |= ui32(u) << Und_Pos;
- return *this;
+ return !(lhs == rhs);
}
-
-inline LyXFont & LyXFont::setNoun(LyXFont::FONT_MISC_STATE n)
+///
+inline
+bool operator==(LyXFont const & font1, LyXFont const & font2)
{
- bits &= ~(Misc_Mask << Nou_Pos);
- bits |= ui32(n) << Nou_Pos;
- return *this;
+ return font1.bits == font2.bits && font1.lang == font2.lang;
}
-inline LyXFont & LyXFont::setLatex(LyXFont::FONT_MISC_STATE l)
+///
+inline
+bool operator!=(LyXFont const & font1, LyXFont const & font2)
{
- bits &= ~(Misc_Mask << Lat_Pos);
- bits |= ui32(l) << Lat_Pos;
- return *this;
+ return !(font1 == font2);
}
-
-inline LyXFont & LyXFont::setColor(LyXFont::FONT_COLOR c)
-{
- bits &= ~(Col_Mask << Col_Pos);
- bits |= ui32(c) << Col_Pos;
- return *this;
-}
#endif