2013-04-22 45 views
1

我正在Linux上用GCC制作应用程序,其中我一直使用PngLIB从磁盘加载图片一段时间。我从标准xlib跳转到Xrender扩展,以便利用此扩展提供的抗锯齿和alpha通道属性。XRender从磁盘/应用程序生成的图像显示图片

但是,此扩展提供了一组简化的基元。例如,为了显示从磁盘加载的图片,我一直使用pnglib加载它,然后调用XRenderFillRectangle,宽度和高度分别为1像素和所需的颜色。但是,当我增加从磁盘加载的图标和图片的数量时,很容易理解我轻松地遇到了对原始XRenderFillRectangle的数百万次调用。结论:目前,该应用程序需要大约20秒才能渲染所有内容,甚至不到我想渲染的一半。

我很确定,我使用的这种方法是完全错误的,而且必须有另一种方式!而且我也很确定,这不是开罗或Java2D生成这些东西的方式。

所以我的问题是:我该如何准备并放入由应用程序生成的Xrender图像的图片?像例如,从磁盘加载的图像?

标准XPutImage功能可以应用在Xrender的图片上吗?在生成图片之前我应该​​将数据放入Pixmap中吗?我的方法到目前为止还没有奏效。

PS:请不要推荐我使用更加丰富的库,例如Cairo或Qt。我现在在这里提出这个问题,因为不幸的是,每次我发现有关这种情况的帖子,大多数人的回答是:使用开罗。我真的需要尽可能保持这个X11系统的低水平。非常感谢你。

+0

你有没有尝试使用[网站搜索(http://stackoverflow.com/questions/6609281/how-to-draw-an-image-from-文件上的窗口与 - Xlib的)? – 2013-04-22 11:53:37

+0

您是否尝试阅读我的问题?我使用Xrender扩展,因此我无法将XPutImage应用于图片,只能应用于PixMap。 – filipehd 2013-04-22 14:17:18

+0

为什么你不想使用普通的xlib? – 2013-04-22 16:08:29

回答

2

XRenderCreatePicture以pixmap(或任何drawable)作为参数。 为了使用XRENDER绘制像素,您需要:

  • 创建像素图
  • 传输图像数据使用XPutImage
  • 服务器
  • 创建您的像素图
  • 创建图片对象与窗口关联相关的图片对象
  • 撰写他们使用XRenderComposite

见libXRender documentati使用node-x11here

例子:

var x11 = require('x11'); 

var Exposure = x11.eventMask.Exposure; 

var width = 300; 
var height = 300; 

var rgb = { 
    data:new Buffer(width*height*4), 
    width: width, 
    height: height 
}; 

var index; 
for (var x = 0; x < rgb.width; ++x) 
{ 
    for (var y = 0; y < rgb.height; ++y) 
    { 
    index = (x + y*rgb.width)*4; 
    rgb.data[index] = parseInt(Math.sin(13*x/rgb.width)*255); 
    rgb.data[index+1] = parseInt(Math.cos(15*y/rgb.height)*255); 
    rgb.data[index+2] = parseInt(Math.cos(16*y/rgb.height)*255); 
    } 
} 

x11.createClient(function(err, display) 
{ 
    var X = display.client; 
    X.require('render', function(Render) { 
    var root = display.screen[0].root; 
    var win, picWin, pic, gc; 

    win = X.AllocID(); 
    X.CreateWindow(
     win, root, 
     0, 0, rgb.width, rgb.height, 
     0, 0, 0, 0, 
     { eventMask: Exposure } 
    ); 
    X.MapWindow(win); 

    gc = X.AllocID(); 
    X.CreateGC(gc, win); 

    var rgbPixmap = X.AllocID(); 
    X.CreatePixmap(rgbPixmap, win, 24, rgb.width, rgb.height); 
    X.PutImage(2, rgbPixmap, gc, rgb.width, rgb.height, 0, 0, 0, 24, rgb.data); 

    var rgbPicture = X.AllocID(); 
    Render.CreatePicture(rgbPicture, rgbPixmap, Render.rgb24); 
    var winPicture = X.AllocID(); 
    Render.CreatePicture(winPicture, win, Render.rgb24); 

    X.on('event', function(ev) { 
     if (ev.name == 'Expose') 
     Render.Composite(3, rgbPicture, 0, winPicture, 0, 0, 0, 0, 0, 0, rgb.width, rgb.height); 
    }); 
    }); 
}); 
+0

您能否在node-x11中为此创建一个示例? – exebook 2014-02-02 12:43:07

+0

这里有几个例子 - https://github.com/sidorares/node-x11/tree/master/examples/png和https://github.com/sidorares/node-x11/tree/master/examples/ kbdheatmap我将添加更短的示例来回答 – 2014-02-03 00:04:39

相关问题