Xorg загрузка изображения - PullRequest
       45

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

2 голосов
/ 06 декабря 2008

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

Ответы [ 3 ]

3 голосов
/ 09 сентября 2010

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

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

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

То, как люди обычно рекомендуют делать вещи в эти дни:

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

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

1 голос
/ 06 декабря 2008

XCreatePixmapFromBitmapData должен сделать именно это. Помните, что вам нужно вводить данные с той же битовой глубиной, что и ваш xserver.

0 голосов
/ 21 июля 2011

Есть небольшой танец с 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);
...