[英]Creating own moveto() function in C for use in 0x13 VGA mode xv6
我正在做一个任务,我想知道是否有人能指出我正确的方向。
我需要使用我个人创建的 4 个系统调用方法来绘制一个正方形。 我不能使用 graphics.h 之类的东西
我需要做的函数如下(不包括参数): int sys_moveto() // 移动当前图形 position。 int sys_lineto() // 从当前图形 position 到给定坐标画一条线。 int sys_setpixel() //将当前图形 position 坐标处的像素设置为白色。
我似乎已经弄清楚了 setpixel() 和 lineto(),问题出在 moveto() function 上。 我不知道如何将当前图形 position 移动到 0x13 VGA 模式显示器上的给定像素坐标。 我假设这是通过操纵某种形式的 memory 位置来完成的?
该任务特别说明了以这种方式构建它。 所以从逻辑上讲,系统将“光标”移动到屏幕上的一个点,然后在移动到下一个点之前对其进行着色,然后对其进行着色等等......
由于这是系统调用,这一切都在受保护的级别完成!
我只需要知道如何在不使用 graphics.h 的情况下移动当前图形 position! 任何资源或建议将不胜感激!
提前致谢!
The sys_moveto(newX, newY, color)
would just do a line from the previous position (in global variables like posX
and posY
) to the new position, then set the new position (in the global variables, like posX = newX;
) for下次。
您将遇到的问题是sys_lineto()
需要支持对角线(这更难); 并且不应使用sys_setpixel()
来重新计算沿线的每个像素的地址效率低下(而不是执行address += step;
这避免了重复大部分地址计算)。 请注意, sys_lineto()
可以/应该针对可能的特殊情况进行优化(例如,水平线可以是“ memset()
”); 并且可能应该处理剪辑(例如,这样您就可以sys_moveto(INT_MAX, INT_MAX, color)
和sys_lineto()
将仅绘制实际在屏幕上的部分行(如果有),而不会损坏 memory 当部分行不是屏幕上。
我还建议编写一个calcPixelAddress()
使用的sys_lineto()
(查找要绘制的第一个像素的地址)和sys_setpixel()
(可能变成address = calcPixelAddress(x, y); *address = color;
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.