Indice

COLORARE UNA BITMAP IN MIDRES

IL CONCETTO DI "PALETTE"

Il modo più diffuso di colorare una immagine è descrivere il colore per ogni pixel, e di solito lo si fa usando il formato RGB a 8 bit per componente. Questo significa usare un byte per descrivere il livello di luminanza in ciascuno dei canali RGB, per un totale di tre byte per pixel.

La “palette” è una tabella di corrispondenza, in cui ai colori selezionati dalla gamma dei possibili colori (così come descritti secondo la logica RGB) viene assegnato un indice, in base al quale è possibile fare riferimento a livello di pixel. Usare un indice richiede meno spazio, ed è una tecnica che mira a ridurre l'utilizzo della memoria, il carico di elaborazione, la larghezza di banda, nonché l'utilizzo della RAM o delle memorie di massa.

Nei retrocomputer è di solito presente una palette fissa, composta da un insieme limitato e preprogrammato di colori. Questo implica che la rappresentazione dei colori originali avviene “adattando” il colore, ovvero selezionandone uno vicino.

Nel Commodore 64, ad esempio, la palette è costituita da 16 colori mentre nel Commodore VIC 20 la palette è limitata a soli 8 colori.

MAPPARE I COLORI

Come abbiamo descritto nell'altro argomento, le bitmap “midres” sono composte da mixel in bianco e nero, dove il valore 1 indica il bianco e il valore 0 indica il nero. Siccome la “midres” usa la modalità testo, che prevede di poter definire un colore diverso scelto da una palette per ogni carattere, i mixel possono essere colorati a gruppi di 2×2.

In questa figura, ad esempio, assistiamo alla colorazione di 16 mixels. I mixel accesi nella riga 0 sono rossi. Così sono anche i mixel nella posizione (0,1) e (3,1). I mixel nella riga 2, invece, sono blu.

Da notare come i mixel restanti siano spenti e siano quindi di colore nero, ma siano rappresentati sul diagramma con un colore più tenue. Questo serve per sottolineare come, se venissero accesi, assumerebbero il colore relativo al carattere di appartenenza.

Questo implica che la colorazione delle immagini è imprecisa, e subisce un fenomeno chiamato “color clash”.

COLORARE UN MIXEL

Colorare un mixel è un processo meno preciso di quello del disegno, e questo a causa del fatto che il colore di un mixel dipende dal colore del carattere al quale il mixel appartiene.

Si comincia individuando le coordinate del carattere sullo schermo a cui afferisce il mixel che si vuole disegnare alle coordinate (x,y). Supponendo di operare con un carattere da 8×8 pixel e con una matrice da 2×2 mixel per carattere, il carattere si ottiene dividendo le coordinate per 2:

  mx = _x >> 1;
  my = _y >> 1;

A questo punto, per colorare il mixel è sufficiente sostituire il colore di quello specifico carattere.

  _screen[my * WIDTH + mx] = _color + BRIGHTNESS;

EXAMPLE

Si prenda, ad esempio, la seguente immagine PNG (800×500 pixel, 24 bpp):

Si può utilizzare il programma img2midres per convertire tale immagine in due file (-o, -O) direttamente caricabili in memoria (-u) con una bitmap indicizzata midres per il Commodore 64 (-64):

  img2midres64.exe -64 -u -i image06.png -o image6406c.pic -O image6406c.col

Una volta inseriti i due file in un disco, sarà possibile scrivere un breve programma BASIC:

  10 if p=0 then 50
  20 if c=0 then 60
  30 poke 53281,0
  40 goto 40
  50 p=1:load "image6406c.pic",8,1
  60 c=1:load "image6406c.col",8,1
  

Questo è il risultato che si ottiene:

Se invece si possiede un Commodore VIC 20, si può utilizzare il programma img2midres per convertire tale immagine in due file (-o, -O) direttamente caricabili in memoria (-u) con una bitmap midres indicizzata per il Commodore VIC 20 (-20):

  img2midres64.exe -20 -u -i image06.png -o image2006c.pic -O image2006c.col

Una volta inseriti i due file in un disco, sarà possibile scrivere un breve programma BASIC:

  5 if i=0 then 45
  10 if p=0 then 50
  20 if c=0 then 60
  30 poke 36879,8
  40 goto 40
  45 for i=0 to 23*22:print " ";:next i
  50 p=1:load "image2006c.pic",8,1
  60 c=1:load "image2006c.col",8,1

Questo è il risultato che si ottiene:

COLOR CLASH

Il “color clash” è, in generale, un fenomeno causato dai limiti nei circuiti grafici di alcuni retrocomputer, dove vi è la limitazione di due colori per ogni carattere che compone l'insieme di mixel considerato. Tale limite nasce dal particolare layout della memoria dei processori video che supportano la modalità testo, progettata in modo tale da ridurre al minimo l'uso della memoria del frame buffer e ottimizzare, così, la visualizzazione del testo anziché della grafica. Per risparmiare memoria, la bitmap e la mappa colore sono memorizzate in aree separate della memoria. Mentre la bitmap specifica lo stato dei singoli mixel (attivato o disattivato), le informazioni sul colore (o “attributi”) corrispondono sempre e soltanto alla matrice dei caratteri del testo. Questo byte codifica, in modi diversi da piattaforma a piattaforma, l'indice nella palette da utilizzare. Pertanto, ogni blocco può contenere solo 2 colori tra quelli disponibili. Il tentativo di aggiungere un terzo colore nella medesima area sovrascrivere il colore precedente.

Ad esempio, se si ha una immagine con quattro pixel aventi tre colori diversi, i mixels correlati avranno solo uno dei tre colori. Ne consegue che una grafica a colori finemente dettagliata è impossibile, poiché il colore può essere applicato solo ai caratteri che compongono i mixel. Per evitare questo tipo di conflitto, le visualizzazioni grafiche statiche vanno costruite con cura.