reactos操作系统实现(145)

 前面的函数已经介绍怎么样显示一个字符串了,那么下面就来仔细地实查看怎么样实现一个字符的显示,当然这里字符的显示,只是字母的显示,没有中文显示,如果需要实现中文字符的显示,就需要修改这个函数和相应的排版函数、读取相应的字体文件。由于显示卡已经被初始化为图形模式,那么所有字符的显示都生成图形方式来显示,文字也不例外,因此需要使用字体的点阵数据。具体实现代码如下:

#001  VOID

#002  NTAPI

#003  DisplayCharacter(CHAR Character,

#004                   ULONG Left,

#005                   ULONG Top,

#006                   ULONG TextColor,

#007                   ULONG BackTextColor)

#008  {

#009      PUCHAR FontChar;

#010      ULONG i, j, XOffset;

#011 

 

从字体数组里获取字符的图形点阵数据。

#012      /* Get the font line for this character */

#013      FontChar = &FontData[Character * 13 - Top];

#014 

 

每字符高度为13像素.

#015      /* Loop each pixel height */

#016      i = 13;

#017      do

#018      {

 

每字符的16个像素显示。

#019          /* Loop each pixel width */

#020          j = 128;

#021          XOffset = Left;

#022          do

#023          {

 

检查是否需要显示这个点像素,从字体的高位开始从来第一个像素显示。

#024              /* Check if we should draw this pixel */

#025              if (FontChar[Top] & (UCHAR)j)

#026              {

#027                  /* We do, use the given Text Color */

#028                  SetPixel(XOffset, Top, (UCHAR)TextColor);

#029              }

#030              else if (BackTextColor < 16)

#031              {

 

这里显示背境颜色。

#032                  /* This is a background pixel. We're drawing it unless it's */

#033                  /* transparent. */

#034                  SetPixel(XOffset, Top, (UCHAR)BackTextColor);

#035              }

#036 

 

每次只移动一个像素。

#037              /* Increase X Offset */

#038              XOffset++;

#039          } while (j >>= 1);

#040 

#041          /* Move to the next Y ordinate */

#042          Top++;

#043      } while (--i);

#044  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值