3.3.3 ΚΕΙΜΕΝΟ - ΓΡΑΜΜΑΤΟΣΕΙΡΕΣ


Εκτός από γεωμετρικά σχήματα η Xlib προσφέρει συναρτήσεις για την εμφάνιση κειμένου. Βασική προϋπόθεση είναι ο προσδιορισμός της γραμματοσειράς (font) που θα χρησιμοποιηθεί. Για να χρησιμοποιηθεί μια γραμματοσειρά πρέπει να ζητηθεί από τον εξυπηρετητή (server) των Χ Windows να την εντοπίσει (με βάση το όνομα) και στη συνέχεια να την φορτώσει στη μνήμη για να είναι στην διάθεση των πελετών του. Ο μηχανισμός που χρησιμοποιεί στις περιπτώσεις αυτές ο εξυπηρετητής είναι να φορτώνει τα resources μόνο κατόπιν αίτησης από κάποιο πελάτη και στην συνέχεια να τα απελευθερώνει όταν τελειώνει η χρήση τους. Με τον τρόπο αυτό γίνεται καλύτερη και οικονομικότερη χρήση των δυνατοτήτων του υπολογιστή όπως είναι η μνήμη.

Οι συναρτήσεις που ζητούν από τον εξυπηρετητή να φορτώσει μια γραμματοσειρά είναι οι XLoadQueryFont και XLoadFont:

    (XFontStruct) *XLoadQueryFont(
        Display*  /* display */,
        char*     /* name */
    );

    (Font) XLoadFont(
        Display*  /* display */,
        char*     /* name */
    );
Και οι δύο συναρτήσεις λαμβάνουν ως ορίσματα το δείκτη στο display και μια συμβολοσειρά που περιέχει το όνομα της ζητούμενης γραμματοσειράς (π.χ. "variable"). Η XLoadQueryFont επιστρέφει ένα δείκτη στη δομή XFontStruct η οποία περιέχει διάφορες πληροφορίες για τη γραμματοσειρά. Η XLoadFont επιστρέφει μια τιμή τύπου Font. Η τιμή αυτή (στην πραγματικότητα είναι το πεδίο fid της δομής XFontStruct) χρησιμοποιείται στην συνέχεια από το πρόγραμμα στις σχετικές συναρτήσεις. Σε περίπτωση αποτυχίας και οι δύο συναρτήσεις επιστρέφουν τιμή μηδέν (0). Συνήθως χρησιμοποιούμε την XLoadQueryFont όταν θέλουμε στη συνέχεια να ανακτήσουμε πληροφορίες για τη γραμματοσειρά, ενώ την XLoadFont όταν γνωρίζουμε τα χαρακτηριστικά της γραμματοσειράς (ή δεν μας ενδιαφέρουν) και θέλουμε να τυπώσουμε κάτι γρήγορα.

Στο παρακάτω απόσπασμα κώδικα χρησιμοποιούμε την XLoadQueryFont για φορτώσουμε την γραμματοσειρά variable. Τα ονόματα των γραμματοσειρών είναι τα ίδια με αυτά χρησιμοποιούμε όταν δουλεύουμε στα Χ Windows (το πρόγραμμα xlsfonts, όπως έχει αναφερθεί στο δεύτερο κεφάλαιο, δίνει μια πλήρη λίστα των διαθέσιμων γραμματοσειρών).

    XFontStruct    *fontstruct;
    .
    .
    .

    fontstruct = XLoadQueryFont( display, "variable" );
    if ( fontstruct != 0 )
        XSetFont( display, gc, fontstruct->fid );
    else 
    {
        fprintf( stderr,
            "Error: could not load font %s .\n", "variable" );
        exit(1);
    }
Η συνάρτηση XSetFont ορίζει ότι το graphics context gc θα πρέπει να χρησιμοποιεί τη γραμματοσειρά "variable". Οι συναρτήσεις που τυπώνουν κείμενο σε ένα drawable (παράθυρο ή pixmap) είναι οι XDrawImageString και XDrawString:

    XDrawString(
        Display*  /* display */,
        Drawable  /* drawable */,
        GC        /* graphics context */,
        int       /* x */,
        int       /* y */,
        char*     /* string */,
        int       /* length */
    );

    XDrawImageString(
        Display*  /* display */,
        Drawable  /* drawable */,
        GC        /* graphics context */,
        int       /* x */,
        int       /* y */,
        char*     /* string */,
        int       /* length */
    );
Τα ορίσματα που λαμβάνουν είναι ο δείκτης στο display, το drawable, το graphics context, η θέση (x,y) της συμβολοσειράς, η ίδια η συμβολοσειρά και το μήκος της σε χαρακτήρες. Αρχή της συμβολοσειράς (που τυπώνεται στη θέση x,y) θεωρείται η αριστερή άκρη της στο ύψος της γραμμής βάσης (baseline). Άλλα χαρακτηριστικά της συμβολοσειράς είναι το ύψος της πάνω από τη γραμμή βάσης (ascent) και το ύψος της κάτω από τη γραμμή βάσης (descent). Τα χαρακτηριστικά αυτά φαίνονται στο παρακάτω σχήμα (σχ. 3.1):

Σχήμα 3.1

Η διαφορά ανάμεσα στην XDrawString και την XDrawImageString είναι ότι η πρώτη χρησιμοποιεί το foreground χρώμα για τα γράμματα και ο φόντος είναι διαφανής (transparent), δηλαδή σχεδιάζει μόνο με το foreground χρώμα, ενώ η δεύτερη χρησιμοποιεί και το background χρώμα για να σχεδιάσει το φόντο καλύπτοντας ότι υπάρχει από πίσω.

Για την περίπτωση που επιθυμούμε να μάθουμε το μήκος μιας συμβολοσειράς σε pixels με βάση τη γραμματοσειρά που χρησιμοποιούμε υπάρχει η συνάρτηση XTextWidth που επιστρέφει το μήκος σε pixels:

    int XTextWidth(
        XFontStruct*  /* font_struct */,
        char*         /* string */,
        int           /* string length in chars*/
    );
Για τον υπολογισμό το ύψους μιας γραμματοσειράς μπορούμε να χρησιμοποιήσουμε το άθροισμα των πεδίων ascent και descent της δομής XFontStruct που επιστρέφει η XLoadQueryFont:

    int fontheight;
    .
    .
    .
    fontheight = fontstruct->ascent + fontstruct->descent;
Τέλος πρέπει να σημειωθεί ότι όταν ολοκληρώσουμε την χρήση μιας γραμματοσειράς στο πρόγραμμα μας πρέπει να στέλνουμε το αντίστοιχο μήνυμα στο εξυπηρετητή να την απελευθερώσει από τη μνήμη. Για το σκοπό αυτό υπάρχουν οι συναρτήσεις XFreeFont και XUnloadFont αντιστοίχως με τις XLoadQueryFont και XLoadFont:

    XFreeFont(
        Display*      /* display */,
        XFontStruct*  /* font_struct */
    );

    XUnloadFont(
        Display*  /* display */,
        Font      /* font */
    );

[prev] [up] [next] [contents] [index]