先看效果
直接上代码
# 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