flipper_cyrillic_example/font/bdfconv/bdf_font.h
2023-05-02 21:01:20 +03:00

163 lines
4.5 KiB
C

/*
bdf_font.h
*/
#ifndef _BDF_FONT_H
#define _BDF_FONT_H
#include <stdio.h>
#include "bdf_glyph.h"
#define BDF_LINE_LEN 1024
#define BDF_BBX_MODE_MINIMAL 0
#define BDF_BBX_MODE_HEIGHT 1
#define BDF_BBX_MODE_MAX 2
#define BDF_BBX_MODE_M8 3
#define BDF_BBX_MODE_5X7 4
struct _bdf_font_struct
{
int is_verbose;
bg_t **glyph_list;
int glyph_cnt;
int glyph_max;
/* variables for the parser */
char line_buf[BDF_LINE_LEN];
int line_pos;
int is_bitmap_parsing;
long encoding;
long dwidth_x;
long dwidth_y;
long bbx_w;
long bbx_h;
long bbx_x;
long bbx_y;
int bitmap_x; /* x position within bitmap parsing */
int bitmap_y; /* y position within bitmap parsing */
int glyph_pos; /* the position to which the glyph has been added in the list */
FILE *fp;
char *str_font; /* argument for FONT in bdf file */
char *str_copyright; /* argument for COPYRIGHT in bdf file */
long selected_glyphs; /* number of mapped glyphs */
int bbx_mode; /* bounding box mode, one of BDF_BBX_MODE_xxx */
/* bf_CalculateMaxBBX */
bbx_t max; /* max bbx, calculated from the mapped glyphs by bf_CalculateMaxBBX */
/* remember which encoding has caused the max value */
long enc_w;
long enc_h;
long enc_x;
long enc_y;
/* bf_CalculateMinMaxDWidth */
long dx_min; /* calculated minimum and maximum dwidth value from the mapped glyphs by bf_CalculateMinMaxDWidth */
long dx_max; /* it is a monospaced font if max and min values are identical */
/* bf_CalculateMinMaxDWidth */
long x_min; /* calculated minimum and maximum bbx.x value from the mapped glyphs by bf_CalculateMinMaxDWidth */
long x_max; /* it is a monospaced font if x_min >= 0 */
/* bf_CalculateMaxBitFieldSize */
int bbx_x_max_bit_size;
int bbx_y_max_bit_size;
int bbx_w_max_bit_size;
int bbx_h_max_bit_size;
int dx_max_bit_size;
/* font target data */
uint8_t *target_data;
int target_max;
int target_cnt;
int tile_h_size; // new 2019 8x8 font format
int tile_v_size; // new 2019 8x8 font format
};
/* bdf_font.c */
/* output error & log messages */
void bf_Error(bf_t *bf, char *fmt, ...);
void bf_Log(bf_t *bf, char *fmt, ...);
/* constructor/destructor */
bf_t *bf_Open(int is_verbose, int bbx_mode);
void bf_Close(bf_t *bf);
/* returns glyph position or -1 */
int bf_AddGlyph(bf_t *bf);
/* add binary data */
void bf_ClearTargetData(bf_t *bf);
int bf_AddTargetData(bf_t *bf, uint8_t data);
void bf_CalculateSelectedNumberOfGlyphs(bf_t *bf);
void bf_ReduceAllGlyph(bf_t *bf);
int bf_GetIndexByEncoding(bf_t *bf, long encoding);
/* only shows glyphs, which will be mapped (call bf_Map() first) */
void bf_ShowAllGlyphs(bf_t *bf, bbx_t *bbx);
void bf_ShowMonospaceStatistics(bf_t *bf);
/* calculate the max bbx for all mapped glyphs (call bf_Map() first) */
void bf_CalculateMaxBBX(bf_t *bf);
void bf_CalculateMinMaxDWidth(bf_t *bf);
void bf_copy_bbx_and_update_shift(bf_t *bf, bbx_t *target_bbx, bg_t *bg);
void bf_CalculateMaxBitFieldSize(bf_t *bf);
void bf_RLECompressAllGlyphs(bf_t *bf);
void bf_Generate8x8Font(bf_t *bf, int xo, int yo);
int bf_WriteUCGCByFilename(bf_t *bf, const char *filename, const char *fontname, const char *indent);
int bf_WriteU8G2CByFilename(bf_t *bf, const char *filename, const char *fontname, const char *indent);
bf_t *bf_OpenFromFile(const char *bdf_filename, int is_verbose, int bbx_mode, const char *map_str, const char *map_file_name, int font_format, int xo, int yo, int th, int tv);
/* bdf_parser.c */
int bf_ParseFile(bf_t *bf, const char *name);
/* bdf_map.c */
void bf_Map(bf_t *bf, const char *map_cmd_list);
int bf_MapFile(bf_t *bf, const char *map_file_name);
/* bdf_tga.c */
int tga_init(uint16_t w, uint16_t h);
void tga_clear(void);
void tga_set_pixel(uint16_t x, uint16_t y, uint8_t r, uint8_t g, uint8_t b);
void tga_save(const char *name);
void tga_set_font(uint8_t *font);
uint8_t *tga_get_glyph_data(uint16_t encoding);
int tga_get_char_width(void);
int tga_get_char_height(void);
unsigned tga_draw_glyph(unsigned x, unsigned y, uint16_t encoding, int is_hints);
unsigned tga_draw_string(unsigned x, unsigned y, const char *s, int is_hints, unsigned max_dx);
int tga_is_pixel_intersection(void);
void tga_clear_pixel_intersection(void);
/* bdf_kern.c */
unsigned bdf_calculate_kerning(uint8_t *font, uint16_t e1, uint16_t e2, uint8_t min_distance_in_per_cent_of_char_width);
void bdf_calculate_all_kerning(bf_t *bf, const char *filename, const char *fontname, uint8_t min_distance_in_per_cent_of_char_width);
#endif