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:

 
Skráin broskarl keyrð á nýjum X-þjóni með því að slá skipunina ./broskall í xterm.

Tilvísanir

breyta
  1. Polygonal line