X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FFontInfo.cpp;h=8d79782b82f00469247748cad0f1b20f54690166;hb=c7d29be153debac82e3d2e8865fcc849f0a5f40d;hp=27b6a51ba37a03c28c3fc375d22125a0fe06acdc;hpb=72292b98a64c152c3b8862456c49067f74449cef;p=lyx.git diff --git a/src/FontInfo.cpp b/src/FontInfo.cpp index 27b6a51ba3..8d79782b82 100644 --- a/src/FontInfo.cpp +++ b/src/FontInfo.cpp @@ -17,10 +17,17 @@ #include "ColorSet.h" #include "FontInfo.h" #include "Lexer.h" +#include "LyXRC.h" +#include "support/convert.h" #include "support/debug.h" #include "support/docstring.h" #include "support/lstrings.h" +#include "support/RefChanger.h" + +#include +#include +#include using namespace std; using namespace lyx::support; @@ -32,16 +39,16 @@ namespace lyx { // char const * LyXFamilyNames[NUM_FAMILIES + 2 /* default & error */] = { "roman", "sans", "typewriter", "symbol", - "cmr", "cmsy", "cmm", "cmex", "msa", "msb", "eufrak", "rsfs", "wasy", - "esint", "default", "error" }; + "cmr", "cmsy", "cmm", "cmex", "msa", "msb", "ds", "eufrak", "rsfs", "stmry", + "wasy", "esint", "default", "error" }; -char const * LyXSeriesNames[4] = +char const * LyXSeriesNames[NUM_SERIES + 2 /* default & error */] = { "medium", "bold", "default", "error" }; -char const * LyXShapeNames[6] = +char const * LyXShapeNames[NUM_SHAPE + 2 /* default & error */] = { "up", "italic", "slanted", "smallcaps", "default", "error" }; -char const * LyXSizeNames[14] = +char const * LyXSizeNames[NUM_SIZE + 4 /* increase, decrease, default & error */] = { "tiny", "scriptsize", "footnotesize", "small", "normal", "large", "larger", "largest", "huge", "giant", "increase", "decrease", "default", "error" }; @@ -63,6 +70,7 @@ FontInfo const sane_font( FONT_OFF, FONT_OFF, FONT_OFF, + FONT_OFF, FONT_OFF); FontInfo const inherit_font( @@ -78,6 +86,7 @@ FontInfo const inherit_font( FONT_INHERIT, FONT_INHERIT, FONT_INHERIT, + FONT_INHERIT, FONT_OFF); FontInfo const ignore_font( @@ -93,6 +102,7 @@ FontInfo const ignore_font( FONT_IGNORE, FONT_IGNORE, FONT_IGNORE, + FONT_IGNORE, FONT_IGNORE); @@ -101,6 +111,7 @@ FontInfo::FontInfo() *this = sane_font; } + /// Decreases font size_ by one FontInfo & FontInfo::decSize() { @@ -163,6 +174,29 @@ FontInfo & FontInfo::incSize() } +double FontInfo::realSize() const +{ + double d = convert(lyxrc.font_sizes[size()]); + // The following is according to the average of the values in the + // definitions of \defaultscriptratio and \defaultscriptscriptratio in LaTeX + // font packages. No attempt is made to implement the actual values from + // \DefineMathSizes. + switch (style()) { + case LM_ST_DISPLAY: + case LM_ST_TEXT: + break; + case LM_ST_SCRIPT: + d *= .73; + break; + case LM_ST_SCRIPTSCRIPT: + d *= .55; + break; + } + // Never go below the smallest size + return max(d, convert(lyxrc.font_sizes[FONT_SIZE_TINY])); +} + + /// Reduce font to fall back to template where possible void FontInfo::reduce(FontInfo const & tmplt) { @@ -180,6 +214,8 @@ void FontInfo::reduce(FontInfo const & tmplt) underbar_ = FONT_INHERIT; if (strikeout_ == tmplt.strikeout_) strikeout_ = FONT_INHERIT; + if (xout_ == tmplt.xout_) + xout_ = FONT_INHERIT; if (uuline_ == tmplt.uuline_) uuline_ = FONT_INHERIT; if (uwave_ == tmplt.uwave_) @@ -222,6 +258,9 @@ FontInfo & FontInfo::realize(FontInfo const & tmplt) if (strikeout_ == FONT_INHERIT) strikeout_ = tmplt.strikeout_; + if (xout_ == FONT_INHERIT) + xout_ = tmplt.xout_; + if (uuline_ == FONT_INHERIT) uuline_ = tmplt.uuline_; @@ -241,6 +280,32 @@ FontInfo & FontInfo::realize(FontInfo const & tmplt) } +Changer FontInfo::changeColor(ColorCode const color) +{ + return make_change(color_, color); +} + + +Changer FontInfo::changeShape(FontShape const shape) +{ + return make_change(shape_, shape); +} + + +Changer FontInfo::changeStyle(MathStyle const new_style) +{ + return make_change(style_, new_style); +} + + +Changer FontInfo::change(FontInfo font, bool realiz) +{ + if (realiz) + font.realize(*this); + return make_change(*this, font); +} + + /// Updates a misc setting according to request static FontState setMisc(FontState newfont, FontState org) @@ -305,6 +370,7 @@ void FontInfo::update(FontInfo const & newfont, bool toggleall) setEmph(setMisc(newfont.emph_, emph_)); setUnderbar(setMisc(newfont.underbar_, underbar_)); setStrikeout(setMisc(newfont.strikeout_, strikeout_)); + setXout(setMisc(newfont.xout_, xout_)); setUuline(setMisc(newfont.uuline_, uuline_)); setUwave(setMisc(newfont.uwave_, uwave_)); setNoun(setMisc(newfont.noun_, noun_)); @@ -328,8 +394,8 @@ bool FontInfo::resolved() const && shape_ != INHERIT_SHAPE && size_ != FONT_SIZE_INHERIT && emph_ != FONT_INHERIT && underbar_ != FONT_INHERIT && uuline_ != FONT_INHERIT && uwave_ != FONT_INHERIT - && strikeout_ != FONT_INHERIT && noun_ != FONT_INHERIT - && color_ != Color_inherit + && strikeout_ != FONT_INHERIT && xout_ != FONT_INHERIT + && noun_ != FONT_INHERIT && color_ != Color_inherit && background_ != Color_inherit); } @@ -346,121 +412,124 @@ Color FontInfo::realColor() const namespace { - void appendSep(string & s1, string const & s2) { - if (s2.empty()) - return; - s1 += s1.empty() ? "" : "\n"; - s1 += s2; - } +void appendSep(string & s1, string const & s2) +{ + if (s2.empty()) + return; + s1 += s1.empty() ? "" : "\n"; + s1 += s2; +} - string makeCSSTag(string const & key, string const & val) - { - return key + ": " + val + ";"; - } +string makeCSSTag(string const & key, string const & val) +{ + return key + ": " + val + ";"; +} - string getFamilyCSS(FontFamily const & f) - { - switch (f) { - case ROMAN_FAMILY: - return "serif"; - case SANS_FAMILY: - return "sans-serif"; - case TYPEWRITER_FAMILY: - return "monospace"; - case SYMBOL_FAMILY: - case CMR_FAMILY: - case CMSY_FAMILY: - case CMM_FAMILY: - case CMEX_FAMILY: - case MSA_FAMILY: - case MSB_FAMILY: - case EUFRAK_FAMILY: - case RSFS_FAMILY: - case WASY_FAMILY: - case ESINT_FAMILY: - case INHERIT_FAMILY: - case IGNORE_FAMILY: - break; - } - return ""; +string getFamilyCSS(FontFamily const & f) +{ + switch (f) { + case ROMAN_FAMILY: + return "serif"; + case SANS_FAMILY: + return "sans-serif"; + case TYPEWRITER_FAMILY: + return "monospace"; + case SYMBOL_FAMILY: + case CMR_FAMILY: + case CMSY_FAMILY: + case CMM_FAMILY: + case CMEX_FAMILY: + case MSA_FAMILY: + case MSB_FAMILY: + case DS_FAMILY: + case EUFRAK_FAMILY: + case RSFS_FAMILY: + case STMARY_FAMILY: + case WASY_FAMILY: + case ESINT_FAMILY: + case INHERIT_FAMILY: + case IGNORE_FAMILY: + break; } + return ""; +} - string getSeriesCSS(FontSeries const & s) - { - switch (s) { - case MEDIUM_SERIES: - return "normal"; - case BOLD_SERIES: - return "bold"; - case INHERIT_SERIES: - case IGNORE_SERIES: - break; - } - return ""; +string getSeriesCSS(FontSeries const & s) +{ + switch (s) { + case MEDIUM_SERIES: + return "normal"; + case BOLD_SERIES: + return "bold"; + case INHERIT_SERIES: + case IGNORE_SERIES: + break; } + return ""; +} - string getShapeCSS(FontShape const & s) - { - string fs = "normal"; - string fv = "normal"; - switch (s) { - case UP_SHAPE: break; - case ITALIC_SHAPE: fs = "italic"; break; - case SLANTED_SHAPE: fs = "oblique"; break; - case SMALLCAPS_SHAPE: fv = "small-caps"; break; - case IGNORE_SHAPE: - case INHERIT_SHAPE: - fs = ""; fv = ""; break; - } - string retval; - if (!fs.empty()) - appendSep(retval, makeCSSTag("font-style", fs)); - if (!fv.empty()) - appendSep(retval, makeCSSTag("font-variant", fv)); - return retval; +string getShapeCSS(FontShape const & s) +{ + string fs = "normal"; + string fv = "normal"; + switch (s) { + case UP_SHAPE: break; + case ITALIC_SHAPE: fs = "italic"; break; + case SLANTED_SHAPE: fs = "oblique"; break; + case SMALLCAPS_SHAPE: fv = "small-caps"; break; + case IGNORE_SHAPE: + case INHERIT_SHAPE: + fs = ""; fv = ""; break; } + string retval; + if (!fs.empty()) + appendSep(retval, makeCSSTag("font-style", fs)); + if (!fv.empty()) + appendSep(retval, makeCSSTag("font-variant", fv)); + return retval; +} - string getSizeCSS(FontSize const & s) - { - switch (s) { - case FONT_SIZE_TINY: - return "xx-small"; - case FONT_SIZE_SCRIPT: - return "x-small"; - case FONT_SIZE_FOOTNOTE: - case FONT_SIZE_SMALL: - return "small"; - case FONT_SIZE_NORMAL: - return "medium"; - case FONT_SIZE_LARGE: - return "large"; - case FONT_SIZE_LARGER: - case FONT_SIZE_LARGEST: - return "x-large"; - case FONT_SIZE_HUGE: - case FONT_SIZE_HUGER: - return "xx-large"; - case FONT_SIZE_INCREASE: - return "larger"; - case FONT_SIZE_DECREASE: - return "smaller"; - case FONT_SIZE_IGNORE: - case FONT_SIZE_INHERIT: - break; - } - return ""; +string getSizeCSS(FontSize const & s) +{ + switch (s) { + case FONT_SIZE_TINY: + return "xx-small"; + case FONT_SIZE_SCRIPT: + return "x-small"; + case FONT_SIZE_FOOTNOTE: + case FONT_SIZE_SMALL: + return "small"; + case FONT_SIZE_NORMAL: + return "medium"; + case FONT_SIZE_LARGE: + return "large"; + case FONT_SIZE_LARGER: + case FONT_SIZE_LARGEST: + return "x-large"; + case FONT_SIZE_HUGE: + case FONT_SIZE_HUGER: + return "xx-large"; + case FONT_SIZE_INCREASE: + return "larger"; + case FONT_SIZE_DECREASE: + return "smaller"; + case FONT_SIZE_IGNORE: + case FONT_SIZE_INHERIT: + break; } - -} // namespace anonymous + return ""; +} + +} // namespace // FIXME This does not yet handle color -docstring FontInfo::asCSS() const +docstring FontInfo::asCSS() const { string retval; string tmp = getFamilyCSS(family_); @@ -473,7 +542,7 @@ docstring FontInfo::asCSS() const tmp = getSizeCSS(size_); if (!tmp.empty()) appendSep(retval, makeCSSTag("font-size", tmp)); - return from_ascii(retval); + return from_ascii(retval); } @@ -597,6 +666,8 @@ FontInfo lyxRead(Lexer & lex, FontInfo const & fi) f.setUnderbar(FONT_OFF); } else if (ttok == "no_strikeout") { f.setStrikeout(FONT_OFF); + } else if (ttok == "no_xout") { + f.setXout(FONT_OFF); } else if (ttok == "no_uuline") { f.setUuline(FONT_OFF); } else if (ttok == "no_uwave") { @@ -611,6 +682,8 @@ FontInfo lyxRead(Lexer & lex, FontInfo const & fi) f.setUnderbar(FONT_ON); } else if (ttok == "strikeout") { f.setStrikeout(FONT_ON); + } else if (ttok == "xout") { + f.setXout(FONT_ON); } else if (ttok == "uuline") { f.setUuline(FONT_ON); } else if (ttok == "uwave") { @@ -633,4 +706,61 @@ FontInfo lyxRead(Lexer & lex, FontInfo const & fi) } +void lyxWrite(ostream & os, FontInfo const & f, string const & start, int level) +{ + string indent; + for (int i = 0; i < level; ++i) + indent += '\t'; + ostringstream oss; + if (f.family() != INHERIT_FAMILY) + oss << indent << "\tFamily " << LyXFamilyNames[f.family()] + << '\n'; + if (f.series() != INHERIT_SERIES) + oss << indent << "\tSeries " << LyXSeriesNames[f.series()] + << '\n'; + if (f.shape() != INHERIT_SHAPE) + oss << indent << "\tShape " << LyXShapeNames[f.shape()] + << '\n'; + if (f.size() != FONT_SIZE_INHERIT) + oss << indent << "\tSize " << LyXSizeNames[f.size()] + << '\n'; + if (f.underbar() == FONT_ON) + oss << indent << "\tMisc Underbar\n"; + else if (f.underbar() == FONT_OFF) + oss << indent << "\tMisc No_Bar\n"; + if (f.strikeout() == FONT_ON) + oss << indent << "\tMisc Strikeout\n"; + else if (f.strikeout() == FONT_OFF) + oss << indent << "\tMisc No_Strikeout\n"; + if (f.xout() == FONT_ON) + oss << indent << "\tMisc Xout\n"; + else if (f.xout() == FONT_OFF) + oss << indent << "\tMisc No_Xout\n"; + if (f.uuline() == FONT_ON) + oss << indent << "\tMisc Uuline\n"; + else if (f.uuline() == FONT_OFF) + oss << indent << "\tMisc No_Uuline\n"; + if (f.uwave() == FONT_ON) + oss << indent << "\tMisc Uwave\n"; + else if (f.uwave() == FONT_OFF) + oss << indent << "\tMisc No_Uwave\n"; + if (f.emph() == FONT_ON) + oss << indent << "\tMisc Emph\n"; + else if (f.emph() == FONT_OFF) + oss << indent << "\tMisc No_Emph\n"; + if (f.noun() == FONT_ON) + oss << indent << "\tMisc Noun\n"; + else if (f.noun() == FONT_OFF) + oss << indent << "\tMisc No_Noun\n"; + if (f.color() != Color_inherit && f.color() != Color_none) + oss << indent << "\tColor " << lcolor.getLyXName(f.color()) + << '\n'; + if (!oss.str().empty()) { + os << indent << start << '\n' + << oss.str() + << indent << "EndFont\n"; + } +} + + } // namespace lyx