pfnfont.h 3.1 KB

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