2013-04-22 1 views
1

Я делаю приложение на Linux с GCC, в котором я загружаю свои фотографии с диска с помощью PngLIB в течение некоторого времени. Я перешел от стандартного xlib к расширению Xrender, чтобы использовать свойства сглаживания и альфа-канала, предлагаемые этим расширением.XRender Показать изображения с образов дисков/приложений

Однако это расширение предлагает уменьшенный набор примитивов. Чтобы, например, отобразить изображение, загруженное с диска, я загрузил его с помощью pnglib, а затем сделаю вызов XRenderFillRectangle с шириной и высотой 1 пиксель и желаемым цветом для этого пикселя. Однако по мере увеличения количества значков и изображений, загруженных с диска, легко понять, что я легко запускаю МИЛЛИОНЫ вызовов примитивного XRenderFillRectangle. Заключение: на данный момент приложение занимает около 20 секунд, чтобы отобразить все вещи, и это даже не половина того, что я хочу сделать.

Я уверен, что этот подход, который я использую, полностью неправильный, и должен быть другой способ! И я также уверен, что это не так, как это делают Каир или Java2D, чтобы генерировать материал.

Так что мой вопрос: Как подготовить и поместить в изображение изображений Xrender, которые были сгенерированы приложением? Как, например, изображения, загруженные с диска?

Может ли стандартная функция XPutImage применяться на изображении Xrender? Должен ли я помещать данные в Pixmap перед генерацией изображения? До сих пор мои подходы не работали.

PS: Пожалуйста, не рекомендуем мне использовать более богатую библиотеку, такую ​​как Каир или Qt. Я задаю этот вопрос здесь, потому что, к сожалению, каждый раз, когда я нахожу сообщение об этой ситуации, ответ большинства людей: используйте Каир. Мне действительно нужно оставаться на низком уровне, насколько это возможно, с помощью этой системы X11. Большое спасибо.

+0

ли вы пытаетесь использовать [поиск по сайту] (http://stackoverflow.com/questions/6609281/how-to-draw-an-image-from- файл-на-окно-с-Xlib)? –

+0

Вы пытались прочитать мой вопрос? Я использую расширение Xrender, поэтому я не могу применить XPutImage к картинке, только для PixMap. – filipehd

+0

Почему вы не хотите использовать обычный xlib? –

ответ

2

XRenderCreatePicture принимает в качестве параметра pixmap (или любой возможный). Для того, чтобы привлечь пиксели с помощью Xrender, вам необходимо:

  • создать PIXMAP
  • данных
  • передачи изображений на сервер, используя XPutImage
  • создать объект изображения, связанный с пиксельной
  • создать объект Picture, связанные с окном
  • компоновать их с помощью XRenderComposite

См libXRender documentati на here

Пример с использованием node-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); 
    }); 
    }); 
}); 
+0

Можете ли вы создать пример для этого в node-x11, пожалуйста? – exebook

+0

есть пара в примерах - https://github.com/sidorares/node-x11/tree/master/examples/png и https://github.com/sidorares/node-x11/tree/master/examples/ kbdheatmap Я добавлю более короткий пример ответа –