X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxfont.h;h=13a0f703a522721bb534b6393f0ff8b193adaa85;hb=91a2ea274e9c27f571a3cd4798d2e8ecc1b982a7;hp=8de7868ea4c12f3cd3d6b28a4723d9f7a449ec9f;hpb=2ac6d6da48c8e8ea87529088685337cc4bf7b87c;p=lyx.git diff --git a/src/lyxfont.h b/src/lyxfont.h index 8de7868ea4..13a0f703a5 100644 --- a/src/lyxfont.h +++ b/src/lyxfont.h @@ -4,9 +4,10 @@ * * LyX, The Document Processor * - * Copyright (C) 1995 Matthias Ettrich + * Copyright 1995 Matthias Ettrich + * Copyright 1995-2000 The LyX Team. * - *======================================================*/ + * ====================================================== */ #ifndef LYXFONT_H #define LYXFONT_H @@ -18,12 +19,14 @@ #include FORMS_H_LOCATION #include "LString.h" #include "debug.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 // 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. +// later. #ifdef ON #undef ON #endif @@ -32,17 +35,18 @@ #undef OFF #endif + class LyXLex; /// 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 @@ -131,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 { @@ -190,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 x, y; x = y; + LyXFont & operator=(LyXFont const & x); /// Decreases font size by one LyXFont & decSize(); @@ -223,10 +203,19 @@ public: /// FONT_MISC_STATE latex() const; - + /// - FONT_COLOR color() const; - + LColor::color color() const; + + /// + Language const * language() const; + + /// + bool isRightToLeft() const; + + /// + bool isVisibleRightToLeft() const; + /// LyXFont & setFamily(LyXFont::FONT_FAMILY f); /// @@ -244,8 +233,10 @@ public: /// LyXFont & setLatex(LyXFont::FONT_MISC_STATE l); /// - LyXFont & setColor(LyXFont::FONT_COLOR c); - + LyXFont & setColor(LColor::color c); + /// + LyXFont & setLanguage(Language const * l); + /// Set family after LyX text format LyXFont & setLyXFamily(string const &); @@ -271,19 +262,21 @@ public: string latexSize() const; /** Updates font settings according to request. If an - attribute is IGNORE, the attribute is left as it is. */ + attribute is IGNORE, the attribute is left as it is. */ /* - * When toggleall=true, all properties that matches the font in use + * 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); + 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) @@ -293,35 +286,26 @@ 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, 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; + void lyxWriteChanges(LyXFont const & orgfont, ostream &) const; - /** 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 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(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 + Returns number of chars written. Base is the font state we want to achieve. */ - int latexWriteEndChanges(string &, LyXFont const & base) const; - + int latexWriteEndChanges(ostream &, LyXFont const & base, + LyXFont const & next) const; + /// Build GUI description of font state string stateText() const; @@ -340,6 +324,12 @@ public: /// int width(char c) const; + /// + int lbearing(char c) const; + + /// + int rbearing(char c) const; + /// int textWidth(char const *s, int n) const; @@ -350,117 +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 + 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, - /// - 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); @@ -469,171 +419,241 @@ 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 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 LyXFont::FONT_FAMILY((bits >> Fam_Pos) & Fam_Mask); + return bits.size; } -inline LyXFont::FONT_SERIES LyXFont::series() const +inline +LyXFont::FONT_MISC_STATE LyXFont::emph() const { - return LyXFont::FONT_SERIES((bits >> Ser_Pos) & Ser_Mask); + return bits.emph; } -inline LyXFont::FONT_SHAPE LyXFont::shape() const +inline +LyXFont::FONT_MISC_STATE LyXFont::underbar() const { - return LyXFont::FONT_SHAPE((bits >> Sha_Pos) & Sha_Mask); + return bits.underbar; } -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 +LyXFont::FONT_MISC_STATE LyXFont::latex() const { - return LyXFont::FONT_MISC_STATE((bits >> Emp_Pos) & Misc_Mask); + return bits.latex; } -inline LyXFont::FONT_MISC_STATE LyXFont::underbar() const +inline +LColor::color LyXFont::color() const { - return LyXFont::FONT_MISC_STATE((bits >> Und_Pos) & Misc_Mask); + return bits.color; } -inline LyXFont::FONT_MISC_STATE LyXFont::noun() const +inline +Language const * LyXFont::language() const { - return LyXFont::FONT_MISC_STATE((bits >> Nou_Pos) & Misc_Mask); + return lang; } -inline LyXFont::FONT_MISC_STATE LyXFont::latex() const +inline +bool LyXFont::isRightToLeft() const { - return LyXFont::FONT_MISC_STATE((bits >> Lat_Pos) & Misc_Mask); + return lang->RightToLeft; } -inline LyXFont::FONT_COLOR LyXFont::color() const +inline +bool LyXFont::isVisibleRightToLeft() const { - return LyXFont::FONT_COLOR((bits >> Col_Pos) & Col_Mask); + return (lang->RightToLeft && latex() != ON); } -inline LyXFont & LyXFont::setFamily(LyXFont::FONT_FAMILY f) +inline +LyXFont & LyXFont::setFamily(LyXFont::FONT_FAMILY f) { - bits &= ~(Fam_Mask << Fam_Pos); - bits |= ui32(f) << Fam_Pos; + 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::setLanguage(Language const * l) +{ + lang = l; + return *this; +} + #endif