ImpDraw

Je squatte le wiki pour poser les spécifications techniques et idées ImpDraw.

NdAsT : et tu fais bien….

Description header plugins

;Header plugin outil ImpDraw
;v0.4  21/7/2015

+0  Byte  Id outil de 00 à FE (à choisir par convention).
     FF:  End Of Plugins (sentinelle pour terminer l'itération sur les plugins) 
+1  Byte  Type outil
     00: Selection. [1]
     01: Outil bitmap à action unique (e.g. Bézier, Fill, Move Window)
     02; Outil bitmap à action répétée (e.g. Point, Spray Can)
+2  Byte  N° version
+3  Byte  N° révision
+4  Word  Pointeur vers STR [2] nom outil. Eg "Simple Bezier".
+6  Word  Pointeur vers STR nom groupe. Eg "Shapes".
+8  Word  Pointeur vers texte d'aide associé. Format à définir (e.g. description courte, puis texte libre).
+A  Word  Pointeur vers liste de paramètres (les deux premiers seront passé dans BC).
+C  Byte  Flags raccourci (e.g avec/sans control, type touche)
+D  Byte  Touche raccourci (code ascii ou code clavier suivant le flag).
+E  Word  Nombre d'octets à réserver.
+10  Word  Pointeur vers fin de plugin (pour permettre l'itération sur les plugins concaténés).
+12 7*3   Jump table. Cf description ci-dessous.
+27 3*3   Reserved.
+30 Byte  Nombre paramètres additionnels (pour extensions, debug). 0 par défaut !

??? n*1 Liste paramètres utilisés.
     Les codes suivant correspondent à leur positions dans une table de variables.
     FF: End Of List
     00: Position
     04: Encre
     08: Mask pixel (d'après Mode)
     09: Taille
    ...

[1] L'outil de sélection fenêtre se distingue en ce qu'il ne modifie en rien le bitmap. D'ailleurs il est tellement particulier qu'il pourrait, voire devrait, être géré nativement par ImpDraw (càd non pas en tant que plugin).

[2] STR: Chaîne terminée par bit 7 à 1.

Révisions

v0.4

  • Ajoute pointeur vers aide.

v0.3

  • Ajoute ID outil. Permettre de retrouver un outil indépendamment de sa position, arbitraire et changeante, parmi les autres.

v0.2

  • Ajoute numéros version & révision.
  • Stabilise le header en longueur
  • Remplace STR par pointeur vers STR.
    • Peut servir d'ID
    • Permet de factoriser nom group
  • Remplace liste paramètres par pointeur vers liste.
    • Permet de factoriser listes communes
  • Ajoute possibilité d'extension

v0.1

Première version postée en transe sur Push'n'Pop.

Boucle gestion outil type 1 (action unique)

Pseudo code complet.

;v0.2

  - Appel 'Amorce'
     ; Cela initialise l'outil en fonction du contexte courant (position, encre, masque...)

  - Appel 'Preview'
     ; La routine renvoie la description de la zone impactée "BitmapChanges".

  - Rendu d'après BitmapChanges
     ; Routine générique ImpDraw

  - index=0 ; C'est le numéro du point de contrôle

Boucle

  - Si 'ESPACE' appuyé :
    - ++index
    - Appel 'newPos=SelectControlPoint(index)'
    - Si dernier point dépassé
      - Appel 'Undo(BitmapChanges)'  ; Enlève preview
      - Appel 'BitmapChanges=Paint()' ; Validation finale
      - Rendu(BitmapChanges)
      - Sortie de boucle
    - Sinon (nouveau point de contrôle)
      - Change position curseur courante d'après newPos

  - Si 'ESC' appuyé
      - Appel 'Undo(BitmapChange)'
      - Sortie de boucle (c'est annulé)

  - Si changement position / encre / taille du trait / etc
    - Appel 'Undo(BitmapChanges)'
    - Appel 'NotifyChange(numParameter)'
    - Appel 'BitmapChanges=Preview()'
    - Rendu(BitmapChanges)

  Goto boucle

Révisions

v0.2 Appel NotifyChange()
v0.1 Version remaniée de celle postée sur Push'n'Pop.

Boucle gestion outil type 2 (action répétée)

Laissé comme exercice au lecteur.

Description routines plugin

+0 : Initialisation

initialisation globale au lancement d'ImpDraw.

 In:  HL=début zone libre pour variables (fourni par IY dans les autres routines)
 Out: Nothing

+3 : Amorce

Initialise l'outil avec le contexte fourni.

 In:  DE: Absolute X coordinate.
      HL; Absolute Y coordinate.
      IY: Plugin variables zone.

Nb: les paramètres DE, HL sont aussi disponibles dans la zone variable.
   Il sont fournis via registres par amabilité.

 Out: DEHL: Id BitmapChanges (id vers zone allouée permettant de connaitre les pixels modifiés)

+6 : SelectControlPoint

Indique au plugin que le prochain NotifyChange concernera le point de contrôle choisi, et récupère ses coordonnées.

Motivation pour le retour des coordonnées : lors de l'amorce, le plugin peut définir intelligemment les positions des points.

  • Pour Bézier, choisir l'ancienne source comme nouvelle destination.
  • Pour un cercle, reprendre le même rayon que lors de la précédente invocation…

Il faut donc que le plugins puisse communiquer ces coordonnées à ImpDraw.

 In:  A: Index du point de contrôle
      IY: Plugin variables zone
 Out: Si point valide : Carry et
        DE: x-coordinate of selected point
        HL: x-coordinate of selected point
      Sinon (on a dépassé le dernier point de contrôle) : NC

+9 : NotifyChange

Indique changement d'un paramètre du point de contrôle courant.
NB : de toute façon les paramètres courants tels que la position sont relu lors de Preview/Paint,
mais cela donne l'occasion au plugin de mettre à jour des variables internes pour des changements plus complexes (taille, brush …).

 In:  A: Index paramètre.
 Out: N/A

+12 : Preview

Applique une prévisualisation de l'action de l'outil dans le bitmap.
La routine peut :

  • ne rien faire (e.g. FILL)
  • n'afficher que les pointillés de la fenêtre (e.g. MOVE WINDOW)
  • tout faire en appelant Paint(e.g. BEZIER)
 In: N/A
 Out: DEHL: Id BitmapChanges (cf amorce). 0 si rien n'a été fait.

+15 : Paint

Applique l'action de l'outil dans le bitmap.

 In: N/A
 Out: DEHL: Id BitmapChanges (cf amorce). 0 si rien n'a été fait.

+18: Undo

Défait dans le bitmap l'action de Preview ou Paint.

 In: DEHL: Id BitmapChanges
 OUt: N/A

Révisions

  • v0.3
    • Enlève paramètre "IX:ImpDraw variables zone". Les variables globales seront à un endroit figé (lecture plus rapide et compacte).
    • Enlève paramètre "BC:Additionnal parameters" pour amorce : ils sont accessibles directement.
  • v0.2
    • Replace SetParameters par NotifyChange :
      • Plus générique, plus fin.
  • v0.1
    • Version remaniée de celle postée sur Push'n'Pop.

Carte mémoire

Toutes les variables persistentes (devant survivre au reset et à la ReSeT) sont stockées en bank. La RAM de base sert pour l'affichage et les zones de travail (buffer temporaires etc…).
On réserve 2*7800 octets à l'affichage, ce qui couvre plus que la zone affichable (véritable over-scan).
On découpe selon les contraintes d'affichage classique (R9=7). NB : on n'utilisera pas de rupture pour l'affichage principal. Motivation :

  • Facilitera adjonction rasters.
0000-00FF : Rst, vecteur d'interruption, libre
0100-07FF : Affichage
0800-08FF : Libre
0900-0FFF : Affichage
1000-10FF : Libre
...
3900-3FFF : Affichage
---
4000-7FFF : Affichage
---

8000-80FF : Variables
8100-FFFF : Affichage ou Impdraw.

NB : en première approche, on n'utilisera pas les zones libres #8800-#88FF, #9000-#90FF etc, de sorte à pouvoir facilement placer la version dev (RAM) d'ImpDraw2.

De manière plus globale, on aurait :

Dessin: le résultat final sans outil à l'écran (pour visualisation).
Travail: écran de travail, avec fenêtre zoom et autres fenêtres d'outil. Remplacé par dessin pour visualisation.

Configuration A
---------------

Permet le flipping, nécessite Orgams en ROM.

0000-3FFF : Libre / Travail Haut Flipping 0
4000-7FFF : Travail bas Flipping 0
8000-BFFF : Libre / Travail Haut Flipping 1
C000-FFFF : Travail Bas Flipping 1

Configuration B
---------------

En l'absence de flipping, le but est d'accélerer la bascule en mode visu,
en ayant à tout instant le dessin complet en RAM vidéo.

0000-3FFF : Dessin Haut
4000-7FFF : Dessin Bas
8000-BFFF : Libre / Travail Haut
C000-FFFF : Travail Bas

Configuration B'
---------------

Version Dev avec IMPdraw en RAM.

0000-3FFF : Libre / Travail Haut
4000-7FFF : Dessin Bas
8000-BFFF : Variables / Impdraw (placé ici pour facilité l'accès aux plugins)
C000-FFFF : Travail Bas

Dans tous les cas, les plugins seront en ROM.

Variables

Paramètres image

Nb : c'est une copie de paramètres stockés en bank, de sorte que les outils puissent y accèder quelque soit la connection RAM.

En #8000.
+0 B mode (0,1,2 et plus pour mode virtuels)
+1 B pix_hift (Unused yet : depart pixel dans octet)
+2 W width    ; en pixels
+4 W height   ; en pixels
+6 B height_part1  ; Nb : 254 max
+7 B height_part2  ; Nb : 254 max

Variables outil

+0 position_x
+2 position_y
+4  pen   (0 à 15 en mode 0)
+8  mask  (selon mode)
+12 masked_pen (selon mode)

Variables de travail

B part#  Partie de l'image connectée (en cours de traitement)
Sauf mention contraire, le contenu de cette page est protégé par la licence Creative Commons Attribution-ShareAlike 3.0 License