home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / gnustuff / tos / progut~1 / stdwin.zoo / bed / bed.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-10-18  |  5.2 KB  |  287 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include "bed.h"
  4. #include "menu.h"
  5.  
  6. #define MINSQRSIZE    5
  7. #define MAXSQRSIZE    15
  8.  
  9. MENU    *pfmenu ;
  10. MENU    *pmmenu ;
  11. MENU    *popmenu ;
  12.  
  13. int    sqrsize ;
  14.  
  15. int    map_width = DEF_COLS ;
  16. int    map_height = DEF_ROWS ;
  17.  
  18. char    *raster = NULL ;
  19. int    raster_lenght ;
  20. int    stride ;
  21.  
  22. int    lastbyte ;
  23. char    bits[] = { 0xFF, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F } ;
  24.  
  25. char    *title = NULL ;
  26. char    *fname = NULL ;
  27.  
  28. WINDOW    *win ;
  29.  
  30. bool    changed = FALSE ;
  31.  
  32. bool    text_only = FALSE ;
  33.  
  34. extern bool    drawline ;
  35.  
  36. extern bool    drawcircle ;
  37.  
  38. extern bool    selrect ;
  39. extern int    sr_left ;
  40. extern int    sr_top ;
  41. extern int    sr_right ;
  42. extern int    sr_bottom ;
  43.  
  44. extern void    invertbit () ;
  45.  
  46. void
  47. drawproc (win, left, top, right, bottom)
  48.     WINDOW    *win ;
  49.     int    left ;
  50.     int    top ;
  51.     int    right ;
  52.     int    bottom ;
  53. {
  54.     int     row ;
  55.     register int     col ;
  56.     register int    l ;
  57.     register int    r ;
  58.     int    t ;
  59.     int    b ;
  60.     int    rend ;
  61.     int fcol, fbyte, fbit, flr ;
  62.  
  63.     if (left < 0) left = 0 ;
  64.     if (right > map_width * sqrsize) right = map_width * sqrsize ;
  65.     if (top < 0) top = 0 ;
  66.     if (bottom > map_height * sqrsize ) bottom = map_height * sqrsize ;
  67.  
  68.     rend = (right+sqrsize-1) / sqrsize ;
  69.  
  70.     fcol = left / sqrsize ;
  71.     flr =  fcol * sqrsize ;
  72.     fbyte = fcol / 8 ;
  73.     fbit = fcol % 8 ;
  74.  
  75.     for (row = top / sqrsize, t = row * sqrsize, b = t + sqrsize ;
  76.          t < bottom ;
  77.          ++row, t += sqrsize, b = t + sqrsize) {
  78.  
  79.         register char    *byte ;
  80.         register int    pbit ;
  81.  
  82.         col    = fcol ;
  83.         l = r    = flr ;
  84.         byte    = raster + (row * stride) + fbyte ;
  85.         pbit    = fbit ;
  86.  
  87.         while (col++ < rend) {
  88.             if (*byte & (1 << pbit)) {
  89.                 r += sqrsize ;
  90.             }
  91.             else {
  92.                 if (l < r) {
  93.                     wpaint(l, t, r, b);
  94.                     l = r ;
  95.                 }
  96.                 l += sqrsize ;
  97.                 r = l ;
  98.             }
  99.  
  100.             if (++pbit >= 8) {
  101.                 pbit = 0 ;
  102.                 ++byte ;
  103.             }
  104.         }
  105.  
  106.         if (l < r) wpaint (l, t, r, b) ;
  107.     }
  108.  
  109.     if (drawline) plotline (invertbit, TRUE) ;
  110.     else if (drawcircle) plotline (invertbit, TRUE) ;
  111.     else if (selrect)
  112.         wxorrect (sr_left * sqrsize, sr_top * sqrsize,
  113.             sr_right * sqrsize, sr_bottom * sqrsize) ;
  114. }
  115.  
  116. void
  117. newraster ()
  118. {
  119.     int    i ;
  120.  
  121.     if (raster != NULL) {
  122.         free (raster) ;
  123.         raster = NULL ;
  124.     }
  125.  
  126.     lastbyte = map_width % 8 ;
  127.     stride = (map_width + 7) / 8 ;
  128.     raster_lenght = stride * map_height ;
  129.  
  130.     raster = (char *) malloc ((size_t)raster_lenght) ;
  131.     if (raster == NULL) {
  132.         wdone () ;
  133.         fprintf (stderr, "cannot get enough memory\n") ;
  134.         exit (1) ;
  135.     }
  136.  
  137.     for (i = 0 ; i < raster_lenght ; ++i)
  138.         raster[i] = 0 ;
  139. }
  140.  
  141. void
  142. setsqrsize ()
  143. {    
  144.     if (wlineheight () == 1)
  145.         text_only = sqrsize = 1 ;
  146.     else {
  147.         sqrsize = 1 ;
  148.     /*    int    width ;
  149.         int    height ;
  150.         int    swidth ;
  151.         int    sheight ;
  152.  
  153.         wgetscrsize (&width, &height) ;
  154.  
  155.         swidth = (2 * width) / (3 * map_width) ;
  156.         sheight = (2 * height) / (3 * map_height) ;
  157.         sqrsize = swidth < sheight ? swidth : sheight ;
  158.         if (sqrsize < MINSQRSIZE)
  159.             sqrsize = MINSQRSIZE ;
  160.         else if (sqrsize > MAXSQRSIZE)
  161.             sqrsize = MAXSQRSIZE ;
  162.     */
  163.     }
  164. }
  165.  
  166. void
  167. setup()
  168. {
  169.     int    i ;
  170.  
  171.     setsqrsize () ;
  172.  
  173.     wsetdefwinsize (map_width * sqrsize, map_height * sqrsize) ;
  174.     
  175.     win = wopen (title == NULL ? "Untitled" : title, drawproc) ;
  176.     if (win == NULL) {
  177.         wmessage ("Can't open window") ;
  178.         return ;
  179.     }
  180.  
  181.     wsetdocsize (win, map_width * sqrsize, map_height * sqrsize) ;
  182.     
  183.     pfmenu = wmenucreate(FILE_MENU, "File"); 
  184.     wmenuadditem (pfmenu, "Open", 'O') ;
  185.     wmenuadditem (pfmenu, "New", 'N') ;
  186.     wmenuadditem (pfmenu, "", -1) ;
  187.     wmenuadditem (pfmenu, "Save", 'S') ;
  188.     wmenuadditem (pfmenu, "Save As ...", -1) ;
  189.     wmenuadditem (pfmenu, "", -1) ;
  190.     wmenuadditem (pfmenu, "Quit", 'Q') ;
  191.  
  192.     pmmenu = wmenucreate (MODE_MENU, "Mode") ;
  193.     wmenuadditem (pmmenu, "Pencil", -1) ;
  194.     wmenuadditem (pmmenu, "Line", -1) ;
  195.     wmenuadditem (pmmenu, "Circle", -1) ;
  196.     wmenuadditem (pmmenu, "Select", -1) ;
  197.  
  198.     popmenu = wmenucreate(OP_MENU, "Operations") ;
  199.     wmenuadditem (popmenu, "Clear bits", -1) ;
  200.     wmenuadditem (popmenu, "Set bits", -1) ;
  201.     wmenuadditem (popmenu, "Invert bits", -1) ;
  202.     wmenuadditem (popmenu, "", -1) ;
  203.     wmenuadditem (popmenu, "Transpose major", -1) ;
  204.     wmenuadditem (popmenu, "Transpose minor", -1) ;
  205.     wmenuadditem (popmenu, "Rotate left", -1) ;
  206.     wmenuadditem (popmenu, "Rotate right", -1) ;
  207.     wmenuadditem (popmenu, "Flip horizontal", -1) ;
  208.     wmenuadditem (popmenu, "Flip vertical", -1) ;
  209.     wmenuadditem (popmenu, "Zoom in", '+') ;
  210.     wmenuadditem (popmenu, "Zoom out", '-') ;
  211.  
  212.     wmenucheck (pmmenu, PENCIL_ITEM, TRUE) ;
  213.  
  214.     for (i = TRANS_MAJ_ITEM ; i <= FLIP_VERT_ITEM ; i++)
  215.         wmenuenable (popmenu, i, FALSE) ;
  216. }
  217.  
  218. void
  219. mainloop ()
  220. {
  221.     for (;;) {
  222.         EVENT    e ;
  223.     
  224.         wgetevent (&e) ;
  225.         switch (e.type) {
  226.         case WE_MOUSE_DOWN :
  227.         case WE_MOUSE_MOVE :
  228.         case WE_MOUSE_UP :
  229.             do_mouse (&e) ;
  230.             break;
  231.         case WE_COMMAND :
  232.             switch (e.u.command) {
  233.             case WC_CLOSE :
  234.                 if (do_quit ())
  235.                     return ;
  236.                 break ;
  237.             case WC_CANCEL :
  238.                 return ;
  239.             }
  240.             break ;
  241.         case WE_MENU :
  242.             switch (e.u.m.id) {
  243.             case FILE_MENU :
  244.                 if (do_file_menu (&e))
  245.                     return ;
  246.                 break ;
  247.             case MODE_MENU :
  248.                 do_mode_menu (&e) ;
  249.                 break ;
  250.             case OP_MENU :
  251.                 do_op_menu (&e) ;
  252.                 break ;
  253.             }
  254.             break ;
  255.         }
  256.     }
  257. }
  258.  
  259. main (argc, argv)
  260.     int    argc ;
  261.     char    *argv[] ;
  262. {
  263.     extern char    *strip () ;
  264.  
  265.     winitnew (&argc, &argv) ;
  266.     
  267.     if (argc > 1) {
  268.         fname = strdup (argv[1]) ;
  269.         title = strip (fname) ;
  270.         if (!readbitmap ()) {
  271.             free (fname) ;
  272.             fname = title = NULL ;
  273.             newraster () ;
  274.         }
  275.     }
  276.     else
  277.         newraster () ;
  278.  
  279.     setup () ;
  280.  
  281.     mainloop () ;
  282.  
  283.     wdone () ;
  284.  
  285.     exit (0) ;
  286. }
  287.