Suivez-nous sur X

|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Dossier : Le tramage ordonné en impression sur AmigaOS 68k
(Article écrit par Gilles Pelletier - août 2011, mis à jour en décembre 2018)
|
|
Séquence impression
Les impressions consistent à déposer des encres sur du papier.
Les technologies employées sont diverses, allant des impacts d'aiguilles sur un ruban encreur (imprimante matricielle),
une fixation de poudre fine par chauffage (laser, sublimation), ou un jet d'encre (bubble jet).
Les images sont formées à partir de points, semblables aux pixels des écrans, mais dans des résolutions
beaucoup plus élevées : 300 PPI (points per inches) => 2400 points par ligne.
Du pixel au point
Tout pixel d'une image est défini par un ensemble de trois couleurs rouge, vert et bleu, facilement
transformable en cyan, magenta et jaune, voire directement en noir, en faisant la moyenne simple
ou la moyenne pondérée des trois composantes. Prenons le cas d'une seule nuance, pour ne pas dire
couleur, on va prendre le noir. Le blanc, en principe la couleur du papier, sera représenté par un
vide (absence de couleur) et le noir par "*". On peut décider qu'à partir d'un certain seuil,
l'équivalent du pixel devient un point noir (en anglais, c'est le mot "threshold") mais l'image
obtenue ne sera pas très précise.
Si votre tramage se rapporte à votre ramage...
Pour simuler les nuances, il faudra utiliser une trame de dispersion (en anglais "dither"). Imaginons une matrice 2x2 :
L'algorithme de remplissage employé commence par le point en haut à gauche, diagonale droite et basse,
haut, diagonale gauche et basse (on peut en utiliser d'autres...). On pourra simuler cinq nuances, du vide
au plein, c'est mieux que le seuil, mais c'est insuffisant.
Imaginons maintenant une matrice 4x4.
On pourra simuler 16 nuances, exactement ce que l'Amiga est capable de fournir dans sa version de base.
D'où la matrice de seuils suivante :
0 | 8 | 2 | 10 |
12 | 4 | 14 | 6 |
3 | 11 | 1 | 9 |
15 | 7 | 13 | 5 |
Ces valeurs sont obtenues en numérotant de 0 à 15 en répartissant régulièrement les points. Donc si
on veut imprimer la valeur 15, en comparant avec les points de la matrice précédente, on met tous les
points en noir (ou dans une couleur choisie).
Pour 10 on aura :
Pour 5 on aura :
Et ainsi de suite...
Le printer.device d'AmigaOS utilise la table suivante (avec un petit bogue vous devinez où, certainement là pour faire parler
les bavards) :
/* 4x4 internal matrix */
prtinfo->pi_dmatrix[ 0] = 0 ;
prtinfo->pi_dmatrix[ 1] = 8 ;
prtinfo->pi_dmatrix[ 2] = 2 ;
prtinfo->pi_dmatrix[ 3] = 10 ;
prtinfo->pi_dmatrix[ 4] = 12 ;
prtinfo->pi_dmatrix[ 5] = 4 ;
prtinfo->pi_dmatrix[ 6] = 14 ;
prtinfo->pi_dmatrix[ 7] = 6 ;
prtinfo->pi_dmatrix[ 8] = 3 ;
prtinfo->pi_dmatrix[ 9] = 11 ;
prtinfo->pi_dmatrix[10] = 1 ;
prtinfo->pi_dmatrix[11] = 9 ;
prtinfo->pi_dmatrix[12] = 14 ; /* bogue 15 ! */
prtinfo->pi_dmatrix[13] = 7 ;
prtinfo->pi_dmatrix[14] = 13 ;
prtinfo->pi_dmatrix[15] = 5 ;
Le printer.device utilise une trame 4x4, qui permet de représenter 16 nuances d'une couleur. Comme une imprimante couleur utilise
trois couleurs (cyan, magenta et jaune), on obtient 16x16x16 = 4096 couleurs, exactement ce que l'Amiga est capable de fournir.
Malheureusement, la théorie n'a rien à voir avec la pratique, car les couleurs de l'écran ne sont pas toutes imprimables.
De plus, pour du vrai noir, il faut une couleur noire, car si on mélange CMJ, on obtient du marron peu ragoûtant.
Plus de couleurs !
Pour représenter plus de couleurs, on va envisager une trame 8x8 pour représenter 256 nuances (et ainsi 256x256x256 =
16 millions de couleurs), réparties par le même algorithme de remplissage utilisé par la 4x4.
82 | 168 | 125 | 153 | 94 | 164 | 113 | 149 |
196 | 7 | 227 | 54 | 200 | 11 | 231 | 58 |
102 | 129 | 70 | 184 | 105 | 141 | 74 | 180 |
243 | 39 | 211 | 23 | 247 | 43 | 215 | 27 |
90 | 160 | 117 | 145 | 86 | 172 | 121 | 156 |
204 | 15 | 235 | 62 | 192 | 3 | 223 | 51 |
109 | 137 | 78 | 176 | 98 | 133 | 66 | 188 |
251 | 47 | 219 | 31 | 239 | 35 | 207 | 19 |
D'où le code suivant :
static UBYTE dither_matrix8x8[64] =
{ 82, 168, 125, 153, 94, 164, 113, 149,
196, 7, 227, 54, 200, 11, 231, 58,
102, 129, 70, 184, 105, 141, 74, 180,
243, 39, 211, 23, 247, 43, 215, 27,
90, 160, 117, 145, 86, 172, 121, 156,
204, 15, 235, 62, 192, 3, 223, 51,
109, 137, 78, 176, 98, 133, 66, 188,
251, 47, 219, 31, 239, 35, 207, 19
} ;
UBYTE dither8( UBYTE v, UWORD x, UWORD y, UBYTE pen1, UBYTE pen2 )
{
if (v < dither_matrix8x8[x & 0x07][y & 0x07])
{
return pen1 ;
}
return pen2 ;
} /* dither8 */
|
- "v" est l'intensité de la couleur.
- "x" et "y" sont les coordonnées du point (point physique sur le papier).
- "pen1" est la couleur si l'intensité est trop faible, "pen2" autrement.
Et le printer.device dans tout ça ?
Soit on utilise des remplacements comme TurboPrint, soit on ruse. Il est possible de supprimer la trame 4x4, en passant les
2400 points par ligne directement dans le pilote de l'imprimante, tout en utilisant le printer.device.
Pour s'en convaincre, regarder le code de DirectDump, du paquet anaiis_print.lha
sur Aminet. DirectDump détourne proprement certaines fonctions internes (et peu documentées) du printer.device pour envoyer les
points souhaités à l'imprimante. On garde ainsi le printer.device et les pilotes originaux, mais on imprime en vraies 256 nuances,
soit quasiment en 24 bits par couleur.
Séquence action
Voici un petit dessin en 256 couleurs qui nous servira de référence pour nos essais.
En imprimant l'image de référence avec les pilotes d'origine, on obtient ceci :
Ce n'est pas terrible :
- La taille des pixels n'est pas respectée, d'où les distorsions.
- Les couleurs 3 (255,0,0) et 4 (255, 9, 0), 5 (255, 17,0) et 6 (255, 26, 0), 7 (255,34,0) et 8 (255, 43, 0), et d'autres
sont identiques ce qui met en évidence une limitation à 3x4=12 bits.
En imprimant avec DirectDump en 12 bits (trame ordonnée 4x4) :
On retrouve les mêmes problèmes de limitation au niveau des couleurs, mais c'est normal, on est en 12 bits.
En imprimant avec DirectDump en 24 bits (trame ordonnée 8x8) :
Eh bien ça devient intéressant : les couleurs 3 et 4 ont bien des trames différentes, ainsi que toutes les autres. Sur du vrai
papier, on ne voit pas trop la différence pour des petits carrés, mais sur des dégradés, il y a une énorme différence... je
vous laisse vous amuser avec DirectDump, sachant qu'il peut ingurgiter des images QRT (le format d'images de rendu produit par
l'ancêtre de POV-Ray). Une page A4 représente déjà 24 Mo en 300x300...
Conclusion
L'Amiga, malgré son âge plus que respectable, a été bien conçu, et reste évolutif même si on peut prendre ces efforts bidouillesques
comme des exploits. Cette machine me surprendra tous les jours... quoique en ce moment elle ne me surprend que les week-ends pluvieux...
|