Skip to content
Snippets Groups Projects
FXFont.i 12.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • /***********************************************************************
     * FXRuby -- the Ruby language bindings for the FOX GUI toolkit.
    
     * Copyright (c) 2001-2009 by Lyle Johnson. All Rights Reserved.
    
     *
     * This library is free software; you can redistribute it and/or
     * modify it under the terms of the GNU Lesser General Public
     * License as published by the Free Software Foundation; either
     * version 2.1 of the License, or (at your option) any later version.
     *
     * This library is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     * Lesser General Public License for more details.
     *
     * You should have received a copy of the GNU Lesser General Public
     * License along with this library; if not, write to the Free Software
     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     *
     * For further information please contact the author by e-mail
    
     * at "lyle@lylejohnson.name".
    
     ***********************************************************************/
    
    %rename("family")  FXFont::getFamily() const;
    %rename("foundry") FXFont::getFoundry() const;
    %rename("flags")   FXFont::getFlags() const;
    %rename("angle")   FXFont::getAngle() const;
    %rename("font")    FXFont::getFont() const;
    
    /// Font character set encoding
    enum FXFontEncoding {
      FONTENCODING_DEFAULT,         /// Don't care character encoding
    
      FONTENCODING_ISO_8859_1   = 1,        /// West European (Latin1)
      FONTENCODING_ISO_8859_2   = 2,        /// Central and East European (Latin2)
      FONTENCODING_ISO_8859_3   = 3,        /// Esperanto (Latin3)
      FONTENCODING_ISO_8859_4   = 4,
      FONTENCODING_ISO_8859_5   = 5,                        /// Cyrillic (almost obsolete) 
      FONTENCODING_ISO_8859_6   = 6,        /// Arabic
      FONTENCODING_ISO_8859_7   = 7,        /// Greek
      FONTENCODING_ISO_8859_8   = 8,        /// Hebrew
      FONTENCODING_ISO_8859_9   = 9,        /// Turkish (Latin5)
      FONTENCODING_ISO_8859_10  = 10,
      FONTENCODING_ISO_8859_11  = 11,       /// Thai
      FONTENCODING_ISO_8859_13  = 13,       /// Baltic
      FONTENCODING_ISO_8859_14  = 14,
      FONTENCODING_ISO_8859_15  = 15,
      FONTENCODING_ISO_8859_16  = 16,
      FONTENCODING_KOI8         = 17,
      FONTENCODING_KOI8_R       = 18,                       /// Russian
      FONTENCODING_KOI8_U       = 19,                       /// Ukrainian
      FONTENCODING_KOI8_UNIFIED = 20,
    
      FONTENCODING_CP437        = 437,      /// IBM-PC code page
      FONTENCODING_CP850        = 850,      /// IBMPC Multilingual
      FONTENCODING_CP851        = 851,      /// IBM-PC Greek
      FONTENCODING_CP852        = 852,      /// IBM-PC Latin2
      FONTENCODING_CP855        = 855,      /// IBM-PC Cyrillic
      FONTENCODING_CP856        = 856,      /// IBM-PC Hebrew
      FONTENCODING_CP857        = 857,      /// IBM-PC Turkish
      FONTENCODING_CP860        = 860,      /// IBM-PC Portugese
      FONTENCODING_CP861        = 861,      /// IBM-PC Iceland
      FONTENCODING_CP862        = 862,      /// IBM-PC Israel
      FONTENCODING_CP863        = 863,      /// IBM-PC Canadian/French
      FONTENCODING_CP864        = 864,      /// IBM-PC Arabic
      FONTENCODING_CP865        = 865,      /// IBM-PC Nordic
      FONTENCODING_CP866        = 866,      /// IBM-PC Cyrillic #2
      FONTENCODING_CP869        = 869,      /// IBM-PC Greek #2
      FONTENCODING_CP870        = 870,      /// Latin-2 Multilingual
    
      FONTENCODING_CP1250       = 1250,     /// Windows Central European
      FONTENCODING_CP1251       = 1251,     /// Windows Russian
      FONTENCODING_CP1252       = 1252,     /// Windows Latin1
      FONTENCODING_CP1253       = 1253,     /// Windows Greek
      FONTENCODING_CP1254       = 1254,     /// Windows Turkish
      FONTENCODING_CP1255       = 1255,     /// Windows Hebrew
      FONTENCODING_CP1256       = 1256,     /// Windows Arabic
      FONTENCODING_CP1257       = 1257,     /// Windows Baltic
      FONTENCODING_CP1258       = 1258,     /// Windows Vietnam
      FONTENCODING_CP874        = 874,      /// Windows Thai
    
      FONTENCODING_UNICODE      = 9999,
    
      FONTENCODING_LATIN1      = FONTENCODING_ISO_8859_1,   /// Latin 1 (West European) 
      FONTENCODING_LATIN2      = FONTENCODING_ISO_8859_2,   /// Latin 2 (East European) 
      FONTENCODING_LATIN3      = FONTENCODING_ISO_8859_3,   /// Latin 3 (South European) 
      FONTENCODING_LATIN4      = FONTENCODING_ISO_8859_4,   /// Latin 4 (North European) 
      FONTENCODING_LATIN5      = FONTENCODING_ISO_8859_9,   /// Latin 5 (Turkish) 
      FONTENCODING_LATIN6      = FONTENCODING_ISO_8859_10,  /// Latin 6 (Nordic) 
      FONTENCODING_LATIN7      = FONTENCODING_ISO_8859_13,  /// Latin 7 (Baltic Rim)
      FONTENCODING_LATIN8      = FONTENCODING_ISO_8859_14,  /// Latin 8 (Celtic)
      FONTENCODING_LATIN9      = FONTENCODING_ISO_8859_15,  /// Latin 9 AKA Latin 0
      FONTENCODING_LATIN10     = FONTENCODING_ISO_8859_16,  /// Latin 10
    
      FONTENCODING_USASCII     = FONTENCODING_ISO_8859_1,   /// Latin 1
      FONTENCODING_WESTEUROPE  = FONTENCODING_ISO_8859_1,   /// Latin 1 (West European) 
      FONTENCODING_EASTEUROPE  = FONTENCODING_ISO_8859_2,   /// Latin 2 (East European) 
      FONTENCODING_SOUTHEUROPE = FONTENCODING_ISO_8859_3,   /// Latin 3 (South European) 
      FONTENCODING_NORTHEUROPE = FONTENCODING_ISO_8859_4,   /// Latin 4 (North European) 
      FONTENCODING_CYRILLIC    = FONTENCODING_ISO_8859_5,   /// Cyrillic
      FONTENCODING_RUSSIAN     = FONTENCODING_KOI8,         /// Cyrillic
      FONTENCODING_ARABIC      = FONTENCODING_ISO_8859_6,   /// Arabic
      FONTENCODING_GREEK       = FONTENCODING_ISO_8859_7,   /// Greek
      FONTENCODING_HEBREW      = FONTENCODING_ISO_8859_8,   /// Hebrew
      FONTENCODING_TURKISH     = FONTENCODING_ISO_8859_9,   /// Latin 5 (Turkish) 
      FONTENCODING_NORDIC      = FONTENCODING_ISO_8859_10,  /// Latin 6 (Nordic) 
      FONTENCODING_THAI        = FONTENCODING_ISO_8859_11,  /// Thai
      FONTENCODING_BALTIC      = FONTENCODING_ISO_8859_13,  /// Latin 7 (Baltic Rim)
      FONTENCODING_CELTIC      = FONTENCODING_ISO_8859_14   /// Latin 8 (Celtic)
      };
    
    
    /// Font style
    struct FXFontDesc {
      FXFontDesc();
      FXchar          face[116];                /// Face name
      FXushort        size;                     /// Size in deci-points
      FXushort        weight;                   /// Weight [light, normal, bold, ...]
      FXushort        slant;                    /// Slant [normal, italic, oblique, ...]
      FXushort        setwidth;                 /// Set width [normal, condensed, expanded, ...]
      FXushort        encoding;                 /// Encoding of character set
      FXushort        flags;                    /// Flags
      ~FXFontDesc();
      };
    
    
    /// Font class
    class FXFont : public FXId {
    protected:
      FXString  wantedName;         // Desired font font name
      FXString  actualName;         // Matched font font name
      FXushort  wantedSize;         // Font size (points*10)
      FXushort  actualSize;         // Actual size that was matched
      FXushort  wantedWeight;       // Font weight
      FXushort  actualWeight;       // Font weight
      FXushort  wantedSlant;        // Font slant
      FXushort  actualSlant;        // Font slant
      FXushort  wantedSetwidth;     // Relative setwidth
      FXushort  actualSetwidth;     // Relative setwidth
      FXushort  wantedEncoding;     // Character set encoding
      FXushort  actualEncoding;     // Character set encoding
      FXushort  hints;              // Matching hint flags
      FXushort  flags;              // Actual flags
      FXshort   angle;              // Angle
      void     *font;                 // Info about the font
    protected:
      FXFont();
      void* match(const FXString& wantfamily,const FXString& wantforge,FXuint wantsize,FXuint wantweight,FXuint wantslant,FXuint wantsetwidth,FXuint wantencoding,FXuint wanthints,FXint res);
    public:
    
      /// Font pitch hints
      enum {
        Fixed          = 1,         /// Fixed pitch, mono-spaced
        Variable       = 2          /// Variable pitch, proportional spacing
        };
    
      /// Font style hints
      enum {
        Decorative     = 4,         /// Fancy fonts
        Modern         = 8,         /// Monospace typewriter font
        Roman          = 16,        /// Variable width times-like font, serif
        Script         = 32,        /// Script or cursive
        Swiss          = 64,        /// Helvetica/swiss type font, sans-serif
        System         = 128,       /// System font
        X11            = 256,       /// Raw X11 font string
        Scalable       = 512,       /// Scalable fonts
        Polymorphic    = 1024,      /// Polymorphic fonts, e.g. parametric weight, slant, etc.
        Rotatable      = 2048       /// Rotatable fonts
        };
    
      /// Font slant options
      enum {
        ReverseOblique = 1,         /// Reversed oblique
        ReverseItalic  = 2,         /// Reversed italic
        Straight       = 5,         /// Straight, not slanted
        Italic         = 8,         /// Italics
        Oblique        = 9          /// Oblique slant
        };
    
      /// Font weight options
      enum {
        Thin           = 10,        /// Thin
        ExtraLight     = 20,        /// Extra light
        Light          = 30,        /// Light
        Normal         = 40,        /// Normal or regular weight
        Medium         = 50,        /// Medium bold face
        DemiBold       = 60,        /// Demi bold face
        Bold           = 70,        /// Bold face
        ExtraBold      = 80,        /// Extra
        Black          = 90         /// Black
        };
    
      /// Condensed or expanded options
      enum {
        UltraCondensed = 50,        /// Ultra condensed printing
        ExtraCondensed = 63,        /// Extra condensed
        Condensed      = 75,        /// Condensed
        SemiCondensed  = 87,        /// Semi-condensed
        NonExpanded    = 100,       /// Regular printing
        SemiExpanded   = 113,       /// Semi expanded
        Expanded       = 125,       /// Expanded
        ExtraExpanded  = 150,       /// Extra expanded
        UltraExpanded  = 200        /// Ultra expanded
        };
    
    public:
      %extend {
        /**
        * Construct a font with given font description of the form:
        *
        *     fontname [ "[" foundry "]" ] ["," size ["," weight ["," slant ["," setwidth ["," encoding ["," hints]]]]]]
        *
        * For example:
        *
        *     "helvetica [bitstream],120,bold,italic,normal,iso8859-1,0"
        *
        * Typically, at least the font name, and size must be given for
        * normal font matching.  As a special case, raw X11 fonts can also be
        * passed, for example:
        *
        *     "9x15bold"
        *
        * Note: use of the raw X11 fonts is stronly discouraged.
        */
        FXFont(FXApp* a,const FXString& string){
          return new FXRbFont(a,string);
          }
      
        /**
        * Construct a font with given name, size in points, weight, slant, character set
        * encoding, setwidth, and hints.
        * The font name may be comprised of a family name and optional foundry name enclosed in 
        * square brackets, for example, "helvetica [bitstream]".
        */
        FXFont(FXApp* a,const FXString& face,FXuint sz,FXuint wt=FXFont::Normal,FXuint slant=FXFont::Straight,FXuint encoding=FONTENCODING_DEFAULT,FXuint setwidth=FXFont::NonExpanded,FXuint h=0){
          return new FXRbFont(a,face,sz,wt,slant,encoding,setwidth,h);
          }
      
        /// Construct font from font description
        FXFont(FXApp* a,const FXFontDesc& fontdesc){
          return new FXRbFont(a,fontdesc);
          }
        }
    
      /// Return family part of name
      FXString getFamily() const;
    
      /// Return foundry part of name
      FXString getFoundry() const;
    
      /// Get font family name
      const FXString& getName() const;
      
      /// Get actual family name
      const FXString& getActualName() const;
    
      /// Get size in deci-points
      FXuint getSize() const;
      
      /// Get actual size in deci-points
      FXuint getActualSize() const;
    
      /// Get font weight
      FXuint getWeight() const;
    
      /// Get actual font weight
      FXuint getActualWeight() const;
    
      /// Get slant
      FXuint getSlant() const;
      
      /// Get actual slant
      FXuint getActualSlant() const;
    
      /// Get character set encoding
      FXuint getEncoding() const;
    
      /// Get actual character set encoding
      FXuint getActualEncoding() const;
    
      /// Get setwidth
      FXuint getSetWidth() const;
    
      /// Get actual setwidth
      FXuint getActualSetWidth() const;
    
      /// Get hints
      FXuint getHints() const;
    
      /// Get flags
      FXuint getFlags() const;
    
      %extend {
        // Get font description
        FXFontDesc getFontDesc() const {
          FXFontDesc fontdesc;
          self->getFontDesc(fontdesc);
          return fontdesc;
        }
      }
      
      /// Return angle
      FXint getAngle() const;
    
      /**
      * Return the font description as a string suitable for
      * parsing with setFont(), see above.
      */
      FXString getFont() const;
    
      %extend {
        // List all fonts matching hints (returns an array of FXFontDesc objects)
        static VALUE listFonts(const FXString& face,FXuint wt=0,FXuint sl=0,FXuint sw=0,FXuint en=0,FXuint h=0) {
          FXFontDesc* fonts;
          FXuint numfonts;
          VALUE results = rb_ary_new();
          if (FXFont::listFonts(fonts, numfonts, face, wt, sl, sw, en, h)) {
            for (FXuint i = 0; i < numfonts; i++)
              rb_ary_push(results, to_ruby(new FXFontDesc(fonts[i])));
            FXFREE(&fonts);
          }
          return results;
        }
      }
    
      /// Destroy font
      virtual ~FXFont();
      };
    
    
    DECLARE_FXOBJECT_VIRTUALS(FXFont)
    DECLARE_FXID_VIRTUALS(FXFont)
    DECLARE_FXFONT_VIRTUALS(FXFont)