📄 text.c
字号:
INT32U temp32a;
if (IsAreaValid(row_dot,col_dot,lenrow_dot,lencol_dot) == FALSE) return;
if(shift_dot == 0 || shift_dot > lenrow_dot)return;
upmod_row = row_dot - (row_dot >> 3 << 3);//row_dot % 8;
upfull_row = row_dot >> 3;//row_dot / 8;
downmod_row = (row_dot + lenrow_dot) - ((row_dot + lenrow_dot) >> 3 << 3);//(row_dot + lenrow_dot) % 8;
downfull_row = (row_dot + lenrow_dot - 1) >> 3;// / 8; //减1是为了调整,否则在临界的时候会出问题(8+8时应当分2行显示,而不减1则分3行了)
fullrowcnt = downfull_row - upfull_row;
for (i=col_dot;i<lencol_dot+col_dot;i++) {
j = upfull_row;
t = 0;
ptr = GetPosAddr(DplyImagMem,j,i,DOTSIZEX);
upbyte = *ptr;
shiftstrm[0] = 0;
shiftstrm[1] = 0;
shiftstrm[2] = 0;
for (;j<=downfull_row;j++) {
if (j == downfull_row) {
downbyte = *ptr;
if (downmod_row == 0) { //downmod_row == 0时,该行要全部显示
temp32a = downbyte;
} else {
temp32a = downbyte & (0xFF>>(8-downmod_row));
}
} else {
temp32a = *ptr;
}
//shiftstrm[t/4] |= temp32a<<((t%4)*8);
shiftstrm[t>>2] |= temp32a<<((t-(t>>2<<2))<<3);
t++;
ptr += DOTSIZEX;
}
shift_dottemp = shift_dot;
if (shift_dottemp >= 64) {
shift_dottemp -= 64;
shiftstrm[0] = shiftstrm[2];
shiftstrm[1] = shiftstrm[2] = 0;
} else if (shift_dottemp >= 32) {
shift_dottemp -= 32;
shiftstrm[0] = shiftstrm[1];
shiftstrm[1] = shiftstrm[2];
shiftstrm[2] = 0;
}
if (shift_dottemp) {
shiftstrm[0] >>= shift_dottemp;
temp32a = shiftstrm[1];
temp32a <<= (32 - shift_dottemp);
shiftstrm[0] |= temp32a;
shiftstrm[1] >>= shift_dottemp;
temp32a = shiftstrm[2];
temp32a <<= (32 - shift_dottemp);
shiftstrm[1] |= temp32a;
shiftstrm[2] >>= shift_dottemp;
}
ptr = GetPosAddr(DplyImagMem,upfull_row,i,DOTSIZEX);
for (j=0;j<=fullrowcnt;j++) {
//*ptr = (shiftstrm[j/4]>>((j%4)*8)) & 0x0000ff;
*ptr = (shiftstrm[j>>2]>>((j-(j>>2<<2))<<3)) & 0xff;
ptr += DOTSIZEX;
}
ResumeSideBytes(i);
}
}
#endif
/*
//使设定的区域向左移动shift_dot的距离,单位为象素。注意:移出左边界的内容被丢弃
void MovArea_Left(INT8U row_dot,INT8U col_dot,INT8U lenrow_dot,INT8U lencol_dot,INT8U shift_dot)
{
INT8U i,j;
INT8U *leftptr,*rightptr;
INT8U shiftoft;
if (IsAreaValid(row_dot,col_dot,lenrow_dot,lencol_dot) == FALSE) return;
if(shift_dot == 0 || shift_dot > lencol_dot)return;
upmod_row = row_dot % 8;
upfull_row = row_dot / 8;
downmod_row = (row_dot + lenrow_dot) % 8;
downfull_row = (row_dot + lenrow_dot - 1) / 8;
for (i=upfull_row;i<=downfull_row;i++) {
leftptr = GetPosAddr(DplyImagMem,i,col_dot,DOTSIZEX);
rightptr = GetPosAddr(DplyImagMem,i,col_dot+shift_dot,DOTSIZEX);
shiftoft = col_dot+lencol_dot-shift_dot;
if(i == upfull_row) {//如果是上边临界区,则一个象素行一个象素行的移动,超过col_dot的内容被抛弃
for (j=col_dot;j<shiftoft;j++){//把不会被移出边界的部分((col+shift)~(col+len))直接移到(col~shiftoft)
upbyte = *leftptr;
*leftptr = *rightptr++;
*leftptr &= (0xFF<<upmod_row);
upbyte &= (0xFF>>(8-upmod_row));
*leftptr++ |= upbyte; //与临界区上部相或
}
for(j=shiftoft;j<col_dot+lencol_dot;j++) {//剩下的部分则清零
upbyte = *leftptr;
*leftptr++ = 0;
upbyte &= (0xFF>>(8-upmod_row));
*leftptr++ |= upbyte; //与临界区上部相或
}
} else if (i == downfull_row) {//如果是下边临界区,也是一个象素行一个象素行的移动,超过col_dot的内容被抛弃
for (j=col_dot;j<shiftoft;j++){//把不会被移出边界的部分((col+shift)~(col+len))直接移到(col~shiftoft)
downbyte = *leftptr;
*leftptr = *rightptr++;
*leftptr &= (0xFF>>(8-downmod_row));
downbyte &= (0xFF<<downmod_row);
*leftptr++ |= downbyte; //与临界区下部相或
}
for(j=shiftoft;j<col_dot+lencol_dot;j++) {//剩下的部分则清零
downbyte = *leftptr;
*leftptr = 0;
downbyte &= (0xFF<<downmod_row);
*leftptr++ |= downbyte; //与临界区下部相或
}
} else {
for (j=col_dot;j<shiftoft;j++){
*leftptr++ = *rightptr++;
}
for(j=shiftoft;j<col_dot+lencol_dot;j++) {
*leftptr++ = 0;
}
}
}
}
//使设定的区域向右移动shift_dot的距离,单位为象素。方法类似向左移动。注意:移出右边界的内容不会被丢弃,而是移到下一行
void MovArea_Right(INT8U row_dot,INT8U col_dot,INT8U lenrow_dot,INT8U lencol_dot,INT8U shift_dot)
{
INT8U i,j;
INT8U *leftptr,*rightptr;
INT8U shiftoft,col_index;
if (IsAreaValid(row_dot,col_dot,lenrow_dot,lencol_dot) == FALSE) return;
if(shift_dot == 0 || shift_dot > lencol_dot)return;
upmod_row = row_dot % 8;
upfull_row = row_dot / 8;
downmod_row = (row_dot + lenrow_dot) % 8;
downfull_row = (row_dot + lenrow_dot - 1) / 8;
for (i=upfull_row;i<=downfull_row;i++) {
col_index = col_dot + lencol_dot - 1;
rightptr = GetPosAddr(DplyImagMem,i,col_index,DOTSIZEX);
leftptr = GetPosAddr(DplyImagMem,i,col_index-shift_dot,DOTSIZEX);
shiftoft = col_dot+shift_dot-1;
if(i == upfull_row) {
for (j=col_index;j>shiftoft;j--) {
upbyte = *rightptr;
*rightptr = *leftptr--;
*rightptr &= (0xFF<<upmod_row);
upbyte &= (0xFF>>(8-upmod_row));
*rightptr-- |= upbyte;
}
for (j=col_dot;j<=shiftoft;j++) {
upbyte = *rightptr;
*rightptr = 0;
upbyte &= (0xFF>>(8-upmod_row));
*rightptr-- |= upbyte;
}
} else if (i == downfull_row) {
for (j=col_index;j>shiftoft;j--) {
downbyte = *rightptr;
*rightptr = *leftptr--;
*rightptr &= (0xFF>>(8-downmod_row));
downbyte &= (0xFF<<downmod_row);
*rightptr-- |= downbyte;
}
for (j=col_dot;j<=shiftoft;j++) {
downbyte = *rightptr;
*rightptr = 0;
downbyte &= (0xFF<<downmod_row);
*rightptr-- |= downbyte;
}
} else {
for (j=col_index;j>shiftoft;j--) {
*rightptr-- = *leftptr--;
}
for (j=col_dot;j<=shiftoft;j++) {
*rightptr-- = 0;
}
}
}
}
*/
#if 0
//在设定的位置显示一个汉字或者ASCII字符,并在字符的下方插入spacedot行空格。显示在DplyImagMem中。要显示的字符是放在FontsBuf[]中
INT8U OutTextSingle(INT8U row_dot,INT8U col_dot,INT8U spacedot,INT8U *charcode)
{
INT8U i,j;
INT8U fontslen,columndot;
INT8U *ptr;
INT32U temp32;
upmod_row = row_dot - (row_dot >> 3 << 3);//row_dot % 8;
upfull_row = row_dot >> 3;//row_dot / 8;
downmod_row = (row_dot + 16 + spacedot) - ((row_dot + 16 + spacedot) >> 3 << 3);
downfull_row = (row_dot + 16 + spacedot - 1) >> 3;
fontslen = GetFonts(charcode,FontsBuf); //这一步已将charcode在字库中的地址找到并赋给FontsBuf
if (fontslen == 32) { //是汉字
columndot = 16;
} else { //是ASCII码 如果不是16,也会跳到这里
columndot = FONTCOL;
}
for (i=0;i<columndot;i++) {
temp32 = 0;
ptr = GetPosAddr(DplyImagMem,upfull_row,col_dot+i,DOTSIZEX);
upbyte = *ptr;
ptr = GetPosAddr(DplyImagMem,downfull_row,col_dot+i,DOTSIZEX);
downbyte = *ptr;
downbyte &= (0xFF<<downmod_row); //downbyte是临界区下部原先就存在的数据
temp32 = downbyte; //装入临时的32位数temp32,此时有效数据位是(0xFF<<downmod_row),空出downmod_row
temp32 <<= (8-downmod_row + spacedot); //向右移动(8-downmod_row + spacedot),此时空出了(8+spacedot)位
temp32 |= FontsBuf[i+columndot]; //将字符按照顺序装入临时32位数temp32,共16位
temp32 <<= 8;
temp32 |= FontsBuf[i];
temp32 <<= upmod_row;
upbyte &= (0xFF>>(8-upmod_row)); //upbyte是临界区上部原先就存在的数据
temp32 |= upbyte; //将upbyte装入临时32位数temp32,至此汉字的一列装入完闭
ptr = GetPosAddr(DplyImagMem,upfull_row,col_dot+i,DOTSIZEX);
for (j=0;j<=downfull_row-upfull_row;j++) {
//*ptr = (temp32>>((j%4)*8)) & 0x0000ff; //将temp32写入到DplyImagMem的相应位置中
*ptr = (temp32>>((j-(j>>2<<2))<<3)) & 0xff;
ptr += DOTSIZEX;
}
}
return fontslen;
}
//从设定的起点开始在lenrow行(×8象素)、lencol列(×8象素)的范围内显示charlen长度的字符*charptr
void OutText(INT8U row_dot,INT8U col_dot,INT8U lenrow,INT8U lencol,INT8U spacerow_dot,INT8U *charptr,INT8U charlen)
{
INT8U i,fontslen;
INT8U currow_dot,curcol_dot;
INT8U rowctr,colctr;
if (IsAreaValid(row_dot,col_dot,lenrow*FONTROW,lencol*FONTCOL) == FALSE) return;
ClearArea(row_dot,col_dot,lenrow*(2*FONTROW + spacerow_dot),lencol*FONTCOL); //将这块区域清零
currow_dot = row_dot; //令当前行为row_dot,以象素为单位
curcol_dot = col_dot; //令当前列为col_dot,以象素为单位
rowctr = 0; //行计数器,以显示一行汉字为单位(16象素 + spacerow)
colctr = 0; //列计数器,以显示一列ASCII字符为单位(8个象素)
i = 0;
while (i<charlen) //若没有显示完
{
if (colctr>=lencol || ((colctr == lencol-1) && (IsASCII(charptr)==FALSE))) { //若已经到了列尾
if(++rowctr < lenrow) //换行,且rowctr + 1
{
currow_dot = row_dot + rowctr*(2*FONTROW + spacerow_dot);
colctr = 0;
} else {
return;
}
}
curcol_dot = col_dot + colctr*FONTCOL;
fontslen = OutTextSingle(currow_dot,curcol_dot,spacerow_dot,charptr);//在当前行、当前列显示一个字符
i++; //i用来判断text有没有显示完毕
charptr++;
colctr++;
if (fontslen == 4*FONTCOL) { //若为中文,则长度、charptr和列计数器均多加一次
i++;
charptr++;
colctr++;
}
}
}
//在设定的位置显示一个小字符,小字符一般用于显示时间。实现方法类似OutTextSingle
INT8U OutTextTinySingle(INT8U row_dot,INT8U col_dot,INT8U charcode)
{
INT8U i,j;
INT8U fontslen;
INT8U *ptr;
INT16U temp16;
upmod_row = row_dot - (row_dot >> 3 << 3);//row_dot % 8;
upfull_row = row_dot >> 3;//row_dot / 8;
downmod_row = (row_dot + FONTROW) - ((row_dot + FONTROW) >> 3 << 3);
downfull_row = (row_dot + FONTROW - 1) >> 3;// / 8;
fontslen = FindTinyFont(charcode,FontsBuf);
for (i=0;i<8;i++) {
temp16 = 0;
ptr = GetPosAddr(DplyImagMem,upfull_row,col_dot+i,DOTSIZEX);
upbyte = *ptr;
ptr = GetPosAddr(DplyImagMem,downfull_row,col_dot+i,DOTSIZEX);
downbyte = *ptr;
downbyte &= (0xFF<<downmod_row);
temp16 = downbyte;
temp16 <<= (8-downmod_row);
temp16 |= FontsBuf[i];
temp16 <<= upmod_row;
upbyte &= (0xFF>>(8-upmod_row));
temp16 |= upbyte;
ptr = GetPosAddr(DplyImagMem,upfull_row,col_dot+i,DOTSIZEX);
for (j=0;j<=downfull_row-upfull_row;j++) {
//*ptr = (temp16>>((j%4)*8)) & 0x0000ff;
*ptr = (temp16>>((j-(j>>2<<2))<<3)) & 0xff;
ptr += DOTSIZEX;
}
}
return fontslen;
}
//在设定位置显示一行小字符,实现方法类似OutText。由于小字符不存在分行显示,故参数较OutText有简化
void OutTextTiny(INT8U row_dot,INT8U col_dot,INT8U *charptr,INT8U charlen)
{
INT8U i;
ClearArea(row_dot,col_dot,FONTROW,charlen * FONTCOL);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -