2 /* This file is part of
3 * ======================================================
5 * LyX, The Document Processor
7 * Copyright (C) 1995 Matthias Ettrich
9 *======================================================*/
18 #include FORMS_H_LOCATION
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
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.
48 ROMAN_FAMILY, // fontstruct rely on this to be 0
64 MEDIUM_SERIES, // fontstruct rely on this to be 0
76 UP_SHAPE, // fontstruct rely on this to be 0
92 SIZE_TINY, // fontstruct rely on this to be 0
121 /// Used for emph, underbar, noun and latex toggles
122 enum FONT_MISC_STATE {
165 /// Trick to overload constructor and make it megafast
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
200 /// Increases font size by one
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
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
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;
363 bool operator==(LyXFont const & font1, LyXFont const & font2) {
364 return font1.bits == font2.bits;
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;
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
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?
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};
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};
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()
483 inline LyXFont::LyXFont(LyXFont const & x)
489 inline LyXFont::LyXFont(LyXFont::FONT_INIT1)
495 inline LyXFont::LyXFont(LyXFont::FONT_INIT2)
501 inline LyXFont::LyXFont(LyXFont::FONT_INIT3)
507 inline LyXFont & LyXFont::operator=(LyXFont const & x)
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;
578 inline LyXFont & LyXFont::setSeries(LyXFont::FONT_SERIES s)
580 bits &= ~(Ser_Mask << Ser_Pos);
581 bits |= ui32(s) << Ser_Pos;
586 inline LyXFont & LyXFont::setShape(LyXFont::FONT_SHAPE s)
588 bits &= ~(Sha_Mask << Sha_Pos);
589 bits |= ui32(s) << Sha_Pos;
594 inline LyXFont & LyXFont::setSize(LyXFont::FONT_SIZE s)
596 bits &= ~(Siz_Mask << Siz_Pos);
597 bits |= ui32(s) << Siz_Pos;
602 inline LyXFont & LyXFont::setEmph(LyXFont::FONT_MISC_STATE e)
604 bits &= ~(Misc_Mask << Emp_Pos);
605 bits |= ui32(e) << Emp_Pos;
610 inline LyXFont & LyXFont::setUnderbar(LyXFont::FONT_MISC_STATE u)
612 bits &= ~(Misc_Mask << Und_Pos);
613 bits |= ui32(u) << Und_Pos;
618 inline LyXFont & LyXFont::setNoun(LyXFont::FONT_MISC_STATE n)
620 bits &= ~(Misc_Mask << Nou_Pos);
621 bits |= ui32(n) << Nou_Pos;
625 inline LyXFont & LyXFont::setLatex(LyXFont::FONT_MISC_STATE l)
627 bits &= ~(Misc_Mask << Lat_Pos);
628 bits |= ui32(l) << Lat_Pos;
633 inline LyXFont & LyXFont::setColor(LyXFont::FONT_COLOR c)
635 bits &= ~(Col_Mask << Col_Pos);
636 bits |= ui32(c) << Col_Pos;