Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Imlib+Mplayer


Автор: JekaZZ 6.2.2009, 21:20
Есть мультимедийная программа под Linux, использует SDL, Imlib, MPlayer, Xine. Графику выводит через иксы. 
Так вот стояло это и работало на slackware-11.0:
 - kernel 2.6.14
 - x11-6.9.0
 - imlib-1.9.14
 - SDL-1.2.9

Программа воспроизводит видео с помощью Mplayer и поверх его изображения отображет png картинку. Картинка имеет форму, то есть у нее прозрачный фон, она не прямоугольная.

Возникла необходимость перевести программу на новый дистрибутив - Slackware 12.1:
 - kernel 2.6.28.3
 - imlib-1.6.15
 - X.org 7.4
 - SDL-1.2.9

Программу пересобрал в новой системе. 

Перестало работать отображение картинки поверх изображения mplayer. 
Видно только черный силуэт картинки, то есть она отображается, но вся черным цветом.

Программа не мной писана. Посмотрел код - для изображений использует imlib. Там же используются функции xlib.
Так как ни с Imlib-ом ни с xlib-ом не знаком, прошу помощи. 
Что могло произойти и как это решить?

Автор: 0xDX 7.2.2009, 08:08
JekaZZ - как ваш вопрос относится к классике С++?
Впредь пишете вопросы в соответствующие места.


Автор: andrew_121 7.2.2009, 11:02
JekaZZ, Могу помочь.

Автор: JekaZZ 9.2.2009, 15:20
Подозрения падают на xlib. 
Картинка выводится таким образом:
 - с помощью imlib грузится картинка, 
 - получается ее маска
 - создается окно X
 - картинка устанавливается фоном окна X
 - форма окна X устанавливается по маске рисунка

Код

ImlibData* m_data=Imlib_init(m_display);
ImlibImage* m_image=Imlib_load_image(m_data, (char*)filename);
Window m_window=XCreateSimpleWindow(m_display, m_parentWindow, x, y, w, h, 1, 0, 0);
Imlib_render(m_data, m_image, w, h);
Pixmap m_pixmap=Imlib_move_image(m_data, m_image);
Pixmap m_mask=Imlib_move_mask(m_data, m_image);
XSetWindowBackgroundPixmap(m_display, m_window, m_pixmap);
XShapeCombineMask(m_display, m_window, ShapeBounding, 0, 0, m_mask, ShapeSet);


Imlib_render(m_data, m_image, w, h) возвращает 1, то есть здесь все в порядке. 
XSetWindowBackgroundPixmap возвращает 1, но что это означает я так и не нашел. 
Как получить код последней ошибки Xlib?

Автор: andrew_121 9.2.2009, 15:50
JekaZZ, Вот: http://tronche.com/gui/x/xlib/window/XSetWindowBackgroundPixmap.html

Автор: JekaZZ 10.2.2009, 16:30
Сделал маленькую программку с той же последовательностью действий, что и в программе: 1. загрузка картинки, 2. установка ее фоном окна, 3. установка формы окна.
 Вобщем, ошибка та же , что и в программе - после установки формы окна происходит ошибка BadMatch. Если перед этим убрать установку фона, то ошибка не возникает, следовательно ошибка возникает именно из-за установки фона, тем более, что фон не устанавливается, а форма окна устанавливается.

Вот эта тестовая программка:
Код

#include <X11/Xlib.h>
#include <Imlib.h>
#include <stdio.h>
#include <unistd.h>

int handler(Display *d, XErrorEvent *e)
{
    printf("->Error: %d\n", e->error_code);
}

char* fileName="img.png";  // сюда вставить имя файла

int main(int argc, char* argv[])
{
    puts("Set error handler");
    XSetErrorHandler(&handler);

    puts("Open display");
    Display *d = XOpenDisplay(0);
    printf("Display: %x\n", d);
    if (d == NULL)
        return -1;
    
    puts("Create window");
    Window w = XCreateSimpleWindow(d,
                                    DefaultRootWindow(d),
                    100, 100, 
                    200, 200,
                    0,
                    0,
                    0
                    );

    puts("Init imlib");
    ImlibData *id = Imlib_init(d);
    printf("Imlib data: %x\n", id);
    if (id == NULL)
    return -1;
    
    puts("Load image");
    ImlibImage* iimg = Imlib_load_image(id, fileName);
    printf("Imlib image: %x. W:%d, H:%d \n", iimg, iimg->rgb_width, iimg->rgb_height);
    if (iimg == NULL)
    return -1;
    
    puts("Imlib Render");
    if(!Imlib_render(id, iimg, iimg->rgb_width, iimg->rgb_height)) {
    puts("->Error: Imlib render returns 0");
    return -1;
    }
    
    XSetErrorHandler(&handler);
    
    puts("Imlib Move image & mask");
    Pixmap pix = Imlib_move_image(id, iimg);
    Pixmap mask = Imlib_move_mask(id, iimg);

    puts("Set window background");
    int r = XSetWindowBackgroundPixmap(d, w, pix);
    printf("Set background returns %d\n", r);
    
    puts("Set window shape");
    XShapeCombineMask(d, w, ShapeBounding, 0, 0, mask, ShapeSet);

    puts("Map window");
    XMapRaised(d, w);
    XSync(d, false);
    
    sleep(10);
    return 0;
}


Картинка точно грузится, так как определяется ее размеры и устанавливается по ее контуру форма окна
В чем может быть дело? Почему фон не устанавливается, что значит эта ошибка?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)