home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 200-299 / ff280.lzh / Graph / object / pos.c < prev    next >
C/C++ Source or Header  |  1989-11-20  |  4KB  |  137 lines

  1. /*
  2.  *                 GRAPH, Version 1.00 - 4 August 1989
  3.  *
  4.  *            Copyright 1989, David Gay. All Rights Reserved.
  5.  *            This software is freely redistrubatable.
  6.  */
  7.  
  8. #include <exec/types.h>
  9. #include <graphics/text.h>
  10. #include <math.h>
  11.  
  12. #include "object.h"
  13. #include "object/default.h"
  14. #include "uio.h"
  15. #include "grph.h"
  16. #include "coords.h"
  17. #include "tracker.h"
  18.  
  19. #include <proto/exec.h>
  20. #include <proto/graphics.h>
  21.  
  22. /*-------------------------------------------------------------------------*/
  23. /*                        pos class implementation                         */
  24. /*-------------------------------------------------------------------------*/
  25.  
  26. /* Size of cross */
  27. #define XCROSS 3
  28. #define YCROSS 3
  29.  
  30. /* Redraw cross/rect */
  31. static void draw_pos(struct pos *this, int allow_mes)
  32. {
  33.     struct graph *g = this->o.g;
  34.     struct RastPort *rp = g->io.rw->rp;
  35.  
  36.     SetDrMd(rp, COMPLEMENT);
  37.     if (this->cross) /* Draw cross */
  38.     {
  39.         RMove(g->io.rw, this->x0, this->y0);
  40.         Move(rp, rp->cp_x - XCROSS, rp->cp_y);
  41.         Draw(rp, rp->cp_x + 2 * XCROSS, rp->cp_y);
  42.         Move(rp, rp->cp_x - XCROSS, rp->cp_y - YCROSS);
  43.         Draw(rp, rp->cp_x, rp->cp_y + 2 * YCROSS);
  44.     }
  45.     if (this->rect) /* Draw rectangle */
  46.     {
  47.         long const sx0 = ftol(g->io.rw->sx(g->io.rw, this->x0));
  48.         long const sx1 = ftol(g->io.rw->sx(g->io.rw, this->x1));
  49.         long const sy0 = ftol(g->io.rw->sy(g->io.rw, this->y0));
  50.         long const sy1 = ftol(g->io.rw->sy(g->io.rw, this->y1));
  51.         long c1 = ReadPixel(rp, sx0, sy0);
  52.         long c2 = ReadPixel(rp, sx0, sy1);
  53.         long c3 = ReadPixel(rp, sx1, sy0);
  54.         long c4 = ReadPixel(rp, sx1, sy1);
  55.  
  56.         Move(rp, sx0, sy0);
  57.         Draw(rp, sx1, sy0);
  58.         Draw(rp, sx1, sy1);
  59.         Draw(rp, sx0, sy1);
  60.         Draw(rp, sx0, sy0);
  61.         /* Had problems with the corners ... */
  62.         if (c1 == ReadPixel(rp, sx0, sy0)) WritePixel(rp, sx0, sy0);
  63.         if (c2 == ReadPixel(rp, sx0, sy1)) WritePixel(rp, sx0, sy1);
  64.         if (c3 == ReadPixel(rp, sx1, sy0)) WritePixel(rp, sx1, sy0);
  65.         if (c4 == ReadPixel(rp, sx1, sy1)) WritePixel(rp, sx1, sy1);
  66.     }
  67. }
  68.  
  69. /* The object exists only to be "selected" --> */
  70. /* This actually deletes the object !!! */
  71. static struct Region *deselect_pos(struct pos *this)
  72. {
  73.     if (this->o.g->ok && this->o.g->io.rw) draw_pos(this, TRUE); /* erase */
  74.     FreeMem(this, sizeof(struct pos));
  75.     return NULL;
  76. }
  77.  
  78. static int down_pos(struct pos *this)
  79. {
  80.     return FALSE; /* You can never select a 'pos' */
  81. }
  82.  
  83. /* Move, ie define rectangle */
  84. static void move_pos(struct pos *this)
  85. {
  86.     draw_pos(this, TRUE);   /* erase old */
  87.     this->x1 = this->o.g->s.x;
  88.     this->y1 = this->o.g->s.y;
  89.     this->cross = FALSE; this->rect = TRUE; /* Not a cross any more */
  90.     draw_pos(this, TRUE);   /* draw new */
  91. }
  92.  
  93. /* Rectangle is now defined */
  94. static struct Region *up_pos(struct pos *this)
  95. {
  96.     draw_pos(this, TRUE);
  97.     this->x1 = this->o.g->s.x;
  98.     this->y1 = this->o.g->s.y;
  99.     draw_pos(this, TRUE);
  100.  
  101.     return NULL;
  102. }
  103.  
  104. /* Create a rectangle/cross (starts off as a cross) */
  105. struct pos *new_pos(struct graph *g)
  106. {
  107.     struct pos *this;
  108.     const static struct pos def_p = {
  109.         {
  110.             { NULL },
  111.             NULL, "", TRUE, 0, 0,
  112.             (void *)uncalled, (void *)uncalled, (void *)deselect_pos, (void *)d
  113. own_pos, (void *)move_pos, (void *)up_pos, (void *)uncalled, (void *)draw_pos, (
  114. void *)uncalled, (void *)uncalled, (void *)uncalled, (void *)uncalled, (void *)u
  115. ncalled,
  116.             (void *)uncalled
  117.         },
  118.         TRUE, FALSE
  119.     };
  120.  
  121.     if (g->ok && g->io.rw)
  122.         if (this = AllocMem(sizeof(struct pos), 0L))
  123.         {
  124.             *this = def_p;
  125.             this->o.g = g;
  126.             this->x0 = this->x1 = g->s.x;
  127.             this->y0 = this->y1 = g->s.y;
  128.             draw_pos(this, TRUE); /* draw it */
  129.  
  130.             return this;
  131.         }
  132.         else message(g, "No memory !", (char *)NULL);
  133.     else message(g, "No scale set", (char *)NULL);
  134.     return NULL;
  135. }
  136.  
  137.