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

  1. /* Copyright 1989 GROUPE BULL -- See licence conditions in file COPYRIGHT */
  2. #include <stdio.h>
  3. extern char * strcpy() ;
  4. extern char * strcat() ;
  5. extern char * getenv() ;
  6.  
  7. #include "clientimage.h"    /* ClientImage pour fedchar */
  8. #include "fedor.h"        /* fedchar */
  9.  
  10. extern fedchar carback,cartrav ;
  11. extern int Baseback, BackLeft,Xleft,Baseliney ;
  12. extern int BackColor, CurColor ;
  13. extern int UnixFileNameMode ;     /* 0 ou 1, initialiser dans main */
  14.  
  15. char * homedir ;         /* utilise aussi dans filer */
  16.  
  17. void Init_bitmap() ;
  18. void SaveBitmap() ;
  19. int LoadBitmap() ;
  20. static int Get_fedchar() ;
  21.  
  22. static char * dirmap ;
  23. static char * newdirmap ;
  24. static char * bitmap_extension = ".xbm" ;
  25. static char * pixmap_extension = ".xpm" ;
  26.  
  27. void Init_bitmap()
  28. /**********/
  29. {
  30.  
  31.     if ((dirmap = getenv("MAP"))==0) 
  32.       if (UnixFileNameMode) dirmap = "." ; else dirmap = "" ;
  33.     if (UnixFileNameMode) {
  34.        newdirmap = (char *)malloc(strlen(dirmap)+2);
  35.        strcpy(newdirmap,dirmap);
  36.        newdirmap[strlen(dirmap)] = '/' ;
  37.        newdirmap[strlen(dirmap)+1] = '\0' ;
  38.        dirmap = newdirmap ;
  39.     }
  40.     if ((homedir = getenv("HOME"))==0) homedir = "" ;
  41. }
  42.  
  43.  
  44. void SaveBitmap(name,flag)
  45. /*******************/
  46.     char * name ;        /* short filename */
  47.     int flag ;        /* 0 ou 1 ou 2 */
  48. {
  49.     char fullname[256],filemouse[256] ;
  50.     ClientImage * forimage, * maskimage ;
  51.  
  52.  
  53.         if (*name == '\0') return ;
  54.         if (cartrav.hsize <= 0) return ;
  55.  
  56.     if (*name == '~') 
  57.       {
  58.         strcpy(fullname,homedir);
  59.         strcat(fullname,(name+1));
  60.     } else
  61.     if (index(name,'/') != 0) strcpy(fullname,name); 
  62.     else {
  63.         strcpy(fullname,dirmap);
  64.                strcat(fullname,name);
  65.     }
  66.  
  67.     if (flag == 1) {        /* sauvegarde souris => 2 fichiers */
  68.         strcpy(filemouse,fullname) ;
  69.         strcat(filemouse,"Fore");
  70.         Rast_Init(&forimage,cartrav.hsize+2,cartrav.down-cartrav.up+2,0);
  71.         Rast_Init(&maskimage,cartrav.hsize+2,cartrav.down-cartrav.up+2,0);
  72.         Rast_Op_n1(cartrav.image,&forimage,
  73.                Xleft,Baseliney+cartrav.up,
  74.                1,1,
  75.                cartrav.hsize,cartrav.down-cartrav.up,
  76.                VIDSTR,BackColor);
  77.         Rast_Op_n1(carback.image,&maskimage,
  78.                BackLeft,Baseback+carback.up,
  79.                0,0,
  80.                cartrav.hsize+2,cartrav.down-cartrav.up+2,
  81.                VIDSTR,BackColor);
  82.         if (!w_writebitmap(filemouse,
  83.               forimage,
  84.               cartrav.hsize+2,cartrav.down-cartrav.up+2,
  85.               -cartrav.hadj,-cartrav.up)) 
  86.             gd_envoyermsg("CAN'T CREAT THE FORE FILE");
  87.  
  88.         strcpy(filemouse,fullname) ;
  89.         strcat(filemouse,"Mask");
  90.         if (!w_writebitmap(filemouse,
  91.               maskimage,
  92.               cartrav.hsize+2,cartrav.down-cartrav.up+2,
  93.               -cartrav.hadj,-cartrav.up))
  94.                         gd_envoyermsg("CAN'T CREAT THE MASK FILE");
  95.         Rast_Free(&forimage);
  96.         Rast_Free(&maskimage);
  97.         } else 
  98.     if (flag == 0) {
  99.         if (!Extension(fullname,bitmap_extension)) {
  100.            strcat(fullname,bitmap_extension);
  101.         }
  102.         Rast_Init(&forimage,cartrav.hsize,cartrav.down-cartrav.up,0);
  103.         Rast_Op_n1(cartrav.image,&forimage,
  104.                Xleft,Baseliney+cartrav.up,
  105.                0,0,
  106.                cartrav.hsize,cartrav.down-cartrav.up,
  107.                VIDSTR,BackColor);
  108.             if (!w_writebitmap(fullname,
  109.                           forimage,
  110.                           cartrav.hsize,cartrav.down-cartrav.up,
  111.                           -cartrav.hadj,-cartrav.up))
  112.                         gd_envoyermsg("CAN'T CREAT THE BITMAP FILE");
  113.         Rast_Free(&forimage);
  114.       } else
  115.        if (flag == 2) {
  116.         if (!Extension(fullname,pixmap_extension)) {
  117.            strcat(fullname,pixmap_extension);
  118.         }
  119.             if (!w_writepixmap(fullname,
  120.                    cartrav.image,
  121.                    Xleft,Baseliney+cartrav.up,
  122.                    cartrav.hsize,cartrav.down-cartrav.up))
  123.                         gd_envoyermsg("CAN'T CREAT THE PIXMAP FILE");
  124.       }  
  125.        
  126.  
  127. }
  128.  
  129.  
  130. int LoadBitmap(name,flag)
  131. /***********************/
  132.         char * name ;           /* short filename */
  133.         int flag ;              /* 0 ou 1 ou 2 selon le format */
  134. {
  135.         char fullname[256],filemouse[256] ;
  136.         int yhot, found;
  137.  
  138.     if (*name == '\0') return 1;
  139.  
  140.     if (*name == '~') 
  141.     {
  142.         strcpy(fullname,homedir);
  143.         strcat(fullname,(name+1));
  144.     } else
  145.     if (index(name,'/') != 0) strcpy(fullname,name); 
  146.     else {
  147.       strcpy(fullname,dirmap);
  148.       strcat(fullname,name);
  149.  
  150.     }
  151.  
  152.         if (flag == 1) {             /* on lit 2 fichiers */
  153.         strcpy(filemouse,fullname) ;
  154.         strcat(filemouse,"Fore");
  155.         Dodo();
  156.         if (Get_fedchar(filemouse,&cartrav,1))
  157.         {
  158.             Xleft = 1;
  159.             Baseliney = 1 - cartrav.up ;
  160.         } else return 0 ;
  161.         strcpy(filemouse,fullname) ;
  162.         strcat(filemouse,"Mask");
  163.         if (Get_fedchar(filemouse,&carback,1))
  164.         {
  165.             BackLeft = 0;
  166.             Baseback = -carback.up ;
  167.         } else return 0 ;
  168.     } else 
  169.     if (flag == 0) {
  170.         Dodo();
  171.         if (!Extension(fullname,bitmap_extension)) {
  172.            strcpy(filemouse,fullname) ;
  173.            strcat(filemouse,bitmap_extension); /* hack but buffer */
  174.            if (Get_fedchar(filemouse,&cartrav,1))
  175.          {
  176.             Xleft = 0;
  177.             Baseliney = -cartrav.up ;
  178.             found = 1 ;
  179.          } else found = 0 ;
  180.         }
  181.         if (!found)
  182.           if (Get_fedchar(fullname,&cartrav,1))
  183.          {
  184.             Xleft = 0;
  185.             Baseliney = -cartrav.up ;
  186.          } else return 0;
  187.     } else
  188.     if (flag == 2) {
  189.         Dodo();
  190.         if (!Extension(fullname,pixmap_extension)) {
  191.            strcpy(filemouse,fullname) ; /* hack: to avoid modifying fullname */
  192.            strcat(filemouse,pixmap_extension); 
  193.            if (Get_fedchar(filemouse,&cartrav,2))
  194.          {
  195.             Xleft = 0;
  196.             Baseliney = -cartrav.up ;
  197.             found = 1 ;
  198.          } else found = 0 ;
  199.         }
  200.         if (!found)
  201.           if (Get_fedchar(fullname,&cartrav,2))
  202.          {
  203.             Xleft = 0;
  204.             Baseliney = -cartrav.up ;
  205.          } else return 0;
  206.       }
  207.     return 1 ;
  208. }
  209.  
  210.  
  211.  
  212. static int 
  213. Get_fedchar(filename,fed,flag)
  214.     char * filename ;
  215.     fedchar * fed ;
  216.     int  flag ;          /* 1 pour bitmap, 2 pour pixmap */
  217. {
  218.     int w,h,xhot,yhot ;
  219.     int status ;
  220.     ClientImage * bimage ;
  221.  
  222.     Rast_Off(&(fed->image),BackColor);
  223.     if (flag == 1) {
  224.       status = w_readbitmap(filename,&bimage,&w,&h,&xhot,&yhot) ;  
  225.       if (status) {
  226.         Rast_Op_1n(bimage,&(fed->image),0,0,0,0,w,h,VIDSTR,CurColor);
  227.         fed->hsize = w ;
  228.         fed->up = -yhot ;
  229.         fed->down = h - yhot ;
  230.         fed->hadj = - xhot ;
  231.         fed->hincr = w ;
  232.         Rast_Free(&bimage);
  233.         return 1 ;
  234.       } else return 0 ;
  235.     } else
  236.     if (flag == 2) {
  237.       status = w_readpixmap(filename,&bimage,&w,&h) ;  
  238.       if (status) {
  239.         Rast_Op(bimage,&(fed->image),0,0,0,0,w,h,VIDSTR,CurColor);
  240.         fed->hsize = w ;
  241.         fed->up = 0 ;
  242.         fed->down = h  ;
  243.         fed->hadj = 0 ;
  244.         fed->hincr = w ;
  245.         Rast_Free(&bimage);
  246.         return 1 ;
  247.       } else return 0 ;
  248.     }
  249.     return 0 ;
  250. }
  251.