diff options
| author | scuri <scuri> | 2008-10-17 06:10:33 +0000 | 
|---|---|---|
| committer | scuri <scuri> | 2008-10-17 06:10:33 +0000 | 
| commit | 7b52cc13af4e85f1ca2deb6b6c77de9c95ea0dcf (patch) | |
| tree | d0857278bde2eff784227c57dcaf930346ceb7ac /test/cdtest/rubber.c | |
First commit - moving from LuaForge to SourceForge
Diffstat (limited to 'test/cdtest/rubber.c')
| -rw-r--r-- | test/cdtest/rubber.c | 387 | 
1 files changed, 387 insertions, 0 deletions
diff --git a/test/cdtest/rubber.c b/test/cdtest/rubber.c new file mode 100644 index 0000000..80a5921 --- /dev/null +++ b/test/cdtest/rubber.c @@ -0,0 +1,387 @@ +/*=========================================================================*/ +/* RUBBER.C - 10/12/95                                                     */ +/* Funcoes para o desenho interativo das primitivas.                       */ +/*=========================================================================*/ + +/*- Bibliotecas padrao usadas ---------------------------------------------*/ +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <string.h> + +/*- Inclusao das bibliotecas IUP e CD: ------------------------------------*/ +#include <iup.h> +#include <cd.h> +#include <cdiup.h> + +/*- Prototypes e declaracoes do CD Test: ----------------------------------*/ +#include "cdtest.h" + +/*- Contexto do CD Test (declarado em CDTEST.C): --------------------------*/ +extern tCTC ctgc; + +/*- Parametros para o desenho das primitivas: -----------------------------*/ +extern tLinePos line_pos; +extern tBoxPos box_pos; +extern tPixelPos pixel_pos; +extern tMarkPos mark_pos; +extern tArcPos arc_pos; + +/*-------------------------------------------------------------------------*/ +/* Segue as coordenadas do mouse atualizando o TXT apropriado.             */ +/*-------------------------------------------------------------------------*/ +void follow(int x, int y) +{ +  static char mx[10], my[10]; +  static char nx[10], ny[10]; + +  sprintf(nx, "%d", x); +  sprintf(ny, "%d", y); + +  switch(ctgc.cur_prim) { +    case PIXEL: +      /* atualiza os parametros do pixel */ +      pixel_pos.x = x; +      pixel_pos.y = y; +      /* atualiza a caixa de dialogo */ +      sprintf(mx, "%d", x); +      sprintf(my, "%d", y); +      IupSetAttribute(IupGetHandle("txtPixelX"), IUP_VALUE, mx); +      IupSetAttribute(IupGetHandle("txtPixelY"), IUP_VALUE, my); +      break; +    case MARK: +      /* atualiza os parametros da mark */ +      mark_pos.x = x; +      mark_pos.y = y; +      /* atualiza a caixa de dialogo */ +      sprintf(mx, "%d", x); +      sprintf(my, "%d", y); +      IupSetAttribute(IupGetHandle("txtMarkX"), IUP_VALUE, mx); +      IupSetAttribute(IupGetHandle("txtMarkY"), IUP_VALUE, my); +      break; +    case RECT: +    case BOX: +      /* atualiza os parametros da box */ +      if (ctgc.following) { +        if (x < box_pos.x) { +          box_pos.xmin = x; +          box_pos.xmax = box_pos.x; +        } +        else { +          box_pos.xmax = x; +          box_pos.xmin = box_pos.x; +        } + +        if (y < box_pos.y) { +          box_pos.ymin = y; +          box_pos.ymax = box_pos.y; +        } +        else { +          box_pos.ymax = y; +          box_pos.ymin = box_pos.y; +        } +      } +      else { +        box_pos.xmax = box_pos.xmin = x; +        box_pos.ymax = box_pos.ymin = y; +      }   +      /* atualiza a caixa de dialogo */ +      sprintf(mx, "%d", box_pos.xmin); +      sprintf(nx, "%d", box_pos.xmax); +      sprintf(my, "%d", box_pos.ymin); +      sprintf(ny, "%d", box_pos.ymax); +      IupSetAttribute(IupGetHandle("txtLBX1"), IUP_VALUE, mx); +      IupSetAttribute(IupGetHandle("txtLBX2"), IUP_VALUE, nx); +      IupSetAttribute(IupGetHandle("txtLBY1"), IUP_VALUE, my); +      IupSetAttribute(IupGetHandle("txtLBY2"), IUP_VALUE, ny); +      break; +    case LINE: +      sprintf(mx, "%d", x); +      sprintf(my, "%d", y); +      line_pos.x2 = x; +      line_pos.y2 = y; +      if (ctgc.following) { +        IupSetAttribute(IupGetHandle("txtLBX2"), IUP_VALUE, mx); +        IupSetAttribute(IupGetHandle("txtLBY2"), IUP_VALUE, my); +      } +      else { +        line_pos.x1 = x; +        line_pos.y1 = y; +        IupSetAttribute(IupGetHandle("txtLBX1"), IUP_VALUE, mx); +        IupSetAttribute(IupGetHandle("txtLBX2"), IUP_VALUE, mx); +        IupSetAttribute(IupGetHandle("txtLBY1"), IUP_VALUE, my); +        IupSetAttribute(IupGetHandle("txtLBY2"), IUP_VALUE, my); +      } +      break; +    case ARC:    /* ARC e SECTOR... */ +    case CHORD:  +    case SECTOR: /* ...sao equivalentes */ +      if (ctgc.following) { +        /* atualiza os parametros do arc */ +        arc_pos.w = 2*abs(arc_pos.xc-x+1); +        arc_pos.h = 2*abs(arc_pos.yc-y+1); +        /* atualiza a caixa de dialogo */ +        sprintf(mx, "%d", arc_pos.w); +        sprintf(my, "%d", arc_pos.h); +        IupSetAttribute(IupGetHandle("txtASW"), IUP_VALUE, mx); +        IupSetAttribute(IupGetHandle("txtASH"), IUP_VALUE, my); +      } +      else { +        /* atualiza os parametros do arc */ +        arc_pos.xc = x; +        arc_pos.xc = y; +        /* atualiza a caixa de dialogo */ +        sprintf(mx, "%d", x); +        sprintf(my, "%d", y); +        IupSetAttribute(IupGetHandle("txtASXC"), IUP_VALUE, mx); +        IupSetAttribute(IupGetHandle("txtASYC"), IUP_VALUE, my); +      } +      break; +    case TEXT: +      IupSetAttribute(IupGetHandle("txtTextX"), IUP_VALUE, nx); +      IupSetAttribute(IupGetHandle("txtTextY"), IUP_VALUE, ny); +      break; +    case CLIP: +      if (ctgc.following) { +        if (atoi(nx) >= atoi(mx)) { +          IupSetAttribute(IupGetHandle("txtClipXmax"), IUP_VALUE, nx); +          IupSetAttribute(IupGetHandle("txtClipXmin"), IUP_VALUE, mx); +        } +        else { +          IupSetAttribute(IupGetHandle("txtClipXmin"), IUP_VALUE, nx); +          IupSetAttribute(IupGetHandle("txtClipXmax"), IUP_VALUE, mx); +        } +        if (atoi(ny) >= atoi(my)) { +          IupSetAttribute(IupGetHandle("txtClipYmax"), IUP_VALUE, ny); +          IupSetAttribute(IupGetHandle("txtClipYmin"), IUP_VALUE, my); +        } +        else { +          IupSetAttribute(IupGetHandle("txtClipYmin"), IUP_VALUE, ny); +          IupSetAttribute(IupGetHandle("txtClipYmax"), IUP_VALUE, my); +        } +      } +      else { +        IupSetAttribute(IupGetHandle("txtClipXmin"), IUP_VALUE, nx); +        IupSetAttribute(IupGetHandle("txtClipYmin"), IUP_VALUE, ny); +        IupSetAttribute(IupGetHandle("txtClipXmax"), IUP_VALUE, nx); +        IupSetAttribute(IupGetHandle("txtClipYmax"), IUP_VALUE, ny); +        strcpy(mx, nx); +        strcpy(my, ny); +      } +      break; +    case IMAGE: +      if (ctgc.following) { +        if (atoi(mx) <= atoi(nx)) { +          sprintf(nx, "%d", abs(atoi(nx)-atoi(mx))); +          IupSetAttribute(IupGetHandle("txtImageW"), IUP_VALUE, nx); +        } +        else { +          IupSetAttribute(IupGetHandle("txtImageX"), IUP_VALUE, nx); +          sprintf(nx, "%d", abs(atoi(nx)-atoi(mx))); +          IupSetAttribute(IupGetHandle("txtImageW"), IUP_VALUE, nx); +        } +        if (atoi(my) <= atoi(ny)) { +          sprintf(ny, "%d", abs(atoi(ny)-atoi(my))); +          IupSetAttribute(IupGetHandle("txtImageH"), IUP_VALUE, ny); +        } +        else { +          IupSetAttribute(IupGetHandle("txtImageY"), IUP_VALUE, ny); +          sprintf(ny, "%d", abs(atoi(ny)-atoi(my))); +          IupSetAttribute(IupGetHandle("txtImageH"), IUP_VALUE, ny); +        } +      } +      else { +        IupSetAttribute(IupGetHandle("txtImageX"), IUP_VALUE, nx); +        IupSetAttribute(IupGetHandle("txtImageY"), IUP_VALUE, ny); +        strcpy(mx, nx); +        strcpy(my, ny); +      } +      break; +    case RGB: +      if (ctgc.following) { +        if (atoi(mx) <= atoi(nx)) { +          sprintf(nx, "%d", abs(atoi(nx)-atoi(mx))); +          IupSetAttribute(IupGetHandle("txtImageRGBW"), IUP_VALUE, nx); +        } +        else { +          IupSetAttribute(IupGetHandle("txtImageRGBX"), IUP_VALUE, nx); +          sprintf(nx, "%d", abs(atoi(nx)-atoi(mx))); +          IupSetAttribute(IupGetHandle("txtImageRGBW"), IUP_VALUE, nx); +        } +        if (atoi(my) <= atoi(ny)) { +          sprintf(ny, "%d", abs(atoi(ny)-atoi(my))); +          IupSetAttribute(IupGetHandle("txtImageRGBH"), IUP_VALUE, ny); +        } +        else { +          IupSetAttribute(IupGetHandle("txtImageRGBY"), IUP_VALUE, ny); +          sprintf(ny, "%d", abs(atoi(ny)-atoi(my))); +          IupSetAttribute(IupGetHandle("txtImageRGBH"), IUP_VALUE, ny); +        } +      } +      else { +        IupSetAttribute(IupGetHandle("txtImageRGBX"), IUP_VALUE, nx); +        IupSetAttribute(IupGetHandle("txtImageRGBY"), IUP_VALUE, ny); +        strcpy(mx, nx); +        strcpy(my, ny); +      } +      break; +    default: +      break; +  } +} + + +/*-------------------------------------------------------------------------*/ +/* Desenha uma linha em rubber band.                                       */ +/*-------------------------------------------------------------------------*/ +void line(tRubber what, int x, int y) +{ +  static int x1, x2, y1, y2; +  static int lastwhat = CLOSE; + +  switch (what) { +    case NEWPOINT: +      x1 = x2 = x;                   /* novo segmento comeca no... */ +      y1 = y2 = y;                   /* ...fim do primeiro */ +      break; +    case MOVE: +      if (lastwhat == MOVE) { +        cdLine(x1, y1, x2, y2);      /* apaga o segmento velho */ +      } +      cdLine(x1, y1, x, y);          /* desenha o novo */ +      x2 = x;                        /* o novo se... */ +      y2 = y;                        /* ...torna velho */ +      break; +    case REPAINT: +      cdLine(x1, y1, x2, y2);        /* recupera o segmento perdido */ +      return;                        /* nao modifica lastwhat */ +    case CLOSE: +      cdLine(x1, y1, x2, y2);        /* apaga o ultimo segmento */ +      break; +    default: +      break; +  } +  lastwhat = what; +} + +/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ +/* Desenha uma caixa vazia (funcao nao exportada).                         */ +/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ +static void frame(int x1, int y1, int x2, int y2) +{ +  cdLine(x1, y1, x1, y2); +  cdLine(x2, y1, x2, y2); +  cdLine(x1, y1, x2, y1); +  cdLine(x1, y2, x2, y2); +} + +/*-------------------------------------------------------------------------*/ +/* Desenha uma caixa em rubber band.                                       */ +/*-------------------------------------------------------------------------*/ +void box(tRubber what, int x, int y) +{ +  static int x1, x2, y1, y2; +  static int lastwhat = CLOSE; + +  switch (what) { +    case NEWPOINT: +      x1 = x2 = x;                   /* novo segmento comeca no... */ +      y1 = y2 = y;                   /* fim do primeiro */ +      break; +    case MOVE: +      if (lastwhat == MOVE) { +        frame(x1, y1, x2, y2);       /* apaga a caixa anterior */ +      } +      frame(x1, y1, x, y);           /* desenha a nova */ +      x2 = x;                        /* o novo se... */ +      y2 = y;                        /* torna velho */ +      break; +    case REPAINT: +      frame(x1, y1, x2, y2);         /* restaura a caixa perdida */ +      return;                        /* nao modifica lastwhat */ +    case CLOSE: +      frame(x1, y1, x2, y2);         /* apaga a caixa definitiva */ +      break; +    default: +      break; +  } +  lastwhat = what; +} + +/*-------------------------------------------------------------------------*/ +/* Desenha uma caixa centrada, em rubber band.                             */ +/*-------------------------------------------------------------------------*/ +void arc(tRubber what, int x, int y) +{ +  static int xc, yc, y1, x1; +  static int lastwhat = CLOSE; + +  switch (what) { +    case CENTER: +      xc = x1 = x;                   /* novo segmento comeca no... */ +      yc = y1 = y;                   /* fim do primeiro */ +      break; +    case MOVE: +      if (lastwhat == MOVE) { +        cdArc(xc, yc, 2*abs(xc-x1+1), 2*abs(yc-y1+1), 0, 360); +      } +      cdArc(xc, yc, 2*abs(xc-x+1), 2*abs(yc-y+1), 0, 360); +      x1 = x;                        /* o novo se... */ +      y1 = y;                        /* torna velho */ +      break; +    case REPAINT: +      cdArc(xc, yc, 2*abs(xc-x1+1), 2*abs(yc-y1+1), 0, 360); +      return;                        /* nao modifica lastwhat */ +    case CLOSE: +      cdArc(xc, yc, 2*abs(xc-x1+1), 2*abs(yc-y1+1), 0, 360); +      break; +    default: +      break; +  } +  lastwhat = what; +} + +/*-------------------------------------------------------------------------*/ +/* Desenha o poligono em rubber band.                                      */ +/*-------------------------------------------------------------------------*/ +void polygon(tRubber what, int x, int y) +{ +  static int x1, x2, y1, y2; +  static int lastwhat = CLOSE; + +  switch (what) { +    case NEWPOINT: +      if (lastwhat != CLOSE) { +        cdLine(x1, y1, x2, y2);      /* ...apaga a anterior e... */ +        cdLine(x1, y1, x, y);        /* desenha a definitiva */ +      } +      x1 = x;                        /* novo segmento comeca no... */ +      y1 = y;                        /* fim do primeiro */ +      break; +    case MOVE: +      if (lastwhat == MOVE) { +        cdLine(x1, y1, x2, y2);      /* apaga o segmento velho */ +      } +      cdLine(x1, y1, x, y);          /* desenha o novo */ +      x2 = x;                        /* o novo se... */ +      y2 = y;                        /* torna velho */ +      break; +    case REPAINT: +      cdLine(x1, y1, x2, y2);        /* recupera o segmento perdido */ +      return;                        /* nao modifica lastwhat */ +    case CLOSE:  +      if (lastwhat != CLOSE) { +        int i; +        cdLine(x1, y1, x2, y2);        /* apaga o ultimo segmento */ +        /* apaga o poligono temporario inteiro */ +        for (i=0; (i<ctgc.num_points-1); i++) { +          cdLine(ctgc.points[i].x, ctgc.points[i].y, +                 ctgc.points[i+1].x, ctgc.points[i+1].y); +        } +      } +      break; +    default: +      break; +  } +  lastwhat = what; +}  | 
