Εισαγωγή στην PostScript

50
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT ΠΡΟΛΟΓΟΣ 1 ης έκδοσης Οι σημειώσεις που κρατάτε γράφτηκαν για να βοηθήσουν αυτούς που θέλουν να μάθουν γρήγορα Postscript, για να κάνουν κάποια δουλειά, και όχι όσους φιλοδοξούν να γίνουν "masters" της Postscript. Φυσικά όλοι χρειάζονται μια εισαγωγή. Εδώ περιγράφονται τα βασικά στοιχεία, περίπου το 1/3 των δυνατοτήτων της Postscript Level Ι, που όμως είναι αρκετά για να κάνετε, πραγματικά, πολλές και απαιτητικές δουλειές. Έχουν συμπεριληφθεί αρκετά παραδείγματα που εκτός από το διδακτικό ρόλο, παρουσιάζουν και κάποιες χρήσιμες τεχνικές. Όλα τα προγράμματα που υπάρχουν στο κείμενο έχουν ελεγχθεί και λειτουργούν σωστά. Το γνωσιολογικό υπόβαθρο που χρειάζεται για να διαβάσει κάποιος αυτές τις σημειώσεις, είναι η γνώση κάποιας γλώσσας προγραμματισμού υψηλού επιπέδου, προϋποθέτει κάποια εξοικείωση με τις βασικές έννοιες του προγραμματισμού, και στοιχειώδεις γνώσεις αναλυτικής γεωμετρίας. Π.Β.Κυριακάκης Ιούνιος 1995 2 ης έκδοσης Δεν άλλαξαν πολλά πράγματα από την προηγούμενη έκδοση. Προστέθηκε μια παράγραφος στο τρίτο κεφάλαιο σχετικά με τα bitmap και ένα σχετικό παράδειγμα στο πέμπτο κεφάλαιο και έγιναν κάποιες «βελτιωσεις» στην εμφάνιση. Π.Β.Κυριακάκης Σεπτέμβριος 2001 1

Transcript of Εισαγωγή στην PostScript

Page 1: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

ΠΡΟΛΟΓΟΣ

1ης έκδοσης

Οι σημειώσεις που κρατάτε γράφτηκαν για να βοηθήσουν αυτούς που θέλουν να μάθουν γρήγορα

Postscript, για να κάνουν κάποια δουλειά, και όχι όσους φιλοδοξούν να γίνουν "masters" της

Postscript. Φυσικά όλοι χρειάζονται μια εισαγωγή. Εδώ περιγράφονται τα βασικά στοιχεία, περίπου το

1/3 των δυνατοτήτων της Postscript Level Ι, που όμως είναι αρκετά για να κάνετε, πραγματικά, πολλές

και απαιτητικές δουλειές. Έχουν συμπεριληφθεί αρκετά παραδείγματα που εκτός από το διδακτικό

ρόλο, παρουσιάζουν και κάποιες χρήσιμες τεχνικές. Όλα τα προγράμματα που υπάρχουν στο κείμενο

έχουν ελεγχθεί και λειτουργούν σωστά. Το γνωσιολογικό υπόβαθρο που χρειάζεται για να διαβάσει

κάποιος αυτές τις σημειώσεις, είναι η γνώση κάποιας γλώσσας προγραμματισμού υψηλού επιπέδου,

προϋποθέτει κάποια εξοικείωση με τις βασικές έννοιες του προγραμματισμού, και στοιχειώδεις

γνώσεις αναλυτικής γεωμετρίας.

Π.Β.Κυριακάκης

Ιούνιος 1995

2ης έκδοσης

Δεν άλλαξαν πολλά πράγματα από την προηγούμενη έκδοση. Προστέθηκε μια παράγραφος στο τρίτο

κεφάλαιο σχετικά με τα bitmap και ένα σχετικό παράδειγμα στο πέμπτο κεφάλαιο και έγιναν κάποιες

«βελτιωσεις» στην εμφάνιση.

Π.Β.Κυριακάκης

Σεπτέμβριος 2001

1

Page 2: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

ΠΕΡΙΕΧΟΜΕΝΑ

ΕΙΣΑΓΩΓΗ 31. ΣΤΟΙΒΑ ΚΑΙ ΑΡΙΘΜΗΤΙΚΗ

1.1 Η ΣΤΟΙΒΑ 41.2 Ο ΧΕΙΡΙΣΜΟΣ ΤΗΣ ΣΤΟΙΒΑΣ 41.3 ΑΡΙΜΘΗΤΙΚΗ ΣΤΗ ΣΤΟΙΒΑ 6

2. ΣΥΣΤΗΜΑ ΑΝΑΦΟΡΑΣ & ΜΕΤΑΣΧΗΜΑΤΙΣΜΟΙ2.1 ΤΟ ΣΥΣΤΗΜΑ ΑΝΑΦΟΡΑΣ 102.2 ΜΕΤΑΦΟΡΑ ΤΟΥ ΣΥΣΤΗΜΑΤΟΣ 102.3 ΠΕΡΙΣΤΡΟΦΗ ΤΟΥ ΣΥΣΤΗΜΑΤΟΣ 112.4 ΑΛΛΑΓΗ ΚΛΙΜΑΚΑΣ 12

3. ΕΝΤΟΛΕΣ ΓΡΑΦΙΚΩΝ3.1 ΜΕΤΑΚΙΝΗΣΗ ΤΟΥ ΔΕΙΚΤΗ 143.2 ΓΡΑΜΜΕΣ 143.3 ΧΡΩΜΑ 163.4 ΚΥΚΛΟΙ ΚΑΙ ΤΟΞΑ 193.5 ΚΑΤΑΣΤΑΣΗ ΓΡΑΦΙΚΩΝ 213.6 ΨΑΛΙΔΙΣΜΑ 223.7 BITMAPPED IMAGES 24

4. ΥΠΟΡΟΥΤΙΝΕΣ ΚΑΙ ΜΕΤΑΒΛΗΤΕΣ4.1 ΥΠΟΡΟΥΤΙΝΕΣ 284.2 ΜΕΤΑΒΛΗΤΕΣ 31

5. ΕΛΕΓΧΟΣ ΡΟΗΣ5.1 ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ 345.2 ΕΛΕΓΧΟΙ 375.3 ΕΝΑΣ ΑΚΟΜΑ ΒΡΟΧΟΣ ΕΠΑΝΑΛΗΨΗΣ 385.4 ΜΙΑ ΠΟΛΥΠΛΟΚΗ ΥΠΟΡΟΥΤΙΝΑ 40

6. ΚΕΙΜΕΝΟ ΚΑΙ ΓΡΑΜΜΑΤΟΣΕΙΡΕΣ6.1 ΓΡΑΜΜΑΤΟΣΕΙΡΕΣ 436.2 ΚΕΙΜΕΝΟ 44

ΠΑΡΑΡΤΗΜΑ - ΣΥΝΟΠΤΙΚΟΣ ΟΔΗΓΟΣ ΤΩΝ ΕΝΤΟΛΩΝ ΤΗΣ POSTSCRIPT 48ΒΙΒΛΙΟΓΡΑΦΙΑ 51

ΕΙΣΑΓΩΓΗ

Η PostScript είναι μια γλώσσα προγραμματισμού περιγραφής σελίδας. Περιγράφει μια εικονική

σελίδα, με διάφορες εντολές γραφικών, η οποία και τελικά θα τυπωθεί. Τα προγράμματα PS μπορούν

να εκτελεστούν σε κάθε είδους συσκευή σχεδιασμού, εκτυπωτές, ploter ακόμα και οθόνες. Το

λειτουργικό σύστημα NeXTSTEP χρησιμοποιεί Postscript Display για το χειρισμό των γραφικών.

Αλλά τα Postscript προγράμματα συνήθως είναι κείμενα προς εκτύπωση. Στους εκτυπωτές που

υποστηρίζουν Postscript υπάρχει στη ROM ένας μεταφραστής (interpreter) στον οποίο εκτελούνται τα

προγράμματα. Αν δεν έχετε στη διάθεση σας έναν Postscript εκτυπωτή μπορείτε να βλέπετε το

αποτέλεσμα ενός προγράμματος σε κάποιο Postscript previewer. Ένας γνωστός free proviewer είναι το

GSVIEW, το οποία τρέχει σε αρκετές πλατφόρμες.

2

Page 3: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

Συνήθως Postscript αρχεία παίρνουμε σαν έξοδο από διάφορες εφαρμογές (π.χ. σχεδιαστικό πακέτο)

όμως υπάρχουν πολλοί προγραμματιστές που γράφουν Postscript "με το χέρι" για διάφορες γραφικές

εργασίες. Εδώ θα μάθουμε να γράφουμε Postscript "με το χέρι", ώστε να μπορούμε να σχεδιάσουμε με

ακρίβεια τα σχήματα μας, τότε όμως είμαστε σε θέση να γράψουμε κάποια εφαρμογή που να έχει και

Postscript έξοδο.

Πολλά φίλτρα εκτύπωσης, για παράδειγμα αυτό του UNIX (lpr), για να καταλάβουν ότι αυτό που

στέλνουμε για εκτύπωση είναι Postscript θέλουν το αρχείο να αρχίζει με τον παρακάτω header

%!PS-Adobe-2.0

%%Version: 3.15

%%DocumentFonts: (atend)

%%Pages: (atend)

%%EndComents

χωρίς κενές γραμμές πάνω από αυτόν. Το τί σημαίνει δεν έχει σημασία σε πρώτη φάση. Μια

αναλυτική παρουσίαση του header μπορείτε να διαβάσετε στο "Postscript language program design".

Σημειώστε ότι, όλες οι εντολές πρέπει να είναι γραμμένες με πεζά γράμματα. Ας αρχίσουμε.

1. ΣΤΟΙΒΑ ΚΑΙ ΑΡΙΘΜΗΤΙΚΗ

1.1 Η ΣΤΟΙΒΑ.

Η PS δε χειρίζεται τα δεδομένα όπως οι γνωστές γλώσσες προγραμματισμού υψηλού επιπέδου, όπου

έχουμε μεταβλητές (θέσεις στη μνήμη) και τελεστές που δρούν στις τιμές των μεταβλητών παράγοντας

κάποιο αποτέλεσμα το οποίο τοποθετείται σε κάποια θέση της μνήμης αλλά τα χειρίζεται η στοίβα. Η

στοίβα στην PS είναι σαν ένας σωρός από κουτιά τοποθετημένα το ένα πάνω στο άλλο, από όπου

μπορούμε να πάρουμε μόνο αυτό που τοποθετήσαμε τελευταίο, αυτό λέγεται LIFO (Last In First Out).

3

Page 4: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

Έτσι αν υποθέσουμε ότι αρχικά η στοίβα είναι κενή, και στη συνέχεια εκτελέσουμε τον παρακάτω

κώδικα PS

12

35

14

τότε το περιεχόμενο της στοίβας θα είναι

14

35

12

Δηλαδή πρώτα εκτελέστηκε η πρώτη γραμμή που τοποθέτησε στη στοίβα το 12 στη συνέχεια η

δεύτερη γραμμή που τοποθέτησε το 35 πάνω από το 12 και τέλος η τρίτη γραμμή που τοποθέτησε το

14 πάνω από το 35. Τώρα αν τραβήξουμε τα δεδομένα της στοίβας θα τα πάρουμε με την αντίστροφη

σειρά από αυτή που τα τοποθετήσαμε, δηλαδή 14, 35, 12.

1.2 Ο ΧΕΙΡΙΣΜΟΣ ΤΗΣ ΣΤΟΙΒΑΣ

Εύλογο είναι να αναρωτηθεί κανείς πώς χειριζόμαστε τη στοίβα, για παράδειγμα πως πετάμε κάτι που

δε χρειαζόμαστε ή πώς εναλλάσσουμε τη σειρά 2 αντικειμένων στη στοίβα. Στην PS υπάρχουν

διάφορες εντολές για το χειρισμό της στοίβας.

Αν έχουμε τη στοίβα του προηγούμενου παραδείγματος και θέλουμε να απαλλαγούμε από το πρώτο

στοιχείο της στοίβας τότε πολύ απλά το πετάμε έξω από αυτή κάνοντας το pop. Για παράδειγμα το

πρόγραμμα

12

35

14

pop

κάνει το εξής. Οι πρώτες τρεις γραμμές τοποθετούν τα δεδομένα στη στοίβα. έτσι η στοίβα γίνεται

4

Page 5: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

14

35

12

η τέταρτη γραμμή κάνει ένα pop στη στοίβα, πετάει το πρώτο αντικείμενο της στοίβας, έτσι τα

περιεχόμενα της στοίβας είναι

35

12

Αν τώρα θέλουμε να εναλλάξουμε τη σειρά των 35 και 12, δηλαδή να είναι πάνω πάνω στη στοίβα το

12 τότε θα κάνουμε ένα exch (exchange), μια εναλλαγή. Έτσι αν η στοίβα είναι ως έχει, και πούμε

exch

τότε η στοίβα θα γίνει

12

35

Τέλος αν για κάποιο λόγο θέλουμε να έχουμε στη στοίβα μας δύο φορές το πρώτο της στοιχείο, το 12,

θα πρέπει να το αναπαράγουμε (duplicate). Αυτή τη δουλειά την κάνει η εντολή dup. Αν πράγματι

πούμε

dup

τότε η στοίβα γίνεται

12

12

35

'Ετσι, τώρα που μάθαμε να πετάμε (pop), να εναλλάσσουμε (exch) και να αναπαράγουμε (dup) τα

αντικείμενα της στοίβας, μπορούμε να μάθουμε να κάνουμε και αριθμητικές πράξεις στη στοίβα.

5

Page 6: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

1.3 ΑΡΙΘΜΗΤΙΚΗ ΣΤΗ ΣΤΟΙΒΑ

Ας ξεκινήσουμε με την πιο απλή πράξη, την πρόσθεση. Πρόσθεση γίνεται μεταξύ των δύο πρώτων

μελών της στοίβας με τον τελεστή add. Ένα παράδειγμα πρόσθεσης είναι το παρακάτω πρόγραμμα

12

13

add

αρχικά τοποθετεί στη στοίβα το 12 και το 13 και στη συνέχεια ο τελεστής add τα προσθέτει και

τοποθετεί στη στοίβα το αποτέλεσμα, το 25. Δηλαδή αρχικά η στοίβα γίνεται

13

12

όταν δράσει ο add, γίνεται η πρόσθεση και η στοίβα γίνεται

25

δηλαδή περιέχει το αποτέλεσμα της πρόσθεσης. Κατά τον ίδιο τρόπο γίνονται και οι υπόλοιπες

πράξεις. Χωρίς κανένα πρόβλημα κάνουνε πολλαπλασιασμό (mul),

12

13

mul

και το αποτέλεσμα είναι στη στοίβα

156

Η αφαίρεση (sub) και η διαίρεση (div) θέλουν προσοχή για το πως θα τοποθετήσουμε στη στοίβα τους

όρους. Για παράδειγμα, αν γράψουμε το πιο κάτω

6

Page 7: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

12 4 sub

τότε το περιεχόμενο της στοίβας είναι

4

12

και ο τελεστής sub αφαιρεί το πρώτος μέλος της στοίβας από το δεύτερο και τοποθετεί στη στοίβα το

αποτέλεσμα

8

Με το ίδιο σκεπτικό γίνεται και η διαίρεση (div). Η παρακάτω γραμμή

5 2 div

αρχικά βάζει στη στοίβα τα δεδομένα, και τότε το περιεχόμενο της στοίβας είναι

2

5

μόλις δράσει ο div, γίνεται η διαίρεση και τοποθετείται στη στοίβα το αποτέλεσμα

2.5

Παρατηρούμε ότι έγινε πραγματική διαίρεση (διαίρεση μεταξύ πραγματικών αριθμών). Στην PS

μπορούμε να κάνουμε και διαίρεση ακέραιων με των τελεστή idiv. Ο idiv τοποθετεί στη στοίβα το

πηλίκο της διαίρεσης, ενώ το υπόλοιπο το παίρνουμε με τον τελεστή mod. Δηλαδή η γραμμή

5 2 idiv

τοποθετεί στη στοίβα το 2 και η

5 2 mod

7

Page 8: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

τοποθετεί το υπόλοιπο δηλαδή το 1. Τώρα πια μπορούμε να κάνουμε και πολύπλοκους υπολογισμούς.

Για παράδειγμα μπορούμε να υπολογίσουμε το (10-5)2. Για να κάνουμε αυτόν τον υπολογισμό, θα

χρησιμοποιήσουμε και μια εντολή από την προηγούμενη παράγραφο, την dup. Τη dup θα τη

χρειαστούμε για τον υπολογισμό του τετραγώνου. Ένας απλοϊκός τρόπος, για να το υπολογίσουμε,

είναι να κάνουμε δύο φορές την αφαίρεση και μετά να πολλαπλασιάσουμε τα αποτελέσματα, δηλαδή

10 5 sub

10 5

sub

mul

Ας δούμε τι γίνεται στη στοίβα. η πρώτη γραμμή αφαιρεί το 5 από το 10 και τοποθετεί στη στοίβα το

αποτέλεσμα, δηλαδή το 5. Η δεύτερη τοποθετεί το 10 και μετά το 5. έτσι η στοίβα γίνεται

5

10

5

Η sub αφαιρεί το πρώτο 5 από το 10 και τοποθετεί το αποτέλεσμα στη στοίβα πάνω από το

προηγούμενο 5, έτσι στη στοίβα έχουμε τα δύο 5 και τέλος η mul τα πολλαπλασιάζει και τοποθετεί το

αποτέλεσμα στη στοίβα. Ένας πιο έξυπνος τρόπος είναι ο εξής. αρχικά κάνουμε την αφαίρεση και

μετά αναπαράγουμε το αποτέλεσμα με τη dup και μετά εκτελούμε τον πολλαπλασιασμό, δηλαδή

10 5 sub

dup

mul

Οι πράξεις στην PS απατούν κάποια εξοικείωση με τη στοίβα και το χειρισμό της ώστε να μην

οδηγούμαστε σε λανθασμένα αποτελέσματα. Τέλος, υπάρχει και ένας πολύ ενδιαφέρον τελεστής, neg.

Η δουλειά του είναι να αλλάζει το πρόσημο ένας αριθμού. Δηλαδή αν πούμε

-4 neg

8

Page 9: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

το αποτέλεσμα είναι το 4. Τώρα που μάθαμε να χειριζόμαστε τα δεδομένα στη στοίβα και να κάνουμε

πράξεις μπορούμε να αρχίσουμε να σχεδιάζουμε με την PS.

2.ΣΥΣΤΗΜΑ ΑΝΑΦΟΡΑΣ & ΜΕΤΑΣΧΗΜΑΤΙΣΜΟΙ

2.1 ΤΟ ΣΥΣΤΗΜΑ ΑΝΑΦΟΡΑΣ

Για να προσδιορίσουμε ένα σημείο πάνω σ' ένα επίπεδο, όπως γνωρίζουμε και από τα μαθηματικά,

χρειαζόμαστε ένα σύστημα αναφοράς. Η PS έχει ένα ορθογώνιο σύστημα αξόνων, η αρχή του οποίου

(το 0,0) είναι στην κάτω αριστερά γωνία της σελίδας.

9

Page 10: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

Σε σελίδα Α4 ο x (οριζόντιος) άξονας έχει μήκος 595 σημεία και ο y (κατακόρυφος) άξονας έχει μήκος

842 σημεία. Το "σημείο" είναι η μονάδα μέτρησης. Το φυσικό μήκος ενός σημείου είναι 1/72 της

ίντσας. Λέγοντας φυσικό μήκος εννοούμε το πραγματικό μήκος, δηλαδή το μήκος που έχει αν τυπωθεί

στο χαρτί. Έτσι αν πούμε στην PS να μας τυπώσει ένα ευθύγραμμο τμήμα 72 σημείων και μετά το

μετρήσουμε στο χαρτί θα δούμε ότι έχει μήκος μια ίντσα. Σε αντίθεση με άλλες γλώσσες γραφικών

στην PS μπορούμε να μεταφέρουμε και να περιστρέψουμε το σύστημα των αξόνων καθώς να

αλλάξουμε και την κλίμακα του.

2.2 ΜΕΤΑΦΟΡΑ ΤΟΥ ΣΥΣΤΗΜΑΤΟΣ

Μια απλή περίπτωση που θελήσουμε να μεταφέρουμε το σύστημα αναφοράς είναι όταν θέλουμε να

σχεδιάσουμε ένα σχήμα του οποίου γνωρίζουμε τις συντεταγμένες και κάποιες από αυτές είναι

αρνητικές. Στην PS αν χρησιμοποιήσουμε το αρχικό σύστημα και δώσουμε αρνητικές συντεταγμένες

π.χ. -100,-40 τότε δε θα τυπωθεί τίποτα γιατί αυτά τα σημεία είναι έξω από το χαρτί. Αν όμως

μεταφέρουμε το σύστημα στο 200,200 τότε το σημείο μας (-100,-40) είναι μέσα στο χαρτί και

συνεπώς θα πάρουμε το επιθυμητό αποτέλεσμα.

Η μεταφορά του συστήματος γίνεται με την εντολή translate. Η εντολή

200 200 translate

θα μεταφέρει την αρχή του συστήματος στα σημείο 200,200 του τρέχοντος συστήματος.

10

Page 11: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

Οι μετασχηματισμοί στο σύστημα γίνονται ως προς το τρέχον σύστημα. Δηλαδή για να ξαναφέρουμε

το συστημα στην αρχική του θέση θα πούμε

-200 -200 translate

Χρήσιμο είναι να πούμε ότι σε όλες τις εντολές της PS πρώτα δίνουμε τη x συντεταγμένη και μετά την

y. Τώρα ας δούμε πως περιστρέφουμε το σύστημα αναφοράς.

2.3 ΠΕΡΙΣΤΡΟΦΗ ΤΟΥ ΣΥΣΤΗΜΑΤΟΣ

Η περιστροφή του συστήματος είναι εξίσου απλή μα και χρήσιμη. Για παράδειγμα αν θέλουμε να

τυπώσουμε μια λέξη με κλίση 60 μοιρών, το κάνουμε περιστρέφοντας το σύστημα αναφοράς κατά 60

μοίρες. Τη δουλειά αυτή την κάνει η εντολή rotate. Η rotate έχει ένα όρισμα, τη γωνία στροφής. Αν η

γωνία αυτή είναι θετική, τότε το σύστημα περιστρέφεται ανάποδα από τη φορά των δεικτών του

ρολογιού και κατά συνέπεια αν είναι αρνητική, περιστρέφεται κατά τη φορά των δεικτών του

ρολογιού. 'Ετσι η εντολή

60 rotate

περιστρέφει το σύστημα προς τα αριστερά

11

Page 12: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

ενώ η

-60 rotate

το επαναφέρει στη θέση του.

2.4 ΑΛΛΑΓΗ ΚΛΙΜΑΚΑΣ

Στο αρχικό σύστημα στον x και στον y άξονα, όπως είναι λογικό, τα μήκη είναι ίδια. Μπορούμε όμως

να αλλάξουμε την κλίμακα, με την εντολή scale. Έτσι αν αρχικά έχουμε το σχήμα

και στη συνέχεια πούμε

1.5 1 scale

τότε το x έχει 1.5 φορές μεγαλύτερο μήκος από ένα ίσο του στα y. Δηλαδή το πιο πάνω σχήμα θα γίνει

κάπως έτσι.

12

Page 13: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

Τώρα που μάθαμε για το σύστημα αναφοράς της PS, μάθαμε το χώρο μέσα στον οποίο θα

σχεδιάσουμε με τα "εργαλεία" του επόμενου κεφαλαίου.

3. ΕΝΤΟΛΕΣ ΓΡΑΦΙΚΩΝ

13

Page 14: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

3.1 Ο ΔΕΙΚΤΗΣ ΚΑΙ ΜΕΤΑΚΙΝΗΣΗ ΤΟΥ ΔΕΙΚΤΗ

Ο τρόπος που σχεδιάζει η PS μοιάζει με τα "turtle graphics" της logo, όπου έχουμε ένα δείκτη πάνω

στο χαρτί και τον μετακινούμε είτε αφήνοντας ίχνος (ζωγραφίζοντας) είτε όχι. Έτσι η PS έχει ένα

δείκτη ο οποίος αρχικά είναι τοποθετημένος στο σημείο (x=0, y=0). Αυτό είναι και το σημείο από

όπου αρχίζουμε πάντα. Έτσι αν θέλουμε να σχεδιάσουμε κάτι στο σημείο (100,100) πρέπει να

τοποθετήσουμε το δείκτη εκεί. Δηλαδή χρειαζόμαστε μια εντολή που να τοποθετεί το δείκτη σε κάποιο

σημείο, αυτή είναι η moveto. Η moveto παίρνει τα δύο πρώτα στοιχεία της στοίβας ως το σημείο που

θα τοποθετήσει το δείκτη. Έτσι η

100 100 moveto

τοποθετεί το δείκτη στο σημείο (100,100). Αν τώρα πούμε

100 100 moveto

50 100 moveto

η πρώτη εντολή τοποθετεί το δείκτη στο σημείο (100,100) και η δεύτερη τον τοποθετεί στο σημείο

(50,100). Δηλαδή η moveto μετακινεί το δείκτη ως προς την αρχή του συστήματος αναφοράς. Υπάρχει

όμως και η rmoveto (relative move), η οποία μετακινεί το δείκτη ως προς το σημείο που βρίσκεται. Τα

ορίσματα της rmoveto δεν είναι οι συντεταγμένες ως προς την αρχή αλλά το πόσο θέλουμε να κινηθεί

ως προς το x και ως προς το y από το σημείο που βρίσκεται. Για παράδειγμα αν πούμε

100 100 moveto

50 100 rmoveto

τότε η moveto θα τοποθετήσει το δείκτη στο σημείο (100,100) και η rmoveto θα τον μετακινήσει κατά

50 σημεία στα x και κατά 100 σημεία στα y δηλαδή τελικά ο δείκτης θα είναι στο σημείο (150,200) και

αυτό είναι το σημείο από όπου θα αρχίσει και το ευθύγραμμο τμήμα που θα σχεδιάσουμε παρακάτω.

3.2 ΓΡΑΜΜΕΣ

Ακολουθεί ένα απλό πρόγραμμα, το οποίο σχεδιάζει ένα ευθύγραμμο τμήμα, στο οποίο θα δούμε τις

βασικές αρχές σχεδιασμού της PS.

newpath

100 100 moveto

14

Page 15: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

200 200 lineto

closepath

stroke

showpage

Αρχικά βλέπουμε μια γνωστή σε μας εντολή, τη moveto, η οποία τοποθετεί το δείκτη στο σημείο

(100,100). Εύκολα μπορούμε να υποψιαστούμε τι κάνει η lineto. Η lineto ορίζει ένα ευθύγραμμα

τμήμα από το τρέχον σημείο (το σημείο που βρίσκεται ο δείκτης) ως το σημείο (200,200), όπως

φαίνεται στο παρακάτω σχήμα.

Τώρα ας πάμε στο "μονοπάτι" (path). Η εντολή newpath αδειάζει το τρέχον path και δηλώνει ότι

αρχίζουμε ένα νέο. Στο παράδειγμα μας φτιάχνουμε ένα ευθύγραμμο path που αντιστοιχεί στο

ευθύγραμμο τμήμα που θέλουμε να σχεδιάσουμε. Ένα path δημιουργείται μετακινώντας ένα

φανταστικό μολύβι πάνω στην σελίδα. Αυτό το μολύβι αφήνει ένα αόρατο ίχνος στη σελίδα το οποίο

αντιπροσωπεύει το τρέχον path. Η closepath θέτει το τέλος στο path που άρχισε με την αμέσως

προηγούμενη newpath. Στο παράδειγμα μας το τρέχον path δημιουργείται από τις moveto και lineto.

Αν θέλουμε να σχεδιαστεί το path που φτιάξαμε με το τρέχον χρώμα (εξ ορισμού μαύρο) αυτό θα το

πούμε με την stroke. Η stroke σχεδιάζει το περιεχόμενο του αμέσως προηγούμενου path.

Η τελευταία εντολή του παραδείγματος, η showpage, είναι ίσως από τις πιο σημαντικές εντολές της

PS. Αν στείλουμε στον εκτυπωτή το πιο πάνω πρόγραμμα χωρίς τη showpage τότε αυτός θα το

εκτελέσει (θα το "τρέξει") στη μνήμη αλλά δε θα τυπώσει τίποτα γιατί δεν του το είπαμε. Όλες οι

άλλες εντολές λένε στον εκτυπωτή τί να σχεδιάσει και πώς, η showpage όμως λέει στον εκτυπωτή να

το τυπώσει στο χαρτί.

Στην προηγούμενη παράγραφο είδαμε την εντολή rmoveto η οποία μετακινεί το δείκτη σε σχέση με το

τρέχον σημείο. Ανάλογη εντολή υπάρχει και για τις γραμμές, η rlineto. Η rlineto ορίζει το τελικό

σημείο του ευθύγραμμου τμήματος σε σχέση με το τρέχον σημείο, τη δουλεία που κάνει το

προηγούμενο πρόγραμμα δηλαδή μια γραμμή με αρχή το (100,100) και τέλος το (200,200) μπορούμε

να την κάνουμε και με την rlineto με το παρακάτω πρόγραμμα

newpath

100 100 moveto

15

Page 16: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

100 100 rlineto

closepath

stroke

showpage

Η moveto τοποθετεί το δείκτη στο σημείο (100,100) και η rlineto λέει ότι θέλουμε μια γραμμή από το

τρέχον σημείο, το (100,100) μέχρι το σημείο (100+100, 100+100) δηλαδή το (200,200) όπως και το

πρώτο πρόγραμμα. Αν θα χρησιμοποιήσουμε τη lineto ή την rlineto εξαρτάται από το αν ξέρουμε τις

συντεταγμένες του τελικού σημείου ή αν ξέρουμε το πόσο απέχει το τελικό από το αρχικό σημείο. Για

παράδειγμα αν θέλουμε να σχεδιάσουμε ένα τετράγωνο πλευράς 50 σημείων με την κάτω αριστερά

του γωνία στο (100,100) βολεύει η rlineto. Ενα τέτοιο τετράγωνο σχεδιάζει και αυτό το πρόγραμμα

newpath

100 100 moveto

0 50 rlineto

50 0 rlineto

0 -50 rlineto

-50 0 rlineto

closepath

stroke

showpage

Αρχικά τοποθετεί το δείκτη στο σημείο (100,100). Η πρώτη rlineto σχεδιάζει μια κατακόρυφη γραμμή

προς τα πάνω μήκους 50 σημείων. Η δεύτερη μια οριζόντια προς τα δεξιά. Η τρίτη μια κατακόρυφη

προς τα κάτω, αφαιρούμε 50 σημεία από την y συντεταγμένη του τρέχοντος σημείου. Τέλος η τέταρτη

rlineto σχεδιάζει τη βάση του τετραγώνου, μια γραμμή μήκους 50 προς τα αριστερά. Ας δούμε πώς θα

γεμίσουμε με χρώμα το τετράγωνό μας.

3.3 ΧΡΩΜΑ

Ας πάρουμε το πρόγραμμα που σχεδιάζει το τετράγωνο, και να του κάνουμε μια μικρή αλλαγή

newpath

100 100 moveto

0 50 rlineto

50 0 rlineto

16

Page 17: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

0 -50 rlineto

-50 0 rlineto

closepath

fill

showpage

θα αλλάξουμε την εντολή stoke με τη fill και το αποτέλεσμα είναι

ένα μαύρο τετράγωνο. Η fill λέει στην PS να γεμίσει με χρώμα το path που ορίσαμε. Ο χώρος που θα

γεμίσει είναι το κλειστό σχήμα που ορίζεται από τις γραμμές που αρχίζουν στο αρχικό σημείο που θα

βάλουμε το δείκτη και τελειώνουν ξανά σε αυτό. Αν δεν κλείνει το σχήμα στο αρχικό σημείο το

αποτέλεσμα είναι απρόβλεπτο και σίγουρα όχι το επιθυμητό. Πολύ εύκολα μπορούμε να αλλάξουμε

την απόχρωση του γκρι που θα γεμίσει το τετράγωνο μας με τη setgray όπως κάνει το παρακάτω

πρόγραμμα

newpath

100 100 moveto

0 50 rlineto

50 0 rlineto

0 -50 rlineto

-50 0 rlineto

closepath

0.5 setgray

fill

showpage

και το τετράγωνο που παίρνουμε είναι κάπως έτσι

17

Page 18: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

Η setgray περιμένει να βρει στη στοίβα έναν αριθμό μεταξύ 0 και 1, το 0 είναι μαύρο και το 1 άσπρο.

Αν δε βάλουμε άλλη setgray ό,τι σχεδιάσουμε μετά (στο ίδιο πρόγραμμα) θα έχει τον ίδιο τόνο γκρι

που ορίσαμε.

Τα σχέδια μας, όμως, δεν είναι υποχρεωτικά σε αποχρώσεις του γκρι, μπορούν να είναι και έγχρωμα.

Η PS έχει και χρώματα, αλλά τα καθορίζει με ένα λίγο παράξενο τρόπο. Υπάρχει η θεωρία που λέει,

και πράγματι ισχύει, ότι όλα τα χρώματα και οι αποχρώσεις τους μπορούν να παραχθούν με την

ανάμειξη του κόκκινου (Red), του πράσινου (Green) και του μπλε (Blue). Από τα ονόματα αυτών των

χρωμάτων βγαίνει η ονομασία RGB. 'Ετσι μπορούμε να προσδιορίσουμε όλα τα χρώματα από την

ποσότητα κάθε συνθετικού που περιέχει. Κάνοντας τη σύμβαση οι ποσότητες να είναι από 0 έως 1,

πολύ απλά το κόκκινο ορίζεται από την τριάδα (1,0,0), δηλαδή 1 κόκκινο, 0 πράσινο, 0 μπλε. Μαύρο

στην ίδια θεωρία είναι κάτι χωρίς χρώμα, δηλαδή το (0,0,0) και το άσπρο όλα τα χρώματα μαζί στο

μέγιστο δηλαδή (1,1,1). Με αυτό τον τρόπο καθορίζει τα χρώματα και η PS. Με την εντολή

setrgbcolor αλλάζουμε το τρέχον χρώμα, το μαύρο, σε κάποιο άλλο. Τώρα μπορούμε να βάψουμε το

τετράγωνο μας με κάποιο χρώμα,

newpath

100 100 moveto

0 50 rlineto

50 0 rlineto

0 -50 rlineto

-50 0 rlineto

closepath

0.98 0.98 0.31 setrgbcolor

fill

showpage

και το αποτέλεσμα είναι ένα κίτρινο τετράγωνο, το οποίο αν τυπωθεί σε έναν ασπρόμαυρο εκτυπωτή

μοιάζει κάπως έτσι

18

Page 19: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

'Οπως και με τη setgray η setrgbcolor αλλάζει το τρέχον χρώμα, το οποίο εξ ορισμού είναι το μαύρο,

σε κάποιο άλλο και παραμένει μέχρι να το ξανά αλλάξουμε. Κάτι χρήσιμο εκτός από το χρώμα είναι

και το πώς σχεδιάζουμε κύκλους και τόξα.

3.4 ΚΥΚΛΟΙ ΚΑΙ ΤΟΞΑ

Ας δούμε πώς ορίζουμε ένα τόξο στην PS. Τόξο είναι κομμάτι ενός κύκλου, και το μήκος του

προσδιορίζεται απ'τη γωνία μεταξύ των ακτινών στα άκρα του. Τη γωνία αυτή την ορίζουμε σαν τη

διαφορά δύο γωνιών που τις μετράμε από τη δεξιά πλευρά της οριζόντιας διαμέτρου του κύκλου.

Δηλαδή χρειαζόμαστε, τις συντεταγμένες του κέντρου, την ακτίνα, την αρχική γωνία (θ1) και την

τελική γωνία (θ2). Οι γωνίες είναι όπως φαίνονται στο παρακάτω σχήμα

Η εντολή arc σχεδιάζει τόξα με αυτό τον τρόπο, για παράδειγμα το πρόγραμμα

newpath

100 100 50 30 60 arc

closepath

stroke

showpage

σχεδιάζει τόξο ενός κύκλου με κέντρο το (100,100) και ακτίνα 50 από γωνία 30ο έως γωνία 60ο.

19

Page 20: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

Τώρα πια μπορούμε πολύ εύκολα να σχεδιάσουμε ένα κύκλο. Πολύ απλά θα αλλάξουμε τις γωνίες, θα

αρχίζει από τη γωνία 0 και θα τελειώνει στις 360ο. Δηλαδή θα πούμε

newpath

100 100 50 0 360 arc

closepath

stroke

showpage

και αυτό που θα πάρουμε είναι ένας κύκλος με κέντρο το (100,100) και ακτίνα 50 σημεία. Με ένα

μικρό κόλπο μπορούμε να σχεδιάσουμε μια έλλειψη. Το κόλπο είναι να αλλάξουμε την κλίμακα, είτε

κατά x είτε κατά y, ώστε να "τραβήξουμε" τον κύκλο από τη μια του διάμετρο να πλατύνει και να γίνει

έλλειψη. Όπως ξέρουμε η PS έχει μια ειδική εντολή για την αλλαγή κλίμακας τη scale. Το επόμενο

πρόγραμμα σχεδιάζει μια έλλειψη, μεγαλώνοντας την x κλίμακα και στη συνέχεια σχεδιάζει έναν

κύκλο.

100 100 translate

1.5 1 scale

newpath

0 0 50 0 360 arc

closepath

stroke

showpage

Το αποτέλεσμα όπως φαίνεται και στο σχήμα είναι πράγματι μια έλλειψη.

20

Page 21: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

Αυτό το πρόγραμμα έχει δύο παραξενιές, η πρώτη είναι η translate στην αρχή από το πρόγραμμα και η

δεύτερη, ότι το κέντρο του κύκλου είναι στο (0,0). Αν δεν υπήρχε η translate και σχεδιάζαμε τον κύκλο

με κέντρο το (100,100), το πρόβλημα θα ήταν ότι η έλλειψη μας δε θα σχεδιαζόταν εκεί που θέλουμε

γιατί έχουμε μεγαλώσει την κλίμακα στα x και συνεπώς θα σχεδιαζόταν πιο δεξιά από το επιθυμητό

μέρος. Γι' αυτό το λόγο μεταφέρουμε αρχικά το σύστημα αναφοράς εκεί που θέλουμε το κέντρο του

κύκλου, δηλαδή το (100,100), μετά αλλάζουμε την κλίμακα και τέλος σχεδιάζουμε έναν κύκλο στην

αρχή του συστήματος με ακτίνα 50. Το μόνο πρόβλημα τώρα είναι ότι για να συνεχίσουμε το σχέδιο

μας πρέπει να ξαναλλάξουμε την κλίμακα και να ξαναβάλουμε το σύστημα αναφοράς στην αρχική του

θέση. Δηλαδή έπρεπε μετά τη stroke να υπάρχουν οι εντολές

0.66 1 scale

-100 -100 translate

Μια πιο εύκολη λύση σ' αυτό το πρόβλημα θα δούμε στη συνέχεια.

3.5 ΚΑΤΑΣΤΑΣΗ ΓΡΑΦΙΚΩΝ

Κατάσταση γραφικών (graphics state) είναι η θέση, ο προσανατολισμός, και η κλίμακα του

συστήματος αναφοράς και το χρώμα. Η εντολή gsave αποθηκεύει στη μνήμη την κατάσταση γραφικών

και η grestore την επαναφέρει. Έτσι στο προηγούμενο παράδειγμα αν είχαμε αποθηκεύσει την

κατάσταση γραφικών πριν την translate μετά το σχεδιασμό της έλλειψης θα μπορούσαμε να

επαναφέρουμε τα πράγματα στην κατάσταση που ήταν στην αρχή. Το επόμενο πρόγραμμα σχεδιάζει

την προηγούμενη έλλειψη και τον κύκλο με κέντρο το (100,100) και ακτίνα 50 χωρίς την αλλαγή

κλίμακας.

gsave

100 100 translate

1.5 1 scale

newpath

0 0 50 0 360 arc

closepath

stroke

grestore

newpath

100 100 50 0 360 arc

21

Page 22: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

closepath

stroke

showpage

Αποθηκεύουμε την κατάσταση γραφικών, σχεδιάζουμε την έλλειψη, με το γνωστό τρόπο,

επαναφέρουμε την κατάσταση γραφικών και μετά σχεδιάζουμε τον κύκλο.

Στο σχήμα βλέπουμε ότι το "κόλπο" με τη μεταφορά και την αλλαγή κλίμακας όντως δουλεύει και το

κέντρο της έλλειψης είναι το (100,100).

3.6 ΨΑΛΙΔΙΣΜΑ

Ας υποθέσουμε ότι θέλουμε να σχεδιάσουμε ένα ριγέ κύκλο, αυτό που πρέπει να κάνουμε είναι

σχεδιάσουμε ένα κύκλο και μερικές οριζόντιες γραμμές. Όμως το μήκος των γραμμών δεν είναι

σταθερό, και καταλαβαίνουμε ότι δεν είναι εύκολο να υπολογίσουμε τις συντεταγμένες των άκρων των

γραμμών. Κάτι που θα μας βόλευε είναι να σχεδιάσουμε τον κύκλο, μετά οριζόντιες γραμμές ίσου

μήκους και με κάποιο τρόπο να "σβήσουμε" το μέρος των γραμμών που είναι έξω από τον κύκλο.

Δηλαδή χρειαζόμαστε ένα τρόπο να πούμε στην PS την περιοχή, το path, μέσα στην οποία θέλουμε να

"φαίνεται" ότι σχεδιάζουμε. Αυτό γίνεται ορίζοντας ένα path και στη συνέχεια αντί να το κάνουμε

stroke ή κάτι τέτοιο λέμε clip. Ο τελεστής clip ορίζει το path ψαλιδίσματος (clipping path), ό,τι είναι

έξω από αυτό "ψαλιδίζεται" δηλαδή δε σχεδιάζεται. Αν σχεδιάσουμε τον κύκλο και τις γραμμές, ίσου

μήκους, αυτό που θέλουμε να ψαλιδιστεί είναι ό,τι είναι έξω από τον κύκλο, άρα το clipping path εδώ

είναι ο κύκλος. Ας δούμε πώς γίνεται στην πράξη.

%σχεδιάζει τον κύκλο

newpath

100 100 50 0 360 arc

closepath

stroke

% ορίζει το clipping path

22

Page 23: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

newpath

100 100 50 0 360 arc

closepath

clip

% σχεδιάζει μερικές οριζόντιες γραμμές

newpath

50 55 moveto

100 0 rlineto

0 10 rmoveto

-100 0 rlineto

0 10 rmoveto

100 0 rlineto

0 10 rmoveto

-100 0 rlineto

closepath

stroke

showpage

Αυτό το πρόγραμμα σχεδιάζει έναν κύκλο με μερικές οριζόντιες γραμμές μέσα του,

βλέπουμε ότι καμιά δεν προεξέχει από την περιφέρεια του αν και όλες έχουν το ίδιο μήκος, 100

σημεία. Αυτό το φρόντισαν οι γραμμές το προγράμματος που όρισαν το clipping path, το οποίο είναι ο

κύκλος. Στη συνέχεια σχεδιάζονται οι οριζόντιες γραμμές. Θα παρατηρήσατε ότι πρώτα σχεδιάζεται ο

κύκλος και μετά ορίζεται το clipping path. Επειδή το clipping path είναι ο ίδιος κύκλος, αν ορίζαμε

πρώτα το clipping path και μετά σχεδιάζαμε τον κύκλο τότε το αποτέλεσμα θα ήταν απρόβλεπτο. Το

πιο πιθανό είναι να είναι "κομμένα" μερικά σημεία της περιφέρειας του κύκλου. Γι'αυτό το λόγο αν

θέλουμε και να σχεδιάσουμε το clipping path πρέπει πρώτα να το σχεδιάζουμε και μετά να το

ορίζουμε.

Αυτό το παράδειγμα έχει ένα ακόμα στοιχείο για τα προγράμματα PS. Σίγουρα θα παρατηρήσατε ότι

υπάρχουν γραμμές που αρχίζουν με το σύμβολο %. Όσες γραμμές αρχίζουν με αυτό το σύμβολο είναι

23

Page 24: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

σχόλια και όταν η PS συναντήσει μια γραμμή που αρχίζει με αυτό το σύμβολο την αγνοεί, όπως αγνοεί

και τις κενές γραμμές.

3.7 BITMAPPED IMAGES

Τώρα θα δούμε ένα ποιό πολύπλοκο θέμα. Ας υποθέσουμε ότι θέλουμε σε μια σελίδας να

προσθέσουμε και το λογοτυπό μας, το οποίο είναι μια περίεργη μη γραμμική εικόνα και είναι αδύνατο

να την ζωγραφίσουμε με εντολές postscript, αλλά είναι αρκετά εύκολο να την αναπαραστήσουμε με

ένα bitmapped image. Τότε είναι ώρα να χρησιμοποιήσουμε την εντολή image. Εδώ σημειώστε ότι η

postscript υποστηρίζει, δυστυχώς, μόνο greyscalled images. Η σύνταξη της εντολής image είναι η

παρακάτω:

ScanLength scanLines bitsPerSample transformMatrix

procedure image

Είναι λίγο παράξενη. Αλλά αν πάρουμε τα πράγματα από την αρχή θα γίνει πολύ κατανοητή.

Ένα bitmapped image στην πραγματικότα είναι ένας διδιάστατος πίνακας που οι διαστάσεις του είναι

το μέγεθος του bitmap. Για παράδειγμα ένα bitmap με ύψος 5 pixel και πλάτος 10 pixel αντιστοιχεί σε

ένα πίνακα 5x10. Το κάθε στοιχείο του πίνακα είναι ένα pixel. Το pixel αυτό μπορεί να είναι μαύρο,

άσπρο ή και να έχει κάποια απόχρωση του γκρί, άρα το αντίστοιχο στοιχείο του πίνακα θα έχει τιμές 0

για μαύρο, 255 για άσπρο και τις ενδιάμεσες τιμές για τις αποχρώσεις του γκρί. Δυστυχώς οι τιμές

αυτές πρέπει να είναι σε διαδικό. Βέβαια για ένα ασπρόμαυρο bitmap τα πράγματα είναι απλά, 0

μαύρο, 1 άσπρο. Έτσι ένα 5x5 ασπρόμαυρο bitmap είναι ένας πίνακας σαν τον παρακάτω

1 0 0 0 10 1 0 1 00 0 1 0 00 1 0 1 01 0 0 0 1

Εδώ μπερδεύουν τα πράγματα. Η image δεν δέχεται έναν τέτοιο πίνακα, πρέπει να βάλουμε τα

στοιχεία του πίνακα σε ένα string που περιέχει τα στοιχεία του πίνακα στη σειρά, δηλαδή κάτι τέτοιο

1000101010001000101010001το οποίο πρέπει να το μεταφράσουμε σε δεκαεξαδικούς αριθμούς (η image δέχεται δεκαεξαδικά

δεδομένα τα οποία μεταφράζει σε διαδικά). Έτσι ανά οκτώ μας δίνουν ένα δεκαεξαδικό αριθμό. Τα

δεδομένα κάθε γραμμής πρέπει να είναι σε συμπληρωμένες οκτάδες. Τα επιπλέον δεδομένα σε κάθε

γραμμή η image τα «πετάει». Εμείς όμως έχουμε πέντε ανά γραμμή, δεν πειράζει, συμπληρώνουμε τα

υπόλοιπα με μηδενικά. Τα δεδομένα μας πρέπει να συμπληρωθούν ώστε να γίνουν πέντε οκτάδες,

δηλαδή σαράντα, οπότε γίνονται:

10001000 01010000 00100000 01010000 10001000Τώρα τα χωρίζουμε σε οκτάδες

24

Page 25: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

10001000 01010000 00100000 01010000 100010001η 2η 3η 4η 5η

και κάθε οκτάδα τη μετατρέπουμε σε δεκαεξαδικό:

Διαδική τιμή Δεκαεξαδική 1η 10001000 882η 01010000 503η 00100000 204η 01010000 505η 10001000 88

Τελικά τα δεδομένα για την image είναι το string

88 50 20 50 88

Τώρα αν θέλουμε το bitmap να έχει τόνους του γκρί το 0 και 1 δεν αρκεί. Για κάθε pixel χρειαζόμαστε

περισότερα bit. Έστω ότι βάζουμε δύο bit ανά pixel τότε ο αρχικός πίνακας γίνεται

01 00 00 00 0100 01 00 01 0000 00 01 00 0000 01 00 01 0001 00 00 00 01

Και τα διαδικά δεδομένα είναι

01000000010001000100000010000000010001000100000001

συμπληρώνουμε τις οκτάδες

01000000 01000000

00010001 00000000

00000100 00000000

00010001 00000000

01000000 01000000

μετατρέπουμε κάθε οκτάδα σε δεκαεξαδικό και παίρνουμε

40 40 11 00 04 00 11 00 40 40

Μέχρι εδώ είδαμε πως μετατρέπουμε ένα bitmap σε δεδομένα κατάλληλα για την image. Τώρα ας

δούμε πως θα πούμε στην image πως να μεταφράσει αυτά τα δεδομένα.

Η image μετατρέπει το string που της δίνουμε σε διαδικά δεδομένα. Θεωρεί ότι κάθε δύο ψηφία είναι

ένας δεκαεξαδικός αριθμός, γι’ αυτό πρέπει να γράφουμε όλους τους αρθμούς με δύο ψηφία (π.χ. το F

πρέπει να το γράψουμε 0F). Αφού το κάνει αυτό πρέπει να ξέρει πόσα bit αντιστοιχούν σε κάθε pixel,

έτσι στο πρώτο παράδειγμα αντιστοιχεί 1bit ενώ στο δεύτερο 2. Επίσης πρέπει να ξέρει και πόσα pixel

έχει κάθε γραμμή, στο παραδειγμά μας κάθε γραμμή έχει πέντε pixel, καθώς και πόσες γραμμές έχει η

εικόνα, εδώ πέντε. Με αυτά νέα δεδομένα η image μπορεί να μετατρέψει το string με τους

δεκαεξαδικούς αριθμούς σε bitmap.

Τώρα ας δούμε πως τοποθετεί η PS στο χαρτί αυτό το bitmap. To bitmap τοποθετείται μέσα στο

στοιχειώδες τετράγωνο με πλευρά 1/72 της ίντσας. Έτσι αν θέλουμε το bitmap που τοποθετούμε να

είναι μεγαλύτερο κάνουμε πρίν ένα scale. Για το bitmap του παραδείγματος αν θέλουμε να

καταλαμβάνει μια τετραγωνική ιντσα στο χαρτί, κάνουμε το

72 72 scale και μετά βάζουμε την image.

25

Page 26: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

Μέχρι εδώ έχουμε δεί τι σημαίνουν όλα τα ορίσματα της image. Ας τα βάλουμε όλα μαζί. Πρώτο είναι

το scanlines, είναι ο αριθμός των γραμμών που έχει το bitmap, στα παράδειγμά μας έχει 5. Δεύτερο

είναι bitPerSample, είναι πόσα bit από τα δεδομένα αντιστοιχούν σε κάθε pixel. Στη συνέχεια είναι το

transformMatrix, είναι ένας πίνακας τηε μορφής [n 0 0 m 0 0] όπου n είναι τα pixel ανά γραμμή και m

είναι ο αριθμός των γραμμών του bitmap. Τα pixel αρχίζουν να τοποθετούνται από την κάτω αριστερή

γωνία. Αν θέλουμε όμως τα pixel να αρχίζουν τοποθετούνται από την πάνω αριστερή γωνία γράφουμε

[n 0 0 –m 0 0]. Τέλος procedure είναι μια postscript υπορουτίνα που τροφοδοτεί την image με

δεδομένα του τύπου που περιγράψαμε ποιο πάνω. Αν την καλέσει μια φορά και τα δεδομένα δεν

φτάνουν για το bitmap που δηλώσαμε τότε η image την ξανακαλεί μέχρι να πάρει αρκετά δεδομένα.

Ας δούμε πως θα καλούσαμε την image για το bitmap που περιγράψαμε στην αρχή.

72 72 scale

5 5 1 [5 0 0 –5 0 0] {<8850205088>} image

Βάλαμε πρώτα την scale για να είναι αρκετά μεγάλο το αποτέλεσμα που θα δούμε.

Περίεργο; Αν κάνουμε inverse τα χρώματα βλέπουμε ένα ωραίο Χ.

Για να πάρουμε αυτό το σχήμα πρέπει στα δεδομένα μας να αντικαταστήσουμε τα 1 με 0 και αντίστροφα.

Τώρα το ερώτημα είναι που στη σελίδα σχεδιάζει η PS το bitmap. Η απάντηση είναι, στο (0,0). Οπότε για να σχεδιαστεί το bitmap στο σημείο που θέλουμε πρέπει να κάνουμε πρώτα ένα translate στο σημείο που θέλουμε και μετά να το σχεδιάσουμε. Οπότε για να σχεδιαστεί το bitmap του παραδειγματός μας στο σημείο 300,400 γράφουμε

300 400 translate

72 72 scale

5 5 1 [5 0 0 –5 0 0] {<8850205088>} image

Εδώ τονίζουμε ξανά την λεπτομέρια του τέταρτου στοιχείου του tansformMatrix. Αν είναι θετικό και κάνουμε transform στο 300,400 τότε το bitmap θα τοποθετηθεί ως εξής

Ενώ αν είναι αρνητικό

26

Page 27: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

Τέλος θα αναφέρουμε και μια σχετική εντολή την imagemask. H imagemask συντάσεται ως εξής

Width height invert matrix proc imagemask

Όπου width είναι το πλάτος του bitmap, height είναι το πλάτος του bitmap, matrix και proc είναι ότι και στην image. Η imagemask «βάφει» μάυρα τα pixel που αντιστοιχούν σε μηδέν (0) και αφήνει απείραχτα τα υπόλοιπα. Η παράμετρος invert αντιστρέφει και «βάφει» μάυρα τα pixel που αντιστοιχούν σε άσσο (1) και αφήνει απείραχτα τα υπόλοιπα. Στο κεφάλαιο πέντε υπάρχει ένα πολύ καλό πράδειγμα χρήσης της imagemask.

4.ΥΠΟΡΟΥΤΙΝΕΣ ΚΑΙ ΜΕΤΑΒΛΗΤΕΣ

4.1 ΥΠΟΡΟΥΤΙΝΕΣ

27

Page 28: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

Το τελευταίο παράδειγμα του προηγούμενου κεφαλαίου σχεδίαζε ένα "ριγέ" κύκλο, και το μεγαλύτερο

μέρος του προγράμματος ήταν αυτό που σχεδίαζε τις οριζόντιες γραμμές. Ένας λίγο πιο έξυπνος

τρόπος για να σχεδιάσουμε τις οριζόντιες γραμμές είναι να φτιάξουμε μια υπορουτίνα η οποία να

σχεδιάζει μια οριζόντια γραμμή και σαν ορίσματα να παίρνει την x και την y θέση που θα σχεδιαστεί η

γραμμή. Ας δούμε τη βελτιωμένη έκδοση.

%υπορουτίνα που σχεδιάζει

% οριζόντιες γραμμές

/hline

{

moveto

100 0 rlineto

}def

%σχεδιάζει τον κύκλο

newpath

100 100 50 0 360 arc

closepath

stroke

% ορίζει το clipping path

newpath

100 100 50 0 360 arc

closepath

clip

% σχεδιάζει μερικές οριζόντιες γραμμές

newpath

50 60 hline

50 70 hline

50 80 hline

50 90 hline

50 100 hline

closepath

stroke

showpage

Αρχικά ορίζουμε την υπορουτίνα hline (Horizontal Line). Για να καταλάβει η PS ότι η λέξη hline δεν

είναι δεδομένο, βάζουμε στην αρχή της λέξης μια κάθετο (/). Τότε η PS καταλαβαίνει ότι πρόκειται για

όνομα "ορισμού". Ο ορισμός αρχίζει με την αριστερή αγκύλη ({) και τελειώνει με τη δεξιά αγκύλη (}).

Δηλαδή ο ορισμός μιας υπορουτίνας είναι

28

Page 29: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

/όνομα

{

...

εντολές

...

} def

Μετά τη δεξιά αγκύλη ακολουθεί ο τελεστής def. Αυτός λέει στην PS ότι υπάρχει όνομα και ορισμός

στη στοίβα δεδομένων, τότε η PS γυρνάει πίσω στη στοίβα να βρει το όνομα και τον ορισμό και μετά

τα βάζει στον πίνακα των εντολών. Οι εντολές που περιέχονται στον ορισμό της υπορουτίνας μπορούν

να είναι οποιεσδήποτε εντολές PS ή και άλλες υπορουτίνες που έχουν οριστεί πιο πριν στο πρόγραμμα.

Αυτό που κάνει η υπορουτίνα του παραδείγματος, hline, είναι ένα moveto σε κάποια θέση και στη

συνέχεια μια ευθεία μήκους 100 σημείων. Το αποτέλεσμα είναι ίδιο με αυτό του προγράμματος στο

προηγούμενο κεφάλαιο. Αν προσέξετε θα δείτε ότι στη moveto δεν έχουμε δώσει ορίσματα και

πουθενά στον ορισμό της hline δε γίνεται καμιά αναφορά σ’αυτά. Το ερώτημα είναι πώς δίνουμε

δεδομένα στις υπορουτίνες. Την απάντηση θα τη βρούμε αν δούμε πώς γίνεται η κλήση της

υπορουτίνας.

Όταν πιο κάτω, στο πρόγραμμα, που καλούμε την hline λέμε,

50 60 hline

δηλαδή, γράφουμε πρώτα τα δεδομένα, το σημείο από όπου θα αρχίζει η γραμμή, και μετά την hline. Η

PS όταν συναντήσει αυτή τη γραμμή θα βάλει στη στοίβα το 50 και το 60 και μετά θα ελέγξει αν

υπάρχει εντολή με το όνομα hline. Αν υπάρχει θα την εκτελέσει. Η πρώτη εντολή της hline είναι η

moveto. Η moveto παίρνει τα δύο πρώτα στοιχεία της στοίβας σαν το σημείο που θα τοποθετήσει το

δείκτη. Θυμηθείτε ότι έχουμε ήδη βάλει στη στοίβα δύο αριθμούς, αυτοί είναι οι αριθμοί που θα πάρει

η moveto. Δηλαδή τα δεδομένα που χρειάζονται οι εντολές μιας υπορουτίνας ψάχνουν να τα βρουν

στη στοίβα, σα να ήταν εντολές του κυρίως προγράμματος. Έτσι, πριν καλέσουμε την hline πρέπει να

βάλουμε στη στοίβα τους δύο αριθμούς που χρειάζεται η moveto. Το ίδιο πρέπει να κάνουμε αν έχουμε

και άλλες εντολές που χρειάζονται δεδομένα. Για παράδειγμα αν θέλαμε η hline να μη σχεδιάζει μόνο

οριζόντιες γραμμές μήκους 100 σημείων, αλλά να σχεδιάζει γενικά γραμμές που αρχίζουν από κάποιο

σημείο, τότε θα έπρεπε και η rlineto να μην έχει σταθερά δεδομένα αλλά να τα ορίζουμε κατά την

κλίση της hline. Ας δούμε πως θα ήταν το πιο πάνω πρόγραμμα με μια τέτοια hline.

%υπορουτίνα που σχεδιάζει γραμμές

/hline

{

moveto

29

Page 30: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

rlineto

}def

%σχεδιάζει τον κύκλο

newpath

100 100 50 0 360 arc

closepath

stroke

% ορίζει το clipping path

newpath

100 100 50 0 360 arc

closepath

clip

% σχεδιάζει μερικές οριζόντιες γραμμές

newpath

100 0 50 60 hline

100 0 50 70 hline

100 0 50 80 hline

100 0 50 90 hline

100 0 50 100 hline

closepath

stroke

showpage

Τώρα η rlineto δεν έχει και αυτή δεδομένα, μέσα στον ορισμό της hline. Πριν όμως καλέσουμε την

hline βάζουμε στη στοίβα ένα επιπλέον ζευγάρι αριθμών, που είναι τα δεδομένα της rlineto. Ίσως

φαίνεται παράξενο ότι πρώτα γράψαμε στη γραμμή τα δεδομένα για την rlineto και μετά τα δεδομένα

για την moveto μιας και εκτελείται πρώτα η moveto και μετά η rlineto. Αυτό είναι κάτι που πρέπει να

προσεχθεί πάρα πολύ. Η moveto εκτελείται πρώτη και συνεπώς πρέπει τα δεδομένα γι'αυτή να είναι

πρώτα στη στοίβα. Αν γράφαμε πρώτα το ζευγάρι της moveto και μετά το ζευγάρι της rlineto τότε

πρώτο στη στοίβα θα ήταν το ζευγάρι της rlineto, γιατί όπως είπαμε και στο πρώτο κεφάλαιο το

στοιχείο που θα μπεί πρώτο στη στοίβα θα βγει τελευταίο, άρα πρώτα γράφουμε τα δεδομένα της

εντολής που θα εκτελεστεί τελευταία, μετά της αμέσως προηγούμενης και συνεχίζουμε έτσι μέχρι την

πρώτη. Δηλαδή τα δεδομένα της τελευταίας τα γράφουμε πρώτα και της πρώτης τελευταία.

4.2 ΜΕΤΑΒΛΗΤΕΣΑς υποθέσουμε τώρα ότι κάποιος θέλει να σχεδιάσει το "ριγέ" κύκλο αλλά βαριέται να κάνει τις

προσθέσεις για να βρει την y θέση της κάθε οριζόντιας γραμμής και θέλει να βάλει την PS να κάνει τις

προσθέσεις. Για να γίνει αυτό χρειαζόμαστε μια μεταβλητή που να έχει αρχικά τη θέση της πρώτης

30

Page 31: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

γραμμής και μετά την πρώτη κλίση της hline να αυξάνει η τιμή της κατά 10 σημεία. Η νέα παραλλαγή

του προγράμματος είναι η παρακάτω.

%υπορουτίνα που σχεδιάζει γραμμές

/hline

{

moveto

rlineto

}def

%ορίζουμε τη μεταβλητή

/ypos 50 def

%σχεδιάζει τον κύκλο

newpath

100 100 50 0 360 arc

closepath

stroke

% ορίζει το clipping path

newpath

100 100 50 0 360 arc

closepath

clip

% σχεδιάζει μερικές οριζόντιες γραμμές

newpath

100 0 50 ypos hline

%αυξάνει την τιμή της ypos κατά 10

/ypos ypos 10 add def

100 0 50 ypos hline

/ypos ypos 10 add def

100 0 50 ypos hline

/ypos ypos 10 add def

100 0 50 ypos hline

/ypos ypos 10 add def

100 0 50 ypos hline

closepath

stroke

showpage

Στην αρχή έχουμε τον ορισμό της hline, που είναι ίδιος με προηγουμένως, και στη συνέχεια ορίζουμε

τη μεταβλητή ypos. Παρατηρούμε ότι ο ορισμός της μεταβλητής είναι παρόμοιος με τον ορισμό της

υπορουτίνας, δηλαδή

31

Page 32: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

/όνομα τιμή def

Εδώ δεν έχουμε τον ορισμό της μεταβλητής κλεισμένο μέσα σε αγκύλες. Μια μεταβλητή στην PS είναι

σαν μια υπορουτίνα που η δουλειά της είναι να βάζει ένα στοιχείο στη στοίβα. Το άλλο μέρος του

προγράμματος που έχει αλλάξει είναι το κομμάτι που σχεδιάζει τις οριζόντιες γραμμές. Στη γραμμή

που καλεί την hline έχουμε βάλει τη μεταβλητή μας στη θέση της μεταβαλλόμενης y συντεταγμένης.

Μετά την πρώτη κλήση της hline αυξάνουμε την τιμή της μεταβλητής, με ένα φαινομενικά παράξενο

τρόπο. Ο τρόπος που αλλάζουμε την τιμή μιας μεταβλητής έχει την ίδια λογική με αυτόν που

ακολουθούμε σε άλλες γλώσσες προγραμματισμού. Για παράδειγμα στη BASIC θα λέγαμε

ypos = ypos + 10

το οποίο αν το αναλύσουμε σημαίνει, όρισε τιμή της μεταβλητής ypos, την τιμή που είχε, αφού της

προσθέσεις το δέκα. Το ypos + 10, μεταφράζεται σε PS

ypos 10 add

και ίσον (=) της BASIC είναι ανάλογο με το

/όνομα τιμή def

έτσι τελικά η ανάθεση της νέας τιμής στην ypos γίνεται με τη γραμμή

/ypos ypos 10 add def

Το συμπέρασμα που καταλήγουμε είναι ότι το όρισμα μια μεταβλητής μπορεί να είναι και μια

έκφραση που το αποτέλεσμα της είναι μια σταθερά.

Τέλος ενδιαφέρον έχει να δούμε πώς ορίζουμε μεταβλητές που οι τιμές τους έχουν τα δεδομένα που

χρησιμοποιεί μια υπορουτίνα. Ας δούμε μια ακόμα παραλλαγή της hline, που βάζει τα δεδομένα που

χρησιμοποιεί σε μεταβλητές.

/hline

{

/y exch def

/x exch def

/ry exch def

/rx exch def

32

Page 33: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

x y moveto

rx ry rlineto

}def

Οι ορισμοί των μεταβλητών πρέπει να είναι μέσα στη δήλωση της υπορουτίνας. Η exch που ακολουθεί

το όνομα παίζει ένα πολύ σημαντικό ρόλο. Όταν καλούμε την υπορουτίνα υπάρχουν ήδη στη στοίβα

τα δεδομένα που θέλουμε να αποθηκεύσουμε στις μεταβλητές. Η πρώτη γραμμή της υπορουτίνας

αρχικά βάζει στη στοίβα το /y. Αυτή τη στιγμή στη στοίβα έχουμε πρώτα την τιμή και μετά το όνομα,

δηλαδή είναι ανάποδα από ότι πρέπει για να ορίσουμε τη μεταβλητή. Η σωστή σειρά είναι, όνομα τιμή.

Γι'αυτό βάζουμε και την exch, για να εναλλάξει το /y με την τιμή και έτσι μπαίνουν στη σωστή σειρά,

όνομα και τιμή. Τέλος η def τα παίρνει από τη στοίβα και ορίζει τη μεταβλητή y. Όμοια ορίζουμε και

τις υπόλοιπες μεταβλητές. Πρέπει να προσέχουμε τη σειρά με την οποία ορίζουμε τις μεταβλητές

ώστε να παίρνουν τις σωστές τιμές από τη στοίβα, πολύ απλά πρέπει να είναι με την αντίστροφη σειρά

από αυτή που βάζουμε τις τιμές στη γραμμή που καλούμε την υπορουτίνα.

5. ΕΛΕΓΧΟΣ ΡΟΗΣ

5.1 ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ

33

Page 34: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

Ας επανέρθουμε στο "ριγέ" κύκλο μας για να δούμε έναν ακόμα πιο έξυπνο τρόπο για να σχεδιάσουμε

τις οριζόντιες γραμμές. Θα ήταν πολύ πιο εύκολο να πούμε στην PS πόσες οριζόντιες γραμμές θέλουμε

να σχεδιάσουμε, αντί να γράψουμε κώδικα για κάθε μία από αυτές. Γνωρίζουμε, μάλλον, όλοι ότι αυτό

το πετυχαίνουμε με ένα βρόχο επανάληψης. Ας δούμε ένα βρόχο επανάληψης που σχεδιάζει δέκα

οριζόντιες γραμμές μέσα στον κύκλο μας.

%υπορουτίνα που σχεδιάζει γραμμές

/hline

{

moveto

rlineto

}def

%ορίζουμε τη μεταβλητή

/ypos 50 def

%σχεδιάζει τον κύκλο

newpath

100 100 50 0 360 arc

closepath

stroke

% ορίζει το clipping path

newpath

100 100 50 0 360 arc

closepath

clip

newpath

%σχεδιάζει 10 οριζόντιες γραμμές

10 {

%αυξάνει την τιμή της ypos κατά 10

/ypos ypos 10 add def

100 0 50 ypos hline

} repeat

closepath

stroke

showpage

Η δομή του προγράμματος είναι ίδια με αυτή των προγραμμάτων του προηγούμενου κεφαλαίου.

Σχεδιάζει τον κύκλο, ορίζει το clipping path και τέλος σχεδιάζει τις γραμμές. Αυτό που έχει αλλάξει

είναι ότι δεν έχουμε δέκα γραμμές που καλούν την hline αλλά, μία. Θα παρατηρήσατε τη δομή repeat.

Η repeat συντάσσεται ως εξής

34

Page 35: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

n {

...

εντολές

...

} repeat

όπου n είναι ένας ακέραιος αριθμός. Η δομή αυτή εκτελεί τις εντολές που περικλείονται στις αγκύλες n

φορές. Έτσι πολύ εύκολα παίρνουμε ένα καλύτερο από πριν αποτέλεσμα.

Αν τώρα έρθει πάλι αυτός που βαριέται να κάνει προσθέσεις και βαριέται να κάνει και διαίρεση, για να

βρει πόσες γραμμές χρειάζονται για να γεμίσει ο κύκλος, πρέπει να βάλει την PS να κάνει και αυτή τη

δουλειά. Τότε, θα γράψουμε το παρακάτω πρόγραμμα.

%υπορουτίνα που σχεδιάζει γραμμές

/hline

{

moveto

rlineto

}def

%σχεδιάζει τον κύκλο

newpath

100 100 50 0 360 arc

closepath

stroke

% ορίζει το clipping path

newpath

100 100 50 0 360 arc

closepath

clip

newpath

%σχεδιάζει 10 οριζόντιες γραμμές

50 10 150 {

35

Page 36: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

/ypos exch def

100 0 50 ypos hline

} for

closepath

stroke

showpage

Ο βρόχος που μας δίνει όλες τις τιμές από μια αρχική μέχρι μια τελική τιμή με κάποιο βήμα, είναι ο

βρόχος for. Η λειτουργία της for, είναι κοινή σε όλες τις γλώσσες προγραμματισμού. Η σύνταξη της

στην PS είναι

start_val step end_val {

...

εντολές

...

} for

όπου start_val είναι η αρχική τιμή, end_val είναι η τελική τιμή και step είναι το βήμα με το οποίο

μεταβάλλεται η start_val μέχρι να γίνει ίση ή να ξεπεράσει την end_val. Τους αριθμούς που "βγάζει" η

for τους βάζει στη στοίβα, δηλαδή αν δεν υπάρχει καμιά εντολή, μέσα στο βρόχο, που να παίρνει τους

αριθμούς αυτούς από τη στοίβα τότε μετά το τέλος του βρόχου, όλοι αυτοί οι αριθμοί θα είναι ακόμα

στη στοίβα και αν δεν τους χρειαζόμαστε θα πρέπει να τους "πετάξουμε". Αυτό είναι κάτι που πρέπει

να προσέχουμε όταν χρησιμοποιούμε for-βρόχους απλά για να επαναλαμβάνουμε κάποιες εντολές,

γιατί η for θα γεμίσει τη στοίβα άχρηστα δεδομένα και αν είναι πάρα πολλά υπάρχει ο κίνδυνος να

έχουμε ένα "stack overflow". Δηλαδή να γεμίσει η στοίβα, το μέγεθος της οποίας εξαρτάται από τη

μνήμη του εκτυπωτή, και να μην υπάρχει χώρος για τίποτα άλλο, οπότε σταματάει η εκτέλεση του

προγράμματος. Στο παράδειγμά μας τον αριθμού που βάζει, σε κάθε επανάληψη, η for στη στοίβα το

βάζουμε στη μεταβλητή y και τελικά το χρησιμοποιεί η moveto.

5.2 ΕΛΕΓΧΟΙ

Είναι καιρός να μάθουμε πώς κάνουμε ελέγχους στην PS. Η εντολή, σε όλες σχεδόν τις γλώσσες

προγραμματισμού, για ελέγχους είναι η if. Η σύνταξη της if στην PS είναι

36

Page 37: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

bool proc if

όπου bool είναι μια λογική (boolean) έκφραση, μια σύγκριση, και όπου proc είναι η διαδικασία, σειρά

εντολών, που θα εκτελεστεί αν η bool είναι αληθείς. Για παράδειγμα

4 3 gt {

100 100 moveto

100 100 rlineto

} if

Η γραμμή αυτή ελέγχει αν το 4 είναι μεγαλύτερο από το 3, που όντως είναι, εκτελεί τη διαδικασία, τις

εντολές μέσα στις αγκύλες. Η σύγκριση γίνεται, σ'αυτό το παράδειγμα, με τον τελεστή gt. Όπως σε

όλες τις πράξεις, αριθμητικές και λογικές, στην PS πρώτα βάζουμε, στη στοίβα, τους αριθμούς και

μετά τον τελεστή. Δηλαδή η γενική μορφή μιας έκφρασης σύγκρισης είναι

val1 val2 oper

όπου val1 είναι η τιμή που θα συγκριθεί με τη val2 και oper είναι ο τελεστής σύγκρισης. Οι τελεστές

σύγκρισης της PS είναι ίδιοι με αυτούς της FORTRAN. Ακολουθεί ένας πίνακας με τους τελεστές

σύγκρισης της PS.

eq ίσοne διάφορο (όχι ίσο)gt μεγαλύτερο απόlt μικρότερο απόge μεγαλύτερο ή ίσοle μικρότερο ή ίσο

Αφού μπορούμε να ορίσουμε τι θα εκτελεστεί αν η σύγκριση είναι αληθείς, λογικό είναι να μπορούμε

να ορίσουμε τι θα εκτελεστεί αν είναι ψευδείς. Αυτό μπορούμε να το κάνουμε με την ifelse. Η σύνταξη

της είναι παρόμοια με της if, δηλαδή

val1 val2 oper {true proc} {false proc} ifelse

όπου val1 είναι η τιμή που θα συγκριθεί με τη val2 και oper είναι ο τελεστής σύγκρισης. true proc είναι

η διαδικασία που θα εκτελεστεί αν η σύγκριση είναι αληθής και false proc είναι η διαδικασία που θα

εκτελεστεί αν η σύγκριση είναι ψευδής. Ένα απλό παράδειγμα είναι

3 4 gt

37

Page 38: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

% true proc

{ 100 100 moveto

100 100 rlineto}

% false proc

{ 100 100 moveto

-100 -100 rlineto} ifelse

αρχικά γίνεται η σύγκριση αν το 3 είναι μεγαλύτερο ή ίσο του 4. Αν αυτό είναι αληθές θα εκτελεστούν

οι εντολές

100 100 moveto

100 100 rlineto

ενώ στην αντίθετη περίπτωση θα εκτελεστούν οι γραμμές

100 100 moveto

-100 -100 rlineto

Στην προκειμένη περίπτωση, που το 3 δεν είναι μεγαλύτερο ή ίσο του 4, θα εκτελεστεί το δεύτερο

ζευγάρι εντολών. Μια χρήση της if στην PS θα δούμε στη συνέχεια.

5.3 ΕΝΑΣ ΑΚΟΜΑ ΒΡΟΧΟΣ ΕΠΑΝΑΛΗΨΗΣ

Τώρα θα δούμε τον τρίτο βρόχο επανάληψης που διαθέτει η PS. Ο βρόχος αυτός είναι ο loop, ο οποίος

είναι ένας βρόχος χωρίς συνθήκη, δηλαδή είναι ατέρμονος. Συντάσσεται πολύ απλά

{proc} loop

όπου proc είναι η διαδικασία που θα εκτελείται επ'άπειρων. Για παράδειγμα το παρακάτω πρόγραμμα

{ 100 } loop

θα βάζει τον αριθμό 100 στη στοίβα μέχρι που θα πάρουμε ένα "stack overflow" και θα σταματήσει

βίαια η εκτέλεση του. Αν κάποιοι αναρωτηθήκατε αν μπορούμε με κάποιο τρόπο να σταματήσουμε

τον ατέρμονο αυτό βρόχο, η απάντηση έρχεται με την εντολή exit. Η exit αναγκάζει τη loop να

σταματήσει και μεταφέρει την εκτέλεση του προγράμματος στην αμέσως επόμενη γραμμή από τη loop.

Δηλαδή το

{ 100 exit } loop

βάζει στη στοίβα το 100 και η exit μας βγάζει από το βρόχο.

38

Page 39: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

Αυτό το παράδειγμα δε μας πείθει για τη χρησιμότητα της loop, μιας και η διαδικασία εκτελείται μόνο

μία φορά. Αυτό που θα μας έπειθε είναι μια συνθήκη. Ας δούμε το πρόγραμμα του "ριγέ" κύκλου με

χρήση της loop.

%υπορουτίνα που σχεδιάζει γραμμές

/hline

{

moveto

rlineto

}def

%ορίζουμε τη μεταβλητή

/ypos 50 def

%σχεδιάζει τον κύκλο

newpath

100 100 50 0 360 arc

closepath

stroke

% ορίζει το clipping path

newpath

100 100 50 0 360 arc

closepath

clip

newpath

%σχεδιάζει 10 οριζόντιες γραμμές

{

%αυξάνει την τιμή της ypos κατά 10

/ypos ypos 10 add def

100 0 50 ypos hline

%ελέγχει αν η τιμή της ypos είναι ίση με 100

ypos 150 eq {exit} if

} loop

closepath

stroke

showpage

Εδώ χρησιμοποιούμε τη loop για το σχεδιασμό των οριζόντιων γραμμών. Το πρόγραμμα είναι μια

παραλλαγή αυτού που χρησιμοποιεί τη repeat. Έχουμε όμως προσθέσει έναν έλεγχο για την τιμή της

ypos. Η γραμμή

ypos 150 eq {exit} if

39

Page 40: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

ελέγχει αν η τιμή της ypos είναι ίση με 150, που είναι η πάνω "άκρη" του κύκλου. Αν η ypos είναι

μικρότερη από το 150 ο βρόχος συνεχίζεται, όταν όμως γίνει ίση με 150 τότε εκτελείται η exit και

εγκαταλείπεται η loop. Μετά την έξοδο από τη loop εκτελείται η closepath, δηλαδή η αμέσως επόμενη

εντολή απ'τη loop.

5.4 ΜΙΑ ΠΟΛΥΠΛΟΚΗ ΥΠΟΡΟΥΤΙΝΑ

Έστω θέλουμε μια υπορουτίνα που να σχεδιάζει ένα κύκλο σε κάποιο σημείο της σελίδας, ο οποίος

έχει περίγραμμα μαύρο, είναι γεμισμένος με χρώμα που θα περνάει σαν παράμετρος, και θα έχει

texture fill που και αυτό θα παιρνάει σαν παράμετρος. Η σύνταξη αυτής της υπορουτίνας θα είναι

x y ratio pW pH hexData red green blue paternCircleΌπου x,y οι συνταταγμένες του κέντρου του κύκλου, ratio η ακτίνα, pW και pH το πλάτος και το ύψος

του bitmap που θα χρησιποποιηθεί ως pattern για το texture fill, hexData τα δεδομένα που

περιγράφουν το pattern και τέλος red, green και blue οι συνηστώσες του χρώτος για το γέμισμα. Mια

τυπική της κλήση θα είναι κάπως έτσι

495 259 50 5 5 <8850205088> 1.0 1.0 1.0 patternCircle

Ο κώδικας της είναι ο παρακάτω

/patternCircle {

% αποθηκεύουμε τις παραμέτρους σε μεταβλητές

/cb exch def

/cg exch def

/cr exch def

/hdata exch def

/ph exch def

/pw exch def

/rat exch def

/y0 exch def

/x0 exch def

% υπολογίζουμε την πάνω αριστερά γωνία, το ύψος και το

% πλάτος του τετραγώνου που πρειγράφει τον κύκλο για

% να το χρησιμοποιήσουμε για το texture fill.

/top y0 rat sub def

/left x0 rat sub def

/w rat 2 mul def

/h rat 2 mul def

40

Page 41: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

% ορίζουμε το χρώμα του γεμίσματος

cr cg cb setrgbcolor

% ζωγραφίζουμε τον κυκλικό δίσκο

newpath

x0 y0 rat 0 360 arc

closepath fill

% ζωγραφίζουμε τον κύκλο του περιγράμματος

0 0 0 setrgbcolor

newpath

x0 y0 rat 0 360 arc

closepath stroke

% αποθηκέυουμε την κατάσταση γραφικών, ώστε

% μετά την εκτέλεση της υπορουτίνας να την

% επαναφέρουμε ως ήταν πρίν.

gsave

% ορίζουμε το clipping path για να μην βγάνει το

% texture έξω από τον κύκλο.

newpath

x0 y0 rat 0 360 arc

closepath clip

% κάνουμε ένα loop από την πάνω πλευρά του τετραγώνου

% που περιβάλει τον κύκλο μέχρι την κάτω

top ph top h add {

% κράταμε τη νεα y συντεταγμένη

/ty exch def

% κάνουμε ένα δεύτερο loop από την αριστερή μέχρι την

% δεξιά πλευρά του τετραγώνου

left pw left w add {

% κράταμε τη νεα y συντεταγμένη

/tx exch def

% αποθηκεύουμε την κατάσταση γραφικών, γιατί για να

% σχεδιάσει η imagemask κάνουμε translate. Έτσι μετά

% το σχεδιασμό κάνουμε grestore για να μην έχουμε

% να κρατάμε σχετικές συντεταγμένες για τις

% μετατοπίσεις

gsave

0 setgray

% μεταφέρουμε την αρχή των αξόνων στο σημείο που

41

Page 42: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

% πρέπει να σχεδιαστεί το επόμενο τμήμα του texture

tx ty ph add translate

% κάνουμε scale ώστε το pattern να έχει το μέγεθος

% που ζητήθηκε

pw ph scale

% ζωγραφίζουμε το pattern

pw ph true [pw 0 0 ph 0 0] {hdata} imagemask

% επαναφέρουμε την κατάσταση γραφικών

grestore

} for

} for

% επαναφέρουμε την κατάσταση γραφικών εκεί που ήταν

% πριν την εκτέλεση της υπορουτίνας.

grestore

} def

Η λογική της ρουτίνας είναι απλή. Σχεδιάζουμε πρώτα τον κύκλο και στη συνέχεια σχεδιάζουμε το ένα

δίπλα στο άλλο bitmaps ώστε να καλυφθεί η επιφάνεια του κύκλου.

Το αποτέλεσμα που παίρνουμε έιναι κάπως έτσι

Φυσικά σε ένα postscript εκτυπωτή το οπτικό αποτέλεσμα είναι καλύτερο.

Μέχρι εδώ έχουμε μάθει αρκετά ώστε να μπορούμε να σχεδιάζουμε αρκετά πολύπλοκα σχέδια το

τελευταίο που θα μάθουμε είναι πως προσθέτουμε κείμενο στα σχέδια μας.

6. ΚΕΙΜΕΝΟ ΚΑΙ ΓΡΑΜΜΑΤΟΣΕΙΡΕΣ

42

Page 43: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

6.1 ΓΡΑΜΜΑΤΟΣΕΙΡΕΣ

Ας δούμε μερικά πράγματα για τις γραμματοσειρές (fonts). Με τις γραμματοσειρές πιστεύω ότι όλοι

είμαστε εξοικειωμένοι, από τη χρήση κάποιου επεξεργαστή κειμένου. Έτσι δεν θα επεκταθούμε στο τι

είναι γραμματοσειρά, αλλά θα δούμε πως τις χειριζόμαστε στη PS. Όπως είναι φυσικό κάθε

γραμματοσειρά έχει ένα όνομα, τα ονόματα των γραμματοσειρών που διαθέτει ο κάθε εκτυπωτής

μπορούμε να το βρούμε στο εγχειρίδιο του, συνήθως το όνομα αποτελείτε από δύο συνθετικά. Το

πρώτο είναι το όνομα της οικογένειας, π.χ. Times, και το δεύτερο είναι το "στιλ", για παράδειγμα

Italic. Έτσι αν θέλουμε γραμματοσειρά Times και στιλ Italic, θα πούμε, Times-Italic. Το πρώτο

γράμμα του κάθε συνθετικού πρέπει να είναι γραμμένο με κεφαλαίο και να χωρίζονται μεταξύ τους με

μια παύλα (-). Κάτι άλλο που πρέπει να ορίσουμε για να χρησιμοποιήσουμε μια γραμματοσειρά, είναι

το ύψος των χαρακτήρων.

Το μέγεθος των χαρακτήρων το μετράμε σε σημεία, όπως και καθετί άλλο στην PS, για παράδειγμα το

ύψος της γραμματοσειράς σ'αυτό το κείμενο είναι 12 σημεία. Κάτι που πρέπει να πούμε εδώ είναι,

ποιο είναι το ύψος των χαρακτήρων που ορίζουμε. Το ύψος ορίζεται από την απαραίτητη κατακόρυφη

απόσταση μεταξύ των γραμμών. Δηλαδή μια γραμματοσειρά 12 σημείων, χρειάζεται 12 σημεία ώστε

να μην "μπλέκεται" με τις γειτονικές της.

Δεν θα επεκταθούμε σε τεχνικές λεπτομέρειες για τις γραμματοσειρές, κυρίως γιατί δεν είναι αναγκαία

γνώση για να χρησιμοποιήσουμε τις γραμματοσειρές στην PS.

Το ερώτημα που γεννάται είναι, πώς θα πούμε στην PS ποιά γραμματοσειρά θέλουμε να

χρησιμοποιήσουμε και με τί ύψος. Ας δούμε ένα παράδειγμα.

/Times-Roman findfont

20 scalefont

setfont

Παρατηρούμε ότι η πρώτη γραμμή έχει το "στιλ" ορισμού μεταβλητής. Αλλά αντί για την εντολή def

έχουμε την εντολή findfont. Η def τοποθετεί στον πίνακα των εντολών μια υπορουτίνα. Η findfont

κάνει το αντίστροφο, ψάχνει στον πίνακα των γραμματοσειρών για τη συγκεκριμένη γραμματοσειρά.

Όπως ξέρουμε, η PS έχει τον πίνακα των εντολών, έτσι έχει και έναν πίνακα με τις διαθέσιμες

43

Page 44: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

γραμματοσειρές. Αν δεν την βρει επιστρέφει ένα μήνυμα λάθους και σταματά η "εκτέλεση" του

προγράμματος. Στη συνέχεια ορίζουμε το ύψος της γραμματοσειράς με την scalefont. Η scalefont

παίρνει έναν αριθμό, εδώ το 20, από τη στοίβα και λέει στην PS ότι θέλουμε μέγεθος 20. Τέλος η

setfont είναι αυτή που θέτει σαν τρέχουσα γραμματοσειρά την Times-Roman με ύψος 20. Δηλαδή για

να ορίσουμε την τρέχουσα γραμματοσειρά πρέπει να ακολουθήσουμε την παραπάνω διαδικασία. Θα

πρέπει να τονίσουμε ότι σε αντίθεση με το χρώμα δεν υπάρχει από την αρχή τρέχουσα γραμματοσειρά,

αλλά πρέπει να την ορίσουμε εμείς. Τώρα που μπορούμε να ορίσουμε την τρέχουσα γραμματοσειρά ας

δούμε πως θα τοποθετήσουμε κείμενο στα σχέδια μας.

6.2 ΚΕΙΜΕΝΟ

Έστω ότι θέλουμε να τυπώσουμε σε μια σελίδα στο σημείο (100,100), τη λέξη "Hallo". Αρχικά πρέπει

να ορίσουμε την τρέχουσα γραμματοσειρά, έστω Times-Roman με ύψος 20. Στη συνέχεια να

τοποθετήσουμε το δείκτη στο σημείο που θέλουμε να τυπώσουμε, το (100,100). Στο σημείο αυτό

τοποθετείται η κάτω δεξιά "γωνία" της λέξης μας. Υπάρχει ένας ακόμα τύπος δεδομένων που μπορεί

να αποθηκευτεί στη στοίβα, ο τύπος του αλφαριθμητικού. Ένα αλφαριθμητικό το περικλείουμε σε

παρενθέσεις, δηλαδή το (Hallo) είναι ένα αλφαριθμητικό, και το χειριζόμαστε όπως κάθε άλλο

στοιχείο της στοίβας. Τέλος λέμε στην PS να τυπώσει τη λέξη. Ας δούμε το πρόγραμμα που κάνει αυτή

τη δουλειά.

/Times-Roman findfont

20 scalefont

setfont

100 100 moveto

(Hallo) show

showpage

Οι τρεις πρώτες γραμμές ορίζουν την τρέχουσα γραμματοσειρά, η τέταρτη τοποθετεί το δείκτη στο

σημείο (100,100). Η επόμενη τοποθετεί στη στοίβα το αλφαριθμητικό (Hallo) και η show το παίρνει

και "γράφει" τη λέξη. Η show στην πραγματικότητα δημιουργεί ένα path σχεδιάζει σ'αυτό τη λέξη με

τον τρόπο που ορίζει η γραμματοσειρά. Τέλος η showpage τυπώνει στο χαρτί τη λέξη Hallo, όπως

φαίνεται πιο κάτω.

Hallo

Οι μετασχηματισμοί στο σύστημα αναφοράς επιδρούν και στο κείμενο. Το παρακάτω πρόγραμμα

τυπώνει "περιστρεφόμενα" τη λέξη Postscript.

44

Page 45: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

% ορίζει την τρέχουσα γραμματοσειρά

/Times-Roman findfont

20 scalefont

setfont

% μεταφέρει το σύστημα στο (300,300)

300 300 translate

% ένα for που εκτελείται 18 φορές

1 1 18 {

% πετάει από τη στοίβα τους αριθμούς

% που τοποθετεί εκεί η for

pop

% περιστρέφει το σύστημα κατά 20 μοίρες

20 rotate

% τοποθετεί το δείκτη στο (0,0)

0 0 moveto

% γράφει τη λέξη Postscript

(Postscript) show

} for

% τυπώνει τη σελίδα

showpage

Το πρόγραμμα αυτό είναι αρκετά απλό, το μόνο που κάνουμε είναι να τυπώνουμε το αλφαριθμητικό

στο (0,0) ενώ περιστρέφουμε το σύστημα αναφοράς και παίρνουμε το παρακάτω εντυπωσιακό

αποτέλεσμα.

Για άλλη μια φορά προσέξτε ότι πετάμε από τη στοίβα ότι δε χρειαζόμαστε. Εδώ δε χρειαζόμαστε

τους αριθμούς που τοποθετεί στη στοίβα η for.

45

Page 46: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

Τώρα ας κάνουμε κάτι λιγότερο εντυπωσιακό αλλά πολύ χρήσιμο. Ας υποθέσουμε ότι θέλουμε να

τυπώσουμε μια λέξη στο κέντρο ενός κύκλου, για παράδειγμα να τυπώσουμε το όνομα ενός ατόμου

στο μόριο της εικόνας στο τέλος του προηγούμενου κεφαλαίου. Σ'αυτή την περίπτωση γνωρίζουμε τις

συντεταγμένες του κέντρου του κύκλου αλλά θέλουμε να τυπώσουμε τη λέξη κεντραρισμένη. Πρέπει

να υπολογίσουμε το σημείο που θα αρχίζει η λέξη ώστε το κέντρο του κύκλου να είναι στο μέσο της.

Αν x είναι η οριζόντια συντεταγμένη του κέντρου και l το μήκος της λέξης (σε σημεία) τότε η θέση

που ζητάμε έχει οριζόντια συντεταγμένη την x-l/2. Για να το κάνουμε αυτό χρειαζόμαστε το μήκος της

λέξης σε σημεία. Η εντολή stringwidth παίρνει από τη στοίβα ένα αλφαριθμητικό και επιστρέφει

σ'αυτή πόσο θα μετακινηθεί ο δείκτης κατακόρυφα και πόσο οριζόντια αν τυπωθεί αυτό το

αλφαριθμητικό. Το πόσο θα μετακινηθεί ο δείκτης οριζόντια είναι το μήκος του αλφαριθμητικού μας,

έτσι βρήκαμε αυτό που μας έλειπε.

% ορίζει την τρέχουσα γραμματοσειρά

/Times-Roman findfont

20 scalefont

setfont

%σχεδιάζει τον κύκλο

newpath

200 300 50 0 360 arc

closepath

stroke

% βάζει τη x-θέση στη στοίβα

200

% βάζει στη στοίβα την y και τη x

% μετατόπιση του δείκτη

(Atom) stringwidth

% πετάμε από τη στοίβα την y μετατόπιση

pop

% διαιρούμε τη x με το 2

2 div

% αφαιρούμε το αποτέλεσμα από τη

% x-θέση του κέντρου

sub

% βάζει τη x-θέση στη στοίβα

300

% τοποθετεί το δείκτη

moveto

% γράφει τη λέξη

(Atom) show

% τυπώνει τη σελίδα

46

Page 47: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

showpage

Προσέξετε ότι βάζουμε τη x-θέση στη στοίβα πριν βρούμε τη x-μετατόπιση ώστε όταν κάνουμε την

αφαίρεση να είναι στη σωστή σειρά στη στοίβα. Το αποτέλεσμα που παίρνουμε είναι το παρακάτω.

Εδώ τελείωσε η εισαγωγή στην PS. Αν και είδαμε ένα μέρος από τις δυνατότητες της PS, ελπίζω να

πειστήκατε πως η PS είναι μια πολύ ισχυρή και χρήσιμη γλώσσα γραφικών.

ΠΑΡΑΡΤΗΜΑ

47

Page 48: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

ΣΥΝΟΠΤΙΚΟΣ ΟΔΗΓΟΣ ΤΩΝ ΕΝΤΟΛΩΝ ΤΗΣ POSTSCRIPT

ΕΝΤΟΛΗ ΛΕΙΤΟΥΡΓΙΑa b add ⇒ a+b

επιστρέφει το άθροισμα δύο αριθμών.x y r θ1 θ2 arc

ορίζει ένα τόξο με κέντρο το (x,y), ακτίνα το r, από τη γωνία θ 1 μέχρι τη

γωνία θ2.

clipδηλώνει ότι το path που μόλις ορίσαμε, είναι clipping path.

closepathτελειώνει τον ορισμό ενός paht.

/name {proc} defορίζει μια υπορουτίνα.

a b div ⇒ a/bεπιστρέφει το πηλίκο δύο αριθμών.

dupτοποθετεί στη στοίβα ένα `αντίγραφο` του πρώτου της στοιχείου.

exchεναλλάσει τα δύο πρώτα στοιχεία της στοίβας.

exitεγκαταλείπει κάποιο βρόχο.

fill`γεμίζει` το τρέχον path.

/f findfontελέγχει αν υπάρχει η γραμματοσειρά με το όνομα f.

i s f {proc} forεκτελεί τη ρουτίνα proc συνεχώς, βάζοντας στη στοίβα αριθμούς

αυξανόμενους κατά s από το i μέχρι το f.grestore

επαναφέρει την κατάσταση γραφικών.gsave

αποθηκεύει την κατάσταση γραφικών.a b idiv ⇒ int(a/b)

επιστρέφει το ακέραιο πηλίκο της διαίρεσης δύο ακεραίων(bool) {proc} if

εαν η συνθήκη bool είναι αληθής εκτελείται η ρουτίνα proc.bool {proc1} {proc2}

ifelseεαν η συνθήκη bool είναι αληθής εκτελείται η ρουτίνα proc1,

διαφορετικά η ρουτίνα proc2.x y lineto

ορίζει μια γραμμή από το τρέχον σημείο μέχρι το σημείο (x,y).{proc} loop

επαναλαμβάνει την εκτέλεση της ρουτίνας proc επ΄άπειρον.a b mod ⇒ mod(a/b)

επιστρέφει το υπόλοιπο (module) της διαίρεσηςx y moveto

τοποθετεί το δείκτη στο σημείο (x,y).a b mul ⇒ ab

επιστρέφει το γινόμενο δύο αριθμώνa neg ⇒ -a

επιστρέφει τον αρνητικό ενός αριθμού.newpath

αρχίζει τον ορισμό ενός path.pop

48

Page 49: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

`πετάει` το πρώτο στοιχείο της στοίβας.n {proc} repeat

επαναλαμβάνει n φορές την εκτέλεση της ρουτίνας proc.dx dy rlineto

ορίζει μια γραμμή από το τρέχον σημείο, έστω (x,y) μέχρι το σημείο

(x+dx,y+dy).dx dy rmoveto

μετακινεί το δείκτη από σημείο που βρίσκεται κατά dx στον x-άξονα και

κατά dy στον y-άξονα.θ rotate

περιστρέφει το σύστημα αναφορά κατά θ.sx sy scale

αλλάζει την κλίμακα κατά sx στον x-άξονα και κατά sy στον y-άξονα.n scalefont

ορίζει το ύψος της γραμματοσειράςsetfont

θέτει την τρέχουσα γραμματοσειρά.gs setgray

θέτει τον τόνο του γκρί ίσο με gs (0-1)r g b setrgbcolor

θέτει το τρέχον χρώμα, όπου r,g,b οι RGB συνιστώσες (0-1)str show

τοποθετεί το αλφαριθμητικό str στην τρέχουσα θέση.showpage

τυπώνει την τρέχουσα σελίδα.stroke

`γράφει` το τρέχον path.a b sub ⇒ a-b

αφαιρεί δύο αριθμούς.x y translate

μεταφέρει το σύστημα αναφορά ατο σημείο (x,y).

49

Page 50: Εισαγωγή στην PostScript

ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT

ΒΙΒΛΙΟΓΡΑΦΙΑ

Postscript language Reference manual, Adode systems, Addison-Wesley

Postscript language Tutorial and Cookbook, Adobe systems, Addison-Wesley

Postscript language Program Design, Adode systems, Addison-Wesley

Understanding Postscript Programming, Holzgang, Sybex

50