diff options
author | Pixel <pixel@nobis-crew.org> | 2009-11-04 11:56:41 -0800 |
---|---|---|
committer | Pixel <pixel@nobis-crew.org> | 2009-11-04 11:59:33 -0800 |
commit | d577d991b97ae2b5ee1af23641bcffc3f83af5b2 (patch) | |
tree | 590639d50205d1bcfaff2a7d2dc6ebf3f373c7ed /cd/test/cdtest/cdtest.c |
Initial import. Contains the im, cd and iup librairies, and a "working" Makefile for them under linux.
Diffstat (limited to 'cd/test/cdtest/cdtest.c')
-rwxr-xr-x | cd/test/cdtest/cdtest.c | 2669 |
1 files changed, 2669 insertions, 0 deletions
diff --git a/cd/test/cdtest/cdtest.c b/cd/test/cdtest/cdtest.c new file mode 100755 index 0000000..9180bf4 --- /dev/null +++ b/cd/test/cdtest/cdtest.c @@ -0,0 +1,2669 @@ +/*=========================================================================*/ +/* CDTEST.C - 09/12/95 */ +/* Canvas Draw Test. */ +/*=========================================================================*/ + +/*- Convenccoes Usadas: ---------------------------------------------------*/ +/* - Identificadores de funccoes associadas a um callback comeccam por f. */ +/* Ex: fResize, fRepaint. */ +/* - Identificadores de constantes sao escritos em maiusculas. */ +/* Ex: LINE, ARC, NEWPOINT. */ +/* - Identificadores de funcoes internas do programa sao escritas em */ +/* minusculas. */ +/* Ex: newpolypoint, dellist. */ +/*-------------------------------------------------------------------------*/ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +#include <iup.h> +#include <cd.h> +#include <wd.h> +#include <cdiup.h> +#include <cdpicture.h> +#include <cddbuf.h> +#include <cdirgb.h> +#include <cdgdiplus.h> +#include <iupkey.h> + +#include "cdtest.h" + +/*- Contexto do CD Test: --------------------------------------------------*/ +tCTC ctgc; + +/*- Parametros geometricos da primitiva sendo desenhada: ------------------*/ +tLinePos line_pos; +tBoxPos box_pos; +tPixelPos pixel_pos; +tMarkPos mark_pos; +tArcPos arc_pos; + +//#define USE_GDIPLUS + +#ifdef USE_GDIPLUS +static const int use_gdiplus = 1; +#else +static const int use_gdiplus = 0; +#endif + +static const int antialias = 1; + + +/*-------------------------------------------------------------------------*/ +/* Associa os call-backs do IUP. */ +/*-------------------------------------------------------------------------*/ +void setcallbacks(void) +{ + IupSetFunction("cmdFileExit", (Icallback) fFileExit); + + IupSetFunction("cmdEditClear", (Icallback) fEditClear); + IupSetFunction("cmdEditUndo", (Icallback) fEditUndo); + + IupSetFunction("cmdHelpAbout", (Icallback) fHelpAbout); + IupSetFunction("cmdCloseAbout", (Icallback) fCloseAbout); + + IupSetFunction("cmdWDCanvas", (Icallback) fWDCanvas); + IupSetFunction("cmdCloseWD", (Icallback) fCloseWD); + IupSetFunction("cmdPICCanvas", (Icallback) fPICCanvas); + IupSetFunction("cmdClosePIC", (Icallback) fClosePIC); + + IupSetFunction("cmdShowDialog", (Icallback) fShowDialog); + IupSetFunction("cmdLine", (Icallback) fLine); + IupSetFunction("cmdRect", (Icallback) fRect); + IupSetFunction("cmdBox", (Icallback) fBox); + IupSetFunction("cmdArc", (Icallback) fArc); + IupSetFunction("cmdSector", (Icallback) fSector); + IupSetFunction("cmdChord", (Icallback) fChord); + IupSetFunction("cmdPixel", (Icallback) fPixel); + IupSetFunction("cmdMark", (Icallback) fMark); + IupSetFunction("cmdText", (Icallback) fText); + IupSetFunction("cmdPoly", (Icallback) fPoly); + + IupSetFunction("cmdOptions", (Icallback) fOptions); + IupSetFunction("cmdOptionsHide", (Icallback) fOptionsHide); + IupSetFunction("cmdAttributes", (Icallback) fAttributes); + IupSetFunction("cmdAttributesHide", (Icallback) fAttributesHide); + IupSetFunction("cmdMsgHide", (Icallback) fMsgHide); + IupSetFunction("cmdSimulate", (Icallback) fSimulate); + IupSetFunction("cmdStretchPlay", (Icallback) fStretchPlay); + + IupSetFunction("cmdWriteMode", (Icallback) fWriteMode); + IupSetFunction("cmdLineStyle", (Icallback) fLineStyle); + IupSetFunction("cmdLineCap", (Icallback) fLineCap); + IupSetFunction("cmdLineJoin", (Icallback) fLineJoin); + IupSetFunction("cmdFillMode", (Icallback) fFillMode); + IupSetFunction("cmdFontStyle", (Icallback) fFontStyle); + IupSetFunction("cmdFontTypeFace", (Icallback) fFontTypeFace); + IupSetFunction("cmdMarkType", (Icallback) fMarkType); + IupSetFunction("cmdTextAlignment", (Icallback) fTextAlignment); + IupSetFunction("cmdHatchStyle", (Icallback) fHatchStyle); + IupSetFunction("cmdOpacity", (Icallback) fOpacity); + + IupSetFunction("cmdNoBuffering", (Icallback) fNoBuffering); + IupSetFunction("cmdImageBuffer", (Icallback) fImageBuffer); + IupSetFunction("cmdRGBBuffer", (Icallback) fRGBBuffer); + + IupSetFunction("cmdInteger", (Icallback) fInteger); + IupSetFunction("cmdReal", (Icallback) fReal); + IupSetFunction("cmdDraw", (Icallback) fDraw); + + IupSetFunction("cmdSolid", (Icallback) fSolid); + IupSetFunction("cmdHatch", (Icallback) fHatch); + IupSetFunction("cmdStipple", (Icallback) fStipple); + IupSetFunction("cmdPattern", (Icallback) fPattern); + + IupSetFunction("cmdOpenLines", (Icallback) fOpenLines); + IupSetFunction("cmdClosedLines", (Icallback) fClosedLines); + IupSetFunction("cmdFill", (Icallback) fFill); + IupSetFunction("cmdPolyClip", (Icallback) fPolyClip); + IupSetFunction("cmdPolyBezier", (Icallback) fPolyBezier); + + IupSetFunction("cmdClip", (Icallback) fClip); + IupSetFunction("cmdClipArea", (Icallback) fClipArea); + IupSetFunction("cmdClipOff", (Icallback) fClipOff); + IupSetFunction("cmdClipPoly", (Icallback) fClipPoly); + + IupSetFunction("cmdImage", (Icallback) fImage); + IupSetFunction("cmdImagePut", (Icallback) fImagePut); + IupSetFunction("cmdImageGet", (Icallback) fImageGet); + + IupSetFunction("cmdImageRGB", (Icallback) fImageRGB); + IupSetFunction("cmdImageRGBPut", (Icallback) fImageRGBPut); + IupSetFunction("cmdImageRGBGet", (Icallback) fImageRGBGet); +} + +/*-------------------------------------------------------------------------*/ +/* Inicializa o stipple e o pattern exemplo. */ +/*-------------------------------------------------------------------------*/ +void initsamples(void) +{ + int i; + + /* zera os vetores */ + for (i=0; i<100; i++) { + ctgc.stipple[i] = 0; + ctgc.pattern[i] = 0xffffffl; + } + + /* especificaccao do stipple */ + ctgc.stipple[11] = 1; /*------------*/ + ctgc.stipple[21] = 1; /* 0123456789*/ + ctgc.stipple[31] = 1; /* */ + ctgc.stipple[41] = 1; /*9 0000000000*/ + ctgc.stipple[51] = 1; /*8 0000111110*/ + /*7 0001000110*/ + ctgc.stipple[12] = 1; /*6 0010001010*/ + ctgc.stipple[52] = 1; /*5 0111110010*/ + ctgc.stipple[62] = 1; /*4 0100010010*/ + /*3 0100010100*/ + ctgc.stipple[13] = 1; /*2 0100011000*/ + ctgc.stipple[53] = 1; /*1 0111110000*/ + ctgc.stipple[73] = 1; /*0 0000000000*/ + /*------------*/ + ctgc.stipple[14] = 1; + ctgc.stipple[54] = 1; + ctgc.stipple[84] = 1; + + ctgc.stipple[15] = 1; ctgc.stipple[26] = 1; + ctgc.stipple[25] = 1; ctgc.stipple[66] = 1; + ctgc.stipple[35] = 1; ctgc.stipple[86] = 1; + ctgc.stipple[45] = 1; + ctgc.stipple[55] = 1; ctgc.stipple[48] = 1; + ctgc.stipple[85] = 1; ctgc.stipple[58] = 1; + ctgc.stipple[68] = 1; + ctgc.stipple[37] = 1; ctgc.stipple[78] = 1; + ctgc.stipple[77] = 1; ctgc.stipple[88] = 1; + ctgc.stipple[87] = 1; + + + /* especificaccao do stipple */ + ctgc.pattern[11] = CD_RED; /*------------*/ + ctgc.pattern[21] = CD_RED; /* 0123456789*/ + ctgc.pattern[31] = CD_RED; /* */ + ctgc.pattern[41] = CD_RED; /*9 WWWWWWWWWW*/ + ctgc.pattern[51] = CD_RED; /*8 WWWWGGGGGW*/ + ctgc.pattern[12] = CD_RED; /*7 WWWGGGGGBW*/ + ctgc.pattern[22] = CD_RED; /*6 WWGGGGGBBW*/ + ctgc.pattern[32] = CD_RED; /*5 WrrrrrBBBW*/ + ctgc.pattern[42] = CD_RED; /*4 WrrrrrBBBW*/ + ctgc.pattern[52] = CD_RED; /*3 WrrrrrBBWW*/ + ctgc.pattern[13] = CD_RED; /*2 WrrrrrBWWW*/ + ctgc.pattern[23] = CD_RED; /*1 WrrrrrWWWW*/ + ctgc.pattern[33] = CD_RED; /*0 WWWWWWWWWW*/ + ctgc.pattern[43] = CD_RED; /*------------*/ + ctgc.pattern[53] = CD_RED; + ctgc.pattern[14] = CD_RED; ctgc.pattern[15] = CD_RED; + ctgc.pattern[24] = CD_RED; ctgc.pattern[25] = CD_RED; + ctgc.pattern[34] = CD_RED; ctgc.pattern[35] = CD_RED; + ctgc.pattern[44] = CD_RED; ctgc.pattern[45] = CD_RED; + ctgc.pattern[54] = CD_RED; ctgc.pattern[55] = CD_RED; + + ctgc.pattern[26] = CD_BLUE; ctgc.pattern[37] = CD_BLUE; + ctgc.pattern[36] = CD_BLUE; ctgc.pattern[47] = CD_BLUE; + ctgc.pattern[46] = CD_BLUE; ctgc.pattern[57] = CD_BLUE; + ctgc.pattern[56] = CD_BLUE; ctgc.pattern[67] = CD_BLUE; + + ctgc.pattern[48] = CD_BLUE; ctgc.pattern[62] = CD_GREEN; + ctgc.pattern[58] = CD_BLUE; ctgc.pattern[63] = CD_GREEN; + ctgc.pattern[68] = CD_BLUE; ctgc.pattern[64] = CD_GREEN; + ctgc.pattern[78] = CD_BLUE; ctgc.pattern[65] = CD_GREEN; + ctgc.pattern[66] = CD_GREEN; + + ctgc.pattern[73] = CD_GREEN; ctgc.pattern[84] = CD_GREEN; + ctgc.pattern[74] = CD_GREEN; ctgc.pattern[85] = CD_GREEN; + ctgc.pattern[75] = CD_GREEN; ctgc.pattern[86] = CD_GREEN; + ctgc.pattern[76] = CD_GREEN; ctgc.pattern[87] = CD_GREEN; + ctgc.pattern[77] = CD_GREEN; ctgc.pattern[88] = CD_GREEN; + + ctgc.dashes[0] = 10; + ctgc.dashes[1] = 2; + ctgc.dashes[2] = 5; + ctgc.dashes[3] = 2; +} + +/*-------------------------------------------------------------------------*/ +/* Inicializa o CD Test. */ +/*-------------------------------------------------------------------------*/ +void CDTestInit(void) +{ + memset(&ctgc, 0, sizeof(ctgc)); + + if (use_gdiplus) + { +#ifdef USE_GDIPLUS + cdInitGdiPlus(); +#endif + } + + /* inicializaccao dos drivers */ + DriversInit(); + + /* mostra o dialogo principal */ + IupShow(IupGetHandle("dlgMain")); + + /* inicializaccao da barra de cores */ + ColorBarInit(IupGetHandle("dlgMain"), IupGetHandle("cnvColorBar"), &ctgc.foreground, &ctgc.background); + + /* cria o canvas do CD associado ao canvas do IUP */ + if (use_gdiplus) cdUseContextPlus(1); + ctgc.iup_canvas = cdCreateCanvas(CD_IUP, IupGetHandle("cnvMain")); + if (!antialias) cdCanvasSetAttribute(ctgc.iup_canvas, "ANTIALIAS", "0"); + cdActivate(ctgc.iup_canvas); + if (use_gdiplus) cdUseContextPlus(0); + + /* associa os call-backs */ + setcallbacks(); + + /* os call-backs do canvas devem ser associados depois de sua criacao */ + IupSetFunction("cmdRepaint", (Icallback) fRepaint); + IupSetFunction("cmdMotionCB", (Icallback) fMotionCB); + IupSetFunction("cmdButtonCB", (Icallback) fButtonCB); + IupSetFunction("cmdResizeCB", (Icallback) fResizeCB); + IupSetFunction("cmdGetFocusCB", (Icallback) fGetFocusCB); + + /* inicializaccao do contexto */ + ctgc.write_mode = CD_REPLACE; + ctgc.line_style = CD_CONTINUOUS; + ctgc.line_cap = CD_CAPFLAT; + ctgc.line_join = CD_MITER; + ctgc.fill_mode = CD_EVENODD; + ctgc.line_width = 1; + ctgc.font_style = CD_PLAIN; + ctgc.font_typeface = CD_SYSTEM; + ctgc.font_size = CD_STANDARD; + ctgc.text_alignment = CD_BASE_LEFT; + ctgc.text_orientation = 0; + ctgc.back_opacity = CD_TRANSPARENT; + ctgc.mark_type = CD_STAR; + ctgc.poly_mode = CD_OPEN_LINES; + ctgc.interior_style = CD_SOLID; + ctgc.hatch = CD_HORIZONTAL; + ctgc.following = FALSE; + ctgc.foreground = CD_BLACK; + ctgc.background = CD_WHITE; + ctgc.head = NULL; + ctgc.test_image = NULL; + ctgc.sim = 0; + ctgc.stretch_play = 0; + ctgc.dlg_x = IUP_CENTER; + ctgc.dlg_y = IUP_CENTER; + ctgc.visible = 0; + + /* inicializa os vetores stipple e pattern */ + initsamples(); + + /* inicializa o CDTest com a primitiva LINE */ + ctgc.dlg_cur_prim = IupGetHandle("dlgLB"); + ctgc.bt_cur_prim = IupGetHandle("btCurPrim"); + ctgc.cur_prim = LINE; + + /* inicializaccao do Canvas do IUP */ + cdActivate(ctgc.iup_canvas); + cdFont(ctgc.font_typeface,ctgc.font_style,ctgc.font_size); + cdBackground(ctgc.background); + cdClear(); + cdGetCanvasSize(&(ctgc.w),&(ctgc.h),NULL,NULL); + ctgc.bpp = cdGetColorPlanes(); + + { + double mm, xres; + cdPixel2MM(1, 0, &mm, NULL); + xres = 1.0/mm; + ctgc.res = xres; + } + + /* inicializa o canvas off-screen de double-bufering */ + ctgc.buffering = NO_BUFFER; + ctgc.buffer_canvas = NULL; + + /* inicializa o clipping */ + ctgc.clip_mode = CD_CLIPOFF; + cdGetClipArea(&(ctgc.clip_xmin), &(ctgc.clip_xmax), + &(ctgc.clip_ymin), &(ctgc.clip_ymax)); + + /* zera o buffer temporario de pontos */ + ctgc.num_points = 0; + + /* a lista de primitivas jah estah vazia, nao hah o que apagar */ + IupSetAttribute(IupGetHandle("itEditUndo"), IUP_ACTIVE, IUP_NO); + + /* atualiza o tamanho do canvas em pixels na barra de titulo */ + sprintf(ctgc.title, "CDTest 5.3 (%dx%d - %dbpp)", ctgc.w, ctgc.h, ctgc.bpp); + IupSetAttribute(IupGetHandle("dlgMain"), IUP_TITLE, ctgc.title); + + /* inicializa a barra de status */ + sprintf(ctgc.status_line, "LEFT click and drag."); + set_status(); + + /* inicializa a posiccao do mouse */ + mouse_pos(0, 0); + + /* constroi os dialogos do CDTest sem mostra-los */ + IupMap(IupGetHandle("dlgLB")); + IupMap(IupGetHandle("dlgAS")); + IupMap(IupGetHandle("dlgPixel")); + IupMap(IupGetHandle("dlgImage")); + IupMap(IupGetHandle("dlgImageRGB")); + IupMap(IupGetHandle("dlgMark")); + IupMap(IupGetHandle("dlgText")); + IupMap(IupGetHandle("dlgClip")); + IupMap(IupGetHandle("dlgAttributes")); + IupMap(IupGetHandle("dlgWDCanvas")); + IupMap(IupGetHandle("dlgPICCanvas")); + + /* cria o canvas WD */ + if (use_gdiplus) cdUseContextPlus(1); + ctgc.wd_canvas = cdCreateCanvas(CD_IUP, IupGetHandle("cnvWDCanvas")); + ctgc.pic_canvas = cdCreateCanvas(CD_IUP, IupGetHandle("cnvPICCanvas")); + ctgc.picture = cdCreateCanvas(CD_PICTURE, ""); + if (use_gdiplus) cdUseContextPlus(0); + + /* CDTEST default values */ + cdActivate(ctgc.picture); + cdLineStyleDashes(ctgc.dashes, 4); + cdPattern(10, 10, ctgc.pattern); + cdStipple(10, 10, ctgc.stipple); + cdInteriorStyle(CD_SOLID); + + cdActivate(ctgc.wd_canvas); + cdLineStyleDashes(ctgc.dashes, 4); + cdPattern(10, 10, ctgc.pattern); + cdStipple(10, 10, ctgc.stipple); + cdInteriorStyle(CD_SOLID); + + /* reativa o canvas IUP */ + cdActivate(ctgc.iup_canvas); + cdLineStyleDashes(ctgc.dashes, 4); + cdPattern(10, 10, ctgc.pattern); + cdStipple(10, 10, ctgc.stipple); + cdInteriorStyle(CD_SOLID); +} + +static void CDTestClose(void) +{ + dellist(); + + ColorBarClose(); + + if (ctgc.buffer_canvas) cdKillCanvas(ctgc.buffer_canvas); + if (ctgc.test_image) cdKillImage(ctgc.test_image); + cdKillCanvas(ctgc.picture); + cdKillCanvas(ctgc.pic_canvas); + cdKillCanvas(ctgc.wd_canvas); + cdKillCanvas(ctgc.iup_canvas); + + memset(&ctgc, 0, sizeof(tCTC)); + + IupDestroy(IupGetHandle("dlgLB")); + IupDestroy(IupGetHandle("dlgAS")); + IupDestroy(IupGetHandle("dlgPixel")); + IupDestroy(IupGetHandle("dlgImage")); + IupDestroy(IupGetHandle("dlgImageRGB")); + IupDestroy(IupGetHandle("dlgMark")); + IupDestroy(IupGetHandle("dlgText")); + IupDestroy(IupGetHandle("dlgClip")); + IupDestroy(IupGetHandle("dlgAttributes")); + IupDestroy(IupGetHandle("dlgWDCanvas")); + IupDestroy(IupGetHandle("dlgPICCanvas")); + + IupDestroy(IupGetHandle("dlgMain")); +} + +static int iscurvisible(void) +{ + char* vis = IupGetAttribute(ctgc.dlg_cur_prim, IUP_VISIBLE); + if (!vis) + return 0; + return strcmp(vis, IUP_YES) == 0? 1: 0; +} + +/*-------------------------------------------------------------------------*/ +/* Copia o conteudo da lista de primitivas para o dispositivo ativo. */ +/*-------------------------------------------------------------------------*/ +void putlist(cdCanvas *target) +{ + tList *temp; + int wdc_w, wdc_h, wd = 0; + + /* ativa o canvas destino */ + cdActivate(target); + + if (target == ctgc.wd_canvas) + { + cdGetCanvasSize(&wdc_w, &wdc_h, NULL, NULL); + wdWindow(0, ctgc.w, 0, ctgc.h); + wdViewport(0, wdc_w, 0, wdc_h); + wd = 1; + } + + /* limpa o canvas com a cor de fundo */ + cdBackground(ctgc.background); + cdClear(); + cdClipArea(ctgc.clip_xmin, ctgc.clip_xmax, ctgc.clip_ymin, ctgc.clip_ymax); + cdClip(ctgc.clip_mode); + + /* coloca a lista de primitivas no canvas */ + for (temp = ctgc.head; temp; temp = (tList *) temp->next) + { + switch (temp->type) { + case LINE: + cdWriteMode(temp->par.lineboxpar.write_mode); + cdLineCap(temp->par.lineboxpar.line_cap); + cdLineJoin(temp->par.lineboxpar.line_join); + cdLineStyle(temp->par.lineboxpar.line_style); + cdLineWidth(temp->par.lineboxpar.line_width); + cdForeground(temp->par.lineboxpar.foreground); + if (wd) + wdLine(temp->par.lineboxpar.x1, temp->par.lineboxpar.y1, + temp->par.lineboxpar.x2, temp->par.lineboxpar.y2); + else + cdLine(temp->par.lineboxpar.x1, temp->par.lineboxpar.y1, + temp->par.lineboxpar.x2, temp->par.lineboxpar.y2); + break; + case RECT: + cdWriteMode(temp->par.lineboxpar.write_mode); + cdLineCap(temp->par.lineboxpar.line_cap); + cdLineJoin(temp->par.lineboxpar.line_join); + cdLineStyle(temp->par.lineboxpar.line_style); + cdLineWidth(temp->par.lineboxpar.line_width); + cdForeground(temp->par.lineboxpar.foreground); + if (wd) + wdRect(temp->par.lineboxpar.x1, temp->par.lineboxpar.x2, + temp->par.lineboxpar.y1, temp->par.lineboxpar.y2); + else + cdRect(temp->par.lineboxpar.x1, temp->par.lineboxpar.x2, + temp->par.lineboxpar.y1, temp->par.lineboxpar.y2); + break; + case BOX: + cdWriteMode(temp->par.lineboxpar.write_mode); + cdLineCap(temp->par.lineboxpar.line_cap); + cdLineJoin(temp->par.lineboxpar.line_join); + cdLineStyle(temp->par.lineboxpar.line_style); + cdLineWidth(temp->par.lineboxpar.line_width); + cdForeground(temp->par.lineboxpar.foreground); + cdBackground(temp->par.lineboxpar.background); + cdBackOpacity(temp->par.lineboxpar.back_opacity); + cdHatch(temp->par.lineboxpar.hatch); + cdInteriorStyle(temp->par.lineboxpar.interior_style); + if (wd) + wdBox(temp->par.lineboxpar.x1, temp->par.lineboxpar.x2, + temp->par.lineboxpar.y1, temp->par.lineboxpar.y2); + else + cdBox(temp->par.lineboxpar.x1, temp->par.lineboxpar.x2, + temp->par.lineboxpar.y1, temp->par.lineboxpar.y2); + break; + case ARC: + cdWriteMode(temp->par.arcsectorpar.write_mode); + cdLineCap(temp->par.arcsectorpar.line_cap); + cdLineJoin(temp->par.arcsectorpar.line_join); + cdLineStyle(temp->par.arcsectorpar.line_style); + cdLineWidth(temp->par.arcsectorpar.line_width); + cdForeground(temp->par.arcsectorpar.foreground); + if (wd) + wdArc(temp->par.arcsectorpar.xc, temp->par.arcsectorpar.yc, + temp->par.arcsectorpar.w, temp->par.arcsectorpar.h, + temp->par.arcsectorpar.angle1, temp->par.arcsectorpar.angle2); + else + cdArc(temp->par.arcsectorpar.xc, temp->par.arcsectorpar.yc, + temp->par.arcsectorpar.w, temp->par.arcsectorpar.h, + temp->par.arcsectorpar.angle1, temp->par.arcsectorpar.angle2); + break; + case CHORD: + cdWriteMode(temp->par.arcsectorpar.write_mode); + cdLineCap(temp->par.arcsectorpar.line_cap); + cdLineJoin(temp->par.arcsectorpar.line_join); + cdLineStyle(temp->par.arcsectorpar.line_style); + cdLineWidth(temp->par.arcsectorpar.line_width); + cdForeground(temp->par.arcsectorpar.foreground); + cdBackground(temp->par.arcsectorpar.background); + cdBackOpacity(temp->par.arcsectorpar.back_opacity); + cdHatch(temp->par.arcsectorpar.hatch); + cdInteriorStyle(temp->par.arcsectorpar.interior_style); + if (wd) + wdChord(temp->par.arcsectorpar.xc, temp->par.arcsectorpar.yc, + temp->par.arcsectorpar.w, temp->par.arcsectorpar.h, + temp->par.arcsectorpar.angle1, temp->par.arcsectorpar.angle2); + else + cdChord(temp->par.arcsectorpar.xc, temp->par.arcsectorpar.yc, + temp->par.arcsectorpar.w, temp->par.arcsectorpar.h, + temp->par.arcsectorpar.angle1, temp->par.arcsectorpar.angle2); + break; + case SECTOR: + cdWriteMode(temp->par.arcsectorpar.write_mode); + cdLineCap(temp->par.arcsectorpar.line_cap); + cdLineJoin(temp->par.arcsectorpar.line_join); + cdLineStyle(temp->par.arcsectorpar.line_style); + cdLineWidth(temp->par.arcsectorpar.line_width); + cdForeground(temp->par.arcsectorpar.foreground); + cdBackground(temp->par.arcsectorpar.background); + cdBackOpacity(temp->par.arcsectorpar.back_opacity); + cdHatch(temp->par.arcsectorpar.hatch); + cdInteriorStyle(temp->par.arcsectorpar.interior_style); + if (wd) + wdSector(temp->par.arcsectorpar.xc, temp->par.arcsectorpar.yc, + temp->par.arcsectorpar.w, temp->par.arcsectorpar.h, + temp->par.arcsectorpar.angle1, temp->par.arcsectorpar.angle2); + else + cdSector(temp->par.arcsectorpar.xc, temp->par.arcsectorpar.yc, + temp->par.arcsectorpar.w, temp->par.arcsectorpar.h, + temp->par.arcsectorpar.angle1, temp->par.arcsectorpar.angle2); + break; + case PIXEL: + cdWriteMode(temp->par.pixelpar.write_mode); + cdPixel(temp->par.pixelpar.x, temp->par.pixelpar.y, + temp->par.pixelpar.foreground); + break; + case MARK: + cdWriteMode(temp->par.markpar.write_mode); + cdMarkSize(temp->par.markpar.mark_size); + cdMarkType(temp->par.markpar.mark_type); + cdForeground(temp->par.markpar.foreground); + if (wd) + wdMark(temp->par.markpar.x, temp->par.markpar.y); + else + cdMark(temp->par.markpar.x, temp->par.markpar.y); + break; + case TEXT: + cdWriteMode(temp->par.textpar.write_mode); + cdForeground(temp->par.textpar.foreground); + cdBackground(temp->par.textpar.background); + cdBackOpacity(temp->par.textpar.back_opacity); + cdTextAlignment(temp->par.textpar.text_alignment); + cdTextOrientation(temp->par.textpar.text_orientation); + cdFont(temp->par.textpar.font_typeface, + temp->par.textpar.font_style, + temp->par.textpar.font_size); + if (wd) + wdText(temp->par.textpar.x, temp->par.textpar.y, + temp->par.textpar.s); + else + cdText(temp->par.textpar.x, temp->par.textpar.y, + temp->par.textpar.s); + break; + case POLY: { + int i; + cdForeground(temp->par.polypar.foreground); + cdBackground(temp->par.polypar.background); + cdWriteMode(temp->par.polypar.write_mode); + cdLineCap(temp->par.polypar.line_cap); + cdLineJoin(temp->par.polypar.line_join); + cdLineStyle(temp->par.polypar.line_style); + cdLineWidth(temp->par.polypar.line_width); + cdFillMode(temp->par.polypar.fill_mode); + cdBackOpacity(temp->par.polypar.back_opacity); + cdHatch(temp->par.polypar.hatch); + cdInteriorStyle(temp->par.polypar.interior_style); + cdBegin(temp->par.polypar.poly_mode); + if (wd) + for (i=0; (i<temp->par.polypar.num_points); i++) { + wdVertex(temp->par.polypar.points[i].x, + temp->par.polypar.points[i].y); + } + else + for (i=0; (i<temp->par.polypar.num_points); i++) { + cdVertex(temp->par.polypar.points[i].x, + temp->par.polypar.points[i].y); + } + cdEnd(); + break; + case META: + cdWriteMode(CD_REPLACE); + cdLineStyle(CD_CONTINUOUS); + cdLineWidth(1); + cdBackground(CD_WHITE); + cdBackOpacity(CD_TRANSPARENT); + cdForeground(CD_BLACK); + cdInteriorStyle(CD_SOLID); + if (ctgc.stretch_play) + { + if (wd) + cdPlay(temp->par.metapar.ctx, 0, wdc_w-1, 0, wdc_h-1, temp->par.metapar.filename); + else + cdPlay(temp->par.metapar.ctx, 0, ctgc.w-1, 0, ctgc.h-1, temp->par.metapar.filename); + } + else + cdPlay(temp->par.metapar.ctx, 0, 0, 0, 0, temp->par.metapar.filename); + break; + default: + break; + } + } + } + + /* volta o clip-mode para o corrente */ + cdClip(ctgc.clip_mode); +} + +/*-------------------------------------------------------------------------*/ +/* Copia o conteudo da lista de primitivas no canvas WD. */ +/*-------------------------------------------------------------------------*/ +int fWDRepaint(void) +{ + putlist(ctgc.wd_canvas); + + /* reativa o canvas iup */ + cdActivate(ctgc.iup_canvas); + + return IUP_DEFAULT; +} + +int fPICRepaint(void) +{ + int w, h; + putlist(ctgc.picture); + + cdActivate(ctgc.pic_canvas); + cdGetCanvasSize(&w, &h, NULL, NULL); + cdClear(); + if (ctgc.stretch_play) + cdPlay(CD_PICTURE, 0, w-1, 0, h-1, ctgc.picture); + else + cdPlay(CD_PICTURE, 0, 0, 0, 0, ctgc.picture); + + /* reativa o canvas iup */ + cdActivate(ctgc.iup_canvas); + + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Redesenha o canvas. */ +/*-------------------------------------------------------------------------*/ +void updatecanvas(void) +{ + if (ctgc.buffering == NO_BUFFER) + putlist(ctgc.iup_canvas); + else + { + cdActivate(ctgc.iup_canvas); + cdClip(CD_CLIPOFF); + + putlist(ctgc.buffer_canvas); + cdFlush(); + + cdActivate(ctgc.iup_canvas); + cdClip(ctgc.clip_mode); + } + + if (ctgc.wd_dialog) + fWDRepaint(); + + if (ctgc.pic_dialog) + fPICRepaint(); +} + +/*-------------------------------------------------------------------------*/ +/* Redesenha o canvas. */ +/*-------------------------------------------------------------------------*/ +int fRepaint(void) +{ + int i; + + /* ativa o canvas na tela */ + cdActivate(ctgc.iup_canvas); + wdViewport(0, ctgc.w, 0, ctgc.h); + + /* desliga o clipping durante o evento Repaint */ + cdClip(CD_CLIPOFF); + + /* double-buffering? */ + cdWriteMode(CD_REPLACE); + updatecanvas(); + + /* se o evento repaint for gerado durante o rubber band...*/ + /* ...eh preciso restaurar o estado anterior */ + if (ctgc.following) { + cdWriteMode(CD_NOT_XOR); + cdForeground(CD_BLACK); + cdLineStyle(CD_CONTINUOUS); + cdLineWidth(1); + switch (ctgc.cur_prim) { + case POLY: + 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); + } + polygon(REPAINT, 0, 0); + break; + case LINE: + line(REPAINT, 0, 0); + break; + case ARC: + case CHORD: + case SECTOR: + arc(REPAINT, 0, 0); + break; + case RECT: + case BOX: + box(REPAINT, 0, 0); + break; + default: + break; + } + } + + /* restaura o estado de clipping anterior ao evento Repaint */ + cdClip(ctgc.clip_mode); + + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Ativa o canvas WD. */ +/*-------------------------------------------------------------------------*/ +int fWDCanvas(void) +{ + IupShow(IupGetHandle("dlgWDCanvas")); + ctgc.wd_dialog = TRUE; + IupSetFunction("cmdWDRepaint", (Icallback)fWDRepaint); + fWDRepaint(); + return IUP_DEFAULT; +} + +int fPICCanvas(void) +{ + IupShow(IupGetHandle("dlgPICCanvas")); + ctgc.pic_dialog = TRUE; + IupSetFunction("cmdPICRepaint", (Icallback)fPICRepaint); + fPICRepaint(); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Desativa o canvas WD. */ +/*-------------------------------------------------------------------------*/ +int fCloseWD(void) +{ + ctgc.wd_dialog = FALSE; + return IUP_DEFAULT; +} + +int fClosePIC(void) +{ + ctgc.pic_dialog = FALSE; + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Apaga a ultima primitiva desenhada. */ +/*-------------------------------------------------------------------------*/ +int fEditUndo(void) +{ + /* apaga a ultima primitiva da fila */ + dellast(); + /* se nao ha mais primitivas na fila, desabilita o undo */ + if (ctgc.head == NULL) + IupSetAttribute(IupGetHandle("itEditUndo"), IUP_ACTIVE, IUP_NO); + + updatecanvas(); + + return IUP_DEFAULT; +} + +int fSimulate(Ihandle *self, int v) +{ + ignore(self); + + cdActivate(ctgc.iup_canvas); + + if (v == 1) + { + if (ctgc.sim == 1) + return IUP_DEFAULT; + + ctgc.sim = 1; + cdSimulate(CD_SIM_ALL); + sprintf(ctgc.status_line, "cdSimulate(CD_SIM_ALL)"); + } + else + { + if (ctgc.sim == 0) + return IUP_DEFAULT; + + ctgc.sim = 0; + cdSimulate(CD_SIM_NONE); + sprintf(ctgc.status_line, "cdSimulate(CD_SIM_NONE)"); + } + + set_status(); + updatecanvas(); + return IUP_DEFAULT; +} + +int fStretchPlay(Ihandle *self, int v) +{ + ignore(self); + ctgc.stretch_play = v; + updatecanvas(); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Tchau. */ +/*-------------------------------------------------------------------------*/ +int fFileExit(void) +{ + IupHide(ctgc.dlg_cur_prim); + return IUP_CLOSE; +} + +/*-------------------------------------------------------------------------*/ +/* Funcao associada ao toggle OpenLines. */ +/*-------------------------------------------------------------------------*/ +int fOpenLines(void) +{ + ctgc.poly_mode = CD_OPEN_LINES; + sprintf(ctgc.status_line, "cdBegin(CD_OPEN_LINES)"); + set_status(); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Funcao associada ao toggle ClosedLines. */ +/*-------------------------------------------------------------------------*/ +int fClosedLines(void) +{ + ctgc.poly_mode = CD_CLOSED_LINES; + sprintf(ctgc.status_line, "cdBegin(CD_CLOSED_LINES)"); + set_status(); + return IUP_DEFAULT; +} + +int fPolyBezier(void) +{ + ctgc.poly_mode = CD_BEZIER; + sprintf(ctgc.status_line, "cdBegin(CD_BEZIER)"); + set_status(); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Funcao associada ao toggle Fill. */ +/*-------------------------------------------------------------------------*/ +int fFill(void) +{ + ctgc.poly_mode = CD_FILL; + sprintf(ctgc.status_line, "cdBegin(CD_FILL)"); + set_status(); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Funcao associada ao toggle Clip. */ +/*-------------------------------------------------------------------------*/ +int fPolyClip(void) +{ + ctgc.poly_mode = CD_CLIP; + sprintf(ctgc.status_line, "cdBegin(CD_CLIP)"); + set_status(); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Funcao associada ao toggle Solid. */ +/*-------------------------------------------------------------------------*/ +int fSolid(void) +{ + ctgc.interior_style = CD_SOLID; + sprintf(ctgc.status_line, "cdInteriorStyle(CD_SOLID)"); + set_status(); + cdInteriorStyle(CD_SOLID); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Funcao associada ao toggle Hatch. */ +/*-------------------------------------------------------------------------*/ +int fHatch(void) +{ + ctgc.interior_style = CD_HATCH; + cdInteriorStyle(CD_HATCH); + sprintf(ctgc.status_line, "cdInteriorStyle(CD_HATCH)"); + set_status(); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Funcao associada ao toggle Stipple. */ +/*-------------------------------------------------------------------------*/ +int fStipple(void) +{ + ctgc.interior_style = CD_STIPPLE; + cdInteriorStyle(CD_STIPPLE); + sprintf(ctgc.status_line, "cdInteriorStyle(CD_STIPPLE)"); + set_status(); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Funcao associada ao toggle Pattern. */ +/*-------------------------------------------------------------------------*/ +int fPattern(void) +{ + ctgc.interior_style = CD_PATTERN; + cdInteriorStyle(CD_PATTERN); + sprintf(ctgc.status_line, "cdInteriorStyle(CD_PATTERN)"); + set_status(); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Seleciona o a opacidade do fundo. */ +/*-------------------------------------------------------------------------*/ +int fOpacity(Ihandle *self, char *t, int o, int v) +{ + ignore(t); + ignore(self); + if (v == 0) return IUP_DEFAULT; + switch (o) { + case 1: + ctgc.back_opacity = CD_OPAQUE; + sprintf(ctgc.status_line, "cdBackOpacity(CD_OPAQUE)"); + break; + case 2: + ctgc.back_opacity = CD_TRANSPARENT; + sprintf(ctgc.status_line, "cdBackOpacity(CD_TRANSPARENT)"); + break; + } + set_status(); + return IUP_DEFAULT; +} + + +/*-------------------------------------------------------------------------*/ +/* Seleciona o modo de repaint para imagem do servidor. */ +/*-------------------------------------------------------------------------*/ +int fImageBuffer(Ihandle *self, int v) +{ + ignore(self); + + /* se o toggle foi para o estado ligado... */ + if (v) { + switch (ctgc.buffering) { + case IMAGE_BUFFER: + break; + case IMAGERGB_BUFFER: + /* mata o canvas do buffer anterior */ + if (ctgc.buffer_canvas) cdKillCanvas(ctgc.buffer_canvas); + ctgc.buffer_canvas = NULL; + /* prosegue como se nao houvesse o buffer anterior */ + case NO_BUFFER: + /* cria o canvas do buffer */ + if (use_gdiplus) cdUseContextPlus(1); + ctgc.buffer_canvas = cdCreateCanvas(CD_DBUFFER, ctgc.iup_canvas); + if (!antialias) cdCanvasSetAttribute(ctgc.buffer_canvas, "ANTIALIAS", "0"); + if (use_gdiplus) cdUseContextPlus(0); + /* se nao consegui criar o canvas... */ + if (!ctgc.buffer_canvas) { + /* desabilita o double-buffering */ + ctgc.buffering = NO_BUFFER; + sprintf(ctgc.status_line, "Error creating CD_DBUFFER canvas."); + set_status(); + } + else { + /* seta o modo de escrita para double-buffering em imagem do servidor */ + ctgc.buffering = IMAGE_BUFFER; + /* reconstroe o stipple e o pattern no canvas do buffer */ + cdActivate(ctgc.buffer_canvas); + cdLineStyleDashes(ctgc.dashes, 4); + cdPattern(10, 10, ctgc.pattern); + cdStipple(10, 10, ctgc.stipple); + cdInteriorStyle(CD_SOLID); + if (ctgc.sim == 1) + cdSimulate(CD_SIM_ALL); + else + cdSimulate(CD_SIM_NONE); + /* atualiza o buffer */ + updatecanvas(); + /* muda a linha de status */ + sprintf(ctgc.status_line, "CD_DBUFFER buffer active."); + set_status(); + } + + break; + } + } + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Seleciona o modo de repaint para imagem RGB. */ +/*-------------------------------------------------------------------------*/ +int fRGBBuffer(Ihandle *self, int v) +{ + ignore(self); + + if (v) { + switch (ctgc.buffering) { + case IMAGERGB_BUFFER: + break; + case IMAGE_BUFFER: + /* mata o canvas do buffer anterior */ + if (ctgc.buffer_canvas) cdKillCanvas(ctgc.buffer_canvas); + ctgc.buffer_canvas = NULL; + /* prossegue como se nao houvesse o buffer anterior */ + case NO_BUFFER: + /* cria o canvas do buffer */ + ctgc.buffer_canvas = cdCreateCanvas(CD_DBUFFERRGB, ctgc.iup_canvas); + if (!antialias) cdCanvasSetAttribute(ctgc.buffer_canvas, "ANTIALIAS", "0"); + /* se nao consegui criar o canvas... */ + if (!ctgc.buffer_canvas) { + /* mata a imagem alocada */ + /* desabilita o double-buffering */ + ctgc.buffering = NO_BUFFER; + sprintf(ctgc.status_line, "Error creating CD_DBUFFERRGB canvas."); + set_status(); + } + else { + /* seta o modo de escrita para double-buffering em imagem RGB */ + ctgc.buffering = IMAGERGB_BUFFER; + /* reconstroe o stipple e o pattern no canvas do buffer */ + cdActivate(ctgc.buffer_canvas); + cdLineStyleDashes(ctgc.dashes, 4); + cdPattern(10, 10, ctgc.pattern); + cdStipple(10, 10, ctgc.stipple); + cdInteriorStyle(CD_SOLID); + if (ctgc.sim == 1) + cdSimulate(CD_SIM_ALL); + else + cdSimulate(CD_SIM_NONE); + /* atualiza o buffer */ + updatecanvas(); + /* muda a linha de status */ + sprintf(ctgc.status_line, "CD_DBUFFERRGB buffer active."); + set_status(); + } + break; + } + } + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Seleciona o modo de repaint para escrita diretamente na tela. */ +/*-------------------------------------------------------------------------*/ +int fNoBuffering(Ihandle *self, int v) +{ + ignore(self); + + /* se foi para double-buffering, atualiza o buffer off-screen */ + if (v) { + switch (ctgc.buffering) { + case IMAGERGB_BUFFER: + /* mata o canvas */ + if (ctgc.buffer_canvas) cdKillCanvas(ctgc.buffer_canvas); + ctgc.buffer_canvas = NULL; + /* passa a desenhar diretamente na tela */ + ctgc.buffering = NO_BUFFER; + /* atualiza o buffer */ + updatecanvas(); + break; + case IMAGE_BUFFER: + /* mata o canvas */ + if (ctgc.buffer_canvas) cdKillCanvas(ctgc.buffer_canvas); + ctgc.buffer_canvas = NULL; + /* passa a desenhar diretamente na tela */ + ctgc.buffering = NO_BUFFER; + /* atualiza o buffer */ + updatecanvas(); + break; + case NO_BUFFER: + break; + } + } + /* muda a linha de status */ + sprintf(ctgc.status_line, "Now drawing on-screen."); + set_status(); + + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Funcoes da barra de estilos.. */ +/*-------------------------------------------------------------------------*/ +int fMarkType(Ihandle *self, char *t, int o, int v) +{ + ignore(t); + ignore(self); + if (v == 0) return IUP_DEFAULT; + switch (o) { + case 1: + ctgc.mark_type = CD_PLUS; + sprintf(ctgc.status_line, "cdMarkType(CD_PLUS)"); + break; + case 2: + ctgc.mark_type = CD_STAR; + sprintf(ctgc.status_line, "cdMarkType(CD_STAR)"); + break; + case 3: + ctgc.mark_type = CD_CIRCLE; + sprintf(ctgc.status_line, "cdMarkType(CD_CIRCLE)"); + break; + case 4: + ctgc.mark_type = CD_X; + sprintf(ctgc.status_line, "cdMarkType(CD_X)"); + break; + case 5: + ctgc.mark_type = CD_BOX; + sprintf(ctgc.status_line, "cdMarkType(CD_BOX)"); + break; + case 6: + ctgc.mark_type = CD_DIAMOND; + sprintf(ctgc.status_line, "cdMarkType(CD_DIAMOND)"); + break; + case 7: + ctgc.mark_type = CD_HOLLOW_CIRCLE; + sprintf(ctgc.status_line, "cdMarkType(CD_HOLLOW_CIRCLE)"); + break; + case 8: + ctgc.mark_type = CD_HOLLOW_BOX; + sprintf(ctgc.status_line, "cdMarkType(CD_HOLLOW_BOX)"); + break; + case 9: + ctgc.mark_type = CD_HOLLOW_DIAMOND; + sprintf(ctgc.status_line, "cdMarkType(CD_HOLLOW_DIAMOND)"); + break; + } + set_status(); + return IUP_DEFAULT; +} + +int fWriteMode(Ihandle *self, char *t, int o, int v) +{ + ignore(t); + ignore(self); + if (v == 0) return IUP_DEFAULT; + switch (o) { + case 1: + ctgc.write_mode = CD_REPLACE; + sprintf(ctgc.status_line, "cdWriteMode(CD_REPLACE)"); + break; + case 2: + ctgc.write_mode = CD_XOR; + sprintf(ctgc.status_line, "cdWriteMode(CD_XOR)"); + break; + case 3: + ctgc.write_mode = CD_NOT_XOR; + sprintf(ctgc.status_line, "cdWriteMode(CD_NOT_XOR)"); + break; + } + set_status(); + return IUP_DEFAULT; +} + +int fLineStyle(Ihandle *self, char *t, int o, int v) +{ + ignore(t); + ignore(self); + if (v == 0) return IUP_DEFAULT; + switch (o) { + case 1: + ctgc.line_style = CD_CONTINUOUS; + sprintf(ctgc.status_line, "cdLineStyle(CD_CONTINUOUS)"); + break; + case 2: + ctgc.line_style = CD_DASHED; + sprintf(ctgc.status_line, "cdLineStyle(CD_DASHED)"); + break; + case 3: + ctgc.line_style = CD_DOTTED; + sprintf(ctgc.status_line, "cdLineStyle(CD_DOTTED)"); + break; + case 4: + ctgc.line_style = CD_DASH_DOT; + sprintf(ctgc.status_line, "cdLineStyle(CD_DASH_DOT)"); + break; + case 5: + ctgc.line_style = CD_DASH_DOT_DOT; + sprintf(ctgc.status_line, "cdLineStyle(CD_DASH_DOT_DOT)"); + break; + case 6: + ctgc.line_style = CD_CUSTOM; + sprintf(ctgc.status_line, "cdLineStyle(CD_CUSTOM)"); + break; + } + set_status(); + return IUP_DEFAULT; +} + +int fLineCap(Ihandle *self, char *t, int o, int v) +{ + ignore(t); + ignore(self); + if (v == 0) return IUP_DEFAULT; + switch (o) { + case 1: + ctgc.line_cap = CD_CAPFLAT; + sprintf(ctgc.status_line, "cdLineCap(CD_CAPFLAT)"); + break; + case 2: + ctgc.line_cap = CD_CAPSQUARE; + sprintf(ctgc.status_line, "cdLineCap(CD_CAPSQUARE)"); + break; + case 3: + ctgc.line_cap = CD_CAPROUND; + sprintf(ctgc.status_line, "cdLineCap(CD_CAPROUND)"); + break; + } + set_status(); + return IUP_DEFAULT; +} + +int fLineJoin(Ihandle *self, char *t, int o, int v) +{ + ignore(t); + ignore(self); + if (v == 0) return IUP_DEFAULT; + switch (o) { + case 1: + ctgc.line_join = CD_MITER; + sprintf(ctgc.status_line, "cdLineJoin(CD_MITER)"); + break; + case 2: + ctgc.line_join = CD_BEVEL; + sprintf(ctgc.status_line, "cdLineJoin(CD_BEVEL)"); + break; + case 3: + ctgc.line_join = CD_ROUND; + sprintf(ctgc.status_line, "cdLineJoin(CD_ROUND)"); + break; + } + set_status(); + return IUP_DEFAULT; +} + +int fFillMode(Ihandle *self, char *t, int o, int v) +{ + ignore(t); + ignore(self); + if (v == 0) return IUP_DEFAULT; + switch (o) { + case 1: + ctgc.fill_mode = CD_EVENODD; + sprintf(ctgc.status_line, "cdFillMode(CD_EVENODD)"); + break; + case 2: + ctgc.fill_mode = CD_WINDING; + sprintf(ctgc.status_line, "cdFillMode(CD_WINDING)"); + break; + } + set_status(); + return IUP_DEFAULT; +} + +char* font_style[4] = {"CD_PLAIN", "CD_BOLD", "CD_ITALIC", "CD_BOLD_ITALIC"}; +char* font_face[4] = {"CD_SYSTEM", "CD_COURIER", "CD_TIMES_ROMAN", "CD_HELVETICA"}; + +int fFontStyle(Ihandle *self, char *t, int o, int v) +{ + ignore(t); + ignore(self); + if (v == 0) return IUP_DEFAULT; + switch (o) { + case 1: + ctgc.font_style = CD_PLAIN; + break; + case 2: + ctgc.font_style = CD_BOLD; + break; + case 3: + ctgc.font_style = CD_ITALIC; + break; + case 4: + ctgc.font_style = CD_BOLD_ITALIC; + break; + } + ctgc.font_size = IupGetInt(IupGetHandle("txtFontSize"), IUP_VALUE); + sprintf(ctgc.status_line, "cdFont(%s, %s, %d)", font_face[ctgc.font_typeface], font_style[ctgc.font_style], ctgc.font_size); + set_status(); + return IUP_DEFAULT; +} + + +int fFontTypeFace(Ihandle *self, char *t, int o, int v) +{ + ignore(t); + ignore(self); + if (v == 0) return IUP_DEFAULT; + switch (o) { + case 1: + ctgc.font_typeface = CD_SYSTEM; + break; + case 2: + ctgc.font_typeface = CD_COURIER; + break; + case 3: + ctgc.font_typeface = CD_TIMES_ROMAN; + break; + case 4: + ctgc.font_typeface = CD_HELVETICA; + break; + } + ctgc.font_size = IupGetInt(IupGetHandle("txtFontSize"), IUP_VALUE); + sprintf(ctgc.status_line, "cdFont(%s, %s, %d)", font_face[ctgc.font_typeface], font_style[ctgc.font_style], ctgc.font_size); + set_status(); + return IUP_DEFAULT; +} + +int fTextAlignment(Ihandle *self, char *t, int o, int v) +{ + ignore(t); + ignore(self); + if (v == 0) return IUP_DEFAULT; + switch (o) { + case 1: + ctgc.text_alignment = CD_NORTH; + sprintf(ctgc.status_line, "cdTextAlignment(CD_NORTH)"); + break; + case 2 : + ctgc.text_alignment = CD_SOUTH; + sprintf(ctgc.status_line, "cdTextAlignment(CD_SOUTH)"); + break; + case 3: + ctgc.text_alignment = CD_EAST; + sprintf(ctgc.status_line, "cdTextAlignment(CD_EAST)"); + break; + case 4: + ctgc.text_alignment = CD_WEST; + sprintf(ctgc.status_line, "cdTextAlignment(CD_WEST)"); + break; + case 5: + ctgc.text_alignment = CD_NORTH_EAST; + sprintf(ctgc.status_line, "cdTextAlignment(CD_NORTH_EAST)"); + break; + case 6: + ctgc.text_alignment = CD_NORTH_WEST; + sprintf(ctgc.status_line, "cdTextAlignment(CD_NORTH_WEST)"); + break; + case 7: + ctgc.text_alignment = CD_SOUTH_EAST; + sprintf(ctgc.status_line, "cdTextAlignment(CD_SOUTH_EAST)"); + break; + case 8: + ctgc.text_alignment = CD_SOUTH_WEST; + sprintf(ctgc.status_line, "cdTextAlignment(CD_SOUTH_WEST)"); + break; + case 9: + ctgc.text_alignment = CD_CENTER; + sprintf(ctgc.status_line, "cdTextAlignment(CD_CENTER)"); + break; + case 10: + ctgc.text_alignment = CD_BASE_LEFT; + sprintf(ctgc.status_line, "cdTextAlignment(CD_BASE_LEFT)"); + break; + case 11: + ctgc.text_alignment = CD_BASE_CENTER; + sprintf(ctgc.status_line, "cdTextAlignment(CD_BASE_CENTER)"); + break; + case 12: + ctgc.text_alignment = CD_BASE_RIGHT; + sprintf(ctgc.status_line, "cdTextAlignment(CD_BASE_RIGHT)"); + break; + } + set_status(); + return IUP_DEFAULT; +} + +int fHatchStyle(Ihandle *self, char *t, int o, int v) +{ + ignore(t); + ignore(self); + if (v == 0) return IUP_DEFAULT; + switch (o) { + case 1: + ctgc.hatch = CD_HORIZONTAL; + sprintf(ctgc.status_line, "cdHatch(CD_HORIZONTAL)"); + break; + case 2 : + ctgc.hatch = CD_VERTICAL; + sprintf(ctgc.status_line, "cdHatch(CD_VERTICAL)"); + break; + case 3: + ctgc.hatch = CD_FDIAGONAL; + sprintf(ctgc.status_line, "cdHatch(CD_FDIAGONAL)"); + break; + case 4: + ctgc.hatch = CD_BDIAGONAL; + sprintf(ctgc.status_line, "cdHatch(CD_BDIAGONAL)"); + break; + case 5: + ctgc.hatch = CD_CROSS; + sprintf(ctgc.status_line, "cdHatch(CD_CROSS)"); + break; + case 6: + ctgc.hatch = CD_DIAGCROSS; + sprintf(ctgc.status_line, "cdHatch(CD_DIAGCROSS)"); + break; + } + set_status(); + cdHatch(ctgc.hatch); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Atualiza a linha de estatus do CDTest. */ +/*-------------------------------------------------------------------------*/ +void set_status(void) +{ + IupSetAttribute(IupGetHandle("lbStatusLine"), IUP_TITLE, ctgc.status_line); +} + +/*-------------------------------------------------------------------------*/ +/* Atualiza a posiccao do mouse no dialogo principal. */ +/*-------------------------------------------------------------------------*/ +void mouse_pos(int x, int y) +{ + /* salva a posiccao do mouse no contexto */ + ctgc.x = x; + ctgc.y = y; + + /* atualiza a posiccao do mouse no feedback para o usuario */ + sprintf(ctgc.mouse_pos, "(%4d,%4d)", x, y); + IupSetAttribute(IupGetHandle("lbMousePos"), IUP_TITLE, ctgc.mouse_pos); +} + +/*-------------------------------------------------------------------------*/ +/* Mostra a caixa de dialogo corrente. */ +/*-------------------------------------------------------------------------*/ +int fShowDialog(void) +{ + if (ctgc.dlg_cur_prim != NULL) { + IupShowXY(ctgc.dlg_cur_prim, ctgc.dlg_x, ctgc.dlg_y); + } + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Ativa a seleccao de area de clip. */ +/*-------------------------------------------------------------------------*/ +int fClip(Ihandle* self) +{ + if (ctgc.cur_prim == POLY) { + fButtonCB(NULL, IUP_BUTTON3, 0, 0, 0, 0); + } + IupSetAttribute(ctgc.bt_cur_prim, IUP_IMAGE, "imgClip"); + ctgc.following = FALSE; + ctgc.cur_prim = CLIP; + ctgc.visible = iscurvisible(); + IupHide(ctgc.dlg_cur_prim); + if (ctgc.visible) + { + ctgc.dlg_x = IupGetInt(ctgc.dlg_cur_prim, IUP_X); + ctgc.dlg_y = IupGetInt(ctgc.dlg_cur_prim, IUP_Y); + } + ctgc.dlg_cur_prim = IupGetHandle("dlgClip"); + sprintf(ctgc.status_line, "LEFT click and drag to set. RIGHT clip to disable."); + set_status(); + if (ctgc.visible || IupGetAttribute(self, "ISMENU")) + IupShowXY(ctgc.dlg_cur_prim, ctgc.dlg_x, ctgc.dlg_y); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Atualiza a area de clipping. */ +/*-------------------------------------------------------------------------*/ +int fClipArea(void) +{ + ctgc.clip_mode = CD_CLIPAREA; + ctgc.clip_xmin = IupGetInt(IupGetHandle("txtClipXmin"), IUP_VALUE); + ctgc.clip_xmax = IupGetInt(IupGetHandle("txtClipXmax"), IUP_VALUE); + ctgc.clip_ymin = IupGetInt(IupGetHandle("txtClipYmin"), IUP_VALUE); + ctgc.clip_ymax = IupGetInt(IupGetHandle("txtClipYmax"), IUP_VALUE); + cdClipArea(ctgc.clip_xmin,ctgc.clip_xmax,ctgc.clip_ymin,ctgc.clip_ymax); + cdClip(CD_CLIPAREA); + sprintf(ctgc.status_line, "cdClipArea( %d, %d, %d, %d)", + ctgc.clip_xmin,ctgc.clip_xmax,ctgc.clip_ymin,ctgc.clip_ymax); + set_status(); + updatecanvas(); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Atualiza poligono de clipping. */ +/*-------------------------------------------------------------------------*/ +int fClipPoly(void) +{ + ctgc.clip_mode=CD_CLIPPOLYGON; + cdClip(CD_CLIPPOLYGON); + sprintf(ctgc.status_line, "cdClip(CD_CLIPPOLYGON)"); + set_status(); + updatecanvas(); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Desativa o Clipping. */ +/*-------------------------------------------------------------------------*/ +int fClipOff(void) +{ + ctgc.clip_mode = CD_CLIPOFF; + cdClip(CD_CLIPOFF); + sprintf(ctgc.status_line, "cdClip(CD_CLIPOFF)"); + set_status(); + updatecanvas(); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Prepara a seleccao de imagens. */ +/*-------------------------------------------------------------------------*/ +int fImage(Ihandle* self) +{ + if (ctgc.cur_prim == POLY) { + fButtonCB(NULL, IUP_BUTTON3, 0, 0, 0, 0); + } + IupSetAttribute(ctgc.bt_cur_prim, IUP_IMAGE, "imgImage"); + ctgc.cur_prim = IMAGE; + ctgc.following = FALSE; + ctgc.visible = iscurvisible(); + IupHide(ctgc.dlg_cur_prim); + if (ctgc.visible) + { + ctgc.dlg_x = IupGetInt(ctgc.dlg_cur_prim, IUP_X); + ctgc.dlg_y = IupGetInt(ctgc.dlg_cur_prim, IUP_Y); + } + ctgc.dlg_cur_prim = IupGetHandle("dlgImage"); + sprintf(ctgc.status_line, "LEFT click and drag to get. RIGHT click to put."); + set_status(); + if (ctgc.visible || IupGetAttribute(self, "ISMENU")) + IupShowXY(ctgc.dlg_cur_prim, ctgc.dlg_x, ctgc.dlg_y); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Pega a imagem. */ +/*-------------------------------------------------------------------------*/ +int fImageGet(void) +{ + int x, y, width, height; + + /* mata a image */ + if (ctgc.test_image != NULL) { + cdKillImage(ctgc.test_image); + } + + x = IupGetInt(IupGetHandle("txtImageX"), IUP_VALUE); + y = IupGetInt(IupGetHandle("txtImageY"), IUP_VALUE); + + width = IupGetInt(IupGetHandle("txtImageW"), IUP_VALUE); + height = IupGetInt(IupGetHandle("txtImageH"), IUP_VALUE); + + if (width*height != 0) + { + if (ctgc.buffering) + cdActivate(ctgc.buffer_canvas); + else + cdActivate(ctgc.iup_canvas); + + ctgc.test_image = cdCreateImage(width, height); + if (ctgc.test_image != NULL) + { + cdGetImage(ctgc.test_image, x, y); + sprintf(ctgc.status_line, "cdGetImage( image, %d, %d)", x, y); + set_status(); + } + + cdActivate(ctgc.iup_canvas); + } + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Coloca a imagem. */ +/*-------------------------------------------------------------------------*/ +int fImagePut(void) +{ + int x, y; + + x = IupGetInt(IupGetHandle("txtImageX"), IUP_VALUE); + y = IupGetInt(IupGetHandle("txtImageY"), IUP_VALUE); + + if (ctgc.test_image != NULL) + { + if (ctgc.buffering) + { + cdActivate(ctgc.iup_canvas); + cdClip(CD_CLIPOFF); + + cdActivate(ctgc.buffer_canvas); + } + else + cdActivate(ctgc.iup_canvas); + + cdWriteMode(ctgc.write_mode); + cdPutImage(ctgc.test_image, x, y); + sprintf(ctgc.status_line, "cdPutImage( image, %d, %d)", x, y); + set_status(); + + if (ctgc.buffering) + { + cdFlush(); + + cdActivate(ctgc.iup_canvas); + cdClip(ctgc.clip_mode); + } + } + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Prepara a seleccao de imagens. */ +/*-------------------------------------------------------------------------*/ +int fImageRGB(Ihandle* self) +{ + if (ctgc.cur_prim == POLY) { + fButtonCB(NULL, IUP_BUTTON3, 0, 0, 0, 0); + } + IupSetAttribute(ctgc.bt_cur_prim, IUP_IMAGE, "imgImageRGB"); + ctgc.cur_prim = RGB; + ctgc.following = FALSE; + ctgc.visible = iscurvisible(); + IupHide(ctgc.dlg_cur_prim); + if (ctgc.visible) + { + ctgc.dlg_x = IupGetInt(ctgc.dlg_cur_prim, IUP_X); + ctgc.dlg_y = IupGetInt(ctgc.dlg_cur_prim, IUP_Y); + } + ctgc.dlg_cur_prim = IupGetHandle("dlgImageRGB"); + sprintf(ctgc.status_line, "LEFT click and drag to get. RIGHT click to put."); + set_status(); + if (ctgc.visible || IupGetAttribute(self, "ISMENU")) + IupShowXY(ctgc.dlg_cur_prim, ctgc.dlg_x, ctgc.dlg_y); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Pega a imagem. */ +/*-------------------------------------------------------------------------*/ +int fImageRGBGet(void) +{ + int x, y; + + x = IupGetInt(IupGetHandle("txtImageRGBX"), IUP_VALUE); + y = IupGetInt(IupGetHandle("txtImageRGBY"), IUP_VALUE); + ctgc.rgb_w = IupGetInt(IupGetHandle("txtImageRGBW"), IUP_VALUE); + ctgc.rgb_h = IupGetInt(IupGetHandle("txtImageRGBH"), IUP_VALUE); + + if (ctgc.red) free(ctgc.red); + ctgc.red = (unsigned char *) malloc (ctgc.rgb_w*ctgc.rgb_h*sizeof(unsigned char)); + if (ctgc.green) free(ctgc.green); + ctgc.green = (unsigned char *) malloc (ctgc.rgb_w*ctgc.rgb_h*sizeof(unsigned char)); + if (ctgc.blue) free(ctgc.blue); + ctgc.blue = (unsigned char *) malloc (ctgc.rgb_w*ctgc.rgb_h*sizeof(unsigned char)); + + if ((ctgc.red!=NULL)&&(ctgc.green!=NULL)&&(ctgc.blue!=NULL)) { + sprintf(ctgc.status_line, "cdGetImageRGB( r, g, b, %d, %d, %d, %d)", + x, y, ctgc.rgb_w, ctgc.rgb_h); + set_status(); + + if (ctgc.buffering) + cdActivate(ctgc.buffer_canvas); + else + cdActivate(ctgc.iup_canvas); + + cdGetImageRGB(ctgc.red, ctgc.green, ctgc.blue, x, y, ctgc.rgb_w, ctgc.rgb_h); + + cdActivate(ctgc.iup_canvas); + } + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Joga a imagem na tela. */ +/*-------------------------------------------------------------------------*/ +int fImageRGBPut(void) +{ + int x, y; + + x = IupGetInt(IupGetHandle("txtImageRGBX"), IUP_VALUE); + y = IupGetInt(IupGetHandle("txtImageRGBY"), IUP_VALUE); + + if ((ctgc.red!=NULL)&&(ctgc.green!=NULL)&&(ctgc.blue!=NULL)) + { + if (ctgc.buffering) + { + cdActivate(ctgc.iup_canvas); + cdClip(CD_CLIPOFF); + + cdActivate(ctgc.buffer_canvas); + } + else + cdActivate(ctgc.iup_canvas); + + cdWriteMode(ctgc.write_mode); + sprintf(ctgc.status_line, "cdPutImageRGB( %d, %d, r, g, b, %d, %d, %d, %d)", + ctgc.rgb_w, ctgc.rgb_h, x, y, ctgc.rgb_w, ctgc.rgb_h); + set_status(); + cdPutImageRGB(ctgc.rgb_w, ctgc.rgb_h, ctgc.red, ctgc.green, ctgc.blue, x, y, ctgc.rgb_w, ctgc.rgb_h); + + if (ctgc.buffering) + { + cdFlush(); + + cdActivate(ctgc.iup_canvas); + cdClip(ctgc.clip_mode); + } + } + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Muda a primitiva corrente. */ +/*-------------------------------------------------------------------------*/ +int fLine(Ihandle* self) +{ + if (ctgc.cur_prim != LINE) { + IupSetAttribute(ctgc.bt_cur_prim, IUP_IMAGE, "imgLine"); + if (ctgc.cur_prim == POLY) { /* termina o poligono em andamento */ + fButtonCB(NULL, IUP_BUTTON3, 0, 0, 0, 0); + } + ctgc.cur_prim = LINE; + ctgc.following = FALSE; + ctgc.visible = iscurvisible(); + IupHide(ctgc.dlg_cur_prim); /* esconde o dialogo anterior */ + if (ctgc.visible) + { + ctgc.dlg_x = IupGetInt(ctgc.dlg_cur_prim, IUP_X); + ctgc.dlg_y = IupGetInt(ctgc.dlg_cur_prim, IUP_Y); + } + ctgc.dlg_cur_prim = IupGetHandle("dlgLB"); + IupSetAttribute(ctgc.dlg_cur_prim, IUP_TITLE, "Line Parameters"); + } + sprintf(ctgc.status_line, "LEFT click and drag."); + set_status(); + if (ctgc.visible || IupGetAttribute(self, "ISMENU")) + IupShowXY(ctgc.dlg_cur_prim, ctgc.dlg_x, ctgc.dlg_y); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Muda a primitiva corrente. */ +/*-------------------------------------------------------------------------*/ +int fRect(Ihandle* self) +{ + if (ctgc.cur_prim != RECT) { + IupSetAttribute(ctgc.bt_cur_prim, IUP_IMAGE, "imgRect"); + if (ctgc.cur_prim == POLY) { + fButtonCB(NULL, IUP_BUTTON3, 0, 0, 0, 0); + } + ctgc.cur_prim = RECT; + ctgc.following = FALSE; + ctgc.visible = iscurvisible(); + IupHide(ctgc.dlg_cur_prim); + if (ctgc.visible) + { + ctgc.dlg_x = IupGetInt(ctgc.dlg_cur_prim, IUP_X); + ctgc.dlg_y = IupGetInt(ctgc.dlg_cur_prim, IUP_Y); + } + ctgc.dlg_cur_prim = IupGetHandle("dlgLB"); + IupSetAttribute(ctgc.dlg_cur_prim, IUP_TITLE, "Rect Parameters"); + } + sprintf(ctgc.status_line, "LEFT click and drag."); + set_status(); + if (ctgc.visible || IupGetAttribute(self, "ISMENU")) + IupShowXY(ctgc.dlg_cur_prim, ctgc.dlg_x, ctgc.dlg_y); + return IUP_DEFAULT; +} + +int fBox(Ihandle* self) +{ + if (ctgc.cur_prim != BOX) { + IupSetAttribute(ctgc.bt_cur_prim, IUP_IMAGE, "imgBox"); + if (ctgc.cur_prim == POLY) { + fButtonCB(NULL, IUP_BUTTON3, 0, 0, 0, 0); + } + ctgc.cur_prim = BOX; + ctgc.following = FALSE; + ctgc.visible = iscurvisible(); + IupHide(ctgc.dlg_cur_prim); + if (ctgc.visible) + { + ctgc.dlg_x = IupGetInt(ctgc.dlg_cur_prim, IUP_X); + ctgc.dlg_y = IupGetInt(ctgc.dlg_cur_prim, IUP_Y); + } + ctgc.dlg_cur_prim = IupGetHandle("dlgLB"); + IupSetAttribute(ctgc.dlg_cur_prim, IUP_TITLE, "Box Parameters"); + } + sprintf(ctgc.status_line, "LEFT click and drag."); + set_status(); + if (ctgc.visible || IupGetAttribute(self, "ISMENU")) + IupShowXY(ctgc.dlg_cur_prim, ctgc.dlg_x, ctgc.dlg_y); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Muda a primitiva corrente. */ +/*-------------------------------------------------------------------------*/ +int fArc(Ihandle* self) +{ + if (ctgc.cur_prim != ARC) { + IupSetAttribute(ctgc.bt_cur_prim, IUP_IMAGE, "imgArc"); + if (ctgc.cur_prim == POLY) { + fButtonCB(NULL, IUP_BUTTON3, 0, 0, 0, 0); + } + ctgc.cur_prim = ARC; + ctgc.following = FALSE; + ctgc.visible = iscurvisible(); + IupHide(ctgc.dlg_cur_prim); + if (ctgc.visible) + { + ctgc.dlg_x = IupGetInt(ctgc.dlg_cur_prim, IUP_X); + ctgc.dlg_y = IupGetInt(ctgc.dlg_cur_prim, IUP_Y); + } + ctgc.dlg_cur_prim = IupGetHandle("dlgAS"); + IupSetAttribute(ctgc.dlg_cur_prim, IUP_TITLE, "Arc Parameters"); + } + sprintf(ctgc.status_line, "LEFT click at center and drag."); + set_status(); + if (ctgc.visible || IupGetAttribute(self, "ISMENU")) + IupShowXY(ctgc.dlg_cur_prim, ctgc.dlg_x, ctgc.dlg_y); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Muda a primitiva corrente. */ +/*-------------------------------------------------------------------------*/ +int fSector(Ihandle* self) +{ + if (ctgc.cur_prim != SECTOR) { + IupSetAttribute(ctgc.bt_cur_prim, IUP_IMAGE, "imgSector"); + if (ctgc.cur_prim == POLY) { + fButtonCB(NULL, IUP_BUTTON3, 0, 0, 0, 0); + } + ctgc.cur_prim = SECTOR; + ctgc.following = FALSE; + ctgc.visible = iscurvisible(); + IupHide(ctgc.dlg_cur_prim); + if (ctgc.visible) + { + ctgc.dlg_x = IupGetInt(ctgc.dlg_cur_prim, IUP_X); + ctgc.dlg_y = IupGetInt(ctgc.dlg_cur_prim, IUP_Y); + } + ctgc.dlg_cur_prim = IupGetHandle("dlgAS"); + IupSetAttribute(ctgc.dlg_cur_prim, IUP_TITLE, "Sector Parameters"); + } + sprintf(ctgc.status_line, "LEFT click at center and drag."); + set_status(); + if (ctgc.visible || IupGetAttribute(self, "ISMENU")) + IupShowXY(ctgc.dlg_cur_prim, ctgc.dlg_x, ctgc.dlg_y); + return IUP_DEFAULT; +} + +int fChord(Ihandle* self) +{ + if (ctgc.cur_prim != CHORD) { + IupSetAttribute(ctgc.bt_cur_prim, IUP_IMAGE, "imgChord"); + if (ctgc.cur_prim == POLY) { + fButtonCB(NULL, IUP_BUTTON3, 0, 0, 0, 0); + } + ctgc.cur_prim = CHORD; + ctgc.following = FALSE; + ctgc.visible = iscurvisible(); + IupHide(ctgc.dlg_cur_prim); + if (ctgc.visible) + { + ctgc.dlg_x = IupGetInt(ctgc.dlg_cur_prim, IUP_X); + ctgc.dlg_y = IupGetInt(ctgc.dlg_cur_prim, IUP_Y); + } + ctgc.dlg_cur_prim = IupGetHandle("dlgAS"); + IupSetAttribute(ctgc.dlg_cur_prim, IUP_TITLE, "Chord Parameters"); + } + sprintf(ctgc.status_line, "LEFT click at center and drag."); + set_status(); + if (ctgc.visible || IupGetAttribute(self, "ISMENU")) + IupShowXY(ctgc.dlg_cur_prim, ctgc.dlg_x, ctgc.dlg_y); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Muda a primitiva corrente. */ +/*-------------------------------------------------------------------------*/ +int fPixel(Ihandle* self) +{ + if (ctgc.cur_prim != PIXEL) { + IupSetAttribute(ctgc.bt_cur_prim, IUP_IMAGE, "imgPixel"); + if (ctgc.cur_prim == POLY) { + fButtonCB(NULL, IUP_BUTTON3, 0, 0, 0, 0); + } + ctgc.cur_prim = PIXEL; + ctgc.following = FALSE; + ctgc.visible = iscurvisible(); + IupHide(ctgc.dlg_cur_prim); + if (ctgc.visible) + { + ctgc.dlg_x = IupGetInt(ctgc.dlg_cur_prim, IUP_X); + ctgc.dlg_y = IupGetInt(ctgc.dlg_cur_prim, IUP_Y); + } + ctgc.dlg_cur_prim = IupGetHandle("dlgPixel"); + } + sprintf(ctgc.status_line, "LEFT click."); + set_status(); + if (ctgc.visible || IupGetAttribute(self, "ISMENU")) + IupShowXY(ctgc.dlg_cur_prim, ctgc.dlg_x, ctgc.dlg_y); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Muda a primitiva corrente. */ +/*-------------------------------------------------------------------------*/ +int fMark(Ihandle* self) +{ + if (ctgc.cur_prim != MARK) { + IupSetAttribute(ctgc.bt_cur_prim, IUP_IMAGE, "imgMark"); + if (ctgc.cur_prim == POLY) { + fButtonCB(NULL, IUP_BUTTON3, 0, 0, 0, 0); + } + ctgc.cur_prim = MARK; + ctgc.following = FALSE; + ctgc.visible = iscurvisible(); + IupHide(ctgc.dlg_cur_prim); + if (ctgc.visible) + { + ctgc.dlg_x = IupGetInt(ctgc.dlg_cur_prim, IUP_X); + ctgc.dlg_y = IupGetInt(ctgc.dlg_cur_prim, IUP_Y); + } + ctgc.dlg_cur_prim = IupGetHandle("dlgMark"); + } + sprintf(ctgc.status_line, "LEFT click."); + set_status(); + if (ctgc.visible || IupGetAttribute(self, "ISMENU")) + IupShowXY(ctgc.dlg_cur_prim, ctgc.dlg_x, ctgc.dlg_y); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Muda a primitiva corrente. */ +/*-------------------------------------------------------------------------*/ +int fText(Ihandle* self) +{ + if (ctgc.cur_prim != TEXT) { + IupSetAttribute(ctgc.bt_cur_prim, IUP_IMAGE, "imgText"); + if (ctgc.cur_prim == POLY) { + fButtonCB(NULL, IUP_BUTTON3, 0, 0, 0, 0); + } + ctgc.cur_prim = TEXT; + ctgc.following = FALSE; + ctgc.visible = iscurvisible(); + IupHide(ctgc.dlg_cur_prim); + if (ctgc.visible) + { + ctgc.dlg_x = IupGetInt(ctgc.dlg_cur_prim, IUP_X); + ctgc.dlg_y = IupGetInt(ctgc.dlg_cur_prim, IUP_Y); + } + ctgc.dlg_cur_prim = IupGetHandle("dlgText"); + } + sprintf(ctgc.status_line, "LEFT click."); + set_status(); + if (ctgc.visible || IupGetAttribute(self, "ISMENU")) + IupShowXY(ctgc.dlg_cur_prim, ctgc.dlg_x, ctgc.dlg_y); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Muda a primitiva corrente. */ +/*-------------------------------------------------------------------------*/ +int fPoly(Ihandle* self) +{ + if (ctgc.cur_prim != POLY) { + IupSetAttribute(ctgc.bt_cur_prim, IUP_IMAGE, "imgPoly"); + ctgc.cur_prim = POLY; + ctgc.following = FALSE; + ctgc.visible = iscurvisible(); + IupHide(ctgc.dlg_cur_prim); + if (ctgc.visible) + { + ctgc.dlg_x = IupGetInt(ctgc.dlg_cur_prim, IUP_X); + ctgc.dlg_y = IupGetInt(ctgc.dlg_cur_prim, IUP_Y); + } + ctgc.dlg_cur_prim = IupGetHandle("dlgPoly"); + /* zera o buffer temporario de pontos */ + ctgc.num_points = 0; + } + sprintf(ctgc.status_line, "LEFT click to add vertex. RIGHT click to end."); + set_status(); + if (ctgc.visible || IupGetAttribute(self, "ISMENU")) + IupShowXY(ctgc.dlg_cur_prim, ctgc.dlg_x, ctgc.dlg_y); + return IUP_DEFAULT; +} + +int fOptions(void) +{ + IupShow(IupGetHandle("dlgOptions")); + return IUP_DEFAULT; +} + +int fOptionsHide(void) +{ + IupHide(IupGetHandle("dlgOptions")); + return IUP_DEFAULT; +} + + +/*-------------------------------------------------------------------------*/ +/* Mostra a caixa de dialogo Attributes. */ +/*-------------------------------------------------------------------------*/ +int fAttributes(void) +{ + IupShow(IupGetHandle("dlgAttributes")); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Esconde o dialogo de Attributes. */ +/*-------------------------------------------------------------------------*/ +int fAttributesHide(void) +{ + ctgc.font_size = IupGetInt(IupGetHandle("txtFontSize"), IUP_VALUE); + cdFont(ctgc.font_typeface,ctgc.font_style,ctgc.font_size); + IupHide(IupGetHandle("dlgAttributes")); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Esconde o dialogo de primitiva corrente. */ +/*-------------------------------------------------------------------------*/ +int fMsgHide(void) +{ + IupHide(ctgc.dlg_cur_prim); + ctgc.dlg_x = IupGetInt(ctgc.dlg_cur_prim, IUP_X); + ctgc.dlg_y = IupGetInt(ctgc.dlg_cur_prim, IUP_Y); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Filtra inteiros. */ +/*-------------------------------------------------------------------------*/ +int fInteger(Ihandle *self, int c) +{ + ignore(self); + if (isdigit(c) || c == '-') + return IUP_DEFAULT; + else if ((c==K_TAB) || (c==K_CR) || (c==K_LEFT) || + (c==K_RIGHT) || (c==K_DEL) || (c==K_BS) || (c==K_sTAB)) + return IUP_DEFAULT; + else + return IUP_IGNORE; +} + +/*-------------------------------------------------------------------------*/ +/* Filtra reais. */ +/*-------------------------------------------------------------------------*/ +int fReal(Ihandle *self, int c) +{ + ignore(self); + if (isdigit(c)) + return IUP_DEFAULT; + else if ((c==K_TAB) || (c==K_CR) || (c==K_LEFT) || + (c==K_RIGHT) || (c==K_DEL) || (c==K_BS) || (c==K_sTAB)) + return IUP_DEFAULT; + else if ((c=='.') || (c=='e') || (c=='E') || (c=='+') || (c=='-')) + return IUP_DEFAULT; + else + return IUP_IGNORE; +} + +/*-------------------------------------------------------------------------*/ +/* Desenha a primitiva entrada na caixa de dialogo ativa. */ +/*-------------------------------------------------------------------------*/ +void draw(void) +{ + int a, b; + + IupSetAttribute(IupGetHandle("itEditUndo"), IUP_ACTIVE, IUP_YES); + ctgc.line_width = IupGetInt(IupGetHandle("txtLineWidth"), IUP_VALUE); + if (ctgc.line_width < 1) ctgc.line_width = 1; + ctgc.font_size = IupGetInt(IupGetHandle("txtFontSize"), IUP_VALUE); + + /* escolhe entre o canvas na tela e o off-screen */ + if (ctgc.buffering) + { + cdActivate(ctgc.iup_canvas); + cdClip(CD_CLIPOFF); + + cdActivate(ctgc.buffer_canvas); + } + else + cdActivate(ctgc.iup_canvas); + + /* atualiza os atributos */ + cdWriteMode(ctgc.write_mode); + cdLineStyle(ctgc.line_style); + cdLineCap(ctgc.line_cap); + cdLineJoin(ctgc.line_join); + cdLineWidth(ctgc.line_width); + cdForeground(ctgc.foreground); + cdBackground(ctgc.background); + cdHatch(ctgc.hatch); + cdFillMode(ctgc.fill_mode); + cdInteriorStyle(ctgc.interior_style); + cdBackOpacity(ctgc.back_opacity); + + cdClipArea(ctgc.clip_xmin,ctgc.clip_xmax,ctgc.clip_ymin,ctgc.clip_ymax); + cdClip(ctgc.clip_mode); + + switch (ctgc.cur_prim) { + case LINE: + /* atualiza a linha de status */ + sprintf(ctgc.status_line, "cdLine( %d, %d, %d, %d)", line_pos.x1, + line_pos.y1, line_pos.x2, line_pos.y2); + set_status(); + /* desenha a line na tela */ + cdLine(line_pos.x1, line_pos.y1, line_pos.x2, line_pos.y2); + /* arquiva a line */ + newline(line_pos.x1, line_pos.y1, line_pos.x2, line_pos.y2); + break; + case RECT: + /* atualiza a linha de status */ + sprintf(ctgc.status_line,"cdRect( %d, %d, %d, %d)",box_pos.xmin, + box_pos.xmax, box_pos.ymin, box_pos.ymax); + set_status(); + /* desenha a box na tela */ + cdRect(box_pos.xmin, box_pos.xmax, box_pos.ymin, box_pos.ymax); + /* armazena a box */ + newrect(box_pos.xmin, box_pos.xmax, box_pos.ymin, box_pos.ymax); + break; + case BOX: + /* atualiza a linha de status */ + sprintf(ctgc.status_line,"cdBox( %d, %d, %d, %d)",box_pos.xmin, + box_pos.xmax, box_pos.ymin, box_pos.ymax); + set_status(); + /* desenha a box na tela */ + cdBox(box_pos.xmin, box_pos.xmax, box_pos.ymin, box_pos.ymax); + /* armazena a box */ + newbox(box_pos.xmin, box_pos.xmax, box_pos.ymin, box_pos.ymax); + break; + case ARC: + arc_pos.angle1 = IupGetFloat(IupGetHandle("txtASAngle1"),IUP_VALUE); + arc_pos.angle2 = IupGetFloat(IupGetHandle("txtASAngle2"),IUP_VALUE); + /* atualiza a linha de status */ + sprintf(ctgc.status_line,"cdArc( %d, %d, %d, %d, %.5G, %.5G)", arc_pos.xc, + arc_pos.yc, arc_pos.w, arc_pos.h, arc_pos.angle1, arc_pos.angle2); + set_status(); + /* desenha o arc na tela */ + cdArc(arc_pos.xc, arc_pos.yc, arc_pos.w, arc_pos.h, arc_pos.angle1, + arc_pos.angle2); + /* armazena o arc */ + newarc(arc_pos.xc, arc_pos.yc, arc_pos.w, arc_pos.h, arc_pos.angle1, + arc_pos.angle2); + break; + case SECTOR: + arc_pos.angle1 = IupGetFloat(IupGetHandle("txtASAngle1"),IUP_VALUE); + arc_pos.angle2 = IupGetFloat(IupGetHandle("txtASAngle2"),IUP_VALUE); + /* atualiza a linha de status */ + sprintf(ctgc.status_line,"cdSector( %d, %d, %d, %d, %.5G, %.5G)", arc_pos.xc, + arc_pos.yc, arc_pos.w, arc_pos.h, arc_pos.angle1, arc_pos.angle2); + set_status(); + /* desenha o sector na tela */ + cdSector(arc_pos.xc, arc_pos.yc, arc_pos.w, arc_pos.h, arc_pos.angle1, + arc_pos.angle2); + /* armazena o sector */ + newsector(arc_pos.xc, arc_pos.yc, arc_pos.w, arc_pos.h, arc_pos.angle1, + arc_pos.angle2); + break; + case CHORD: + arc_pos.angle1 = IupGetFloat(IupGetHandle("txtASAngle1"),IUP_VALUE); + arc_pos.angle2 = IupGetFloat(IupGetHandle("txtASAngle2"),IUP_VALUE); + /* atualiza a linha de status */ + sprintf(ctgc.status_line,"cdChord( %d, %d, %d, %d, %.5G, %.5G)", arc_pos.xc, + arc_pos.yc, arc_pos.w, arc_pos.h, arc_pos.angle1, arc_pos.angle2); + set_status(); + /* desenha o sector na tela */ + cdChord(arc_pos.xc, arc_pos.yc, arc_pos.w, arc_pos.h, arc_pos.angle1, + arc_pos.angle2); + /* armazena o sector */ + newchord(arc_pos.xc, arc_pos.yc, arc_pos.w, arc_pos.h, arc_pos.angle1, + arc_pos.angle2); + break; + case PIXEL: + /* atualiza a linha de status */ + sprintf(ctgc.status_line, "cdPixel( %d, %d, 0x%.6lx )",pixel_pos.x, pixel_pos.y,ctgc.foreground); + set_status(); + /* desenha o pixel na tela */ + cdPixel(pixel_pos.x, pixel_pos.y, ctgc.foreground); + /* armazena o pixel */ + newpixel(pixel_pos.x, pixel_pos.y); + break; + case MARK: + mark_pos.size = IupGetInt(IupGetHandle("txtMarkSize"),IUP_VALUE); + /* atualiza a linha de status */ + sprintf(ctgc.status_line,"cdMark( %d, %d)", mark_pos.x, mark_pos.y); + set_status(); + /* armazena a marca */ + newmark(mark_pos.x, mark_pos.y, mark_pos.size); + /* desenha a marca na tela */ + cdMarkType(ctgc.mark_type); + cdMarkSize(mark_pos.size); + cdMark(mark_pos.x, mark_pos.y); + break; + case TEXT: + if (IupGetAttribute(IupGetHandle("txtTextS"),IUP_VALUE)) { + a=IupGetInt(IupGetHandle("txtTextX"),IUP_VALUE); + b=IupGetInt(IupGetHandle("txtTextY"),IUP_VALUE); + sprintf(ctgc.status_line," cdText( %d, %d, ""%.3s""...)", a, b, + IupGetAttribute(IupGetHandle("txtTextS"),IUP_VALUE)); + set_status(); + ctgc.text_orientation = IupGetInt(IupGetHandle("txtTextOrientation"),IUP_VALUE); + newtext(a,b,IupGetAttribute(IupGetHandle("txtTextS"),IUP_VALUE)); + cdFont(ctgc.font_typeface,ctgc.font_style,ctgc.font_size); + cdTextAlignment(ctgc.text_alignment); + cdTextOrientation(ctgc.text_orientation); + cdText(a,b,IupGetAttribute(IupGetHandle("txtTextS"),IUP_VALUE)); + } + case POLY: + if (ctgc.num_points > 1) { + cdBegin(ctgc.poly_mode); + for (a=0; (a<ctgc.num_points); a++) { + cdVertex(ctgc.points[a].x,ctgc.points[a].y); + } + cdEnd(); + if (ctgc.poly_mode != CD_CLIP) + newpoly(); + ctgc.num_points = 0; + } + break; + default: + break; + } + + if (ctgc.buffering) + { + cdFlush(); + + cdActivate(ctgc.iup_canvas); + cdClip(ctgc.clip_mode); + } +} + +/*-------------------------------------------------------------------------*/ +/* Desenha a primitiva entrada na caixa de dialogo corrente. */ +/*-------------------------------------------------------------------------*/ +int fDraw(void) +{ + /* atualiza os dados entrados na caixa de dialogo no contexto da */ + /* primitiva corrente */ + switch (ctgc.cur_prim) { + case LINE: + line_pos.x1 = IupGetInt(IupGetHandle("txtLBX1"), IUP_VALUE); + line_pos.x2 = IupGetInt(IupGetHandle("txtLBX2"), IUP_VALUE); + line_pos.y1 = IupGetInt(IupGetHandle("txtLBY1"), IUP_VALUE); + line_pos.y2 = IupGetInt(IupGetHandle("txtLBY2"), IUP_VALUE); + break; + case RECT: + case BOX: + box_pos.xmin = IupGetInt(IupGetHandle("txtLBX1"), IUP_VALUE); + box_pos.xmax = IupGetInt(IupGetHandle("txtLBX2"), IUP_VALUE); + box_pos.ymin = IupGetInt(IupGetHandle("txtLBY1"), IUP_VALUE); + box_pos.ymax = IupGetInt(IupGetHandle("txtLBY2"), IUP_VALUE); + break; + case ARC: + case CHORD: + case SECTOR: + arc_pos.xc = IupGetInt(IupGetHandle("txtASXC"), IUP_VALUE); + arc_pos.yc = IupGetInt(IupGetHandle("txtASYC"), IUP_VALUE); + arc_pos.w = IupGetInt(IupGetHandle("txtASW"), IUP_VALUE); + arc_pos.h = IupGetInt(IupGetHandle("txtASH"), IUP_VALUE); + break; + case PIXEL: + pixel_pos.x = IupGetInt(IupGetHandle("txtPixelX"), IUP_VALUE); + pixel_pos.y = IupGetInt(IupGetHandle("txtPixelY"), IUP_VALUE); + break; + case MARK: + mark_pos.x = IupGetInt(IupGetHandle("txtMarkX"), IUP_VALUE); + mark_pos.y = IupGetInt(IupGetHandle("txtMarkY"), IUP_VALUE); + break; + default: + break; + } + + /* efetivamente desenha a primitiva */ + draw(); + + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Mostra a janelinha de apresentacao. */ +/*-------------------------------------------------------------------------*/ +int fHelpAbout(void) +{ + IupSetAttribute(IupGetHandle("lblVersion"), IUP_TITLE, cdVersion()); + IupShow(IupGetHandle("dlgHelpAbout")); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Mata a janelinha de apresentacao. */ +/*-------------------------------------------------------------------------*/ +int fCloseAbout(void) +{ + IupHide(IupGetHandle("dlgHelpAbout")); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Limpa o canvas e a lista de primitivas. */ +/*-------------------------------------------------------------------------*/ +int fEditClear(void) +{ + /* mata a lista de primitivas */ + dellist(); + + /* torna inativo a opcap undo */ + IupSetAttribute(IupGetHandle("itEditUndo"), IUP_ACTIVE, IUP_NO); + + updatecanvas(); + + sprintf(ctgc.status_line, "cdClear()"); + set_status(); + + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Funcao associada ao ganho de focus do canvas. */ +/*-------------------------------------------------------------------------*/ +int fGetFocusCB(Ihandle *self) +{ + ignore(self); + /* avisa ao CD que o focus foi recebido, */ + /* para que ele restaure o contexto grafico */ + cdActivate(ctgc.iup_canvas); + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Funcao associada ao movimento do mouse. */ +/*-------------------------------------------------------------------------*/ +int fMotionCB(Ihandle *self, int x, int y, char *r) +{ + ignore(self); + ignore(r); + + if (!ctgc.iup_canvas) + return IUP_DEFAULT; + + cdActivate(ctgc.iup_canvas); + cdUpdateYAxis(&y); + mouse_pos(x, y); + + if (ctgc.following) { + switch(ctgc.cur_prim) { + case LINE: + line(MOVE, x, y); + follow(x, y); + break; + case RECT: + case BOX: + box(MOVE, x, y); + follow(x, y); + break; + case CLIP: + box(MOVE, x, y); + follow(x, y); + break; + case ARC: /* ARC e SECTOR... */ + case SECTOR: /* sao equivalentes */ + case CHORD: + arc(MOVE, x, y); + follow(x, y); + break; + case IMAGE: + box(MOVE, x, y); + follow(x, y); + break; + case RGB: + box(MOVE, x, y); + follow(x, y); + break; + case POLY: + polygon(MOVE, x, y); + break; + default: + break; + } + } + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Funcao associada ao botao do mouse. */ +/*-------------------------------------------------------------------------*/ +int fButtonCB(Ihandle *self, int b, int e, int x, int y, char *r) +{ + ignore(self); + ignore(r); + + cdActivate(ctgc.iup_canvas); + cdWriteMode(CD_NOT_XOR); + cdForeground(CD_BLACK); + cdLineStyle(CD_CONTINUOUS); + cdLineWidth(1); + cdClip(CD_CLIPOFF); + + cdUpdateYAxis(&y); + mouse_pos(x, y); + + if (b == IUP_BUTTON1) { + if (e) { + switch(ctgc.cur_prim) { + case LINE: + follow(x, y); + line(NEWPOINT, x, y); + line_pos.x1 = x; + line_pos.y1 = y; + ctgc.following = TRUE; + break; + case RECT: + case BOX: + follow(x, y); + box(NEWPOINT, x, y); + box_pos.x = x; + box_pos.y = y; + ctgc.following = TRUE; + break; + case CLIP: + box(NEWPOINT, x, y); + follow(x, y); + ctgc.following = TRUE; + break; + case ARC: /* ARC e SECTOR... */ + case SECTOR: /* sao equivalentes */ + case CHORD: + follow(x, y); + arc(CENTER, x, y); + arc_pos.xc = x; + arc_pos.yc = y; + ctgc.following = TRUE; + break; + case MARK: + case PIXEL: + case TEXT: + follow(x, y); + draw(); + break; + case IMAGE: + follow(x, y); + box(NEWPOINT, x, y); + ctgc.following = TRUE; + break; + case RGB: + follow(x, y); + box(NEWPOINT, x, y); + ctgc.following = TRUE; + break; + default: + break; + } + } + else { + switch(ctgc.cur_prim) { + case LINE: + if (ctgc.following) { + ctgc.following = FALSE; + line(CLOSE, x, y); + cdClip(ctgc.clip_mode); + draw(); + } + break; + case RECT: + case BOX: + if (ctgc.following) { + ctgc.following = FALSE; + box(CLOSE, x, y); + cdClip(ctgc.clip_mode); + draw(); + } + break; + case CLIP: + if (ctgc.following) { + ctgc.following = FALSE; + box(CLOSE, x, y); + fClipArea(); + } + break; + case ARC: /* ARC e SECTOR... */ + case SECTOR: /* ...sao equivalentes */ + case CHORD: + if (ctgc.following) { + ctgc.following = FALSE; + arc(CLOSE, x, y); + cdClip(ctgc.clip_mode); + draw(); + arc_pos.w = 0; + arc_pos.h = 0; + } + break; + case POLY: + cdActivate(ctgc.iup_canvas); + polygon(NEWPOINT, x, y); + newpolypoint(x, y); + sprintf(ctgc.status_line, "cdVertex( %d, %d)", x, y); + set_status(); + ctgc.following = TRUE; + break; + case IMAGE: + if (ctgc.following) { + ctgc.following = FALSE; + box(CLOSE, x, y); + cdClip(ctgc.clip_mode); + fImageGet(); + } + break; + case RGB: + if (ctgc.following) { + ctgc.following = FALSE; + box(CLOSE, x, y); + cdClip(ctgc.clip_mode); + fImageRGBGet(); + } + break; + default: + break; + } + } + } + else if (b == IUP_BUTTON3) { + if (e) { + switch (ctgc.cur_prim) { + case IMAGE: + cdClip(ctgc.clip_mode); + follow(x, y); + fImagePut(); + break; + case RGB: + cdClip(ctgc.clip_mode); + follow(x, y); + fImageRGBPut(); + break; + case CLIP: + fClipOff(); + break; + default: + break; + } + } + else { + switch (ctgc.cur_prim) { + case POLY: + cdActivate(ctgc.iup_canvas); + ctgc.following = FALSE; + polygon(CLOSE, x, y); + sprintf(ctgc.status_line, "cdEnd()"); + set_status(); + fDraw(); + break; + default: + break; + } + } + } + + return IUP_DEFAULT; +} + +/*-------------------------------------------------------------------------*/ +/* Funcao associada ao resize do canvas. */ +/*-------------------------------------------------------------------------*/ +int fResizeCB(Ihandle *self, int width, int height) +{ + ignore(self); + + /* atualiza o contexto do programa */ + ctgc.w = width; + ctgc.h = height; + + /* atualiza o tamanho do canvas em pixels no titulo */ + sprintf(ctgc.title, "CDTest 5.3 (%dx%d - %dbpp)", ctgc.w, ctgc.h, ctgc.bpp); + IupSetAttribute(IupGetHandle("dlgMain"), IUP_TITLE, ctgc.title); + + /* reconstroi o buffer off-screen, se necessario */ + if (ctgc.buffering) + cdActivate(ctgc.buffer_canvas); + else + cdActivate(ctgc.iup_canvas); + + return IUP_DEFAULT; +} + +void cdtest_loadled(void); + +/*-------------------------------------------------------------------------*/ +/* Rotina principal. */ +/*-------------------------------------------------------------------------*/ +int main(int argc, char** argv) +{ + char *err = NULL; + + /* inicializa o IUP */ + IupOpen(&argc, &argv); + + /* carrega o LED */ +#ifdef USE_LED + err = IupLoad("cdtest.led"); +#else + cdtest_loadled(); +#endif + + if (!err) + { + /* inicializa o CDTest */ + CDTestInit(); + } + else + { + /* imprime uma mensagem de erro */ + IupMessage("LED Error:", err); + IupClose(); + return; + } + + IupMainLoop(); + + CDTestClose(); + + IupClose(); + + return 0; +} + |