#include <stdio.h>
#include "pico/stdlib.h"
#include "pfnfont.h"

__asm(\
  ".section \".rodata\" \n"
  ".balign 4\n"

  ".global _pfnfont_data\n"
  ".global _pfnfont_data_len\n"

  "_pfnfont_data:\n"
  ".incbin \"shnmk14u.pfn\"\n"
  ".set _pfnfont_data_len, . - _pfnfont_data\n"
  ".section \".text\"\n"
);

extern const uint8_t _pfnfont_data[];
extern uint32_t _pfnfont_data_len;

// ターミナルにアスキーアートとしてフォントを描画するコールバック関数
void draw_font_to_terminal(font_gryph_t *gryph, int x, int y) {
    printf("--- Glyph at (%d, %d) ---\n", x, y);
    for (int r = 0; r < gryph->height; r++) {
        for (int c = 0; c < gryph->width; c++) {
            // ビットマップからピクセルデータを取得
            int bit_index = r * gryph->width + c;
            int byte_index = bit_index / 8;
            int bit_offset = 7 - (bit_index % 8);
            if ((gryph->bitmap[byte_index] >> bit_offset) & 1) {
                printf("#"); // ピクセルがオン
            } else {
                printf(" "); // ピクセルがオフ
            }
        }
        printf("\n");
    }
    printf("-----------------------\n");
}

int main()
{
    stdio_init_all();

    // 描画コールバック関数を渡してPFNFontオブジェクトを生成
    PFNFont *pfn = new PFNFont((uint8_t *)_pfnfont_data, (size_t)&_pfnfont_data_len, draw_font_to_terminal);

    // フォントが正しく読み込めたかチェック
    if (pfn->isValid()) {
        printf("Font loaded successfully.\n");
        pfn->draw_string("Picoで日本語表示!", 0, 0);
    } else {
        printf("Failed to load font.\n");
    }

    // メモリを解放
    delete pfn;
    
    while (true)
        tight_loop_contents();
}
