Forritun í XCB/Myndeining
Útlit
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: