2690 lines
84 KiB
C
Executable File
2690 lines
84 KiB
C
Executable File
/*=========================================================================*/
|
|
/* 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 <cd_old.h>
|
|
#include <wd_old.h>
|
|
#include <cdiup.h>
|
|
#include <cdpicture.h>
|
|
#include <cddbuf.h>
|
|
#include <cdirgb.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;
|
|
|
|
|
|
#ifdef USE_CONTEXTPLUS
|
|
static const int use_contextplus = 1;
|
|
#else
|
|
static const int use_contextplus = 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("cmdCustom", (Icallback) fCustom);
|
|
|
|
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_contextplus)
|
|
{
|
|
#ifdef USE_CONTEXTPLUS
|
|
cdInitContextPlus();
|
|
#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_contextplus) cdUseContextPlus(1);
|
|
ctgc.iup_canvas = cdCreateCanvas(CD_IUP, IupGetHandle("cnvMain"));
|
|
if (!antialias) cdCanvasSetAttribute(ctgc.iup_canvas, "ANTIALIAS", "0");
|
|
cdActivate(ctgc.iup_canvas);
|
|
if (use_contextplus) 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_type_face = 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 = 1;
|
|
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_type_face,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_contextplus) 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_contextplus) 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"));
|
|
|
|
if (use_contextplus)
|
|
{
|
|
#ifdef USE_CONTEXTPLUS
|
|
cdFinishContextPlus();
|
|
#endif
|
|
}
|
|
}
|
|
|
|
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);
|
|
|
|
cdGetCanvasSize(&wdc_w, &wdc_h, NULL, NULL);
|
|
|
|
if (target == ctgc.wd_canvas)
|
|
{
|
|
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_type_face,
|
|
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_contextplus) cdUseContextPlus(1);
|
|
ctgc.buffer_canvas = cdCreateCanvas(CD_DBUFFER, ctgc.iup_canvas);
|
|
if (!antialias) cdCanvasSetAttribute(ctgc.buffer_canvas, "ANTIALIAS", "0");
|
|
if (use_contextplus) 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_type_face], 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_type_face = CD_SYSTEM;
|
|
break;
|
|
case 2:
|
|
ctgc.font_type_face = CD_COURIER;
|
|
break;
|
|
case 3:
|
|
ctgc.font_type_face = CD_TIMES_ROMAN;
|
|
break;
|
|
case 4:
|
|
ctgc.font_type_face = CD_HELVETICA;
|
|
break;
|
|
}
|
|
ctgc.font_size = IupGetInt(IupGetHandle("txtFontSize"), IUP_VALUE);
|
|
sprintf(ctgc.status_line, "cdFont(%s, %s, %d)", font_face[ctgc.font_type_face], 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;
|
|
}
|
|
|
|
int fPlayCGM(void);
|
|
|
|
int fCustom(Ihandle* self)
|
|
{
|
|
(void)self;
|
|
cdActivate(ctgc.iup_canvas);
|
|
cdBackground(CD_WHITE);
|
|
cdClear();
|
|
dellist();
|
|
fPlayCGM();
|
|
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_type_face,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)
|
|
return IUP_IGNORE;
|
|
else
|
|
return IUP_DEFAULT;
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
/* Filtra reais. */
|
|
/*-------------------------------------------------------------------------*/
|
|
int fReal(Ihandle *self, int c)
|
|
{
|
|
ignore(self);
|
|
if (isdigit(c))
|
|
return IUP_DEFAULT;
|
|
else if ((c=='.') || (c=='e') || (c=='E') || (c=='+') || (c=='-'))
|
|
return IUP_DEFAULT;
|
|
else if (c)
|
|
return IUP_IGNORE;
|
|
else
|
|
return IUP_DEFAULT;
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
/* 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_type_face,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;
|
|
}
|
|
|