4 * This file is part of LyX, the document processor.
5 * Licence details can be found in the file COPYING.
7 * \author Lars Gullik Bjønnes
8 * \author Jean-Marc Lasgouttes
9 * \author Angus Leeming
12 * Full author contact details are available in file CREDITS.
19 #include "support/docstream.h"
33 /** The value INHERIT_* means that the font attribute is
34 inherited from the layout. In the case of layout fonts, the
35 attribute is inherited from the default font.
36 The value IGNORE_* is used with LyXFont::update() when the
37 attribute should not be changed.
41 ROMAN_FAMILY, // fontstruct rely on this to be 0
69 NUM_FAMILIES = INHERIT_FAMILY
75 MEDIUM_SERIES, // fontstruct rely on this to be 0
87 UP_SHAPE, // fontstruct rely on this to be 0
103 SIZE_TINY, // fontstruct rely on this to be 0
132 /// Used for emph, underbar, noun and latex toggles
133 enum FONT_MISC_STATE {
146 /// Trick to overload constructor and make it megafast
171 /** We store the LColor::color value as an int to get LColor.h out
172 * of the header file.
176 FONT_MISC_STATE emph;
178 FONT_MISC_STATE underbar;
180 FONT_MISC_STATE noun;
182 FONT_MISC_STATE number;
187 /// Shortcut initialization
189 LyXFont(LyXFont::FONT_INIT1);
190 /// Shortcut initialization
192 LyXFont(LyXFont::FONT_INIT2);
193 /// Shortcut initialization
195 LyXFont(LyXFont::FONT_INIT3);
196 /// Shortcut initialization
197 LyXFont(LyXFont::FONT_INIT1, Language const * l);
198 /// Shortcut initialization
199 LyXFont(LyXFont::FONT_INIT2, Language const * l);
200 /// Shortcut initialization
201 LyXFont(LyXFont::FONT_INIT3, Language const * l);
203 /// Decreases font size by one
205 /// Increases font size by one
208 FONT_FAMILY family() const { return bits.family; }
210 FONT_SERIES series() const { return bits.series; }
212 FONT_SHAPE shape() const { return bits.shape; }
214 FONT_SIZE size() const { return bits.size; }
216 FONT_MISC_STATE emph() const { return bits.emph; }
218 FONT_MISC_STATE underbar() const { return bits.underbar; }
220 FONT_MISC_STATE noun() const { return bits.noun; }
222 FONT_MISC_STATE number() const { return bits.number; }
224 LColor_color color() const;
226 Language const * language() const { return lang; }
228 bool isRightToLeft() const;
230 bool isVisibleRightToLeft() const;
232 bool isSymbolFont() const;
235 void setFamily(LyXFont::FONT_FAMILY f);
236 void setSeries(LyXFont::FONT_SERIES s);
237 void setShape(LyXFont::FONT_SHAPE s);
238 void setSize(LyXFont::FONT_SIZE s);
239 void setEmph(LyXFont::FONT_MISC_STATE e);
240 void setUnderbar(LyXFont::FONT_MISC_STATE u);
241 void setNoun(LyXFont::FONT_MISC_STATE n);
242 void setNumber(LyXFont::FONT_MISC_STATE n);
243 void setColor(LColor_color c);
244 void setLanguage(Language const * l);
246 /// Set family after LyX text format
247 LyXFont & setLyXFamily(std::string const &);
249 /// Set series after LyX text format
250 LyXFont & setLyXSeries(std::string const &);
252 /// Set shape after LyX text format
253 LyXFont & setLyXShape(std::string const &);
255 /// Set size after LyX text format
256 LyXFont & setLyXSize(std::string const &);
258 /// Returns misc flag after LyX text format
259 LyXFont::FONT_MISC_STATE setLyXMisc(std::string const &);
261 /// Sets color after LyX text format
262 LyXFont & setLyXColor(std::string const &);
264 /// Returns size of font in LaTeX text notation
265 std::string const latexSize() const;
267 /** Updates font settings according to request.
268 If an attribute is IGNORE, the attribute is left as it is.
269 When toggleall = true, all properties that matches the font in use
270 will have the effect that the properties is reset to the
271 default. If we have a text that is TYPEWRITER_FAMILY, and is
272 update()'ed with TYPEWRITER_FAMILY, the operation will be as if
273 a INHERIT_FAMILY was asked for. This is necessary for the
274 toggle-user-defined-style button on the toolbar.
276 void update(LyXFont const & newfont,
277 Language const * default_lang,
278 bool toggleall = false);
280 /** Reduce font to fall back to template where possible.
281 Equal fields are reduced to INHERIT */
282 void reduce(LyXFont const & tmplt);
284 /// Realize font from a template (INHERIT are realized)
285 LyXFont & realize(LyXFont const & tmplt);
286 /// Is a given font fully resolved?
287 bool resolved() const;
289 /// Read a font specification from LyXLex. Used for layout files.
290 LyXFont & lyxRead(LyXLex &);
292 /// Writes the changes from this font to orgfont in .lyx format in file
293 void lyxWriteChanges(LyXFont const & orgfont, std::ostream &) const;
295 /** Writes the head of the LaTeX needed to change to this font.
296 Writes to string, the head of the LaTeX needed to change
297 to this font. Returns number of chars written. Base is the
298 font state active now.
300 int latexWriteStartChanges(odocstream &, LyXFont const & base,
301 LyXFont const & prev) const;
303 /** Writes the tail of the LaTeX needed to change to this font.
304 Returns number of chars written. Base is the font state we want
307 int latexWriteEndChanges(odocstream &, LyXFont const & base,
308 LyXFont const & next) const;
310 /// Build GUI description of font state
311 std::string const stateText(BufferParams * params) const;
314 LColor_color realColor() const;
318 bool operator==(LyXFont const & font1, LyXFont const & font2);
321 std::ostream & operator<<(std::ostream & os, LyXFont const & font);
323 /// Converts logical attributes to concrete shape attribute
324 // Try hard to inline this as it shows up with 4.6 % in the profiler.
325 LyXFont::FONT_SHAPE realShape() const {
327 return SMALLCAPS_SHAPE;
329 return (bits.shape == UP_SHAPE) ? ITALIC_SHAPE : UP_SHAPE;
334 /** Compaq cxx 6.5 requires that the definition be public so that
335 it can compile operator==()
341 Language const * lang;
343 static FontBits sane;
345 static FontBits inherit;
347 static FontBits ignore;
348 /// Updates a misc setting according to request
349 LyXFont::FONT_MISC_STATE setMisc(LyXFont::FONT_MISC_STATE newfont,
350 LyXFont::FONT_MISC_STATE org);
354 /** \c LyXFont_size is a wrapper for LyXFont::FONT_SIZE.
355 * It can be forward-declared and passed as a function argument without
356 * having to expose lyxfont.h.
361 LyXFont_size(LyXFont::FONT_SIZE val) : val_(val) {}
363 operator LyXFont::FONT_SIZE() const { return val_; }
366 LyXFont::FONT_SIZE val_;
372 bool LyXFont::isSymbolFont() const
375 case LyXFont::SYMBOL_FAMILY:
376 case LyXFont::CMSY_FAMILY:
377 case LyXFont::CMM_FAMILY:
378 case LyXFont::CMEX_FAMILY:
379 case LyXFont::MSA_FAMILY:
380 case LyXFont::MSB_FAMILY:
381 case LyXFont::WASY_FAMILY:
389 std::ostream & operator<<(std::ostream &, LyXFont::FONT_MISC_STATE);
391 bool operator==(LyXFont::FontBits const & lhs, LyXFont::FontBits const & rhs);
394 bool operator!=(LyXFont::FontBits const & lhs, LyXFont::FontBits const & rhs)
396 return !(lhs == rhs);
401 bool operator==(LyXFont const & font1, LyXFont const & font2)
403 return font1.bits == font2.bits && font1.lang == font2.lang;
408 bool operator!=(LyXFont const & font1, LyXFont const & font2)
410 return !(font1 == font2);