This commit was manufactured by cvs2svn to create tag
[lyx.git] / src / lyxfont.h
blob8de7868ea4c12f3cd3d6b28a4723d9f7a449ec9f
1 // -*- C++ -*-
2 /* This file is part of
3 * ======================================================
4 *
5 * LyX, The Document Processor
6 *
7 * Copyright (C) 1995 Matthias Ettrich
9 *======================================================*/
11 #ifndef LYXFONT_H
12 #define LYXFONT_H
14 #ifdef __GNUG__
15 #pragma interface
16 #endif
18 #include FORMS_H_LOCATION
19 #include "LString.h"
20 #include "debug.h"
22 // It might happen that locale.h defines ON and OFF. This is not good
23 // for us, since we use these names below. But of course this is due
24 // to some old compilers. Than is broken when it comes to C++ scoping.
25 #include "gettext.h" // so that we are sure tht it won't be included
26 // later.
27 #ifdef ON
28 #undef ON
29 #endif
31 #ifdef OFF
32 #undef OFF
33 #endif
35 class LyXLex;
37 ///
38 class LyXFont {
39 public:
40 /** The value INHERIT_* means that the font attribute is
41 inherited from the layout. In the case of layout fonts, the
42 attribute is inherited from the default font.
43 The value IGNORE_* is used with LyXFont::update() when the
44 attribute should not be changed.
46 enum FONT_FAMILY {
47 ///
48 ROMAN_FAMILY, // fontstruct rely on this to be 0
49 ///
50 SANS_FAMILY,
51 ///
52 TYPEWRITER_FAMILY,
53 ///
54 SYMBOL_FAMILY,
55 ///
56 INHERIT_FAMILY,
57 ///
58 IGNORE_FAMILY
61 ///
62 enum FONT_SERIES {
63 ///
64 MEDIUM_SERIES, // fontstruct rely on this to be 0
65 ///
66 BOLD_SERIES,
67 ///
68 INHERIT_SERIES,
69 ///
70 IGNORE_SERIES
73 ///
74 enum FONT_SHAPE {
75 ///
76 UP_SHAPE, // fontstruct rely on this to be 0
77 ///
78 ITALIC_SHAPE,
79 ///
80 SLANTED_SHAPE,
81 ///
82 SMALLCAPS_SHAPE,
83 ///
84 INHERIT_SHAPE,
85 ///
86 IGNORE_SHAPE
89 ///
90 enum FONT_SIZE {
91 ///
92 SIZE_TINY, // fontstruct rely on this to be 0
93 ///
94 SIZE_SCRIPT,
95 ///
96 SIZE_FOOTNOTE,
97 ///
98 SIZE_SMALL,
99 ///
100 SIZE_NORMAL,
102 SIZE_LARGE,
104 SIZE_LARGER,
106 SIZE_LARGEST,
108 SIZE_HUGE,
110 SIZE_HUGER,
112 INCREASE_SIZE,
114 DECREASE_SIZE,
116 INHERIT_SIZE,
118 IGNORE_SIZE
121 /// Used for emph, underbar, noun and latex toggles
122 enum FONT_MISC_STATE {
124 OFF,
128 TOGGLE,
130 INHERIT,
132 IGNORE
136 enum FONT_COLOR {
138 NONE,
140 BLACK,
142 WHITE,
144 RED,
146 GREEN,
148 BLUE,
150 CYAN,
152 MAGENTA,
154 YELLOW,
156 MATH,
158 INSET,
160 INHERIT_COLOR,
162 IGNORE_COLOR
165 /// Trick to overload constructor and make it megafast
166 enum FONT_INIT1 {
168 ALL_INHERIT
171 enum FONT_INIT2 {
173 ALL_IGNORE
176 enum FONT_INIT3 {
178 ALL_SANE
182 LyXFont();
184 /// LyXFont x(LyXFont ...) and LyXFont x = LyXFont ...
185 LyXFont(LyXFont const & x);
187 /// Shortcut initialization
188 LyXFont(LyXFont::FONT_INIT1);
189 /// Shortcut initialization
190 LyXFont(LyXFont::FONT_INIT2);
191 /// Shortcut initialization
192 LyXFont(LyXFont::FONT_INIT3);
194 /// LyXFont x,y; x=y;
195 LyXFont& operator=(LyXFont const & x);
197 /// Decreases font size by one
198 LyXFont & decSize();
200 /// Increases font size by one
201 LyXFont & incSize();
204 FONT_FAMILY family() const;
207 FONT_SERIES series() const;
210 FONT_SHAPE shape() const;
213 FONT_SIZE size() const;
216 FONT_MISC_STATE emph() const;
219 FONT_MISC_STATE underbar() const;
222 FONT_MISC_STATE noun() const;
225 FONT_MISC_STATE latex() const;
228 FONT_COLOR color() const;
231 LyXFont & setFamily(LyXFont::FONT_FAMILY f);
233 LyXFont & setSeries(LyXFont::FONT_SERIES s);
235 LyXFont & setShape(LyXFont::FONT_SHAPE s);
237 LyXFont & setSize(LyXFont::FONT_SIZE s);
239 LyXFont & setEmph(LyXFont::FONT_MISC_STATE e);
241 LyXFont & setUnderbar(LyXFont::FONT_MISC_STATE u);
243 LyXFont & setNoun(LyXFont::FONT_MISC_STATE n);
245 LyXFont & setLatex(LyXFont::FONT_MISC_STATE l);
247 LyXFont & setColor(LyXFont::FONT_COLOR c);
249 /// Set family after LyX text format
250 LyXFont & setLyXFamily(string const &);
252 /// Set series after LyX text format
253 LyXFont & setLyXSeries(string const &);
255 /// Set shape after LyX text format
256 LyXFont & setLyXShape(string const &);
258 /// Set size after LyX text format
259 LyXFont & setLyXSize(string const &);
261 /// Returns misc flag after LyX text format
262 LyXFont::FONT_MISC_STATE setLyXMisc(string const &);
264 /// Sets color after LyX text format
265 LyXFont & setLyXColor(string const &);
267 /// Sets size after GUI name
268 LyXFont & setGUISize(string const &);
270 /// Returns size of font in LaTeX text notation
271 string latexSize() const;
273 /** Updates font settings according to request. If an
274 attribute is IGNORE, the attribute is left as it is. */
276 * When toggleall=true, all properties that matches the font in use
277 * will have the effect that the properties is reset to the
278 * default. If we have a text that is TYPEWRITER_FAMILY, and is
279 * update()'ed with TYPEWRITER_FAMILY, the operation will be as if
280 * a INHERIT_FAMILY was asked for. This is necessary for the
281 * toggle-user-defined-style button on the toolbar.
283 void update(LyXFont const & newfont, bool toggleall=false);
285 /** Reduce font to fall back to template where possible.
286 Equal fields are reduced to INHERIT */
287 void reduce(LyXFont const & tmplt);
289 /// Realize font from a template (INHERIT are realized)
290 LyXFont & realize(LyXFont const & tmplt);
292 /// Is a given font fully resolved?
293 bool resolved() const;
295 /// Read a font specification from LyXLex. Used for layout files.
296 LyXFont & lyxRead(LyXLex&);
298 /// Writes the changes from this font to orgfont in .lyx format in file
299 void lyxWriteChanges(LyXFont const & orgfont, FILE *) const;
301 /** Writes the head of the LaTeX needed to change to this font.
302 Writes to file, the head of the LaTeX needed to change to this font.
303 Returns number of chars written. Base is the font state active now.
305 int latexWriteStartChanges(FILE *, LyXFont const & base) const;
307 /** Writes to string, the head of the LaTeX needed to change
308 to this font. Returns number of chars written. Base is the
309 font state active now.
311 int latexWriteStartChanges(string &, LyXFont const & base) const;
313 /** Writes the tail of the LaTeX needd to change to this font.
314 Returns number of chars written. Base is the font state we want
315 to achieve.
317 int latexWriteEndChanges(FILE *, LyXFont const & base) const;
319 /** Writes tha tail of the LaTeX needed to chagne to this font.
320 Returns number of chars written. Base is the font state we want
321 to achieve.
323 int latexWriteEndChanges(string &, LyXFont const & base) const;
325 /// Build GUI description of font state
326 string stateText() const;
329 int maxAscent() const;
332 int maxDescent() const;
335 int ascent(char c) const;
338 int descent(char c) const;
341 int width(char c) const;
344 int textWidth(char const *s, int n) const;
347 int stringWidth(string const & s) const;
350 int signedStringWidth(string const & s) const;
352 /// Draws text and returns width of text
353 int drawText(char const*, int n, Pixmap, int baseline, int x) const;
356 int drawString(string const &, Pixmap pm, int baseline, int x) const;
359 GC getGC() const;
362 friend inline
363 bool operator==(LyXFont const & font1, LyXFont const & font2) {
364 return font1.bits == font2.bits;
368 friend inline
369 bool operator!=(LyXFont const & font1, LyXFont const & font2) {
370 return font1.bits != font2.bits;
373 /// compares two fonts, ignoring the setting of the Latex part.
374 bool equalExceptLatex(LyXFont const &) const;
376 private:
377 /// This have to be at least 32 bits, but 64 or more does not hurt
378 typedef unsigned int ui32;
380 /** Representation: bit table
381 Layout of bit table:
382 11 1111 111 122 222 222 2233
383 Bit 012 34 567 8901 2345 678 901 234 567 8901
384 FFF SS SSS SSSS CCCC EEE UUU NNN LLL
385 aaa ee hhh iiii oooo mmm nnn ooo aaa
386 mmm rr aaa zzzz llll ppp ddd uuu ttt
388 Some might think this is a dirty representation, but it gives
389 us at least 25% speed-up, so why not?
391 ui32 bits;
394 enum FONT_POSITION {
396 Fam_Pos = 0,
398 Ser_Pos = 3,
400 Sha_Pos = 5,
402 Siz_Pos = 8,
404 Col_Pos = 12,
406 Emp_Pos = 16,
408 Und_Pos = 19,
410 Nou_Pos = 22,
412 Lat_Pos = 25
416 enum FONT_MASK {
418 Fam_Mask = 0x07,
420 Ser_Mask = 0x03,
422 Sha_Mask = 0x07,
424 Siz_Mask = 0x0f,
426 Col_Mask = 0x0f,
428 Misc_Mask = 0x07
431 /// Sane font
432 enum { sane = ui32(ROMAN_FAMILY) << Fam_Pos
433 | ui32(MEDIUM_SERIES) << Ser_Pos
434 | ui32(UP_SHAPE) << Sha_Pos
435 | ui32(SIZE_NORMAL) << Siz_Pos
436 | ui32(NONE) << Col_Pos
437 | ui32(OFF) << Emp_Pos
438 | ui32(OFF) << Und_Pos
439 | ui32(OFF) << Nou_Pos
440 | ui32(OFF) << Lat_Pos};
442 /// All inherit font
443 enum{ inherit = ui32(INHERIT_FAMILY) << Fam_Pos
444 | ui32(INHERIT_SERIES) << Ser_Pos
445 | ui32(INHERIT_SHAPE) << Sha_Pos
446 | ui32(INHERIT_SIZE) << Siz_Pos
447 | ui32(INHERIT_COLOR) << Col_Pos
448 | ui32(INHERIT) << Emp_Pos
449 | ui32(INHERIT) << Und_Pos
450 | ui32(INHERIT) << Nou_Pos
451 | ui32(INHERIT) << Lat_Pos};
453 /// All ignore font
454 enum{ ignore = ui32(IGNORE_FAMILY) << Fam_Pos
455 | ui32(IGNORE_SERIES) << Ser_Pos
456 | ui32(IGNORE_SHAPE) << Sha_Pos
457 | ui32(IGNORE_SIZE) << Siz_Pos
458 | ui32(IGNORE_COLOR) << Col_Pos
459 | ui32(IGNORE) << Emp_Pos
460 | ui32(IGNORE) << Und_Pos
461 | ui32(IGNORE) << Nou_Pos
462 | ui32(IGNORE) << Lat_Pos};
464 /// Updates a misc setting according to request
465 LyXFont::FONT_MISC_STATE setMisc(LyXFont::FONT_MISC_STATE newfont,
466 LyXFont::FONT_MISC_STATE org);
468 /// Converts logical attributes to concrete shape attribute
469 LyXFont::FONT_SHAPE realShape() const;
472 XFontStruct* getXFontstruct() const;
475 ostream & operator<<(ostream &, LyXFont::FONT_MISC_STATE);
477 inline LyXFont::LyXFont()
479 bits = sane;
483 inline LyXFont::LyXFont(LyXFont const & x)
485 bits = x.bits;
489 inline LyXFont::LyXFont(LyXFont::FONT_INIT1)
491 bits = inherit;
495 inline LyXFont::LyXFont(LyXFont::FONT_INIT2)
497 bits = ignore;
501 inline LyXFont::LyXFont(LyXFont::FONT_INIT3)
503 bits = sane;
507 inline LyXFont & LyXFont::operator=(LyXFont const & x)
509 bits = x.bits;
510 return *this;
514 // You don't have to understand the stuff below :-)
515 // It works, and it's bloody fast. (Asger)
516 inline LyXFont::FONT_FAMILY LyXFont::family() const
518 return LyXFont::FONT_FAMILY((bits >> Fam_Pos) & Fam_Mask);
522 inline LyXFont::FONT_SERIES LyXFont::series() const
524 return LyXFont::FONT_SERIES((bits >> Ser_Pos) & Ser_Mask);
528 inline LyXFont::FONT_SHAPE LyXFont::shape() const
530 return LyXFont::FONT_SHAPE((bits >> Sha_Pos) & Sha_Mask);
534 inline LyXFont::FONT_SIZE LyXFont::size() const
536 return LyXFont::FONT_SIZE((bits >> Siz_Pos) & Siz_Mask);
540 inline LyXFont::FONT_MISC_STATE LyXFont::emph() const
542 return LyXFont::FONT_MISC_STATE((bits >> Emp_Pos) & Misc_Mask);
546 inline LyXFont::FONT_MISC_STATE LyXFont::underbar() const
548 return LyXFont::FONT_MISC_STATE((bits >> Und_Pos) & Misc_Mask);
552 inline LyXFont::FONT_MISC_STATE LyXFont::noun() const
554 return LyXFont::FONT_MISC_STATE((bits >> Nou_Pos) & Misc_Mask);
558 inline LyXFont::FONT_MISC_STATE LyXFont::latex() const
560 return LyXFont::FONT_MISC_STATE((bits >> Lat_Pos) & Misc_Mask);
564 inline LyXFont::FONT_COLOR LyXFont::color() const
566 return LyXFont::FONT_COLOR((bits >> Col_Pos) & Col_Mask);
570 inline LyXFont & LyXFont::setFamily(LyXFont::FONT_FAMILY f)
572 bits &= ~(Fam_Mask << Fam_Pos);
573 bits |= ui32(f) << Fam_Pos;
574 return *this;
578 inline LyXFont & LyXFont::setSeries(LyXFont::FONT_SERIES s)
580 bits &= ~(Ser_Mask << Ser_Pos);
581 bits |= ui32(s) << Ser_Pos;
582 return *this;
586 inline LyXFont & LyXFont::setShape(LyXFont::FONT_SHAPE s)
588 bits &= ~(Sha_Mask << Sha_Pos);
589 bits |= ui32(s) << Sha_Pos;
590 return *this;
594 inline LyXFont & LyXFont::setSize(LyXFont::FONT_SIZE s)
596 bits &= ~(Siz_Mask << Siz_Pos);
597 bits |= ui32(s) << Siz_Pos;
598 return *this;
602 inline LyXFont & LyXFont::setEmph(LyXFont::FONT_MISC_STATE e)
604 bits &= ~(Misc_Mask << Emp_Pos);
605 bits |= ui32(e) << Emp_Pos;
606 return *this;
610 inline LyXFont & LyXFont::setUnderbar(LyXFont::FONT_MISC_STATE u)
612 bits &= ~(Misc_Mask << Und_Pos);
613 bits |= ui32(u) << Und_Pos;
614 return *this;
618 inline LyXFont & LyXFont::setNoun(LyXFont::FONT_MISC_STATE n)
620 bits &= ~(Misc_Mask << Nou_Pos);
621 bits |= ui32(n) << Nou_Pos;
622 return *this;
625 inline LyXFont & LyXFont::setLatex(LyXFont::FONT_MISC_STATE l)
627 bits &= ~(Misc_Mask << Lat_Pos);
628 bits |= ui32(l) << Lat_Pos;
629 return *this;
633 inline LyXFont & LyXFont::setColor(LyXFont::FONT_COLOR c)
635 bits &= ~(Col_Mask << Col_Pos);
636 bits |= ui32(c) << Col_Pos;
637 return *this;
639 #endif