-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathxfont.h
112 lines (94 loc) · 4.03 KB
/
xfont.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include <Arduino.h>
#include<LittleFS.h>
// 注意,使用不同的屏幕驱动应该对下面的代码进行不同的注释
//#define ARDUINO_GFX
#define TFT_ESPI
#ifdef ARDUINO_GFX
#include "Arduino_GFX_Library.h"
#elif defined(TFT_ESPI)
#include <TFT_eSPI.h>
#endif
using std::wstring;
class XFont
{
public:
//默认初始化方法,不初始化TFT驱动
XFont();
//带参数初始化方法,isTFT=true初始化TFT驱动
XFont(bool isTFT);
bool isInit = false;
File file;
#ifdef ARDUINO_GFX
XFont(Arduino_GFX *gfx_tft);
Arduino_DataBus *bus = create_default_Arduino_DataBus();
// 注意,不同的tft屏幕驱动选择不同的对象
Arduino_GFX *tft = new Arduino_ST7735(bus,-1,0,false,128,160,0,0,0,0,false);
#define GFX_BL DF_GFX_BL
#elif defined(TFT_ESPI)
TFT_eSPI tft = TFT_eSPI();
#endif
void DrawStr(int x, int y, String str, int fontColor);
void DrawStr(int x, int y, String str, int fontColor,int backColor);
void DrawStrEx(int x, int y, String str, int fontColor);
void DrawStrEx(int x, int y, String str, int fontColor,int backColor);
void DrawStrFromUtf16(int x, int y,const uint16_t * str, int fontColor,int backColor, size_t length);
void DrawStrSelf(File txtfile,int fontColor);
// 在指定位置输出中文,本方法边读字库边显示
void DrawChinese(int x, int y, String str, int fontColor);
void DrawChinese(int x, int y, String str, int fontColor,int backColor);
// 在指定位置输出中文,本方法是字库读完后,统一显示,视觉上显示最快
void DrawChineseEx(int x, int y, String str, int fontColor);
void DrawChineseEx(int x, int y, String str, int fontColor,int backColor);
void DrawSingleStr(int x, int y, String strBinData, int fontColor,int backColor, bool ansiChar);
void DrawSingleStr(int x, int y, String strBinData, int fontColor, bool ansiChar);
//直接从字库获得指定字符的像素编码,方便用于像素屏,例如
//GetPixDatasFromLib("我"),返回:“000110100000011100100100000100100010000100100000111111111110000100100000000100100100000110101000001100010000110100110010000101001010001100000110”
String GetPixDatasFromLib(String displayStr);
#ifdef ARDUINO_GFX
void InitTFT(Arduino_GFX *gfx_tft);
#endif
protected:
void InitTFT();
// 转化字符数组为字符串
String getStringFromChars(uint8_t *bs, int l);
// 把utf8编码字符转unicode编码
String getUnicodeFromUTF8(String s);
// 从字符的像素16进制字符重新转成二进制字符串
String getPixDataFromHex(String s);
// 初始化字库
void initZhiku(String fontPath);
// 从字库文件获取字符对应的编码字符串
String getCodeDataFromFile(String strUnicode);
// 依照字号和编码方式计算每个字符存储展位
int getFontPage(int font_size, int bin_type);
// 从字库文件获取字符对应的二进制编码字符串
String getPixBinStrFromString(String displayStr);
// 所有字符的unicode编码
String strAllUnicodes = "";
int unicode_begin_idx = 0;
int font_unicode_cnt = 0;
int total_font_cnt = 0;
int bin_type = 64;
int font_size = 16;
int font_page = 0;
unsigned long time_spent = 0;
String fontFilePath = "/x.font";
const char *s64 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@#*$";
int pX = 16;
int pY = 0;
bool isTftInited=true;
// 注意现在的显示字数是自动根据屏幕大下和字体大小计算的,以下暂时未生效,但是保留
int amountDisplay = 10; // 每行显示多少汉字,其实这个显示数量应该通过屏幕的宽度来计算字号
// 注意:如果屏幕设置了不同的旋转方式,以下代码应该对应调整
#ifdef ARDUINO_GFX
int screenHeight = 128;
int screenWidth = 160;
#elif defined(TFT_ESPI)
int screenHeight = TFT_HEIGHT;
int screenWidth = TFT_WIDTH;
#endif
// int screenHeight=128;
int singleStrPixsAmount = 0;
private:
bool chkAnsi(unsigned char c);
};