3.3.5 PIXMAPS


Τα pixmaps όπως αναφέρθηκε και παραπάνω ανήκουν στην κατηγορία των drawables μαζί με τα παράθυρα. Είναι περιοχές στην μνήμη σαν παράθυρα που δεν φαίνονται στις οποίες μπορούμε να σχεδιάσουμε και στη συνέχεια να μεταφέρουμε το αποτέλεσμα σε κάποιο παράθυρο για εμφάνιση. Τα pixmaps μπορούν να έχουν και χρώματα (συνήθως έχουν το ίδιο βάθος με τα παράθυρα). Στην περίπτωση που έχουν μόνο δύο χρώματα (ένα bitplane) ονομάζονται bitmaps. Για την δημιουργία ενός pixmap υπάρχουν αρκετοί τρόποι. Ο βασικός είναι με τη συνάρτηση XCreatePixmap:

    Pixmap XCreatePixmap(
        Display*      /* display */,
        Drawable      /* drawable */,
        unsigned int  /* width */,
        unsigned int  /* height */,
        unsigned int  /* depth */
    );
Το δεύτερο όρισμα (drawable) χρειάζεται γιατί είναι ανάγκη να συσχετιστεί το pixmap με κάποια οθόνη (screen). Μπορούμε κάλιστα να χρησιμοποιήσουμε για όρισμα το root window. Τα επόμενα ορίσματα καθορίζουν τις διαστάσεις και το βάθος του pixmap. Η Xlib για τα bitmaps διαθέτει συναρτήσεις που επιτρέπουν να διαβάσουμε ή να γράψουμε bitmaps σε αρχεία ή ακόμη και να συμπεριλάβουμε bitmaps με εντολές #include στον κώδικά μας και να τα μετατρέψουμε (τα bitmaps είναι στη μορφή που χρησιμοποιεί και το πρόγραμμα bitmap):

    (int) XReadBitmapFile(
        Display*       /* display */,
        Drawable       /* drawable */,
        char*          /* filename */,
        unsigned int*  /* width_return */,
        unsigned int*  /* height_return */,
        Pixmap*        /* bitmap_return */,
        int*           /* x_hot_return */,
        int*           /* y_hot_return */
    );

    (int) XWriteBitmapFile(
        Display*      /* display */,
        char*         /* filename */,
        Pixmap        /* bitmap */,
        unsigned int  /* width */,
        unsigned int  /* height */,
        int           /* x_hot */,
        int           /* y_hot */
    );
Οι XReadBitmapFile και XWriteBitmapFile διαβάζουν και σώζουν αντίστοιχα bitmaps από αρχεία. Οι τιμές x_hot και y_hot ορίζουν το "ενεργό" σημείο του bitmap σε περίπτωση που αυτό χρησιμοποιηθεί για το σχήμα του δείκτη του ποντικιού, αλλιώς είναι αδιάφορο. Οι τιμές αυτές, καθώς και το μέγεθος του bitmap υπάρχουν μέσα στο αρχείο που το περιέχει (στην περίπτωση της XReadBitmapFile).

    (Pixmap) XCreateBitmapFromData(
        Display*      /* display */,
        Drawable      /* drawable */,
        char*         /* data */,
        unsigned int  /* width */,
        unsigned int  /* height */
    );

    (Pixmap) XCreatePixmapFromBitmapData(
        Display*       /* display */,
        Drawable       /* drawable */,
        char*          /* data */,
        unsigned int   /* width */,
        unsigned int   /* height */,
        unsigned long  /* fg */,
        unsigned long  /* bg */,
        unsigned int   /* depth */ );
Καθώς τα bitmaps όπως σώζονται από το πρόγραμμα bitmap ειναι ascii και μάλιστα σε μορφή C κώδικα μπορούμε εύκολα να τα συμπεριλάβουμε στο πρόγραμμά μας με εντολές #include (όπως ήδη δείξαμε σε προηγούμενη παράγραφο με το εικονίδιο του προγράμματος). Στην περίπτωση αυτή χρησιμοποιούμε τη συνάρτηση XCreateBitmapFromData για να κατασκευάσουμε το bitmap. Έπειτα αν θέλουμε να το μετατρέψουμε σε κανονικό pixmap χρησιμοποιούμε την XCreatePixmapFromBitmapData η οποία παίρνει επιπλέον τα χρώματα που θέλουμε να αποκτήσει το pixmap, καθώς και το βάθος του.

Έχοντας ετοιμάσει ένα pixmap μπορούμε να το αντιγράψουμε σε κάποιο άλλο pixmap ή παράθυρο με τις συναρτήσεις XCopyArea και XCopyPlane. Η XCopyArea αντιγράφει όλα τα bitplanes ενός pixmap ενώ η XCopyPlane αντιγράφει μόνο ένα συγκεκριμένο bitplane (χρήσιμη για bitmaps και μάσκες):

    XCopyArea(
        Display*      /* display */,
        Drawable      /* src */,
        Drawable      /* dest */,
        GC            /* gc */,
        int           /* src_x */,
        int           /* src_y */,
        unsigned int  /* width */,
        unsigned int  /* height */,
        int           /* dest_x */,
        int           /* dest_y */
    );

    XCopyPlane(
        Display*       /* display */,
        Drawable       /* src */,
        Drawable       /* dest */,
        GC             /* gc */,
        int            /* src_x */,
        int            /* src_y */,
        unsigned int   /* width */,
        unsigned int   /* height */,
        int            /* dest_x */,
        int            /* dest_y */,
        unsigned long  /* bitplane */
    );
Τέλος όταν δεν χρειαζόμαστε πλέον κάποιο pixmap ή bitmap που έχουμε δημιουργήσει μποπούμε να το διαγράψουμε με την συνάρτηση XFreePixmap:

    XFreePixmap(
        Display*  /* display */,
        Pixmap    /* pixmap */
    );

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