我正在与GCC一起在Linux上开发一个应用程序,在这个应用程序中,我已经用PngLIB从磁盘加载图片已有一段时间了。为了利用这个扩展提供的反混叠和alpha通道属性,我从标准的xlib跳转到了x呈现扩展。
但是,这个扩展提供了一组简化的原语。例如,为了显示从磁盘加载的图片,我一直用pnglib加载它,然后调用XRenderFillRectangle,其宽度和高度为1像素,该像素的颜色为所需的颜色。但是,随着从磁盘加载的图标和图片的数量增加,很容易理解我很容易遇到数百万次对原始XRenderFillRectangle的调用。总结:目前,这个应用程序只需要20秒左右就可以渲染所有的东西,甚至还不到我想要渲染的一半。
我很确定我使用的这种方法是完全错误的,而且肯定有另外一种方法!我也非常肯定的是,开罗或Java2D并不是用这种方式来生成这些东西的。
,所以我的问题是:,如何准备并放入应用程序生成的Xrender图像的图片中?例如,从磁盘加载的图像?
标准的XPutImage函数能应用于Xrender的图片吗?在生成图片之前,我应该把数据放到像素映射中吗?到目前为止我的方法还没有奏效。
PS:,请不要推荐我使用更丰富的库,如开罗或Qt。我现在在这里提出这个问题,因为不幸的是,每次我找到关于这种情况的帖子时,大多数人的回答是:使用开罗。我真的需要在这个X11系统中保持尽可能低的水平。非常感谢。
发布于 2013-04-22 21:48:39
XRenderCreatePicture将像素映射(或任何可绘制的)作为参数。为了使用x呈现绘制像素,您需要:
见libXRender文档这里
使用节点-x11的示例
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);
});
});
});https://stackoverflow.com/questions/16146377
复制相似问题