Есть ли способ для xcb загрузить файл в растровое изображение? - PullRequest
0 голосов
/ 15 февраля 2019

Я пишу заявку с rust-xcb.Однако, когда я пытаюсь загрузить файл в растровое изображение, я не могу найти никакого способа сделать это.Я также использую библиотеку image для загрузки файлов изображений (jpg).

Но я не знаком с xcb, есть ли способ для xcb загружать пиксельные буферы или файлы в pixmap?Или я могу найти другую библиотеку для этого?

Я искал это.Некоторые документы xcb pixmap и bitmap полны TODO.Я пробовал xcb-util-image, но не нашел то, что мне нужно.

Мой код указан ниже:

let foreground = self.connection.generate_id();
    xcb::create_gc(
    &self.connection,
    foreground,
    screen.root(),
    &[
        (xcb::GC_FOREGROUND, screen.white_pixel()),
        (xcb::GC_GRAPHICS_EXPOSURES, 0),
     ],
);
let mut img = image::open(background_src).unwrap();
let img_width = img.width();
let img_height = img.height();

xcb::create_pixmap(
    &self.connection,
    24,
    pixmap,
    self.window_id,
    img_width as u16,
    img_height as u16,
);
let img_buffer = img.to_rgb().into_raw();
xcb::put_image(
    &self.connection,
    xcb::IMAGE_FORMAT_Z_PIXMAP as u8,
    pixmap,
    foreground,
    img_width as u16,
    img_height as u16,
    0,
    0,
    0,
    24,
    &img_buffer,
);
self.flush(); // Flush the connection

1 Ответ

0 голосов
/ 20 февраля 2019

Согласно документации XCB, растровые изображения и окна могут быть нарисованы: https://xcb.freedesktop.org/colorsandpixmaps/ («Операции, которые одинаково работают с окном или растровым изображением, принимают аргумент xcb_drawable_t»)

Итак,как только вы создали свой Pixmap, вы передаете его в качестве третьего параметра put_image.Не нужно беспокоиться о преобразовании Pixmap в Drawable;они оба просто вводят псевдонимы для u32 на вашем конце, и они оба используют одно и то же пространство идентификаторов на стороне X-сервера (как выразились в тех же документах, «растровое изображение - это в основном окно, которое не отображается наscreen ").

Чтобы сгенерировать материал, который идет в параметре data, возможно, просто сделайте то же самое, что и источник libpng , но в Rust вместо C.

...