X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxfont.h;h=0cfaaf24c5d94dbbcd5427f2a5b60f698dce5032;hb=e5a46922e916a06ad1b958d5895cc3cfb4f13d2c;hp=62e5da13f22ad8c3c589acdfa23533cc17cd60f0;hpb=2889b5fd3e8987d0c265ff4726a7fb6c6cb6c034;p=lyx.git diff --git a/src/lyxfont.h b/src/lyxfont.h index 62e5da13f2..0cfaaf24c5 100644 --- a/src/lyxfont.h +++ b/src/lyxfont.h @@ -1,42 +1,31 @@ // -*- C++ -*- -/* This file is part of - * ====================================================== - * - * LyX, The Document Processor - * - * Copyright 1995 Matthias Ettrich - * Copyright 1995-2000 The LyX Team. +/** + * \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 - -#include "LString.h" -#include "language.h" #include "LColor.h" +#include "support/docstream.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 -#ifdef OFF -#undef OFF -#endif +namespace lyx { + class LyXLex; class BufferParams; +class Language; + /// class LyXFont { @@ -57,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 }; /// @@ -121,7 +130,7 @@ public: /// IGNORE_SIZE }; - + /// Used for emph, underbar, noun and latex toggles enum FONT_MISC_STATE { /// @@ -152,12 +161,31 @@ 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); @@ -174,123 +202,95 @@ public: /// 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_FAMILY family() const { return bits.family; } /// - FONT_SERIES series() const; - + FONT_SERIES series() const { return bits.series; } /// - FONT_SHAPE shape() const; - + FONT_SHAPE shape() const { return bits.shape; } /// - FONT_SIZE size() const; - + FONT_SIZE size() const { return bits.size; } /// - FONT_MISC_STATE emph() const; - + FONT_MISC_STATE emph() const { return bits.emph; } /// - FONT_MISC_STATE underbar() const; - + FONT_MISC_STATE underbar() const { return bits.underbar; } /// - FONT_MISC_STATE noun() const; - + FONT_MISC_STATE noun() const { return bits.noun; } /// - FONT_MISC_STATE latex() const; - + FONT_MISC_STATE number() const { return bits.number; } /// - LColor::color color() const; - - /// - Language const * language() const; - + LColor_color color() const; + /// + Language const * language() const { return lang; } /// bool isRightToLeft() const; - /// bool isVisibleRightToLeft() const; - - /// - LyXFont & setFamily(LyXFont::FONT_FAMILY f); - /// - LyXFont & setSeries(LyXFont::FONT_SERIES s); /// - LyXFont & setShape(LyXFont::FONT_SHAPE s); - /// - LyXFont & setSize(LyXFont::FONT_SIZE s); - /// - LyXFont & setEmph(LyXFont::FONT_MISC_STATE e); - /// - LyXFont & setUnderbar(LyXFont::FONT_MISC_STATE u); - /// - LyXFont & setNoun(LyXFont::FONT_MISC_STATE n); - /// - LyXFont & setLatex(LyXFont::FONT_MISC_STATE l); + bool isSymbolFont() const; + /// - LyXFont & setColor(LColor::color c); - /// - LyXFont & setLanguage(Language const * l); + 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, + 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 */ 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, std::ostream &) const; @@ -299,320 +299,124 @@ public: to this font. Returns number of chars written. Base is the font state active now. */ - int latexWriteStartChanges(std::ostream &, LyXFont const & base, - LyXFont const & prev) 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. + /** 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(std::ostream &, LyXFont const & base, - LyXFont const & next) const; + int latexWriteEndChanges(odocstream &, LyXFont const & base, + LyXFont const & next, + BufferParams const &) const; + /// Build GUI description of font state - string stateText(BufferParams * params) const; + docstring const stateText(BufferParams * params) const; /// - LColor::color realColor() const; + LColor_color realColor() const; /// friend - bool operator==(LyXFont const & font1, LyXFont const & font2) { - return font1.bits == font2.bits && - font1.lang == font2.lang; - } - + bool operator==(LyXFont const & font1, LyXFont const & font2); /// - friend - bool operator!=(LyXFont const & font1, LyXFont const & font2) { - return !(font1 == font2); + friend + std::ostream & operator<<(std::ostream & os, LyXFont const & font); + + /// 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; - /// Converts logical attributes to concrete shape attribute - LyXFont::FONT_SHAPE realShape() const; + /** Compaq cxx 6.5 requires that the definition be public so that + it can compile operator==() + */ private: - /// - struct FontBits { - /// - bool operator==(FontBits const & fb1) const; - /// - bool operator!=(FontBits const & fb1) const; - /// - 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; - }; /// FontBits bits; /// Language const * lang; - /// Sane font static FontBits sane; - /// All inherit font static FontBits inherit; - /// All ignore font 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); }; -std::ostream & operator<<(std::ostream &, LyXFont::FONT_MISC_STATE); - - -inline -LyXFont::LyXFont() -{ - bits = sane; - lang = default_language; -} - - -inline -LyXFont::LyXFont(LyXFont const & x) -{ - bits = x.bits; - lang = x.lang; -} - - -inline -LyXFont::LyXFont(LyXFont::FONT_INIT1) -{ - bits = inherit; - lang = default_language; -} - - -inline -LyXFont::LyXFont(LyXFont::FONT_INIT2) -{ - bits = ignore; - lang = ignore_language; -} - - -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(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; -} - - -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 bits.size; -} - - -inline -LyXFont::FONT_MISC_STATE LyXFont::emph() const -{ - return bits.emph; -} - - -inline -LyXFont::FONT_MISC_STATE LyXFont::underbar() const -{ - return bits.underbar; -} - - -inline -LyXFont::FONT_MISC_STATE LyXFont::noun() const -{ - return bits.noun; -} - - -inline -LyXFont::FONT_MISC_STATE LyXFont::latex() const -{ - return bits.latex; -} - - -inline -LColor::color LyXFont::color() const -{ - return bits.color; -} - - -inline -Language const * LyXFont::language() const -{ - 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) -{ - bits.family = f; - return *this; -} - - -inline -LyXFont & LyXFont::setSeries(LyXFont::FONT_SERIES s) -{ - bits.series = s; - return *this; -} - - -inline -LyXFont & LyXFont::setShape(LyXFont::FONT_SHAPE s) -{ - bits.shape = s; - return *this; -} +/** \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: + /// + LyXFont::FONT_SIZE val_; +}; -inline -LyXFont & LyXFont::setSize(LyXFont::FONT_SIZE s) -{ - bits.size = s; - return *this; -} - inline -LyXFont & LyXFont::setEmph(LyXFont::FONT_MISC_STATE e) +bool LyXFont::isSymbolFont() const { - bits.emph = e; - 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::setUnderbar(LyXFont::FONT_MISC_STATE u) -{ - bits.underbar = u; - return *this; -} - +bool operator==(LyXFont::FontBits const & lhs, LyXFont::FontBits const & rhs); inline -LyXFont & LyXFont::setNoun(LyXFont::FONT_MISC_STATE n) +bool operator!=(LyXFont::FontBits const & lhs, LyXFont::FontBits const & rhs) { - bits.noun = n; - return *this; + return !(lhs == rhs); } +/// inline -LyXFont & LyXFont::setLatex(LyXFont::FONT_MISC_STATE l) +bool operator==(LyXFont const & font1, LyXFont const & font2) { - bits.latex = l; - return *this; + return font1.bits == font2.bits && font1.lang == font2.lang; } - +/// inline -LyXFont & LyXFont::setColor(LColor::color c) +bool operator!=(LyXFont const & font1, LyXFont const & font2) { - bits.color = c; - return *this; + return !(font1 == font2); } -inline -LyXFont & LyXFont::setLanguage(Language const * l) -{ - lang = l; - return *this; -} +} // namespace lyx #endif