#pragma once #include #include "Window.h" #include "XcbWindow.h" class XcbImage { public: XcbImage(xcb_connection_t* connection, mt::Window* window, xcb_screen_t* screen) { mPixmap = xcb_generate_id(connection); auto hwnd = dynamic_cast(window->GetPlatformWindow())->getHandle(); const auto w = window->GetWidth(); const auto h = window->GetHeight(); xcb_create_pixmap(connection, screen->root_depth, mPixmap, hwnd, w, h); } void update(mt::Window* window, xcb_screen_t* screen, xcb_connection_t* connection, xcb_gcontext_t gc) { if (!mXImage) { auto backing_image = window->getBackingImage(); const auto w = window->GetWidth(); const auto h = window->GetHeight(); //auto data = const_cast(backing_image->getDataPtr()); auto data = backing_image->getData(); unsigned char* converted = &data[0]; mXImage = xcb_image_create_native(connection, w, h, XCB_IMAGE_FORMAT_Z_PIXMAP, screen->root_depth, converted, w*h*4, converted); xcb_image_put(connection, mPixmap, gc, mXImage, 0, 0, 0); //xcb_image_destroy(mXImage); } } xcb_pixmap_t getPixMap() const { return mPixmap; } private: xcb_pixmap_t mPixmap{0}; xcb_image_t* mXImage{nullptr}; };