144 lines
7.3 KiB
C++
Executable File
144 lines
7.3 KiB
C++
Executable File
/***************************************************************************
|
|
* font.h is part of Math Graphic Library
|
|
* Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru> *
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU Library General Public License as *
|
|
* published by the Free Software Foundation; either version 3 of the *
|
|
* License, or (at your option) any later version. *
|
|
* *
|
|
* This program 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 General Public License for more details. *
|
|
* *
|
|
* You should have received a copy of the GNU Library General Public *
|
|
* License along with this program; if not, write to the *
|
|
* Free Software Foundation, Inc., *
|
|
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
|
***************************************************************************/
|
|
//-----------------------------------------------------------------------------
|
|
#ifndef _MGL_FONT_H_
|
|
#define _MGL_FONT_H_
|
|
|
|
#include "mgl2/define.h"
|
|
//-----------------------------------------------------------------------------
|
|
#define MGL_FONT_BOLD 0x01000000 // This value is used binary
|
|
#define MGL_FONT_ITAL 0x02000000 // This value is used binary
|
|
#define MGL_FONT_BOLD_ITAL 0x03000000
|
|
#define MGL_FONT_WIRE 0x04000000
|
|
#define MGL_FONT_OLINE 0x08000000 // This value is used binary
|
|
#define MGL_FONT_ULINE 0x10000000
|
|
#define MGL_FONT_ZEROW 0x20000000 // internal codes
|
|
#define MGL_FONT_UPPER 0x40000000
|
|
#define MGL_FONT_LOWER 0x80000000
|
|
#define MGL_FONT_ROMAN 0xfcffffff
|
|
#define MGL_FONT_MASK 0x00ffffff
|
|
#define MGL_COLOR_MASK 0xffffff00
|
|
#define MGL_FONT_STYLE 0x3f000000
|
|
//-----------------------------------------------------------------------------
|
|
struct mglGlyphDescr
|
|
{
|
|
wchar_t id; ///< Unicode ID for glyph
|
|
int tr[4]; ///< Shift of glyph description by triangles (for solid font)
|
|
int ln[4]; ///< Shift of glyph description by lines (for wire font)
|
|
short numt[4]; ///< Number of triangles in glyph description (for solid font)
|
|
short numl[4]; ///< Number of lines in glyph description (for wire font)
|
|
short width[4]; ///< Width of glyph for wire font
|
|
mglGlyphDescr() { memset(this,0,sizeof(mglGlyphDescr)); }
|
|
};
|
|
inline bool operator<(const mglGlyphDescr &a,const mglGlyphDescr &b) { return a.id<b.id; }
|
|
inline bool operator>(const mglGlyphDescr &a,const mglGlyphDescr &b) { return a.id>b.id; }
|
|
#if defined(_MSC_VER)
|
|
template class MGL_EXPORT std::vector<mglGlyphDescr>;
|
|
#endif
|
|
//-----------------------------------------------------------------------------
|
|
struct MGL_EXPORT mglTeXsymb { unsigned kod; const wchar_t *tex; };
|
|
const float mgl_fgen = 4*14;
|
|
/// Get font color, style and align for internal parser
|
|
bool MGL_EXPORT mglGetStyle(const char *how, int *font, int *align=0);
|
|
long MGL_EXPORT mgl_internal_code(unsigned s, const std::vector<mglGlyphDescr> &glyphs);
|
|
class mglBase;
|
|
//-----------------------------------------------------------------------------
|
|
/// Class for font typeface and text plotting procedures
|
|
class MGL_EXPORT mglFont
|
|
{
|
|
public:
|
|
mglBase *gr; ///< mglBase class used for drawing characters
|
|
mglFont(const char *name=0, const char *path=0);
|
|
virtual ~mglFont();
|
|
bool parse; ///< Parse LaTeX symbols
|
|
|
|
/// Load font data to memory. Normally used by constructor.
|
|
bool Load(const char *base, const char *path=0);
|
|
/// Load binary font data to memory. Normally used by constructor.
|
|
bool LoadBin(const char *base, const char *path=0);
|
|
/// Save binary font data
|
|
size_t SaveBin(const char *fname);
|
|
/// Free memory
|
|
void Clear();
|
|
/// Copy data from other font
|
|
void Copy(mglFont *);
|
|
/// Restore default font
|
|
void Restore();
|
|
/// Return true if font is loaded
|
|
inline bool Ready() const { return GetNumGlyph()!=0; }
|
|
|
|
/// Get height of text
|
|
float Height(int font) const MGL_FUNC_PURE;
|
|
/// Get height of text
|
|
float Height(const char *how) const MGL_FUNC_PURE;
|
|
/// Print text string for font specified by string
|
|
float Puts(const char *str,const char *how,float c1,float c2) const;
|
|
/// Get width of text string for font specified by string
|
|
float Width(const char *str,const char *how) const;
|
|
/// Print text string for font specified by string
|
|
float Puts(const wchar_t *str,const char *how,float c1,float c2) const;
|
|
/// Get width of text string for font specified by string
|
|
float Width(const wchar_t *str,const char *how) const;
|
|
|
|
/// Get internal code for symbol
|
|
inline long Internal(unsigned s) const { return mgl_internal_code(s,glyphs); }
|
|
/// Return number of glyphs
|
|
inline unsigned GetNumGlyph() const { return glyphs.size(); };
|
|
/// Return some of pointers
|
|
inline const short *GetTr(int s, long j) const { return Buf+glyphs[j].tr[s]; }
|
|
inline const short *GetLn(int s, long j) const { return Buf+glyphs[j].ln[s]; }
|
|
inline int GetNt(int s, long j) const { return glyphs[j].numt[s]; }
|
|
inline int GetNl(int s, long j) const { return glyphs[j].numl[s]; }
|
|
inline short GetWidth(int s, long j) const { return glyphs[j].width[s]; }
|
|
inline float GetFact(int s) const { return fact[s]; }
|
|
inline wchar_t GetUnicode(long j) const { return j>=0?glyphs[j].id:0; }
|
|
protected:
|
|
std::vector<mglGlyphDescr> glyphs; ///< information about know glyphs
|
|
float fact[4]; ///< Divider for width of glyph
|
|
short *Buf; ///< Buffer for glyph descriptions
|
|
size_t numb; ///< Buffer size
|
|
|
|
/// Print text string for font specified by integer constant
|
|
float Puts(const wchar_t *str,int font,int align, float c1,float c2) const;
|
|
/// Get width of text string for font specified by integer constant
|
|
float Width(const wchar_t *str,int font=0) const;
|
|
/// Replace TeX symbols by its UTF code and add font styles
|
|
void Convert(const wchar_t *str, unsigned *res) const;
|
|
|
|
/// Draw string recursively
|
|
/* x,y - position, f - factor, style: 0x1 - italic, 0x2 - bold, 0x4 - overline, 0x8 - underline, 0x10 - empty (not draw) */
|
|
float Puts(const unsigned *str, float x,float y,float f,int style,float c1,float c2) const;
|
|
/// Parse LaTeX command
|
|
unsigned Parse(const wchar_t *s) const;
|
|
/// Get symbol for character ch with given font style
|
|
unsigned Symbol(char ch) const MGL_FUNC_PURE;
|
|
private:
|
|
float get_ptr(long &i,unsigned *str, unsigned **b1, unsigned **b2,float &w1,float &w2, float f1, float f2, int st) const;
|
|
bool read_data(const char *fname, int s, std::vector<short> &buf, std::vector<mglGlyphDescr> &extra);
|
|
void main_copy();
|
|
bool read_main(const char *fname, std::vector<short> &buf);
|
|
inline void mem_alloc(long numg) { glyphs.resize(numg); }
|
|
bool read_def();
|
|
void draw_ouline(int st, float x, float y, float f, float g, float ww, float ccol) const;
|
|
};
|
|
//-----------------------------------------------------------------------------
|
|
#endif
|
|
//-----------------------------------------------------------------------------
|