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

  1. /* Copyright 1989 GROUPE BULL -- See licence conditions in file COPYRIGHT */
  2. #include <stdio.h>
  3. #include "clientimage.h"  /* ClientImage pour fedor.h  */
  4. #include "couche.h"      /*  CURS2 */
  5. #include "fedor.h"      /* fedchar .. MAXFONTCARD */
  6.  
  7. extern root ;
  8. extern fedchar cartrav ;    /* depuis tr_edit */
  9. extern int Baseliney,Xleft ;        /* depuis tr_edit */
  10. extern int BackColor, CurColor ;
  11.  
  12. void Init_extrafont();
  13. void Extra_Resize() ;
  14. void Autom_extrafont();
  15.  
  16. void ShowArrow();      
  17. void ShowAChar() ;
  18. void Scroll(); 
  19. void ShowLift();        /* pour la fentre fonte principale */
  20. int Shadow() ;
  21. void ShowAFont() ;
  22. void GetFromaFont() ;
  23.  
  24. int nf_extrafont ;   /* NUMERO DE LA FENETRE FONTE */      
  25.  
  26. fedchar extratab[MAXFONTCARD];    /* pour filer GetFont */
  27.  
  28. int PremExtra ; 
  29.  
  30.     /*------------ reste du LOCAL */
  31. #define HMENU 0 
  32. #include "font.h"
  33.  
  34. #define XFONT 0
  35. #define YFONT (10+514+10+22+25+128)
  36.  
  37. static int zfont,zleft,zright,zlift ;
  38.  
  39. static int maxup ;
  40.  
  41. static int lifton = 0 ;     /* flag ascenseur en cours */
  42.  
  43. static int Dern  ;        /* indice dans extratab */
  44.  
  45. static int Resol ;         /* 16,32,64,ou 128 */
  46.                    
  47. static hfont ;            /* hauteur zone fonte */
  48.  
  49. static int barlift ;
  50.  
  51. void Init_extrafont () 
  52. /***************/
  53.     nf_extrafont = w_ouvrir(root,XFONT,YFONT,WFONT,HFONTMAX,
  54.                  "xfedor_extra",CURS2,
  55.                  EnterZone|ButtonPressed|ButtonReleased|
  56.                  MoveMouse|LeaveZone,WMON) ;
  57.  
  58.     zleft = w_crzon(nf_extrafont,0,0,WSCROLL,HFONT,CURS2);
  59.     zlift = w_crzon(nf_extrafont,WSCROLL,0,WFONT-WSCROLL,HFONT,CURS2);
  60.     zright = w_crzon(nf_extrafont,WFONT-WSCROLL,0,WFONT,HFONT,CURS2);
  61.  
  62.     zfont =  w_crzon(nf_extrafont,0,HFONT,WFONT,HFONTMAX,CURS1);
  63. }
  64.  
  65. static Reaffich(fen) 
  66. int fen ;
  67. {
  68.     if (fen == nf_extrafont) {
  69.       w_clear(nf_extrafont);
  70.       w_line(nf_extrafont,WSCROLL,0,WSCROLL,HFONT,ON);
  71.       w_line(nf_extrafont,WFONT-WSCROLL,0,WFONT-WSCROLL,HFONT,ON);
  72.  
  73.       ShowArrow(nf_extrafont,HFONT) ;
  74.       ShowAFont(nf_extrafont,extratab,PremExtra,
  75.         Dern,Resol,HFONT,hfont,maxup) ; 
  76.         /* valeurs calculees par Extra_Resize dans GetExtraFont */
  77.     }
  78. }    
  79.    
  80.  
  81. void ShowArrow(nf,Hfen)
  82. /*-------------*/
  83.     int nf ;
  84.     int Hfen ;    
  85. {    int x ,y ;
  86.  
  87.     x = (WSCROLL - left_width)/2 ;
  88.     y = Hfen - (HSCROLL +left_height)/2 ;
  89.         w_pixel(nf,left_bits,x,y,left_width,left_height);
  90.         w_pixel(nf,right_bits,WFONT-WSCROLL+x,y,right_width,right_height);
  91. }
  92.  
  93. void ShowAChar(nf,tabchar,code,Prem,Dern,Resol,Hfen,hfont,maxup)
  94. /*-------------*/
  95.     int nf ;    /* fenetre */
  96.     fedchar * tabchar ;    /* tableau ou sont les car */
  97.     int code ;    /* indice dans tabchar du car a afficher */
  98.     int Prem,Dern ; /* indice du premier et dernier visibles */
  99.     int Resol ;    /* 16, 32, 64, 128 */
  100.     int Hfen ;    /* ordonnee origine zone fonte */
  101.     int hfont ;    /* taille reelle zone fonte */
  102.     int maxup ;    /* max dans tabchar.up */
  103.  
  104. {    int xcode ;
  105.  
  106.     if ( (code < Prem) || (code > Dern)) return; /* invisible ? */
  107.     
  108.     xcode = (code - Prem) * Resol ;
  109.     
  110.     if (tabchar[code].hsize <= 0)    
  111.             w_gris(nf,xcode,Hfen+1,xcode+Resol,Hfen+hfont);
  112.     else {       w_cleararea(nf,xcode,Hfen+1,xcode+Resol,Hfen+hfont);
  113.           w_bitblt(nf,tabchar[code].image,
  114.             0,0,tabchar[code].hsize,
  115.             tabchar[code].down-tabchar[code].up,
  116.             xcode+(Resol-tabchar[code].hsize)/2,
  117.             Hfen-maxup+tabchar[code].up+1);
  118.         }    
  119.     w_line(nf,xcode,Hfen,xcode+Resol,Hfen,ON);  
  120.     w_line(nf,xcode,Hfen,xcode,Hfen+hfont,ON);
  121. }
  122.  
  123.  
  124. void Scroll(nf,tabchar,dir,Prem,Dern,Resol,Hfen,hfont,maxup)
  125. /*-------------*/
  126.     int nf ;    /* fenetre */
  127.     fedchar * tabchar ;    /* tableau ou sont les car */
  128.     int dir ;    /* LEFT ou RIGHT  */
  129.     int *Prem,*Dern ; /* indice du premier et dernier visibles */
  130.     int Resol ;    /* 16, 32, 64, 128 */
  131.     int Hfen ;    /* ordonnee origine zone fonte */
  132.     int hfont ;    /* taille reelle zone fonte */
  133.     int maxup ;    /* max dans tabchar.up */
  134. {
  135.     int xsrc,ysrc,xdest,ydest ;
  136.     int l,h;
  137.         
  138.     xsrc = xdest = -1; ysrc = ydest = Hfen ; 
  139.     ShowLift(nf,OFF,*Prem,*Dern,Hfen) ;
  140.     if (dir == RIGHT) {
  141.         if (*Dern < MAXFONTCARD - 1) {
  142.             (*Prem)++; (*Dern)++;
  143.             xsrc +=  Resol  ;
  144.         }
  145.     } else 
  146.      if (*Prem > 0) {
  147.         (*Prem)-- ; (*Dern)--;
  148.         xdest += Resol  ;
  149.     }
  150.     /* decaler tous les caracteres  */
  151.     w_rastop(nf,nf,xsrc, ysrc, (*Dern - *Prem)*Resol,hfont,xdest, ydest);
  152.     /* Afficher le caractere */    
  153.         ShowAChar(nf,tabchar,(dir == RIGHT) ? *Dern : *Prem,
  154.             *Prem,*Dern,Resol,Hfen,hfont,maxup);
  155.     ShowLift(nf,ON,*Prem,*Dern,Hfen) ;
  156. }
  157.  
  158. void ShowLift(nf,onoff, Prem, Dern, Hfen)
  159. /*-------------*/
  160.     int nf ;    /* fenetre */
  161.     int onoff;
  162.     int Prem,Dern ; /* indice du premier et dernier visibles */
  163.     int Hfen ;    /* ordonnee origine zone fonte */
  164. {
  165.     int xliftpos  ;    /* position ascenseur */
  166.     int barlift ;
  167.  
  168.     barlift = (WLIFT*(Dern - Prem))/MAXFONTCARD ;    /* largeur barre ascenceur */
  169.     xliftpos = WSCROLL + (Prem * WLIFT)/MAXFONTCARD + 1 ;
  170.     if (onoff == ON)
  171.           w_gris(nf,xliftpos ,Hfen - HSCROLL + 2,xliftpos + barlift, 
  172.                 Hfen  - 2);
  173.         else       w_cleararea(nf,xliftpos ,Hfen - HSCROLL+ 2,
  174.                 xliftpos + barlift, Hfen - 2);
  175.     
  176. }
  177.  
  178.  
  179. int Shadow(nf,x,Prem, Dern, Hfen)
  180. /*-------------*/
  181.     int nf ;    /* fenetre */
  182.     int x ;
  183.     int Prem,Dern ; /* indice du premier et dernier visibles */
  184.     int Hfen ;    /* ordonnee origine zone fonte */
  185.  
  186. /* soit x=-1 et on efface l'ascenseur a l'ex shadow
  187.    sinon on trace un nouvel ascenseur en fonction de x */
  188. /* rends l'abcisse de l'ascenceur corrige pour la limite WLIFT */
  189. {
  190.     static xshadow ;
  191.  
  192.      if ( x > 0) {
  193.         xshadow = x;
  194.         barlift = (WLIFT*(Dern - Prem))/MAXFONTCARD ;
  195.         if ((xshadow + barlift ) > WLIFT)
  196.             xshadow = WLIFT - barlift - 1;
  197.         xshadow += WSCROLL;
  198.     }
  199.     w_inv(nf,xshadow,Hfen-HSCROLL+2,xshadow + barlift,Hfen-2) ;
  200.     return xshadow ;
  201. }
  202.  
  203.  
  204.          
  205. void Extra_Resize()
  206. /* calcule maxup, hfont et Resol */
  207. {
  208.     int code ;
  209.     int maxdown,maxhsize ;
  210.     static int old_hfont ;
  211.  
  212.     maxup = maxdown = maxhsize = 0 ;
  213.     for (code=0; code < MAXFONTCARD; code++) 
  214.        if (extratab[code].hsize > 0) {
  215.         if (extratab[code].up < maxup ) 
  216.             maxup = extratab[code].up ;
  217.         if (extratab[code].down > maxdown ) 
  218.             maxdown = extratab[code].down ;
  219.         if (extratab[code].hsize > maxhsize ) 
  220.             maxhsize = extratab[code].hsize;
  221.        }
  222.  
  223.     hfont = (((maxdown-maxup)>0)?(maxdown-maxup):32) + 1;
  224.     Resol = New_Resol((maxhsize>0)?maxhsize:32);
  225.     Dern = PremExtra + WFONT / Resol - 1 ;
  226.     w_resize(nf_extrafont,WFONT,HFONT+hfont);
  227.     if (hfont <= old_hfont) Reaffich(nf_extrafont); 
  228.     old_hfont = hfont ;
  229. }
  230.  
  231. void ShowAFont(nf,tabchar,Prem,Dern,Resol,Hfen,hfont,maxup)
  232. /*-------------*/
  233.     int nf ;    /* fenetre */
  234.     fedchar * tabchar ;    /* tableau ou sont les car */
  235.     int Prem,Dern ; /* indice du premier et dernier visibles */
  236.     int Resol ;    /* 16, 32, 64, 128 */
  237.     int Hfen ;    /* ordonnee origine zone fonte */
  238.     int hfont ;    /* taille reelle zone fonte */
  239.     int maxup ;    /* max dans tabchar.up */
  240.  
  241. {    int code;
  242.  
  243.     for (code = Prem ; code <= Dern ; code++) 
  244.         ShowAChar(nf,tabchar,code,Prem,Dern,Resol,
  245.                 Hfen,hfont,maxup);
  246.     ShowLift(nf,ON,Prem,Dern,Hfen) ;
  247.  
  248. }
  249.  
  250. void GetFromaFont(tabchar,code)
  251. /*-------------*/
  252.     fedchar * tabchar ;
  253.     int code ;            /* code dans tabchar */
  254. {
  255.     if ( (code >= 0) && (code < MAXFONTCARD) && 
  256.         (tabchar[code].hsize > 0 )) {
  257.             Dodo(); 
  258.         CopyCar(&tabchar[code],&cartrav);
  259.         Xleft = 0 ;
  260.         Baseliney = - cartrav.up ;
  261.         if (Baseliney < 0) Baseliney = 0 ;
  262.         Rast_Off(&cartrav.image,BackColor) ;
  263.         Rast_Op_1n(tabchar[code].image,&cartrav.image,
  264.             0,0,
  265.             Xleft,Baseliney+cartrav.up,
  266.             cartrav.hsize,cartrav.down-cartrav.up,
  267.             VIDSTR,CurColor);
  268.         MontrerCarTrav();
  269.     }
  270. }
  271.  
  272.  
  273. static int Traiter_zone(evt)
  274. /* on a recu un click dans la zone */
  275.     myEvent * evt ;
  276. {
  277.     int i ;
  278.  
  279.     if ((evt->zone == zleft) && (evt->click == 1))
  280.         Scroll(nf_extrafont,extratab,LEFT,&PremExtra,&Dern,
  281.                 Resol,HFONT,hfont,maxup) ; else
  282.     if ((evt->zone == zleft) && (evt->click == 2))
  283.         Scroll(nf_extrafont,extratab,RIGHT,&PremExtra,&Dern,
  284.                 Resol,HFONT,hfont,maxup) ; else
  285.     if ((evt->zone == zright) && (evt->click == 1))
  286.         Scroll(nf_extrafont,extratab,RIGHT,&PremExtra,&Dern,
  287.                 Resol,HFONT,hfont,maxup) ; else
  288.     if ((evt->zone == zright) && (evt->click == 2))
  289.         Scroll(nf_extrafont,extratab,LEFT,&PremExtra,&Dern,
  290.                 Resol,HFONT,hfont,maxup) ; else
  291.     if (evt->zone == zlift) {
  292.       lifton = 1 ;
  293.       Shadow(nf_extrafont,evt->x,PremExtra,Dern,HFONT);
  294.     } else
  295.     if (evt->zone == zfont)  
  296.       GetFromaFont(extratab,PremExtra + evt->x/Resol); 
  297. }
  298.  
  299. /*********************** procedure AUTOM_EXTRAFONT ***********************/ 
  300. /* Des que le controleur detecte l'entree de la souris dans la fenetre,
  301.    il appelle cette procedure */
  302.  
  303. void Autom_extrafont(pev) 
  304.   myEvent * pev ;  
  305. {
  306.   int code ;    /* pour reaffichage apres scroll ascenseur */
  307.   int xshadow ;
  308.  
  309.   switch (pev->type){
  310.     case Exposure :
  311.         Reaffich(pev->window) ;
  312.         if (lifton) Shadow(nf_extrafont,-1,PremExtra,Dern,HFONT);
  313.         break ;
  314.     case EnterZone   : 
  315.       if (pev->zone==zfont) Afficher_boutons("GET","GET") ; else
  316.       if (pev->zone == zlift) {
  317.         Afficher_boutons("Select","Select"); 
  318.         lifton = 1 ;
  319.         Shadow(nf_extrafont,pev->x,PremExtra,Dern,HFONT);
  320.       } else Afficher_boutons("Select","Select"); 
  321.        break ;
  322.     case ButtonPressed :  
  323.       if ((pev->zone != zlift) || (lifton == 0)){
  324.         Traiter_zone(pev);
  325.         break ;
  326.       }    /* no break : meme effet que le release ... SHAME on CODE */
  327.      case ButtonReleased :
  328.       if ((pev->zone==zlift)&&(lifton)) { 
  329.         xshadow = Shadow(nf_extrafont,-1,PremExtra,Dern,HFONT);
  330.         /* efface l'ascenseur courant et recupere xshadow */
  331.         lifton = 0 ;
  332.         ShowLift(nf_extrafont,OFF,PremExtra,Dern,HFONT) ;
  333.         xshadow -= WSCROLL ;
  334.         PremExtra = (xshadow * MAXFONTCARD) / WLIFT ;
  335.         Dern = PremExtra + WFONT/Resol - 1;
  336.         if (Dern >= MAXFONTCARD) Dern = MAXFONTCARD -1 ;
  337.         for (code=PremExtra ; code <= Dern ; code++) 
  338.           ShowAChar(nf_extrafont,extratab,code,
  339.             PremExtra,Dern,Resol,
  340.             HFONT,hfont,maxup);
  341.         ShowLift(nf_extrafont,ON,PremExtra,Dern,HFONT) ;
  342.       }
  343.       break ;        
  344.        case MoveMouse :
  345.         if ((pev->zone==zlift)&&(lifton)) {
  346.             Shadow(nf_extrafont,-1,PremExtra,Dern,HFONT);
  347.             Shadow(nf_extrafont,pev->x,PremExtra,Dern,HFONT);
  348.         }
  349.         break ;
  350.         case LeaveZone : 
  351.         if ((pev->zone==zlift)&&(lifton)) {
  352.             Shadow(nf_extrafont,-1,PremExtra,Dern,HFONT);
  353.             lifton = 0 ;
  354.         }
  355.         Afficher_boutons("","");
  356.         break ;
  357.     case CloseWindow :
  358.         w_cacher(pev->window); //ET: not sure if this is enough...
  359.         break;
  360.       }
  361. }
  362.             
  363.