Οι συναρτήσεις που ζητούν από τον εξυπηρετητή να φορτώσει μια γραμματοσειρά
είναι οι 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):
Η διαφορά ανάμεσα στην 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 */ );