使用DirectX叠加对窗口的全屏放大外文翻译资料
2022-11-08 20:48:01
英语原文共 7 页,剩余内容已隐藏,支付完成后下载完整资料
使用DirectX叠加对窗口的全屏放大
摘要:本文介绍了一些视觉障碍人士从计算机屏幕读取信息时使用的基于软件的放大镜的基本特征。本文简要介绍了用于现代多窗口系统的全屏放大的两种主要方法(本文着重于Microsoft Windows)。本文详细的介绍了使用Microsoft DirectX叠加层的全屏放大镜的架构和操作。这种方法导致具有低计算开销的鲁棒放大器。放大镜在使用YUV颜色模型的显卡方面存在问题,但是这些问题可以通过RGB到YUV翻译软件解决——问题是这个解决方案的可信性有待研究。当通用设备驱动程序而不是制造商的设备驱动程序安装在系统上时,放大镜也存在问题。本文对于全屏幕放大提出了两个进一步的策略,即使用多监视器支持和真正类型的字体文本放大。
一、引言
放大镜是由低视力的人从计算机屏幕读取信息时使用的基于软件的系统。在第二节中,我们简要概述放大镜的特征,并解释“全屏放大”一词的含义。
在第三部分中,我们提出了可以并已经用于多窗口系统放大镜设计中的两个主要策略。我们的意图不是给出详尽的或基于软件的放大的确定历史。这里有许多的原因。首先,少数结构我们知道的例子服务于开发我们分类的目的。其次,大多数放大镜是由商业组织开发的,因此,其技术细节未公布;事实上,发表论文中很少有讨论商业放大镜使用的策略,即使是在表面层面。因为我们把讨论限制在放大器的架构是我们所熟知的,不可避免的是其中大多数是由作者开发的系统。此外,我们特别地从讨论中排除了诸如向用户呈现的多个视图和全屏放大以外的显示模式(参见第二节)的高级特征,以减少纸张的尺寸和复杂性。
本文详细描述了作者开发的商业放大镜的架构,其使用DirectX叠加作为放大策略的基础。 DirectX是一种来自微软的技术,它最初是为支持在PC平台上生产高性能游戏而开发的。它有利于我们的目的是因为它提供了设施快速,无闪烁地呈现视频显示信息,并支持平台独立的覆盖(稍后讨论)方式。有关详细信息,请参见。我们相信这是一种新颖的方法,虽然其他商业系统可能使用它,但是我们知道没有。我们当然不知道任何描述这种方法的出版物。我们认为这种方法非常优雅并且我们的评估显示它是有效的。本文最后确定一些进一步的放大策略,这些策略我们认为是新颖的并且可能提供一些显着的优势的,但是还尚未实施。
- 放大
在本节中,我们简要概述在现代放大镜中的功能。在讨论中,我们假设放大镜正在提供多窗口GUI(图形用户界面)的操作系统的计算机上使用。
放大镜的作用是获取操作系统或应用程序正在写入屏幕的信息,并放大它以便更容易阅读。用户选择的放大率通常在2:1至16:1的范围内,但最高可达32:1。
从用户的角度来看,有三种基本操作模式:镜头放大,部分屏幕放大和全屏幕放大。
镜头放大镜类似于使用手持放大镜阅读基于纸张的文本。用户将光标(通常是鼠标指针)移动到屏幕周围,使得光标下方的区域被放大,并在与光标相同的屏幕区域中呈现给用户
部分屏幕放大镜以一种和镜头放大镜类似的方式工作来让光标当前位置下的区域被放大。然而,不是将扩大区域呈现在与光标相同的屏幕区域中,而是将其显示在专用屏幕区域中,通常是屏幕的顶部或底部。
全屏放大镜放大整个屏幕。放大图像的中心通常对应于光标位置。
图1显示出了这些模式之间的差异。
许多商业放大镜支持所有这些模式,虽然不太复杂和通常更便宜的放大镜不支持全屏幕放大。对操作模式的描述可能看起来过于简化,并且真实的是,现代的,全功能的放大器具有更多的操作模式。然而,我们认为,虽然其中许多是有用的,但它们基本上是上述三种模式的变化。
本文主要侧重于全屏放大,主要是因为我们认为这是从技术角度来看最困难的问题。普通显示屏必须完全被放大版本所替代(这比选择性地放大屏幕部分更困难)和光标(鼠标指针 ——我们将使用术语鼠标指针在本文的其余部分)也必须扩大。
当然,全屏幕放大只能在任一时刻呈现整个计算机屏幕的一部分。因此,在用户的屏幕上出现的是原始(源)输出的放大的“窗口”。放大镜必须允许用户在源周围移动放大的窗口。这通常通过将显示器居中在当前焦点上来完成。我们将焦点定义为用户注意力在屏幕上的位置。焦点通常集中在鼠标指针。然而,焦点可以集中在其他对象上,包括:文本文档中的文本输入指针(插入符号)当前加亮项目,例如下拉菜单中的项目;在对话框中当前聚焦的控件等。当用户与应用交互或从应用窗口移动到应用窗口时,焦点将根据当前操作而改变。例如,用户可以使用鼠标指针来选择字处理器的窗口。当用户开始键入时,焦点将是字处理器的文本输入指针。如果由于用户交互而出现弹出窗口(例如,因为用户键入了快捷键以显示“查找”菜单),焦点将变为窗口。
考虑跟随鼠标指针的情况。当鼠标移动时,放大区域应该平滑地在用户的显示器上滚动,使得指针位于或靠近窗口的中心。
最后,放大镜可以提供文本平滑。当以特定分辨率绘制字符时,它使用一组使其看起来光滑的像素。然而,当放大时,文本可以显得相当“块状”。这种效果在图2中示出。这是在计算机图形中出现的众所周知的混叠问题。可以通过使用文本平滑(抗锯齿)算法来减少混叠,这使得放大的文本具有更平滑的轮廓。在第五节中提出了一个更激进的解决方案。如果字符使用真实类型的字体显示,我们建议以更大的字体大小重写字符。
- 背景
首先,我们不看好定制硬件解决方案和直接控制计算机的视频硬件的解决方案,这些解决方案用于基于DOS的放大镜(例如[4]—[5][6]),因为这些方法现在已经过时。我们相信,这些是已经使用的现代多窗口GUI的全屏幕放大的两种主要方法,即基于设备驱动器的放大器和基于操作系统的放大器。我们将讨论限制在Microsoft Windows平台。
在基于Windows的放大镜中,必须逐个像素地放大屏幕,而不是像早期基于DOS的系统那样逐个字符。但是,仍然可以逐个字符地使用放大—见第五节中的建议。
在Windows中,应用程序通过调用图形显示接口(GDI)“写入屏幕”(见图3)。GDI是提供例如将文本或位图写到屏幕上的指定位置的功能的API(应用编程接口)。GDI随后调用由显卡制造商提供的设备驱动程序(DD)。为了允许GDI与多种显卡接口,DDs具有标准化的接口,同时也也具有通知GDI设备功能的手段,以便GDI可以最有效地使用该卡。。
放大有两个基本策略。一个是将DD替换为利用显卡特性的自定义DD(在第三-A节中描述)。另一种是通过捕获和更改在应用程序,GDI和DD(在第三-B节中描述)之间流动的数据来利用操作系统的特性。
A.基于设备驱动程序的放大
在这种方法中,开发了定制的DD,通过操纵其寄存器来利用显卡的特性。例如,Sensory软件的Magnus(一个Windows 3.1放大镜)取代了标准的VGA驱动程序。该方法运行良好,但有明显的局限性。它替代了通用VGA驱动程序,因此仅在VGA模式下工作。此外,不能使用更高级的显卡的特性。
B.基于操作系统的放大
如果不重写图3所示的任何主要组件,最明显的方法是截取或过滤对GDI或DD的调用,使用从调用中获取的信息来构造放大图像,然后通过使用GDI或DD提供的接口显示放大图像。拦截在GDI或DD上进行的调用的过程被称为挂钩。当DD上的调用被拦截时,这被称为“挂钩低”。有几种技术可以用于拦截GDI / DD调用,其中许多不是Microsoft推荐的(但是被广泛使用)。 Windows 95/98 / Me下的一个支持机制是Microsoft Active Accessibility(MSSA),它提供了一个DDI(设备驱动程序拦截)挂钩,允许程序拦截GDI在DD上进行的调用。这些调用中包含的信息由放大镜用来构造放大图像,然后通过在DD上调用将其发送到屏幕。必须小心,因为DD被使用两次,一次被GDI的呼叫被钩子拦截,一次被放大镜拦截。嵌入式放大镜的调用中必须有信息,以区分这些与GDI进行的调用。如果没有,放大镜的调用被挂钩并传递给放大镜,用于随后的放大—一个相当不幸的递归。
当GDI上的应用程序进行的调用被拦截时,这被称为“挂钩高”。这里,放大器重定向在GDI上进行的调用以创建屏幕位图。这意味着放大镜使用GDI的功能来创建和维护要放大的图像。放大的部分通过在DD上调用被发送到屏幕。
C.方法讨论
使用自定义DD替换DD(第三-A节)有很大的局限性。要么必须为市场上的每个视频卡开发自定义DD,或者必须开发具有最低公共分母功能的通用驱动程序(例如通用VGA驱动程序)。前者涉及显着的开发和维护成本;后者可以显着减少可以支持的应用的数量并且对系统的性能具有显着的负面影响。
钩子(高和低)可用于创建放大镜。实际上,作者创建了一个使用DDI钩子的原型放大镜。这在其在一系列系统上产生可接受的放大图像的意义上起作用。但是,还有一些问题。
首先,DDI钩子仅适用于Windows 9x平台,因此不支持Windows NT和Windows 2000。应该注意的是,本文中描述的使用DirectX Overlays的方法不适用于Windows NT4,但将适用于Windows 9x和Windows 2000。
第二,系统具有相对高的计算开销(在处理器时间和存储器方面)。这是因为在DD上的GDI进行的所有调用都必须被拦截和处理以创建源图像的离屏位图。
最后,应用程序可以通过例如使用DirectX直接写入绕过GDI-DD路由的屏幕。这些屏幕写入不被DDI钩子拦截。最多,放大镜错过了屏幕写入。在最坏的情况下,这些操作的结果出现在放大图像的顶部。
我们对DirectX的研究提出了一种不同的方式来实现放大镜,这似乎提供了更大的稳定性并且减少了计算负荷。这将在下面的第四节中描述。
- 放大使用叠加
A.基本操作
许多现代显卡支持叠加。他们的操作可以简单地用类比来解释。假设有一张彩色纸(背景)和一张或多张透明胶片,其上已经画了一个物体。假设薄膜片被放置在背景的顶部上。然后可以相对于背景和彼此移动薄膜片,从而给出相对运动的外观。游戏程序员主要使用其中精灵(类似于透明片上的对象)可以在前面移动到标准显示表面(背景)的技术。叠加可以由DirectX处理,它提供了一个API。使用DirectX处理覆盖的程序员不必担心底层硬件的特性,只要它支持覆盖。大多数现代显卡支持覆盖,我们尝试我们的放大镜超过20个,并且都有支持覆盖(虽然不是所有我们的放大镜在工作 - 见第四-D节)。 DirectX支持Windows 95,98,Me和2000下的覆盖,但不支持NT4。
简单的放大是非常简单的。Windows操作系统和应用程序以正常方式使用显示,通过GDI,然后使用DD,它在屏幕表面上显示图像。放大镜访问屏幕显示并选择适当的放大部分。这通过像素复制放大并复制到全屏幕覆盖。这个覆盖(不同于用于子画面的那些)没有透明区域,因此完全遮蔽原始图像(正常的不放大显示)。在前面提出的类比方面,它与采用另一张彩色纸并完全遮蔽背景相同。背景仍然存在,但它不再可见。这种方法的另一个优点是,将支持通过使用DirectX绕过GDI-DD路由的一些应用程序。这是因为它是放大的最终映像。这个问题与第三节讨论的其他方法相同。
因此,在这种方法中,我们允许操作系统以正常方式创建和显示图像,但用覆盖图遮蔽它。我们的理解是,DirectX完全绕过GDI / DD显示机制,并使用一组自定义驱动程序直接写入屏幕。
通过使用DirectX API的其他功能来实现图像的放大。DirectX提供了一组像素“blitting”操作。标准的DirectX“blitting”调用(blt)要求在调用中指定源和目标区域。如果源和目标图像具有不同的尺寸,源图像将被拉伸以适合目标。因此,如果选择与要放大的区域相对应的源图像的一部分,并且目的地区域被选择为与要显示的覆盖图相同,则“blitting”操作将执行放大,而无需来自放大镜。如果需要文本平滑(请参阅第四-C节),则可以在显示叠加之前执行。使用DirectX的另一个优点是屏幕的更新发生在监视器的垂直刷新期间。这意味着显示稳定,无闪烁的图像。
然而,这种方法存在一些潜在的问题。
首先,并非所有显卡都支持叠加层。这是遗留系统的一个问题,但我们的经验是,所有现代显卡都提供支持。
第二,一些视频卡不支持大于640times;480像素的覆盖分辨率。这个问题的解决方案相对简单。放大镜以640times;480像素创建放大的图像,然后将覆盖图拉伸以覆盖屏幕。此解决方案运行良好,但限制了高分辨率下的平滑范围。
最后,最重要的问题是一些覆盖不使用RGB颜色模型,而是使用YUV。目前,对于使用YUV的显卡,图像显示不正确。这是一个仍在研究的领域—一个仍然需要测试的可能的解决方案是执行RGB到YUV颜色模型转换。
B.其他问题
到目前为止,本文着重于放大器访问源图像和放大后显示它的问题。在实用的放大镜中,还有许多其他问题需要解决。这些是:提供一个放大的鼠标指针;跟踪焦点(即显示图像中对用户最感兴趣的部分);和平滑文本。
1.放大鼠标指针
在许多计算机系统中,鼠标指针的显示直接由硬件图形卡执行,并且绕过图形显示的正常方法。在许多方面,显示鼠标指针的标准方法类似于使用覆盖层的子画面的呈现和移动。鼠标指针覆盖在正常输出上。因此,当通过先前描述的任何方法捕获源图像时,鼠标指针不存在于该图像上。这意味着放大器必须生成其自己的鼠标指针,并将其呈现在与所显示的图像相同的放大水平。
要构造放大的鼠
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[138658],资料为PDF文档或Word文档,PDF文档可免费转换为Word