]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfont.h
to much stuff for my liking...
[lyx.git] / src / lyxfont.h
index 6c0287b5d65ba9d23ddf4be303a43c2477c634c9..28611e542959c8c43975f61d828896d3244615a3 100644 (file)
@@ -4,9 +4,10 @@
  * 
  *           LyX, The Document Processor
  *      
- *         Copyright (C) 1995 Matthias Ettrich
+ *           Copyright 1995 Matthias Ettrich
+ *           Copyright 1995-2001 The LyX Team.   
  *
- *======================================================*/
+ * ====================================================== */
 
 #ifndef LYXFONT_H
 #define LYXFONT_H
 #pragma interface
 #endif
 
-#include FORMS_H_LOCATION
-#include "LString.h"
-
-// It might happen that locale.h defines ON and OFF. This is not good
-// for us, since we use these names below. But of course this is due
-// to some old compilers. Than is broken when it comes to C++ scoping.
-#include "gettext.h" // so that we are sure tht it won't be included
-                    // later. 
-#ifdef ON
-#undef ON
-#endif
+#include <iosfwd>
 
-#ifdef OFF
-#undef OFF
-#endif
+#include "LString.h"
+#include "LColor.h"
 
 class LyXLex;
+class BufferParams;
+class Language;
+
 
 ///
 class LyXFont {
 public:
        /** The value INHERIT_* means that the font attribute is
-         inherited from the layout. In the case of layout fonts, the
-         attribute is inherited from the default font.
-         The value IGNORE_* is used with LyXFont::update() when the
-         attribute should not be changed.
-         */
+           inherited from the layout. In the case of layout fonts, the
+           attribute is inherited from the default font.
+           The value IGNORE_* is used with LyXFont::update() when the
+           attribute should not be changed.
+       */
        enum FONT_FAMILY {
                ///
                ROMAN_FAMILY, // fontstruct rely on this to be 0
@@ -52,9 +45,25 @@ public:
                ///
                SYMBOL_FAMILY,
                ///
+               CMR_FAMILY,
+               ///
+               CMSY_FAMILY,
+               ///
+               CMM_FAMILY,
+               ///
+               CMEX_FAMILY,
+               ///
+               MSA_FAMILY,
+               ///
+               MSB_FAMILY,
+               ///
+               EUFRAK_FAMILY,
+               ///
                INHERIT_FAMILY,
                ///
-               IGNORE_FAMILY
+               IGNORE_FAMILY,
+               ///
+               NUM_FAMILIES = INHERIT_FAMILY
        };
 
        ///
@@ -130,36 +139,6 @@ public:
                ///
                IGNORE
        };
-       ///
-       enum FONT_COLOR {
-               ///
-               NONE,
-               ///
-               BLACK,
-               ///
-               WHITE,
-               ///
-               RED,
-               ///
-               GREEN,
-               ///
-               BLUE,
-               ///
-               CYAN,
-               ///
-               MAGENTA,
-               ///
-               YELLOW,
-               ///
-               MATH,
-               ///
-               INSET,
-               ///
-               INHERIT_COLOR,
-               ///
-               IGNORE_COLOR
-       };
 
        /// Trick to overload constructor and make it megafast
        enum FONT_INIT1 {
@@ -180,19 +159,22 @@ public:
        ///
        LyXFont();
 
-       /// LyXFont x(LyXFont ...) and LyXFont x = LyXFont ...
-       LyXFont(LyXFont const & x);
        /// Shortcut initialization
+       explicit
        LyXFont(LyXFont::FONT_INIT1);
        /// Shortcut initialization
+       explicit
        LyXFont(LyXFont::FONT_INIT2);
        /// Shortcut initialization
+       explicit
        LyXFont(LyXFont::FONT_INIT3);
+       /// Shortcut initialization
+       LyXFont(LyXFont::FONT_INIT1, Language const * l);
+       /// Shortcut initialization
+       LyXFont(LyXFont::FONT_INIT2, Language const * l);
+       /// Shortcut initialization
+       LyXFont(LyXFont::FONT_INIT3, Language const * l);
 
-       /// LyXFont x,y; x=y;
-       LyXFont& operator=(LyXFont const & x);
        /// Decreases font size by one
        LyXFont & decSize();
  
@@ -221,11 +203,23 @@ public:
        FONT_MISC_STATE noun() const;
 
        ///
-       FONT_MISC_STATE latex() const;
+       FONT_MISC_STATE number() const;
+
        ///
-       FONT_COLOR color() const;
+       LColor::color color() const;
+
+       ///
+       Language const * language() const;
+
+       ///
+       bool isRightToLeft() const;
+
+       ///
+       bool isVisibleRightToLeft() const;
+
+       ///
+       bool isSymbolFont() const;
+       
        ///
        LyXFont & setFamily(LyXFont::FONT_FAMILY f);
        ///
@@ -241,10 +235,12 @@ public:
        ///
        LyXFont & setNoun(LyXFont::FONT_MISC_STATE n);
        ///
-       LyXFont & setLatex(LyXFont::FONT_MISC_STATE l);
+       LyXFont & setNumber(LyXFont::FONT_MISC_STATE n);
        ///
-       LyXFont & setColor(LyXFont::FONT_COLOR c);
+       LyXFont & setColor(LColor::color c);
+       ///
+       LyXFont & setLanguage(Language const * l);
+
        /// Set family after LyX text format
        LyXFont & setLyXFamily(string const &);
  
@@ -262,377 +258,195 @@ public:
 
        /// Sets color after LyX text format
        LyXFont & setLyXColor(string const &);
-       /// Sets size after GUI name
-       LyXFont & setGUISize(string const &);
+
        /// Returns size of font in LaTeX text notation
-       string latexSize() const;
-       /** Updates font settings according to request. If an
-         attribute is IGNORE, the attribute is left as it is. */
-       /* 
-        * When toggleall=true, all properties that matches the font in use
-        * will have the effect that the properties is reset to the
-        * default.  If we have a text that is TYPEWRITER_FAMILY, and is
-        * update()'ed with TYPEWRITER_FAMILY, the operation will be as if
-        * a INHERIT_FAMILY was asked for.  This is necessary for the
-        * toggle-user-defined-style button on the toolbar.
-        */
-       void update(LyXFont const & newfont, bool toggleall=false);
+       string const latexSize() const;
+       /** Updates font settings according to request.
+           If an attribute is IGNORE, the attribute is left as it is.
+           When toggleall = true, all properties that matches the font in use
+           will have the effect that the properties is reset to the
+           default.  If we have a text that is TYPEWRITER_FAMILY, and is
+           update()'ed with TYPEWRITER_FAMILY, the operation will be as if
+           a INHERIT_FAMILY was asked for.  This is necessary for the
+           toggle-user-defined-style button on the toolbar.
+       */
+       void update(LyXFont const & newfont,
+                   Language const * default_lang,
+                   bool toggleall = false);
  
        /** Reduce font to fall back to template where possible.
-         Equal fields are reduced to INHERIT */
+           Equal fields are reduced to INHERIT */
        void reduce(LyXFont const & tmplt);
  
        /// Realize font from a template (INHERIT are realized)
+#ifndef INHERIT_LANGUAGE
        LyXFont & realize(LyXFont const & tmplt);
-
+#else
+       LyXFont & realize(LyXFont const & tmplt, Language const * language);
+#endif
        /// Is a given font fully resolved?
        bool resolved() const;
  
        /// Read a font specification from LyXLex. Used for layout files.
-       LyXFont & lyxRead(LyXLex&);
+       LyXFont & lyxRead(LyXLex &);
  
        /// Writes the changes from this font to orgfont in .lyx format in file
-       void lyxWriteChanges(LyXFont const & orgfont, FILE *) const;
-       /** Writes the head of the LaTeX needed to change to this font.
-         Writes to file, the head of the LaTeX needed to change to this font.
-           Returns number of chars written. Base is the font state active now.
-       */
-       int latexWriteStartChanges(FILE *, LyXFont const & base) const;
-
-       /** Writes to string, the head of the LaTeX needed to change
-         to this font. Returns number of chars written. Base is the
-         font state active now.
-       */
-       int latexWriteStartChanges(string &, LyXFont const & base) const;
+#ifndef INHERIT_LANGUAGE
+       void lyxWriteChanges(LyXFont const & orgfont, std::ostream &) const;
+#else
+       void lyxWriteChanges(LyXFont const & orgfont, Language const * doclang,
+                            std::ostream &) const;
+#endif
 
-       /** Writes the tail of the LaTeX needd to change to this font.
-         Returns number of chars written. Base is the font state we want
-         to achieve.
+       /** Writes the head of the LaTeX needed to change to this font.
+           Writes to string, the head of the LaTeX needed to change
+           to this font. Returns number of chars written. Base is the
+           font state active now.
        */
-       int latexWriteEndChanges(FILE *, LyXFont const & base) const;
+       int latexWriteStartChanges(std::ostream &, LyXFont const & base,
+                                  LyXFont const & prev) const;
 
        /** Writes tha tail of the LaTeX needed to chagne to this font.
-         Returns number of chars written. Base is the font state we want
+           Returns number of chars written. Base is the font state we want
            to achieve.
        */
-       int latexWriteEndChanges(string &, LyXFont const & base) const;
-       /// Build GUI description of font state
-       string stateText() const;
-
-       ///
-       int maxAscent() const; 
+       int latexWriteEndChanges(std::ostream &, LyXFont const & base,
+                                LyXFont const & next) const;
 
-       ///
-       int maxDescent() const;
-
-       ///
-       int ascent(char c) const;
-
-       ///
-       int descent(char c) const;
-
-       ///
-       int width(char c) const;
-
-       ///
-       int textWidth(char const *s, int n) const;
-
-       ///
-       int stringWidth(string const & s) const;
-
-       ///
-       int signedStringWidth(string const & s) const;
-
-       /// Draws text and returns width of text
-       int drawText(char const*, int n, Pixmap, int baseline, int x) const;
-
-       ///
-       int drawString(string const &, Pixmap pm, int baseline, int x) const;
-
-       ///
-       GC getGC() const;
+       /// Build GUI description of font state
+       string const stateText(BufferParams * params) const;
 
        ///
-       friend inline
-       bool operator==(LyXFont const & font1, LyXFont const & font2) {
-               return font1.bits == font2.bits;
-       }
+       LColor::color realColor() const;
 
        ///
-       friend inline
-       bool operator!=(LyXFont const & font1, LyXFont const & font2) {
-               return font1.bits != font2.bits;
-       }
-
-       /// compares two fonts, ignoring the setting of the Latex part.
-       bool equalExceptLatex(LyXFont const &) const;
+       friend
+       bool operator==(LyXFont const & font1, LyXFont const & font2);
 
+       /// Converts logical attributes to concrete shape attribute
+       LyXFont::FONT_SHAPE realShape() const;
 private:
-       /// This have to be at least 32 bits, but 64 or more does not hurt
-       typedef unsigned int ui32;
-
-       /** Representation: bit table
-         Layout of bit table:
-                  11 1111 111 122 222 222 2233
-         Bit 012 34 567 8901 2345 678 901 234 567 8901
-             FFF SS SSS SSSS CCCC EEE UUU NNN LLL
-             aaa ee hhh iiii oooo mmm nnn ooo aaa
-             mmm rr aaa zzzz llll ppp ddd uuu ttt
-
-         Some might think this is a dirty representation, but it gives
-         us at least 25% speed-up, so why not?
-       */
-       ui32 bits;
-
        ///
-       enum FONT_POSITION {
-               ///
-               Fam_Pos =  0,
-               ///
-               Ser_Pos =  3,
+       struct FontBits {
                ///
-               Sha_Pos =  5,
+               bool operator==(FontBits const & fb1) const;
                ///
-               Siz_Pos =  8,
+               bool operator!=(FontBits const & fb1) const;
                ///
-               Col_Pos = 12,
+               FONT_FAMILY family;
                ///
-               Emp_Pos = 16,
+               FONT_SERIES series;
                ///
-               Und_Pos = 19,
-               ///
-               Nou_Pos = 22,
-               ///
-               Lat_Pos = 25
-       };
-
-       ///
-       enum FONT_MASK {
+               FONT_SHAPE shape;
                ///
-               Fam_Mask = 0x07,
+               FONT_SIZE size;
                ///
-               Ser_Mask = 0x03,
+               LColor::color color;
                ///
-               Sha_Mask = 0x07,
+               FONT_MISC_STATE emph;
                ///
-               Siz_Mask = 0x0f,
+               FONT_MISC_STATE underbar;
                ///
-               Col_Mask = 0x0f,
+               FONT_MISC_STATE noun;
                ///
-               Misc_Mask = 0x07
+               FONT_MISC_STATE number;
        };
+
+       ///
+       FontBits bits;
+       
+       ///
+       Language const * lang;
+       
        /// Sane font
-       enum {  sane = ui32(ROMAN_FAMILY) << Fam_Pos
-               | ui32(MEDIUM_SERIES) << Ser_Pos
-               | ui32(UP_SHAPE) << Sha_Pos
-               | ui32(SIZE_NORMAL) << Siz_Pos
-               | ui32(NONE) << Col_Pos
-               | ui32(OFF) << Emp_Pos
-               | ui32(OFF) << Und_Pos
-               | ui32(OFF) << Nou_Pos
-               | ui32(OFF) << Lat_Pos};
+       static FontBits sane;
+       
        /// All inherit font
-       enum{ inherit = ui32(INHERIT_FAMILY) << Fam_Pos
-               | ui32(INHERIT_SERIES) << Ser_Pos
-               | ui32(INHERIT_SHAPE) << Sha_Pos
-               | ui32(INHERIT_SIZE) << Siz_Pos
-               | ui32(INHERIT_COLOR) << Col_Pos
-               | ui32(INHERIT) << Emp_Pos
-               | ui32(INHERIT) << Und_Pos
-               | ui32(INHERIT) << Nou_Pos
-               | ui32(INHERIT) << Lat_Pos};
+       static FontBits inherit;
  
        /// All ignore font
-       enum{ ignore = ui32(IGNORE_FAMILY) << Fam_Pos
-              | ui32(IGNORE_SERIES) << Ser_Pos
-              | ui32(IGNORE_SHAPE) << Sha_Pos
-              | ui32(IGNORE_SIZE) << Siz_Pos
-              | ui32(IGNORE_COLOR) << Col_Pos
-              | ui32(IGNORE) << Emp_Pos
-              | ui32(IGNORE) << Und_Pos
-              | ui32(IGNORE) << Nou_Pos
-              | ui32(IGNORE) << Lat_Pos};
+       static FontBits ignore;
+
        /// Updates a misc setting according to request
        LyXFont::FONT_MISC_STATE setMisc(LyXFont::FONT_MISC_STATE newfont,
                                         LyXFont::FONT_MISC_STATE org);
-
-       /// Converts logical attributes to concrete shape attribute
-       LyXFont::FONT_SHAPE realShape() const;
-
-       ///
-       XFontStruct* getXFontstruct() const;
 };
 
-ostream & operator<<(ostream &, LyXFont::FONT_MISC_STATE);
-
-inline LyXFont::LyXFont()
-{
-       bits = sane;
-}
-
-
-inline LyXFont::LyXFont(LyXFont const & x)
-{
-       bits = x.bits;
-}
-
-
-inline LyXFont::LyXFont(LyXFont::FONT_INIT1)
-{
-       bits = inherit;
-}
-
-
-inline LyXFont::LyXFont(LyXFont::FONT_INIT2)
-{
-       bits = ignore;
-}
-
 
-inline LyXFont::LyXFont(LyXFont::FONT_INIT3)
+inline
+LyXFont::FONT_SHAPE LyXFont::shape() const
 {
-       bits = sane;
+       return bits.shape;
 }
 
 
-inline LyXFont & LyXFont::operator=(LyXFont const & x) 
+inline
+LyXFont::FONT_FAMILY LyXFont::family() const 
 {
-       bits = x.bits;
-       return *this;
+       return bits.family;
 }
 
 
- // You don't have to understand the stuff below :-)
- // It works, and it's bloody fast. (Asger)
-inline LyXFont::FONT_FAMILY LyXFont::family() const 
+inline
+LyXFont::FONT_SERIES LyXFont::series() const
 {
-       return LyXFont::FONT_FAMILY((bits >> Fam_Pos) & Fam_Mask);
+       return bits.series;
 }
 
 
-inline LyXFont::FONT_SERIES LyXFont::series() const
+inline
+LyXFont::FONT_SIZE LyXFont::size() const
 {
-       return LyXFont::FONT_SERIES((bits >> Ser_Pos) & Ser_Mask);
+       return bits.size;
 }
 
 
-inline LyXFont::FONT_SHAPE LyXFont::shape() const
+inline
+LyXFont::FONT_MISC_STATE LyXFont::emph() const
 {
-       return LyXFont::FONT_SHAPE((bits >> Sha_Pos) & Sha_Mask);
+       return bits.emph;
 }
 
 
-inline LyXFont::FONT_SIZE LyXFont::size() const
+inline
+LyXFont::FONT_MISC_STATE LyXFont::noun() const
 {
-       return LyXFont::FONT_SIZE((bits >> Siz_Pos) & Siz_Mask);
+       return bits.noun;
 }
 
 
-inline LyXFont::FONT_MISC_STATE LyXFont::emph() const
+inline
+bool LyXFont::isSymbolFont() const
 {
-       return LyXFont::FONT_MISC_STATE((bits >> Emp_Pos) & Misc_Mask);
-}
-
-
-inline LyXFont::FONT_MISC_STATE LyXFont::underbar() const
-{
-       return LyXFont::FONT_MISC_STATE((bits >> Und_Pos) & Misc_Mask);
-}
-
-
-inline LyXFont::FONT_MISC_STATE LyXFont::noun() const
-{
-       return LyXFont::FONT_MISC_STATE((bits >> Nou_Pos) & Misc_Mask);
-}
-
-
-inline LyXFont::FONT_MISC_STATE LyXFont::latex() const 
-{
-       return LyXFont::FONT_MISC_STATE((bits >> Lat_Pos) & Misc_Mask);
-}
-
-
-inline LyXFont::FONT_COLOR LyXFont::color() const 
-{
-       return LyXFont::FONT_COLOR((bits >> Col_Pos) & Col_Mask);
-}
-
-
-inline LyXFont & LyXFont::setFamily(LyXFont::FONT_FAMILY f)
-{
-       bits &= ~(Fam_Mask << Fam_Pos);
-       bits |= ui32(f) << Fam_Pos;
-       return *this;
-}
-
-
-inline LyXFont & LyXFont::setSeries(LyXFont::FONT_SERIES s)
-{
-       bits &= ~(Ser_Mask << Ser_Pos);
-       bits |= ui32(s) << Ser_Pos;
-       return *this;
-}
-
-
-inline LyXFont & LyXFont::setShape(LyXFont::FONT_SHAPE s)
-{
-       bits &= ~(Sha_Mask << Sha_Pos);
-       bits |= ui32(s) << Sha_Pos;
-       return *this;
-}
-
-
-inline LyXFont & LyXFont::setSize(LyXFont::FONT_SIZE s)
-{
-       bits &= ~(Siz_Mask << Siz_Pos);
-       bits |= ui32(s) << Siz_Pos;
-       return *this;
-}
-
-
-inline LyXFont & LyXFont::setEmph(LyXFont::FONT_MISC_STATE e)
-{
-       bits &= ~(Misc_Mask << Emp_Pos);
-       bits |= ui32(e) << Emp_Pos;
-       return *this;
-}
-
-
-inline LyXFont & LyXFont::setUnderbar(LyXFont::FONT_MISC_STATE u)
-{
-       bits &= ~(Misc_Mask << Und_Pos);
-       bits |= ui32(u) << Und_Pos;
-       return *this;
+       switch (family()) {
+       case LyXFont::SYMBOL_FAMILY:
+       case LyXFont::CMSY_FAMILY:
+       case LyXFont::CMM_FAMILY:
+       case LyXFont::CMEX_FAMILY:
+       case LyXFont::MSA_FAMILY:
+       case LyXFont::MSB_FAMILY:
+               return true;
+       default:
+               return false;
+       }
 }
 
+///
+std::ostream & operator<<(std::ostream &, LyXFont::FONT_MISC_STATE);
 
-inline LyXFont & LyXFont::setNoun(LyXFont::FONT_MISC_STATE n)
-{
-       bits &= ~(Misc_Mask << Nou_Pos);
-       bits |= ui32(n) << Nou_Pos;
-       return *this;
-}
-
-inline LyXFont & LyXFont::setLatex(LyXFont::FONT_MISC_STATE l)
+///
+inline
+bool operator==(LyXFont const & font1, LyXFont const & font2)
 {
-       bits &= ~(Misc_Mask << Lat_Pos);
-       bits |= ui32(l) << Lat_Pos;
-       return *this;
+       return font1.bits == font2.bits &&
+               font1.lang == font2.lang;
 }
 
-
-inline LyXFont & LyXFont::setColor(LyXFont::FONT_COLOR c)
+///
+inline
+bool operator!=(LyXFont const & font1, LyXFont const & font2)
 {
-       bits &= ~(Col_Mask << Col_Pos);
-       bits |= ui32(c) << Col_Pos;
-       return *this;
+       return !(font1 == font2);
 }
 #endif