// Copyright Scott Ellis (mail@scottellis.com.au) 2005
// This software is licenced under the GPL (General Public Licence)
// available at http://www.gnu.org/copyleft/gpl.html
{$IFNDEF FONT_SERVICE_API}
{$DEFINE FONT_SERVICE_API}

const
// style flags
  DBFONTF_BOLD      = 1;
  DBFONTF_ITALIC    = 2;
  DBFONTF_UNDERLINE = 4;
  DBFONTF_STRIKEOUT = 8;
// flags for compatibility
  FIDF_APPENDNAME       = 1;   // append 'Name' to the setting used to store
                               // font face (as CLC settings require)
  FIDF_NOAS             = 2;   // disable the <prefix>As setting to prevent
                               // 'same as' behaviour
  FIDF_SAVEACTUALHEIGHT = 4;   // write the actual height of a test string to the db
  FIDF_SAVEPOINTSIZE    = 8;   // write the font point size to the db
// additional flags
  FIDF_DEFAULTVALID     = 32;  // the default font settings are valid - else,
                               // just use generic default
  FIDF_NEEDRESTART      = 64;  // setting changes will not take effect until
                               // miranda is restarted
  FIDF_ALLOWREREGISTER  = 128; // allow plugins to register this font again
                               // (i.e. override already registered settings
                               // such as flags)
  FIDF_ALLOWEFFECTS     = 256; // allow setting of font effects
                               // (i.e. underline and strikeout)
  FIDF_DISABLESTYLES    = 512; // don't allow to select font attributes (bold/underline/italics)
                               // FIDF_ALLOWEFFECTS has priority and will override this flag!

const
// font class
  FIDF_CLASSMASK    = $70000000;
  FIDF_CLASSHEADER  = $10000000;
  FIDF_CLASSGENERAL = $20000000;
  FIDF_CLASSSMALL   = $30000000;

type
// settings to be used for the value of 'deffontsettings' in the FontID
// structure below - i.e. defaults
  PFontSettings_tag = ^TFontSettings_tag;
  TFontSettings_tag = record
    colour  : TCOLORREF;
    size    : BYTE;
    style   : BYTE; // see the DBFONTF_* flags above
    charset : BYTE;
    szFace  : array[0..(LF_FACESIZE)-1] of AnsiChar;
  end;
  TFontSettings = TFontSettings_tag;
  PFontSettings = ^TFontSettings;

  PFontSettingsW_tag = ^TFontSettingsW_tag;
  TFontSettingsW_tag = record
    colour  : TCOLORREF;
    size    : BYTE;
    style   : BYTE; // see the DBFONTF_* flags above
    charset : BYTE;
    szFace  : array[0..(LF_FACESIZE)-1] of WideChar;
  end;
  TFontSettingsW = TFontSettingsW_tag;
  PFontSettingsW = ^TFontSettingsW;

type
// a font identifier structire - used for registering a font,
// and getting one out again
  PFontID_tag = ^TFontID_tag;
  TFontID_tag = record
    cbSize         : int;
    // [TRANSLATED-BY-CORE] group the font belongs to - this is the 'Font Group' list in the options page
    group          : array[0..63] of AnsiChar; 
    // [TRANSLATED-BY-CORE] the name of the font setting e.g. 'contacts' in the 'contact list' group
    name           : array[0..63] of AnsiChar; 
    // the 'module' in the database where the font data is stored
    dbSettingsGroup: array[0..31] of AnsiChar;
    // prepended to the settings used to store this font's data in the db
    prefix         : array[0..31] of AnsiChar;
    // bitwise OR of the FIDF_* flags above
    flags          : DWORD;
    deffontsettings: TFontSettings; // defaults, if flags & FIDF_DEFAULTVALID
    // controls the order in the font group in which the fonts are listed in the
    // UI (if order fields are equal, they will be ordered alphabetically by name)
    order          : int;
    backgroundGroup:array [0..63] of AnsiChar;
    backgroundName: array [0..63] of AnsiChar;
  end;
  TFontID = TFontID_tag;
  PFontID = ^TFontID;

  PFontIDW_tag = ^TFontIDW_tag;
  TFontIDW_tag = record
    cbSize         : int;
    // [TRANSLATED-BY-CORE] group the font belongs to - this is the 'Font Group' list in the options page
    group          : array[0..63] of WideChar; 
    // [TRANSLATED-BY-CORE] the name of the font setting e.g. 'contacts' in the 'contact list' group
    name           : array[0..63] of WideChar; 
    // the 'module' in the database where the font data is stored
    dbSettingsGroup: array[0..31] of AnsiChar;
    // prepended to the settings used to store this font's data in the db
    prefix         : array[0..31] of AnsiChar;
    // bitwise OR of the FIDF_* flags above
    flags          : DWORD;
    deffontsettings: TFontSettingsW; // defaults, if flags & FIDF_DEFAULTVALID
    // controls the order in the font group in which the fonts are listed in the
    // UI (if order fields are equal, they will be ordered alphabetically by name)
    order          : int;
    backgroundGroup:array [0..63] of WideChar;
    backgroundName: array [0..63] of WideChar;
  end;
  TFontIDW = TFontIDW_tag;
  PFontIDW = ^TFontIDW;

const
  {$IFNDEF WIN64}
  FontID_SIZEOF_V2  = 372;
  FontID_SIZEOF_V2A = 372;
  FontID_SIZEOF_V2U = 660;
  FontIDW_SIZEOF_V2 = 660;
  {$ELSE}
  FontID_SIZEOF_V2  = SizeOf(TFontID);
  FontID_SIZEOF_V2A = SizeOf(TFontID);
  FontID_SIZEOF_V2U = SizeOf(TFontIDW);
  FontIDW_SIZEOF_V2 = SizeOf(TFontIDW);
  {$ENDIF}

const
  { register a font }
  { wparam = pointer to FontID structure}
  { lparam = hLangpack }
  MS_FONT_REGISTERA:PAnsiChar = 'Font/Register';
  MS_FONT_REGISTERW:PAnsiChar = 'Font/RegisterW';

  { get a font }
  { wparam = pointer to FontID structure (only name and group matter) }
  { lParam = pointer to LOGFONT structure }
  { returns the font's colour }
  MS_FONT_GETA:PAnsiChar = 'Font/Get';
  MS_FONT_GETW:PAnsiChar = 'Font/GetW';

  { fired when a user modifies font settings, so reget your fonts }
  ME_FONT_RELOAD:PAnsiChar = 'Font/Reload';

type
  PColourID_tag = ^TColourID_tag;
  TColourID_tag = record
    cbSize          : int;
    group           : array[0..63] of AnsiChar;
    name            : array[0..63] of AnsiChar;
    dbSettingsGroup : array[0..31] of AnsiChar;
    setting         : array[0..31] of AnsiChar;
    flags           : DWORD;     // not used
    defcolour       : TCOLORREF; // default value
    order           : int;
  end;
  TColourID = TColourID_tag;
  PColourID = ^TColourID;

  PColourIDW_tag = ^TColourIDW_tag;
  TColourIDW_tag = record
    cbSize          : int;
    group           : array[0..63] of WideChar;
    name            : array[0..63] of WideChar;
    dbSettingsGroup : array[0..31] of AnsiChar;
    setting         : array[0..31] of AnsiChar;
    flags           : DWORD;     // not used
    defcolour       : TCOLORREF; // default value
    order           : int;
  end;
  TColourIDW = TColourIDW_tag;
  PColourIDW = ^TColourIDW;

const
  { register a colour (this should be used for everything except actual text colour for registered fonts) }
  { [note - a colour with name 'Background' has special meaning and will be used as the background colour of  }
  { the font list box in the options, for the given group] }
  { wparam = pointer to ColourID structure }
  { lparam = hLangpack }
  MS_COLOUR_REGISTERA:PAnsiChar = 'Colour/Register';
  MS_COLOUR_REGISTERW:PAnsiChar = 'Colour/RegisterW';

  { get a colour }
  { wparam = pointer to ColourID structure (only name and group matter) }
  { returns the colour (as COLORREF), or -1 if not found }
  MS_COLOUR_GETA:PAnsiChar = 'Colour/Get';
  MS_COLOUR_GETW:PAnsiChar = 'Colour/GetW';

  { fired when a user modifies font settings, so reget your fonts and colours }
  ME_COLOUR_RELOAD:PAnsiChar = 'Colour/Reload';

var
  MS_FONT_REGISTER  :PAnsiChar absolute MS_FONT_REGISTERW;
  MS_FONT_GET       :PAnsiChar absolute MS_FONT_GETW;
  MS_COLOUR_REGISTER:PAnsiChar absolute MS_COLOUR_REGISTERW;
  MS_COLOUR_GET     :PAnsiChar absolute MS_COLOUR_GETW;


//////////////////////////////////////////////////////////////////////////
//
//  EFFECTS
//
type
  FONTEFFECT_tag = record
    effectIndex    :byte;
    baseColour     :dword; // ARGB
    secondaryColour:dword; // ARGB
  end;
  TFONTEFFECT = FONTEFFECT_tag;

type
  EffectID_tag = record
    cbSize         :int;
    group          :array [0..63] of AnsiChar;
    name           :array [0..63] of AnsiChar;
    dbSettingsGroup:array [0..31] of AnsiChar;
    setting        :array [0..31] of AnsiChar;
    flags          :dword;
    defeffect      :TFONTEFFECT;
    order          :int;
    value          :TFONTEFFECT;
  end;
  PEffectID = ^TEffectID;
  TEffectID = EffectID_tag;

type
  EffectIDW_tag = record
    cbSize         :int;
    group          :array [0..63] of WideChar;
    name           :array [0..63] of WideChar;
    dbSettingsGroup:array [0..31] of AnsiChar;
    setting        :array [0..31] of AnsiChar;
    flags          :dword;
    defeffect      :TFONTEFFECT;
    order          :int;
    value          :TFONTEFFECT;
  end;
  PEffectIDW = ^TEffectIDW;
  TEffectIDW = EffectIDW_tag;

const
// register an effect
// wparam = (EffectID *)&effect_id
// lparam = hLangpack
  MS_EFFECT_REGISTERA:pAnsiChar = 'Effect/Register';
  MS_EFFECT_REGISTERW:pAnsiChar = 'Effect/RegisterW';

// get a effect
// wparam = (EffectID *)&effect_id (only name and group matter)
// lparam = (FONTEFFECT *)&effect
// rerturns 0, or -1 if not found
  MS_EFFECT_GET :pAnsiChar = 'Effect/Get';
  MS_EFFECT_GETW:pAnsiChar = 'Effect/GetW';

// fired when a user modifies font settings, so reget your fonts and colours
// wparam = lparam = 0
  ME_EFFECT_RELOAD:pAnsiChar = 'Effect/Reload';

{$ENDIF}