Рисование изображения с использованием xcbC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Рисование изображения с использованием xcb

Сообщение Anonymous »

Я пытаюсь сделать сбрасывание окна X11 с содержимым буфера, используя xcb . Код должен заполнить окно белым фоном и заполненным кругом. Подобный код работает с XLIB - поэтому я уверен в базовом рисунке. Моя проблема заключается в том, что с Blitting to Screen. < /P>
В основном: < /p>

Я создаю буфер h*w (который я рисую белый). < /Li>
Я называю xcb_image_create_native () < /code> с этим буфером. К нему - а затем нарисуйте Pixmap в окне.#include
#include
#include
#include
#include

constexpr auto size_width = 640;
constexpr auto size_height = 480;

int32_t buf[size_height*size_height];

auto put_pixel(int x, int y, uint32_t color) -> void {
buf[(y * size_width) + x] = color;
}

auto fill_circle(int x, int y, int r, uint32_t c) -> void {
for (int dy = -r; dy < r; dy++) {
for (int dx = -r; dx < r; dx++) {
if (dx * dx + dy * dy root_depth;
values[0] = screen->black_pixel;
values[1] = XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_BUTTON_PRESS;

window_xcb = xcb_generate_id(connection);
xcb_create_window(connection, XCB_COPY_FROM_PARENT, window_xcb, screen->root, 0, 0, size_width,
size_height, 10, XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, mask, values);
xcb_map_window(connection, window_xcb);

graphics_context = xcb_generate_id(connection);
xcb_create_gc(connection, graphics_context, window_xcb, mask, values);
xcb_image =
xcb_image_create_native(connection, size_width, size_height,
format, depth, (uint8_t *)buf,
size_width * size_height * 4,
(uint8_t *)buf);

xcb_flush(connection);
memset(buf, size_width*size_height*4, 0xff);
fill_circle(100, 100, 20, 0xff0000);

{
xcb_generic_event_t *event;

while (true) {
event = xcb_wait_for_event(connection);
if (event == nullptr) {
continue;
}

switch (event->response_type) {
case XCB_EXPOSE: {
xcb_expose_event_t *ev = (xcb_expose_event_t *)event;

auto depth = screen->root_depth;
xcb_pixmap_t pixmap = xcb_generate_id(connection);
xcb_create_pixmap(connection, depth, pixmap, ev->window,
size_width, size_height);
xcb_image_put(connection, pixmap, graphics_context, xcb_image, 0, 0, 0);
xcb_copy_area(connection, pixmap, window_xcb, graphics_context, 0, 0, 0, 0,
size_width, size_height);
xcb_flush(connection);
} break;
case XCB_DESTROY_NOTIFY:
break;
default:
// xcb_free_event(event);
break;
}
}
}

return 0;
}


Подробнее здесь: https://stackoverflow.com/questions/761 ... -using-xcb
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»