Cairocanvas2
Jun 25, 2020 11:42:10 GMT 1
Post by alexfish on Jun 25, 2020 11:42:10 GMT 1
Hi All
Thread Closed
For Cairo go basic-converter.proboards.com/thread/1257/hug-imager
this is a continuation of Cairo Canvas::
New interface using XCB
BR
Alex
Thread Closed
For Cairo go basic-converter.proboards.com/thread/1257/hug-imager
this is a continuation of Cairo Canvas::
New interface using XCB
OPTION PARSE FALSE
PRAGMA LDFLAGS `pkg-config --libs xcb cairo pango`
PRAGMA OPTIONS `pkg-config --cflags xcb cairo pango`
PRAGMA INCLUDE <xcb/xcb.h>
PRAGMA INCLUDE <stdint.h>
PRAGMA INCLUDE <pango/pangocairo.h>
PRAGMA INCLUDE <cairo/cairo-xcb.h>
PRAGMA INCLUDE <cairo/cairo.h>
DECLARE values TYPE uint32_t
DECLARE c TYPE xcb_connection_t*
DECLARE s TYPE xcb_screen_t*
DECLARE w TYPE xcb_window_t
DECLARE cookie, cookie2, cookie3, cookie4 TYPE xcb_intern_atom_cookie_t
DECLARE reply, reply2 ,reply3,reply4 TYPE xcb_intern_atom_reply_t*
DECLARE event TYPE xcb_generic_event_t*
DECLARE rt TYPE uint8_t
RECORD WINDOW
LOCAL width, height TYPE int
LOCAL scrno TYPE int
LOCAL scr TYPE xcb_screen_t *
LOCAL connection TYPE xcb_connection_t *
LOCAL win TYPE xcb_drawable_t
LOCAL white TYPE unsigned int
LOCAL visual_type TYPE xcb_visualtype_t *
LOCAL surface TYPE cairo_surface_t *
LOCAL CANVAS TYPE cairo_surface_t *
LOCAL CANVAS_CR TYPE cairo_t *
LOCAL cr TYPE cairo_t *
END RECORD
SUB cairo_set_rgba(cairo_t *cr,char r,char g,char b,char a)
cairo_set_source_rgba(cr,(float)r/255,(float)g/255,(float)b/255,(float)a/255)
END SUB
SUB REDRAW()
cairo_destroy(WINDOW.CANVAS_CR)
WINDOW.CANVAS_CR = cairo_create (WINDOW.CANVAS)
cairo_set_rgba(WINDOW.CANVAS_CR,255,255,255,255)
cairo_paint(WINDOW.CANVAS_CR)
cairo_save(WINDOW.CANVAS_CR)
cairo_restore(WINDOW.CANVAS_CR)
cairo_select_font_face (WINDOW.CANVAS_CR, "dejavu sans mono book", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD)
cairo_set_font_size (WINDOW.CANVAS_CR, 16.0)
cairo_set_rgba(WINDOW.CANVAS_CR, 255,0, 255,255)
cairo_move_to (WINDOW.CANVAS_CR, 100.0, 50.0);
cairo_show_text (WINDOW.CANVAS_CR, "Hello world")
cairo_stroke (WINDOW.CANVAS_CR);
cairo_destroy (WINDOW.cr)
WINDOW.cr = cairo_create (WINDOW.surface)
cairo_set_source_surface (WINDOW.cr,WINDOW.CANVAS,0,0)
cairo_paint(WINDOW.cr)
xcb_flush(WINDOW.connection)
END SUB
FUNCTION makewindow() TYPE int
LOCAL iter TYPE xcb_screen_iterator_t
LOCAL depth_iter TYPE xcb_depth_iterator_t
LOCAL Mvalues TYPE uint32_t
Mvalues = XCB_EVENT_MASK_BUTTON_PRESS |XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY
WINDOW.width = 1920
WINDOW.height = 1080
WINDOW.connection = xcb_connect(NULL,& WINDOW .scrno)
iter = xcb_setup_roots_iterator(xcb_get_setup(WINDOW.connection))
' CAN THIS BE BACONISED
USEC
for (; iter.rem; --WINDOW.scrno, xcb_screen_next(&iter))
if (WINDOW.scrno == 0)
{
WINDOW.scr = iter.data;
break;
}
END USEC
WINDOW.win = xcb_generate_id(WINDOW.connection)
WINDOW.white = XCB_CW_BACK_PIXEL
xcb_create_window(WINDOW.connection, XCB_COPY_FROM_PARENT, \
WINDOW.win, WINDOW.scr->root, \
0, 0, \
800, 600, \
5, \
XCB_WINDOW_CLASS_INPUT_OUTPUT, \
WINDOW.scr->root_visual, \
XCB_CW_EVENT_MASK,&Mvalues)
xcb_change_property(WINDOW.connection, XCB_PROP_MODE_REPLACE, \
WINDOW.win, XCB_ATOM_WM_NAME, XCB_ATOM_STRING, 8, strlen("Cairo Example"), \
"Cairo Example");
cookie3 = xcb_intern_atom(WINDOW.connection, 1, 12,"WM_PROTOCOLS")
reply3 = xcb_intern_atom_reply(WINDOW.connection, cookie3, 0)
cookie4 = xcb_intern_atom(WINDOW.connection, 0, 16,"WM_DELETE_WINDOW")
reply4 = xcb_intern_atom_reply(WINDOW.connection, cookie4, 0)
xcb_change_property(WINDOW.connection, XCB_PROP_MODE_REPLACE, WINDOW.win, (*reply3).atom, 4, 32, 1, &(*reply4).atom)
xcb_map_window(WINDOW.connection, WINDOW.win);
xcb_flush(WINDOW.connection);
depth_iter = xcb_screen_allowed_depths_iterator(WINDOW.scr)
' CAN THIS BE BACONISED
USEC
for (; depth_iter.rem; xcb_depth_next(&depth_iter)) {
xcb_visualtype_iterator_t visual_iter;
visual_iter = xcb_depth_visuals_iterator(depth_iter.data);
for (; visual_iter.rem; xcb_visualtype_next(&visual_iter)) {
if (WINDOW.scr->root_visual == visual_iter.data->visual_id) {
WINDOW.visual_type = visual_iter.data;
goto visual_found;
}
}
}
END USEC
LABEL visual_found
WINDOW.surface = cairo_xcb_surface_create (WINDOW.connection, WINDOW.win, WINDOW.visual_type, 1920, 1080)
WINDOW.CANVAS =cairo_image_surface_create (CAIRO_FORMAT_ARGB32,1920,1080)
RETURN 1
END FUNCTION
FUNCTION DESTROY() TYPE int
cairo_destroy (WINDOW.cr)
cairo_surface_destroy (WINDOW.surface)
cairo_surface_destroy (WINDOW.CANVAS)
cairo_destroy (WINDOW.CANVAS_CR)
xcb_disconnect(WINDOW.connection)
RETURN 1
END FUNCTION
makewindow()
WHILE TRUE DO
event = xcb_wait_for_event(WINDOW.connection)
rt = (*event).response_type & ~0x80
SELECT rt
CASE XCB_EXPOSE
' Do Nothing yet
CASE XCB_CONFIGURE_NOTIFY
REDRAW()
CASE XCB_CLIENT_MESSAGE
IF ((*(xcb_client_message_event_t*)event).data.data32[0] == (*reply4).atom) THEN
DESTROY()
BREAK
END IF
END SELECT
WEND
BR
Alex