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

  1. /* Copyright 1989 GROUPE BULL -- See licence conditions in file COPYRIGHT */
  2. #include <stdio.h>
  3. #include "clientimage.h"  /* pour fedor.h et VID  */
  4. #include "couche.h"      /*  CURS2 , myEvent */
  5. #include "sos.h"      /* FONT .. */
  6. #include "fedor.h"      /* fedchar .. MAXFONTCARD */
  7.  
  8. extern nf_mono ;
  9. extern fedchar cartrav ;    /* depuis tr_edit */
  10. extern int Baseliney,Xleft ;    /* depuis tr_edit */
  11. extern int BackColor ;
  12.  
  13. void Init_font();
  14. void ShowDoIt() ;
  15. int FontMax_Resize() ;
  16. int New_Resol() ;
  17. void Autom_font();
  18. static void Aff_mode() ;
  19. static void Aff_first();
  20. static void Aff_last();
  21.  
  22. int nf_font ;   /* NUMERO DE LA FENETRE FONTE */      
  23.  
  24. fedchar chartab[MAXFONTCARD];    /* pour filer GetFont */
  25.  
  26. int maxup, maxdown, maxhsize,  maxhincr, maxhadj ;
  27. char codemaxup, codemaxdown, codemaxhsize, codemaxhincr, codemaxhadj ;
  28.  
  29. int First, Last ;    /* pour otherfont */
  30. int Prem ;
  31.  
  32.     /*------------ reste du LOCAL */
  33.  
  34. #define HMENU 22
  35.  
  36. #include "font.h"
  37.  
  38. #define WHELP 45
  39. #define WASCII (WHELP+(2*WITEM-WHELP)/2)
  40.  
  41. #define WITEM (WFONT / 9) 
  42. /* pourquoi 9 : 
  43.    |SOS| ASCII 48 a | Command : ITALIC | First : 12 | Last : 100 | DOIT | 
  44.         1     2          3        4       5       6     7     8     9
  45.  */
  46.  
  47. #define putget 0
  48. #define kill 1
  49. #define anim 2         /* pour le switch de DoIt() */
  50. #define bold 3
  51. #define slant 4
  52. #define scale 5
  53.  
  54.  
  55. static int lifton = 0 ;     /* flag ascenseur en cours */
  56.  
  57. static int Dern  ;
  58.  
  59. static int Resol ;     /* 16,32,64,ou 128 : donne la taille de 
  60.             la fenetre fonte. est modifie par ShowFont ou Put */
  61. static codeputget ;    /* code du dernier car select */
  62.  
  63. static int codecour, codeprec ;/* avec codeputget global, permettent la 
  64.                  gestion du tracking code ascii */
  65. static hfont ;    /* hauteur fenetre */
  66.  
  67. #define XFONT 0
  68. #define YFONT (10+514+10)
  69.  
  70. static int zfont,zhelp,zleft,zright,zlift,
  71.     zascii,zmode,zfirst,zlast,zdoit ; /* id des zones crees */
  72.  
  73. static int Mode ;    /* modifie par le popup */
  74. static int idmode ;
  75. static char * choixmode[]= {"Put/Get","Kill","Animate","Bold",
  76.                 "Slant","Scale",0};
  77. static int idanim ;
  78. static char * choixanim[]= {"Slow","Normal","Quick",0};
  79.  
  80.  
  81.  
  82. /************************* procedure INIT_FONT ***************************/
  83. /* Procedure d'initialisation du module  */
  84. /* la fenetre est cree sans sa zone fonte (ou ya les chars) */
  85.  
  86. void Init_font () 
  87.  
  88.   int i ;
  89.  
  90.     nf_font = w_ouvrir(nf_mono,XFONT,YFONT,WFONT,HFONTMAX,
  91.               "XFEDOR : Font Window",CURS2,
  92.               EnterZone|ButtonPressed|ButtonReleased|
  93.               MoveMouse|LeaveZone,WMON) ;
  94.  
  95.     zascii = w_crzon(nf_font,WHELP,0,2*WITEM,HMENU,CURS2);
  96.     zmode = w_crzon(nf_font,2*WITEM,0,4*WITEM,HMENU,CURS2);
  97.     zfirst = w_crzon(nf_font,4*WITEM,0,6*WITEM,HMENU,CURS2);
  98.     zlast = w_crzon(nf_font,6*WITEM,0,8*WITEM,HMENU,CURS2);
  99.     zdoit = w_crzon(nf_font,8*WITEM,0,WFONT,HMENU,CURS2);
  100.  
  101.     zhelp = w_crzon(nf_font,0,0,WHELP,HMENU,CURS2);
  102.     
  103.     zleft = w_crzon(nf_font,0,HMENU,WSCROLL,HFONT,CURS2);
  104.     zlift = w_crzon(nf_font,WSCROLL,HMENU,WFONT-WSCROLL,HFONT,CURS2);
  105.     zright = w_crzon(nf_font,WFONT-WSCROLL,HMENU,WFONT,HFONT,CURS2);
  106.  
  107.     zfont =  w_crzon(nf_font,0,HFONT,WFONT,HFONTMAX,CURS1);
  108.  
  109.     Mode = putget ;
  110.     First = 0 ; Last = MAXFONTCARD ;
  111.     Prem = 64 ;
  112.  
  113.     for (i=0 ; i<MAXFONTCARD; i++) {
  114.       chartab[i].hsize = 0 ;
  115.     }
  116.  
  117.     w_montrer(nf_font) ;
  118.  
  119.     idmode = MenuCreat(choixmode);
  120.     idanim = MenuCreat(choixanim);
  121. }
  122.  
  123. static Reaffich(pev)
  124.     myEvent * pev ;
  125.  
  126. {      int code, code1, code2 ;
  127.  
  128.     if (pev->window == nf_font) {
  129.  
  130.      w_centrer(nf_font,"Ascii ",WHELP,0,WASCII,HMENU);
  131.      w_centrer(nf_font,"Command :",2*WITEM,0,3*WITEM,HMENU);
  132.      w_centrer(nf_font,"First :",4*WITEM,0,5*WITEM,HMENU);
  133.      w_centrer(nf_font,"Last :",6*WITEM,0,7*WITEM,HMENU);
  134.      w_centrer(nf_font,"DO IT",8*WITEM,0,WFONT,HMENU);
  135.      
  136.      w_line(nf_font,WHELP,0,WHELP,HMENU,ON);
  137.      w_centrer(nf_font,"SOS",0,0,WHELP,HMENU);
  138.  
  139.      w_line(nf_font,2*WITEM,0,2*WITEM,HMENU,ON);
  140.      w_line(nf_font,4*WITEM,0,4*WITEM,HMENU,ON);
  141.      w_line(nf_font,6*WITEM,0,6*WITEM,HMENU,ON);
  142.       w_line(nf_font,8*WITEM,0,8*WITEM,HMENU,ON); 
  143.                     /* barre vertic menu */
  144.  
  145.          w_line(nf_font,0,HMENU,WFONT,HMENU,ON);     
  146.                     /* barre horiz sous menu */
  147.      w_line(nf_font,WSCROLL,HMENU,WSCROLL,HFONT,ON);
  148.                         /* vertic zone left */
  149.      w_line(nf_font,WFONT-WSCROLL,HMENU,WFONT-WSCROLL,HFONT,ON);
  150.                             /*right*/
  151.      ShowArrow(nf_font,HFONT) ;
  152.          
  153.      code1 = Prem + pev->x/Resol ;
  154.      code2 = Prem + (pev->x+pev->xz)/Resol ;
  155.      if ((pev->y+pev->yz) > HFONT)
  156.         for (code=code1; code<=code2; code++) 
  157.         ShowAChar(nf_font,chartab,code,Prem,Dern,
  158.                 Resol,HFONT,hfont,maxup);
  159.          ShowLift(nf_font,ON,Prem,Dern,HFONT) ;
  160.      Aff_mode() ;
  161.      Aff_first() ; 
  162.      Aff_last() ;
  163.     }
  164. }    
  165.  
  166. void ShowDoIt(First,Last)
  167.     int First, Last ;
  168. {    int res ;
  169.     int code ;
  170.  
  171.       res = FontMax_Resize() ;
  172.     /* res = 0 si il n'y a aucune modif de taille dans la police 
  173.        res = 1 si la resolution horizontale doit changer ou la hauteur
  174.                 diminue
  175.        res = 2 si la taille augmente (=> un expose genere) */
  176.     
  177.       if (res == 0) 
  178.       for (code=First; code<=Last; code++) 
  179.         ShowAChar(nf_font,chartab,code,Prem,Dern,
  180.                 Resol,HFONT,hfont,maxup);
  181.        else
  182.       if (res == 1) 
  183.      ShowAFont(nf_font,chartab,Prem,Dern,
  184.            Resol,HFONT,hfont,maxup) ;
  185. }
  186.    
  187. int FontMax_Resize()  
  188.  
  189. {
  190.     int code, res ;
  191.     static old_hfont, old_Resol=32 ;
  192.  
  193.     maxup = maxdown = maxhsize = maxhincr = maxhadj = 0 ;
  194.  
  195.     for (code=0; code < MAXFONTCARD;code++) 
  196.        if (chartab[code].hsize>0) {
  197.         if (chartab[code].up < maxup ) 
  198.             { maxup = chartab[code].up ;    /* up NEGATIF */
  199.               codemaxup = code ;}
  200.         if (chartab[code].down > maxdown ) 
  201.             { maxdown = chartab[code].down ;
  202.               codemaxdown = code ;}
  203.         if (chartab[code].hsize > maxhsize ) 
  204.             { maxhsize = chartab[code].hsize;
  205.               codemaxhsize = code ;}
  206.         if (chartab[code].hincr > maxhincr ) 
  207.             { maxhincr = chartab[code].hincr ;
  208.               codemaxhincr = code ;}
  209.         if (chartab[code].hadj > maxhadj ) 
  210.             { maxhadj = chartab[code].hadj ;
  211.               codemaxhadj = code ;}
  212.     }
  213.     Aff_max() ;
  214.  
  215.     hfont = (((maxdown-maxup)>0)?(maxdown-maxup):32) + 1;
  216.     Resol = New_Resol((maxhsize>0)?maxhsize:32);
  217.  
  218.      if (hfont == old_hfont) {
  219.         if (Resol == old_Resol) res = 0 ; 
  220.         else {
  221.             old_Resol = Resol ;
  222.             ShowLift(nf_font,OFF,Prem,Dern,HFONT) ;
  223.             res = 1 ;
  224.         }
  225.      } else {
  226.         w_resize(nf_font,WFONT,HFONT+hfont);
  227.         w_resize(nf_mono,
  228.              10+100+514+12+10+240+10,       /* Hack */
  229.              10+514+10+22+25+hfont);
  230.         if (hfont > old_hfont) res = 2 ; /* un expose genere */
  231.         else res = 1 ;      /* pas d'expose car bit_gravity */
  232.         old_hfont = hfont ;
  233.         old_Resol = Resol ;
  234.     }        
  235.     Dern = Prem + WFONT / Resol - 1 ;
  236.     return res ;
  237. }
  238.  
  239.  
  240. int New_Resol(val) 
  241.     int val ;
  242. /* rends la resolution entrainee par cette val : 16, 32, 64, 128 */
  243. {
  244.     if (val <= 16) return 16 ; else
  245.     if (val <= 32) return 32 ; else
  246.     if (val <= 64) return 64 ; else return 128 ;
  247. }
  248.  
  249. static PutToFont(code)
  250.     int code ;
  251. {
  252.  
  253.     if ((code < 0) || (code >= MAXFONTCARD)) return ;
  254.     if (chartab[code].hsize > 0 ) {
  255.         FontToGarb(&chartab[code]); 
  256.         Rast_Free(&chartab[code].image) ;
  257.     }
  258.     Rast_Init(&chartab[code].image,
  259.           cartrav.hsize,cartrav.down-cartrav.up,0); 
  260.                                           /* flag = 0 pour depth 1 */
  261.     Rast_Op_n1(cartrav.image,&chartab[code].image,
  262.             Xleft,Baseliney+cartrav.up,
  263.             0,0,
  264.             cartrav.hsize,cartrav.down-cartrav.up,
  265.                 VIDSTR,BackColor);
  266.     CopyCar(&cartrav,&chartab[code]);    /* metrique */
  267.     /* on veut tester si le nom du caractere est valable */
  268.     if (*chartab[code].name == '\0')    
  269.             if ((code <33) || (code >126))
  270.         sprintf(chartab[code].name,"C%d",code) ; else
  271.         sprintf(chartab[code].name,"%c",code) ;
  272.  
  273.     ShowDoIt(code,code);
  274.     codeputget = code ;
  275. }
  276.  
  277.  
  278. static Aff_code(code)
  279.     int code ;
  280. { char s[20] ;
  281.     if (code != -1) {
  282.         sprintf(s,"%d %c",code,code);
  283.         w_centrer(nf_font,s,WASCII,0,2*WITEM,HMENU);
  284.     } else w_centrer(nf_font,"",WASCII,0,2*WITEM,HMENU);
  285. }
  286.  
  287. static void Aff_mode() 
  288. /* affiche le champs Mode dans la fenetre */
  289.     w_centrer(nf_font,choixmode[Mode],3*WITEM,0,4*WITEM,HMENU);
  290. }
  291.  
  292. static void Aff_first()
  293. /* affiche la valeur du first : debut de traitement sur char */
  294. { char s[20] ;
  295.     sprintf(s,"%d",First);
  296.     w_centrer(nf_font,s,5*WITEM,0,6*WITEM,HMENU);
  297. }
  298.  
  299. static void Aff_last()
  300. /* affiche la valeur du Last : fin de traitement sur char */
  301. { char s[20] ;
  302.     sprintf(s,"%d",Last);
  303.     w_centrer(nf_font,s,7*WITEM,0,8*WITEM,HMENU);
  304. }
  305.  
  306.  
  307. static DoIt()
  308. /* First et Last sont connus.
  309.    Mode est connu. */
  310. {
  311.     int rep ;
  312.     static int delay = 0 ;
  313.     int numx,denx,numy,deny ;
  314.  
  315.     switch (Mode) {
  316.     case putget : 
  317.             First = 0 ;
  318.             Last = MAXFONTCARD-1 ;
  319.             Aff_first() ;
  320.             Aff_last();
  321.             break ;
  322.     case slant : Slant();
  323.               break ;    
  324.     case bold   : Bold();
  325.               break ;
  326.     case kill   : Kill(); 
  327.               break ;
  328.     case anim   : 
  329.         rep = MenuPop(idanim,choixanim) ;
  330.         if (w_nosaveunder()) 
  331.           { myEvent e ;
  332.             e.window = nf_font ;
  333.             e.x = WFONT - 2*WITEM ;
  334.             e.y = 0 ;
  335.             e.xz = 2*WITEM ;
  336.             e.yz = HFONTMAX ;
  337.             Reaffich(&e) ;        /* HACK OF THE SHAME */
  338.         }
  339.         switch(rep) {
  340.            case -1 : break ;
  341.            case 0 : delay = 50 ; break ;
  342.            case 1 : delay = 5 ; break ;
  343.            case 2 : delay = 0 ; break ;
  344.         }
  345.         Anim(delay) ;
  346.         break ;
  347.     case scale  : 
  348.       gd_askscale(&numx,&denx,&numy,&deny) ;
  349.       Scale(numx,denx,numy,deny);
  350.           break ;
  351.     default     : break ;
  352.     }
  353. }
  354.  
  355.          
  356.  
  357. static int Traiter_zone(evt)
  358. /* on a recu un click dans la zone */
  359.     myEvent * evt ;
  360. {
  361.     int i ;
  362.  
  363.     if ((evt->zone == zleft) && (evt->click == 1))
  364.         Scroll(nf_font,chartab,LEFT,&Prem,&Dern,
  365.                 Resol,HFONT,hfont,maxup) ; else
  366.     if ((evt->zone == zleft) && (evt->click == 2))
  367.         Scroll(nf_font,chartab,RIGHT,&Prem,&Dern,
  368.                 Resol,HFONT,hfont,maxup) ; else
  369.     if ((evt->zone == zright) && (evt->click == 1))
  370.         Scroll(nf_font,chartab,RIGHT,&Prem,&Dern,
  371.                 Resol,HFONT,hfont,maxup) ; else
  372.     if ((evt->zone == zright) && (evt->click == 2))
  373.         Scroll(nf_font,chartab,LEFT,&Prem,&Dern,
  374.                 Resol,HFONT,hfont,maxup) ; else
  375.     if (evt->zone==zhelp) Helping(FONT) ; else
  376.     if (evt->zone==zmode) {
  377.         i = MenuPop(idmode,choixmode) ; /* 1,2..6 */
  378.         if (i != -1) { 
  379.             Mode = i ;
  380.             Aff_mode();
  381.         }
  382.     } else
  383.     if (evt->zone==zfirst) {
  384.         gd_lireentier("Value for First ?",&First);
  385.         First = (First < 0)? 0 : First ;
  386.         First = (First > MAXFONTCARD)? MAXFONTCARD : First ;
  387.         Aff_first() ; 
  388.     } else
  389.     if (evt->zone==zlast) {
  390.         gd_lireentier("Value for Last ?",&Last);
  391.         Last = (Last < 0)? 0 : Last ;
  392.         Last = (Last > MAXFONTCARD)? MAXFONTCARD : Last ;
  393.         Aff_last() ;
  394.     } else        
  395.     if (evt->zone==zdoit) DoIt() ; else
  396.     if (evt->zone==zlift) {
  397.             lifton = 1 ;
  398.             Shadow(nf_font,evt->x,Prem,Dern,HFONT);
  399.     } else 
  400.     if (evt->zone==zfont) {   
  401.       if (Mode == putget ) {  /* pas de mode courant => PUT et GET */
  402.          switch (evt->click){
  403.         case 1 : if (cartrav.hsize > 0)
  404.                 PutToFont(Prem + evt->x/Resol) ;
  405.              break ;
  406.         case 2 : GetFromaFont(chartab,Prem + evt->x/Resol); 
  407.              break ;
  408.         default : break ;
  409.          }
  410.       } else
  411.          switch (evt->click) {
  412.         case 1 : 
  413.           i = evt->x / Resol + Prem ;
  414.           if ((i >= 0) || (i < MAXFONTCARD)) First = i ;
  415.           Aff_first() ;
  416.           break ;
  417.         case 2 :
  418.           i = evt->x / Resol + Prem ;
  419.           if ((i >= 0) || (i < MAXFONTCARD)) Last = i ;
  420.           Aff_last() ;
  421.           break ;
  422.         default : break ;
  423.          }
  424.     }
  425. }
  426.  
  427.  
  428.  
  429. static int Inverser_zone(zone)
  430.     int zone;
  431. {
  432.     if (zone==zmode) w_inv(nf_font,2*WITEM+2,2,3*WITEM-2,HMENU-2);
  433.                         else
  434.     if (zone==zfirst) w_inv(nf_font,4*WITEM+2,2,5*WITEM-2,HMENU-2);
  435.                         else
  436.     if (zone==zlast) w_inv(nf_font,6*WITEM+2,2,7*WITEM-2,HMENU-2);
  437.                         else
  438.     if (zone==zdoit) w_inv(nf_font,8*WITEM+2,2,WFONT-2,HMENU-2);
  439. }    
  440.  
  441. /*********************** procedure AUTOM_FONT ***************************/ 
  442. /* Des que le controleur detecte l'entree de la souris dans la fenetre,
  443.    il appelle cette procedure */
  444.  
  445. void Autom_font(pev) 
  446.   myEvent * pev ;  
  447. { int code ;    /* pour reaffichage apres scroll ascenseur */
  448.  
  449.   static zonecour = 0 ;
  450.   int xshadow ;
  451.  
  452.   switch (pev->type){
  453.     case Exposure :
  454.         Reaffich(pev);
  455.         if (zonecour) Inverser_zone(zonecour);
  456.         if (lifton) Shadow(nf_font,-1,Prem,Dern,HFONT);
  457.         break ;
  458.     case EnterZone   : 
  459.       if ((pev->zone==zfont)&&(Mode==putget))
  460.         Afficher_boutons("PUT","GET") ; else
  461.       if ((pev->zone==zfont)&&(Mode!=putget)) 
  462.         Afficher_boutons("First","Last") ; else
  463.             if (pev->zone==zhelp) Afficher_boutons("Help","Help") ; else
  464.           if (pev->zone == zlift) {
  465.         Afficher_boutons("Select","Select"); 
  466.         lifton = 1 ;
  467.         Shadow(nf_font,pev->x,Prem,Dern,HFONT);
  468.       } else
  469.       if (pev->zone==zfont) codeprec = codeputget ; else
  470.         Afficher_boutons("Select","Select"); 
  471.  
  472.       Inverser_zone(pev->zone);
  473.       zonecour = pev->zone ;
  474.       break;
  475.     case ButtonPressed :  
  476.       if ((pev->zone != zlift) || (lifton == 0)){
  477.         Traiter_zone(pev);
  478.         break ;
  479.       }    /* no break : meme effet que le release ... SHAME on CODE */
  480.     case ButtonReleased :
  481.       if ((pev->zone==zlift)&&(lifton)) { 
  482.         xshadow = Shadow(nf_font,-1,Prem,Dern,HFONT);
  483.         lifton = 0 ;
  484.         ShowLift(nf_font,OFF,Prem,Dern,HFONT) ;
  485.         Prem = ((xshadow-WSCROLL) * MAXFONTCARD) / WLIFT ;
  486.         Dern = Prem + WFONT/Resol - 1;
  487.         if (Dern >= MAXFONTCARD) Dern = MAXFONTCARD -1 ;
  488.         for (code=Prem ; code <= Dern; code++) 
  489.           ShowAChar(nf_font,chartab,code,Prem,Dern,
  490.             Resol,HFONT,hfont,maxup);
  491.         ShowLift(nf_font,ON,Prem,Dern,HFONT) ;
  492.       }
  493.       break ;        
  494.        case MoveMouse :
  495.         if ((pev->zone==zlift)&&(lifton)) {
  496.             Shadow(nf_font,-1,Prem,Dern,HFONT);
  497.             Shadow(nf_font,pev->x,Prem,Dern,HFONT);
  498.         }
  499.         if (pev->zone==zfont){
  500.             codecour = Prem + (pev->x/Resol) ;
  501.             if ((codeprec != codecour) && (codecour < MAXFONTCARD)) {
  502.                 Aff_code(codecour);
  503.                 codeprec = codecour ;
  504.             }
  505.         }        /* gestion track code ascii */    
  506.         break ;
  507.         case LeaveZone : 
  508.         Inverser_zone(pev->zone);
  509.         zonecour = 0 ;
  510.         if ((pev->zone==zlift)&&(lifton)) {
  511.             Shadow(nf_font,-1,Prem,Dern,HFONT);
  512.             lifton = 0 ;
  513.         }
  514.         if (pev->zone==zfont) Aff_code(codeputget);
  515.         Afficher_boutons("","");
  516.         break ;
  517.     case CloseWindow : break ;                
  518.       }
  519. }
  520.        
  521.