home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / xfedor.zip / XFree86 / src / xfedor / tr_grille.c < prev    next >
C/C++ Source or Header  |  1999-03-02  |  12KB  |  466 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"
  5. #include "fedor.h"        /* fedchar */
  6. #include "edit.h"        /* MODBLANC WMENU WEDIT WHITE GREY */
  7.  
  8. extern nf_edit ;
  9. extern MetrAff    ;     /* bool qui indique que la metrique est afficher */
  10.             /* cad la BiBox + les points adj et incr */
  11. extern modcolor ;     /* MODBACK, MODINV, ou MODCOLOR */
  12. extern modecour ;    /* point, line .. */
  13. extern colortrame ;    /* WHITE GREY */
  14. extern int BackColor ;
  15.  
  16. void Init_grille() ;
  17. void Autom_grille() ;
  18. int convert();
  19. void Changer_baseline() ;
  20. void Changer_guideline() ;
  21. int Resol_possible() ;
  22. void Afficher_back() ;
  23. void Afficher_all() ;
  24. void Changer_editresol() ;
  25. void MontrerCarTrav() ;
  26. int Adjpoint() ;
  27. void carre_pas();
  28. void Invpoint() ;
  29. void BiBox() ;
  30.  
  31. int nf_grille ;   /* NUMERO DE LA SOUS-FENETRE GRILLE */      
  32.  
  33. fedchar cartrav, carback, carundo[20] ;
  34. int Baseliney,Xleft ;        /* pour tr_font */
  35. int BackLeft,Baseback ;
  36. ClientImage * bitmapsave ;
  37.  
  38. int editresol ;        /* 16 32 64 128 */
  39.  
  40. #define XGRILLE WMENU
  41. #define YGRILLE 0
  42. #define WGRILLE WEDIT
  43. #define HGRILLE WEDIT
  44.  
  45. static int zedit ;
  46.  
  47. #define NGL 4
  48. static int tguide[NGL] ;
  49. static int ngl = 0 ;
  50.  
  51. #define NUNDO 2
  52.  
  53. int CurColor, TrameColor ;
  54.  
  55. static int back_pix ;
  56.  
  57. void Init_grille() 
  58. {    int i ;
  59.  
  60.     nf_grille = w_ouvrir(nf_edit,XGRILLE,YGRILLE,WGRILLE,HGRILLE,
  61.                       "",CURS4,
  62.                 EnterZone|ButtonPressed|ButtonReleased|
  63.                 KeyPressed|MoveMouse|LeaveZone,WMOFF) ;
  64.     w_backing(nf_grille);
  65.  
  66.     zedit = w_crzon(nf_grille,0,0,WGRILLE,HGRILLE,CURS4);
  67.  
  68.     CurColor = w_blackpixel();
  69.  
  70.     TrameColor = w_greypixel();
  71.  
  72.  
  73.  
  74.     /* INIT DES BITMAP CLIENTS */
  75.     Rast_Init(&cartrav.image,128,128,1);  /* flag = 1 pour depth n */
  76.     Rast_Init(&bitmapsave,128,128,1);
  77.     Rast_Init(&carback.image,128,128,1);
  78.     for (i=0; i<NUNDO ; i++) {
  79.       Rast_Init(&carundo[i].image,128,128,1);
  80.     }
  81.     Rast_Off(&cartrav.image,BackColor);  
  82.     Rast_Off(&bitmapsave,BackColor);
  83.     Rast_Off(&carback.image,BackColor);
  84.     for (i=0; i<NUNDO ; i++) {
  85.       Rast_Off(&carundo[i].image,BackColor);
  86.     }
  87.  
  88.     editresol = 32 ; 
  89.     Baseliney = 31 ;     
  90.     for (i=0 ; i<NGL; i++) tguide[i] = -1 ;
  91.  
  92.     back_pix = w_bitmap(32,32);
  93.  
  94.     w_montrer(nf_grille);
  95.  
  96. }
  97.  
  98. static Reaffich(pev)
  99.     myEvent * pev ;
  100. /*  printf("expose %d %d %d %d\n",pev->x,pev->y,pev->xz,pev->yz);*/
  101.        if (pev->window == nf_grille) Afficher_all();
  102. }
  103.  
  104. int convert(xy)
  105.     int xy ;
  106. {
  107.     if (xy == 0) return 0 ; else
  108.     if (xy >= 513) return (editresol - 1) ; else
  109.             return (xy - 1)/(512/editresol) ;
  110. }
  111.  
  112.  
  113. static Afficher_baseline()
  114. {    short pas = (512/editresol);
  115.  
  116.     if (Baseliney == 0) return ;
  117.     w_line(nf_grille,1,Baseliney*pas +1,WGRILLE-2,Baseliney*pas +1,ON);
  118.     w_line(nf_grille,1,Baseliney*pas,WGRILLE-2,Baseliney*pas,ON);
  119. }    
  120.     
  121. void Changer_baseline(by) 
  122.     int by ;    /* espace fenetre 0-514 */
  123. /* efface l'ex baseline, modifie la globale Baseliney et l'affiche */
  124. /* modifie aussi les valeurs up et down et les reaffiche */
  125. {
  126.     short dby,cby,i ;
  127.     short pas = (512/editresol) ;    
  128.     
  129.     cby = convert(by) ;
  130.         /* first, we verify that there is no guideline here */
  131.     for (i=0 ; i<NGL ; i++) if (tguide[i] == cby) return ;
  132.     dby = cby - Baseliney ; /* differentiel */
  133.     if (dby) {
  134.       if (colortrame == GREY) 
  135.         w_color(nf_grille,0,Baseliney*pas,
  136.             WGRILLE,Baseliney*pas +2,TrameColor); else
  137.       if (colortrame == WHITE) 
  138.         w_color(nf_grille,0,Baseliney*pas,
  139.             WGRILLE,Baseliney*pas +2,BackColor);
  140.         /* efface */
  141.         /* on doit reafficher les pixels back dont on a effacer
  142.             un cote horizontal */
  143.         for (i=BackLeft ; i < BackLeft+carback.hsize ; i++)
  144.            if ((Rast_Inq(carback.image,i,Baseliney) != BackColor) ||
  145.             (Rast_Inq(carback.image,i,Baseliney-1) != BackColor))
  146.             w_line(nf_grille,i*pas +1 , Baseliney*pas, 
  147.                 (i+1)*pas +1, Baseliney*pas,ON);
  148.                 
  149.         if (cartrav.down-cartrav.up!=0)    {     
  150.                 /* => up et down != 0 */
  151.             cartrav.up -= dby ;
  152.             cartrav.down -= dby ;
  153.             Aff_all() ;
  154.         }
  155.         Baseliney += dby ;
  156.         Afficher_baseline();
  157.     }
  158. }
  159.  
  160. static void Afficher_guidelines() 
  161. {
  162.     short i,pas = (512/editresol) ;    
  163.     
  164.     for (i=0 ; i<NGL ; i++)
  165.         if (tguide[i] > 0)     
  166.             w_line(nf_grille,0,tguide[i]*pas +1,
  167.                           WGRILLE,tguide[i]*pas +1,ON);
  168. }
  169.  
  170. void Changer_guideline(gy)
  171.     int gy ;
  172. {
  173.     short dgy ;
  174.     short i,pas = (512/editresol) ;    
  175.  
  176.     dgy = convert(gy) ;
  177.     /* first we see if there is a collision with Baseline */
  178.     /* we not permitted that */
  179.     if (dgy == Baseliney)  return ;
  180.     /* if there is already one guideline at this level, it erase it
  181.         on the root and on the internal memory, else
  182.        it add one new guideline in this two structure */
  183.     /* research of existense : we have NGL guideline possible :
  184.         from tguide[0] to tguide[NGL-1] */
  185.  
  186.     for (i=0 ; i< NGL ;i++) if (tguide[i]==dgy) break ;
  187.  
  188.     if (i==NGL) {/* it means that we haven't found any guideline
  189.             already stored */
  190.         if (ngl < NGL) {/* we have at least one free cell */
  191.             i = 0 ;
  192.             while(tguide[i]!=-1) i++ ;
  193.             tguide[i] = dgy ;
  194.             ngl ++ ;
  195.             if (dgy) w_line(nf_grille,0,dgy*pas +1,
  196.                               WGRILLE,dgy*pas +1,ON);
  197.         } 
  198.         } else {/* we have found a tguide[i] equal to dgy */
  199.         tguide[i] = -1 ;
  200.         ngl -- ;
  201.         if (colortrame == GREY) 
  202.           w_color(nf_grille,0,dgy*pas +1,
  203.                   WGRILLE,dgy*pas +2,TrameColor);    else
  204.         if (colortrame == WHITE) 
  205.           w_color(nf_grille,0,dgy*pas +1,
  206.                   WGRILLE,dgy*pas +2,BackColor);    
  207.         /* efface */
  208.         
  209.     }    
  210. }
  211.  
  212. static Afficher_grille ()    
  213.     register short l,pas=(512/editresol) ;
  214.     
  215.  
  216.     if (colortrame == GREY) 
  217.       w_color(back_pix,0,0,pas,pas+1,TrameColor) ; else
  218.     if (colortrame == WHITE) 
  219.       w_color(back_pix,0,0,pas,pas+1,BackColor) ;
  220.    
  221.      w_color(back_pix,1,2,pas,pas+1,BackColor) ;     
  222.  
  223.      for(l=pas ; l<32 ; l<<=1)
  224.          w_rastop(back_pix,back_pix,0, 0, l, pas, l, 0);
  225.  
  226.      for(l=pas ; l<32 ; l<<=1)
  227.          w_rastop(back_pix,back_pix,0, 0, 32, l, 0, l) ;
  228.  
  229.     w_setback(nf_grille,back_pix);
  230.      
  231. /*   if (colortrame == GREY) 
  232.       w_color(nf_grille,512,0,514,514,TrameColor) ; else
  233.     if (colortrame == WHITE) 
  234.       w_color(nf_grille,512,0,514,514,BackColor) ;
  235. */
  236. }     
  237.  
  238.  
  239. static Afficher_car() 
  240. {
  241.     register int x,y,limx,limy ;
  242.  
  243.     limx = Xleft + cartrav.hsize ;
  244.     limy = Baseliney + cartrav.down ;
  245.     for (x=Xleft; x < limx ; x ++)
  246.         for (y=Baseliney+cartrav.up; y < limy; y ++)
  247.          carre_pas(x,y,Rast_Inq(cartrav.image,x,y)) ;
  248.             
  249. }
  250.  
  251. void Afficher_back()
  252. /* ne fait rien si carback.hsize = 0 */
  253. {
  254.     int x,y ;
  255.     register short pas =(512/editresol), limx, limy ;
  256.  
  257.     limx = BackLeft + carback.hsize ;
  258.     limy = Baseback + carback.down ;
  259.     for (x=BackLeft; x < limx ; x ++)
  260.         for (y=Baseback+carback.up; y < limy; y ++)
  261.            if (Rast_Inq(carback.image,x,y) != BackColor)
  262.             w_rect(nf_grille,x*pas +1 , y*pas,
  263.                 (x+1)*pas +1, (y+1)*pas,ON);
  264. }
  265.     
  266. void Afficher_all()
  267. /* ne touche qu'a la fenetre nf_grille */
  268. {
  269.     Afficher_grille();
  270.     Afficher_baseline();
  271.     Afficher_guidelines();
  272.     Afficher_car() ;
  273.     Afficher_back() ;
  274.     if (MetrAff == 1) {    /* il faut retracer la metrique */
  275.                 /* afficher par ed_metric */
  276.         BiBox();
  277.                Invpoint(Xleft - cartrav.hadj,Baseliney);
  278.                Invpoint(Xleft - cartrav.hadj +cartrav.hincr ,Baseliney);
  279.     }
  280.     CarFen() ;
  281. }
  282.  
  283.  
  284. int Resol_possible(resol)
  285. /* rends VRAI si la resolution donnee peut contenir le caractere courant */
  286. {
  287.       if (resol == 128) return 1 ; 
  288.       return ( (Xleft+cartrav.hsize <= resol) &&
  289.          (Max(Baseliney,Baseliney+cartrav.down) <= resol) &&
  290.          (BackLeft+carback.hsize <= resol) &&
  291.          (Max(Baseback,Baseback+carback.down) <= resol)) ;
  292. }
  293.  
  294.  
  295. void Changer_editresol() 
  296.  
  297.     editresol = 16 ;
  298.     while (!Resol_possible(editresol))   editresol <<= 1;
  299. }
  300.  
  301.  
  302. void MontrerCarTrav() 
  303. /* cartrav est complet, Baseliney et Xleft sont fixes, on modifie 
  304.    editresol en fonction de ces valeurs */
  305.  
  306.         Changer_editresol() ;
  307.     Afficher_resol(editresol) ;
  308.     Afficher_all() ;
  309.     Aff_all() ;
  310.     Aff_name(cartrav.name);
  311. }
  312.  
  313.  
  314.  
  315. int Adjpoint(x,y)
  316. /* x,y en 0_128 */
  317. /* rends une couleur  ou -1 si on a rien trace */
  318.     int x,y ;
  319. {    
  320.     int color ;
  321.  
  322.     if ((x < 0) || (x > 128) || (y < 0) || (y > 128)) return -1 ;
  323.  
  324.     color = Rast_Inq(cartrav.image,x,y) ;
  325.  
  326.     if ((modcolor == MODINV) && (color == BackColor))
  327.       color = CurColor ; else
  328.     if ((modcolor == MODINV) && (color != BackColor))
  329.       color = BackColor ; else
  330.     if ((modcolor == MODBACK) && (color == BackColor))
  331.       return -1 ; else
  332.     if ((modcolor == MODCOLOR) && (color == CurColor))
  333.       return -1 ; else
  334.         if (modcolor == MODBACK) color = BackColor ; else
  335.         if (modcolor == MODCOLOR) color = CurColor ; 
  336.  
  337.     Rast_Pix(cartrav.image,x,y,color);
  338.     if (color != BackColor) {  /* on "allume" un pixel  */
  339.       if ((cartrav.down-cartrav.up)== 0) { /* init */
  340.         Xleft = x ;
  341.         cartrav.hsize = 1 ;
  342.         cartrav.up = y - Baseliney ;
  343.         cartrav.down = y - Baseliney + 1 ;
  344.         *cartrav.name = '\0' ;
  345.       } else {
  346.         if (x < Xleft)  {
  347.           cartrav.hsize += Xleft - x ;
  348.           Xleft = x ;
  349.         } else
  350.           if (x >= Xleft + cartrav.hsize)  {
  351.         cartrav.hsize = x - Xleft +1 ;
  352.           } 
  353.         if (y < Baseliney + cartrav.up) {
  354.           cartrav.up = y - Baseliney ;
  355.         } else
  356.           if (y >= Baseliney + cartrav.down) {
  357.         cartrav.down = y - Baseliney + 1;
  358.           }
  359.       }
  360.     } else {    /* il faut voir si cette remise a blanc d'un pixel
  361.                    fait diminuer up,down, hsize ou Xleft */
  362.         if (x==Xleft) {
  363.           while( (Colonne_color(cartrav.image,
  364.                     Xleft,Baseliney+cartrav.up,
  365.                     Baseliney+cartrav.down,
  366.                     color)) 
  367.             &&(cartrav.hsize!=0))
  368.             {
  369.               Xleft ++ ;
  370.               cartrav.hsize -- ;
  371.             }
  372.         } else
  373.           if (x==Xleft+cartrav.hsize-1) 
  374.             while ( (Colonne_color(cartrav.image,
  375.                        Xleft+cartrav.hsize-1,
  376.                        Baseliney+cartrav.up,
  377.                        Baseliney+cartrav.down,
  378.                        color)) 
  379.                && (cartrav.hsize!=0)) 
  380.               {
  381.             cartrav.hsize -- ;
  382.               } 
  383.         if (cartrav.hsize == 0 ) {
  384.           cartrav.up = 0 ;
  385.           cartrav.down = 0 ;
  386.           Xleft = 0 ;
  387.         }
  388.         if (y==Baseliney+cartrav.up)
  389.           while ( (Ligne_color(cartrav.image,
  390.                        Baseliney+cartrav.up,Xleft,
  391.                        Xleft+cartrav.hsize,
  392.                        color)) 
  393.              && (cartrav.down-cartrav.up!=0)) {
  394.             cartrav.up ++ ;
  395.           } else
  396.             if (y==Baseliney+cartrav.down-1)
  397.               while ( (Ligne_color(cartrav.image,
  398.                        Baseliney+cartrav.down-1,Xleft,
  399.                        Xleft+cartrav.hsize,
  400.                        color))  
  401.                  && (cartrav.down-cartrav.up!=0)) {
  402.             cartrav.down -- ;
  403.               } 
  404.           }
  405.     carre_pas(x,y,color);
  406.     return(color);
  407. }
  408.  
  409. void carre_pas(x,y,color)
  410.     int x,y ;
  411.     int color ;
  412. {
  413.     register short pas = (512/editresol) ;
  414.  
  415.     w_color(nf_grille,x*pas +2,y*pas+2, 
  416.         (x+1)*pas, (y+1)*pas,color);
  417. }
  418.  
  419. void Invpoint(x,y)        /* pour ed_beziers et ed_metric */
  420.     int x,y;
  421. {    
  422.     short pas = (512/editresol) ;
  423.  
  424.     if (x<0) return ;
  425.     w_fellips(nf_grille,x*pas - 2 , y*pas - 2 , 
  426.         (x+1)*pas + 3 , (y+1)*pas + 3,OFF);
  427. }
  428.  
  429. void BiBox() 
  430. {    
  431.     short pas = (512/editresol) ;
  432.  
  433.     w_rect(nf_grille,Xleft*pas,
  434.                    (Baseliney+cartrav.up)*pas,
  435.                    (Xleft+cartrav.hsize)*pas,
  436.                    (Baseliney+cartrav.down)*pas,
  437.             OFF);
  438.                 
  439. }
  440.  
  441.  
  442. void Autom_grille(pev)
  443.     myEvent * pev ;
  444. {
  445.     if (pev->type == Exposure ) Reaffich(pev) ; else
  446.     switch ( modecour) {
  447.       case point : Autom_point(pev) ; break ;
  448.       case line : Autom_line(pev) ; break ;
  449.       case recta : Autom_rect (pev) ; break ;
  450.       case cercle : Autom_cercle(pev) ; break ;
  451.       case resize : Autom_resize(pev) ; break ;
  452.       case write : Autom_write(pev) ; break ;
  453.       case transl : Autom_transl(pev) ; break ;
  454.       case bez : Autom_bez(pev) ; break ;
  455.       case rotate: Autom_rotate(pev) ; break ;
  456.       case fil : Autom_fill(pev) ; break ;
  457.       case metric : Autom_metric(pev) ; break ;
  458.       case cutap : Autom_cutap(pev) ; break ;
  459.         }
  460. }
  461.  
  462.