/********************************************************************************
*                                                                               *
*                               F o n t   O b j e c t                           *
*                                                                               *
*********************************************************************************
* Copyright (C) 1997,2003 by Jeroen van der Zijp.   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;                         *
* version 2.1 of the License.                                                   *
*                                                                               *
* 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.    *
*********************************************************************************
* $Id: FXPostscriptFont.h,v 1.28 2003/05/20 16:46:06 fox Exp $                  *
********************************************************************************/


// The above rights relate to the file FXFont upon which this is based.
// There are adjustments here by A C Norman who first notes the general FOX
// extension to the LGPL that permits distribution of statically linked
// binaries without consequence, and who explicitly makes his stuff available
// under the FOX or any more permissive license.

/* Signature: 59750f30 14-Apr-2006 */


#ifndef FXPOSTSCRIPTFONT_H
#define FXPOSTSCRIPTFONT_H

#include <FXFont.h>

namespace FX {

// I would rather like to override a bunch of things in FXFont, but they
// are not virtual. Thus I need a work-around.

// Define a version of FOX where these patches become unnecessary needed.
// This is in that hope that at some stage FOX will make more functions
// within FXFont virtual...

#define FONT_MAJOR 99
#define FONT_MINOR 99
#define FONT_LEVEL 99

#ifndef INT_VERSION
#define INT_VERSION(a,b,c) (((a*1000) + b)*1000 + c)
#endif

#if INT_VERSION(FOX_MAJOR,FOX_MAJOR,FOX_LEVEL) < \
    INT_VERSION(FONT_MAJOR,FONT_MINOR,FONT_LEVEL)

#define FONT_NOT_VIRTUAL 1

#endif

#if INT_VERSION(FOX_MAJOR,FOX_MINOR,FOX_LEVEL) < INT_VERSION(1,1,49)
// At 1.1.49 the fields in FXFont relating to font properties were split
// so that having (eg) a single "size" field there were two fields
// "wantedSize" and "actualSize". My code works in terms of the new names
// but to support the older versions of FOX It maps the old names onto the
// new ones when relevant. Beware that a crude set of #define statements
// like this is dangerous in that if other classes have fields with the
// same names references to them would suffer.
//
#define WANTED_AND_ACTUAL 1
// #define actualName     name      etc etc et
#endif

/// Font class
class FXAPI FXPostscriptFont : public FXFont {
  FXDECLARE(FXPostscriptFont)
protected:
  struct font_info *metrics;
  FXPostscriptFont();
private:
  FXPostscriptFont(const FXPostscriptFont&);
  FXPostscriptFont &operator=(const FXPostscriptFont&);
public:

  /// Construct font from font description
  FXPostscriptFont(FXApp* a,const FXFontDesc& fontdesc);

  /// Construct a font with given face name, size in points(pixels), weight, slant, character set encoding, setwidth, and hints
#if (FOX_MINOR<=4)
  FXPostscriptFont(FXApp* a,const FXString& face,FXuint sz,FXuint wt=FONTWEIGHT_NORMAL,FXuint sl=FONTSLANT_REGULAR,FXuint enc=FONTENCODING_DEFAULT,FXuint setw=FONTSETWIDTH_DONTCARE,FXuint h=0);
#else
  FXPostscriptFont(FXApp* a,const FXString& face,FXuint sz,FXuint wt=Normal,FXuint sl=Straight,FXuint enc=FONTENCODING_DEFAULT,FXuint setw=0,FXuint h=0);
#endif

  /// Construct a font with given X11 font string (not supported!)
  FXPostscriptFont(FXApp* a,const FXString& nm);

  /// Create the font
  virtual void create();

  /// Find out if the font is monotype or proportional
  FXbool isFontMono() const;

  /// See if font has glyph for ch
  FXbool hasChar(FXint ch) const;

  /// Get first character glyph in font
#if (FOX_MINOR<=4)
  FXint getMinChar() const;
#else
  FXwchar getMinChar() const;
#endif

  /// Get last character glyph in font
#if (FOX_MINOR<=4)
  FXint getMaxChar() const;
#else
  FXwchar getMaxChar() const;
#endif

  /// Left bearing
  FXint leftBearing(FXchar ch) const;

//
// NB a FXPostscriptFont returns measurements here in units of
// millipoints.
//

  /// Right bearing
  FXint rightBearing(FXchar ch) const;

  /// Width of widest character in font
  FXint getFontWidth() const;

  /// Height of highest character in font
  FXint getFontHeight() const;

  /// Ascent from baseline
  FXint getFontAscent() const;

  /// Descent from baseline
  FXint getFontDescent() const;

  /// Get font leading [that is lead-ing as in Pb!]
  FXint getFontLeading() const;

  /// Get font line spacing
  FXint getFontSpacing() const;

  /// Calculate width of given text in this font
  FXint getTextWidth(const FXchar *text,FXuint n) const;

  /// Calculate width of given text in this font
  FXint getTextWidth(const FXString& text) const;

  /// Calculate height of given text in this font
  FXint getTextHeight(const FXchar *text,FXuint n) const;

  /// Calculate height of given text in this font
  FXint getTextHeight(const FXString& text) const;

  /**
   * List all fonts matching hints. If listFonts() returns TRUE then
   * fonts points to a newly-allocated array of length numfonts. It
   * is the caller's responsibility to free this array using FXFREE().
   */
#if (FOX_MINOR<=4)
  static FXbool listFonts(FXFontDesc*& fonts,FXuint& numfonts,const FXString& face,FXuint wt=FONTWEIGHT_DONTCARE,FXuint sl=FONTSLANT_DONTCARE,FXuint sw=FONTSETWIDTH_DONTCARE,FXuint en=FONTENCODING_DEFAULT,FXuint h=0);
#else
  static FXbool listFonts(FXFontDesc*& fonts,FXuint& numfonts,const FXString& face,FXuint wt=Normal,FXuint sl=Straight,FXuint sw=NonExpanded,FXuint en=FONTENCODING_DEFAULT,FXuint h=0);
#endif

  /// Destroy font
  virtual ~FXPostscriptFont();
  };


}

#endif

