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 / atari / draw.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-03-29  |  9.3 KB  |  575 lines

  1. #include "window.h"
  2. #include "style.h"
  3. #include "trees.h"
  4. #include "atari_proto.h"
  5.  
  6. static void drawcaret P((WINDOW *win ));
  7. static void invertrect P((WINDOW *win , int left , int top , int right , int bottom ));
  8. #undef P
  9.  
  10. extern int    vdi_handle ;
  11.  
  12. extern bool    mouseoff ;
  13.  
  14. extern WINDOW    *active ;
  15. static WINDOW    *drawing = (WINDOW *) NULL ;
  16.  
  17. static TEXTATTR    savetextattr ;
  18.  
  19. void    showcaret () ;
  20. void    rmcaret () ;
  21.  
  22. static int    extrah ;
  23. static int    extrav ;
  24.  
  25. static int    curr_interior = -1 ;
  26. static int    curr_color = -1 ;
  27. static int    curr_mode = -1 ;
  28.  
  29. void
  30. wsetwintextattr (win, attr)
  31.     WINDOW    *win ;
  32.     TEXTATTR    *attr ;
  33. {
  34.     if (win == NULL) {
  35.         wdebug ("wsetwintextattr: illegal window pointer") ;
  36.         return ;
  37.     }
  38.  
  39.     win->attr = *attr ;
  40. }
  41.  
  42. void
  43. wgetwintextattr (win, attr)
  44.     WINDOW    *win ;
  45.     TEXTATTR    *attr ;
  46. {
  47.     if (win == NULL) {
  48.         wdebug ("wgetwintextattr: illegal window pointer") ;
  49.         return ;
  50.     }
  51.  
  52.     *attr = win->attr ;
  53. }
  54.  
  55. void
  56. wbegindrawing (win)
  57.     WINDOW    *win ;
  58. {
  59.     int    left ;
  60.     int    top ;
  61.     int    right ;
  62.     int    bottom ;
  63.     int    dummy ;
  64.  
  65.     if (drawing != NULL)
  66.         wenddrawing (drawing) ;
  67.  
  68.     rmcaret () ;
  69.  
  70.     drawing = win ;
  71.  
  72.     extrah = win->h - win->orgh ;
  73.     extrav = win->v - win->orgv ;
  74.  
  75.     wgettextattr (&savetextattr) ;
  76.     wsettextattr (&win->attr) ;
  77.  
  78.     if (!mouseoff) {
  79.         int    status ;
  80.         int    m_h ;
  81.         int    m_v ;
  82.  
  83.         vq_mouse (vdi_handle, &status, &m_h, &m_v) ;
  84.  
  85.         if (m_h > win->h - wlineheight () &&
  86.             m_h < win->h + win->width + wlineheight () &&
  87.             m_v > win->v - 2 * wcharwidth ('m') &&
  88.             m_v < win->v + win->height + 2 * wcharwidth ('m')) {
  89.             mouseoff = TRUE ;
  90.             graf_mouse (M_OFF, &dummy) ;
  91.         }
  92.     }
  93.  
  94.     wind_update (BEG_UPDATE) ;
  95.  
  96.     left = win->orgh ;
  97.     top = win->orgv ;
  98.     right = left + win->width ;
  99.     bottom = top + win->height ;
  100.  
  101.     setclip (win, 1, left, top, right, bottom) ;
  102. }
  103.  
  104. void
  105. wenddrawing (win)
  106.     WINDOW    *win ;
  107. {
  108.     int    left ;
  109.     int    top ;
  110.     int    right ;
  111.     int    bottom ;
  112.     int    dummy = 0 ;
  113.  
  114.     if (drawing == NULL || drawing != win)
  115.         return ;
  116.  
  117.     left = win->orgh ;
  118.     top = win->orgv ;
  119.     right = left + win->width ;
  120.     bottom = top + win->height ;
  121.  
  122.     setclip (win, 0, left, top, right, bottom) ;
  123.  
  124.     wind_update (END_UPDATE) ;
  125.  
  126.     wsettextattr (&savetextattr) ;
  127.  
  128.     extrah = extrav = 0 ;
  129.  
  130.     drawing = (WINDOW *) NULL ;
  131.  
  132.     showcaret () ;
  133. }
  134.  
  135. int
  136. wdrawtext (h, v, str, len)
  137.     int    h ;
  138.     int    v ;
  139.     char    *str ;
  140.     int    len ;
  141. {
  142.     TEXTATTR    attr ;
  143.     int    scr_h ;
  144.     int    scr_v ;
  145.     int    save ;
  146.     int    str_len = (len != -1 ? len : (int)strlen (str)) ;
  147.  
  148.     if (drawing == NULL) {
  149.         wdebug ("wdrawtext outside draw procedure") ;
  150.         return (h) ;
  151.     }
  152.  
  153.     wgettextattr (&attr) ;
  154.  
  155.     if (curr_mode != 1) {
  156.         vswr_mode (vdi_handle, 1) ;
  157.         curr_mode = 1 ;
  158.     }
  159.  
  160.     scr_h = h + extrah ;
  161.     scr_v = v + extrav ;
  162.  
  163.     save = str[str_len] ;
  164.     str[str_len] = 0 ;
  165.  
  166.     v_gtext (vdi_handle, scr_h, scr_v, str) ;
  167.  
  168.     str[str_len] = save ;
  169.  
  170.     if (attr.style & INVERSE) {
  171.         int    left = h ;
  172.         int    top = v ;
  173.         int    right ;
  174.         int    bottom ;
  175.  
  176.         right = h + wtextwidth (str, len) ;
  177.         bottom = v + wlineheight () ;
  178.     
  179.         winvert (left, top, right, bottom) ;
  180.     }
  181.  
  182.     return (h + wtextwidth (str, len)) ;
  183. }
  184.  
  185. int
  186. wdrawchar (h, v, c)
  187.     int    h ;
  188.     int    v ;
  189.     int    c ;
  190. {
  191.     char    buf[2] ;
  192.  
  193.     buf[0] = c ;
  194.     buf[1] = '\0' ;
  195.     return (wdrawtext (h, v, buf, 1)) ;
  196. }
  197.  
  198. void
  199. wdrawline (beg_h, beg_v, end_h, end_v)
  200.     int    beg_h ;
  201.     int    beg_v ;
  202.     int    end_h ;
  203.     int    end_v ;
  204. {
  205.     int    line[4] ;
  206.  
  207.     if (drawing == NULL) {
  208.         wdebug ("wdrawline called outside draw procedure") ;
  209.         return ;
  210.     }
  211.  
  212.     line[0] = beg_h + extrah ;
  213.     line[1] = beg_v + extrav ;
  214.     line[2] = end_h + extrah ;
  215.     line[3] = end_v + extrav ;
  216.  
  217.     if (curr_mode != 1) {
  218.         vswr_mode (vdi_handle, 1) ;
  219.         curr_mode = 1 ;
  220.     }
  221.  
  222.     v_pline (vdi_handle, 2, line) ;
  223. }
  224.  
  225. void
  226. wxorline (beg_h, beg_v, end_h, end_v)
  227.     int    beg_h ;
  228.     int    beg_v ;
  229.     int    end_h ;
  230.     int    end_v ;
  231. {
  232.     int    line[4] ;
  233.  
  234.     if (drawing == NULL) {
  235.         wdebug ("wxorline called outside draw procedure") ;
  236.         return ;
  237.     }
  238.  
  239.     line[0] = beg_h + extrah ;
  240.     line[1] = beg_v + extrav ;
  241.     line[2] = end_h + extrah ;
  242.     line[3] = end_v + extrav ;
  243.  
  244.     if (curr_mode != 3) {
  245.         vswr_mode (vdi_handle, 3) ;
  246.         curr_mode = 3 ;
  247.     }
  248.  
  249.     v_pline (vdi_handle, 2, line) ;
  250. }
  251.  
  252. void
  253. wdrawbox (left, top, right, bottom)
  254.     int    left ;
  255.     int    top ;
  256.     int    right ;
  257.     int    bottom ;
  258. {
  259.     int    box[10] ;
  260.  
  261.     if (drawing == NULL) {
  262.         wdebug ("wdrawbox called outside draw procedure") ;
  263.         return ;
  264.     }
  265.     
  266.     if (left >= right || top >= bottom)
  267.         return ; /* Empty box */
  268.     
  269.     box[0] = box[6] = box[8] = left + extrah ;
  270.     box[1] = box[3] = box[9] = top + extrav ;
  271.     box[2] = box[4] = right + extrah - 1 ;
  272.     box[5] = box[7] = bottom + extrav - 1 ;
  273.  
  274.     if (curr_mode != 1) {
  275.         vswr_mode (vdi_handle, 1) ;
  276.         curr_mode = 1 ;
  277.     }
  278.  
  279.     v_pline (vdi_handle, 5, box) ;
  280. }
  281.  
  282. void
  283. wdrawcircle (h, v, radius)
  284.     int    h ;
  285.     int    v ;
  286.     int    radius ;
  287. {
  288.     int    scr_h ;
  289.     int    scr_v ;
  290.  
  291.     if (drawing == NULL) {
  292.         wdebug ("wdrawline called outside draw procedure") ;
  293.         return ;
  294.     }
  295.     
  296.     scr_h = h + extrah ;
  297.     scr_v = v + extrav ;
  298.  
  299.     if (curr_interior != 0) {
  300.         vsf_interior (vdi_handle, 0) ;
  301.         curr_interior = 0 ;
  302.     }
  303.     if (curr_color != 1) {
  304.         vsf_color (vdi_handle, 1) ;
  305.         curr_color = 1 ;
  306.     }
  307.     if (curr_mode != 1) {
  308.         vswr_mode (vdi_handle, 1) ;
  309.         curr_mode = 1 ;
  310.     }
  311.  
  312.     v_circle (vdi_handle, scr_h, scr_v, radius) ;
  313. }
  314.  
  315. void
  316. werase (left, top, right, bottom)
  317.     int    left ;
  318.     int    top ;
  319.     int    right ;
  320.     int    bottom ;
  321. {
  322.     int    area[4] ;
  323.  
  324. /*    wdebug ("wer: l:%d, t:%d, r:%d, b:%d", left, top, right, bottom) ;
  325. */
  326.     if (drawing == NULL) {
  327.         wdebug ("werase called outside draw procedure") ;
  328.         return ;
  329.     }
  330.     
  331.     if (right <= left || bottom <= top)
  332.         return ; /* Empty box */
  333.  
  334.     area[0] = left + extrah ;
  335.     area[1] = top + extrav ;
  336.     area[2] = right + extrah - 1 ;
  337.     area[3] = bottom + extrav - 1 ;
  338.     
  339.     if (curr_interior != 1) {
  340.         vsf_interior (vdi_handle, 1) ;
  341.         curr_interior = 1 ;
  342.     }
  343.     if (curr_color != 0) {
  344.         vsf_color (vdi_handle, 0) ;
  345.         curr_color = 0 ;
  346.     }
  347.     if (curr_mode != 1) {
  348.         vswr_mode (vdi_handle, 1) ;
  349.         curr_mode = 1 ;
  350.     }
  351.  
  352.     vr_recfl (vdi_handle, area) ;
  353. }
  354.  
  355. void
  356. wpaint (left, top, right, bottom)
  357.     int    left ;
  358.     int    top ;
  359.     int    right ;
  360.     int    bottom ;
  361. {
  362.     int    area[4] ;
  363.  
  364.     if (drawing == NULL) {
  365.         wdebug ("wpaint called outside draw procedure") ;
  366.         return ;
  367.     }
  368.  
  369.     if (right <= left || bottom <= top)
  370.         return ; /* Empty box */
  371.  
  372.     area[0] = left + extrah ;
  373.     area[1] = top + extrav ;
  374.     area[2] = right + extrah - 1 ;
  375.     area[3] = bottom + extrav - 1 ;
  376.  
  377.     if (curr_interior != 1) {
  378.         vsf_interior (vdi_handle, 1) ;
  379.         curr_interior = 1 ;
  380.     }
  381.     if (curr_color != 1) {
  382.         vsf_color (vdi_handle, 1) ;
  383.         curr_color = 1 ;
  384.     }
  385.     if (curr_mode != 2) {
  386.         vswr_mode (vdi_handle, 2) ;
  387.         curr_mode = 2 ;
  388.     }
  389.  
  390.     vr_recfl (vdi_handle, area) ;
  391. }
  392.  
  393. void
  394. wshade (left, top, right, bottom, perc)
  395.     int    left ;
  396.     int    top ;
  397.     int    right ;
  398.     int    bottom ;
  399.     int    perc ;
  400. {
  401.     int    area[4] ;
  402.  
  403.     if (drawing == NULL) {
  404.         wdebug ("wshade called outside draw procedure") ;
  405.         return ;
  406.     }
  407.     
  408.     if (right <= left || bottom <= top)
  409.         return ; /* Empty box */
  410.  
  411.     area[0] = left + extrah ;
  412.     area[1] = top + extrav ;
  413.     area[2] = right + extrah - 1 ;
  414.     area[3] = bottom + extrav - 1 ;
  415.  
  416.     if (curr_interior != 2) {
  417.         vsf_interior (vdi_handle, 2) ;
  418.         curr_interior = 2 ;
  419.     }
  420.     if (curr_color != 1) {
  421.         vsf_color (vdi_handle, 1) ;
  422.         curr_color = 1 ;
  423.     }
  424.     if (curr_mode != 2) {
  425.         vswr_mode (vdi_handle, 2) ;
  426.         curr_mode = 2 ;
  427.     }
  428.     vsf_style (vdi_handle, (perc * 10) / 125) ;
  429.  
  430.     vr_recfl (vdi_handle, area) ;
  431. }
  432.  
  433. static void
  434. invertrect (win, left, top, right, bottom)
  435.     WINDOW    *win ;
  436.     int    left ;
  437.     int    top ;
  438.     int    right ;
  439.     int    bottom ;
  440. {
  441.     int    area[4] ;
  442.     
  443.     if (right <= left || bottom <= top)
  444.         return ; /* Empty box */
  445.  
  446.     DOCTOSCR (win, left, top, area[0], area[1]) ;
  447.     DOCTOSCR (win, right - 1, bottom - 1 , area[2], area[3]) ;
  448.  
  449.     if (curr_interior != 1) {
  450.         vsf_interior (vdi_handle, 1) ;
  451.         curr_interior = 1 ;
  452.     }
  453.     if (curr_color != 1) {
  454.         vsf_color (vdi_handle, 1) ;
  455.         curr_color = 1 ;
  456.     }
  457.     if (curr_mode != 3) {
  458.         vswr_mode (vdi_handle, 3) ;
  459.         curr_mode = 3 ;
  460.     }
  461.  
  462.     vr_recfl (vdi_handle, area) ;
  463. }
  464.  
  465. void
  466. winvert (left, top, right, bottom)
  467.     int    left ;
  468.     int    top ;
  469.     int    right ;
  470.     int    bottom ;
  471. {
  472.     if (drawing == NULL) {
  473.         wdebug ("winvert called outside draw procedure") ;
  474.         return ;
  475.     }
  476.  
  477.     invertrect (drawing, left, top, right, bottom) ;
  478. }
  479.  
  480. /*
  481. **    CARET HANDLING
  482. **
  483. **    The caret postion can be find in the structure members caret_h, caret_v.
  484. **    These two contains (-1, -1) if the window doesn't have a caret, and the
  485. **    structure member careton tells if the caret is currently drawn or not
  486. */
  487.  
  488. static void
  489. drawcaret (win)
  490.     WINDOW    *win ;
  491. {
  492.     int    dummy ;
  493.     int    left ;
  494.     int    top ;
  495.     int    right ;
  496.     int    bottom ;
  497.  
  498.     if (win->caret_h < 0 || win->caret_v < 0)
  499.         return ;
  500.  
  501.     if (!graf_mouse (M_OFF, &dummy))
  502.         wdebug ("drawcaret: mouse off") ;
  503.  
  504.     setclip (win, 1, win->orgh, win->orgv, win->orgh + win->width,
  505.                         win->orgv + win->height) ;
  506.     left = win->caret_h ;
  507.     top = win->caret_v ;
  508.     right = win->caret_h + 1 ;
  509.     bottom = win->caret_v + wlineheight () ;
  510.     invertrect (win, left, top, right, bottom) ;
  511.  
  512.     setclip (win, 0, win->orgh, win->orgv, win->orgh + win->width,
  513.                         win->orgv + win->height) ;
  514.  
  515.     if (!graf_mouse (M_ON, &dummy))
  516.         wdebug ("drawcaret: mouse on") ;
  517. }
  518.  
  519. void
  520. showcaret ()
  521. {
  522.     WINDOW    *win = active ;
  523.  
  524.     if (win == NULL)
  525.         return ;
  526.  
  527.     if (win->caret_h < 0 || win->caret_v < 0)
  528.         return ;
  529.  
  530.     if (!win->careton) {
  531.         drawcaret (win) ;
  532.         win->careton = TRUE ;
  533.     }
  534. }
  535.  
  536. void
  537. rmcaret ()
  538. {
  539.     WINDOW    *win = active ;
  540.  
  541.     if (win == NULL)
  542.         return ;
  543.  
  544.     if (win->careton) {
  545.         drawcaret (win) ;
  546.         win->careton = FALSE ;
  547.     }
  548. }
  549.  
  550. void
  551. wsetcaret (win, h, v)
  552.     WINDOW    *win ;
  553.     int    h ;
  554.     int    v ;
  555. {
  556.     if (win == active)
  557.         rmcaret () ;
  558.  
  559.     win->caret_h = h ;
  560.     win->caret_v = v ;
  561.  
  562.     if (win == active)
  563.         showcaret () ;
  564. }
  565.  
  566. void
  567. wnocaret (win)
  568.     WINDOW    *win ;
  569. {
  570.     if (win == active)
  571.         rmcaret () ;
  572.  
  573.     win->caret_h = win->caret_v = -1 ;
  574. }
  575.