/*=========================================================================*/ /* RUBBER.C - 10/12/95 */ /* Funcoes para o desenho interativo das primitivas. */ /*=========================================================================*/ /*- Bibliotecas padrao usadas ---------------------------------------------*/ #include #include #include #include /*- Inclusao das bibliotecas IUP e CD: ------------------------------------*/ #include #include #include /*- 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