修改适配非等宽字体的计数器
This commit is contained in:
+62
-16
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user