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
questo viene rappresentato, nel modello CMY da
ed in quello CMYK da
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
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
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.
Copyright © 1985: Marco A. Calamari