                           Amiga Image ViewEr
                              version 1.5
                             Mars 1994


Rôle : Afficher des images en 256 couleurs sur un Amiga de base .
------

Copyright :
-----------
   AIVE est (c) 1994 Laurent Vivier . Il ne peut être vendu dans un but
commercial sans mon autorisation écrite . Tout distribution ne peut exiger
plus de 15FF de frais . Plus généralement, je n'autorise personne à
distribuer ce logiciel dans un but lucratif sans mon autorisation écrite .
   Ce logiciel ne peut être distribué séparé de ses documentations . Les
fichiers "AIVE","AIVE.docF","AIVE.docE" ne peuvent donc être séparés .

   Ce logiciel est "Freeware", vous pouvez me contacter pour demander de
l'aide ou poser des questions, des suggestions.

Avertissement :
---------------

   Je décline toute responsabilité quant à l'utilisation de ce logiciel .
Toute utilisation se fait à vos risques et périls .

Contact :
---------

   Adresse postale :

            Laurent Vivier
            Avenue Général De Gaulle
            38380 Saint Laurent du Pont
            FRANCE

   Adresse électronique jusqu'au 15 juin 1994 :
            Laurent.Vivier@ufrima.imag.fr
            Laurent.Vivier@imag.fr

Formats Supportés : GIF87a,GIF89a (entrelacé ou non), IFF .
-------------------

The Graphic Interchange Format(c) is the Copyright property of
CompuServe Incorporated. GIF(sm) is a Service Mark property of
CompuServe Incorporated.

Utilisation :
-------------

   AIVE peut être appelé à partir du CLI (ou Shell) ou du Workbench.

Paramètres supportés depuis le CLI :
------------------------------------

   Le nom du fichier ainsi que les options d'affichage se font par passage
des paramètres depuis la ligne de commande.

   Les paramètres supportés sont affichés si on lance AIVE sans paramètres !

AIVE name [hire|lore|ehb][nolace][grey|gray][scale][color #colors]
          [width w][heighth][ratio a/b]
          [dither none|fs1|fs2]
          [smooth none|gs1|gs2]


   HIRE,LORE,EHB : spécifie le mode graphique à utiliser
   HIRE : haute résolution
   LORE : basse résolution
   EHB  : Extra-Half-Bright
Le mode d'affichage par défaut est HAM .

NOLACE : par défaut l'affichage se fait en mode entrelacé, cette option
         l'inhibe .

GREY   : affiche l'image en niveau de gris (16 couleurs, HIRE)

COLOR n : permet d'indiquer le nombre de couleurs a utiliser (>= 8,
          par défaut le maximum) . Conjugué avec GREY, indique le nombre
          de niveaux de gris .

SCALE : l'image est automatiquement réduite pour rentrer entièrement dans
        l'écran

WIDTH w : w est la largeur maximale de l'image

HEIGHT h : h est la hauteur maximale de l'image

RATIO a/b : rapport de déformation de l'écran .
            Soit x et y, respectivement la largeur et la hauteur d'un
            point élémentaire de l'écran, alors : y = x * (a/b)
            par défaut : a/b = 1/2 en LORE (HAM,EHB)
                             = 1/1 en LORE et NOLACE
                             = 1/1 en HIRE
                             = 2/1 en HIRE et NOLACE
            Je suis bien conscient que ces coefficients ne sont pas
            réalistes (si on se réfère aux spécifications du format IFF,
            les bonnes valeurs sont 5/11, 10/11, 20/11) . Mais ceux-ci
            pouvant varier d'un écran à l'autre en fonction des réglages,
            de la fréquence (NTSC/PAL), d'une image à l'autre, toute autre
            valeur ne pourrait être que spécifique à MON écran . Alors, à
            vous de faire le boulot (une méthode consiste à dessiner un
            rectangle à l'écran, même nombre de points hauteur/largeur, de
            prendre un décimètre pour mesurer ses côtes sur l'écran, et de
            faire le rapport)

DITHER NONE : pas de dithering (propagation de l'erreur)
       FS1  : dithering unidirectionne, l'erreur est propagée uniquement sur
              la ligne.
       FS2  : dithering bidirectionnel, l'erreur est propagée sur la ligne
              sur les colonnes (option par défaut)
La méthode utilisée est celle de Floyd-Steinberg.

SMOOTH NONE : pas de smoothing (lissage) (option par défaut)
       GS1  : le filtre utilisé est un filtre gaussien à 1 dimension
       GS2  : le filtre utilisé est un filtre gaussien à 2 dimensions

Note :
  Il m'a semblé utile de rajouter le smoothing parce que certains images
qui ont déja subi un dithering (conversion du JPEG vers le GIF) ressortent
très mal en mode HAM. Avec le smoothing, j'essaye d'annuler le dithering
précédent. De plus, le smoothing à 2 dimensions permet d'éliminer quelque
peu l'effet de clignotement en mode entrelacé.

Exemple :

On veut afficher l'image cindy.gif (800x600) dans un écran de taille
standard, un utilisant le dithering bidirectionnel et le smooting à 2
dimensions.

   aive cindy.gif scale smooth GS2

On notera que le smoothing bidirectionnel et le mode HAM sont valides par
défaut.

La même image, mais sur un écran 100x100, sans smoothing ou dithering, avec
un rapport de déformation de 5/11 (en basse résolution) :

   aive cindy.gif lore dithering none ratio 5/11 width 100 height 100


Tool types depuis le Workbench :
--------------------------------

   Pour démarrer AIVE depuis le Workbench, il faut sélectionner son icône
(inversion des couleurs), puis appuyer sur shift en double-cliquant sur
l'icône de l'image à afficher.

Les tools type donnent les options à aive depuis le Workbench, comme
les parmètres depuis le CLI.

   Les tool types se trouvent dans l'icône des fichiers. On peut modifier
les tool types d'un fichier en sélectionnant son icône avec la souris puis
en choisissant "Information" (Amiga-Gauche I) dans le menu du workbench
"Icons". On ajoute des tool types avec "New", on en supprime avec "Del".

   Lorsque l'on lance AIVE, il lit tout d'abord les tool types de son icône,
puis ceux de l'icône de l'image sélectionnée. Par conséquent, les tool types
de l'image son plus prioritaires que ceux stockés dans l'icône de AIVE.

Les tool types pris en compte sont :

MODE=HAM       pour sélectionner le mode HAM
MODE=HIRE      la haute résolution
MODE=LORE      la basse résolution
MODE=EHB       le mode Extra-Half-Bright

COLOR=n        où "n" est le nombre de couleurs à utiliser (ou niveau de
               gris)

INTERLACED=YES pour sélectionner le mode entrelacé
INTERLACED=NO  sinon

GREY=YES       pour sélectionner l'affichage en niveau de gris
               (GRAY et GREY sont synonymes)
GREY=NO        sinon

SCALE=YES      l'image est autmatiquement diminuer pour rester dans l'écran
SCALE=NO       sinon

WIDTH=w        où "w" est la largeur maximum de l'écran

HEIGHT=h       où "h" est la hauteur maximum de l'écran

RATIO=a/b      où a/b est le coefficient de déformation

DITHER=NONE    pour inhiber le dithering
DITHER=FS1     pour sélectionner le dithering unidimensionnel
DITHER=FS2     pour sélectionner le dithering bidimensionnel

SMOOTH=NONE    pour inhiber le smoothing
SMOOTH=GS1     pour sélectionner le smoothing unidirectionnel
SMOOTH=GS2     pour sélectionner le smoothing bidirectionnel

Les valeurs par défauts sont :  MODE=HAM, INTERLACED=YES, SCALE=NO, GREY=NO,
DITHER=FS2, SMOOTH=NONE. WIDTH, HEIGHT, RATIO, et COLOR ont les valeurs
standard inhérentes au mode d'écran sélectionnée.

Note : On peu insérer des espaces entre les mots et "=".

Exemple :

Si les tool types de AIVE sont : MODE=HAM, GREY=NO, INTERLACED=YES
et les tool types de l'image sont : MODE=HIRE, GREY=YES, RATIO=10/11

Les tool types utilisé seront : MODE=HIRE, GREY=YES, INTERLACED=YES,
RATIO=10/11, DITHER=FS2, SMOOTH=NONE.

Interface :
-----------

   Après lancement, une fenêtre s'ouvre . On y trouve le nom de l'image en
cours de chargement, son type (GIF87a, GIF89a, IFF ...), ses dimensions,
ainsi qu'une barre reflétant la progression du décodage . Un bouton "Stop"
permet d'arrèter la lecture, et de quitter le programme . Le recourci
clavier est la touche "ESC", elle n'est active seulement si la fenêtre est
sélectionnée (et non si l'image est sélectionnée !) . On peut échanger les
écrans avec [Amiga-Gauche m], on peut faire apparaitre l'écran Workbench en
premier plan avec [Amiga-Gauche n].

A noter : Sous OS2.0, il est possible d'afficher des images plus grandes
que l'écran; rien de spéciale n'a été fait pour les parcourir, la seule
solution existante est celle donnée par le système, c'est-à-dire presser
la touche Amiga-Gauche en même temps que le bouton gauche de la souris,
et déplacer la souris pour déplacer l'image .
   Sous OS1.3, ce problème ne se rencontre pas : il est impossible d'ouvrir
un écran plus grand, l'image est mise à l'échelle dans une taille standard
(PAL ou NTSC) .


Techniques Utilisées :
----------------------

   Toutes les images subissent un dithering de type Floyd-Steinberg, qui
consiste en une propagation de l'erreur aux points voisins . Il peut être
unidirectionnel ou bidirectionnel. Dans le premier cas, la totalité de
l'erreur est reportée au point suivant, dans le deuxième l'erreur est
répartie entre le point suivant et ses voisins de la ligne suivante.
                 
   L'affichage en niveau de gris, qui je pense est ce que l'on peut faire
de mieux sur un Amiga avec le chip set de base, utilise les coefficients de
luminosité de la Commision Internationale de l'Eclairage (CIE), c'est-à-dire
que chaque composante est pondérée par une valeur proche de la sensibilite de
l'oeil, lors du calcul de la moyenne donnant l'intensité du niveau de gris .

   La recherche de la couleur la plus proche se fait en se projetant dans
l'espace tridimensionel raporté aux composantes . Cela reviens à calculer
la distance la plus courte dans cet espace . Cet espace est dilaté par les
coefficients cités précédemment .

   L'extraction de la palette de couleurs se fait gràce à une méthode
personnelle qui consiste à agglomérer les couleurs en ilots de proximité dans
l'espace . On découpe l'espace en un nombre de sous-espaces, ce nombre est
le nombre de couleurs désirées . La valeur de la couleur associée au
sous-espace est le barycentre des couleurs de la palette d'origine contenu
dans ce sous-espace .

   L'affichage a été accéléré par rapport à la version 1.0 en stockant les
calculs au fur et à mesure de l'affichage (utilise une vingtaine de Ko en
plus)

   La mise à l'échelle se fait gràce à une routine en assembleur n'utilisant
aucun nombre en virgule flottante . La technique employée peut s'apparenter
aux techniques utilisées pour faire de l'anti-aliasing.

   Le smoothing se fait en faisant un convolution entre :
      - pour le cas à une dimension, la matrice comprenant les points de la
ligne et la matrice gaussienne [1 2 1].
      - pour le cas à deux dimensions, la matrice comprenant 3 lignes, la
ligne du milieu étant la ligne courante et la matrice : +-     -+
                                                        | 1 2 1 |
                                                        | 2 4 2 |
                                                        | 1 2 1 |
                                                        +-     -+
Evolutions possibles :
----------------------

   - gamma correction (est-ce utile ?)
   - implantation d'une option d'impression (utilisant toute la résolution
     de l'imprimante) .
   - implantation d'une option de sauvegarde .
   - ajout des formats PCX, BMP (très probable), JPEG (peu probable, à cause
     de l'obligation de parcourir l'image pour extraire la palette)
   - complétion de l'interface homme-machine sous intuition

Compatibilité :
---------------
   Ce soft a commencé à être développer sous Kickstart 1.2, Workbench 1.3 .
Lors de sa diffusion, son développement se faisait sous 2.0, il devrait donc
fonctionner sous tous les systèmes . Il a été rapidement testé sous 2.0 avec
émulateur kickstart 1.3, à première vue il ne parait pas y avoir de
problèmes .

   Il se peut qu'il y ait des problèmes sur des machines comportant des
cartes graphiques : je n'utilise pas la fonction WritePixel de la
graphics.lib pour écrire à l'écran, mais écris directement en mémoire, dans
un but de rapidité .

   Toutes l'activité de test s'est faite sur mon A500 :
   carte mère rev 5a, OS2.0, 2 drives DDDS, 512 FAST, 512 CHIP .

bogues connus :
---------------
   - l'option scale ne marche pas correctement avec les GIF entrelacés.
   - le smoothing n'est pas implanté pour l'affichage en niveau de gris
   - quelque fois, on peut voir apparaitre des points parasites sur le coté
     gauche

Remerciements :
---------------

   Frédéric Elisei   Archimediste génial, qui a fourni de l'eau a mon moulin
   Franck Lyonnet    idem
                     Voyez leurs viewers JPEG sur Acorn Archimede 5000,
                     qui tourne plus vite que n'importe quels viewers GIF
                     sur Amiga (500 !) .
   Roger Wilson      pour un article sur son soft ChangeFSI
   Steven A. Bennet  auteur d'un décodeur GIF dont je me suis inspiré
   Cindy Crowford    pour sa plastique superbe (motivante !)

   UFR Informatique  qui m'a permis de découvrir le réseau internet, et donc 
   et mathématiques  l'accès a un nombre important d'informations
   appliquées de     (Merci aux administrateurs système)
   Grenoble          Venez étudier à Grenoble

Historique :
------------
Janvier 1994   version 1.0    première distribution
Janvier 1994   version 1.2    correction de 2 lègers bugs :
                              - plantage sur des images de largeur impaire
                              - légère correction du dithering pour éviter
                                un effet de saturation .
Mars 1994      version 1.5    correction d'autres bugs :
                              - impossibilité d'afficher en grey avec low
                                resolution .
                              - impossibilité de faire un dégradé de gris
                                avec moins de 16 niveaux .
                              Evolution :
                              - Accélération du dithering (un gain de 2 ou 3)
                              - mise en place des routines de changement
                                de taille de l'image
Avril 1994     version 1.7    Correction de bugs :
                              - permettre l'affichage d'images IFF
                                comportant moins de 256 couleurs.
                              - détection des images IFF qui ne sont pas
                                compressées par ligne mais sur la
                                totalité de l'image (ce sont généralement
                                des fichier ".pic", AIVE ne peut pas les
                                afficher)
                              Evolution :
                              - optimisation du chargeur IFF
                              - permettre le démarrage depuis le workbench
                              - possibilité de désactiver le dithering
                              - ajout du dithering 1D
                              - smoothing

Auteur : Laurent Vivier
--------
