Forritun í XCB/Myndeining
Til að teikna form eða texta á skjáinn þá viljum við oft skilgreina liti þeirra, leturgerð og forgrunn.
Frumstilling með graphic context
breytaÍ það notum við nokkuð sem kallast graphic context til að forðast að þurfa að nota ótal færibreytur fyrir hvert teiknifall. Fyrst frumstillum við graphical context og sendum það í teikniföll.
Hér er stutt fall sem úthlutar graphic context sem segir teikniföllum að teikna á forgrunn með svörtum lit:
#include <xcb/xcb.h>
int main ()
{
xcb_connection_t *tenging = xcb_connect(NULL, NULL);
xcb_screen_t *skjar = xcb_setup_roots_iterator(xcb_get_setup(tenging)).data;
xcb_drawable_t gluggi = skjar->root;
xcb_gcontext_t svart = xcb_generate_id(tenging);
/*
* Stafsían „stafsia“ hefur að geyma töluna XCB_GC_FOREGROUND sem segir xcb_create_gc fallinu að
* fylkið „gildi“ hafi að geyma upplýsingar um lit forgrunnsins. Síðan skilgreinum við „gildi“
* sem fylki sem inniheldur eitt stak sem er gildið fyrir svartan lit.
*/
uint32_t stafsia = XCB_GC_FOREGROUND;
uint32_t gildi[1] = skjar->black_pixel;
xcb_create_gc (tenging, svart, gluggi, stafsia, gildi);
return 0;
}
Einföld form og myndeiningar
breytaÞetta forrit teiknar einfalt andlit þar sem munnurinn er táknaður með brotnu línustriki[1] og augun eru hringbogar.
#include <stdlib.h>
#include <stdio.h>
#include <xcb/xcb.h>
int main ()
{
xcb_connection_t *tenging;
xcb_screen_t *skjar;
xcb_drawable_t gluggi;
xcb_gcontext_t forgrunnur;
xcb_generic_event_t *atvik;
uint32_t stafsia = 0;
uint32_t gildi[2];
/**
* Hér er fyrsti hornpunkturinn 100 dílar niður frá efsta vinstra horninu og 30 til hægri.
* Allir hornpunktar á eftir gefa til kynna afstæða breytingu frá fyrsta punktinum:
* {5, 15} merkir til dæmis að farið sé niður um 15 díla og til hægri um 5 díla.
**/
xcb_point_t linustrik[] = {
{30, 100},
{5, 15},
{10, 10},
{50, 0},
{10, -10},
{5, -15}};
/**
* Tveir bogar þar sem fyrsti hefur staðsetninguna {x=20, y=30} og seinni {x=85, y=30}.
* Þeir eru báðir 40 dílar á hæð og breidd og eru 180 gráður en fallið tekur við
* mælieiningum sem eru 1/64 af gráðu.
*/
xcb_arc_t bogar[] = {
{20, 30, 40, 40, 0, 180 << 6},
{85, 30, 40, 40, 0, 180 << 6}};
tenging = xcb_connect(NULL, NULL);
skjar = xcb_setup_roots_iterator(xcb_get_setup(tenging)).data;
/**
* Býr til svartan forgrunn; graphic context. Sjá:
* http://en.wikipedia.org/wiki/X_Window_System_core_protocol#Graphic_contexts_and_fonts
**/
gluggi = skjar->root;
forgrunnur = xcb_generate_id(tenging);
stafsia = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES; /* Farið út í þetta í kaflanum um atvik */
gildi[0] = skjar->black_pixel;
gildi[1] = 0;
xcb_create_gc(tenging, forgrunnur, gluggi, stafsia, gildi);
gluggi = xcb_generate_id(tenging);
/* Skilgreinir og býr til gluggann. */
stafsia = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
gildi[0] = skjar->white_pixel;
gildi[1] = XCB_EVENT_MASK_EXPOSURE;
xcb_create_window(tenging, XCB_COPY_FROM_PARENT, gluggi,
skjar->root, 400, 200, 150, 150, /* Staðsetning {400,200}, stærð 150x150. */
10, XCB_WINDOW_CLASS_INPUT_OUTPUT,
skjar->root_visual, stafsia, gildi);
/* Teiknum gluggann á skjáinn. */
xcb_map_window(tenging, gluggi);
/* Sendum þetta út. */
xcb_flush(tenging);
while ((atvik = xcb_wait_for_event(tenging))) {
switch (atvik->response_type & ~0x80) {
case XCB_EXPOSE: {
/* Teiknum brotna línustrikið í 6 hlutum og 2 boga. */
xcb_poly_line (tenging, XCB_COORD_MODE_PREVIOUS, gluggi, forgrunnur, 6, linustrik);
xcb_poly_arc (tenging, gluggi, forgrunnur, 2, bogar);
/* Sendum þetta út og förum úr lykkjunni. */
xcb_flush (tenging);
break;
}
default:
break;
}
free (atvik);
}
return 0;
}
sem ætti að líta svona út: