home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Divers / lyx-0.13.2.tar.gz / lyx-0.13.2.tar / lyx-0.13.2 / src / lyxfont.h < prev    next >
C/C++ Source or Header  |  1998-04-23  |  12KB  |  625 lines

  1. // -*- C++ -*-
  2. /* This file is part of
  3.  * ======================================================
  4.  * 
  5.  *           LyX, The Document Processor
  6.  *      
  7.  *        Copyright (C) 1995 Matthias Ettrich
  8.  *
  9.  *======================================================*/
  10. #ifndef _LYXFONT_H
  11. #define _LYXFONT_H
  12.  
  13. #ifdef __GNUG__
  14. #pragma interface
  15. #endif
  16.  
  17. #include FORMS_H_LOCATION
  18. #include "LString.h"
  19.  
  20. // It might happen that locale.h defines ON and OFF. This is not good
  21. // for us, since we use these names below. But of course this is due
  22. // to some old compilers. Than is broken when it comes to C++ scoping.
  23. #include "gettext.h" // so that we are sure tht it won't be included
  24.              // later. 
  25. #ifdef ON
  26. #undef ON
  27. #endif
  28.  
  29. #ifdef OFF
  30. #undef OFF
  31. #endif
  32.  
  33. class LyXLex;
  34.  
  35. ///
  36. class LyXFont {
  37. public:
  38.     /** The value INHERIT_* means that the font attribute is
  39.       inherited from the layout. In the case of layout fonts, the
  40.       attribute is inherited from the default font.
  41.       The value IGNORE_* is used with LyXFont::update() when the
  42.       attribute should not be changed.
  43.       */
  44.     enum FONT_FAMILY {
  45.         ///
  46.         ROMAN_FAMILY, // fontstruct rely on this to be 0
  47.         ///
  48.         SANS_FAMILY,
  49.         ///
  50.         TYPEWRITER_FAMILY,
  51.         ///
  52.         SYMBOL_FAMILY,
  53.         ///
  54.         INHERIT_FAMILY,
  55.         ///
  56.         IGNORE_FAMILY
  57.     };
  58.  
  59.     ///
  60.     enum FONT_SERIES {
  61.         ///
  62.         MEDIUM_SERIES, // fontstruct rely on this to be 0
  63.         ///
  64.         BOLD_SERIES,
  65.         ///
  66.         INHERIT_SERIES,
  67.         ///
  68.         IGNORE_SERIES
  69.     };
  70.  
  71.     ///
  72.     enum FONT_SHAPE {
  73.         ///
  74.         UP_SHAPE, // fontstruct rely on this to be 0
  75.         ///
  76.         ITALIC_SHAPE,
  77.         ///
  78.         SLANTED_SHAPE,
  79.         ///
  80.         SMALLCAPS_SHAPE,
  81.         ///
  82.         INHERIT_SHAPE,
  83.         ///
  84.         IGNORE_SHAPE
  85.     };
  86.  
  87.     ///
  88.     enum FONT_SIZE {
  89.         ///
  90.         SIZE_TINY, // fontstruct rely on this to be 0
  91.         ///
  92.         SIZE_SCRIPT,
  93.         ///
  94.         SIZE_FOOTNOTE,
  95.         ///
  96.         SIZE_SMALL,
  97.         ///
  98.         SIZE_NORMAL,
  99.         ///
  100.         SIZE_LARGE,
  101.         ///
  102.         SIZE_LARGER,
  103.         ///
  104.         SIZE_LARGEST,
  105.         ///
  106.         SIZE_HUGE,
  107.         ///
  108.         SIZE_HUGER,
  109.         ///
  110.         INCREASE_SIZE,
  111.         ///
  112.         DECREASE_SIZE,
  113.         ///
  114.         INHERIT_SIZE,
  115.         ///
  116.         IGNORE_SIZE
  117.     };
  118.  
  119.     /// Used for emph, underbar, noun and latex toggles
  120.     enum FONT_MISC_STATE {
  121.         ///
  122.         OFF,
  123.         ///
  124.         ON,
  125.         ///
  126.         TOGGLE,
  127.         ///
  128.         INHERIT,
  129.         ///
  130.         IGNORE
  131.     };
  132.  
  133.     ///
  134.     enum FONT_COLOR {
  135.         ///
  136.         NONE,
  137.         ///
  138.         BLACK,
  139.         ///
  140.         WHITE,
  141.         ///
  142.         RED,
  143.         ///
  144.         GREEN,
  145.         ///
  146.         BLUE,
  147.         ///
  148.         CYAN,
  149.         ///
  150.         MAGENTA,
  151.         ///
  152.         YELLOW,
  153.         ///
  154.         MATH,
  155.         ///
  156.         INSET,
  157.         ///
  158.         INHERIT_COLOR,
  159.         ///
  160.         IGNORE_COLOR
  161.     };
  162.  
  163.     /// Trick to overload constructor and make it megafast
  164.     enum FONT_INIT1 {
  165.         ///
  166.         ALL_INHERIT
  167.     };
  168.     ///
  169.     enum FONT_INIT2 {
  170.         ///
  171.         ALL_IGNORE
  172.     };
  173.     ///
  174.     enum FONT_INIT3 {
  175.         ///
  176.         ALL_SANE
  177.     };
  178.  
  179.     ///
  180.     LyXFont();
  181.  
  182.     /// LyXFont x(LyXFont ...) and LyXFont x = LyXFont ...
  183.     LyXFont(LyXFont const & x);
  184.  
  185.     /// Shortcut initialization
  186.     LyXFont(LyXFont::FONT_INIT1);
  187.     /// Shortcut initialization
  188.     LyXFont(LyXFont::FONT_INIT2);
  189.     /// Shortcut initialization
  190.     LyXFont(LyXFont::FONT_INIT3);
  191.  
  192.     /// LyXFont x,y; x=y;
  193.     LyXFont& operator=(LyXFont const & x);
  194.  
  195.     /// Decreases font size by one
  196.     LyXFont & decSize();
  197.  
  198.     /// Increases font size by one
  199.     LyXFont & incSize();
  200.  
  201.     ///
  202.     FONT_FAMILY family() const;
  203.  
  204.     ///
  205.     FONT_SERIES series() const;
  206.  
  207.     ///
  208.     FONT_SHAPE shape() const;
  209.  
  210.     ///
  211.     FONT_SIZE size() const;
  212.  
  213.     ///
  214.     FONT_MISC_STATE emph() const;
  215.  
  216.     ///
  217.     FONT_MISC_STATE underbar() const;
  218.  
  219.     ///
  220.     FONT_MISC_STATE noun() const;
  221.  
  222.     ///
  223.     FONT_MISC_STATE latex() const;
  224.  
  225.     ///
  226.     FONT_COLOR color() const;
  227.  
  228.     ///
  229.     LyXFont & setFamily(LyXFont::FONT_FAMILY f);
  230.     ///
  231.     LyXFont & setSeries(LyXFont::FONT_SERIES s);
  232.     ///
  233.     LyXFont & setShape(LyXFont::FONT_SHAPE s);
  234.     ///
  235.     LyXFont & setSize(LyXFont::FONT_SIZE s);
  236.     ///
  237.     LyXFont & setEmph(LyXFont::FONT_MISC_STATE e);
  238.     ///
  239.     LyXFont & setUnderbar(LyXFont::FONT_MISC_STATE u);
  240.     ///
  241.     LyXFont & setNoun(LyXFont::FONT_MISC_STATE n);
  242.     ///
  243.     LyXFont & setLatex(LyXFont::FONT_MISC_STATE l);
  244.     ///
  245.     LyXFont & setColor(LyXFont::FONT_COLOR c);
  246.  
  247.     /// Set family after LyX text format
  248.     LyXFont & setLyXFamily(LString const &);
  249.  
  250.     /// Set series after LyX text format
  251.     LyXFont & setLyXSeries(LString const &);
  252.  
  253.     /// Set shape after LyX text format
  254.     LyXFont & setLyXShape(LString const &);
  255.  
  256.     /// Set size after LyX text format
  257.     LyXFont & setLyXSize(LString const &);
  258.  
  259.     /// Returns misc flag after LyX text format
  260.     LyXFont::FONT_MISC_STATE setLyXMisc(LString const &);
  261.  
  262.     /// Sets color after LyX text format
  263.     LyXFont & setLyXColor(LString const &);
  264.  
  265.     /// Sets size after GUI name
  266.     LyXFont & setGUISize(LString const &);
  267.  
  268.     /// Returns size of font in LaTeX text notation
  269.     LString latexSize() const;
  270.  
  271.     /** Updates font settings according to request. If an
  272.       attribute is IGNORE, the attribute is left as it is. */
  273.     void update(LyXFont const & newfont);
  274.  
  275.     /** Reduce font to fall back to template where possible.
  276.       Equal fields are reduced to INHERIT */
  277.     void reduce(LyXFont const & tmplt);
  278.  
  279.     /// Realize font from a template (INHERIT are realized)
  280.     LyXFont & realize(LyXFont const & tmplt);
  281.  
  282.     /// Is a given font fully resolved?
  283.     bool resolved() const;
  284.  
  285.     /// Read a font specification from LyXLex. Used for layout files.
  286.     LyXFont & lyxRead(LyXLex&);
  287.  
  288.     /// Writes the changes from this font to orgfont in .lyx format in file
  289.     void lyxWriteChanges(LyXFont const & orgfont, FILE *) const;
  290.  
  291.     /** Writes the head of the LaTeX needed to change to this font.
  292.       Writes to file, the head of the LaTeX needed to change to this font.
  293.         Returns number of chars written. Base is the font state active now.
  294.     */
  295.     int latexWriteStartChanges(FILE *, LyXFont const & base) const;
  296.  
  297.     /** Writes to LString, the head of the LaTeX needed to change
  298.       to this font. Returns number of chars written. Base is the
  299.       font state active now.
  300.     */
  301.     int latexWriteStartChanges(LString &, LyXFont const & base) const;
  302.  
  303.     /** Writes the tail of the LaTeX needd to change to this font.
  304.       Returns number of chars written. Base is the font state we want
  305.       to achieve.
  306.     */
  307.     int latexWriteEndChanges(FILE *, LyXFont const & base) const;
  308.  
  309.     /** Writes tha tail of the LaTeX needed to chagne to this font.
  310.       Returns number of chars written. Base is the font state we want
  311.         to achieve.
  312.     */
  313.     int latexWriteEndChanges(LString &, LyXFont const & base) const;
  314.  
  315.     /// Build GUI description of font state
  316.     LString stateText() const;
  317.  
  318.     ///
  319.     int maxAscent() const; 
  320.  
  321.     ///
  322.     int maxDescent() const;
  323.  
  324.     ///
  325.     int ascent(char c) const;
  326.  
  327.     ///
  328.     int descent(char c) const;
  329.  
  330.     ///
  331.     int width(char c) const;
  332.  
  333.     ///
  334.     int textWidth(char const *s, int n) const;
  335.  
  336.     ///
  337.     int stringWidth(LString const & s) const;
  338.  
  339.     ///
  340.     int signedStringWidth(LString const & s) const;
  341.  
  342.     /// Draws text and returns width of text
  343.     int drawText(char const*, int n, Pixmap, int baseline, int x) const;
  344.  
  345.     ///
  346.     int drawString(LString const &, Pixmap pm, int baseline, int x) const;
  347.  
  348.     ///
  349.     GC getGC() const;
  350.  
  351.     ///
  352.     friend inline
  353.     bool operator==(LyXFont const & font1, LyXFont const & font2) {
  354.         return font1.bits == font2.bits;
  355.     }
  356.  
  357.     ///
  358.     friend inline
  359.     bool operator!=(LyXFont const & font1, LyXFont const & font2) {
  360.         return font1.bits != font2.bits;
  361.     }
  362. private:
  363.     /// This have to be at least 32 bits, but 64 or more does not hurt
  364.     typedef unsigned int ui32;
  365.  
  366.     /** Representation: bit table
  367.       Layout of bit table:
  368.                   11 1111 111 122 222 222 2233
  369.       Bit 012 34 567 8901 2345 678 901 234 567 8901
  370.           FFF SS SSS SSSS CCCC EEE UUU NNN LLL
  371.           aaa ee hhh iiii oooo mmm nnn ooo aaa
  372.           mmm rr aaa zzzz llll ppp ddd uuu ttt
  373.  
  374.       Some might think this is a dirty representation, but it gives
  375.       us at least 25% speed-up, so why not?
  376.     */
  377.     ui32 bits;
  378.  
  379.     ///
  380.     enum FONT_POSITION {
  381.         ///
  382.         Fam_Pos =  0,
  383.         ///
  384.         Ser_Pos =  3,
  385.         ///
  386.         Sha_Pos =  5,
  387.         ///
  388.         Siz_Pos =  8,
  389.         ///
  390.         Col_Pos = 12,
  391.         ///
  392.         Emp_Pos = 16,
  393.         ///
  394.         Und_Pos = 19,
  395.         ///
  396.         Nou_Pos = 22,
  397.         ///
  398.         Lat_Pos = 25
  399.     };
  400.  
  401.     ///
  402.     enum FONT_MASK {
  403.         ///
  404.         Fam_Mask = 0x07,
  405.         ///
  406.         Ser_Mask = 0x03,
  407.         ///
  408.         Sha_Mask = 0x07,
  409.         ///
  410.         Siz_Mask = 0x0f,
  411.         ///
  412.         Col_Mask = 0x0f,
  413.         ///
  414.         Misc_Mask = 0x07
  415.     };
  416.  
  417.     /// Sane font
  418.     enum {    sane = ui32(ROMAN_FAMILY) << Fam_Pos
  419.         | ui32(MEDIUM_SERIES) << Ser_Pos
  420.         | ui32(UP_SHAPE) << Sha_Pos
  421.         | ui32(SIZE_NORMAL) << Siz_Pos
  422.         | ui32(NONE) << Col_Pos
  423.         | ui32(OFF) << Emp_Pos
  424.         | ui32(OFF) << Und_Pos
  425.         | ui32(OFF) << Nou_Pos
  426.         | ui32(OFF) << Lat_Pos};
  427.  
  428.     /// All inherit font
  429.     enum{ inherit = ui32(INHERIT_FAMILY) << Fam_Pos
  430.         | ui32(INHERIT_SERIES) << Ser_Pos
  431.         | ui32(INHERIT_SHAPE) << Sha_Pos
  432.         | ui32(INHERIT_SIZE) << Siz_Pos
  433.         | ui32(INHERIT_COLOR) << Col_Pos
  434.         | ui32(INHERIT) << Emp_Pos
  435.         | ui32(INHERIT) << Und_Pos
  436.         | ui32(INHERIT) << Nou_Pos
  437.         | ui32(INHERIT) << Lat_Pos};
  438.  
  439.     /// All ignore font
  440.     enum{ ignore = ui32(IGNORE_FAMILY) << Fam_Pos
  441.            | ui32(IGNORE_SERIES) << Ser_Pos
  442.            | ui32(IGNORE_SHAPE) << Sha_Pos
  443.            | ui32(IGNORE_SIZE) << Siz_Pos
  444.            | ui32(IGNORE_COLOR) << Col_Pos
  445.            | ui32(IGNORE) << Emp_Pos
  446.            | ui32(IGNORE) << Und_Pos
  447.            | ui32(IGNORE) << Nou_Pos
  448.            | ui32(IGNORE) << Lat_Pos};
  449.  
  450.     /// Updates a misc setting according to request
  451.     LyXFont::FONT_MISC_STATE setMisc(LyXFont::FONT_MISC_STATE newfont,
  452.                      LyXFont::FONT_MISC_STATE org);
  453.  
  454.     /// Converts logical attributes to concrete shape attribute
  455.     LyXFont::FONT_SHAPE realShape() const;
  456.  
  457.     ///
  458.     XFontStruct* getXFontstruct() const;
  459. };
  460.  
  461.  
  462. inline LyXFont::LyXFont()
  463. {
  464.     bits = sane;
  465. }
  466.  
  467.  
  468. inline LyXFont::LyXFont(LyXFont const & x)
  469. {
  470.     bits = x.bits;
  471. }
  472.  
  473.  
  474. inline LyXFont::LyXFont(LyXFont::FONT_INIT1)
  475. {
  476.     bits = inherit;
  477. }
  478.  
  479.  
  480. inline LyXFont::LyXFont(LyXFont::FONT_INIT2)
  481. {
  482.     bits = ignore;
  483. }
  484.  
  485.  
  486. inline LyXFont::LyXFont(LyXFont::FONT_INIT3)
  487. {
  488.     bits = sane;
  489. }
  490.  
  491.  
  492. inline LyXFont & LyXFont::operator=(LyXFont const & x) 
  493. {
  494.     bits = x.bits;
  495.     return *this;
  496. }
  497.  
  498.  
  499.  // You don't have to understand the stuff below :-)
  500.  // It works, and it's bloody fast. (Asger)
  501. inline LyXFont::FONT_FAMILY LyXFont::family() const 
  502. {
  503.     return LyXFont::FONT_FAMILY((bits >> Fam_Pos) & Fam_Mask);
  504. }
  505.  
  506.  
  507. inline LyXFont::FONT_SERIES LyXFont::series() const
  508. {
  509.     return LyXFont::FONT_SERIES((bits >> Ser_Pos) & Ser_Mask);
  510. }
  511.  
  512.  
  513. inline LyXFont::FONT_SHAPE LyXFont::shape() const
  514. {
  515.     return LyXFont::FONT_SHAPE((bits >> Sha_Pos) & Sha_Mask);
  516. }
  517.  
  518.  
  519. inline LyXFont::FONT_SIZE LyXFont::size() const
  520. {
  521.     return LyXFont::FONT_SIZE((bits >> Siz_Pos) & Siz_Mask);
  522. }
  523.  
  524.  
  525. inline LyXFont::FONT_MISC_STATE LyXFont::emph() const
  526. {
  527.     return LyXFont::FONT_MISC_STATE((bits >> Emp_Pos) & Misc_Mask);
  528. }
  529.  
  530.  
  531. inline LyXFont::FONT_MISC_STATE LyXFont::underbar() const
  532. {
  533.     return LyXFont::FONT_MISC_STATE((bits >> Und_Pos) & Misc_Mask);
  534. }
  535.  
  536.  
  537. inline LyXFont::FONT_MISC_STATE LyXFont::noun() const
  538. {
  539.     return LyXFont::FONT_MISC_STATE((bits >> Nou_Pos) & Misc_Mask);
  540. }
  541.  
  542.  
  543. inline LyXFont::FONT_MISC_STATE LyXFont::latex() const 
  544. {
  545.     return LyXFont::FONT_MISC_STATE((bits >> Lat_Pos) & Misc_Mask);
  546. }
  547.  
  548.  
  549. inline LyXFont::FONT_COLOR LyXFont::color() const 
  550. {
  551.     return LyXFont::FONT_COLOR((bits >> Col_Pos) & Col_Mask);
  552. }
  553.  
  554.  
  555. inline LyXFont & LyXFont::setFamily(LyXFont::FONT_FAMILY f)
  556. {
  557.     bits &= ~(Fam_Mask << Fam_Pos);
  558.     bits |= ui32(f) << Fam_Pos;
  559.     return *this;
  560. }
  561.  
  562.  
  563. inline LyXFont & LyXFont::setSeries(LyXFont::FONT_SERIES s)
  564. {
  565.     bits &= ~(Ser_Mask << Ser_Pos);
  566.     bits |= ui32(s) << Ser_Pos;
  567.     return *this;
  568. }
  569.  
  570.  
  571. inline LyXFont & LyXFont::setShape(LyXFont::FONT_SHAPE s)
  572. {
  573.     bits &= ~(Sha_Mask << Sha_Pos);
  574.     bits |= ui32(s) << Sha_Pos;
  575.     return *this;
  576. }
  577.  
  578.  
  579. inline LyXFont & LyXFont::setSize(LyXFont::FONT_SIZE s)
  580. {
  581.     bits &= ~(Siz_Mask << Siz_Pos);
  582.     bits |= ui32(s) << Siz_Pos;
  583.     return *this;
  584. }
  585.  
  586.  
  587. inline LyXFont & LyXFont::setEmph(LyXFont::FONT_MISC_STATE e)
  588. {
  589.     bits &= ~(Misc_Mask << Emp_Pos);
  590.     bits |= ui32(e) << Emp_Pos;
  591.     return *this;
  592. }
  593.  
  594.  
  595. inline LyXFont & LyXFont::setUnderbar(LyXFont::FONT_MISC_STATE u)
  596. {
  597.     bits &= ~(Misc_Mask << Und_Pos);
  598.     bits |= ui32(u) << Und_Pos;
  599.     return *this;
  600. }
  601.  
  602.  
  603. inline LyXFont & LyXFont::setNoun(LyXFont::FONT_MISC_STATE n)
  604. {
  605.     bits &= ~(Misc_Mask << Nou_Pos);
  606.     bits |= ui32(n) << Nou_Pos;
  607.     return *this;
  608. }
  609.  
  610. inline LyXFont & LyXFont::setLatex(LyXFont::FONT_MISC_STATE l)
  611. {
  612.     bits &= ~(Misc_Mask << Lat_Pos);
  613.     bits |= ui32(l) << Lat_Pos;
  614.     return *this;
  615. }
  616.  
  617.  
  618. inline LyXFont & LyXFont::setColor(LyXFont::FONT_COLOR c)
  619. {
  620.     bits &= ~(Col_Mask << Col_Pos);
  621.     bits |= ui32(c) << Col_Pos;
  622.     return *this;
  623. }
  624. #endif
  625.