Xorg carregando uma imagem
-
19-08-2019 - |
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?
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);