修改适配非等宽字体的计数器

This commit is contained in:
2026-08-26 16:23:04 +08:00
parent 950d0d0386
commit 190155913a
10 changed files with 267 additions and 70 deletions
+62 -16
View File
@@ -218,10 +218,9 @@ void PrintTextDisplay::paintEvent(QPaintEvent *event){
for(int i = 0; i < sysPara->status.variNum; i++){
vars_t *p_var = &sysPara->status.vars[i];
#if defined(ARCH_AARCH64)
int val = p_var->currVal;
#else
int val = 123078;
#ifdef QT_DEBUG
val = 123078;
#endif
int x = p_var->startColPos;
int y = p_var->startRowPos;
@@ -313,17 +312,31 @@ void PrintTextDisplay::paintEvent(QPaintEvent *event){
else p.setBrush(QColor(Qt::red)); //其他
QChar *qchar = str.data();
int charWidth;
if(sysPara->para.flagOfModuleDecimal || sysPara->para.flagOfModuleHide)
charWidth = p_var->datWidth/13;
else
charWidth = p_var->datWidth/10;
// 准备回退宽度与安全保护值
int datWidth = p_var->datWidth > 0 ? p_var->datWidth : 1;
int datHeight = p_var->datHeight > 0 ? p_var->datHeight : (p_var->rowByteNum * 8);
int fallbackWidth = qMax(1, datWidth / qMax(1, (p_var->digitalNum? p_var->digitalNum:10)));
int rowByteNum = p_var->rowByteNum > 0 ? p_var->rowByteNum : 1;
// 构建字形前缀和(字形按 0..9 顺序存放)
int glyphPrefix[11];
glyphPrefix[0] = 0;
for(int gi = 1; gi <= 10; ++gi){
int w = (gi-1 < 10 && p_var->widthTable[gi-1] > 0) ? p_var->widthTable[gi-1] : fallbackWidth;
glyphPrefix[gi] = glyphPrefix[gi-1] + w;
}
// 限制使用的行数为字模高度与请求行数的较小者
int useRows = qMin(rowDiff, datHeight);
// 累计可变宽数字的显示位置
int posInDigits = 0;
for( j = jmin; j < digitalNum; j++){
int digitalIndex;
if(!sysPara->para.rrr_nc && sysPara->para.printNumPoint && p_var->type == 7 && j == (digitalNum-2))
{
digitalIndex = 10;
digitalIndex = 10; // 小数点
}
else if(sysPara->para.rrr_nc && !sysPara->para.printNumPoint && p_var->type == 7 && j == (digitalNum-3))
{
@@ -335,25 +348,58 @@ void PrintTextDisplay::paintEvent(QPaintEvent *event){
}
else if(sysPara->status.specialVarPrint.MeterEnable && p_var->type == 15 && j == (digitalNum-1))
{
digitalIndex = 11;
digitalIndex = 11; // 单位 'm'
}
else
{
digitalIndex = qchar[j].toLatin1() - '0';
}
unsigned char *pAaddr = p_var->dat + (digitalIndex*charWidth)*p_var->rowByteNum;
for(int k = 0; k < rowDiff; k++){
for(int l = 0; l < charWidth; l++){
if(pAaddr[l*p_var->rowByteNum + k/8] & (1<<(k%8))){
// 获取此字形的宽度(优先取 widthTable,否则使用回退宽度)
int glyphW = (digitalIndex >=0 && digitalIndex < 10 && p_var->widthTable[digitalIndex] > 0) ? p_var->widthTable[digitalIndex] : fallbackWidth;
// 计算字形在 p_var->dat 中的水平偏移(字形按 0..9 顺序存放)
int glyphOffset = 0;
if(digitalIndex >= 0 && digitalIndex <= 10){
glyphOffset = glyphPrefix[qMin(digitalIndex,10)];
} else {
glyphOffset = 0;
}
// 如果字形数据比预期窄,则裁剪宽度
if(glyphOffset + glyphW > datWidth){
if(glyphOffset >= datWidth) {
// 超出数据宽度,跳过绘制
posInDigits += glyphW;
continue;
}
glyphW = datWidth - glyphOffset;
}
unsigned char *pAaddr = p_var->dat + glyphOffset * rowByteNum;
int displayBaseX = x + posInDigits; // 当前数字的绘制起始 X
for(int k = 0; k < useRows; k++){
for(int l = 0; l < glyphW; l++){
if(pAaddr[l*rowByteNum + k/8] & (1<<(k%8))){
if(sysPara->status.addSpace){
p.drawRect((x + j*charWidth + l)/2,y + k,1,1);l++;
p.drawRect((displayBaseX + l)/2, y + k, 1, 1);
}
else
p.drawRect(x + j*charWidth + l,y + k,1,1);
p.drawRect(displayBaseX + l, y + k, 1, 1);
}
}
}
// 累加字形宽度
posInDigits += glyphW;
// 模拟 FPGA 处理的字符间距(以像素为单位)
int spacing = p_var->letterSpace;
if(spacing < 0) spacing = 0;
// 避免过大的间距导致溢出预览区域
if(spacing > datWidth) spacing = datWidth;
posInDigits += spacing;
}
}
updateDigitalOnly = false;