Colormap
. Η δομή
αυτή θα περιέχει τους ορισμούς των χρωμάτων που θα χρησιμοποιήσουμε στο
πρόγραμμά μας. Στις περιπτώσεις που το πρόγραμμά μας δεν έχει ιδιαίτερες
ανάγκες για χρώματα (όπως θα είχε μια εφαρμογή για 3D rendering) μπορούμε να
χρησιμοποιήσουμε τη μακροεντολή DefaultColormap
η οποία επιστρέφει τη δομή Colormap
της οθόνης που δουλεύουμε:
Colormap colormap; . . . colormap = DefaultColormap( display, DefaultScreen( display) );Βέβαια τα παραπάνω έχουν νοήμα όταν η οθόνη μας είναι έγχρωμη, πράγμα που μπορούμε να μάθουμε με την μακροεντολή
DefaultDepth
. Έχοντας ορίσει το
Colormap
της εφαρμογής μας μπορούμε στην συνέχεια να καθορίσουμε τα χρώματα
της χρησιμοποιώντας τη συνάρτηση XLookupColor
:
(int) XLookupColor( Display* /* display */, Colormap /* colormap */, char* /* color_name */, XColor* /* exact_def_return */, XColor* /* screen_def_return */ );Η
XLookupColor
παίρνει ορίσματα το display
, το Colormap
, το όνομα του
χρώματος (συμβολοσειρά) και δύο δομες XColor
. Αν το χρώμα βρεθεί (επιτυχία)
επιστρέφει μη μηδενική τιμή. Στις δύο δομές XColor
επιστρέφει τις RGB τιμές
του χρώματος. Στην πρώτη όπως είναι ορισμένο τυπικά το χρώμα και στη δεύτερη
όπως είναι ορισμένο από το υλικό (hardware) του μηχανήματος. Οι δύο ορισμοί
μπορεί να διαφέρουν γι'αυτό είναι καλύτερο να χρησιμοποιούμε το δεύτερο. Η
δομή XColor
ορίζεται στο αρχείο Xlib.h ως εξής:
typedef struct { unsigned long pixel; unsigned short red, green, blue; char flags; char pad; } XColor;Η τιμή pixel αποτελεί την ταυτότητα του χρώματος και είναι αυτή που χρησιμοποιούμε στη συνέχεια στις αναφορές μας στο συγκεκριμένο χρώμα. Τα ονόματα των χρωμάτων είναι αυτά που βρίσκονται και στο αρχείο
/usr/lib/Χ11/rgb.txt
. Έχοντας εντοπίσει το χρώμα το θέλουμε πρέπει να το προσθέσουμε στα ήδη
υπάρχοντα του Colormap
(αν δεν ανήκει ήδη σε αυτά) με τη συνάρτηση
XAllocColor
:
(int) XAllocColor( Display* /* display */, Colormap /* colormap */, XColor* /* color_to_add */ );Στη συνέχεια πλέον μπορούμε να χρησιμοποιήσουμε το πεδίο pixel της δομής
XColοr
με τις συναρτήσεις XSetForeground
και
XSetBackground
για να θέτουμε το χρώματα σχεδίασης (foreground color)
και φόντου (background color) πριν την εκτέλεση μιας εντολής σχεδίασης:
XSetForeground( Display* /* display */, GC /* gc */, unsigned long /* foreground */ ); XSetBackground( Display* /* display */, GC /* gc */, unsigned long /* background */ );Στο παρακάτω απόσπασμα κώδικα αναζητούμε το χρώμα
"SkyBlue"
και θέτουμε το
χρώμα σχεδίασης ίσο με αυτό:
XColor rgbcolor, hardwarecolor; . . . if ( XLookupColor( display, colormap, "SkyBlue", &rgbcolor, &hardwarecolor ) ) if ( XAllocColor( display, colormap, &hardwarecolor ) ) XSetForeground( display, gc, hardwarecolor.pixel );