cairo与windows图形接口

1.   简介

Linux的两大流行桌面环境KDE和Gnome,其对应的基础组件QT和GTK+,GTK+的底层图形绘制用的就是cairo。cairo (http://cairographics.org)是开源矢量图形库支持多种输出,cairo由c语言编写模块化设计得很出色,这里分享(非教程)cairo的windows移植定制(VS2012编译),及跟windows的图形接口DXGI对接,通过DXGI来渲染显示cairo产生的图像帧。

2.   cairo 图形库

cairo是个不小的工程,多少行就没去统计,cairo-1.12.18源码包65.9M,去除测试文件、测试代码、文档、其源代码文件近10M。移植当然是从readme入手,文档说用Cygwin或MSYS编译,自己用VS当然也可以。

  • 在cairo/src创建cairo-features.h,描述cairo的功能模块。这个算是大幅定制版本,IMAGE、FT(FreeType)是必须,PNG方便用来查看图像,SVG、PDF是广泛使用的矢量图形格式,XML、RECORDING是我临时用配上的

  

  • 创建cairo的VS Win32 DLL空项目,src\Makefile.sources里有代码文件列表,代码的组织结构,按照这个文件结合配置的模块添加代码。另外,还有一些依赖库pixman、zlib、libpng、freetype,其中libpng也都依赖zlib。这些库都可以用最新版本,创建VS项目都差不多主要是看官方文档说明

  

  • 编译生成DLL,编译cairo有一千多条警告,最后生成的DLL文件Debug版2.9M,Release版1.3M。其他依赖库当然要提前编译好,zlib是编译为DLL,pixman、libpng、freetype均使用静态库。编译好DLL后就可以使用cairo绘图了,绘制的图像在一个可以访问的内存里

  

3.   Windows 图形接口

  上面两张图摘自微软官方文档,左边是windows xp图形系统接口,右边是vista及其之后windows的。从vista开始,微软设计了全新的显示驱动模型,调整了图形系统架构,可以提供更好的图像质量,可以为界面提供硬件加速。参考文档:https://msdn.microsoft.com/en-us/library/ee417756(v=vs.85).aspx

  上图是DXGI(DirectX Graphics Infrastructure),是从vista开始的一个新的子系统。DXGI用于处理一些底层任务如枚举硬件设备,创建缓存交互链(swap-chain),呈现渲染好的图像帧到输出设备等,程序可以直接访问DXGI。参考文档:https://msdn.microsoft.com/en-us/library/bb205075(v=vs.85).aspx

4.   显示cairo的图像帧

显示内存中的一幅图像方法可以通过GDI,也可以走D3D/OPENGL纹理,但是将图像数据写到显示帧缓冲无疑是快速的方式。我编写了一个程序,用于将内存中的图像数据写到buffer。阅读官方的Programming Guide还有Reference,文档位于(MSDN章节)Desktop app technologies-----> Graphics and Gaming-----> Direct 2D / Direct 3D / DirectX Graphics Articles

cairo创建surface其像素格式CAIRO_FORMAT_RGB24是32位,对于的buffer像素格式DXGI_FORMAT_B8G8R8A8_UNORM。desc.OutputWindow即是关联的输出窗口。cairo绘图完毕后调用cairo_image_surface_get_data 得到图像数据,我简单的封装了一个函数将数据写入buffer。

下面是绘图代码和产生的图像

5.   结束语

  有 .NET,有基于Web UI的hybrid APP框架,有类似于QT的整套解决方案,估计很少人会使用专业的图形库去创建UI界面。这个库可以用在一些高效绘图的场合,像windows 8任务管理器的性能界面。都说下一代的人机交互是语音甚至视觉,当用户对着机器说话,或是通过机器视觉(OpenCV)分析出用户的输入,到时候UI会不会变得非常简单高效,像钢铁侠、遗落战境、等等科幻大片一样,没有button、scrollbar,不需要touch,要的只是快速的绘制与呈现,及时的将信息传达给用户,相信这是人机交互的发展趋势。

时间: 2024-10-11 08:49:36

cairo与windows图形接口的相关文章

[C语言](二)01 获取Windows图形构件大小信息

SYSMETS.c #include <windows.h> #include "SYSMETS.H"//自定义的单元,所以用"",不是用<> //消息循环处理函数,Windows回调函数 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //Windows程序的入口函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevIn

GDI+入门——带你走进Windows图形的世界

一.GDI+基础 1.GDI+简介 GDI+是微软的新一代二维图形系统,它完全面向对象,要在Windows窗体中显示字体或绘制图形必须要使用GDI+.GDI+提供了多种画笔.画刷.图像等图形对象,此外还包括一些新的绘图功能,比如渐变.除锯齿.纹理等. GDI+包括三部分:二维矢量图形的绘制.图像处理和文字显示.GDI+使用的各种类大都包含在命名空间system::Drawing中. 2.常用的数据结构 在使用GDI+显示文字和绘制图形时,需要用到一些数据结构,例如Size.Point.Recta

windows多线程接口介绍和使用

一windows多线程接口: 1 创建线程 CreateThread 与 _beginthreadex都可以实现创建线程,两个函数的参数 相同, HANDLEWINAPICreateThread( LPSECURITY_ATTRIBUTESlpThreadAttributes, SIZE_TdwStackSize, LPTHREAD_START_ROUTINElpStartAddress, LPVOIDlpParameter, DWORDdwCreationFlags, LPDWORDlpThr

GTK+初识---高大上的图形接口

GTK+,或者是叫做GIMP工具组件,是一套创建图形用户接口的多平台组件.GTK+提供了一套完整的组件集,同时他不仅仅适用于小型工具开发,同样也适用于一个完整的项目套件. 像我们熟悉的gnome桌面,各个系统平台上的GIMP图像处理软件,VMWare工作站,以及OS X和Windows vista上的gedit文本编辑器等都是使用GTK创建的. GTK+是使用C语言写的,但是已经被设计成支持多语言的框架了,例如在Perl和python等中使用GTK+可以快速的创建桌面应用程序.同时,他是使用GO

PPAPI中使用Chromium的3D图形接口

使用PPAPI的Graphics 3D接口做了一个小示例,鼠标点击插件区域,绘制颜色,效果与ppapi_simple类似. foruok原创,如需转载请关注foruok的微信订阅号"程序视界"联系foruok. 项目 项目与VS2013编译最简单的PPAPI插件这篇文章里说的ppapi_simple类似. 附加包含路径有些不同,如下: E:\sources\CEF\2526\chromium\src\ E:\sources\CEF\2526\chromium\src\ppapi\lib

C++ windows图形界面,点击Button按钮通过openFileDialog控件选择文件

一直没用C++写过图形界面,之前用C#写很简单啊,没想到今天用C++还是有点不爽! 第一个问题,就是点击一个按钮button,选择文件,非文件夹,是文件,就是图片之类的东西! 首先,可以在界面中拖一个openFileDialog控件,控件名字就叫openFileDialog1,如图所示 也可以在Button的点击事件里new一个openFileDialog控件也可以! 然后,就是在button点击事件里,写下相应的代码就可以了: private: System::Void button1_Cli

最常用的图形接口:VNC

若要安装VNC,首先有两个软件包需要安装.一个是客户端的服务,一个是服务器端的服务. 下面就开始操作吧!切记,我下面的这些步骤缺一不可,我是经常多次测试的! ① 安装服务器端的VNC软件包 ② 安装客户端的VNC软件包 ③ 安装图形界面软件包 ④ 修改/etc/sysconfig/vncservers配置文件(另外一种方法就是直接vncserver:端口) 在配置文件最后加入下面这句话 ⑤ 修改vi /root/.vnc/xstartup配置文件 注释下图中红框中的内容,并在后面添加蓝框中的内容

最近发现了一个神器AutoHotKey,可以比作Windows图形界面下的shell脚本

在shell下,我们需要完成什么操作,可以写成一个shell脚本然后运行它: win下,可以写个autohotkey脚本,然后绑定快捷键,一键运行. 网上的教程很多,如 http://xbeta.info/autohotkey-guide.htm http://jixiuf.github.io/autohotkey/AutoHotKey_1.html http://www.cnblogs.com/hustlijian/archive/2012/11/26/2789726.html 有个中文论坛

curl -windows下接口通讯

1,下载curl -----url命令传输工具 2,配置curl环境变量 3,在cmd环境中使用 举例:curl -G http://xxxxxxx.com?+参数 使用:curl -G "www.baidu.com" 最原始的批量通讯返回 可以将通讯命令保存为bat格式文件,通过cmd运行访问 原文地址:https://www.cnblogs.com/wzpy/p/8203437.html