X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxfont.h;h=13a0f703a522721bb534b6393f0ff8b193adaa85;hb=91a2ea274e9c27f571a3cd4798d2e8ecc1b982a7;hp=a3cbfc4e25524565b803a5fe43c7b387746264f2;hpb=9ce32d63e5ff1dbf4c04e3d8263b2649ef3ac595;p=lyx.git diff --git a/src/lyxfont.h b/src/lyxfont.h index a3cbfc4e25..13a0f703a5 100644 --- a/src/lyxfont.h +++ b/src/lyxfont.h @@ -4,7 +4,8 @@ * * LyX, The Document Processor * - * Copyright 1995 Matthias Ettrich + * Copyright 1995 Matthias Ettrich + * Copyright 1995-2000 The LyX Team. * * ====================================================== */ @@ -18,7 +19,8 @@ #include FORMS_H_LOCATION #include "LString.h" #include "debug.h" -#include "direction.h" +#include "language.h" +#include "LColor.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 @@ -33,6 +35,7 @@ #undef OFF #endif + class LyXLex; /// @@ -119,19 +122,6 @@ public: IGNORE_SIZE }; - enum FONT_DIRECTION { - /// - LTR_DIR, - /// - RTL_DIR, - /// - TOGGLE_DIR, - /// - INHERIT_DIR, - /// - IGNORE_DIR - }; - /// Used for emph, underbar, noun and latex toggles enum FONT_MISC_STATE { /// @@ -145,36 +135,6 @@ public: /// 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 { @@ -204,9 +164,15 @@ public: LyXFont(LyXFont::FONT_INIT2); /// Shortcut initialization 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); + LyXFont & operator=(LyXFont const & x); /// Decreases font size by one LyXFont & decSize(); @@ -237,15 +203,18 @@ public: /// FONT_MISC_STATE latex() const; - + /// - FONT_COLOR color() const; + LColor::color color() const; /// - FONT_DIRECTION direction() const; + Language const * language() const; + + /// + bool isRightToLeft() const; /// - LyXDirection getFontDirection() const; + bool isVisibleRightToLeft() const; /// LyXFont & setFamily(LyXFont::FONT_FAMILY f); @@ -264,9 +233,9 @@ public: /// LyXFont & setLatex(LyXFont::FONT_MISC_STATE l); /// - LyXFont & setColor(LyXFont::FONT_COLOR c); + LyXFont & setColor(LColor::color c); /// - LyXFont & setDirection(LyXFont::FONT_DIRECTION d); + LyXFont & setLanguage(Language const * l); /// Set family after LyX text format LyXFont & setLyXFamily(string const &); @@ -302,7 +271,9 @@ public: * 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); + 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 */ @@ -315,7 +286,7 @@ public: bool resolved() const; /// Read a font specification from LyXLex. Used for layout files. - LyXFont & lyxRead(LyXLex&); + LyXFont & lyxRead(LyXLex &); /// Writes the changes from this font to orgfont in .lyx format in file void lyxWriteChanges(LyXFont const & orgfont, ostream &) const; @@ -325,16 +296,16 @@ public: to this font. Returns number of chars written. Base is the font state active now. */ - int latexWriteStartChanges(string &, LyXFont const & base, + int latexWriteStartChanges(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 to achieve. */ - int latexWriteEndChanges(string &, LyXFont const & base, + int latexWriteEndChanges(ostream &, LyXFont const & base, LyXFont const & next) const; - + /// Build GUI description of font state string stateText() const; @@ -369,124 +340,77 @@ public: 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 drawText(char const *, int n, Pixmap, int baseline, int x) const; /// int drawString(string const &, Pixmap pm, int baseline, int x) const; /// - GC getGC() const; + LColor::color realColor() const; + /// + XID getFontID() const { + return getXFontstruct()->fid; + } + /// friend inline bool operator==(LyXFont const & font1, LyXFont const & font2) { - return font1.bits == font2.bits; + return font1.bits == font2.bits && + font1.lang == font2.lang; } /// friend inline bool operator!=(LyXFont const & font1, LyXFont const & font2) { - return font1.bits != font2.bits; + return font1.bits != font2.bits || + font1.lang != font2.lang; } /// compares two fonts, ignoring the setting of the Latex part. bool equalExceptLatex(LyXFont const &) const; 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; - /// - enum FONT_POSITION { - /// - Fam_Pos = 0, - /// - Ser_Pos = 3, - /// - Sha_Pos = 5, - /// - Siz_Pos = 8, - /// - Col_Pos = 12, - /// - Emp_Pos = 16, - /// - Und_Pos = 19, - /// - Nou_Pos = 22, - /// - Lat_Pos = 25, - /// - Dir_Pos = 28 + struct FontBits { + bool operator==(FontBits const & fb1) const { + return fb1.family == family && + fb1.series == series && + fb1.shape == shape && + fb1.size == size && + fb1.color == color && + fb1.emph == emph && + fb1.underbar == underbar && + fb1.noun == noun && + fb1.latex == latex; + } + bool operator!=(FontBits const & fb1) const { + return !(fb1 == *this); + } + + 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; }; - /// - enum FONT_MASK { - /// - Fam_Mask = 0x07, - /// - Ser_Mask = 0x03, - /// - Sha_Mask = 0x07, - /// - Siz_Mask = 0x0f, - /// - Col_Mask = 0x0f, - /// - Dir_Mask = 0x07, - /// - 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 - | ui32(LTR_DIR) << Dir_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 - | ui32(INHERIT_DIR) << Dir_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 - | ui32(IGNORE_DIR) << Dir_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); @@ -495,182 +419,240 @@ private: LyXFont::FONT_SHAPE realShape() const; /// - XFontStruct* getXFontstruct() const; + XFontStruct * getXFontstruct() const; }; ostream & operator<<(ostream &, LyXFont::FONT_MISC_STATE); -inline LyXFont::LyXFont() +inline +LyXFont::LyXFont() { bits = sane; + lang = default_language; } -inline LyXFont::LyXFont(LyXFont const & x) +inline +LyXFont::LyXFont(LyXFont const & x) { bits = x.bits; + lang = x.lang; } -inline LyXFont::LyXFont(LyXFont::FONT_INIT1) +inline +LyXFont::LyXFont(LyXFont::FONT_INIT1) { bits = inherit; + lang = default_language; } -inline LyXFont::LyXFont(LyXFont::FONT_INIT2) +inline +LyXFont::LyXFont(LyXFont::FONT_INIT2) { bits = ignore; + lang = ignore_language; } -inline LyXFont::LyXFont(LyXFont::FONT_INIT3) +inline +LyXFont::LyXFont(LyXFont::FONT_INIT3) { bits = sane; + lang = default_language; +} +inline +LyXFont::LyXFont(LyXFont::FONT_INIT1, Language const * l) +{ + bits = inherit; + lang = l; +} + + +inline +LyXFont::LyXFont(LyXFont::FONT_INIT2, Language const * l) +{ + bits = ignore; + lang = l; } -inline LyXFont & LyXFont::operator=(LyXFont const & x) +inline +LyXFont::LyXFont(LyXFont::FONT_INIT3, Language const * l) +{ + bits = sane; + lang = l; +} + +inline +LyXFont & LyXFont::operator=(LyXFont const & x) { bits = x.bits; + lang = x.lang; return *this; } -// 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_FAMILY LyXFont::family() const { - return LyXFont::FONT_FAMILY((bits >> Fam_Pos) & Fam_Mask); + return bits.family; } -inline LyXFont::FONT_SERIES LyXFont::series() const +inline +LyXFont::FONT_SERIES LyXFont::series() const { - return LyXFont::FONT_SERIES((bits >> Ser_Pos) & Ser_Mask); + return bits.series; } -inline LyXFont::FONT_SHAPE LyXFont::shape() const +inline +LyXFont::FONT_SHAPE LyXFont::shape() const { - return LyXFont::FONT_SHAPE((bits >> Sha_Pos) & Sha_Mask); + return bits.shape; } -inline LyXFont::FONT_SIZE LyXFont::size() const +inline +LyXFont::FONT_SIZE LyXFont::size() const { - return LyXFont::FONT_SIZE((bits >> Siz_Pos) & Siz_Mask); + return bits.size; } -inline LyXFont::FONT_MISC_STATE LyXFont::emph() const +inline +LyXFont::FONT_MISC_STATE LyXFont::emph() const { - return LyXFont::FONT_MISC_STATE((bits >> Emp_Pos) & Misc_Mask); + return bits.emph; } -inline LyXFont::FONT_MISC_STATE LyXFont::underbar() const +inline +LyXFont::FONT_MISC_STATE LyXFont::underbar() const { - return LyXFont::FONT_MISC_STATE((bits >> Und_Pos) & Misc_Mask); + return bits.underbar; } -inline LyXFont::FONT_MISC_STATE LyXFont::noun() const +inline +LyXFont::FONT_MISC_STATE LyXFont::noun() const { - return LyXFont::FONT_MISC_STATE((bits >> Nou_Pos) & Misc_Mask); + return bits.noun; } -inline LyXFont::FONT_MISC_STATE LyXFont::latex() const +inline +LyXFont::FONT_MISC_STATE LyXFont::latex() const { - return LyXFont::FONT_MISC_STATE((bits >> Lat_Pos) & Misc_Mask); + return bits.latex; } -inline LyXFont::FONT_COLOR LyXFont::color() const +inline +LColor::color LyXFont::color() const { - return LyXFont::FONT_COLOR((bits >> Col_Pos) & Col_Mask); + return bits.color; } -inline LyXFont::FONT_DIRECTION LyXFont::direction() const + +inline +Language const * LyXFont::language() const { - return LyXFont::FONT_DIRECTION((bits >> Dir_Pos) & Dir_Mask); + return lang; } -inline LyXFont & LyXFont::setFamily(LyXFont::FONT_FAMILY f) + +inline +bool LyXFont::isRightToLeft() const +{ + return lang->RightToLeft; +} + + +inline +bool LyXFont::isVisibleRightToLeft() const { - bits &= ~(Fam_Mask << Fam_Pos); - bits |= ui32(f) << Fam_Pos; + return (lang->RightToLeft && latex() != ON); +} + + +inline +LyXFont & LyXFont::setFamily(LyXFont::FONT_FAMILY f) +{ + bits.family = f; return *this; } -inline LyXFont & LyXFont::setSeries(LyXFont::FONT_SERIES s) +inline +LyXFont & LyXFont::setSeries(LyXFont::FONT_SERIES s) { - bits &= ~(Ser_Mask << Ser_Pos); - bits |= ui32(s) << Ser_Pos; + bits.series = s; return *this; } -inline LyXFont & LyXFont::setShape(LyXFont::FONT_SHAPE s) +inline +LyXFont & LyXFont::setShape(LyXFont::FONT_SHAPE s) { - bits &= ~(Sha_Mask << Sha_Pos); - bits |= ui32(s) << Sha_Pos; + bits.shape = s; return *this; } -inline LyXFont & LyXFont::setSize(LyXFont::FONT_SIZE s) +inline +LyXFont & LyXFont::setSize(LyXFont::FONT_SIZE s) { - bits &= ~(Siz_Mask << Siz_Pos); - bits |= ui32(s) << Siz_Pos; + bits.size = s; return *this; } -inline LyXFont & LyXFont::setEmph(LyXFont::FONT_MISC_STATE e) +inline +LyXFont & LyXFont::setEmph(LyXFont::FONT_MISC_STATE e) { - bits &= ~(Misc_Mask << Emp_Pos); - bits |= ui32(e) << Emp_Pos; + bits.emph = e; return *this; } -inline LyXFont & LyXFont::setUnderbar(LyXFont::FONT_MISC_STATE u) +inline +LyXFont & LyXFont::setUnderbar(LyXFont::FONT_MISC_STATE u) { - bits &= ~(Misc_Mask << Und_Pos); - bits |= ui32(u) << Und_Pos; + bits.underbar = u; return *this; } -inline LyXFont & LyXFont::setNoun(LyXFont::FONT_MISC_STATE n) +inline +LyXFont & LyXFont::setNoun(LyXFont::FONT_MISC_STATE n) { - bits &= ~(Misc_Mask << Nou_Pos); - bits |= ui32(n) << Nou_Pos; + bits.noun = n; return *this; } -inline LyXFont & LyXFont::setLatex(LyXFont::FONT_MISC_STATE l) +inline +LyXFont & LyXFont::setLatex(LyXFont::FONT_MISC_STATE l) { - bits &= ~(Misc_Mask << Lat_Pos); - bits |= ui32(l) << Lat_Pos; + bits.latex = l; return *this; } -inline LyXFont & LyXFont::setColor(LyXFont::FONT_COLOR c) +inline +LyXFont & LyXFont::setColor(LColor::color c) { - bits &= ~(Col_Mask << Col_Pos); - bits |= ui32(c) << Col_Pos; + bits.color = c; return *this; } -inline LyXFont & LyXFont::setDirection(LyXFont::FONT_DIRECTION d) + +inline +LyXFont & LyXFont::setLanguage(Language const * l) { - bits &= ~(Dir_Mask << Dir_Pos); - bits |= ui32(d) << Dir_Pos; + lang = l; return *this; }