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 / opmenu.c < prev   
Encoding:
C/C++ Source or Header  |  1989-10-18  |  7.3 KB  |  410 lines

  1. #include "bed.h"
  2. #include "menu.h"
  3.  
  4. extern int    sqrsize ;
  5.  
  6. extern int    map_width ;
  7. extern int    map_height ;
  8.  
  9. extern char    *raster ;
  10. extern int    raster_lenght ;
  11. extern int    stride ;
  12.  
  13. static int    bits[] = { 0xFF, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F } ;
  14. extern int    lastbyte ;
  15.  
  16. extern WINDOW    *win ;
  17.  
  18. extern bool    changed ;
  19.  
  20. extern bool    selrect ;
  21. extern int    sr_left ;
  22. extern int    sr_top ;
  23. extern int    sr_right ;
  24. extern int    sr_bottom ;
  25.  
  26. /* Data manipulation routines */
  27.  
  28. void
  29. clear_bits()
  30. {
  31.     register int    row ;
  32.  
  33.     if (!selrect) {
  34.         sr_left = sr_top = 0 ;
  35.         sr_right = map_width ;
  36.         sr_bottom = map_height ;
  37.     }
  38.  
  39.     for (row = sr_top ; row < sr_bottom ; ++row) {
  40.         register int    col = sr_left ;
  41.         register char    *byte = raster + (row * stride) + (col / 8) ;
  42.         register int    pbit = col % 8 ;
  43.  
  44.         while (col++ < sr_right) {
  45.             *byte &= ~(1 << pbit) ;
  46.  
  47.             if (++pbit >= 8) {
  48.                 pbit = 0 ;
  49.                 ++byte ;
  50.             }
  51.         }
  52.     }
  53.  
  54.     wchange (win, sr_left * sqrsize, sr_top * sqrsize,
  55.         sr_right * sqrsize, sr_bottom * sqrsize) ;
  56.  
  57.     changed = TRUE ;
  58. }
  59.  
  60. void
  61. set_bits()
  62. {
  63.     register int    row ;
  64.  
  65.     if (!selrect) {
  66.         sr_left = sr_top = 0 ;
  67.         sr_right = map_width ;
  68.         sr_bottom = map_height ;
  69.     }
  70.  
  71.     for (row = sr_top ; row < sr_bottom ; ++row) {
  72.         register int    col = sr_left ;
  73.         register char    *byte = raster + (row * stride) + (col / 8) ;
  74.         register int    pbit = col % 8 ;
  75.  
  76.         while (col++ < sr_right) {
  77.             *byte |= (1 << pbit) ;
  78.  
  79.             if (++pbit >= 8) {
  80.                 pbit = 0 ;
  81.                 ++byte ;
  82.             }
  83.         }
  84.     }
  85.  
  86.     wchange (win, sr_left * sqrsize, sr_top * sqrsize,
  87.         sr_right * sqrsize, sr_bottom * sqrsize) ;
  88.  
  89.     changed = TRUE ;
  90. }
  91.  
  92. void
  93. invert_bits()
  94. {
  95.     register int    row ;
  96.  
  97.     if (!selrect) {
  98.         sr_left = sr_top = 0 ;
  99.         sr_right = map_width ;
  100.         sr_bottom = map_height ;
  101.     }
  102.  
  103.     for (row = sr_top ; row < sr_bottom ; ++row) {
  104.         register int    col = sr_left ;
  105.         register char    *byte = raster + (row * stride) + (col / 8) ;
  106.         register int    pbit = col % 8 ;
  107.  
  108.         while (col++ < sr_right) {
  109.             *byte ^= (1 << pbit) ;
  110.  
  111.             if (++pbit >= 8) {
  112.                 pbit = 0 ;
  113.                 ++byte ;
  114.             }
  115.         }
  116.     }
  117.  
  118.     wchange (win, sr_left * sqrsize, sr_top * sqrsize,
  119.         sr_right * sqrsize, sr_bottom * sqrsize) ;
  120.  
  121.     changed = TRUE ;
  122. }
  123.  
  124. int
  125. transpose_major()
  126. {
  127.     int    i ;
  128.     int    j ;
  129.     int    tmp ;
  130.  
  131.     if (selrect) {
  132.         if (sr_right - sr_left != sr_bottom - sr_top) {
  133.             wfleep () ;
  134.             wmessage ("You can only transpose a square") ;
  135.             return ;
  136.         }
  137.  
  138.         for (i = 0 ; i < sr_bottom - sr_top ; ++i) {
  139.             for (j = 0 ; j < i ; ++j) {
  140.                 int    row = i + sr_top ;
  141.                 int    col = j + sr_left ;
  142.     
  143.                 tmp = getbit (col, row) ;
  144.                 setbit (col, row, getbit (i + sr_left,
  145.                                 j + sr_top)) ;
  146.                 setbit (i + sr_left, j + sr_top, tmp) ;
  147.             }
  148.         }
  149.  
  150.         wchange (win, sr_left * sqrsize, sr_top * sqrsize,
  151.             sr_right * sqrsize, sr_bottom * sqrsize) ;
  152.  
  153.         changed = TRUE ;
  154.     }
  155.     else
  156.         wfleep () ;
  157. }
  158.  
  159. void
  160. transpose_minor ()
  161. {
  162.     int    size ;
  163.     int    i ;
  164.     int    j ;
  165.     int    tmp ;
  166.  
  167.     if (selrect) {
  168.         if (sr_bottom - sr_top != sr_right - sr_left) {
  169.             wfleep () ;
  170.             wmessage ("You can only transpose a square") ;
  171.             return ;
  172.         }
  173.  
  174.         size = sr_bottom - sr_top ;
  175.  
  176.         for (i = 0 ; i < size ; ++i) {
  177.             for (j = 0 ; j < size - 1 - i ; ++j) {
  178.                 tmp = getbit (j + sr_left, i + sr_top) ;
  179.                 setbit (j + sr_left, i + sr_top,
  180.                     getbit (size - 1 - i + sr_left,
  181.                         size - 1 - j + sr_top)) ;
  182.                 setbit (size - 1 - i + sr_left,
  183.                     size - 1 - j + sr_top, tmp) ;
  184.             }
  185.         }
  186.  
  187.         wchange (win, sr_left * sqrsize, sr_top * sqrsize,
  188.             sr_right * sqrsize, sr_bottom * sqrsize) ;
  189.  
  190.         changed = TRUE ;
  191.     }
  192.     else
  193.         wfleep () ;
  194.  
  195. }
  196.  
  197. int
  198. rotate_left()
  199. {
  200.     int    i ;
  201.     int    j ;
  202.     int    size ;
  203.     int    tmp ;
  204.  
  205.     if (selrect) {
  206.         if (sr_bottom - sr_top != sr_right - sr_left) {
  207.             wfleep () ;
  208.             wmessage ("You can only rotate a square") ;
  209.             return ;    
  210.         }
  211.  
  212.         size = sr_bottom - sr_top ;
  213.  
  214.         for (i = 0 ; i < size / 2 ; ++i) {
  215.             for (j = 0 ; j < (size + 1) / 2 ; ++j) {
  216.                 tmp = getbit (j + sr_left, i + sr_top) ;
  217.                 setbit (j + sr_left, i + sr_top,
  218.                     getbit (size - 1 - i + sr_left,
  219.                         j + sr_top)) ;
  220.                 setbit (size - 1 - i + sr_left, j + sr_top,
  221.                     getbit (size - 1 - j + sr_left,
  222.                         size - 1 - i + sr_top)) ;
  223.                 setbit (size - 1 - j + sr_left,
  224.                     size - 1 - i + sr_top,
  225.                     getbit (i + sr_left,
  226.                         size - 1 - j + sr_top)) ;
  227.                 setbit (i + sr_left, size - 1 - j + sr_top,
  228.                     tmp) ;
  229.             }
  230.         }
  231.  
  232.         wchange (win, sr_left * sqrsize, sr_top * sqrsize,
  233.             sr_right * sqrsize, sr_bottom * sqrsize) ;
  234.  
  235.         changed = TRUE ;
  236.     }
  237.     else
  238.         wfleep () ;
  239. }
  240.  
  241. void
  242. rotate_right()
  243. {
  244.     int    i ;
  245.     int    j ;
  246.     int    size ;
  247.     int    tmp ;
  248.  
  249.     if (selrect) {
  250.         if (sr_bottom - sr_top != sr_right - sr_left) {
  251.             wfleep () ;
  252.             wmessage ("You can only rotate a square") ;
  253.             return ;
  254.         }
  255.  
  256.         size = sr_bottom - sr_top ;
  257.  
  258.         for (i = 0 ; i < size / 2 ; ++i) {
  259.             for (j = 0 ; j < (size + 1) / 2 ; ++j) {
  260.                 tmp = getbit (j + sr_left, i + sr_top) ; 
  261.                 setbit (j + sr_left, i + sr_top,
  262.                     getbit (i + sr_left,
  263.                         size - 1 - j + sr_top)) ;
  264.                 setbit (i + sr_left, size - 1 - j + sr_top,
  265.                     getbit (size - 1 - j + sr_left,
  266.                         size - 1 - i + sr_top)) ;
  267.                 setbit (size - 1 - j + sr_left,
  268.                     size - 1 - i + sr_top,
  269.                     getbit (size - 1 - i + sr_left,
  270.                         j + sr_top)) ;
  271.                 setbit (size - 1 - i + sr_left, j + sr_top,
  272.                     tmp) ;
  273.             }
  274.         }
  275.  
  276.         wchange (win, sr_left * sqrsize, sr_top * sqrsize,
  277.             sr_right * sqrsize, sr_bottom * sqrsize) ;
  278.  
  279.         changed = TRUE ;
  280.     }
  281. }
  282.  
  283. void
  284. flip_horizontal()
  285. {
  286.     int    i ;
  287.     int    j ;
  288.     int    sr_width ;
  289.     int    sr_height ;
  290.     int    tmp ;
  291.  
  292.     if (selrect) {
  293.         sr_width = sr_right - sr_left ;
  294.         sr_height = sr_bottom - sr_top ;
  295.  
  296.         for (i = 0 ; i < sr_height ; ++ i) {
  297.             for (j = 0 ; j < sr_width / 2 ; ++j) {
  298.                 tmp = getbit (j + sr_left, i + sr_top) ;
  299.                 setbit (j + sr_left, i + sr_top,
  300.                     getbit (sr_width - 1 - j + sr_left,
  301.                         i + sr_top)) ;
  302.                 setbit (sr_width - 1 - j + sr_left, i + sr_top,
  303.                     tmp) ;
  304.             }
  305.         }
  306.  
  307.         wchange (win, sr_left * sqrsize, sr_top * sqrsize,
  308.             sr_right * sqrsize, sr_bottom * sqrsize) ;
  309.  
  310.         changed = TRUE ;
  311.     }
  312.     else
  313.         wfleep () ;
  314. }
  315.  
  316. void
  317. flip_vertical()
  318. {
  319.     int    i ;
  320.     int    j ;
  321.     int    sr_width ;
  322.     int    sr_height ;
  323.     int    tmp ;
  324.  
  325.     if (selrect) {
  326.         sr_width = sr_right - sr_left ;
  327.         sr_height = sr_bottom - sr_top ;
  328.  
  329.         for (i = 0 ; i < sr_height / 2 ; ++i) {
  330.             for (j = 0 ; j < sr_width ; ++j) {
  331.                 tmp = getbit (j + sr_left, i + sr_top) ;
  332.                 setbit (j + sr_left, i + sr_top,
  333.                     getbit (j + sr_left,
  334.                         sr_height - 1 - i + sr_top)) ;
  335.                 setbit (j + sr_left, sr_height - 1 - i + sr_top,
  336.                     tmp) ;
  337.             }
  338.         }
  339.  
  340.         wchange (win, sr_left * sqrsize, sr_top * sqrsize,
  341.             sr_right * sqrsize, sr_bottom * sqrsize) ;
  342.  
  343.         changed = TRUE ;
  344.     }
  345.     else
  346.         wfleep () ;
  347. }
  348.  
  349. void
  350. zoom_in ()
  351. {
  352.     sqrsize *= 2 ;
  353.     wsetdocsize (win, map_width * sqrsize, map_height * sqrsize) ;
  354.     wchange (win, 0, 0, map_width * sqrsize, map_height * sqrsize) ;
  355. }
  356.  
  357. void
  358. zoom_out ()
  359. {
  360.     int oss = sqrsize ;
  361.     if (sqrsize == 1) wfleep () ;
  362.     else {
  363.         if ((sqrsize /= 2) < 1) sqrsize = 1 ;
  364.         wsetdocsize (win, map_width * sqrsize, map_height * sqrsize) ;
  365.         wchange (win, 0, 0, map_width * oss, map_height * oss) ;
  366.     }
  367. }
  368.  
  369.  
  370. void
  371. do_op_menu (ep)
  372.     EVENT    *ep ;
  373. {
  374.     switch (ep->u.m.item) {
  375.     case CLEAR_ITEM :
  376.         clear_bits () ;
  377.         break ;
  378.     case SET_ITEM :
  379.         set_bits () ;
  380.         break ;
  381.     case INVERT_ITEM :
  382.         invert_bits () ;
  383.         break ;
  384.     case TRANS_MAJ_ITEM :
  385.         transpose_major () ;
  386.         break ;
  387.     case TRANS_MIN_ITEM :
  388.         transpose_minor () ;
  389.         break ;
  390.     case ROT_LEFT_ITEM :
  391.         rotate_left () ;
  392.         break ;
  393.     case ROT_RIGHT_ITEM :
  394.         rotate_right () ;
  395.         break ;
  396.     case FLIP_HOR_ITEM :
  397.         flip_horizontal () ;
  398.         break ;
  399.     case FLIP_VERT_ITEM :
  400.         flip_vertical () ;
  401.         break ;
  402.     case ZOOM_IN :
  403.         zoom_in () ;
  404.         break ;
  405.     case ZOOM_OUT :
  406.         zoom_out () ;
  407.         break ;
  408.     }
  409. }
  410.