home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / xfedor.zip / XFree86 / src / xfedor / ed_fill.c < prev    next >
C/C++ Source or Header  |  1999-03-02  |  3KB  |  121 lines

  1. /* Copyright 1989 GROUPE BULL -- See licence conditions in file COPYRIGHT */
  2. #include <stdio.h>
  3. #include "couche.h"    /* myEvent */
  4. #include "clientimage.h"    /* ClientImage dans fedor.h */
  5. #include "fedor.h"    /* fedchar */
  6. #include "edit.h"     /* MODBLANC .. */
  7.  
  8. extern modcolor ;
  9. extern fedchar cartrav ;
  10. extern Xleft,Baseliney ;
  11. extern BackColor, CurColor ;
  12.  
  13. #define empiler(a) T[i++] = a
  14. #define depiler(a) a = T[--i]
  15.  
  16. static short T[128 * 64];
  17.  
  18. static remp(x,y,couleur,rempcouleur)
  19. /* OLDFEDOR algorithm */
  20.     int x,y ;
  21.     int couleur;
  22.     int rempcouleur;
  23. {    
  24.     int i, marqueH, marqueB;
  25.  
  26.   marqueH = marqueB = 0;
  27.   i = 0; /* base de la pile */
  28. E1:
  29.   do  /* aller a gauche */
  30.   { x -- ;}
  31.   while ((couleur == Rast_Inq(cartrav.image,x,y)) &&
  32.      (x >= Xleft));
  33.   x ++ ;
  34.                 
  35. E2:
  36.   y -- ; /* on marque le haut */
  37.   if (y < Baseliney + cartrav.up) goto E4;
  38.   if (couleur == Rast_Inq(cartrav.image,x,y)) 
  39.     if ( ! marqueH) {
  40.            empiler(x);
  41.            empiler(y);
  42.            marqueH = 1;
  43.         } else marqueH = 0;
  44. E4:
  45.  y += 2; /* on marque le bas */
  46.  if (y > Baseliney + cartrav.down) goto E3;
  47.  if (couleur == Rast_Inq(cartrav.image,x,y)) 
  48.     if ( ! marqueB) {
  49.        empiler(x);
  50.            empiler(y);
  51.            marqueB = 1;
  52.           } else marqueB = 0;
  53. E3:
  54.   y -- ; /* on revient au Point initial */
  55.   Rast_Pix(cartrav.image,x,y,rempcouleur);
  56.   carre_pas(x,y,rempcouleur) ;
  57.   x ++ ; /* on avance de 1 en x */
  58.   if ((couleur == Rast_Inq(cartrav.image,x,y)) &&
  59.      (x <= Xleft + cartrav.hsize)) goto E2;
  60.    else {
  61.     if (i == 0) return;
  62.     depiler(y);
  63.     depiler(x);
  64.     marqueH = 0;
  65.     marqueB = 0;
  66.     goto E1;
  67.    }
  68.  
  69. }  
  70.  
  71. static Remplir(x,y)
  72.     int x,y ;
  73. {    
  74.     int couleur ;     /* couleur du point (x,y) */
  75.         int rempcouleur ;  /* couleur de remplissage */
  76.  
  77.     if (cartrav.hsize==0) return ;
  78.  
  79.     /* si le point initial est hors bbox : exit */
  80.         if ((x < Xleft) || (x > Xleft+cartrav.hsize) || 
  81.         (y < Baseliney + cartrav.up) || 
  82.         (y > Baseliney + cartrav.down )) return ;
  83.  
  84.     rempcouleur = (modcolor==MODBACK)?BackColor:CurColor ;
  85.  
  86.     couleur = Rast_Inq(cartrav.image,x,y);
  87.     if (modcolor==MODINV) {
  88.           if (couleur == BackColor) rempcouleur = CurColor ;
  89.                         else rempcouleur = BackColor ;
  90.         }
  91.  
  92.     /* si le point initial est de la couleur demandee : exit */
  93.     if (rempcouleur == couleur ) return ;
  94.  
  95.  
  96.     remp(x,y,couleur,rempcouleur) ;
  97.     CarFen();
  98.     
  99. }
  100.     
  101. Autom_fill (pev)
  102.     myEvent * pev ; 
  103. {   
  104.     int x,y ;     /* coords courantes et prec en 0-128 */
  105.     
  106.     switch (pev->type) {
  107.     case EnterZone : Afficher_boutons("INSIDE","INSIDE");
  108.              break ;
  109.     case ButtonPressed : 
  110.             Dodo();
  111.             Remplir(convert(pev->x),convert(pev->y));
  112.             break ;
  113.     case ButtonReleased : break ;
  114.     case CloseWindow : break ;                
  115.     case MoveMouse : break ;
  116.     case LeaveZone : Afficher_boutons("","");
  117.                  Afficher_numview(-1,-1) ; /* restaure le gris */
  118.              break ;
  119.     }
  120.