X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxfont.h;h=0cfaaf24c5d94dbbcd5427f2a5b60f698dce5032;hb=e5a46922e916a06ad1b958d5895cc3cfb4f13d2c;hp=6c0287b5d65ba9d23ddf4be303a43c2477c634c9;hpb=35584afc1162dec2cf9fff79305e95cb3b75aefb;p=lyx.git diff --git a/src/lyxfont.h b/src/lyxfont.h index 6c0287b5d6..0cfaaf24c5 100644 --- a/src/lyxfont.h +++ b/src/lyxfont.h @@ -1,47 +1,41 @@ // -*- 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 "LColor.h" +#include "support/docstream.h" -#include FORMS_H_LOCATION -#include "LString.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 +namespace lyx { -#ifdef OFF -#undef OFF -#endif 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 @@ -52,9 +46,29 @@ public: /// 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 }; /// @@ -116,7 +130,7 @@ public: /// IGNORE_SIZE }; - + /// Used for emph, underbar, noun and latex toggles enum FONT_MISC_STATE { /// @@ -130,36 +144,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 { @@ -177,462 +161,262 @@ public: 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 + 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_FAMILY family() const { return bits.family; } /// - FONT_SIZE size() const; - + FONT_SERIES series() const { return bits.series; } /// - FONT_MISC_STATE emph() const; - - /// - FONT_MISC_STATE underbar() const; - - /// - FONT_MISC_STATE noun() const; - + FONT_SHAPE shape() const { return bits.shape; } /// - FONT_MISC_STATE latex() const; - + FONT_SIZE size() const { return bits.size; } /// - FONT_COLOR color() const; - + FONT_MISC_STATE emph() const { return bits.emph; } /// - LyXFont & setFamily(LyXFont::FONT_FAMILY f); + FONT_MISC_STATE underbar() const { return bits.underbar; } /// - LyXFont & setSeries(LyXFont::FONT_SERIES s); + FONT_MISC_STATE noun() const { return bits.noun; } /// - LyXFont & setShape(LyXFont::FONT_SHAPE s); + FONT_MISC_STATE number() const { return bits.number; } /// - LyXFont & setSize(LyXFont::FONT_SIZE s); + LColor_color color() const; /// - LyXFont & setEmph(LyXFont::FONT_MISC_STATE e); + Language const * language() const { return lang; } /// - 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(odocstream &, LyXFont const & base, + LyXFont const & prev, + BufferParams const &) 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 latexWriteEndChanges(odocstream &, LyXFont const & base, + LyXFont const & next, + BufferParams const &) 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; + /// Build GUI description of font state + docstring const stateText(BufferParams * params) const; /// - int drawString(string const &, Pixmap pm, int baseline, int x) const; + LColor_color realColor() const; /// - GC getGC() const; - + friend + bool operator==(LyXFont const & font1, LyXFont const & font2); /// - friend inline - bool operator==(LyXFont const & font1, LyXFont const & font2) { - return font1.bits == font2.bits; - } + friend + std::ostream & operator<<(std::ostream & os, LyXFont const & font); - /// - friend inline - bool operator!=(LyXFont const & font1, LyXFont const & font2) { - return font1.bits != font2.bits; + /// Converts logical attributes to concrete shape attribute + // 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; } - /// compares two fonts, ignoring the setting of the Latex part. - bool equalExceptLatex(LyXFont const &) const; + /** Compaq cxx 6.5 requires that the definition be public so that + it can compile operator==() + */ 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 - }; - + FontBits bits; /// - enum FONT_MASK { - /// - Fam_Mask = 0x07, - /// - Ser_Mask = 0x03, - /// - Sha_Mask = 0x07, - /// - Siz_Mask = 0x0f, - /// - Col_Mask = 0x0f, - /// - Misc_Mask = 0x07 - }; - + 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) {} + /// + operator LyXFont::FONT_SIZE() const { return val_; } +private: /// - XFontStruct* getXFontstruct() const; + 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) +inline +bool LyXFont::isSymbolFont() const { - bits = inherit; -} - - -inline LyXFont::LyXFont(LyXFont::FONT_INIT2) -{ - bits = ignore; -} - - -inline LyXFont::LyXFont(LyXFont::FONT_INIT3) -{ - bits = sane; -} - - -inline LyXFont & LyXFont::operator=(LyXFont const & x) -{ - bits = x.bits; - 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 -{ - 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 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; + 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::setSize(LyXFont::FONT_SIZE s) -{ - bits &= ~(Siz_Mask << Siz_Pos); - bits |= ui32(s) << Siz_Pos; - return *this; -} - +bool operator==(LyXFont::FontBits const & lhs, LyXFont::FontBits const & rhs); -inline LyXFont & LyXFont::setEmph(LyXFont::FONT_MISC_STATE e) +inline +bool operator!=(LyXFont::FontBits const & lhs, LyXFont::FontBits const & rhs) { - bits &= ~(Misc_Mask << Emp_Pos); - bits |= ui32(e) << Emp_Pos; - return *this; + return !(lhs == rhs); } - -inline LyXFont & LyXFont::setUnderbar(LyXFont::FONT_MISC_STATE u) +/// +inline +bool operator==(LyXFont const & font1, LyXFont const & font2) { - bits &= ~(Misc_Mask << Und_Pos); - bits |= ui32(u) << Und_Pos; - return *this; + return font1.bits == font2.bits && font1.lang == font2.lang; } - -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 == font2); } -inline LyXFont & LyXFont::setLatex(LyXFont::FONT_MISC_STATE l) -{ - bits &= ~(Misc_Mask << Lat_Pos); - bits |= ui32(l) << Lat_Pos; - return *this; -} +} // namespace lyx -inline LyXFont & LyXFont::setColor(LyXFont::FONT_COLOR c) -{ - bits &= ~(Col_Mask << Col_Pos); - bits |= ui32(c) << Col_Pos; - return *this; -} #endif