Xorg загружает изображение

Я начинаю кодировать свой собственный оконный менеджер, и мне было интересно, как использовать xorg api для получения необработанных данных изображения (например, данных, предоставленных libpng), в Xorg Pixmap или что-то, что можно нарисовать Xorg?


person DavidG    schedule 06.12.2008    source источник


Ответы (3)


XCreatePixmapFromBitmapData должен делать именно это. Помните, что вам нужно вводить данные той же разрядности, которую использует ваш xserver.

person Johan Dahlin    schedule 06.12.2008

Вы, вероятно, обнаружили это в какой-то момент с 2008 года, но на благо будущих читателей...

XCreatePixmapFromBitmapData() загрузит буквальные растровые (т.е. 1-битные, черно-белые) данные в растровое изображение. Скорее всего, это не то, что вам нужно, если цель состоит в том, чтобы загрузить из PNG.

Более новый способ сделать это — использовать Cairo или GdkPixbuf. API-интерфейсы Xlib старой школы, такие как XCreatePixmapFromBitmapData() и XDrawWhatever(), в значительной степени устарели (не то чтобы они были когда-либо удалены, но они устарели и не соответствуют тому, как работают современные приложения).

В наши дни люди обычно рекомендуют делать следующее:

  • предпочитайте libxcb libX11, libxcb — это всего лишь очень тонкая оболочка вокруг протокола X, и в ней отсутствуют вызовы, которые выполняют несколько запросов протокола X (например, CreatePixmapFromBitmapData выполняет CreatePixmap, CreateGC, PutImage, FreeGC)
  • предпочитайте cairo (или аналогичную библиотеку, Skia — одна из них) API-интерфейсам рисования на стороне сервера

Вы можете использовать cairo_image_surface_create_from_png() для простых целей или GdkPixbuf, если вам нужно поддерживать больше форматов и т. д.

person Havoc P    schedule 09.09.2010

Вам предстоит немного потанцевать с XCreateImage, XCreatePixmap и XCopyArea. Это происходит примерно так:

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);
person Dave    schedule 21.07.2011