Pergunta

Estou começando a codificar meu próprio gerenciador de janelas e queria saber como usar a API XORG para obter dados de imagens brutas (como os dados fornecidos pelo libpng), em um Xorg Pixmap ou algo traçado por Xorg?

Foi útil?

Solução

XCreatepixMapFromBitmapData deve fazer exatamente isso. Lembre -se de que você precisa alimentar dados da mesma profundidade de bits que o XServer está usando.

Outras dicas

Você provavelmente descobriu isso em algum momento desde 2008, mas para o benefício de futuros leitores ...

XCreatepixMapFromBitmapData () carregará dados literal de bitmap (ou seja, 1 bit, preto e branco) em um pixmap. Provavelmente, isso não é o que você deseja, se o objetivo é carregar de um PNG.

Uma maneira mais nova de fazer isso é usar o Cairo ou o GDKPIXBUF. As APIs XLIB da velha escola, como xcreatepixmapfrombitmapdata () e xDrawwhed;

A maneira como as pessoas geralmente recomendam fazer as coisas hoje em dia é:

  • Prefiro libxcb a libx11, libxcb é apenas um invólucro muito fino em torno do protocolo X e carece de chamadas que fazem várias solicitações de protocolo X (por exemplo, createpixmapfrombitmapdata faz createpixmap, createGC, putimage, freeGC)
  • Prefira o Cairo (ou biblioteca comparável, Skia é uma) às APIs de desenho do lado do servidor

Você pode usar o Cairo_Image_Surface_Create_From_Png () para fins simples ou gdkpixbuf se precisar suportar mais formatos, etc.

Há um pouco de dança com XCreateImage, XCreatepixmap e Xcopyarea que você precisa fazer. Vai um pouco assim:

struct Image img = get_pixels_and_geometry_from_libpng("filename.png");
XImage *img = XCreateImage(/*5000 paremeters*/);
Pixmap pixmap = XCreatePixmap(dpy, img.width, img.height, 24);
XPutImage(dpy, pixmap, gc, 0, 0, img.width, img.height);
XCopyArea(dpy, pixmap, window, 0, 0, img.width, img.height, x, y);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top