3.3.4 ΧΡΩΜΑΤΑ


Η Xlib διαθέτει τις απαιτούμενες συναρτήσεις για τη χρήση χρωμάτων στις διάφορες εφαρμογές. Για την αποθήκευση και χρησιμοποίηση των χρωμάτων χρειάζεται να ορίσουμε στο πρόγραμμά μας μια δομή τύπου 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 );

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