summaryrefslogtreecommitdiff
path: root/cd/test/cdtest/rubber.c
diff options
context:
space:
mode:
Diffstat (limited to 'cd/test/cdtest/rubber.c')
-rwxr-xr-xcd/test/cdtest/rubber.c387
1 files changed, 387 insertions, 0 deletions
diff --git a/cd/test/cdtest/rubber.c b/cd/test/cdtest/rubber.c
new file mode 100755
index 0000000..80a5921
--- /dev/null
+++ b/cd/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;
+}