pfnfont.h 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #ifndef __PFNFONT
  2. #define __PFNFONT 1
  3. #include <stdint.h>
  4. #ifndef max
  5. #define max(a,b) ((a) > (b) ? (a) : (b))
  6. #endif
  7. #define PFN_FONT_NAME_SIZE 8
  8. #define PFN_SIG_SIZE 7
  9. #define PFN_VERSION 1
  10. typedef struct __attribute__((packed)) {
  11. char signature[PFN_SIG_SIZE]; // シグニチャ、文字列PINOTFN固定
  12. uint8_t version; // バージョン(1)
  13. char fontname[PFN_FONT_NAME_SIZE]; // フォント名(文字列shnmk14u)
  14. } pfn_font_header_t;
  15. typedef struct __attribute__((packed)) {
  16. uint8_t width; // フォントの幅
  17. uint8_t height; // フォントの高さ
  18. uint8_t codepoint_size; // コードポイントのサイズ(1~4)
  19. uint8_t attribute; // 予約(未使用)
  20. uint16_t num_glyphs; // このブロックに含まれるグリフの数
  21. } pfn_block_header_t;
  22. typedef struct __attribute__((packed)) {
  23. uint8_t codepoint;
  24. uint8_t glyph_data[];
  25. } pfn_glyph1_t;
  26. typedef struct __attribute__((packed)) {
  27. uint16_t codepoint;
  28. uint8_t glyph_data[];
  29. } pfn_glyph2_t;
  30. typedef struct __attribute__((packed)) {
  31. uint32_t codepoint;
  32. uint8_t glyph_data[];
  33. } pfn_glyph4_t;
  34. typedef struct __attribute__((packed)) {
  35. uint8_t width; // フォントの幅
  36. uint8_t height; // フォントの高さ
  37. uint8_t *bitmap; // フォントのビットマップ
  38. } font_gryph_t;
  39. class PFNFont {
  40. private:
  41. uint8_t *font_data; // フォントデータの先頭アドレス
  42. size_t font_size; // フォントデータのサイズ
  43. uint8_t *first_block; // 最初のフォントブロック
  44. font_gryph_t gryph_data; // get_gryph_dataが返すグリフデータ
  45. uint8_t *aligned_bitmap_buffer; // グリフのビットマップ用バッファ
  46. size_t bitmap_buffer_size; // ビットマップバッファのサイズ
  47. bool is_valid; // フォントデータが有効かどうかのフラグ
  48. char font_name[PFN_FONT_NAME_SIZE+1]; // フォント名
  49. uint8_t max_font_width; // フォントの最大幅
  50. uint8_t max_font_height; // フォントの最大高
  51. // コードポイントを含むフォントブロックを返す
  52. uint8_t* find_glyph_in_block(uint32_t codepoint);
  53. // グリフのコードポイントを返す
  54. inline uint32_t get_codepoint_from_glyph(uint8_t *glyph_data, uint8_t codepoint_size);
  55. // 文字列を描画するコールバック関数
  56. void (*draw_font_callback)(font_gryph_t *,int x, int y);
  57. public:
  58. // PFNFontコンストラクタ
  59. // uint8_t *pfn_font: pfnフォントデータの先頭アドレス
  60. // size_t pfnfont_size: pfnフォントデータのサイズ
  61. // void *draw_font(font_gryph_t *,int,int): 文字描画のコールバック関数
  62. PFNFont(uint8_t *pfn_font, size_t pfnfont_size, void (*draw_font)(font_gryph_t *,int,int));
  63. ~PFNFont();
  64. // フォントが有効かチェックする
  65. bool isValid() { return is_valid; }
  66. // UTF-8をUTF-32コードポイントに変換
  67. uint32_t utf8_to_codepoint(const char **utf8_str);
  68. // コードポイントからフォントグリフのデータを得る
  69. font_gryph_t *get_gryph_data(uint32_t codepoint);
  70. // 文字列を描画する
  71. void draw_string(const char *str, int x, int y);
  72. // このフォントデータの最大フォント高を返す
  73. uint8_t get_max_font_height() { return max_font_height; }
  74. // このフォントデータの最大フォント幅を返す
  75. uint8_t get_max_font_width() { return max_font_width; }
  76. // フォント名を返す
  77. const char *get_font_name() { return font_name; }
  78. };
  79. #endif