LINUX.ORG.RU

Xrender - need help!


0

0

Кто-нибудь может кинуть ссылку на пример использования XRender для получения альфа-композита. А то, что-то не композитится ничего.:(

Задача состоит в том, что бы закомпозитить два имаджа (не XImage) с транслюсентной прозрачность на окошке (не прозрачном).

Поступаю след. образом: создаю XImage на основе данных из имдж., создаю Pixmap - на него PutImage, на основе этого Pixmapa cоздаю Picture, далее создаю Picture от окошка и композичу два этих Picture. В Результате на окошке ничег нет. Где Грабли?

anonymous

Делаю выдержку из моего работающего canvas'а в части,
касающейся XRender:

typedef struct {
    GtkObject parent;

    ....
    Pixmap xShmPixmap;
    Picture xrPicture;
    XRenderPictFormat *xrPictFormat;
    ....
} GgRenderCanvas;

...
int major, minor;
if (XRenderQueryVersion (GDK_DISPLAY (), &major, &minor) == 0)
    puts ("[GgRenderCanvas] class_init: XRender NOT present");
else
    printf ("[GgRenderCanvas] class_init: XRender v%d.%d\n",
            major, minor);
...

...
self->xrPicture = XRenderCreatePicture (GDK_DISPLAY (),
                                        self->xShmPixmap,
                                        self->xrPictFormat, 0, NULL);
...

static void gg_rendercanvas_draw (GgCanvas *_self, GdkGC *gc,
    GdkDrawable *drawable,
    gint xsrc, gint ysrc, gint xdest, gint ydest,
    gint width, gint height)
{
    GgRenderCanvas *self = GG_RENDERCANVAS (_self);

    GdkVisual *visual;
    XRenderPictFormat *format;
    Picture dst;

    visual = gdk_drawable_get_visual (drawable);
    format = XRenderFindVisualFormat (GDK_DISPLAY (),
                                      GDK_VISUAL_XVISUAL (visual));
    dst = XRenderCreatePicture (GDK_DISPLAY (),
                                gdk_x11_drawable_get_xid (drawable),
                                format, 0, NULL);

    XRenderComposite (GDK_DISPLAY (), PictOpOver, self->xrPicture,
                      None, dst,
                      xsrc, ysrc, 0, 0, xdest, ydest, width, height);

    XRenderFreePicture (GDK_DISPLAY (), dst);

    gdk_flush ();
}

Это работает. Желаю успехов.
                            Dmitry M. Shatrov aka erDiZz

anonymous
()
Ответ на: комментарий от anonymous

Да, ещё есть строка про формат в _init:

    self->xrPictFormat = XRenderFindStandardFormat (GDK_DISPLAY (),
                            PictStandardARGB32);

Это потому что у меня pixmap SHM'ный, и рисую на нём я вручную, а тебе, похоже, нужно указать формат, который использует GdkVisual.. если там будет такой.. гм. В исходниках GDK на выбор подходящего XRender формата ушло немало строк - можно там ещё смотреть, если нужен пример. Это в файле gdk/x11/gdkdrawable_x11.c
    erDiZz

anonymous
()
Ответ на: комментарий от anonymous

Этот мануал я изучил вдоль и поперек, там речь еще идет еще о XComposite extension, данное раширение на сервере не установлено, может поэтому не работает? :)

anonymous
()
Ответ на: комментарий от anonymous

Я в принципе так и делаю, но если я использую XRenderFindVisualFormat, то format->direct.alphaMask == 0, а если использовать XRenderFindStandardFormat от ARGB32, то валиться XRenderCreatePicture и ничего не композититься в любом случае.

anonymous
()
Ответ на: комментарий от anonymous

Заработало, но несовсем так, как хочется. Осталась проблема с альфа каналом если подбитать PictFormat с помощью format = XRenderFindStandardFormat (display, PictStandardARGB32); то прога валится со следущими ошибками: X Error of failed request: BadMatch (invalid parameter attributes) Major opcode of failed request: 153 (RENDER) Minor opcode of failed request: 4 (RenderCreatePicture) Serial number of failed request: 21 Current serial number in output stream: 24

а если использовать XRenderFindVisualFormat, то нет альфа канала, а очень хочется что бы он был :)

anonymous
()
Ответ на: комментарий от anonymous

> X Error of failed request: BadMatch (invalid parameter attributes)

сделать, что бы не валилось при таком вызове можно. но лучше указывай верный атрибут.

anonymous
()
Ответ на: комментарий от anonymous

Вот что сказано в спецификации XRender про BadMatch в CreatePicture:

This request creates a Picture object associated with the specified drawable and assigns the identifier pid to it. Pixel data in the image are interpreted according to 'format'. It is a Match error to specify a format with a different depth than the drawable. If the drawable is a Window then the Red, Green and Blue masks must match those in the visual for the window else a Match error is generated.

Это значит, что в случае с форматом ARGB32 ты сделал Image с глубиной НЕ 32 - это есть ошибка. Проверь, что передаётся в CreateImage.

У меня так: (я делаю Image, чтобы самому по точечкам строить в нём полупрозрачное изображение)

self->xShmImage = XShmCreateImage (GDK_DISPLAY (), GDK_VISUAL_XVISUAL (gdkVisual), 32, ZPixmap, NULL, &self->shminfo, width, height);

Тут важным "ZPixmap" я делаю, чтобы потом из этого ShmImage'а сделать ShmPixmap.. В общем, как ты правильно понял, всё дело в форматах: я строю сам по точкам, поэтому выбираю, какой мне удобнее, а вот если бы через X рисовал - .. ещё раз советую исходники GDK. там прямо функция "SelectFormat" выведена

erDiZz

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.