Una Chiave per il Desktop Publishing

Corso di PostScript - Marco A. Calamari

Dodicesima Puntata


In questa puntata ci occuperemo degli operatori che estendono le funzionalità del PostScript includendovi la gestione del colore; approfitteremo inoltre di quest'ultimo incontro per tirare le somme dell'anno trascorso e per esaminare come è cambiato il panorama dei linguaggi di descrizione della pagina dai tempi della prima puntata.


Durante l'anno che abbiamo trascorso insieme, molte cose sono cambiate sotto il sole della computer graphic; un periodo del genere, rapportato alla durata della vita umana, corrisponde a circa sette anni, durante il quale molte cose possono succedere. È stato così anche per il PostScript; in un solo anno il monopolio della Adobe System sul PostScript (inteso come linguaggio) è cessato.

La storia, che come sempre vista col senno di poi pare quasi banale, è la seguente. Una società si trova, di solito per merito di uno o pochi individui particolarmente dotati, ad avere un prodotto innovativo che le assicura un forte vantaggio competitivo sulla concorrenza. La società si ingrandisce senza diversificare la propria produzione, e trae grossi profitti, vendendo a caro prezzo il suo unico prodotto, e massimizzando il profitto piuttosto che le vendite. La spinta economica fa sì che la concorrenza, nell'impossibilità di utilizzare il prodotto troppo caro, trovi conveniente svilupparne un sostituto, che può essere altrettanto o più valido dell'originale. Il monopolio quindi cessa di esistere, così come gli alti profitti, ed il panorama diventa quello di più prodotti in competizione tra loro. In questa situazione a rimetterci non sono solo le imprese, ma anche e soprattutto gli utenti finali, che si trovano a pagare prezzi superiori per il prodotto, ed a dover vivere in assenza di standard, ma anzi in mezzo a standard diversi in competizione.

Il fenomeno dei cloni PostScript

Non si è trattato di una pura questione tecnica, ma è un mito che è cessato. L'Adobe aveva quasi convinto molti di noi che il proprio interprete PostScript era, oltre ad un ottimo pezzo di software, qualcosa di inimitabile, come un antico vaso Ming od un quadro impressionista. Il fatto che, in meno di due anni, parecchie ditte abbiano prodotto proprie versioni di interpreti PostScript, funzionanti ed altrettanto veloci, ha dimostrato che questo non era vero; l'ultimo chiodo sulla bara del PostScript inimitabile è stato messo dalla comparsa di interpreti PostScript, diffusi a livello sorgente, fra il software di public domain.

Dal punto di vista commerciale, lo scacco più grave è stato l'accordo Apple-Microsoft per l'utilizzo incrociato dei nuovi font outlined Apple e del nuovo linguaggio di descrizione della pagina Microsoft, che ha visto l'Adobe relegata al ruolo di spettatore. La reazione dell'Adobe, che ha introdotto l'Adobe Type Manager ad un prezzo sorprendentemente basso ed ha reso pubbliche una parte delle specifiche tecniche dei propri font outlined è stato un primo (piccolo) passo nella giusta direzione; speriamo, per la salute del PostScript (tuttora ottima) e degli utenti che vi hanno investito che sia presto seguito da molti altri, e tutti nella stessa direzione.

Il PostScript a colori

Fino dalla prima versione commerciale dell'interprete PostScript, e cioè la 23.0 presente nel primo modello della LaserWriter Apple, esistevano alcuni operatori per la gestione della stampa a colori. Una domanda che sorge spontanea è a cosa servano degli operatori per la gestione del colore su una periferica in bianco e nero come è la LaserWriter (e la maggior parte delle altre stampanti laser PostScript); la risposta si può sintetizzare in due parole, device independence Infatti uno degli scopi principali di un linguaggio di descrizione della pagina è quello di garantire la portabilità più indolore possibile dei programmi fra diverse periferiche. Quando inviamo un'immagine molto dettagliata su una stampante a bassa risoluzione, si perdono particolari fini o mezzi toni, che saranno però presenti nella stampa su una periferica a più alta risoluzione (come una unità di fotocomposizione Linotronic); questo permette tra l'altro di provare un programma su una periferica (relativamente) economica e veloce, e di eseguire poi la stampa finale sulla periferica più costosa, con la garanzia che, in ambedue i casi, le possibilità della due stampanti saranno sfruttate al meglio. La presenza del colore in un programma PostScript è quindi considerata una caratteristica come un'altra dell'immagine; il colore verrà riprodotto se ciò è nelle possibilità della periferica, altrimenti sarà approssimato con toni di grigio. Per poter fare questo anche nelle periferiche monocromatiche devono perciò essere presenti alcuni operatori di gestione del colore; semplicemente il risultato finale che si otterrà con essi dipenderà dalla particolare periferica utilizzata.

I modelli cromatici

Benché il numero di operatori che viene utilizzato per realizzare una immagine a colori sia basso, il loro comportamento dettagliato è piuttosto complesso, e richiede anche la comprensione dei modelli cromatici e di aspetti piuttosto specialistici dei processi di stampa; per questo motivo, durante questa esposizione, ne forniremo alcuni cenni, che non hanno ovviamente la pretesa di esaurire l'argomento. Inoltre, alcuni aspetti della resa cromatica e del meccanismo esatto di creazione delle sfumature dipendono dalla particolare periferica utilizzata (stampante, unità di fotocomposizione, slide-maker, ecc.), ed in alcuni casi addirittura dalla versione dell'interprete PostScript utilizzata; per questo motivo non forniremo i dettagli di funzionamento per la maggior parte degli operatori, rimandando coloro che desiderassero approfondire l'argomento alla consultazione dell'addendum PostScript della particolare periferica che utilizzeranno.

Come avviene per il bianco e nero, le entità grafiche tracciate sulla pagina hanno il colore determinato da un parametro, il current color (colore corrente), che appartiene allo stato grafico dell'interprete PostScript; si tratta del colore che, analogamente al currentgray per il grigio, viene applicato a tutte le entità grafiche tracciate sulla pagina mediante stroke e fill. Il linguaggio PostScript permette l'utilizzo di qualunque colore; il bianco, il nero ed i vari toni di grigio sono solo casi particolari di colori.

I colori possono essere specificati mediante l'utilizzo di uno dei due modelli disponibili, il modello RGB e quello HSB.

Il modello RGB (Red, Green, Blue - rosso, verde, blu), definisce qualunque colore mediante la somma dei tre colori primari della luce (appunto rosso, verde e blu) in opportune proporzioni. Nel linguaggio PostScript, l'intensità di ciascuno dei tre colori primari è specificata da un numero compreso fra 0 ed 1, dove 0 indica l'assenza e 1 la massima intensità possibile del colore. Se i tre colori primari hanno la stessa intensità, il risultato è un tono di grigio; se le intensità non sono uguali, il risultato è un certo colore, avente una particolare intensità. Se il colore viene poi stampato su una periferica in bianco e nero, esso viene approssimato con un currentgray pari alla media dei tre colori principali, definiti nel modello RGB.

Il modello HSB (Hue, Saturation, Brightness - crominanza, saturazione, luminosità) definisce un colore per mezzo di questi tre parametri, che possono assumere valori compresi fra 0 ed 1.

Esiste una convenzione per distribuire i colori attorno ad una circonferenza dei colori (vedi Figura 1). Il parametro crominanza esprime la posizione del colore su questa circonferenza; 0.00, che corrisponde ad un angolo di zero gradi sulla circonferenza, fornisce il rosso primario, 0.33, che corrisponde ad un angolo di 120 gradi, fornisce il verde primario, ed infine 0.66, che corrisponde a 240 gradi, fornisce il blu primario. Valori intermedi forniscono ovviamente tutti gli altri colori possibili. Il parametro saturazione esprime la concentrazione del particolare valore di crominanza rispetto alla luce bianca; 0 corrisponde alla presenza di sola luce bianca, 1 a quella di colore puro, e un valore intermedio alla miscelazione di una frazione di colore con una di luce bianca. Il parametro luminosità, variabile tra 0 ed 1, fornisce la luminosità del colore primario; 0 è oscurità ed 1 è la massima intensità possibile. Nel cerchio dei colori rappresentato in figura, la crominanza varia muovendosi lungo una circonferenza, la saturazione lungo un raggio, e la luminosità, che è costante su tutto il cerchio, può essere cambiata agendo sulla barra di scorrimento situata sulla destra nella finestra; si noti che i parametri del colore selezionato, indicato dal puntino nel cerchio dei colori, non sono numeri reali compresi tra 0 ed 1 ma, per una diversa convenzione del Macintosh, da numeri interi fra 0 e 65535 (2^16-1, cioè un unsigned integer). Se il colore viene stampato su una periferica in bianco e nero, viene reso con un currentgray pari alla luminosità definita nel modello HSB.

È importante notare che l'utilizzo dei due modelli porta alla definizione dello stesso currentcolor; ad esempio un verde puro alla massima luminosità possibile è definito nel modello RGB dalla terna (0.00, 1.00, 0.00), ed in quello HSB da (0.33, 1.00, 1.00). L'operazione di convertire ogni possibile colore da un modello all'altro non è semplice, a causa del modo con cui l'occhio umano percepisce le combinazioni dei colori, e non è questa la sede adatta per un approfondimento; essa viene comunque stabilita per mezzo della convenzione dello standard televisivo NTSC.

Gli operatori che permettono di definire i modelli cromatici sono:

I colori di processo

I modelli cromatici RGB e HSB definiscono i singoli colori mediante la sintesi additiva; quando un'immagine a colori è stata definita, essa viene normalmente stampata con inchiostri su carta, lavorando quindi in sintesi sottrattiva. Il modello cromatico utilizzato in questo caso è il CMYK (Cyan, Magenta, Yellow, blacK - ciano, magenta, giallo, nero). Ciascuno dei primi tre colori assorbe nell'ordine uno dei colori primari del modello RGB; il nero ovviamente li assorbe tutti e tre. Nella luce riflessa dal colore ciano manca quindi completamente la luce rossa, e così analogamente per le coppie di colori primari magenta-verde e giallo-blu.

Il nero non è strettamente necessario per la rappresentazione dei colori nel modello CMYK; infatti possono essere usati solo i primi tre colori, ed il modello cromatico viene allora denominato CMY. Il nero e tutti i toni di grigio sono generati sommando uguali quantità dei tre colori primari; l'aspetto di questi neri, con le attuali tecnologie degli inchiostri, non è però soddisfacente, per cui si utilizza l'inchiostro nero come quarto colore primario. Nel modello CMYK i quattro colori principali vengono rappresentati da numeri compresi fra 0 e 1, dove 0 rappresenta la completa assenza dell'inchiostro corrispondente, ed 1 la completa ricopertura del supporto con l'inchiostro.

Prendiamo ad esempio un colore che, nel modello RGB, sia formato da

0.2 rosso
0.6 verde
0.4 blu

questo viene rappresentato, nel modello CMY da

1.0 - 02 = 0.8 ciano
1.0 - 06 = 0.4 magenta
1.0 - 04 = 0.6 giallo

ed in quello CMYK da

minimo(0.8, 0.4, 0.6) = 0.4 nero
0.8- 0.4 = 0.4 ciano
0.4 - 0.4 = 0.0 magenta
0.6 - 0.4 = 0.2 giallo

L'azione di sostituire ad una uguale quantità dei tre colori ciano, magenta e giallo, la stessa quantità di nero è chiamata generazione del nero (black generation). Nella maggior parte dei casi non tutta la quantità di nero sostituibile viene in realtà generata; per vari motivi, fra cui il più importante è la difficoltà della messa a registro delle pellicole, si preferisce non operare completamente la sostituzione col nero, ma limitarla ad una frazione. In questo caso lo stesso colore dell'esempio potrebbe essere rappresentato da

minimo(0.8, 0.4, 0.6) * 0.75 = 0.3 nero
0.8- 0.3 = 0.5 ciano
0.4 - 0.3 = 0.1 magenta
0.6 - 0.3 = 0.3 giallo

Un'altra azione che può essere necessaria durante la stampa in sottrattivo è quella di alterare la quantità dei colori ciano, magenta e giallo nelle zone in cui è presente il nero pieno; questo processo è chiamato rimozione del colore sottostante (undercolor removal)

Gli operatori per la gestione del colore

Gli operatori per la gestione del colore sono

Se si utilizza l'operatore setgray, esso fissa il tono di grigio corrente al valore del suo argomento, ma resetta anche il colore corrente a

ciano = 0
magenta = 0
giallo = 0
nero = (1 - currentgray)

infatti il nero pieno è rappresentato da un currentgray uguale a zero, ma, al contrario, da una componente nera del modello CMYK uguale ad 1.

L'operatore colorimage stampa i pixel, risultanti dal processo di conversione della stringa esadecimale, in un quadrato unitario, iniziando dall'angolo in basso a sinistra, che si trova nell'origine. In questo modo, l'immagine riprodotta sarà compressa in un quadrato di un punto di lato (1/72 di pollice). Prima di utilizzare colorimage, sarà quindi necessario traslare l'origine opportunamente con l'operatore translate, e scalare gli assi con scale; il precedente sistema di coordinate dovrà poi ovviamente essere ripristinato.

La/e procedura di acquisizione dati deve lasciare sullo stack un oggetto di tipo stringa che abbia la dimensione sufficiente per contenere la riga più lunga fra quelle dei dati che descrivono la bitmap; l'operatore colorimage preleverà questa stringa dallo stack e la interpreterà per ottenere i pixel. Se la stringa non descrive l'immagine completa, colorimage chiamerà nuovamente la/e procedura per ottenere nuovi dati, e ripeterà la chiamata fino a quando la bitmap non sarà stata completata. Un eventuale residuo della stringa al termine di ogni linea della bitmap o della bitmap stessa verrà semplicemente ignorato. La procedura è libera di usare qualunque mezzo per ottenere la stringa; può infatti semplicemente contenerla, ottenerla leggendo un file esterno, od addirittura leggendo i dati nel file stesso del programma in esecuzione.

I dati che descrivono la bitmap possono essere suddivisi in varie maniere, e la trattazione completa di tutti i casi porterebbe via inutilmente parecchio spazio. In linea di massima, nel caso monoprocedura, i bit che descrivono i colori di ciascun pixel, considerati in ordine di scansione, sono disposti consecutivamente e poi suddivisi in byte, ciascuno dei quali contiene 8 bit, ed infine riuniti a formare una riga. Nel caso multiprocedura, i bit di un singolo colore appartenenti ad un certo numero di pixel sono impaccati in una stringa (con la tecnica precedentemente descritta); si ottengono così tre o quattro righe consecutive (a seconda del numero di colori di processo), ciascuna delle quali contiene i dati di un colore primario per lo stesso gruppo di pixel.

Il nostro ultimo esempio

Il Programma 1, riportato nel Listato 1, contiene un esempio di utilizzo dell'operatore colorimage. Prima di passare a descrivere questo esempio, è necessario precisare che, mentre gli operatori setrgbcolor e sethsbcolor sono presenti in tutte le versioni dell'interprete PostScript a partire dalla 23.0, molti operatori per la gestione del colore non sono implementati se non nelle versioni più recenti, e solo su stampanti a colori. Si tratta di solito degli operatori che agiscono al livello del device, come setcolorscreen, setcolortransfer e, per l'appunto, colorimage. Prima di provare questo esempio sarà quindi consigliabile, per coloro che non utilizzeranno stampanti a colori, battere il comando colorimage in modalità executive; se l'errore che si otterrà sarà undefined, questo indicherà che l'operatore colorimage non è presente nella versione utilizzata, e che quindi l'esempio non potrà funzionare; altri tipi di errore, come stackunderflow, indicheranno invece che l'operatore è presente. Le versioni da noi provate in cui colorimage non è presente sono 23.0, 38.0, 46.2, 51.7, mentre è presente nella 51.9. La mancanza di questi operatori non diminuisce molto la portabilità, visto che la maggior parte dei programmi utente si limita ad utilizzare setrgbcolor e sethsbcolor, che sono sempre presenti.

Tornando al nostro esempio, l'immagine che verrà stampata è la stessa del Programma 1 dell'ottava puntata, con la differenza che le singole righe di pixel sono tracciate a rotazione in uno dei tre colori primari RGB. Ciascuna riga viene stampata in uno dei tre colori primari e completata da altre due (quelle con tutti i byte uguali ad FF), contenenti i due colori mancanti al 100% di saturazione; nel caso della prima riga, completamente nera nell'originale, questo porta ad ottenere 0% di rosso + 100% di verde + 100% di blu, e cioè il 100% di ciano. Il funzionamento e la suddivisione in procedure sono analoghi.

Si noti che in questo caso si è scelto di descrivere la bitmap col modello a tre colori RGB, si sono inseriti i dati nel currentfile, e si è usato il modo di funzionamento multiprocedura. I dati per i tre colori di ciascuna riga della bitmap (20 pixel) sono contenuti in gruppi di tre righe consecutive di 40 caratteri esadecimali, che codificano 20 byte. Il risultato finale è mostrato in Figura 2 stampato da una periferica PostScript a colori.

The end

Come esercizio per le vacanze, vi proponiamo di scrivere un programma che stampi, usando gli operatori rand e setrgbcolor, un numero casuale di cerchi pieni, con centro, colore e raggio pure casuali; il programma dovrà stampare correttamente i colori su una periferica PostScript a colori, ma potrà essere eseguito anche su una in bianconero, sulla quale, per quanto precedentemente esposto, i cerchi verranno resi con toni di grigio.

Detto questo, non resta che salutarci, augurando ai nostri venticinque lettori, che hanno avuto la pazienza di seguirci fino a qui, che il lavoro svolto insieme possa essere da tutti noi utilizzato con profitto, sia come strumento di lavoro che (perché no?) come passatempo.


%!PS-Adobe-2.0
%%Title: Programma di stampa di una bitmap a colori
%%Creator: Corso PostScript - parte XII - programma 1
%%For: Corso PostScript BIT
%%CreationDate: (4-8-1990) (15:56)
%%BoundingBox: 28 30 566 811
%%EndComments
%%EndProlog
%
% Procedura inch
% Argomenti: XInches / XPoints
% Converte misure da pollici
% a punti tipografici.
/inch { 72 mul } def
%
% Procedura tracciaCornicePiccola
% Argomenti: - / -
% Traccia una cornice su pagina
% letter.
/tracciaCornicePiccola {
gsave newpath
0.5 inch 1.5 inch moveto
7.3 inch 0 inch rlineto
0 inch 9.0 inch rlineto
-7.3 inch 0 inch rlineto
closepath
.05 inch setlinewidth
0 setgray stroke
grestore
} def
%
% Procedura stampaBitmapAColori
% Argomenti: - / -
% Variabili Globali:
% LarghezzaBitmap
% AltezzaBitmap
% NumeroBitBitmap
% StringaBitmap
% Procedura per la lettura e stampa di una bitmap
% a colori col modello cromatico RGB.
% La procedura utilizza l'operatore colorimage, che può
% non essere presente in particolari versioni
% dell'interprete PostScript.
% Le tre procedure di acquisizione dati leggono
% alternativamente i dati di uno dei colori primari di
% una fila di pixel dal currentfile e li immagazzinano
% in stringhe separate.
% Il parametro true seleziona il modo multiprocedura.
% Il parametro 3 seleziona tre colori di processo, cioè
% il modello cromatico RGB.
/stampaBitmapAColori {
gsave
LarghezzaBitmap
AltezzaBitmap
NumeroBitBitmap
[LarghezzaBitmap 0 0 AltezzaBitmap neg 0 AltezzaBitmap]
{currentfile StringaDelRosso readhexstring pop}
{currentfile StringaDelVerde readhexstring pop}
{currentfile StringaDelGiallo readhexstring pop}
true
3
colorimage
grestore
}def
%
%
% Programma principale
%
% Incapsulamento e tracciatura della cornice
gsave
tracciaCornicePiccola
%
% Inizializzazione dei parametri della bitmap
% (si noti che il pixel può non essere quadrato)
/LarghezzaBitmap 20 def
/AltezzaBitmap 15 def
/NumeroBitBitmap 8 def
/LarghezzaPixel 0.3 inch def
/AltezzaPixel 0.3 inch def
/StringaBitmap LarghezzaBitmap NumeroBitBitmap mul
8 div ceiling cvi string def
%
% Inizializzazione stringhe per i tre colori RGB
/StringaDelRosso 20 string def
/StringaDelVerde 20 string def
/StringaDelGiallo 20 string def
%
% Traslazione e scalatura assi per stampa
1.2 inch 3.5 inch translate
LarghezzaPixel LarghezzaBitmap mul
AltezzaPixel AltezzaBitmap mul
scale
%
% Esecuzione procedura; le righe seguenti alla chiamata
% della procedura stampaBitmapAColori vengono lette
% dale tre procedure di acquisizione dati per mezzo
% dell'operatore readhexstring fino al completamento
% dei dati necessari alla definizione della bitmap.
stampaBitmapAColori
0000000000000000000000000000000000000000
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
00FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF00
00FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF00
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
000000000000FFFFFFFFFF000000000000FFFF00
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
00FFFFFFFF0000FFFFFFFF00FFFFFFFFFFFFFF00
00DDDDDDDDDD0000FFFFFF00FFFFFFFFFFFFFF00
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
00BBBBBBBBBBBB0000FFFFFFFFFFFFFFFFFFFF00
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
00999999999999990000FFFFFFFFFFFFFFFFFF00
0077777777777777770000FFFFFFFFFFFFFFFF00
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
005555555555555555550000FFFFFFFFFFFFFF00
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
00333333333333333333330000FFFFFFFFFFFF00
0011111111111111111111110000FFFFFFFFFF00
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
000000000000000000000000000000FFFFFFFF00
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
0000000000000000000000000000000000000000
%
% Rimozione incapsulamento e stampa
grestore
showpage
%
%%Trailer
%%EOF

Copyright © 1985: Marco A. Calamari