/* -*- mode: c++; c-basic-offset: 4 -*- */ /* A python interface to FreeType */ #ifndef _FT2FONT_H #define _FT2FONT_H #include <vector> #include <stdint.h> extern "C" { #include <ft2build.h> #include FT_FREETYPE_H #include FT_GLYPH_H #include FT_SFNT_NAMES_H #include FT_TYPE1_TABLES_H #include FT_TRUETYPE_TABLES_H } /* By definition, FT_FIXED as 2 16bit values stored in a single long. */ #define FIXED_MAJOR(val) (signed short)((val & 0xffff0000) >> 16) #define FIXED_MINOR(val) (unsigned short)(val & 0xffff) // the FreeType string rendered into a width, height buffer class FT2Image { public: FT2Image(); FT2Image(unsigned long width, unsigned long height); virtual ~FT2Image(); void resize(long width, long height); void draw_bitmap(FT_Bitmap *bitmap, FT_Int x, FT_Int y); void write_bitmap(FILE *fp) const; void draw_rect(unsigned long x0, unsigned long y0, unsigned long x1, unsigned long y1); void draw_rect_filled(unsigned long x0, unsigned long y0, unsigned long x1, unsigned long y1); unsigned char *get_buffer() { return m_buffer; } unsigned long get_width() { return m_width; } unsigned long get_height() { return m_height; } private: bool m_dirty; unsigned char *m_buffer; unsigned long m_width; unsigned long m_height; // prevent copying FT2Image(const FT2Image &); FT2Image &operator=(const FT2Image &); }; extern FT_Library _ft2Library; class FT2Font { public: FT2Font(FT_Open_Args &open_args, long hinting_factor); virtual ~FT2Font(); void clear(); void set_size(double ptsize, double dpi); void set_charmap(int i); void select_charmap(unsigned long i); void set_text( size_t N, uint32_t *codepoints, double angle, FT_Int32 flags, std::vector<double> &xys); int get_kerning(FT_UInt left, FT_UInt right, FT_UInt mode); void load_char(long charcode, FT_Int32 flags); void load_glyph(FT_UInt glyph_index, FT_Int32 flags); void get_width_height(long *width, long *height); void get_bitmap_offset(long *x, long *y); long get_descent(); // TODO: Since we know the size of the array upfront, we probably don't // need to dynamically allocate like this void get_xys(bool antialiased, std::vector<double> &xys); void draw_glyphs_to_bitmap(bool antialiased); void draw_glyph_to_bitmap(FT2Image &im, int x, int y, size_t glyphInd, bool antialiased); void get_glyph_name(unsigned int glyph_number, char *buffer); long get_name_index(char *name); int get_path_count(); void get_path(double *outpoints, unsigned char *outcodes); FT_Face &get_face() { return face; } FT2Image &get_image() { return image; } FT_Glyph &get_last_glyph() { return glyphs.back(); } size_t get_last_glyph_index() { return glyphs.size() - 1; } size_t get_num_glyphs() { return glyphs.size(); } long get_hinting_factor() { return hinting_factor; } private: FT2Image image; FT_Face face; FT_Matrix matrix; /* transformation matrix */ FT_Vector pen; /* untransformed origin */ FT_Error error; std::vector<FT_Glyph> glyphs; std::vector<FT_Vector> pos; FT_BBox bbox; FT_Pos advance; double angle; double ptsize; double dpi; long hinting_factor; void set_scalable_attributes(); // prevent copying FT2Font(const FT2Font &); FT2Font &operator=(const FT2Font &); }; #endif