X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxfont.h;h=13a0f703a522721bb534b6393f0ff8b193adaa85;hb=91a2ea274e9c27f571a3cd4798d2e8ecc1b982a7;hp=0c7c26ec43ac03fb1677b5a3d2c1fdc7cea274d3;hpb=5ba861bb096de90bd5c29c75626200958e3a5ca9;p=lyx.git diff --git a/src/lyxfont.h b/src/lyxfont.h index 0c7c26ec43..13a0f703a5 100644 --- a/src/lyxfont.h +++ b/src/lyxfont.h @@ -19,7 +19,7 @@ #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 @@ -35,9 +35,8 @@ #undef OFF #endif -class LyXLex; -#define NEW_BITS 1 +class LyXLex; /// class LyXFont { @@ -123,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 { /// @@ -178,6 +164,12 @@ 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); @@ -216,10 +208,13 @@ public: 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); @@ -240,7 +235,7 @@ public: /// 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 &); @@ -276,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 */ @@ -299,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; @@ -359,20 +356,21 @@ public: /// 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: -#ifdef NEW_BITS /// struct FontBits { bool operator==(FontBits const & fb1) const { @@ -384,8 +382,7 @@ private: fb1.emph == emph && fb1.underbar == underbar && fb1.noun == noun && - fb1.latex == latex && - fb1.direction == direction; + fb1.latex == latex; } bool operator!=(FontBits const & fb1) const { return !(fb1 == *this); @@ -400,91 +397,11 @@ private: FONT_MISC_STATE underbar; FONT_MISC_STATE noun; FONT_MISC_STATE latex; - FONT_DIRECTION direction; }; -#else - /// This have to be at least 32 bits, but 64 or more does not hurt - typedef unsigned int ui32; -#endif - /** 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 - - Bit 76543210 76543210 76543210 76543210 - --- Fam_Pos - -- Ser_Pos - --- Sha_Pos - ---- Siz_Pos - ---- Col_Pos - --- Emp_Pos - --- Und_Pos - - -- Nou_Pos - --- Lat_Pos - ---- Dir_Pos - - Some might think this is a dirty representation, but it gives - us at least 25% speed-up, so why not? (Asger) - - First of all it is a maintence nightmare...and now that we need - to enlarge the Color bits with 2 (from 4 to 6), we have a problem - since a 32 bit entity is not large enough... (Lgb) - */ - -#ifdef NEW_BITS FontBits bits; -#else - ui32 bits; + Language const * lang; - /// - 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 - }; - - /// - enum FONT_MASK { - /// - Fam_Mask = 0x07, - /// - Ser_Mask = 0x03, - /// - Sha_Mask = 0x07, - /// - Siz_Mask = 0x0f, - /// - Col_Mask = 0x0f, - /// - Dir_Mask = 0x07, - /// - Misc_Mask = 0x07 - }; -#endif - - -#ifdef NEW_BITS /// Sane font static FontBits sane; @@ -494,43 +411,6 @@ private: /// All ignore font static FontBits ignore; -#else - /// 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(LColor::none) << Col_Pos - | ui32(OFF) << Emp_Pos - | ui32(OFF) << Und_Pos - | ui32(OFF) << Nou_Pos - | ui32(OFF) << Lat_Pos - | ui32(LTR_DIR) << Dir_Pos}; - - /// 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(LColor::inherit) << Col_Pos - | ui32(INHERIT) << Emp_Pos - | ui32(INHERIT) << Und_Pos - | ui32(INHERIT) << Nou_Pos - | ui32(INHERIT) << Lat_Pos - | ui32(INHERIT_DIR) << Dir_Pos}; - - /// 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(LColor::ignore) << Col_Pos - | ui32(IGNORE) << Emp_Pos - | ui32(IGNORE) << Und_Pos - | ui32(IGNORE) << Nou_Pos - | ui32(IGNORE) << Lat_Pos - | ui32(IGNORE_DIR) << Dir_Pos}; -#endif /// Updates a misc setting according to request LyXFont::FONT_MISC_STATE setMisc(LyXFont::FONT_MISC_STATE newfont, LyXFont::FONT_MISC_STATE org); @@ -544,48 +424,76 @@ private: 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::operator=(LyXFont const & x) +inline +LyXFont::LyXFont(LyXFont::FONT_INIT2, Language const * l) +{ + bits = ignore; + lang = l; +} + + +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; } -#ifdef NEW_BITS -// You don't have to understand the stuff below :-) -// It works, and it's bloody fast. (Asger) -// And impossible to work with. (Lgb) - inline LyXFont::FONT_FAMILY LyXFont::family() const { @@ -650,11 +558,26 @@ LColor::color LyXFont::color() const inline -LyXFont::FONT_DIRECTION LyXFont::direction() const +Language const * LyXFont::language() const { - return bits.direction; + return lang; } + +inline +bool LyXFont::isRightToLeft() const +{ + return lang->RightToLeft; +} + + +inline +bool LyXFont::isVisibleRightToLeft() const +{ + return (lang->RightToLeft && latex() != ON); +} + + inline LyXFont & LyXFont::setFamily(LyXFont::FONT_FAMILY f) { @@ -727,152 +650,10 @@ LyXFont & LyXFont::setColor(LColor::color c) inline -LyXFont & LyXFont::setDirection(LyXFont::FONT_DIRECTION d) +LyXFont & LyXFont::setLanguage(Language const * l) { - bits.direction = d; + lang = l; return *this; } -#else -// You don't have to understand the stuff below :-) -// It works, and it's bloody fast. (Asger) -// And impossible to work with. (Lgb) - -inline LyXFont::FONT_FAMILY LyXFont::family() const -{ - return LyXFont::FONT_FAMILY((bits >> Fam_Pos) & Fam_Mask); -} - - -inline LyXFont::FONT_SERIES LyXFont::series() const -{ - return LyXFont::FONT_SERIES((bits >> Ser_Pos) & Ser_Mask); -} - - -inline LyXFont::FONT_SHAPE LyXFont::shape() const -{ - return LyXFont::FONT_SHAPE((bits >> Sha_Pos) & Sha_Mask); -} - - -inline LyXFont::FONT_SIZE LyXFont::size() const -{ - return LyXFont::FONT_SIZE((bits >> Siz_Pos) & Siz_Mask); -} - - -inline LyXFont::FONT_MISC_STATE LyXFont::emph() 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 LColor::color LyXFont::color() const -{ - return LColor::color((bits >> Col_Pos) & Col_Mask); -} - - -inline LyXFont::FONT_DIRECTION LyXFont::direction() const -{ - return LyXFont::FONT_DIRECTION((bits >> Dir_Pos) & Dir_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; -} - - -inline LyXFont & LyXFont::setEmph(LyXFont::FONT_MISC_STATE e) -{ - bits &= ~(Misc_Mask << Emp_Pos); - bits |= ui32(e) << Emp_Pos; - return *this; -} - - -inline LyXFont & LyXFont::setUnderbar(LyXFont::FONT_MISC_STATE u) -{ - bits &= ~(Misc_Mask << Und_Pos); - bits |= ui32(u) << Und_Pos; - return *this; -} - - -inline LyXFont & LyXFont::setNoun(LyXFont::FONT_MISC_STATE n) -{ - bits &= ~(Misc_Mask << Nou_Pos); - bits |= ui32(n) << Nou_Pos; - return *this; -} - -inline LyXFont & LyXFont::setLatex(LyXFont::FONT_MISC_STATE l) -{ - bits &= ~(Misc_Mask << Lat_Pos); - bits |= ui32(l) << Lat_Pos; - return *this; -} - - -inline LyXFont & LyXFont::setColor(LColor::color c) -{ - bits &= ~(Col_Mask << Col_Pos); - bits |= ui32(c) << Col_Pos; - return *this; -} - - -inline LyXFont & LyXFont::setDirection(LyXFont::FONT_DIRECTION d) -{ - bits &= ~(Dir_Mask << Dir_Pos); - bits |= ui32(d) << Dir_Pos; - return *this; -} -#endif #endif