先看效果

直接上代码
#ifndef TEXT_OVERLAY_HPP
#define TEXT_OVERLAY_HPP
#include <cstdint>
#include <algorithm>
#include <cstdio>
#include <cstring>
namespace OVERLAY {
enum class PixFmt { YUV_NV12, RGB24 };
const uint8_t font8x8_ib8x8u[224][8] = {
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x7e, 0x81, 0xa5, 0x81, 0xbd, 0x99, 0x81, 0x7e},
{0x7e, 0xff, 0xdb, 0xff, 0xc3, 0xe7, 0xff, 0x7e},
{0x6c, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00},
{0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00},
{0x38, 0x7c, 0x38, 0xfe, 0xfe, 0x7c, 0x38, 0x7c},
{0x10, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x7c},
{0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00},
{0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff},
{0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00},
{0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff},
{0x0f, 0x07, 0x0f, 0x7d, 0xcc, 0xcc, 0xcc, 0x78},
{0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18},
{0x3f, 0x33, 0x3f, 0x30, 0x30, 0x70, 0xf0, 0xe0},
{0x7f, 0x63, 0x7f, 0x63, 0x63, 0x67, 0xe6, 0xc0},
{0x99, 0x5a, 0x3c, 0xe7, 0xe7, 0x3c, 0x5a, 0x99},
{0x80, 0xe0, 0xf8, 0xfe, 0xf8, 0xe0, 0x80, 0x00},
{0x02, 0x0e, 0x3e, 0xfe, 0x3e, 0x0e, 0x02, 0x00},
{0x18, 0x3c, 0x7e, 0x18, 0x18, 0x7e, 0x3c, 0x18},
{0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00},
{0x7f, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x00},
{0x3e, 0x63, 0x38, 0x6c, 0x6c, 0x38, 0xcc, 0x78},
{0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x7e, 0x00},
{0x18, 0x3c, 0x7e, 0x18, 0x7e, 0x3c, 0x18, 0xff},
{0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x00},
{0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00},
{0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00},
{0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00},
{0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00},
{0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00},
{0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x00, 0x00},
{0x00, 0xff, 0xff, 0x7e, 0x3c, 0x18, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x30, 0x78, 0x78, 0x30, 0x30, 0x00, 0x30, 0x00},
{0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x6c, 0x6c, 0xfe, 0x6c, 0xfe, 0x6c, 0x6c, 0x00},
{0x30, 0x7c, 0xc0, 0x78, 0x0c, 0xf8, 0x30, 0x00},
{0x00, 0xc6, 0xcc, 0x18, 0x30, 0x66, 0xc6, 0x00},
{0x38, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0x76, 0x00},
{0x60, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00},
{0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00},
{0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00},
{0x00, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x60},
{0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00},
{0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00},
{0x7c, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0x7c, 0x00},
{0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x00},
{0x78, 0xcc, 0x0c, 0x38, 0x60, 0xc4, 0xfc, 0x00},
{0x78, 0xcc, 0x0c, 0x38, 0x0c, 0xcc, 0x78, 0x00},
{0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x1e, 0x00},
{0xfc, 0xc0, 0xf8, 0x0c, 0x0c, 0xcc, 0x78, 0x00},
{0x38, 0x60, 0xc0, 0xf8, 0xcc, 0xcc, 0x78, 0x00},
{0xfc, 0xcc, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x00},
{0x78, 0xcc, 0xcc, 0x78, 0xcc, 0xcc, 0x78, 0x00},
{0x78, 0xcc, 0xcc, 0x7c, 0x0c, 0x18, 0x70, 0x00},
{0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00},
{0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0x00},
{0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x00},
{0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00},
{0x60, 0x30, 0x18, 0x0c, 0x18, 0x30, 0x60, 0x00},
{0x78, 0xcc, 0x0c, 0x18, 0x30, 0x00, 0x30, 0x00},
{0x7c, 0xc6, 0xde, 0xde, 0xde, 0xc0, 0x78, 0x00},
{0x30, 0x78, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0x00},
{0xfc, 0x66, 0x66, 0x7c, 0x66, 0x66, 0xfc, 0x00},
{0x3c, 0x66, 0xc0, 0xc0, 0xc0, 0x66, 0x3c, 0x00},
{0xf8, 0x6c, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00},
{0xfe, 0x62, 0x68, 0x78, 0x68, 0x62, 0xfe, 0x00},
{0xfe, 0x62, 0x68, 0x78, 0x68, 0x60, 0xf0, 0x00},
{0x3c, 0x66, 0xc0, 0xc0, 0xce, 0x66, 0x3e, 0x00},
{0xcc, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0xcc, 0x00},
{0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00},
{0x1e, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78, 0x00},
{0xe6, 0x66, 0x6c, 0x78, 0x6c, 0x66, 0xe6, 0x00},
{0xf0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00},
{0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, 0xc6, 0x00},
{0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0xc6, 0x00},
{0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x00},
{0xfc, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00},
{0x78, 0xcc, 0xcc, 0xcc, 0xdc, 0x78, 0x1c, 0x00},
{0xfc, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0xe6, 0x00},
{0x78, 0xcc, 0xe0, 0x70, 0x1c, 0xcc, 0x78, 0x00},
{0xfc, 0xb4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00},
{0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xfc, 0x00},
{0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x00},
{0xc6, 0xc6, 0xc6, 0xd6, 0xfe, 0xee, 0xc6, 0x00},
{0xc6, 0xc6, 0x6c, 0x38, 0x38, 0x6c, 0xc6, 0x00},
{0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x30, 0x78, 0x00},
{0xfe, 0xc6, 0x8c, 0x18, 0x32, 0x66, 0xfe, 0x00},
{0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00},
{0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x02, 0x00},
{0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00},
{0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff},
{0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x76, 0x00},
{0xe0, 0x60, 0x60, 0x7c, 0x66, 0x66, 0xdc, 0x00},
{0x00, 0x00, 0x78, 0xcc, 0xc0, 0xcc, 0x78, 0x00},
{0x1c, 0x0c, 0x0c, 0x7c, 0xcc, 0xcc, 0x76, 0x00},
{0x00, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00},
{0x38, 0x6c, 0x60, 0xf0, 0x60, 0x60, 0xf0, 0x00},
{0x00, 0x00, 0x76, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8},
{0xe0, 0x60, 0x6c, 0x76, 0x66, 0x66, 0xe6, 0x00},
{0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00},
{0x0c, 0x00, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78},
{0xe0, 0x60, 0x66, 0x6c, 0x78, 0x6c, 0xe6, 0x00},
{0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00},
{0x00, 0x00, 0xcc, 0xfe, 0xfe, 0xd6, 0xc6, 0x00},
{0x00, 0x00, 0xf8, 0xcc, 0xcc, 0xcc, 0xcc, 0x00},
{0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0x78, 0x00},
{0x00, 0x00, 0xdc, 0x66, 0x66, 0x7c, 0x60, 0xf0},
{0x00, 0x00, 0x76, 0xcc, 0xcc, 0x7c, 0x0c, 0x1e},
{0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0xf0, 0x00},
{0x00, 0x00, 0x7c, 0xc0, 0x78, 0x0c, 0xf8, 0x00},
{0x10, 0x30, 0x7c, 0x30, 0x30, 0x34, 0x18, 0x00},
{0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00},
{0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x00},
{0x00, 0x00, 0xc6, 0xd6, 0xfe, 0xfe, 0x6c, 0x00},
{0x00, 0x00, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0x00},
{0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8},
{0x00, 0x00, 0xfc, 0x98, 0x30, 0x64, 0xfc, 0x00},
{0x1c, 0x30, 0x30, 0xe0, 0x30, 0x30, 0x1c, 0x00},
{0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00},
{0xe0, 0x30, 0x30, 0x1c, 0x30, 0x30, 0xe0, 0x00},
{0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00},
{0x18, 0x18, 0x7e, 0xc0, 0xc0, 0x7e, 0x18, 0x18},
{0x38, 0x6c, 0x64, 0xf0, 0x60, 0xe6, 0xfc, 0x00},
{0x00, 0xc6, 0x7c, 0xc6, 0xc6, 0x7c, 0xc6, 0x00},
{0xcc, 0xcc, 0x78, 0xfc, 0x30, 0xfc, 0x30, 0x30},
{0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00},
{0x3e, 0x63, 0x38, 0x6c, 0x6c, 0x38, 0xcc, 0x78},
{0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x7e, 0x81, 0x9d, 0xa1, 0xa1, 0x9d, 0x81, 0x7e},
{0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00, 0x00},
{0x00, 0x33, 0x66, 0xcc, 0x66, 0x33, 0x00, 0x00},
{0x00, 0x00, 0x00, 0xfc, 0x0c, 0x0c, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00},
{0x7e, 0x81, 0xb9, 0xa5, 0xb9, 0xa5, 0x81, 0x7e},
{0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00},
{0x30, 0x30, 0xfc, 0x30, 0x30, 0x00, 0xfc, 0x00},
{0x70, 0x18, 0x30, 0x60, 0x78, 0x00, 0x00, 0x00},
{0x70, 0x18, 0x30, 0x18, 0x70, 0x00, 0x00, 0x00},
{0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0xc0},
{0x7f, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0x38},
{0x30, 0x70, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00},
{0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00},
{0x00, 0xcc, 0x66, 0x33, 0x66, 0xcc, 0x00, 0x00},
{0xc3, 0xc6, 0xcc, 0xdb, 0x37, 0x6f, 0xcf, 0x03},
{0xc3, 0xc6, 0xcc, 0xde, 0x33, 0x66, 0xcc, 0x0f},
{0xe0, 0x33, 0x66, 0x3c, 0xfb, 0x37, 0x6f, 0xc3},
{0x30, 0x00, 0x30, 0x60, 0xc0, 0xcc, 0x78, 0x00},
{0xc0, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0xc6, 0x00},
{0x06, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0xc6, 0x00},
{0x7c, 0xc6, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0x00},
{0x76, 0xdc, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0x00},
{0xc6, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0xc6, 0x00},
{0x30, 0x30, 0x00, 0x78, 0xcc, 0xfc, 0xcc, 0x00},
{0x3e, 0x6c, 0xcc, 0xfe, 0xcc, 0xcc, 0xce, 0x00},
{0x78, 0xcc, 0xc0, 0xcc, 0x78, 0x18, 0x0c, 0x78},
{0xe0, 0x00, 0xfc, 0x60, 0x78, 0x60, 0xfc, 0x00},
{0x1c, 0x00, 0xfc, 0x60, 0x78, 0x60, 0xfc, 0x00},
{0x78, 0xcc, 0xfc, 0x60, 0x78, 0x60, 0xfc, 0x00},
{0xcc, 0x00, 0xfc, 0x60, 0x78, 0x60, 0xfc, 0x00},
{0xe0, 0x00, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00},
{0x1c, 0x00, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00},
{0x7e, 0xc3, 0x3c, 0x18, 0x18, 0x18, 0x3c, 0x00},
{0xcc, 0x00, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00},
{0xf8, 0x6c, 0x66, 0xf6, 0x66, 0x6c, 0xf8, 0x00},
{0xfc, 0x00, 0xcc, 0xec, 0xfc, 0xdc, 0xcc, 0x00},
{0xc0, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x00},
{0x06, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x00},
{0x7c, 0xc6, 0x38, 0x6c, 0xc6, 0x6c, 0x38, 0x00},
{0x76, 0xdc, 0x38, 0x6c, 0xc6, 0x6c, 0x38, 0x00},
{0xc3, 0x18, 0x3c, 0x66, 0x66, 0x3c, 0x18, 0x00},
{0x00, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0x00, 0x00},
{0x3a, 0x6c, 0xce, 0xd6, 0xe6, 0x6c, 0xb8, 0x00},
{0xe0, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00},
{0x1c, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00},
{0x7c, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0x7c, 0x00},
{0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00},
{0x1c, 0x00, 0xcc, 0xcc, 0x78, 0x30, 0x78, 0x00},
{0xf0, 0x60, 0x7c, 0x66, 0x7c, 0x60, 0xf0, 0x00},
{0x78, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xcc, 0x00},
{0xe0, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00},
{0x1c, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00},
{0x7e, 0xc3, 0x3c, 0x06, 0x3e, 0x66, 0x3f, 0x00},
{0x76, 0xdc, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00},
{0xcc, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00},
{0x30, 0x30, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00},
{0x00, 0x00, 0x7f, 0x0c, 0x7f, 0xcc, 0x7f, 0x00},
{0x00, 0x00, 0x78, 0xc0, 0xc0, 0x78, 0x0c, 0x38},
{0xe0, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00},
{0x1c, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00},
{0x7e, 0xc3, 0x3c, 0x66, 0x7e, 0x60, 0x3c, 0x00},
{0xcc, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00},
{0xe0, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00},
{0x38, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00},
{0x7c, 0xc6, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00},
{0xcc, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00},
{0x30, 0x7e, 0x0c, 0x7c, 0xcc, 0xcc, 0x78, 0x00},
{0x00, 0xf8, 0x00, 0xf8, 0xcc, 0xcc, 0xcc, 0x00},
{0x00, 0xe0, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00},
{0x00, 0x1c, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00},
{0x78, 0xcc, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00},
{0x76, 0xdc, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00},
{0x00, 0xcc, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00},
{0x30, 0x30, 0x00, 0xfc, 0x00, 0x30, 0x30, 0x00},
{0x00, 0x02, 0x7c, 0xce, 0xd6, 0xe6, 0x7c, 0x80},
{0x00, 0xe0, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00},
{0x00, 0x1c, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00},
{0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00},
{0x00, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00},
{0x00, 0x1c, 0x00, 0xcc, 0xcc, 0x7c, 0x0c, 0x78},
{0xe0, 0x60, 0x7c, 0x66, 0x66, 0x7c, 0x60, 0xf0},
{0x00, 0xcc, 0x00, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8},
};
static inline const uint8_t* charBitmap(char c) {
uint8_t idx = static_cast<uint8_t>(c);
return font8x8_ib8x8u[idx];
}
static inline void drawChar(void *data,
int w, int h, PixFmt fmt,
int x0, int y0, char c,
int scale,
uint8_t r = 255, uint8_t g = 255, uint8_t b = 255,
uint8_t Y = 235, uint8_t U = 128, uint8_t V = 128);
static inline void writeText(void *data,
int imgW, int imgH, PixFmt imgFmt,
int x, int y, const char *text,
uint8_t r = 255, uint8_t g = 0, uint8_t b = 0,
uint8_t Y = 76, uint8_t U = 84, uint8_t V = 255,
int scale = 4, int space = 9);
static inline void putPixel(void *data,
int w, int h, PixFmt fmt,
int x, int y,
uint8_t r, uint8_t g, uint8_t b,
uint8_t Y, uint8_t U, uint8_t V)
{
if (fmt == PixFmt::RGB24) {
uint8_t* p = static_cast<uint8_t*>(data) + (y * w + x) * 3;
p[0] = r; p[1] = g; p[2] = b;
} else if (fmt == PixFmt::YUV_NV12) {
uint8_t* Y_plane = static_cast<uint8_t*>(data);
uint8_t* U_plane = Y_plane + w * h;
uint8_t* V_plane = U_plane + (w / 2) * (h / 2);
uint8_t* UV_plane = Y_plane + w * h;
Y_plane[y * w + x] = Y;
int x2 = x / 2, y2 = y / 2;
UV_plane[y2 * w + x] = U;
UV_plane[y2 * w + x + 1] = V;
}
}
static inline void drawChar(void *data,
int w, int h, PixFmt fmt,
int x0, int y0, char c,
int scale,
uint8_t r, uint8_t g, uint8_t b,
uint8_t Y, uint8_t U, uint8_t V)
{
const uint8_t* bm = charBitmap(c);
for (int row = 0; row < 8; ++row) {
uint8_t bits = bm[row];
for (int col = 0; col < 8; ++col) {
if (!(bits & (1 << (7 - col)))) continue;
for (int dy = 0; dy < scale; ++dy)
for (int dx = 0; dx < scale; ++dx) {
int px = x0 + col * scale + dx;
int py = y0 + row * scale + dy;
if (px < 0 || px >= w || py < 0 || py >= h) continue;
putPixel(data, w, h, fmt, px, py, r, g, b, Y, U, V);
}
}
}
}
static inline void writeText(void *data,
int imgW, int imgH, PixFmt imgFmt,
int x, int y,
const char *text,
uint8_t r, uint8_t g, uint8_t b,
uint8_t Y, uint8_t U, uint8_t V,
int scale, int space)
{
for (; *text; ++text) {
drawChar(data, imgW, imgH, imgFmt, x, y, *text, scale, r, g, b, Y, U, V);
x += space * scale;
}
}
static inline void writeTextRgb(void *data, int imgW, int imgH,
int x, int y, int fontSize,
const char *text,
uint8_t r=255, uint8_t g=0, uint8_t b=0)
{
int space = 8;
for (; *text; ++text)
{
drawChar(data, imgW, imgH, PixFmt::RGB24, x, y, *text, fontSize, r, g, b);
x += space * fontSize;
}
}
static inline bool savePPM(const char *filename, void *rgb, int w, int h) {
FILE *fp = fopen(filename, "wb");
if (!fp) return false;
fprintf(fp, "P6\n%d %d\n255\n", w, h);
fwrite(rgb, 1, w * h * 3, fp);
fclose(fp);
return true;
}
}
int main() {
int imgW = 600;
int imgH = 200;
uint8_t rgb[imgW * imgH * 3];
std::memset(rgb, 255, imgW * imgH * 3);
OVERLAY::writeTextRgb(rgb, imgW, imgH, 10, 10, 2, "Good Job~ ", 255);
OVERLAY::writeTextRgb(rgb, imgW, imgH, 10, 40, 3, "Good Job~ ", 25, 150, 66);
OVERLAY::writeTextRgb(rgb, imgW, imgH, 10, 80, 4, "Good Job~ ", 2, 4, 6);
OVERLAY::writeTextRgb(rgb, imgW, imgH, 10, 120, 4, "Data: 8 Aug. 2025", 0, 0, 255);
OVERLAY::savePPM("save.ppm", rgb, imgW, imgH);
return 0;
}
#endif