From 7b52cc13af4e85f1ca2deb6b6c77de9c95ea0dcf Mon Sep 17 00:00:00 2001
From: scuri <scuri>
Date: Fri, 17 Oct 2008 06:10:33 +0000
Subject: First commit - moving from LuaForge to SourceForge

---
 test/cdtest/.cvsignore      |   16 +
 test/cdtest/cdtest.bat      |    3 +
 test/cdtest/cdtest.c        | 2662 +++++++++++++++++++++++++++++++++++++++++++
 test/cdtest/cdtest.dsp      |  107 ++
 test/cdtest/cdtest.h        |  415 +++++++
 test/cdtest/cdtest.ico      |  Bin 0 -> 766 bytes
 test/cdtest/cdtest.led      | 1508 ++++++++++++++++++++++++
 test/cdtest/cdtest.rc       |    1 +
 test/cdtest/cdtest.sln      |   16 +
 test/cdtest/cdtest.vcproj   |  161 +++
 test/cdtest/cdtest_led.c    | 1590 ++++++++++++++++++++++++++
 test/cdtest/colobar.h       |    7 +
 test/cdtest/colorbar.c      |  565 +++++++++
 test/cdtest/config.mak      |   24 +
 test/cdtest/drivers.c       |  457 ++++++++
 test/cdtest/list.c          |  278 +++++
 test/cdtest/rubber.c        |  387 +++++++
 test/lua/cdalign.wlua       |   67 ++
 test/lua/cdtext.wlua        |   59 +
 test/lua/imagergb.wlua      |   35 +
 test/lua/iupcdaux.lua       |   45 +
 test/lua/iuplua_cdlua.wlua  |   58 +
 test/lua/rubberband.wlua    |   54 +
 test/metafile.c             |  107 ++
 test/mf/align.mf            |   45 +
 test/mf/alignorient.mf      |   44 +
 test/mf/alignxor.mf         |   44 +
 test/mf/arc.mf              |   25 +
 test/mf/circles.mf          |   47 +
 test/mf/cliparea.mf         |   80 ++
 test/mf/fill.mf             |   48 +
 test/mf/fill_x_hollow.mf    |  170 +++
 test/mf/font.mf             |   49 +
 test/mf/grays.mf            |   59 +
 test/mf/hatch.mf            |   47 +
 test/mf/lines.mf            |   44 +
 test/mf/marks.mf            |   33 +
 test/mf/natal.mf            | 1933 +++++++++++++++++++++++++++++++
 test/mf/poly.mf             |   88 ++
 test/mf/poly2.mf            |   88 ++
 test/mf/poly3.mf            |  136 +++
 test/mf/poly4.mf            |  136 +++
 test/mf/poly5.mf            |   89 ++
 test/mf/sector.mf           |   22 +
 test/screencapture.c        |   36 +
 test/screencapture.mak      |    8 +
 test/simple/.cvsignore      |   21 +
 test/simple/config.mak      |   25 +
 test/simple/gdiplustest.cpp |  116 ++
 test/simple/iupmain.c       |   83 ++
 test/simple/makefile.linux  |   18 +
 test/simple/makefile.mingw3 |   20 +
 test/simple/simple.bat      |    3 +
 test/simple/simple.c        | 1312 +++++++++++++++++++++
 test/simple/simple.dsp      |   83 ++
 test/simple/simple.h        |   54 +
 test/simple/simple.led      |   93 ++
 test/simple/simple.sln      |   20 +
 test/simple/simple.vcproj   |  131 +++
 test/simple/simple_led.c    |  125 ++
 test/simple/teste.cpp       |  219 ++++
 61 files changed, 14216 insertions(+)
 create mode 100644 test/cdtest/.cvsignore
 create mode 100644 test/cdtest/cdtest.bat
 create mode 100644 test/cdtest/cdtest.c
 create mode 100644 test/cdtest/cdtest.dsp
 create mode 100644 test/cdtest/cdtest.h
 create mode 100644 test/cdtest/cdtest.ico
 create mode 100644 test/cdtest/cdtest.led
 create mode 100644 test/cdtest/cdtest.rc
 create mode 100644 test/cdtest/cdtest.sln
 create mode 100644 test/cdtest/cdtest.vcproj
 create mode 100644 test/cdtest/cdtest_led.c
 create mode 100644 test/cdtest/colobar.h
 create mode 100644 test/cdtest/colorbar.c
 create mode 100644 test/cdtest/config.mak
 create mode 100644 test/cdtest/drivers.c
 create mode 100644 test/cdtest/list.c
 create mode 100644 test/cdtest/rubber.c
 create mode 100644 test/lua/cdalign.wlua
 create mode 100644 test/lua/cdtext.wlua
 create mode 100644 test/lua/imagergb.wlua
 create mode 100644 test/lua/iupcdaux.lua
 create mode 100644 test/lua/iuplua_cdlua.wlua
 create mode 100644 test/lua/rubberband.wlua
 create mode 100644 test/metafile.c
 create mode 100644 test/mf/align.mf
 create mode 100644 test/mf/alignorient.mf
 create mode 100644 test/mf/alignxor.mf
 create mode 100644 test/mf/arc.mf
 create mode 100644 test/mf/circles.mf
 create mode 100644 test/mf/cliparea.mf
 create mode 100644 test/mf/fill.mf
 create mode 100644 test/mf/fill_x_hollow.mf
 create mode 100644 test/mf/font.mf
 create mode 100644 test/mf/grays.mf
 create mode 100644 test/mf/hatch.mf
 create mode 100644 test/mf/lines.mf
 create mode 100644 test/mf/marks.mf
 create mode 100644 test/mf/natal.mf
 create mode 100644 test/mf/poly.mf
 create mode 100644 test/mf/poly2.mf
 create mode 100644 test/mf/poly3.mf
 create mode 100644 test/mf/poly4.mf
 create mode 100644 test/mf/poly5.mf
 create mode 100644 test/mf/sector.mf
 create mode 100644 test/screencapture.c
 create mode 100644 test/screencapture.mak
 create mode 100644 test/simple/.cvsignore
 create mode 100644 test/simple/config.mak
 create mode 100644 test/simple/gdiplustest.cpp
 create mode 100644 test/simple/iupmain.c
 create mode 100644 test/simple/makefile.linux
 create mode 100644 test/simple/makefile.mingw3
 create mode 100644 test/simple/simple.bat
 create mode 100644 test/simple/simple.c
 create mode 100644 test/simple/simple.dsp
 create mode 100644 test/simple/simple.h
 create mode 100644 test/simple/simple.led
 create mode 100644 test/simple/simple.sln
 create mode 100644 test/simple/simple.vcproj
 create mode 100644 test/simple/simple_led.c
 create mode 100644 test/simple/teste.cpp

(limited to 'test')

diff --git a/test/cdtest/.cvsignore b/test/cdtest/.cvsignore
new file mode 100644
index 0000000..1da6c19
--- /dev/null
+++ b/test/cdtest/.cvsignore
@@ -0,0 +1,16 @@
+obj
+bin
+william
+so_locations
+*.dep
+*.wdep
+*.loh
+.plan
+.project
+*.err
+Makefile
+*.make
+*.suo
+*.ncb
+*.opt
+*.user
diff --git a/test/cdtest/cdtest.bat b/test/cdtest/cdtest.bat
new file mode 100644
index 0000000..3249300
--- /dev/null
+++ b/test/cdtest/cdtest.bat
@@ -0,0 +1,3 @@
+@echo off
+REM Script generated automatically by tecmake v3.10
+..\bin\Win32\cdtest.exe  %*
diff --git a/test/cdtest/cdtest.c b/test/cdtest/cdtest.c
new file mode 100644
index 0000000..bf701b9
--- /dev/null
+++ b/test/cdtest/cdtest.c
@@ -0,0 +1,2662 @@
+/*=========================================================================*/
+/* 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);
+
+  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);
+
+  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.                                                       */
+/*-------------------------------------------------------------------------*/
+void main(void)
+{
+  char *err = NULL;
+
+  /* inicializa o IUP */
+  IupOpen();                        
+
+  /* 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();
+}
+
diff --git a/test/cdtest/cdtest.dsp b/test/cdtest/cdtest.dsp
new file mode 100644
index 0000000..80c1421
--- /dev/null
+++ b/test/cdtest/cdtest.dsp
@@ -0,0 +1,107 @@
+# Microsoft Developer Studio Project File - Name="cdtest" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Application" 0x0101
+
+CFG=cdtest - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "cdtest.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "cdtest.mak" CFG="cdtest - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "cdtest - Win32 Debug" (based on "Win32 (x86) Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "cdtest - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "..\bin"
+# PROP BASE Intermediate_Dir "..\obj\cdtest"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "..\bin"
+# PROP Intermediate_Dir "..\obj\cdtest"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /I "..\..\include" /I "..\..\..\iup\include" /Z7 /W3 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "CDTEST_WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_MBCS" /Fp"..\obj/cdtest.pch" /Fo"$(IntDir)/" /Fd"..\obj/cdtest" /GZ /c /GX 
+# ADD CPP /nologo /MTd /I "..\..\include" /I "..\..\..\iup\include" /Z7 /W3 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "CDTEST_WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_MBCS" /Fp"..\obj/cdtest.pch" /Fo"$(IntDir)/" /Fd"..\obj/cdtest" /GZ /c /GX 
+# ADD BASE MTL /nologo /D"_DEBUG" /mktyplib203 /tlb"..\bin\cdtest.tlb" /win32 
+# ADD MTL /nologo /D"_DEBUG" /mktyplib203 /tlb"..\bin\cdtest.tlb" /win32 
+# ADD BASE RSC /l 1046 /d "_DEBUG" 
+# ADD RSC /l 1046 /d "_DEBUG" 
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo 
+# ADD BSC32 /nologo 
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib cd.lib cdiup.lib cdgdiplus.lib iup.lib gdiplus.lib cdpdflib.lib /nologo /out:"..\bin\cdtest.exe" /incremental:yes /libpath:"..\..\lib" /libpath:"..\..\..\iup\lib" /debug /pdb:"..\bin\cdtest.pdb" /pdbtype:sept /subsystem:windows /MACHINE:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib cd.lib cdiup.lib cdgdiplus.lib iup.lib gdiplus.lib cdpdflib.lib /nologo /out:"..\bin\cdtest.exe" /incremental:yes /libpath:"..\..\lib" /libpath:"..\..\..\iup\lib" /debug /pdb:"..\bin\cdtest.pdb" /pdbtype:sept /subsystem:windows /MACHINE:I386
+
+!ENDIF
+
+# Begin Target
+
+# Name "cdtest - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=Cdtest.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\cdtest.led
+# End Source File
+# Begin Source File
+
+SOURCE=cdtest.rc
+# End Source File
+# Begin Source File
+
+SOURCE=cdtest_led.c
+# End Source File
+# Begin Source File
+
+SOURCE=Colorbar.c
+# End Source File
+# Begin Source File
+
+SOURCE=Drivers.c
+# End Source File
+# Begin Source File
+
+SOURCE=List.c
+# End Source File
+# Begin Source File
+
+SOURCE=Rubber.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=Cdtest.h
+# End Source File
+# End Group
+# End Target
+# End Project
+
diff --git a/test/cdtest/cdtest.h b/test/cdtest/cdtest.h
new file mode 100644
index 0000000..f670cc6
--- /dev/null
+++ b/test/cdtest/cdtest.h
@@ -0,0 +1,415 @@
+/*=========================================================================*/
+/* CDTEST.H - 05/12/95.                                                    */
+/*=========================================================================*/
+#ifndef CDTEST_H
+#define CDTEST_H
+
+/*- Constantes: -----------------------------------------------------------*/
+#define MAXPOINTS 300
+
+/*- Macros: ---------------------------------------------------------------*/
+#define isdigit(_) (((_)>='0') && ((_)<='9'))
+#define ignore(_) (void)(_)
+
+/*-------------------------------------------------------------------------*/
+/* Tipos enumerados.                                                       */
+/*-------------------------------------------------------------------------*/
+typedef enum {
+  LINE,
+  RECT,
+  BOX,
+  ARC,
+  SECTOR,
+  CHORD,
+  PIXEL,
+  MARK,
+  TEXT,
+  POLY,
+  CLIP,
+  IMAGE,
+  RGB,
+  META
+} tPrim;
+
+enum {
+  BACKGROUND,
+  FOREGROUND
+};
+
+enum {
+  NO_BUFFER,
+  IMAGE_BUFFER,
+  IMAGERGB_BUFFER
+};
+
+typedef enum {
+  NEWPOINT,
+  MOVE,
+  CLOSE,
+  CENTER,
+  REPAINT
+} tRubber;
+
+#if ((!defined(FALSE))&&(!defined(TRUE)))
+typedef enum {
+  FALSE,
+  TRUE
+} tBoolean;
+#else
+#define tBoolean int
+#endif
+
+/*-------------------------------------------------------------------------*/
+/* Definicao das estruturas de dados usadas.                               */
+/*-------------------------------------------------------------------------*/
+typedef struct {
+  int x, y;
+} tPoint;
+
+typedef struct {
+  cdContext* ctx;
+  char *filename;
+} tMeta;
+
+typedef struct {
+  int x1;
+  int y1;
+  int x2;
+  int y2;
+  int write_mode;
+  int line_style;
+  int line_width;
+  int line_cap;
+  int line_join;
+  int interior_style;
+  int back_opacity;
+  int hatch;
+  long foreground;
+  long background;
+} tLB;       /* cdLine ou cdBox ou cdRect */
+
+typedef struct {
+  int xc;
+  int yc;
+  int w;
+  int h;
+  double angle1;
+  double angle2;
+  int write_mode;
+  int line_style;
+  int line_width;
+  int line_cap;
+  int line_join;
+  int interior_style;
+  int back_opacity;
+  int hatch;
+  long foreground;
+  long background;
+} tAS;       /* cdArc e cdSector e Chord */
+
+typedef struct {
+  int x;
+  int y;
+  int write_mode;
+  long foreground;
+} tPixel;    /* cdPixel */
+
+typedef struct {
+  int x;
+  int y;
+  int write_mode;
+  int mark_type;
+  int mark_size;
+  long foreground;
+} tMark;     /* cdMark */
+
+typedef struct {
+  int x;
+  int y;
+  char *s;
+  int write_mode;
+  int font_size;
+  int font_style;
+  int font_typeface;
+  int back_opacity;
+  double text_orientation;
+  int text_alignment;
+  long foreground;
+  long background;
+} tText;     /* cdText */
+
+typedef struct {
+  int poly_mode;
+  int write_mode;
+  int line_style;
+  int line_width;
+  int line_cap;
+  int line_join;
+  int fill_mode;
+  int back_opacity;
+  int interior_style;
+  int hatch;
+  long foreground;
+  long background;
+  int num_points;
+  tPoint *points;
+} tPoly;     /* cdBegin, cdVertex e cdEnd */
+
+typedef struct tnode {
+  tPrim type;
+  union {
+    tLB lineboxpar;
+    tAS arcsectorpar;
+    tPoly polypar;
+    tPixel pixelpar;
+    tMark markpar;
+    tText textpar;
+    tMeta metapar;
+  } par;
+  struct tnode *next;
+} tList;
+
+/*-------------------------------------------------------------------------*/
+/* Contexto do CD Test.                                                    */
+/*-------------------------------------------------------------------------*/
+typedef struct {
+  cdCanvas *iup_canvas;      /* canvas do iup */
+  int w, h;                  /* largura e altura do canvas */
+  double res;
+  int bpp;
+
+  cdCanvas *wd_canvas;       /* canvas IUP p/ WD */
+  int wd_dialog;             /* se o dialogo do canvas WD estah na tela */
+                                  
+  cdCanvas *pic_canvas;       /* canvas IUP p/ Picture */
+  cdCanvas *picture;          /* Picture */
+  int pic_dialog;             /* se o dialogo do canvas Picture estah na tela */
+                                  
+  cdCanvas *buffer_canvas;   /* canvas para double-buffering */
+  int buffering;
+
+  Ihandle *dlg_cur_prim;     /* handle do dialogo de primitiva ativo */
+  Ihandle *bt_cur_prim;      /* handle do botao da primitiva corente */
+
+  tPrim cur_prim;            /* primitiva corrente */
+  tBoolean following;        /* flag de rubber-band */
+  int dlg_x;
+  int dlg_y;
+  int visible;
+
+  int write_mode;            /* atributos do CD */
+  int line_cap;
+  int line_join;
+  int line_style;
+  int line_width;
+  int fill_mode;
+  int font_typeface;
+  int font_style;
+  int font_size;
+  int text_alignment;
+  double text_orientation;
+  int back_opacity;
+  int mark_type;
+  int poly_mode;
+  long foreground;
+  long background;
+  int interior_style;        
+  int hatch;
+
+  unsigned char stipple[100];/* sample stipple */
+  long pattern[100];         /* sample pattern */
+  int dashes[4];             /* sample dash */
+
+  int clip_xmin;
+  int clip_xmax;
+  int clip_ymin;
+  int clip_ymax;
+  int clip_mode;
+
+  unsigned char *red;        /* imagem RGB */
+  unsigned char *green;
+  unsigned char *blue;
+  int rgb_w, rgb_h;          /* largura e altura da imagem RGB */
+
+  cdImage *test_image;       /* imagem off-screen para testes */
+
+  int num_points;            /* numero de pontos no poligono corrente */
+  tPoint points[MAXPOINTS];  /* armazanamento temporario do poligono */
+
+  char status_line[256];     /* linha de status */
+  char title[80];            /* barra de titulo do programa */
+
+  int x, y;                  /* posiccao do mouse no canvas */
+  char mouse_pos[40];        /* posiccao do mouse em uma string */
+
+  int sim;                   /* flag para simulacao */
+  int stretch_play;
+
+  tList *head;               /* lista de primitivas */
+} tCTC;                      /* CD Test Context */
+
+extern tCTC ctgc;
+
+/* parametros geometricos das primitivas */
+typedef struct {
+  int x1, x2, y1, y2;
+} tLinePos;
+
+typedef struct {
+  int xmin, xmax, ymin, ymax;
+  int x, y;
+} tBoxPos;
+
+typedef struct {
+  int x, y;
+} tPixelPos;
+
+typedef struct {
+  int x, y;
+  int size;
+} tMarkPos;
+
+typedef struct {
+  int xc, yc;
+  int w, h;
+  double angle1, angle2;
+} tArcPos;
+
+/*-------------------------------------------------------------------------*/
+/* Funccoes do modulo CDTEST.C.                                            */
+/*-------------------------------------------------------------------------*/
+int fEditUndo(void);
+int fEditClear(void);
+
+int fRepaint(void);
+int fFileExit(void);
+int fOK(void);
+int fOpenLines(void);
+int fClosedLines(void);
+int fPolyBezier(void);
+int fFill(void);
+int fSolid(void);
+int fHatch(void);
+int fStipple(void);
+int fPattern(void);
+
+int fPolyClip(void);
+int fClipPoly(void);
+
+int fWDCanvas(void);
+int fCloseWD(void);
+int fWDRepaint(void);
+
+int fPICCanvas(void);
+int fClosePIC(void);
+int fPICRepaint(void);
+
+int fOpacity(Ihandle *, char *, int, int);
+int fMarkType(Ihandle *, char *, int, int);
+
+int fNoBuffering(Ihandle *, int);
+int fImageBuffer(Ihandle *, int);
+int fRGBBuffer(Ihandle *, int);
+
+int fWriteMode(Ihandle *, char *, int, int);
+int fLineStyle(Ihandle *, char *, int, int);
+int fLineCap(Ihandle *, char *, int, int);
+int fLineJoin(Ihandle *, char *, int, int);
+int fFillMode(Ihandle *, char *, int, int);
+int fFontStyle(Ihandle *, char *, int, int);
+int fFontTypeFace(Ihandle *, char *, int, int);
+int fTextAlignment(Ihandle *, char *, int, int);
+int fHatchStyle(Ihandle *, char *, int, int);
+
+int fColor(Ihandle *);
+
+int fClip(Ihandle *);
+int fClipArea(void);
+int fClipOff(void);
+
+int fImage(Ihandle *);
+int fImagePut(void);
+int fImageGet(void);
+
+int fImageRGB(Ihandle *);
+int fImageRGBPut(void);
+int fImageRGBGet(void);
+
+int fLine(Ihandle *);
+int fRect(Ihandle *);
+int fBox(Ihandle *);
+int fArc(Ihandle *);
+int fSector(Ihandle *);
+int fChord(Ihandle *);
+int fPixel(Ihandle *);
+int fMark(Ihandle *);
+int fText(Ihandle *);
+int fPoly(Ihandle *);
+
+int fShowDialog(void);
+
+int fStretchPlay(Ihandle*, int);
+int fSimulate(Ihandle *, int);
+int fOptionsHide(void);
+int fOptions(void);
+int fAttributes(void);
+int fAttributesHide(void);
+int fMsgHide(void);
+
+int fInteger(Ihandle *, int);
+int fReal(Ihandle *, int);
+
+int fDraw(void);
+
+int fHelpAbout(void);
+int fCloseAbout(void);
+
+int fMotionCB(Ihandle *, int, int, char *);
+int fButtonCB(Ihandle *, int, int, int, int, char *);
+int fResizeCB(Ihandle *, int, int);
+int fGetFocusCB(Ihandle *);
+
+void set_status(void);
+void mouse_pos(int, int);
+void putlist(cdCanvas *target);
+void draw(void);
+
+/*-------------------------------------------------------------------------*/
+/* Funccoes do modulo RUBBER.C.                                            */
+/*-------------------------------------------------------------------------*/
+void follow(int, int);
+void line(tRubber, int, int);
+void box(tRubber, int, int);
+void arc(tRubber, int, int);
+void polygon(tRubber, int, int);
+
+/*-------------------------------------------------------------------------*/
+/* Funccoes do modulo LIST.C.                                              */
+/*-------------------------------------------------------------------------*/
+int newpolypoint(int, int);
+int newline(int, int, int, int);
+int newrect(int, int, int, int);
+int newbox(int, int, int, int);
+int newarc(int, int, int, int, double, double);
+int newsector(int, int, int, int, double, double);
+int newchord(int, int, int, int, double, double);
+int newpixel(int, int);
+int newmark(int, int, int);
+int newtext(int, int, char *);
+int newmetafile(char *, cdContext* ctx);
+int newpoly(void);
+void dellist(void);
+void dellast(void);
+
+/*-------------------------------------------------------------------------*/
+/* Funccoes do modulo DRIVERS.C.                                           */
+/*-------------------------------------------------------------------------*/
+void DriversInit(void);
+
+/*-------------------------------------------------------------------------*/
+/* Funccoes do modulo COLORBAR.C.                                          */
+/*-------------------------------------------------------------------------*/
+int ColorBarInit(Ihandle *parent, Ihandle *canvas, long *foreground, long *background);
+void ColorBarClose(void);
+
+#endif
diff --git a/test/cdtest/cdtest.ico b/test/cdtest/cdtest.ico
new file mode 100644
index 0000000..ba4b8af
Binary files /dev/null and b/test/cdtest/cdtest.ico differ
diff --git a/test/cdtest/cdtest.led b/test/cdtest/cdtest.led
new file mode 100644
index 0000000..1f2c412
--- /dev/null
+++ b/test/cdtest/cdtest.led
@@ -0,0 +1,1508 @@
+#===========================================================================#
+# CDTEST.LED - 05/12/95                                                     #
+#===========================================================================#
+
+#---------------------------------------------------------------------------#
+# Icones da Barra de Primitivas.                                            #
+#---------------------------------------------------------------------------#
+imgLine = IMAGE
+[ 
+ 0 = "BGCOLOR",
+ 1 = "0 0 0" 
+]
+(18, 18, 
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
+)
+
+imgClip = IMAGE
+[ 
+ 0 = "BGCOLOR",
+ 1 = "0 0 0" 
+]
+(18, 18, 
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+ 0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,
+ 0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,
+ 0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
+ 0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
+ 0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,
+ 0,0,0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,
+ 0,0,0,1,1,0,0,0,1,0,0,1,1,0,0,0,0,0,
+ 0,0,0,1,1,0,0,1,0,0,0,1,1,0,0,0,0,0,
+ 0,0,0,1,1,0,1,0,0,0,0,1,1,0,0,0,0,0,
+ 0,0,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,
+ 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,
+ 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
+)
+
+imgImage = IMAGE
+[ 
+ 0 = "BGCOLOR",
+ 1 = "0 0 0", 
+ 2 = "255 255 255",
+ 3 = "153 153 153"
+]
+(18, 18, 
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,
+ 0,0,0,0,1,1,2,2,2,2,2,1,1,0,0,0,0,0,
+ 0,0,0,0,1,1,2,2,2,2,2,1,1,0,0,0,0,0,
+ 0,0,0,1,1,2,1,1,2,1,1,2,1,1,0,0,0,0,
+ 0,0,0,1,2,2,1,2,2,2,1,2,2,1,0,0,0,0,
+ 0,0,0,1,2,2,2,2,1,2,2,2,2,1,0,0,0,0,
+ 0,0,0,1,1,2,2,2,1,3,2,2,1,1,0,0,0,0,
+ 0,0,0,0,1,2,2,2,2,1,2,2,1,3,0,0,0,0,
+ 0,0,0,0,1,2,2,2,1,1,2,2,1,3,0,0,0,0,
+ 0,0,0,0,1,2,2,2,2,2,2,2,1,3,0,0,0,0,
+ 0,0,0,0,0,1,2,1,3,1,2,1,3,0,0,0,0,0,
+ 0,0,0,0,0,1,2,2,1,3,2,1,3,0,0,0,0,0,
+ 0,0,0,0,0,0,1,2,2,2,1,3,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,1,1,3,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,2,1,3,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,2,1,3,0,0,0,0,0,0,0 
+)
+
+imgImageRGB = IMAGE
+[ 
+ 0 = "BGCOLOR",
+ 1 = "255 0 0", 
+ 2 = "0 255 0",
+ 3 = "0 0 255"
+]
+(18, 18, 
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,
+ 0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,
+ 0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,
+ 0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,
+ 0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,
+ 0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,
+ 0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,
+ 0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,
+ 0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,
+ 0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
+)
+
+imgBox = IMAGE
+[ 
+ 0 = "BGCOLOR",
+ 1 = "0 0 0", 
+ 2 = "255 255 255"
+]
+(
+ 18, 18, 
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
+ 0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
+ 0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
+ 0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
+ 0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
+ 0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
+ 0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,0,0,
+ 0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,0,0,
+ 0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,0,0,
+ 0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,0,0,
+ 0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,0,0,
+ 0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,0,0,
+ 0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,0,0,
+ 0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+)
+
+imgRect = IMAGE
+[ 
+ 0 = "BGCOLOR",
+ 1 = "0 0 0", 
+ 2 = "255 255 255"
+]
+(
+ 18, 18, 
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,2,2,2,2,2,2,2,2,0,0,
+ 0,0,1,0,0,0,0,0,2,0,0,0,1,0,0,2,0,0,
+ 0,0,1,0,0,0,0,0,2,0,0,0,1,0,0,2,0,0,
+ 0,0,1,0,0,0,0,0,2,0,0,0,1,0,0,2,0,0,
+ 0,0,1,1,1,1,1,1,2,1,1,1,1,0,0,2,0,0,
+ 0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,
+ 0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,
+ 0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+)
+
+imgSector = IMAGE
+[
+ 0 = "BGCOLOR",
+ 1 = "0 0 0" ,
+ 2 = "255 255 255"
+]
+(18, 18, 
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,
+ 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
+ 0,0,0,1,1,1,1,1,1,1,1,1,1,2,0,0,0,0,
+ 0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,0,0,0,
+ 0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,0,0,0,
+ 0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,0,0,
+ 0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,0,0,
+ 0,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,0,0,
+ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
+ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
+ 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,
+ 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,
+ 0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,
+ 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
+ 0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
+)
+
+imgChord = IMAGE
+[
+ 0 = "BGCOLOR",
+ 1 = "0 0 0" ,
+ 2 = "255 255 255"
+]
+(18, 18, 
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,1,1,2,2,2,0,0,0,0,0,0,0,
+ 0,0,0,0,1,1,1,1,1,2,2,2,2,0,0,0,0,0,
+ 0,0,0,1,1,1,1,1,1,1,2,2,2,2,0,0,0,0,
+ 0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,0,0,0,
+ 0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,0,0,0,
+ 0,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,0,0,
+ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,0,0,
+ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,0,
+ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
+ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
+ 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,
+ 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,
+ 0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,
+ 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
+ 0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
+)
+
+imgArc = IMAGE
+[
+ 0 = "BGCOLOR",
+ 1 = "0 0 0",
+ 2 = "255 255 255"
+]
+(18, 18, 
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,
+ 0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+ 0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+ 0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+ 0,0,0,2,0,0,0,2,0,0,1,2,2,0,0,0,0,0,
+ 0,0,0,0,2,2,2,0,1,1,0,0,0,2,2,0,0,0,
+ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,
+ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,
+ 0,0,0,0,0,0,0,0,1,1,0,0,0,2,2,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,1,2,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+)
+
+imgText = IMAGE
+[
+ 0 = "BGCOLOR",
+ 1 = "255 255 255",
+ 2 = "0 0 0"
+]
+(18, 18, 
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,2,2,0,0,2,2,0,0,1,1,0,0,0,0,0,
+ 0,0,2,2,0,0,0,0,2,2,0,0,1,0,0,0,0,0,
+ 0,0,2,2,0,0,0,0,2,2,0,0,1,0,0,0,0,0,
+ 0,0,2,2,0,0,0,0,2,2,0,0,1,1,1,1,0,0,
+ 0,0,2,2,2,2,2,2,2,2,0,0,1,0,0,0,1,0,
+ 0,0,2,2,0,0,0,0,2,2,0,0,1,0,0,0,1,0,
+ 0,0,2,2,0,0,0,0,2,2,0,0,1,0,0,0,1,0,
+ 0,0,2,2,0,0,0,0,2,2,0,0,1,0,0,0,1,0,
+ 0,0,2,2,0,0,0,0,2,2,0,1,1,1,1,1,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+)
+
+imgPoly = IMAGE
+[
+ 0 = "BGCOLOR",
+ 1 = "0 0 0"
+]
+(18, 18, 
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,
+ 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,
+ 0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,
+ 0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,
+ 0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,
+ 0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,
+ 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
+ 0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,
+ 0,0,0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,0,
+ 0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,
+ 0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+)
+
+imgMark = IMAGE
+[
+ 0 = "BGCOLOR",
+ 1 = "0 0 0"
+]
+(18, 18, 
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,
+ 0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,
+ 0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,
+ 0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,
+ 0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,
+ 0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,
+ 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+)
+
+imgPixel = IMAGE
+[
+ 0 = "BGCOLOR",
+ 1 = "0 0 0",
+ 2 = "255 255 255"
+]
+(18, 18, 
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,2,2,0,0,0,0,0,0,0,2,2,0,0,0,0,
+ 0,0,0,2,2,0,0,0,0,0,0,0,2,2,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,2,2,0,0,0,1,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+)
+
+#---------------------------------------------------------------------------#
+# Descricao dos Menus.                                                      #
+#---------------------------------------------------------------------------#
+mnOpen = MENU
+(
+ ITEM("MF...",  cmdPlayMF),
+ itPlayCGM = ITEM[ACTIVE=NO]("CGM...", cmdPlayCGM),
+ itPlayEMF = ITEM[ACTIVE=NO]("EMF...", cmdPlayEMF),
+ itPlayWMF = ITEM[ACTIVE=NO]("WMF...", cmdPlayWMF)
+)
+
+mnSave = MENU
+(
+ ITEM("MF...",  cmdMF),
+ itPDF = ITEM[ACTIVE=NO]("PDF...",  cmdPDF),
+ itPS = ITEM[ACTIVE=NO]("PS...",  cmdPS),
+ itEPS = ITEM[ACTIVE=NO]("EPS...",  cmdEPS),
+ itCGMt = ITEM[ACTIVE=NO]("CGMt...", cmdCGMt),
+ itCGMb = ITEM[ACTIVE=NO]("CGMb...", cmdCGMb),
+ itDGN = ITEM[ACTIVE=NO]("DGN...", cmdDGN),
+ itDXF = ITEM[ACTIVE=NO]("DXF...", cmdDXF),
+ itEMF = ITEM[ACTIVE=NO]("EMF...", cmdEMF),
+ itWMF = ITEM[ACTIVE=NO]("WMF...", cmdWMF)
+)
+
+mnFile = MENU
+(
+ SUBMENU[KEY=K_O]("Open", mnOpen),
+ SEPARATOR(),
+ SUBMENU[KEY=K_S]("Save", mnSave),
+ SEPARATOR(),
+ itPrint = ITEM[KEY=K_P]("Print...", cmdPrint),
+ SEPARATOR(),
+ ITEM[KEY=K_x]("Exit", cmdFileExit)
+)
+
+mnEdit = MENU
+(
+ itEditUndo = ITEM("Undo", cmdEditUndo),
+ SEPARATOR(),
+ itClipBoard = ITEM[ACTIVE=NO]("Copy as EMF/WMF", cmdClipBoard),
+ itClipBoardBitmap = ITEM[ACTIVE=NO]("Copy as Bitmap", cmdClipBoardBitmap),
+ itClipBoardMetafile = ITEM[ACTIVE=NO]("Copy as CD Metafile", cmdClipBoardMetafile),
+ itClipBoardPaste = ITEM[ACTIVE=NO]("Paste", cmdClipBoardPaste),
+ SEPARATOR(),
+ ITEM("Clear", cmdEditClear),
+ SEPARATOR(),
+ ITEM("Options...", cmdOptions)
+)
+
+mnPrimitives = MENU
+(
+ ITEM("Pixel...", cmdPixel),
+ ITEM("Mark...", cmdMark),
+ ITEM("Line...", cmdLine),
+ ITEM("Polygon...", cmdPoly),
+ ITEM("Rect...", cmdRect),
+ ITEM("Box...", cmdBox),
+ ITEM("Arc...", cmdArc),
+ ITEM("Sector...", cmdSector),
+ ITEM("Chord...", cmdChord),
+ ITEM("Text...", cmdText),
+ SEPARATOR(),
+ ITEM("Server Image...", cmdImage),
+ ITEM("RGB Image...", cmdImageRGB)
+)    
+
+mnDraw = MENU[ISMENU=YES]
+(
+ SUBMENU[KEY=K_P]("Primitives", mnPrimitives),
+ SEPARATOR(),
+ ITEM("Clipping...", cmdClip),
+ ITEM("Attributes...", cmdAttributes),
+ SEPARATOR(),
+ itWDCanvas = ITEM("Show WD Canvas", cmdWDCanvas),
+ itPICCanvas = ITEM("Show Picture Canvas", cmdPICCanvas)
+)    
+
+mnHelp = MENU
+(
+ ITEM("About...", cmdHelpAbout)
+)
+
+mnMain = MENU
+(
+ SUBMENU[KEY=K_mF]("File", mnFile),
+ SUBMENU[KEY=K_mE]("Edit", mnEdit),
+ SUBMENU[KEY=K_mD]("Draw", mnDraw),
+ SUBMENU[KEY=K_mH]("Help", mnHelp)
+)
+
+#===========================================================================#
+# Barras de Ferramentas.                                                    #
+#===========================================================================#
+
+#---------------------------------------------------------------------------#
+# Barra de status.                                                          #
+#---------------------------------------------------------------------------#
+lbStatusLine = LABEL[EXPAND=HORIZONTAL]("Esta eh a barra de status do CDTest.")
+
+#---------------------------------------------------------------------------#
+# Barra de Primitivas.                                                      #
+#---------------------------------------------------------------------------#
+
+btLine       = BUTTON[IMAGE=imgLine, TIP="Line"]("",cmdLine)
+btBox        = BUTTON[IMAGE=imgBox, TIP="Box"]("",cmdBox)
+btRect       = BUTTON[IMAGE=imgRect, TIP="Rect"]("",cmdRect)
+btArc        = BUTTON[IMAGE=imgArc, TIP="Arc"]("", cmdArc)
+btSector     = BUTTON[IMAGE=imgSector, TIP="Sector"]("", cmdSector)
+btChord      = BUTTON[IMAGE=imgChord, TIP="Chord"]("", cmdChord)
+btPixel      = BUTTON[IMAGE=imgPixel, TIP="Pixel"]("", cmdPixel)
+btMark       = BUTTON[IMAGE=imgMark, TIP="Mark"]("", cmdMark)
+btText       = BUTTON[IMAGE=imgText, TIP="Text"]("", cmdText)
+btPoly       = BUTTON[IMAGE=imgPoly, TIP="Polygon"]("", cmdPoly)
+
+btImageRGB   = BUTTON[IMAGE=imgImageRGB, TIP="RGB Image"]("", cmdImageRGB)
+btImage      = BUTTON[IMAGE=imgImage, TIP="Server Image"]("", cmdImage)
+btClip       = BUTTON[IMAGE=imgClip, TIP="Clipping Area"]("", cmdClip)
+
+btCurPrim    = BUTTON[IMAGE=imgLine, TIP="Show primitive dialog"]("", cmdShowDialog)
+
+lbMousePos = LABEL[SIZE=90]("(    ,    )")
+
+PrimBar = VBOX[GAP=2]
+(
+ btCurPrim,
+ FILL[SIZE=20](),
+ btPixel,
+ btMark,
+ btLine,
+ btPoly,
+ btRect,
+ btBox,
+ btArc,
+ btSector,
+ btChord,
+ btText,
+ FILL[SIZE=5](),
+ btImage,
+ btImageRGB,
+ FILL[SIZE=5](),
+ btClip,
+ FILL[SIZE=30]()
+)
+
+#---------------------------------------------------------------------------#
+# Barra de Cores.                                                           #
+#---------------------------------------------------------------------------#
+cnvColorBar = CANVAS
+[
+ BUTTON_CB = cmdColorBarButtonCB,
+ RESIZE_CB = cmdColorBarResizeCB,
+ SIZE = 220x12,
+ BORDER = NO,
+ EXPAND = NO
+]
+(cmdColorBarRepaint)
+
+#===========================================================================#
+# Dialogo Principal                                                         #
+#===========================================================================#
+
+#---------------------------------------------------------------------------#
+# Canvas para visualizacao das primitivas.                                  #
+#---------------------------------------------------------------------------#
+cnvMain = CANVAS
+[
+ MOTION_CB=cmdMotionCB,
+ BUTTON_CB=cmdButtonCB,
+ RESIZE_CB=cmdResizeCB
+]
+(cmdRepaint)
+
+#---------------------------------------------------------------------------#
+# Area de trabalho.                                                         #
+#---------------------------------------------------------------------------#
+DeskTop = VBOX
+(
+ FILL[SIZE=5](),
+ HBOX
+ (
+  FILL[SIZE=5](),
+  PrimBar,
+  FILL[SIZE=2](),
+  VBOX
+  (
+   FILL[SIZE=2](),
+   lbMousePos,
+   FILL[SIZE=5](),
+   cnvMain,
+   FILL[SIZE=2](),
+   cnvColorBar,
+   FILL[SIZE=5](),
+   lbStatusLine
+  ),
+  FILL[SIZE=5]()
+ ),
+ FILL[SIZE=5]()
+)
+
+#---------------------------------------------------------------------------#
+# Dialogo principal.                                                        #
+#---------------------------------------------------------------------------#
+dlgMain = DIALOG
+[
+ TITLE = "CD Test 5.3",
+ MENU = mnMain,
+ ICON = "CdTestIcon",
+ K_cZ = cmdEditUndo,
+ GETFOCUS_CB = cmdGetFocusCB,
+ KILLFOCUS_CB = cmdKillFocusCB,
+ CLOSE_CB = cmdFileExit
+]
+(DeskTop)
+
+#===========================================================================#
+# Especificacao dos dialogos auxiliares.                                    #
+#===========================================================================#
+
+#---------------------------------------------------------------------------#
+# Dialogo com o canvas para exibiccao de primitivas WD.                     #
+#---------------------------------------------------------------------------#
+cnvWDCanvas = CANVAS[BORDER=NO](cmdWDRepaint)
+dlgWDCanvas = DIALOG
+[
+ TITLE = "WD Canvas",
+ CLISE_CB =	cmdCloseWD,
+ SIZE = 200x200,
+ PARENTDIALOG="dlgMain",
+ GAP=5x5
+]
+(cnvWDCanvas)
+
+cnvPICCanvas = CANVAS[BORDER=NO](cmdPICRepaint)
+dlgPICCanvas = DIALOG
+[
+ TITLE = "PIC Canvas",
+ CLISE_CB =	cmdClosePIC,
+ SIZE = 200x200,
+ PARENTDIALOG="dlgMain",
+ GAP=5x5
+]
+(cnvPICCanvas)
+
+#---------------------------------------------------------------------------#
+# Dialogo Options                                                           #
+#---------------------------------------------------------------------------#
+btOptionsHide = BUTTON[SIZE=30]("Hide", cmdOptionsHide)
+
+tgSimulate = TOGGLE[VALUE=OFF, SIZE=55]("Simulate", cmdSimulate)
+tgStretchPlay = TOGGLE[VALUE=OFF, SIZE=70]("Stretch Play", cmdStretchPlay)
+
+tgNoBuffering = TOGGLE[VALUE=ON]("No buffering", cmdNoBuffering)
+tgImageBuffer = TOGGLE("CD_DBUFFER", cmdImageBuffer)
+tgRGBBuffer   = TOGGLE("CD_DBUFFERRGB", cmdRGBBuffer)
+
+rdBuffering = RADIO
+(
+ VBOX
+ (
+  tgNoBuffering,
+  tgImageBuffer,
+  tgRGBBuffer
+ )
+)
+
+OptionsDesktop = VBOX
+(
+  VBOX[GAP=2]
+  (
+   FRAME[TITLE="Buffering:", MARGIN=5x5, SIZE=80]
+   (
+    rdBuffering
+   ),
+   FILL[SIZE=10](),
+   tgSimulate,
+   tgStretchPlay,
+   FILL[SIZE=10](),
+   btOptionsHide,
+   FILL[SIZE=2]()
+  )
+)
+
+dlgOptions = DIALOG
+[
+ TITLE="Options",
+ PARENTDIALOG="dlgMain",
+ MAXBOX=NO,
+ MINBOX=NO,
+ RESIZE=NO,
+ MARGIN=5x2
+]
+(OptionsDesktop)
+
+#---------------------------------------------------------------------------#
+# Dialogo Attributes                                                        #
+#---------------------------------------------------------------------------#
+lstTextAlignment = LIST
+[
+ 1="CD_NORTH",
+ 2="CD_SOUTH",
+ 3="CD_EAST",
+ 4="CD_WEST",
+ 5="CD_NORTH_EAST",
+ 6="CD_NORTH_WEST",
+ 7="CD_SOUTH_EAST",
+ 8="CD_SOUTH_WEST",
+ 9="CD_CENTER",
+ 10="CD_BASE_LEFT",
+ 11="CD_BASE_CENTER",
+ 12="CD_BASE_RIGHT",
+ DROPDOWN=YES,
+ VALUE=10,
+ SIZE=89
+]
+(cmdTextAlignment)
+
+txtMarkSize = TEXT[NC=4, SIZE=20x12, VALUE="10"](cmdInteger)
+
+lstMarkType = LIST
+[
+ 1="CD_PLUS",
+ 2="CD_STAR",
+ 3="CD_CIRCLE",
+ 4="CD_X",
+ 5="CD_BOX",
+ 6="CD_DIAMOND",
+ 7="CD_HOLLOW_CIRCLE",
+ 8="CD_HOLLOW_BOX",
+ 9="CD_HOLLOW_DIAMOND",
+ DROPDOWN=YES,
+ VALUE=2,
+ SIZE=80
+](cmdMarkType)
+
+lstWriteMode = LIST
+[
+ 1="CD_REPLACE",
+ 2="CD_XOR",
+ 3="CD_NOT_XOR",
+ VALUE=1,
+ DROPDOWN=YES,
+ SIZE=80
+]
+(cmdWriteMode)
+
+lstFontTypeFace = LIST
+[
+ 1="CD_SYSTEM",
+ 2="CD_COURIER",
+ 3="CD_TIMES_ROMAN",
+ 4="CD_HELVETICA",
+ VALUE=1,
+ DROPDOWN=YES,
+ SIZE=80
+]
+(cmdFontTypeFace)
+
+lstLineCap = LIST
+[
+ 1="CD_CAPFLAT",
+ 2="CD_CAPSQUARE",
+ 3="CD_CAPROUND",
+ VALUE=1,
+ DROPDOWN=YES,
+ SIZE=80
+]
+(cmdLineCap)
+
+lstLineJoin = LIST
+[
+ 1="CD_BEVEL",
+ 2="CD_MITER",
+ 3="CD_ROUND",
+ VALUE=1,
+ DROPDOWN=YES,
+ SIZE=80
+]
+(cmdLineJoin)
+
+lstFillMode = LIST
+[
+ 1="CD_EVENODD",
+ 2="CD_WINDING",
+ VALUE=1,
+ DROPDOWN=YES,
+ SIZE=80
+]
+(cmdFillMode)
+
+lstFontStyle = LIST
+[
+ 1="CD_PLAIN",
+ 2="CD_BOLD",
+ 3="CD_ITALIC",
+ 4="CD_BOLD_ITALIC",
+ VALUE=1,
+ DROPDOWN=YES,
+ SIZE=80
+]
+(cmdFontStyle)
+
+txtLineWidth = TEXT[SIZE=30, NC=3, VALUE="1"](cmdInteger)
+txtFontSize  = TEXT[SIZE=30, NC=3, VALUE="12"](cmdInteger)
+txtTextOrientation  = TEXT[SIZE=30, NC=3, VALUE="0"](cmdInteger)
+
+lstLineStyle = LIST
+[
+ 1="CD_CONTINUOUS",
+ 2="CD_DASHED",
+ 3="CD_DOTTED",
+ 4="CD_DASH_DOT",
+ 5="CD_DASH_DOT_DOT",
+ 6="CD_CUSTOM",
+ VALUE=1,
+ DROPDOWN=YES,
+ SIZE=80
+]
+(cmdLineStyle)
+
+tgSolid   = TOGGLE[VALUE=ON] ("CD_SOLID",   cmdSolid)
+tgHatch   = TOGGLE("CD_HATCH",   cmdHatch)
+tgStipple = TOGGLE("CD_STIPPLE", cmdStipple)
+tgPattern = TOGGLE("CD_PATTERN", cmdPattern)
+
+lstOpacity = LIST
+[
+ 1="CD_OPAQUE",
+ 2="CD_TRANSPARENT",
+ VALUE=2,
+ DROPDOWN=YES,
+ SIZE=80,
+ ACTIVE=YES
+]
+(cmdOpacity)
+
+lstHatchStyle = LIST
+[
+ 1="CD_HORIZONTAL",
+ 2="CD_VERTICAL",
+ 3="CD_FDIAGONAL",
+ 4="CD_BDIAGONAL",
+ 5="CD_CROSS",
+ 6="CD_DIAGCROSS",
+ VALUE=1,
+ DROPDOWN=YES,
+ SIZE=80,
+ ACTIVE=YES
+]
+(cmdHatchStyle)
+
+btAttributesHide = BUTTON[SIZE=30]("Hide", cmdAttributesHide)
+
+rdInteriorStyle = RADIO
+(
+ VBOX
+ (
+  tgSolid,
+  tgHatch,
+  tgStipple,
+  tgPattern
+ )
+)
+
+AttributesDesktop = VBOX
+(
+  HBOX
+  (
+    VBOX[GAP=2]
+    (
+      LABEL("Write Mode:"),
+      lstWriteMode,
+      FILL[SIZE=4](),
+      FRAME[TITLE="Fill Attributes", MARGIN=5x5]
+      (
+        VBOX
+        (
+          LABEL("Back Opacity:"),
+          lstOpacity,
+          FILL[SIZE=2](),
+          LABEL("Fill Mode:"),
+          lstFillMode,
+          FILL[SIZE=2](),
+          FRAME[TITLE="Interior Style:", MARGIN=5x5, SIZE=80]
+          (
+            rdInteriorStyle
+          ),
+          FILL[SIZE=2](),
+          LABEL("Hatch Style:"),
+          lstHatchStyle
+        )
+      ),
+      FILL[SIZE=10](),
+      FRAME[TITLE="Mark Attributes", MARGIN=5x5]
+      (
+        VBOX
+        (
+          LABEL("Mark Type:"),
+          lstMarkType,
+          FILL[SIZE=2](),
+          LABEL("Mark Size:"),
+          txtMarkSize
+        )
+      ),
+      FILL[SIZE=10](),
+      btAttributesHide
+    ),
+    VBOX[GAP=2]
+    (
+      FRAME[TITLE="Text Attributes", MARGIN=5x5]
+      (
+        VBOX
+        (
+          LABEL("Font Typeface:"),
+          lstFontTypeFace,
+          FILL[SIZE=2](),
+          LABEL("Font Style:"),
+          lstFontStyle,
+          FILL[SIZE=2](),
+          LABEL("Font Size:"),
+          txtFontSize,
+          FILL[SIZE=2](),
+          LABEL[SIZE=x9]("Text Alignment:"),
+          lstTextAlignment,
+          FILL[SIZE=2](),
+          LABEL[SIZE=x9]("Text Orientation:"),
+          txtTextOrientation
+        )
+      ),
+      FILL[SIZE=10](),
+      FRAME[TITLE="Line Attributes", MARGIN=5x5]
+      (
+        VBOX
+        (
+          LABEL("Line Style:"),
+          lstLineStyle,
+          FILL[SIZE=2](),
+          LABEL("Line Width:"),
+          txtLineWidth,
+          FILL[SIZE=2](),
+          LABEL("Line Cap:"),
+          lstLineCap,
+          FILL[SIZE=2](),
+          LABEL("Line Join:"),
+          lstLineJoin
+        )
+      )
+    )
+  )
+)
+
+dlgAttributes = DIALOG
+[
+ TITLE="Attributes",
+ PARENTDIALOG="dlgMain",
+ MAXBOX=NO,
+ MINBOX=NO,
+ RESIZE=NO,
+ CLOSE_CB=cmdAttributesHide,
+ MARGIN=5x2
+]
+(AttributesDesktop)
+
+#---------------------------------------------------------------------------#
+# Dialogo Line ou Box ou Rect.                                              #
+#---------------------------------------------------------------------------#
+txtLBX1 = TEXT[NC=8, SIZE=30x12, VALUE="0"](cmdInteger)
+txtLBX2 = TEXT[NC=8, SIZE=30x12, VALUE="0"](cmdInteger)
+txtLBY1 = TEXT[NC=8, SIZE=30x12, VALUE="0"](cmdInteger)
+txtLBY2 = TEXT[NC=8, SIZE=30x12, VALUE="0"](cmdInteger)
+
+btLBDraw = BUTTON[SIZE=30]("Draw", cmdDraw)
+btLBHide = BUTTON[SIZE=30]("Hide", cmdMsgHide)
+
+LBData = VBOX
+(
+ HBOX[ALIGNMENT=ACENTER]
+ (
+  LABEL[SIZE=15x9]("X1:"),
+  txtLBX1,
+  FILL[SIZE=5](),
+  LABEL[SIZE=15x9]("Y1:"),
+  txtLBY1
+ ),
+ HBOX[ALIGNMENT=ACENTER]
+ (
+  LABEL[SIZE=15x9]("X2:"),
+  txtLBX2,
+  FILL[SIZE=5](),
+  LABEL[SIZE=15x9]("Y2:"),
+  txtLBY2
+ )
+)
+
+LBDeskTop = VBOX
+(
+ HBOX
+ (
+  FILL(),
+  LBData,
+  FILL()
+ ),
+ HBOX
+ (
+  FILL(),
+  btLBDraw,
+  FILL[SIZE=5](),
+  btLBHide,
+  FILL()
+ )
+)
+
+dlgLB = DIALOG
+[
+ TITLE="Line Parameters",
+ PARENTDIALOG="dlgMain",
+ MAXBOX=NO,
+ MINBOX=NO,
+ RESIZE=NO,
+ CLOSE_CB=cmdMsgHide,
+ MARGIN=5x5
+]
+(LBDeskTop)
+
+#---------------------------------------------------------------------------#
+# Dialogo Arc ou Sector.                                                    #
+#---------------------------------------------------------------------------#
+txtASXC     = TEXT[NC=4, SIZE=30x12, VALUE="0"](cmdInteger)
+txtASYC     = TEXT[NC=4, SIZE=30x12, VALUE="0"](cmdInteger)
+txtASW      = TEXT[NC=4, SIZE=30x12, VALUE="0"](cmdInteger)
+txtASH      = TEXT[NC=4, SIZE=30x12, VALUE="0"](cmdInteger)
+txtASAngle1 = TEXT[NC=10, SIZE=30x12, VALUE="0"](cmdReal)
+txtASAngle2 = TEXT[NC=10, SIZE=30x12, VALUE="360"](cmdReal)
+
+btASDraw = BUTTON[SIZE=30]("Draw", cmdDraw)
+btASHide = BUTTON[SIZE=30]("Hide", cmdMsgHide)
+
+ASData = VBOX
+(
+ HBOX[ALIGNMENT=ACENTER]
+ (
+  LABEL[SIZE=30x9]("Xc:"),
+  txtASXC,
+  FILL[SIZE=5](),
+  LABEL[SIZE=30x9]("Yc:"),
+  txtASYC
+ ),
+ HBOX[ALIGNMENT=ACENTER]
+ (
+  LABEL[SIZE=30x9]("W:"),
+  txtASW,
+  FILL[SIZE=5](),
+  LABEL[SIZE=30x9]("H:"),
+  txtASH
+ ),
+ HBOX[ALIGNMENT=ACENTER]
+ (
+  LABEL[SIZE=30x9]("Angle1:"),
+  txtASAngle1,
+  FILL[SIZE=5](),
+  LABEL[SIZE=30x9]("Angle2:"),
+  txtASAngle2
+ )
+)
+
+ASDeskTop = VBOX
+(
+ HBOX
+ (
+  FILL(),
+  ASData,
+  FILL()
+ ),
+ HBOX
+ (
+  FILL(),
+  btASDraw,
+  FILL[SIZE=5](),
+  btASHide,
+  FILL()
+ )
+)
+
+dlgAS = DIALOG
+[
+ PARENTDIALOG="dlgMain",
+ TITLE="Arc Parameters",
+ MAXBOX=NO,
+ MINBOX=NO,
+ RESIZE=NO,
+ CLOSE_CB=cmdMsgHide,
+ MARGIN=5x5
+]
+(ASDeskTop)
+
+#---------------------------------------------------------------------------#
+# Dialogo Pixel.                                                            #
+#---------------------------------------------------------------------------#
+txtPixelX = TEXT[NC=5, SIZE=30x12, VALUE="0"](cmdInteger)
+txtPixelY = TEXT[NC=5, SIZE=30x12, VALUE="0"](cmdInteger)
+
+btPixelDraw   = BUTTON[SIZE=30]("Draw", cmdDraw)
+btPixelHide = BUTTON[SIZE=30]("Hide", cmdMsgHide)
+
+PixelData = VBOX
+(
+ HBOX[ALIGNMENT=ACENTER]
+ (
+  LABEL[SIZE=10x9]("X:"),
+  txtPixelX,
+  FILL[SIZE=5](),
+  LABEL[SIZE=10x9]("Y:"),
+  txtPixelY
+ )
+)
+
+PixelDeskTop = VBOX
+(
+ HBOX
+ (
+  FILL(),
+  PixelData,
+  FILL()
+ ),
+ HBOX
+ (
+  FILL(),
+  btPixelDraw,
+  FILL[SIZE=5](),
+  btPixelHide,
+  FILL()
+ )
+)
+
+dlgPixel = DIALOG
+[
+ PARENTDIALOG="dlgMain",
+ TITLE="Pixel Parameters",
+ MAXBOX=NO,
+ MINBOX=NO,
+ RESIZE=NO,
+ CLOSE_CB=cmdMsgHide,
+ MARGIN=5x5
+]
+(PixelDeskTop)
+
+#---------------------------------------------------------------------------#
+# Dialogo Mark.                                                             #
+#---------------------------------------------------------------------------#
+txtMarkX    = TEXT[NC=5, SIZE=30x12, VALUE="0"](cmdInteger)
+txtMarkY    = TEXT[NC=5, SIZE=30x12, VALUE="0"](cmdInteger)
+
+btMarkDraw = BUTTON[SIZE=30]("Draw", cmdDraw)
+btMarkHide = BUTTON[SIZE=30]("Hide", cmdMsgHide)
+
+MarkData = VBOX
+(
+ HBOX[ALIGNMENT=ACENTER]
+ (
+  FILL(),
+  LABEL[SIZE=10x9]("X:"),
+  txtMarkX,
+  FILL[SIZE=5](),
+  LABEL[SIZE=10x9]("Y:"),
+  txtMarkY,
+  FILL()
+ )
+)
+
+MarkDeskTop = VBOX
+(
+ HBOX
+ (
+  FILL(),
+  MarkData,
+  FILL()
+ ),
+ HBOX
+ (
+  FILL(),
+  btMarkDraw,
+  FILL[SIZE=5](),
+  btMarkHide,
+  FILL()
+ )
+)
+
+dlgMark = DIALOG
+[
+ PARENTDIALOG="dlgMain",
+ TITLE="Mark Parameters",
+ MAXBOX=NO,
+ MINBOX=NO,
+ RESIZE=NO,
+ CLOSE_CB=cmdMsgHide,
+ MARGIN=5x5
+]
+(MarkDeskTop)
+
+#---------------------------------------------------------------------------#
+# Dialogo Text.                                                             #
+#---------------------------------------------------------------------------#
+txtTextX = TEXT[NC=5, SIZE=30x12, VALUE="0"](cmdInteger)
+txtTextY = TEXT[NC=5, SIZE=30x12, VALUE="0"](cmdInteger)
+txtTextS = TEXT[NC=100, SIZE=89x12, VALUE="Text"](cmdString)
+                                
+btTextDraw = BUTTON[SIZE=30]("Draw", cmdDraw)
+btTextHide = BUTTON[SIZE=30]("Hide", cmdMsgHide)
+
+TextData = VBOX
+(
+ HBOX[ALIGNMENT=ACENTER]
+ (
+  LABEL[SIZE=10x9]("X:"),
+  txtTextX,
+  FILL[SIZE=5](),
+  LABEL[SIZE=10x9]("Y:"),
+  txtTextY
+ ),
+ HBOX
+ (
+  VBOX
+  (
+   LABEL[SIZE=25x9]("Text:"),
+   txtTextS
+  )
+ )
+)
+
+TextDeskTop = VBOX
+(
+ HBOX
+ (
+  FILL(),
+  TextData,
+  FILL()
+ ),
+ HBOX
+ (
+  FILL(),
+  btTextDraw,
+  FILL[SIZE=5](),
+  btTextHide,
+  FILL()
+ )
+)
+
+dlgText = DIALOG
+[
+ PARENTDIALOG="dlgMain",
+ TITLE="Text Parameters", 
+ MAXBOX=NO,
+ MINBOX=NO,
+ CLOSE_CB=cmdMsgHide,
+ RESIZE=NO,
+ MARGIN=5x5
+]
+(TextDeskTop)
+
+#---------------------------------------------------------------------------#
+# Dialogo Poly.                                                             #
+#---------------------------------------------------------------------------#
+tgOpenLines   = TOGGLE[VALUE=ON]("CD_OPEN_LINES", cmdOpenLines)
+tgClosedLines = TOGGLE("CD_CLOSED_LINES", cmdClosedLines)
+tgFilled      = TOGGLE("CD_FILL", cmdFill)
+tgClip        = TOGGLE("CD_CLIP", cmdPolyClip)
+tgBezier      = TOGGLE("CD_BEZIER", cmdPolyBezier)
+
+btPolyHide = BUTTON[SIZE=30]("Hide", cmdMsgHide)
+
+rdMode = RADIO
+(
+ VBOX
+ (
+  tgOpenLines,
+  tgClosedLines,
+  tgFilled,
+  tgClip,
+  tgBezier
+ )
+)
+
+PolyDesktop = VBOX
+(
+ FILL[SIZE=5](),
+ HBOX
+ (
+  FILL(),
+  FRAME[TITLE="Polygon Mode:"]
+  (
+   HBOX
+   (
+    FILL[SIZE=5](),
+    rdMode
+   )
+  ),
+  FILL()
+ ),
+ FILL[SIZE=10](),
+ HBOX
+ (
+  FILL(),
+  btPolyHide,
+  FILL()
+ ),
+ FILL[SIZE=5]()
+)
+
+dlgPoly = DIALOG
+[
+ PARENTDIALOG="dlgMain",
+ TITLE="Polygon Parameters",
+ MAXBOX=NO,
+ MINBOX=NO,
+ RESIZE=NO,
+ CLOSE_CB=cmdMsgHide
+]
+(PolyDesktop)
+
+#---------------------------------------------------------------------------#
+# Dialogo Clip.                                                             #
+#---------------------------------------------------------------------------#
+txtClipXmin = TEXT[NC=5, SIZE=30x12, VALUE="0"](cmdInteger)
+txtClipXmax = TEXT[NC=5, SIZE=30x12, VALUE="0"](cmdInteger)
+txtClipYmin = TEXT[NC=5, SIZE=30x12, VALUE="0"](cmdInteger)
+txtClipYmax = TEXT[NC=5, SIZE=30x12, VALUE="0"](cmdInteger)
+
+btClipOff    = BUTTON[SIZE=30]("Off", cmdClipOff)
+btClipArea   = BUTTON[SIZE=30]("Area", cmdClipArea)
+btClipPoly   = BUTTON[SIZE=50]("Polygon", cmdClipPoly)
+btClipHide   = BUTTON[SIZE=30]("Hide", cmdMsgHide)
+
+ClipData = VBOX
+(
+ HBOX[ALIGNMENT=ACENTER]
+ (
+  LABEL[SIZE=25x9]("Xmin:"),
+  txtClipXmin,
+  FILL[SIZE=5](),
+  LABEL[SIZE=25x9]("Ymin:"),
+  txtClipYmin
+ ),
+ HBOX[ALIGNMENT=ACENTER]
+ (
+  LABEL[SIZE=25x9]("Xmax:"),
+  txtClipXmax,
+  FILL[SIZE=5](),
+  LABEL[SIZE=25x9]("Ymax:"),
+  txtClipYmax
+ )
+)
+
+ClipDeskTop = VBOX
+(
+ HBOX
+ (
+  FILL(),
+  ClipData,
+  FILL()
+ ),
+ HBOX
+ (
+  FILL(),
+  btClipOff,
+  FILL[SIZE=5](),
+  btClipArea,
+  FILL[SIZE=5](),
+  btClipPoly,
+  FILL[SIZE=5](),
+  btClipHide,
+  FILL()
+ )
+)
+
+dlgClip = DIALOG
+[
+ PARENTDIALOG="dlgMain",
+ TITLE="Clipping",
+ MAXBOX=NO,
+ CLOSE_CB=cmdMsgHide,
+ MINBOX=NO,
+ RESIZE=NO,
+ MARGIN=5x5
+]
+(ClipDeskTop)
+
+#---------------------------------------------------------------------------#
+# Dialogo Image.                                                            #
+#---------------------------------------------------------------------------#
+txtImageX   = TEXT[NC=5, SIZE=30x12, VALUE="0"](cmdInteger)
+txtImageY   = TEXT[NC=5, SIZE=30x12, VALUE="0"](cmdInteger)
+txtImageW   = TEXT[NC=5, SIZE=30x12, VALUE="0"](cmdInteger)
+txtImageH   = TEXT[NC=5, SIZE=30x12, VALUE="0"](cmdInteger)
+
+btImagePut  = BUTTON[SIZE=30]("Put", cmdImagePut)
+btImageGet  = BUTTON[SIZE=30]("Get", cmdImageGet)
+btImageHide = BUTTON[SIZE=30]("Hide", cmdMsgHide)
+
+ImageData = VBOX
+(
+ HBOX[ALIGNMENT=ACENTER]
+ (
+  LABEL[SIZE=30x9]("X:"),
+  txtImageX,
+  FILL[SIZE=5](),
+  LABEL[SIZE=30x9]("Y:"),
+  txtImageY
+ ),
+ HBOX[ALIGNMENT=ACENTER]
+ (
+  LABEL[SIZE=30x9]("Width:"),
+  txtImageW,
+  FILL[SIZE=5](),
+  LABEL[SIZE=30x9]("Height:"),
+  txtImageH
+ )
+)
+
+ImageDeskTop = VBOX
+(
+ HBOX
+ (
+  FILL(),
+  ImageData,
+  FILL()
+ ),
+ HBOX
+ (
+  FILL(),
+  btImageGet,
+  FILL[SIZE=5](),
+  btImagePut,
+  FILL[SIZE=5](),
+  btImageHide,
+  FILL()
+ )
+)
+
+dlgImage = DIALOG
+[
+ PARENTDIALOG="dlgMain",
+ TITLE="Server Image",
+ MAXBOX=NO,
+ MINBOX=NO,
+ CLOSE_CB=cmdMsgHide,
+ RESIZE=NO,
+ MARGIN=5x5
+]
+(ImageDeskTop)
+
+#---------------------------------------------------------------------------#
+# Dialogo ImageRGB.                                                            #
+#---------------------------------------------------------------------------#
+txtImageRGBX   = TEXT[NC=5, SIZE=30x12, VALUE="0"](cmdInteger)
+txtImageRGBY   = TEXT[NC=5, SIZE=30x12, VALUE="0"](cmdInteger)
+txtImageRGBW   = TEXT[NC=5, SIZE=30x12, VALUE="0"](cmdInteger)
+txtImageRGBH   = TEXT[NC=5, SIZE=30x12, VALUE="0"](cmdInteger)
+
+btImageRGBPut  = BUTTON[SIZE=30]("Put", cmdImageRGBPut)
+btImageRGBGet  = BUTTON[SIZE=30]("Get", cmdImageRGBGet)
+btImageRGBHide = BUTTON[SIZE=30]("Hide", cmdMsgHide)
+
+ImageRGBData = VBOX
+(
+ HBOX[ALIGNMENT=ACENTER]
+ (
+  LABEL[SIZE=30x9]("X:"),
+  txtImageRGBX,
+  FILL[SIZE=5](),
+  LABEL[SIZE=30x9]("Y:"),
+  txtImageRGBY
+ ),
+ HBOX[ALIGNMENT=ACENTER]
+ (
+  LABEL[SIZE=30x9]("Width:"),
+  txtImageRGBW,
+  FILL[SIZE=5](),
+  LABEL[SIZE=30x9]("Height:"),
+  txtImageRGBH
+ )
+)
+
+ImageRGBDeskTop = VBOX
+(
+ HBOX
+ (
+  FILL(),
+  ImageRGBData,
+  FILL()
+ ),
+ HBOX
+ (
+  FILL(),
+  btImageRGBGet,
+  FILL[SIZE=5](),
+  btImageRGBPut,
+  FILL[SIZE=5](),
+  btImageRGBHide,
+  FILL()
+ )
+)
+
+dlgImageRGB = DIALOG
+[
+ PARENTDIALOG="dlgMain",
+ TITLE="RGB Image",
+ MAXBOX=NO,
+ MINBOX=NO,
+ CLOSE_CB=cmdMsgHide,
+ RESIZE=NO,
+ MARGIN=5x5
+]
+(ImageRGBDeskTop)
+
+#---------------------------------------------------------------------------#
+# Dialogo About.                                                            #
+#---------------------------------------------------------------------------#
+
+btCDTest = BUTTON("Close", cmdCloseAbout)
+
+AboutDeskTop = HBOX[MARGIN=5x5, GAP=2]
+(
+ FILL(),
+ VBOX[ALIGNMENT=ACENTER](
+  LABEL("CD Test 5.3"),
+  FILL[SIZE=5](),
+  LABEL("Antonio Scuri"),
+  LABEL("Diego Nehab"),
+  FILL[SIZE=5](),
+  LABEL("Tecgraf/PUC-Rio"),
+  FILL[SIZE=5](),
+  LABEL("CD Library Version"),
+  lblVersion = LABEL(""),
+  btCDTest
+ ),
+ FILL()
+)
+
+dlgHelpAbout = DIALOG
+[
+ PARENTDIALOG="dlgMain",
+ TITLE="About",
+ MAXBOX=NO,
+ MINBOX=NO,
+ RESIZE=NO
+]
+(AboutDeskTop)
+
+
+          
\ No newline at end of file
diff --git a/test/cdtest/cdtest.rc b/test/cdtest/cdtest.rc
new file mode 100644
index 0000000..c7e3ebc
--- /dev/null
+++ b/test/cdtest/cdtest.rc
@@ -0,0 +1 @@
+CdTestIcon ICON "cdtest.ico"
diff --git a/test/cdtest/cdtest.sln b/test/cdtest/cdtest.sln
new file mode 100644
index 0000000..fb19d0c
--- /dev/null
+++ b/test/cdtest/cdtest.sln
@@ -0,0 +1,16 @@
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cdtest", "cdtest.vcproj", "{A7E49FB8-700A-45EC-9174-FB1C2C7E83C9}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{A7E49FB8-700A-45EC-9174-FB1C2C7E83C9}.Debug|Win32.ActiveCfg = Debug|Win32
+		{A7E49FB8-700A-45EC-9174-FB1C2C7E83C9}.Debug|Win32.Build.0 = Debug|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/test/cdtest/cdtest.vcproj b/test/cdtest/cdtest.vcproj
new file mode 100644
index 0000000..2323676
--- /dev/null
+++ b/test/cdtest/cdtest.vcproj
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="8.00"
+	Name="cdtest"
+	ProjectGUID="{A7E49FB8-700A-45EC-9174-FB1C2C7E83C9}"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\bin"
+			IntermediateDirectory="..\obj\cdtest"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				PreprocessorDefinitions="_DEBUG"
+				MkTypLibCompatible="true"
+				SuppressStartupBanner="true"
+				TargetEnvironment="1"
+				TypeLibraryName="..\bin/cdtest.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\include,..\..\..\iup\include"
+				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;CDTEST_WIN32;_CRT_SECURE_NO_DEPRECATE"
+				RuntimeLibrary="1"
+				PrecompiledHeaderFile="..\obj/cdtest.pch"
+				AssemblerListingLocation=""
+				ObjectFile="$(IntDir)/"
+				ProgramDataBaseFileName="..\obj/cdtest"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="1"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1046"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalOptions="/MACHINE:I386"
+				AdditionalDependencies="comctl32.lib cd.lib cdiup.lib cdgdiplus.lib iup.lib gdiplus.lib cdpdflib.lib"
+				OutputFile="..\bin/cdtest.exe"
+				LinkIncremental="2"
+				SuppressStartupBanner="true"
+				AdditionalLibraryDirectories="..\..\lib,..\..\..\iup\lib"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile="..\bin/cdtest.pdb"
+				SubSystem="2"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+			>
+			<File
+				RelativePath="Cdtest.c"
+				>
+			</File>
+			<File
+				RelativePath=".\cdtest.led"
+				>
+			</File>
+			<File
+				RelativePath="cdtest.rc"
+				>
+			</File>
+			<File
+				RelativePath="cdtest_led.c"
+				>
+			</File>
+			<File
+				RelativePath="Colorbar.c"
+				>
+			</File>
+			<File
+				RelativePath="Drivers.c"
+				>
+			</File>
+			<File
+				RelativePath="List.c"
+				>
+			</File>
+			<File
+				RelativePath="Rubber.c"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl"
+			>
+			<File
+				RelativePath="Cdtest.h"
+				>
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/test/cdtest/cdtest_led.c b/test/cdtest/cdtest_led.c
new file mode 100644
index 0000000..b48b467
--- /dev/null
+++ b/test/cdtest/cdtest_led.c
@@ -0,0 +1,1590 @@
+/* Arquivo gerado automaticamente por ledc 2.5         */
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <iup.h>
+
+static Ihandle* named[    172 ]; 
+
+static Ihandle* decl( char* name, Ihandle* elem, char* first, ...)
+{
+  char *attr, *val;
+  va_list arg;
+  va_start (arg, first);
+  attr = first;
+  while (attr)
+  {
+    val = va_arg(arg,char*);
+    IupSetAttribute( elem, attr, val );
+    attr = va_arg(arg,char*);
+  }
+  va_end (arg);
+  if(name) IupSetHandle( name, elem );
+  return elem;
+}
+
+static void image_imgLine (void)
+{
+  char map[] = {
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  -1 };
+
+  decl( "imgLine", IupImage( 18, 18, map ), 
+    "0", "BGCOLOR", 
+    "1", "0 0 0", 0 );
+}
+
+static void image_imgClip (void)
+{
+  char map[] = {
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+     0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+     0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+     0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+     0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+     0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  -1 };
+
+  decl( "imgClip", IupImage( 18, 18, map ), 
+    "0", "BGCOLOR", 
+    "1", "0 0 0", 0 );
+}
+
+static void image_imgImage (void)
+{
+  char map[] = {
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 0, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 0, 0, 0, 0,
+     0, 0, 0, 1, 2, 2, 1, 2, 2, 2, 1, 2, 2, 1, 0, 0, 0, 0,
+     0, 0, 0, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 1, 0, 0, 0, 0,
+     0, 0, 0, 1, 1, 2, 2, 2, 1, 3, 2, 2, 1, 1, 0, 0, 0, 0,
+     0, 0, 0, 0, 1, 2, 2, 2, 2, 1, 2, 2, 1, 3, 0, 0, 0, 0,
+     0, 0, 0, 0, 1, 2, 2, 2, 1, 1, 2, 2, 1, 3, 0, 0, 0, 0,
+     0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 1, 3, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 1, 2, 1, 3, 1, 2, 1, 3, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 1, 2, 2, 1, 3, 2, 1, 3, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 1, 3, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0,
+  -1 };
+
+  decl( "imgImage", IupImage( 18, 18, map ), 
+    "0", "BGCOLOR", 
+    "1", "0 0 0", 
+    "2", "255 255 255", 
+    "3", "153 153 153", 0 );
+}
+
+static void image_imgImageRGB (void)
+{
+  char map[] = {
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 0, 0, 0,
+     0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 0, 0, 0,
+     0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 0, 0, 0,
+     0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 0, 0, 0,
+     0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 0, 0, 0,
+     0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 0, 0, 0,
+     0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 0, 0, 0,
+     0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 0, 0, 0,
+     0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 0, 0, 0,
+     0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  -1 };
+
+  decl( "imgImageRGB", IupImage( 18, 18, map ), 
+    "0", "BGCOLOR", 
+    "1", "255 0 0", 
+    "2", "0 255 0", 
+    "3", "0 0 255", 0 );
+}
+
+static void image_imgBox (void)
+{
+  char map[] = {
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  -1 };
+
+  decl( "imgBox", IupImage( 18, 18, map ), 
+    "0", "BGCOLOR", 
+    "1", "0 0 0", 
+    "2", "255 255 255", 0 );
+}
+
+static void image_imgRect (void)
+{
+  char map[] = {
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+     0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+     0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+     0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+     0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+     0, 0, 1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0,
+     0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 2, 0, 0,
+     0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 2, 0, 0,
+     0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 2, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 0, 0, 2, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  -1 };
+
+  decl( "imgRect", IupImage( 18, 18, map ), 
+    "0", "BGCOLOR", 
+    "1", "0 0 0", 
+    "2", "255 255 255", 0 );
+}
+
+static void image_imgSector (void)
+{
+  char map[] = {
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 0, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0,
+     0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 0, 0,
+     0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0,
+     0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0,
+     0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+     0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+     0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+     0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  -1 };
+
+  decl( "imgSector", IupImage( 18, 18, map ), 
+    "0", "BGCOLOR", 
+    "1", "0 0 0", 
+    "2", "255 255 255", 0 );
+}
+
+static void image_imgChord (void)
+{
+  char map[] = {
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 0,
+     0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 0, 0, 0,
+     0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 0, 0,
+     0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0,
+     0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0,
+     0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+     0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+     0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+     0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+     0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  -1 };
+
+  decl( "imgChord", IupImage( 18, 18, map ), 
+    "0", "BGCOLOR", 
+    "1", "0 0 0", 
+    "2", "255 255 255", 0 );
+}
+
+static void image_imgArc (void)
+{
+  char map[] = {
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 2, 2, 2, 0, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  -1 };
+
+  decl( "imgArc", IupImage( 18, 18, map ), 
+    "0", "BGCOLOR", 
+    "1", "0 0 0", 
+    "2", "255 255 255", 0 );
+}
+
+static void image_imgText (void)
+{
+  char map[] = {
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 1, 0, 0, 0, 0, 0,
+     0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 1, 0, 0, 0, 0, 0,
+     0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 1, 1, 1, 1, 0, 0,
+     0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 1, 0, 0, 0, 1, 0,
+     0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 1, 0, 0, 0, 1, 0,
+     0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 1, 0, 0, 0, 1, 0,
+     0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 1, 0, 0, 0, 1, 0,
+     0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 1, 1, 1, 1, 1, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  -1 };
+
+  decl( "imgText", IupImage( 18, 18, map ), 
+    "0", "BGCOLOR", 
+    "1", "255 255 255", 
+    "2", "0 0 0", 0 );
+}
+
+static void image_imgPoly (void)
+{
+  char map[] = {
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0,
+     0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+     0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+     0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+     0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
+     0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0,
+     0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,
+     0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  -1 };
+
+  decl( "imgPoly", IupImage( 18, 18, map ), 
+    "0", "BGCOLOR", 
+    "1", "0 0 0", 0 );
+}
+
+static void image_imgMark (void)
+{
+  char map[] = {
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+     0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+     0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  -1 };
+
+  decl( "imgMark", IupImage( 18, 18, map ), 
+    "0", "BGCOLOR", 
+    "1", "0 0 0", 0 );
+}
+
+static void image_imgPixel (void)
+{
+  char map[] = {
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0,
+     0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 1, 1, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  -1 };
+
+  decl( "imgPixel", IupImage( 18, 18, map ), 
+    "0", "BGCOLOR", 
+    "1", "0 0 0", 
+    "2", "255 255 255", 0 );
+}
+
+
+void cdtest_loadled (void)
+{
+  image_imgLine ();
+  image_imgClip ();
+  image_imgImage ();
+  image_imgImageRGB ();
+  image_imgBox ();
+  image_imgRect ();
+  image_imgSector ();
+  image_imgChord ();
+  image_imgArc ();
+  image_imgText ();
+  image_imgPoly ();
+  image_imgMark ();
+  image_imgPixel ();
+  named[0] = decl( "mnOpen", IupMenu(
+    IupItem( "MF...", "cmdPlayMF" ),
+    named[1] = decl( "itPlayCGM", IupItem( "CGM...", "cmdPlayCGM" ), 
+      "ACTIVE", "NO", 0 ),
+    named[2] = decl( "itPlayEMF", IupItem( "EMF...", "cmdPlayEMF" ), 
+      "ACTIVE", "NO", 0 ),
+    named[3] = decl( "itPlayWMF", IupItem( "WMF...", "cmdPlayWMF" ), 
+      "ACTIVE", "NO", 0 ),
+  NULL), 0 );
+  named[4] = decl( "mnSave", IupMenu(
+    IupItem( "MF...", "cmdMF" ),
+    named[5] = decl( "itPDF", IupItem( "PDF...", "cmdPDF" ), 
+      "ACTIVE", "NO", 0 ),
+    named[6] = decl( "itPS", IupItem( "PS...", "cmdPS" ), 
+      "ACTIVE", "NO", 0 ),
+    named[7] = decl( "itEPS", IupItem( "EPS...", "cmdEPS" ), 
+      "ACTIVE", "NO", 0 ),
+    named[8] = decl( "itCGMt", IupItem( "CGMt...", "cmdCGMt" ), 
+      "ACTIVE", "NO", 0 ),
+    named[9] = decl( "itCGMb", IupItem( "CGMb...", "cmdCGMb" ), 
+      "ACTIVE", "NO", 0 ),
+    named[10] = decl( "itDGN", IupItem( "DGN...", "cmdDGN" ), 
+      "ACTIVE", "NO", 0 ),
+    named[11] = decl( "itDXF", IupItem( "DXF...", "cmdDXF" ), 
+      "ACTIVE", "NO", 0 ),
+    named[12] = decl( "itEMF", IupItem( "EMF...", "cmdEMF" ), 
+      "ACTIVE", "NO", 0 ),
+    named[13] = decl( "itWMF", IupItem( "WMF...", "cmdWMF" ), 
+      "ACTIVE", "NO", 0 ),
+  NULL), 0 );
+  named[14] = decl( "mnFile", IupMenu(
+    decl( 0, IupSubmenu( "Open",
+      named[0] /* mnOpen */
+    ), 
+      "KEY", "K_O", 0 ),
+    IupSeparator(),
+    decl( 0, IupSubmenu( "Save",
+      named[4] /* mnSave */
+    ), 
+      "KEY", "K_S", 0 ),
+    IupSeparator(),
+    named[15] = decl( "itPrint", IupItem( "Print...", "cmdPrint" ), 
+      "KEY", "K_P", 0 ),
+    IupSeparator(),
+    decl( 0, IupItem( "Exit", "cmdFileExit" ), 
+      "KEY", "K_x", 0 ),
+  NULL), 0 );
+  named[16] = decl( "mnEdit", IupMenu(
+    named[17] = decl( "itEditUndo", IupItem( "Undo", "cmdEditUndo" ), 0 ),
+    IupSeparator(),
+    named[18] = decl( "itClipBoard", IupItem( "Copy as EMF/WMF", "cmdClipBoard" ), 
+      "ACTIVE", "NO", 0 ),
+    named[19] = decl( "itClipBoardBitmap", IupItem( "Copy as Bitmap", "cmdClipBoardBitmap" ), 
+      "ACTIVE", "NO", 0 ),
+    named[20] = decl( "itClipBoardMetafile", IupItem( "Copy as CD Metafile", "cmdClipBoardMetafile" ), 
+      "ACTIVE", "NO", 0 ),
+    named[21] = decl( "itClipBoardPaste", IupItem( "Paste", "cmdClipBoardPaste" ), 
+      "ACTIVE", "NO", 0 ),
+    IupSeparator(),
+    IupItem( "Clear", "cmdEditClear" ),
+    IupSeparator(),
+    IupItem( "Options...", "cmdOptions" ),
+  NULL), 0 );
+  named[22] = decl( "mnPrimitives", IupMenu(
+    IupItem( "Pixel...", "cmdPixel" ),
+    IupItem( "Mark...", "cmdMark" ),
+    IupItem( "Line...", "cmdLine" ),
+    IupItem( "Polygon...", "cmdPoly" ),
+    IupItem( "Rect...", "cmdRect" ),
+    IupItem( "Box...", "cmdBox" ),
+    IupItem( "Arc...", "cmdArc" ),
+    IupItem( "Sector...", "cmdSector" ),
+    IupItem( "Chord...", "cmdChord" ),
+    IupItem( "Text...", "cmdText" ),
+    IupSeparator(),
+    IupItem( "Server Image...", "cmdImage" ),
+    IupItem( "RGB Image...", "cmdImageRGB" ),
+  NULL), 0 );
+  named[23] = decl( "mnDraw", IupMenu(
+    decl( 0, IupSubmenu( "Primitives",
+      named[22] /* mnPrimitives */
+    ), 
+      "KEY", "K_P", 0 ),
+    IupSeparator(),
+    IupItem( "Clipping...", "cmdClip" ),
+    IupItem( "Attributes...", "cmdAttributes" ),
+    IupSeparator(),
+    named[24] = decl( "itWDCanvas", IupItem( "Show WD Canvas", "cmdWDCanvas" ), 0 ),
+    named[25] = decl( "itPICCanvas", IupItem( "Show Picture Canvas", "cmdPICCanvas" ), 0 ),
+  NULL), 
+    "ISMENU", "YES", 0 );
+  named[26] = decl( "mnHelp", IupMenu(
+    IupItem( "About...", "cmdHelpAbout" ),
+  NULL), 0 );
+  named[27] = decl( "mnMain", IupMenu(
+    decl( 0, IupSubmenu( "File",
+      named[14] /* mnFile */
+    ), 
+      "KEY", "K_mF", 0 ),
+    decl( 0, IupSubmenu( "Edit",
+      named[16] /* mnEdit */
+    ), 
+      "KEY", "K_mE", 0 ),
+    decl( 0, IupSubmenu( "Draw",
+      named[23] /* mnDraw */
+    ), 
+      "KEY", "K_mD", 0 ),
+    decl( 0, IupSubmenu( "Help",
+      named[26] /* mnHelp */
+    ), 
+      "KEY", "K_mH", 0 ),
+  NULL), 0 );
+  named[28] = decl( "lbStatusLine", IupLabel( "Esta eh a barra de status do CDTest." ), 
+    "EXPAND", "HORIZONTAL", 0 );
+  named[29] = decl( "btLine", IupButton( "", "cmdLine" ), 
+    "IMAGE", "imgLine", 
+    "TIP", "Line", 0 );
+  named[30] = decl( "btBox", IupButton( "", "cmdBox" ), 
+    "IMAGE", "imgBox", 
+    "TIP", "Box", 0 );
+  named[31] = decl( "btRect", IupButton( "", "cmdRect" ), 
+    "IMAGE", "imgRect", 
+    "TIP", "Rect", 0 );
+  named[32] = decl( "btArc", IupButton( "", "cmdArc" ), 
+    "IMAGE", "imgArc", 
+    "TIP", "Arc", 0 );
+  named[33] = decl( "btSector", IupButton( "", "cmdSector" ), 
+    "IMAGE", "imgSector", 
+    "TIP", "Sector", 0 );
+  named[34] = decl( "btChord", IupButton( "", "cmdChord" ), 
+    "IMAGE", "imgChord", 
+    "TIP", "Chord", 0 );
+  named[35] = decl( "btPixel", IupButton( "", "cmdPixel" ), 
+    "IMAGE", "imgPixel", 
+    "TIP", "Pixel", 0 );
+  named[36] = decl( "btMark", IupButton( "", "cmdMark" ), 
+    "IMAGE", "imgMark", 
+    "TIP", "Mark", 0 );
+  named[37] = decl( "btText", IupButton( "", "cmdText" ), 
+    "IMAGE", "imgText", 
+    "TIP", "Text", 0 );
+  named[38] = decl( "btPoly", IupButton( "", "cmdPoly" ), 
+    "IMAGE", "imgPoly", 
+    "TIP", "Polygon", 0 );
+  named[39] = decl( "btImageRGB", IupButton( "", "cmdImageRGB" ), 
+    "IMAGE", "imgImageRGB", 
+    "TIP", "RGB Image", 0 );
+  named[40] = decl( "btImage", IupButton( "", "cmdImage" ), 
+    "IMAGE", "imgImage", 
+    "TIP", "Server Image", 0 );
+  named[41] = decl( "btClip", IupButton( "", "cmdClip" ), 
+    "IMAGE", "imgClip", 
+    "TIP", "Clipping Area", 0 );
+  named[42] = decl( "btCurPrim", IupButton( "", "cmdShowDialog" ), 
+    "IMAGE", "imgLine", 
+    "TIP", "Show primitive dialog", 0 );
+  named[43] = decl( "lbMousePos", IupLabel( "(    ,    )" ), 
+    "SIZE", "90", 0 );
+  named[44] = decl( "PrimBar", IupVbox(
+    named[42] /* btCurPrim */,
+    decl( 0, IupFill(), 
+      "SIZE", "20", 0 ),
+    named[35] /* btPixel */,
+    named[36] /* btMark */,
+    named[29] /* btLine */,
+    named[38] /* btPoly */,
+    named[31] /* btRect */,
+    named[30] /* btBox */,
+    named[32] /* btArc */,
+    named[33] /* btSector */,
+    named[34] /* btChord */,
+    named[37] /* btText */,
+    decl( 0, IupFill(), 
+      "SIZE", "5", 0 ),
+    named[40] /* btImage */,
+    named[39] /* btImageRGB */,
+    decl( 0, IupFill(), 
+      "SIZE", "5", 0 ),
+    named[41] /* btClip */,
+    decl( 0, IupFill(), 
+      "SIZE", "30", 0 ),
+  NULL), 
+    "GAP", "2", 0 );
+  named[45] = decl( "cnvColorBar", IupCanvas( "cmdColorBarRepaint" ), 
+    "BUTTON_CB", "cmdColorBarButtonCB", 
+    "RESIZE_CB", "cmdColorBarResizeCB", 
+    "SIZE", "220x12", 
+    "BORDER", "NO", 
+    "EXPAND", "NO", 0 );
+  named[46] = decl( "cnvMain", IupCanvas( "cmdRepaint" ), 
+    "MOTION_CB", "cmdMotionCB", 
+    "BUTTON_CB", "cmdButtonCB", 
+    "RESIZE_CB", "cmdResizeCB", 0 );
+  named[47] = decl( "DeskTop", IupVbox(
+    decl( 0, IupFill(), 
+      "SIZE", "5", 0 ),
+    IupHbox(
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      named[44] /* PrimBar */,
+      decl( 0, IupFill(), 
+        "SIZE", "2", 0 ),
+      IupVbox(
+        decl( 0, IupFill(), 
+          "SIZE", "2", 0 ),
+        named[43] /* lbMousePos */,
+        decl( 0, IupFill(), 
+          "SIZE", "5", 0 ),
+        named[46] /* cnvMain */,
+        decl( 0, IupFill(), 
+          "SIZE", "2", 0 ),
+        named[45] /* cnvColorBar */,
+        decl( 0, IupFill(), 
+          "SIZE", "5", 0 ),
+        named[28] /* lbStatusLine */,
+      NULL),
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+    NULL),
+    decl( 0, IupFill(), 
+      "SIZE", "5", 0 ),
+  NULL), 0 );
+  named[48] = decl( "dlgMain", IupDialog(
+    named[47] /* DeskTop */
+  ), 
+    "TITLE", "CD Test 5.3", 
+    "MENU", "mnMain", 
+    "ICON", "CdTestIcon", 
+    "K_cZ", "cmdEditUndo", 
+    "GETFOCUS_CB", "cmdGetFocusCB", 
+    "KILLFOCUS_CB", "cmdKillFocusCB", 
+    "CLOSE_CB", "cmdFileExit", 0 );
+  named[49] = decl( "cnvWDCanvas", IupCanvas( "cmdWDRepaint" ), 
+    "BORDER", "NO", 0 );
+  named[50] = decl( "dlgWDCanvas", IupDialog(
+    named[49] /* cnvWDCanvas */
+  ), 
+    "TITLE", "WD Canvas", 
+    "CLISE_CB", "cmdCloseWD", 
+    "SIZE", "200x200", 
+    "PARENTDIALOG", "dlgMain", 
+    "GAP", "5x5", 0 );
+  named[51] = decl( "cnvPICCanvas", IupCanvas( "cmdPICRepaint" ), 
+    "BORDER", "NO", 0 );
+  named[52] = decl( "dlgPICCanvas", IupDialog(
+    named[51] /* cnvPICCanvas */
+  ), 
+    "TITLE", "PIC Canvas", 
+    "CLISE_CB", "cmdClosePIC", 
+    "SIZE", "200x200", 
+    "PARENTDIALOG", "dlgMain", 
+    "GAP", "5x5", 0 );
+  named[53] = decl( "btOptionsHide", IupButton( "Hide", "cmdOptionsHide" ), 
+    "SIZE", "30", 0 );
+  named[54] = decl( "tgSimulate", IupToggle( "Simulate", "cmdSimulate" ), 
+    "VALUE", "OFF", 
+    "SIZE", "55", 0 );
+  named[55] = decl( "tgStretchPlay", IupToggle( "Stretch Play", "cmdStretchPlay" ), 
+    "VALUE", "OFF", 
+    "SIZE", "70", 0 );
+  named[56] = decl( "tgNoBuffering", IupToggle( "No buffering", "cmdNoBuffering" ), 
+    "VALUE", "ON", 0 );
+  named[57] = decl( "tgImageBuffer", IupToggle( "CD_DBUFFER", "cmdImageBuffer" ), 0 );
+  named[58] = decl( "tgRGBBuffer", IupToggle( "CD_DBUFFERRGB", "cmdRGBBuffer" ), 0 );
+  named[59] = decl( "rdBuffering", IupRadio(
+    IupVbox(
+      named[56] /* tgNoBuffering */,
+      named[57] /* tgImageBuffer */,
+      named[58] /* tgRGBBuffer */,
+    NULL)
+  ), 0 );
+  named[60] = decl( "OptionsDesktop", IupVbox(
+    decl( 0, IupVbox(
+      decl( 0, IupFrame(
+        named[59] /* rdBuffering */
+      ), 
+        "TITLE", "Buffering:", 
+        "MARGIN", "5x5", 
+        "SIZE", "80", 0 ),
+      decl( 0, IupFill(), 
+        "SIZE", "10", 0 ),
+      named[54] /* tgSimulate */,
+      named[55] /* tgStretchPlay */,
+      decl( 0, IupFill(), 
+        "SIZE", "10", 0 ),
+      named[53] /* btOptionsHide */,
+      decl( 0, IupFill(), 
+        "SIZE", "2", 0 ),
+    NULL), 
+      "GAP", "2", 0 ),
+  NULL), 0 );
+  named[61] = decl( "dlgOptions", IupDialog(
+    named[60] /* OptionsDesktop */
+  ), 
+    "TITLE", "Options", 
+    "PARENTDIALOG", "dlgMain", 
+    "MAXBOX", "NO", 
+    "MINBOX", "NO", 
+    "RESIZE", "NO", 
+    "MARGIN", "5x2", 0 );
+  named[62] = decl( "lstTextAlignment", IupList( "cmdTextAlignment" ), 
+    "1", "CD_NORTH", 
+    "2", "CD_SOUTH", 
+    "3", "CD_EAST", 
+    "4", "CD_WEST", 
+    "5", "CD_NORTH_EAST", 
+    "6", "CD_NORTH_WEST", 
+    "7", "CD_SOUTH_EAST", 
+    "8", "CD_SOUTH_WEST", 
+    "9", "CD_CENTER", 
+    "10", "CD_BASE_LEFT", 
+    "11", "CD_BASE_CENTER", 
+    "12", "CD_BASE_RIGHT", 
+    "DROPDOWN", "YES", 
+    "VALUE", "10", 
+    "SIZE", "89", 0 );
+  named[63] = decl( "txtMarkSize", IupText( "cmdInteger" ), 
+    "NC", "4", 
+    "SIZE", "20x12", 
+    "VALUE", "10", 0 );
+  named[64] = decl( "lstMarkType", IupList( "cmdMarkType" ), 
+    "1", "CD_PLUS", 
+    "2", "CD_STAR", 
+    "3", "CD_CIRCLE", 
+    "4", "CD_X", 
+    "5", "CD_BOX", 
+    "6", "CD_DIAMOND", 
+    "7", "CD_HOLLOW_CIRCLE", 
+    "8", "CD_HOLLOW_BOX", 
+    "9", "CD_HOLLOW_DIAMOND", 
+    "DROPDOWN", "YES", 
+    "VALUE", "2", 
+    "SIZE", "80", 0 );
+  named[65] = decl( "lstWriteMode", IupList( "cmdWriteMode" ), 
+    "1", "CD_REPLACE", 
+    "2", "CD_XOR", 
+    "3", "CD_NOT_XOR", 
+    "VALUE", "1", 
+    "DROPDOWN", "YES", 
+    "SIZE", "80", 0 );
+  named[66] = decl( "lstFontTypeFace", IupList( "cmdFontTypeFace" ), 
+    "1", "CD_SYSTEM", 
+    "2", "CD_COURIER", 
+    "3", "CD_TIMES_ROMAN", 
+    "4", "CD_HELVETICA", 
+    "VALUE", "1", 
+    "DROPDOWN", "YES", 
+    "SIZE", "80", 0 );
+  named[67] = decl( "lstLineCap", IupList( "cmdLineCap" ), 
+    "1", "CD_CAPFLAT", 
+    "2", "CD_CAPSQUARE", 
+    "3", "CD_CAPROUND", 
+    "VALUE", "1", 
+    "DROPDOWN", "YES", 
+    "SIZE", "80", 0 );
+  named[68] = decl( "lstLineJoin", IupList( "cmdLineJoin" ), 
+    "1", "CD_BEVEL", 
+    "2", "CD_MITER", 
+    "3", "CD_ROUND", 
+    "VALUE", "1", 
+    "DROPDOWN", "YES", 
+    "SIZE", "80", 0 );
+  named[69] = decl( "lstFillMode", IupList( "cmdFillMode" ), 
+    "1", "CD_EVENODD", 
+    "2", "CD_WINDING", 
+    "VALUE", "1", 
+    "DROPDOWN", "YES", 
+    "SIZE", "80", 0 );
+  named[70] = decl( "lstFontStyle", IupList( "cmdFontStyle" ), 
+    "1", "CD_PLAIN", 
+    "2", "CD_BOLD", 
+    "3", "CD_ITALIC", 
+    "4", "CD_BOLD_ITALIC", 
+    "VALUE", "1", 
+    "DROPDOWN", "YES", 
+    "SIZE", "80", 0 );
+  named[71] = decl( "txtLineWidth", IupText( "cmdInteger" ), 
+    "SIZE", "30", 
+    "NC", "3", 
+    "VALUE", "1", 0 );
+  named[72] = decl( "txtFontSize", IupText( "cmdInteger" ), 
+    "SIZE", "30", 
+    "NC", "3", 
+    "VALUE", "12", 0 );
+  named[73] = decl( "txtTextOrientation", IupText( "cmdInteger" ), 
+    "SIZE", "30", 
+    "NC", "3", 
+    "VALUE", "0", 0 );
+  named[74] = decl( "lstLineStyle", IupList( "cmdLineStyle" ), 
+    "1", "CD_CONTINUOUS", 
+    "2", "CD_DASHED", 
+    "3", "CD_DOTTED", 
+    "4", "CD_DASH_DOT", 
+    "5", "CD_DASH_DOT_DOT", 
+    "6", "CD_CUSTOM", 
+    "VALUE", "1", 
+    "DROPDOWN", "YES", 
+    "SIZE", "80", 0 );
+  named[75] = decl( "tgSolid", IupToggle( "CD_SOLID", "cmdSolid" ), 
+    "VALUE", "ON", 0 );
+  named[76] = decl( "tgHatch", IupToggle( "CD_HATCH", "cmdHatch" ), 0 );
+  named[77] = decl( "tgStipple", IupToggle( "CD_STIPPLE", "cmdStipple" ), 0 );
+  named[78] = decl( "tgPattern", IupToggle( "CD_PATTERN", "cmdPattern" ), 0 );
+  named[79] = decl( "lstOpacity", IupList( "cmdOpacity" ), 
+    "1", "CD_OPAQUE", 
+    "2", "CD_TRANSPARENT", 
+    "VALUE", "2", 
+    "DROPDOWN", "YES", 
+    "SIZE", "80", 
+    "ACTIVE", "YES", 0 );
+  named[80] = decl( "lstHatchStyle", IupList( "cmdHatchStyle" ), 
+    "1", "CD_HORIZONTAL", 
+    "2", "CD_VERTICAL", 
+    "3", "CD_FDIAGONAL", 
+    "4", "CD_BDIAGONAL", 
+    "5", "CD_CROSS", 
+    "6", "CD_DIAGCROSS", 
+    "VALUE", "1", 
+    "DROPDOWN", "YES", 
+    "SIZE", "80", 
+    "ACTIVE", "YES", 0 );
+  named[81] = decl( "btAttributesHide", IupButton( "Hide", "cmdAttributesHide" ), 
+    "SIZE", "30", 0 );
+  named[82] = decl( "rdInteriorStyle", IupRadio(
+    IupVbox(
+      named[75] /* tgSolid */,
+      named[76] /* tgHatch */,
+      named[77] /* tgStipple */,
+      named[78] /* tgPattern */,
+    NULL)
+  ), 0 );
+  named[83] = decl( "AttributesDesktop", IupVbox(
+    IupHbox(
+      decl( 0, IupVbox(
+        IupLabel( "Write Mode:" ),
+        named[65] /* lstWriteMode */,
+        decl( 0, IupFill(), 
+          "SIZE", "4", 0 ),
+        decl( 0, IupFrame(
+          IupVbox(
+            IupLabel( "Back Opacity:" ),
+            named[79] /* lstOpacity */,
+            decl( 0, IupFill(), 
+              "SIZE", "2", 0 ),
+            IupLabel( "Fill Mode:" ),
+            named[69] /* lstFillMode */,
+            decl( 0, IupFill(), 
+              "SIZE", "2", 0 ),
+            decl( 0, IupFrame(
+              named[82] /* rdInteriorStyle */
+            ), 
+              "TITLE", "Interior Style:", 
+              "MARGIN", "5x5", 
+              "SIZE", "80", 0 ),
+            decl( 0, IupFill(), 
+              "SIZE", "2", 0 ),
+            IupLabel( "Hatch Style:" ),
+            named[80] /* lstHatchStyle */,
+          NULL)
+        ), 
+          "TITLE", "Fill Attributes", 
+          "MARGIN", "5x5", 0 ),
+        decl( 0, IupFill(), 
+          "SIZE", "10", 0 ),
+        decl( 0, IupFrame(
+          IupVbox(
+            IupLabel( "Mark Type:" ),
+            named[64] /* lstMarkType */,
+            decl( 0, IupFill(), 
+              "SIZE", "2", 0 ),
+            IupLabel( "Mark Size:" ),
+            named[63] /* txtMarkSize */,
+          NULL)
+        ), 
+          "TITLE", "Mark Attributes", 
+          "MARGIN", "5x5", 0 ),
+        decl( 0, IupFill(), 
+          "SIZE", "10", 0 ),
+        named[81] /* btAttributesHide */,
+      NULL), 
+        "GAP", "2", 0 ),
+      decl( 0, IupVbox(
+        decl( 0, IupFrame(
+          IupVbox(
+            IupLabel( "Font Typeface:" ),
+            named[66] /* lstFontTypeFace */,
+            decl( 0, IupFill(), 
+              "SIZE", "2", 0 ),
+            IupLabel( "Font Style:" ),
+            named[70] /* lstFontStyle */,
+            decl( 0, IupFill(), 
+              "SIZE", "2", 0 ),
+            IupLabel( "Font Size:" ),
+            named[72] /* txtFontSize */,
+            decl( 0, IupFill(), 
+              "SIZE", "2", 0 ),
+            decl( 0, IupLabel( "Text Alignment:" ), 
+              "SIZE", "x9", 0 ),
+            named[62] /* lstTextAlignment */,
+            decl( 0, IupFill(), 
+              "SIZE", "2", 0 ),
+            decl( 0, IupLabel( "Text Orientation:" ), 
+              "SIZE", "x9", 0 ),
+            named[73] /* txtTextOrientation */,
+          NULL)
+        ), 
+          "TITLE", "Text Attributes", 
+          "MARGIN", "5x5", 0 ),
+        decl( 0, IupFill(), 
+          "SIZE", "10", 0 ),
+        decl( 0, IupFrame(
+          IupVbox(
+            IupLabel( "Line Style:" ),
+            named[74] /* lstLineStyle */,
+            decl( 0, IupFill(), 
+              "SIZE", "2", 0 ),
+            IupLabel( "Line Width:" ),
+            named[71] /* txtLineWidth */,
+            decl( 0, IupFill(), 
+              "SIZE", "2", 0 ),
+            IupLabel( "Line Cap:" ),
+            named[67] /* lstLineCap */,
+            decl( 0, IupFill(), 
+              "SIZE", "2", 0 ),
+            IupLabel( "Line Join:" ),
+            named[68] /* lstLineJoin */,
+          NULL)
+        ), 
+          "TITLE", "Line Attributes", 
+          "MARGIN", "5x5", 0 ),
+      NULL), 
+        "GAP", "2", 0 ),
+    NULL),
+  NULL), 0 );
+  named[84] = decl( "dlgAttributes", IupDialog(
+    named[83] /* AttributesDesktop */
+  ), 
+    "TITLE", "Attributes", 
+    "PARENTDIALOG", "dlgMain", 
+    "MAXBOX", "NO", 
+    "MINBOX", "NO", 
+    "RESIZE", "NO", 
+    "CLOSE_CB", "cmdAttributesHide", 
+    "MARGIN", "5x2", 0 );
+  named[85] = decl( "txtLBX1", IupText( "cmdInteger" ), 
+    "NC", "8", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[86] = decl( "txtLBX2", IupText( "cmdInteger" ), 
+    "NC", "8", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[87] = decl( "txtLBY1", IupText( "cmdInteger" ), 
+    "NC", "8", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[88] = decl( "txtLBY2", IupText( "cmdInteger" ), 
+    "NC", "8", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[89] = decl( "btLBDraw", IupButton( "Draw", "cmdDraw" ), 
+    "SIZE", "30", 0 );
+  named[90] = decl( "btLBHide", IupButton( "Hide", "cmdMsgHide" ), 
+    "SIZE", "30", 0 );
+  named[91] = decl( "LBData", IupVbox(
+    decl( 0, IupHbox(
+      decl( 0, IupLabel( "X1:" ), 
+        "SIZE", "15x9", 0 ),
+      named[85] /* txtLBX1 */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      decl( 0, IupLabel( "Y1:" ), 
+        "SIZE", "15x9", 0 ),
+      named[87] /* txtLBY1 */,
+    NULL), 
+      "ALIGNMENT", "ACENTER", 0 ),
+    decl( 0, IupHbox(
+      decl( 0, IupLabel( "X2:" ), 
+        "SIZE", "15x9", 0 ),
+      named[86] /* txtLBX2 */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      decl( 0, IupLabel( "Y2:" ), 
+        "SIZE", "15x9", 0 ),
+      named[88] /* txtLBY2 */,
+    NULL), 
+      "ALIGNMENT", "ACENTER", 0 ),
+  NULL), 0 );
+  named[92] = decl( "LBDeskTop", IupVbox(
+    IupHbox(
+      IupFill(),
+      named[91] /* LBData */,
+      IupFill(),
+    NULL),
+    IupHbox(
+      IupFill(),
+      named[89] /* btLBDraw */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      named[90] /* btLBHide */,
+      IupFill(),
+    NULL),
+  NULL), 0 );
+  named[93] = decl( "dlgLB", IupDialog(
+    named[92] /* LBDeskTop */
+  ), 
+    "TITLE", "Line Parameters", 
+    "PARENTDIALOG", "dlgMain", 
+    "MAXBOX", "NO", 
+    "MINBOX", "NO", 
+    "RESIZE", "NO", 
+    "CLOSE_CB", "cmdMsgHide", 
+    "MARGIN", "5x5", 0 );
+  named[94] = decl( "txtASXC", IupText( "cmdInteger" ), 
+    "NC", "4", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[95] = decl( "txtASYC", IupText( "cmdInteger" ), 
+    "NC", "4", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[96] = decl( "txtASW", IupText( "cmdInteger" ), 
+    "NC", "4", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[97] = decl( "txtASH", IupText( "cmdInteger" ), 
+    "NC", "4", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[98] = decl( "txtASAngle1", IupText( "cmdReal" ), 
+    "NC", "10", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[99] = decl( "txtASAngle2", IupText( "cmdReal" ), 
+    "NC", "10", 
+    "SIZE", "30x12", 
+    "VALUE", "360", 0 );
+  named[100] = decl( "btASDraw", IupButton( "Draw", "cmdDraw" ), 
+    "SIZE", "30", 0 );
+  named[101] = decl( "btASHide", IupButton( "Hide", "cmdMsgHide" ), 
+    "SIZE", "30", 0 );
+  named[102] = decl( "ASData", IupVbox(
+    decl( 0, IupHbox(
+      decl( 0, IupLabel( "Xc:" ), 
+        "SIZE", "30x9", 0 ),
+      named[94] /* txtASXC */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      decl( 0, IupLabel( "Yc:" ), 
+        "SIZE", "30x9", 0 ),
+      named[95] /* txtASYC */,
+    NULL), 
+      "ALIGNMENT", "ACENTER", 0 ),
+    decl( 0, IupHbox(
+      decl( 0, IupLabel( "W:" ), 
+        "SIZE", "30x9", 0 ),
+      named[96] /* txtASW */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      decl( 0, IupLabel( "H:" ), 
+        "SIZE", "30x9", 0 ),
+      named[97] /* txtASH */,
+    NULL), 
+      "ALIGNMENT", "ACENTER", 0 ),
+    decl( 0, IupHbox(
+      decl( 0, IupLabel( "Angle1:" ), 
+        "SIZE", "30x9", 0 ),
+      named[98] /* txtASAngle1 */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      decl( 0, IupLabel( "Angle2:" ), 
+        "SIZE", "30x9", 0 ),
+      named[99] /* txtASAngle2 */,
+    NULL), 
+      "ALIGNMENT", "ACENTER", 0 ),
+  NULL), 0 );
+  named[103] = decl( "ASDeskTop", IupVbox(
+    IupHbox(
+      IupFill(),
+      named[102] /* ASData */,
+      IupFill(),
+    NULL),
+    IupHbox(
+      IupFill(),
+      named[100] /* btASDraw */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      named[101] /* btASHide */,
+      IupFill(),
+    NULL),
+  NULL), 0 );
+  named[104] = decl( "dlgAS", IupDialog(
+    named[103] /* ASDeskTop */
+  ), 
+    "PARENTDIALOG", "dlgMain", 
+    "TITLE", "Arc Parameters", 
+    "MAXBOX", "NO", 
+    "MINBOX", "NO", 
+    "RESIZE", "NO", 
+    "CLOSE_CB", "cmdMsgHide", 
+    "MARGIN", "5x5", 0 );
+  named[105] = decl( "txtPixelX", IupText( "cmdInteger" ), 
+    "NC", "5", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[106] = decl( "txtPixelY", IupText( "cmdInteger" ), 
+    "NC", "5", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[107] = decl( "btPixelDraw", IupButton( "Draw", "cmdDraw" ), 
+    "SIZE", "30", 0 );
+  named[108] = decl( "btPixelHide", IupButton( "Hide", "cmdMsgHide" ), 
+    "SIZE", "30", 0 );
+  named[109] = decl( "PixelData", IupVbox(
+    decl( 0, IupHbox(
+      decl( 0, IupLabel( "X:" ), 
+        "SIZE", "10x9", 0 ),
+      named[105] /* txtPixelX */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      decl( 0, IupLabel( "Y:" ), 
+        "SIZE", "10x9", 0 ),
+      named[106] /* txtPixelY */,
+    NULL), 
+      "ALIGNMENT", "ACENTER", 0 ),
+  NULL), 0 );
+  named[110] = decl( "PixelDeskTop", IupVbox(
+    IupHbox(
+      IupFill(),
+      named[109] /* PixelData */,
+      IupFill(),
+    NULL),
+    IupHbox(
+      IupFill(),
+      named[107] /* btPixelDraw */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      named[108] /* btPixelHide */,
+      IupFill(),
+    NULL),
+  NULL), 0 );
+  named[111] = decl( "dlgPixel", IupDialog(
+    named[110] /* PixelDeskTop */
+  ), 
+    "PARENTDIALOG", "dlgMain", 
+    "TITLE", "Pixel Parameters", 
+    "MAXBOX", "NO", 
+    "MINBOX", "NO", 
+    "RESIZE", "NO", 
+    "CLOSE_CB", "cmdMsgHide", 
+    "MARGIN", "5x5", 0 );
+  named[112] = decl( "txtMarkX", IupText( "cmdInteger" ), 
+    "NC", "5", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[113] = decl( "txtMarkY", IupText( "cmdInteger" ), 
+    "NC", "5", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[114] = decl( "btMarkDraw", IupButton( "Draw", "cmdDraw" ), 
+    "SIZE", "30", 0 );
+  named[115] = decl( "btMarkHide", IupButton( "Hide", "cmdMsgHide" ), 
+    "SIZE", "30", 0 );
+  named[116] = decl( "MarkData", IupVbox(
+    decl( 0, IupHbox(
+      IupFill(),
+      decl( 0, IupLabel( "X:" ), 
+        "SIZE", "10x9", 0 ),
+      named[112] /* txtMarkX */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      decl( 0, IupLabel( "Y:" ), 
+        "SIZE", "10x9", 0 ),
+      named[113] /* txtMarkY */,
+      IupFill(),
+    NULL), 
+      "ALIGNMENT", "ACENTER", 0 ),
+  NULL), 0 );
+  named[117] = decl( "MarkDeskTop", IupVbox(
+    IupHbox(
+      IupFill(),
+      named[116] /* MarkData */,
+      IupFill(),
+    NULL),
+    IupHbox(
+      IupFill(),
+      named[114] /* btMarkDraw */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      named[115] /* btMarkHide */,
+      IupFill(),
+    NULL),
+  NULL), 0 );
+  named[118] = decl( "dlgMark", IupDialog(
+    named[117] /* MarkDeskTop */
+  ), 
+    "PARENTDIALOG", "dlgMain", 
+    "TITLE", "Mark Parameters", 
+    "MAXBOX", "NO", 
+    "MINBOX", "NO", 
+    "RESIZE", "NO", 
+    "CLOSE_CB", "cmdMsgHide", 
+    "MARGIN", "5x5", 0 );
+  named[119] = decl( "txtTextX", IupText( "cmdInteger" ), 
+    "NC", "5", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[120] = decl( "txtTextY", IupText( "cmdInteger" ), 
+    "NC", "5", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[121] = decl( "txtTextS", IupText( "cmdString" ), 
+    "NC", "100", 
+    "SIZE", "89x12", 
+    "VALUE", "Text", 0 );
+  named[122] = decl( "btTextDraw", IupButton( "Draw", "cmdDraw" ), 
+    "SIZE", "30", 0 );
+  named[123] = decl( "btTextHide", IupButton( "Hide", "cmdMsgHide" ), 
+    "SIZE", "30", 0 );
+  named[124] = decl( "TextData", IupVbox(
+    decl( 0, IupHbox(
+      decl( 0, IupLabel( "X:" ), 
+        "SIZE", "10x9", 0 ),
+      named[119] /* txtTextX */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      decl( 0, IupLabel( "Y:" ), 
+        "SIZE", "10x9", 0 ),
+      named[120] /* txtTextY */,
+    NULL), 
+      "ALIGNMENT", "ACENTER", 0 ),
+    IupHbox(
+      IupVbox(
+        decl( 0, IupLabel( "Text:" ), 
+          "SIZE", "25x9", 0 ),
+        named[121] /* txtTextS */,
+      NULL),
+    NULL),
+  NULL), 0 );
+  named[125] = decl( "TextDeskTop", IupVbox(
+    IupHbox(
+      IupFill(),
+      named[124] /* TextData */,
+      IupFill(),
+    NULL),
+    IupHbox(
+      IupFill(),
+      named[122] /* btTextDraw */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      named[123] /* btTextHide */,
+      IupFill(),
+    NULL),
+  NULL), 0 );
+  named[126] = decl( "dlgText", IupDialog(
+    named[125] /* TextDeskTop */
+  ), 
+    "PARENTDIALOG", "dlgMain", 
+    "TITLE", "Text Parameters", 
+    "MAXBOX", "NO", 
+    "MINBOX", "NO", 
+    "CLOSE_CB", "cmdMsgHide", 
+    "RESIZE", "NO", 
+    "MARGIN", "5x5", 0 );
+  named[127] = decl( "tgOpenLines", IupToggle( "CD_OPEN_LINES", "cmdOpenLines" ), 
+    "VALUE", "ON", 0 );
+  named[128] = decl( "tgClosedLines", IupToggle( "CD_CLOSED_LINES", "cmdClosedLines" ), 0 );
+  named[129] = decl( "tgFilled", IupToggle( "CD_FILL", "cmdFill" ), 0 );
+  named[130] = decl( "tgClip", IupToggle( "CD_CLIP", "cmdPolyClip" ), 0 );
+  named[131] = decl( "tgBezier", IupToggle( "CD_BEZIER", "cmdPolyBezier" ), 0 );
+  named[132] = decl( "btPolyHide", IupButton( "Hide", "cmdMsgHide" ), 
+    "SIZE", "30", 0 );
+  named[133] = decl( "rdMode", IupRadio(
+    IupVbox(
+      named[127] /* tgOpenLines */,
+      named[128] /* tgClosedLines */,
+      named[129] /* tgFilled */,
+      named[130] /* tgClip */,
+      named[131] /* tgBezier */,
+    NULL)
+  ), 0 );
+  named[134] = decl( "PolyDesktop", IupVbox(
+    decl( 0, IupFill(), 
+      "SIZE", "5", 0 ),
+    IupHbox(
+      IupFill(),
+      decl( 0, IupFrame(
+        IupHbox(
+          decl( 0, IupFill(), 
+            "SIZE", "5", 0 ),
+          named[133] /* rdMode */,
+        NULL)
+      ), 
+        "TITLE", "Polygon Mode:", 0 ),
+      IupFill(),
+    NULL),
+    decl( 0, IupFill(), 
+      "SIZE", "10", 0 ),
+    IupHbox(
+      IupFill(),
+      named[132] /* btPolyHide */,
+      IupFill(),
+    NULL),
+    decl( 0, IupFill(), 
+      "SIZE", "5", 0 ),
+  NULL), 0 );
+  named[135] = decl( "dlgPoly", IupDialog(
+    named[134] /* PolyDesktop */
+  ), 
+    "PARENTDIALOG", "dlgMain", 
+    "TITLE", "Polygon Parameters", 
+    "MAXBOX", "NO", 
+    "MINBOX", "NO", 
+    "RESIZE", "NO", 
+    "CLOSE_CB", "cmdMsgHide", 0 );
+  named[136] = decl( "txtClipXmin", IupText( "cmdInteger" ), 
+    "NC", "5", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[137] = decl( "txtClipXmax", IupText( "cmdInteger" ), 
+    "NC", "5", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[138] = decl( "txtClipYmin", IupText( "cmdInteger" ), 
+    "NC", "5", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[139] = decl( "txtClipYmax", IupText( "cmdInteger" ), 
+    "NC", "5", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[140] = decl( "btClipOff", IupButton( "Off", "cmdClipOff" ), 
+    "SIZE", "30", 0 );
+  named[141] = decl( "btClipArea", IupButton( "Area", "cmdClipArea" ), 
+    "SIZE", "30", 0 );
+  named[142] = decl( "btClipPoly", IupButton( "Polygon", "cmdClipPoly" ), 
+    "SIZE", "50", 0 );
+  named[143] = decl( "btClipHide", IupButton( "Hide", "cmdMsgHide" ), 
+    "SIZE", "30", 0 );
+  named[144] = decl( "ClipData", IupVbox(
+    decl( 0, IupHbox(
+      decl( 0, IupLabel( "Xmin:" ), 
+        "SIZE", "25x9", 0 ),
+      named[136] /* txtClipXmin */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      decl( 0, IupLabel( "Ymin:" ), 
+        "SIZE", "25x9", 0 ),
+      named[138] /* txtClipYmin */,
+    NULL), 
+      "ALIGNMENT", "ACENTER", 0 ),
+    decl( 0, IupHbox(
+      decl( 0, IupLabel( "Xmax:" ), 
+        "SIZE", "25x9", 0 ),
+      named[137] /* txtClipXmax */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      decl( 0, IupLabel( "Ymax:" ), 
+        "SIZE", "25x9", 0 ),
+      named[139] /* txtClipYmax */,
+    NULL), 
+      "ALIGNMENT", "ACENTER", 0 ),
+  NULL), 0 );
+  named[145] = decl( "ClipDeskTop", IupVbox(
+    IupHbox(
+      IupFill(),
+      named[144] /* ClipData */,
+      IupFill(),
+    NULL),
+    IupHbox(
+      IupFill(),
+      named[140] /* btClipOff */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      named[141] /* btClipArea */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      named[142] /* btClipPoly */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      named[143] /* btClipHide */,
+      IupFill(),
+    NULL),
+  NULL), 0 );
+  named[146] = decl( "dlgClip", IupDialog(
+    named[145] /* ClipDeskTop */
+  ), 
+    "PARENTDIALOG", "dlgMain", 
+    "TITLE", "Clipping", 
+    "MAXBOX", "NO", 
+    "CLOSE_CB", "cmdMsgHide", 
+    "MINBOX", "NO", 
+    "RESIZE", "NO", 
+    "MARGIN", "5x5", 0 );
+  named[147] = decl( "txtImageX", IupText( "cmdInteger" ), 
+    "NC", "5", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[148] = decl( "txtImageY", IupText( "cmdInteger" ), 
+    "NC", "5", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[149] = decl( "txtImageW", IupText( "cmdInteger" ), 
+    "NC", "5", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[150] = decl( "txtImageH", IupText( "cmdInteger" ), 
+    "NC", "5", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[151] = decl( "btImagePut", IupButton( "Put", "cmdImagePut" ), 
+    "SIZE", "30", 0 );
+  named[152] = decl( "btImageGet", IupButton( "Get", "cmdImageGet" ), 
+    "SIZE", "30", 0 );
+  named[153] = decl( "btImageHide", IupButton( "Hide", "cmdMsgHide" ), 
+    "SIZE", "30", 0 );
+  named[154] = decl( "ImageData", IupVbox(
+    decl( 0, IupHbox(
+      decl( 0, IupLabel( "X:" ), 
+        "SIZE", "30x9", 0 ),
+      named[147] /* txtImageX */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      decl( 0, IupLabel( "Y:" ), 
+        "SIZE", "30x9", 0 ),
+      named[148] /* txtImageY */,
+    NULL), 
+      "ALIGNMENT", "ACENTER", 0 ),
+    decl( 0, IupHbox(
+      decl( 0, IupLabel( "Width:" ), 
+        "SIZE", "30x9", 0 ),
+      named[149] /* txtImageW */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      decl( 0, IupLabel( "Height:" ), 
+        "SIZE", "30x9", 0 ),
+      named[150] /* txtImageH */,
+    NULL), 
+      "ALIGNMENT", "ACENTER", 0 ),
+  NULL), 0 );
+  named[155] = decl( "ImageDeskTop", IupVbox(
+    IupHbox(
+      IupFill(),
+      named[154] /* ImageData */,
+      IupFill(),
+    NULL),
+    IupHbox(
+      IupFill(),
+      named[152] /* btImageGet */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      named[151] /* btImagePut */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      named[153] /* btImageHide */,
+      IupFill(),
+    NULL),
+  NULL), 0 );
+  named[156] = decl( "dlgImage", IupDialog(
+    named[155] /* ImageDeskTop */
+  ), 
+    "PARENTDIALOG", "dlgMain", 
+    "TITLE", "Server Image", 
+    "MAXBOX", "NO", 
+    "MINBOX", "NO", 
+    "CLOSE_CB", "cmdMsgHide", 
+    "RESIZE", "NO", 
+    "MARGIN", "5x5", 0 );
+  named[157] = decl( "txtImageRGBX", IupText( "cmdInteger" ), 
+    "NC", "5", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[158] = decl( "txtImageRGBY", IupText( "cmdInteger" ), 
+    "NC", "5", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[159] = decl( "txtImageRGBW", IupText( "cmdInteger" ), 
+    "NC", "5", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[160] = decl( "txtImageRGBH", IupText( "cmdInteger" ), 
+    "NC", "5", 
+    "SIZE", "30x12", 
+    "VALUE", "0", 0 );
+  named[161] = decl( "btImageRGBPut", IupButton( "Put", "cmdImageRGBPut" ), 
+    "SIZE", "30", 0 );
+  named[162] = decl( "btImageRGBGet", IupButton( "Get", "cmdImageRGBGet" ), 
+    "SIZE", "30", 0 );
+  named[163] = decl( "btImageRGBHide", IupButton( "Hide", "cmdMsgHide" ), 
+    "SIZE", "30", 0 );
+  named[164] = decl( "ImageRGBData", IupVbox(
+    decl( 0, IupHbox(
+      decl( 0, IupLabel( "X:" ), 
+        "SIZE", "30x9", 0 ),
+      named[157] /* txtImageRGBX */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      decl( 0, IupLabel( "Y:" ), 
+        "SIZE", "30x9", 0 ),
+      named[158] /* txtImageRGBY */,
+    NULL), 
+      "ALIGNMENT", "ACENTER", 0 ),
+    decl( 0, IupHbox(
+      decl( 0, IupLabel( "Width:" ), 
+        "SIZE", "30x9", 0 ),
+      named[159] /* txtImageRGBW */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      decl( 0, IupLabel( "Height:" ), 
+        "SIZE", "30x9", 0 ),
+      named[160] /* txtImageRGBH */,
+    NULL), 
+      "ALIGNMENT", "ACENTER", 0 ),
+  NULL), 0 );
+  named[165] = decl( "ImageRGBDeskTop", IupVbox(
+    IupHbox(
+      IupFill(),
+      named[164] /* ImageRGBData */,
+      IupFill(),
+    NULL),
+    IupHbox(
+      IupFill(),
+      named[162] /* btImageRGBGet */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      named[161] /* btImageRGBPut */,
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      named[163] /* btImageRGBHide */,
+      IupFill(),
+    NULL),
+  NULL), 0 );
+  named[166] = decl( "dlgImageRGB", IupDialog(
+    named[165] /* ImageRGBDeskTop */
+  ), 
+    "PARENTDIALOG", "dlgMain", 
+    "TITLE", "RGB Image", 
+    "MAXBOX", "NO", 
+    "MINBOX", "NO", 
+    "CLOSE_CB", "cmdMsgHide", 
+    "RESIZE", "NO", 
+    "MARGIN", "5x5", 0 );
+  named[167] = decl( "btCDTest", IupButton( "Close", "cmdCloseAbout" ), 0 );
+  named[168] = decl( "AboutDeskTop", IupHbox(
+    IupFill(),
+    decl( 0, IupVbox(
+      IupLabel( "CD Test 5.3" ),
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      IupLabel( "Antonio Scuri" ),
+      IupLabel( "Diego Nehab" ),
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      IupLabel( "Tecgraf/PUC-Rio" ),
+      decl( 0, IupFill(), 
+        "SIZE", "5", 0 ),
+      IupLabel( "CD Library Version" ),
+      named[169] = decl( "lblVersion", IupLabel( "" ), 0 ),
+      named[167] /* btCDTest */,
+    NULL), 
+      "ALIGNMENT", "ACENTER", 0 ),
+    IupFill(),
+  NULL), 
+    "MARGIN", "5x5", 
+    "GAP", "2", 0 );
+  named[170] = decl( "dlgHelpAbout", IupDialog(
+    named[168] /* AboutDeskTop */
+  ), 
+    "PARENTDIALOG", "dlgMain", 
+    "TITLE", "About", 
+    "MAXBOX", "NO", 
+    "MINBOX", "NO", 
+    "RESIZE", "NO", 0 );
+}
diff --git a/test/cdtest/colobar.h b/test/cdtest/colobar.h
new file mode 100644
index 0000000..263cb53
--- /dev/null
+++ b/test/cdtest/colobar.h
@@ -0,0 +1,7 @@
+#ifndef COLORBAR_H
+#define COLORBAR_H
+
+int ColorBarInit(Ihandle *parent, Ihandle *canvas, long int *fc, long int *bc);
+void ColorBarClose(void);
+
+#endif
diff --git a/test/cdtest/colorbar.c b/test/cdtest/colorbar.c
new file mode 100644
index 0000000..c83f539
--- /dev/null
+++ b/test/cdtest/colorbar.c
@@ -0,0 +1,565 @@
+/*=========================================================================*/
+/* COLORBAR.C - 03/03/96                                                   */
+/* Color Bar implementation.                                               */
+/*=========================================================================*/
+
+/*- Constantes: -----------------------------------------------------------*/
+#define NUMCOLORS 16
+
+/*- Bibliotecas padrao usadas ---------------------------------------------*/
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+
+/*- Inclusao das bibliotecas IUP e CD: ------------------------------------*/
+#include <iup.h>
+#include <cd.h>
+#include <cdiup.h>
+#include <iupkey.h>
+
+/*- Declaraccoes e Prototypes: --------------------------------------------*/
+#include "cdtest.h"
+
+#undef isdigit
+#include <ctype.h>
+
+
+/*- Globais: --------------------------------------------------------------*/
+static struct {
+  cdCanvas *bar_canvas;             /* canvas da colorbar */
+  cdCanvas *other_canvas;           /* canvas ativo anteriormente */
+  int w, h;                         /* dimensoes do canvas */
+  int bgr, bgg, bgb;                /* cor de fundo do dialogo pai */
+  int bci, fci;                     /* indice das cores correntes */
+  long *p_foreground, *p_background;              /* variaveis do  usuario */
+  long colors[NUMCOLORS];       /* palheta interna */
+  int bounds[2*(NUMCOLORS+1)];      /* fronteiras dos elementos da palheta */ 
+} colorbar;                         /* contexto da colorbar */
+
+/*- Dialogo para mudancca da cor da palheta: ------------------------------*/
+static struct {
+  Ihandle *dialog;
+  Ihandle *red;
+  Ihandle *green;
+  Ihandle *blue;
+  Ihandle *alpha;
+  Ihandle *bt_ok;
+  Ihandle *bt_cancel;
+  int to_change;
+} color_change;
+
+/*- Macros: ---------------------------------------------------------------*/
+#define ignore(_) (void)(_)
+
+/*-------------------------------------------------------------------------*/
+/* Filtra inteiros.                                                        */
+/*-------------------------------------------------------------------------*/
+static int integer(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 {
+    return IUP_IGNORE;
+  }
+}
+
+/*-------------------------------------------------------------------------*/
+/* Retorna a cor de indice i.                                              */
+/*-------------------------------------------------------------------------*/
+static long getcolor(int i)
+{
+  if (i<=NUMCOLORS) {
+    return colorbar.colors[i-1];
+  }
+  else return 0;
+}
+
+/*-------------------------------------------------------------------------*/
+/* Mostra a caixa de dialogo Color Change.                                 */
+/*-------------------------------------------------------------------------*/
+static void color_change_show(int c)
+{
+  unsigned char r, g, b, a;
+  long color;
+  char s[4];
+
+  /* mostra o dialogo Color Change */
+  IupShow(color_change.dialog);
+
+  /* mostra a cor atual */
+  color = getcolor(c);
+  cdDecodeColor(color, &r, &g, &b);
+  sprintf(s, "%d", r);
+  IupSetAttribute(color_change.red, IUP_VALUE, s);
+  sprintf(s, "%d", g);
+  IupSetAttribute(color_change.green, IUP_VALUE, s);
+  sprintf(s, "%d", b);
+  IupSetAttribute(color_change.blue, IUP_VALUE, s);
+
+  a = cdDecodeAlpha(color);
+  sprintf(s, "%d", a);
+  IupSetAttribute(color_change.alpha, IUP_VALUE, s);
+
+  /* salva cor a ser alterada no contexto */
+  color_change.to_change = c;
+}
+
+
+/*-------------------------------------------------------------------------*/
+/* Cancela a operaccao de mudancca de cor.                                 */
+/*-------------------------------------------------------------------------*/
+static int color_change_cancel(void)
+{
+  IupHide(color_change.dialog);
+
+  return IUP_DEFAULT;
+}
+
+/*-------------------------------------------------------------------------*/
+/* Determina as fronteiras dos elementos da palheta.                       */
+/*-------------------------------------------------------------------------*/
+static void bounds(int dx, int p, int *x)
+{
+  int i;                                /* contador dos intervalos */
+  int j;                                /* indice do vetor x */
+  int k;                                /* inicio do intervalo */
+  int e;                                /* erro da aproximacao inteira */
+  int _2p;                              /* dobro do numero de intervalos */
+  int q;                                /* quociente da divisao inteira */
+  int _2r;                              /* dobro do resto da divisao inteira */
+
+  /* inicializa as variaveis */
+  k = 0;                                /* inicio do primeiro intervalo */
+  j = 0;                                /* indice do vetor x */
+  e = 0;                                /* inicializa o erro */
+  _2p = p << 1;                         /* dobro do numero de intervalos */
+  _2r = (dx % p) << 1;                  /* dobro do resto da divisao inteira */
+  q = dx / p;                           /* quociente da divisao inteira */
+
+  /* gera o vetor de intervalos */
+  for (i=0; i<p; i++) {                 /* para p intervalos */
+    e += _2r;                           /* incrementa o erro */
+    x[j++] = k;                         /* inicio do intervalo */
+    if (e >= p) {                       /* estourou? */
+      e -= _2p;                         /* ajusta o novo limite */
+      k += q + 1;                       /* arredonda para cima */
+    } 
+    else {
+      k += q;                           /* arredonda para baixo */
+    }
+    x[j++] = k - 2;                     /* fim do intervalo */
+  }
+}
+
+/*-------------------------------------------------------------------------*/
+/* Acha a cor onde o mouse foi clicado por busca binaria. Retorna zero se  */ 
+/* o click foi fora de qualquer cor.                                       */
+/*-------------------------------------------------------------------------*/
+static int findwhere(int x, int y, int c1, int c2)
+{
+  int mid;
+  
+  /* so pode ser este ou o click foi fora */
+  if (c1 == c2) {
+    if ((x > colorbar.bounds[c1<<1]) && (x < colorbar.bounds[(c1<<1) + 1])) {
+      if ((y > 0) && (y < (colorbar.h-1))) return c1;
+      else return 0;
+    }
+    else return 0;
+  }
+  
+  /* elemento intermediario */
+  mid = (c1 + c2)>>1;
+  
+  /* se o click estah a direita do elemento intermediario */
+  if (x > colorbar.bounds[(mid<<1) + 1]) return findwhere(x, y, mid+1, c2);
+  
+  /* se estah a esquerda do elemento intermediario */
+  else if (x < colorbar.bounds[mid<<1]) return findwhere(x, y, c1, mid-1);
+  
+  /* estah no meio do intermediario e a vertical estah legal, eh esse */
+  else if ((y > 0) && (y < (colorbar.h-1))) return mid;
+
+  /* o programa nunca chega aqui, mas o compilador fica feliz */
+  return 0;
+}
+
+/*-------------------------------------------------------------------------*/
+/* Desenha a moldura do elemento da palheta.                               */
+/*-------------------------------------------------------------------------*/
+static void hollowbox(int xmin, int xmax, int ymin, int ymax)
+{
+  cdForeground(cdEncodeColor(255, 255, 255));
+  cdLine(xmin, ymin, xmax, ymin);
+  cdLine(xmax, ymin+1, xmax, ymax);
+
+  cdForeground(cdEncodeColor(102, 102, 102));
+  cdLine(xmin, ymin+1, xmin, ymax);
+  cdLine(xmin+1, ymax, xmax-1, ymax);
+}
+
+
+/*-------------------------------------------------------------------------*/
+/* Muda a cor de indice i e retorna a anterior.                            */
+/*-------------------------------------------------------------------------*/
+static long changecolor(int i, long color)
+{
+  long temp;
+
+  if (i<=NUMCOLORS) {
+    temp = colorbar.colors[i-1];
+    colorbar.colors[i-1] = color;
+    return temp;
+  }
+  else return 0;
+}
+
+
+/*-------------------------------------------------------------------------*/
+/* Inicializa o vetor de cores.                                            */
+/*-------------------------------------------------------------------------*/
+static void resetcolors(void)
+{
+  colorbar.colors[ 0] = cdEncodeColor(  0,   0,   0);
+  colorbar.colors[ 1] = cdEncodeColor(153, 153, 153);
+  colorbar.colors[ 2] = cdEncodeColor(178, 178, 178);
+  colorbar.colors[ 3] = cdEncodeColor(255, 255, 255);
+  colorbar.colors[ 4] = cdEncodeColor(255, 255,   0);
+  colorbar.colors[ 5] = cdEncodeColor(255,   0,   0);
+  colorbar.colors[ 6] = cdEncodeColor(255,   0, 255);
+  colorbar.colors[ 7] = cdEncodeColor(  0, 255, 255);
+  colorbar.colors[ 8] = cdEncodeColor(  0,   0, 255);
+  colorbar.colors[ 9] = cdEncodeColor(  0, 255,   0);
+  colorbar.colors[10] = cdEncodeColor(128, 128,   0);
+  colorbar.colors[11] = cdEncodeColor(128,   0,   0);
+  colorbar.colors[12] = cdEncodeColor(128,   0, 128);
+  colorbar.colors[13] = cdEncodeColor(  0, 128, 128);
+  colorbar.colors[14] = cdEncodeColor(  0,   0, 128);
+  colorbar.colors[15] = cdEncodeColor(  0, 128,   0);
+}
+
+/*-------------------------------------------------------------------------*/
+/* Desenha a ColorBar.                                                     */
+/*-------------------------------------------------------------------------*/
+static int fColorBarRepaint(void)
+{
+  int i;
+  double dt;
+
+  /* salva o canvas ativo no momento */
+  colorbar.other_canvas = cdActiveCanvas();
+
+  /* ativa o canvas da colorbar */
+  if (cdActivate(colorbar.bar_canvas) == CD_ERROR) {
+    printf("Color Bar Error: Unable to activate canvas.");
+    return 1;
+  }
+  cdClear();
+
+  /* desenha as cores da palheta */
+  for (i=2; i<=2*NUMCOLORS; i+=2) {
+    cdForeground(getcolor(i>>1));
+    cdBox(colorbar.bounds[i], colorbar.bounds[i+1], 1, colorbar.h-1);
+    hollowbox(colorbar.bounds[i], colorbar.bounds[i+1], 1, colorbar.h-1);
+  }
+
+  /* desenha o fedback */
+  dt = (colorbar.w-1)/(NUMCOLORS+1);
+  /* desenha a cor de fundo */
+  cdForeground(getcolor(colorbar.bci));
+  cdBox(1, (int)(2.0*dt/3.0), 1, (int)(2.0*(colorbar.h-1)/3.0));
+  hollowbox(1, (int)(2.0*dt/3.0), 1, (int)(2.0*(colorbar.h-1)/3.0));
+  /* desenha a cor de frente */
+  cdForeground(getcolor(colorbar.fci));
+  cdBox((int)(dt/3.0), (int)(dt)-1, (int)((colorbar.h-1)/3.0)+1, colorbar.h-1);
+  hollowbox((int)(dt/3.0), (int)(dt)-1, (int)((colorbar.h-1)/3.0)+1, colorbar.h-1);
+ 
+  /* restaura o canvas anteriormente ativo */
+  cdActivate(colorbar.other_canvas);
+
+  return IUP_DEFAULT;
+}
+
+/*-------------------------------------------------------------------------*/
+/* Funcao associada ao botao do mouse.                                     */
+/*-------------------------------------------------------------------------*/
+static int fColorBarButtonCB(Ihandle *self, int b, int e, int x, int y, char *r)
+{
+  int c;
+ 
+  ignore(self);
+  ignore(r);
+
+  /* salva o canvas ativo no momento */
+  colorbar.other_canvas = cdActiveCanvas();
+
+  /* ativa o canvas da colorbar */
+  if (cdActivate(colorbar.bar_canvas) == CD_ERROR) {
+    printf("Color Bar Error: Unable to activate canvas.");
+    return 1;
+  }
+
+  /* converte para coordenadas do canvas */
+  cdUpdateYAxis(&y);
+
+  /* se o botao foi pressionado */
+  if (e) {
+
+    /* acha onde foi o click */
+    c = findwhere(x, y, 1, 16);
+    
+    /* se o click foi dentro de alguma cor... */
+    if (c != 0) {
+
+      /* botao da esquerda eh mudancca de cor de foreground */
+      if (b == IUP_BUTTON1) {
+
+        /* se for double-click */
+        if ((isdouble(r)) && (c == colorbar.fci) ) {
+
+          /* mostra o dialogo */
+          color_change_show(c);
+        }
+
+        /* muda a cor de frente corrente */
+        else {
+
+          /* largura de cada celula */
+          double dt;
+          unsigned char r, g, b;
+  
+          /* altera a variavel do usuario */
+          *(colorbar.p_foreground) = getcolor(c);
+       
+          /* altera o indice da cor de frente corrente */
+          colorbar.fci = c;
+
+          cdDecodeColor(getcolor(colorbar.fci), &r, &g, &b);
+          sprintf(ctgc.status_line, "cdForeground(cdEncodeColor(%d, %d, %d))", (int)r, (int)g, (int)b);
+          set_status();
+
+          /* altera o feedback no primeiro elemento da palheta */
+          dt = (colorbar.w-1)/(NUMCOLORS+1);
+          cdForeground(getcolor(colorbar.fci));
+          cdBox((int)(dt/3.0), (int)(dt)-1, (int)((colorbar.h-1)/3.0)+1, colorbar.h-1);
+          hollowbox((int)(dt/3.0), (int)(dt)-1, (int)((colorbar.h-1)/3.0)+1, colorbar.h-1);
+        }
+
+      }
+
+      else if (b == IUP_BUTTON3) {
+          
+        /* largura de cada celula */
+        double dt;
+        unsigned char r, g, b;
+
+        /* altera a variavel do usuario */
+        *(colorbar.p_background) = getcolor(c);
+      
+        /* altera o indice da cor de frente corrente */
+        colorbar.bci = c;
+     
+        cdDecodeColor(getcolor(colorbar.bci), &r, &g, &b);
+        sprintf(ctgc.status_line, "cdBackground(cdEncodeColor(%d, %d, %d))", (int)r, (int)g, (int)b);
+        set_status();
+
+        /* altera o feedback no primeiro elemento da palheta */
+        dt = (colorbar.w-1)/(NUMCOLORS+1);
+        cdForeground(getcolor(colorbar.bci));
+        cdBox(1, (int)(2.0*dt/3.0), 1, (int)(2.0*(colorbar.h-1)/3.0));
+        hollowbox(1, (int)(2.0*dt/3.0), 1, (int)(2.0*(colorbar.h-1)/3.0));
+        cdForeground(getcolor(colorbar.fci));
+        cdBox((int)(dt/3.0), (int)(dt)-1, (int)((colorbar.h-1)/3.0)+1, colorbar.h-1);
+        hollowbox((int)(dt/3.0), (int)(dt)-1, (int)((colorbar.h-1)/3.0)+1, colorbar.h-1);
+      }
+
+    }
+
+  }
+
+  /* restaura o canvas anteriormente ativo */
+  cdActivate(colorbar.other_canvas);
+  
+  return IUP_DEFAULT;
+}
+
+/*-------------------------------------------------------------------------*/
+/* Callback associado ao resize do canvas.                                 */
+/*-------------------------------------------------------------------------*/
+static int fColorBarResizeCB(Ihandle *self, int w, int h)
+{
+  ignore(self);
+
+  /* atualiza as dimensoes do canvas */
+  colorbar.w = w;
+  colorbar.h = h;
+
+  /* atualiza as fronteiras dos elementos da palheta */
+  bounds(colorbar.w, NUMCOLORS+1, colorbar.bounds); 
+
+  return IUP_DEFAULT;
+}
+
+/*-------------------------------------------------------------------------*/
+/* Confirma a mudanca de cores.                                            */
+/*-------------------------------------------------------------------------*/
+static int color_change_ok(void)
+{
+  int r, g, b, a;
+  long new_color;
+
+  /* pega os novos valores */
+  r = IupGetInt(color_change.red, IUP_VALUE);
+  g = IupGetInt(color_change.green, IUP_VALUE);
+  b = IupGetInt(color_change.blue, IUP_VALUE);
+  a = IupGetInt(color_change.alpha, IUP_VALUE);
+
+  /* se todos forem validos */
+  if ((r<256)&&(g<256)&&(b<256)) {
+
+    /* esconde a caixa de dialogo */
+    IupHide(color_change.dialog);
+
+    /* atualiza a cor no contexto */ 
+    new_color = cdEncodeColor((unsigned char)r, (unsigned char) g, (unsigned char) b);
+    new_color = cdEncodeAlpha(new_color, (unsigned char)a);
+    changecolor(color_change.to_change, new_color);
+
+    colorbar.fci = color_change.to_change;
+
+    /* redesenha a colorbar */
+    fColorBarRepaint();
+
+    /* altera a variavel do usuario */
+    *(colorbar.p_foreground) = new_color;
+
+  }
+
+  return IUP_DEFAULT;
+}
+
+/*-------------------------------------------------------------------------*/
+/* Inicializa a ColorBar.                                                  */
+/*-------------------------------------------------------------------------*/
+void ColorBarClose(void)
+{
+  cdKillCanvas(colorbar.bar_canvas);
+  IupDestroy(color_change.dialog);
+}
+
+int ColorBarInit(Ihandle *parent, Ihandle *canvas, long *foreground, long *background)
+{
+  char *bg_color;
+
+  /* pega a cor de fundo do dialogo parente */
+  bg_color = IupGetAttribute(parent, "BGCOLOR");
+  if (bg_color == NULL) {
+    printf("Color Bar Error: Unable to get bg_color.");
+    return 0;
+  }
+  sscanf(bg_color, "%d %d %d", &colorbar.bgr, &colorbar.bgg, &colorbar.bgb);
+
+  /* inicializa as cores de fundo e de frente defaults */
+  colorbar.fci = 1;
+  colorbar.bci = 4;
+
+  /* pega o enderecco das variaveis do usuario */
+  colorbar.p_foreground = foreground;
+  colorbar.p_background = background;
+
+  /* inicializa a palheta interna de cores */
+  resetcolors();
+
+  /* cria o canvas do CD */
+  colorbar.bar_canvas = cdCreateCanvas(CD_IUP, canvas);
+  if (colorbar.bar_canvas == NULL) {
+    printf("Color Bar Error: Unable to create canvas.");
+    return 0;
+  }
+
+  /* salva o canvas ativo no momento */
+  colorbar.other_canvas = cdActiveCanvas();
+
+  /* ativa o canvas da colorbar */
+  if (cdActivate(colorbar.bar_canvas) == CD_ERROR) {
+    printf("Color Bar Error: Unable to activate canvas.");
+    return 0;
+  }
+
+  /* pega as dimensoes do canvas pela primeira vez */
+  cdGetCanvasSize(&colorbar.w, &colorbar.h, NULL, NULL);
+
+  /* restaura o canvas anteriormente ativo */
+  if (colorbar.other_canvas != NULL) cdActivate(colorbar.other_canvas);
+
+  /* cria o vetor com as fronteiras dos elementos da palheta */
+  bounds(colorbar.w, NUMCOLORS+1, colorbar.bounds); 
+  
+  /* associa os callbacks */
+  IupSetFunction("cmdColorBarButtonCB", (Icallback) fColorBarButtonCB);
+  IupSetFunction("cmdColorBarRepaint", (Icallback) fColorBarRepaint);
+  IupSetFunction("cmdColorBarResizeCB", (Icallback) fColorBarResizeCB);
+
+  /* desenha a barra de cores pela primeira vez */
+  fColorBarRepaint();
+
+  /* inicializa o dialogo de troca de cores da palheta */
+  color_change.dialog = IupDialog(
+    IupVbox(
+      IupHbox(
+        IupLabel("R:"),
+        color_change.red = IupText("cmdInteger"),
+        IupLabel("G:"),
+        color_change.green = IupText("cmdInteger"),
+        IupLabel("B:"),
+        color_change.blue = IupText("cmdInteger"),
+        IupLabel("A:"),
+        color_change.alpha = IupText("cmdInteger"),
+        NULL
+      ),
+      IupHbox(
+        IupFill(),
+        color_change.bt_ok = IupButton("OK", "cmdColorChangeOK"),
+        color_change.bt_cancel = IupButton("Cancel", "cmdColorChangeCancel"),
+        IupFill(),
+        NULL
+      ),
+      NULL
+    )
+  );
+
+  /* atributos do dialogo */
+  IupSetAttribute(color_change.dialog, IUP_TITLE, "Color Change:");
+  IupSetAttribute(color_change.dialog, IUP_MARGIN, "5x5");
+  IupSetAttribute(color_change.dialog, IUP_GAP, "5");
+  IupSetAttribute(color_change.dialog, "MAXBOX", "NO");
+  IupSetAttribute(color_change.dialog, "MINBOX", "NO");
+  IupSetAttribute(color_change.dialog, "PARENTDIALOG", "dlgMain");
+
+  /* atributos dos texts */
+  IupSetFunction("cmdInteger", (Icallback) integer);
+  IupSetAttribute(color_change.red, "NC", "3");
+  IupSetAttribute(color_change.green, "NC", "3");
+  IupSetAttribute(color_change.blue, "NC", "3");
+  IupSetAttribute(color_change.alpha, "NC", "3");
+  IupSetAttribute(color_change.red, "SIZE", "24");
+  IupSetAttribute(color_change.green, "SIZE", "24");
+  IupSetAttribute(color_change.blue, "SIZE", "24");
+  IupSetAttribute(color_change.alpha, "SIZE", "24");
+  
+  /* atributos dos botoes */
+  IupSetAttribute(color_change.bt_ok, IUP_SIZE, "30");
+  IupSetAttribute(color_change.bt_cancel, IUP_SIZE, "30");
+  IupSetFunction("cmdColorChangeCancel", (Icallback) color_change_cancel);
+  IupSetFunction("cmdColorChangeOK", (Icallback) color_change_ok);
+
+  return 1;
+}        
diff --git a/test/cdtest/config.mak b/test/cdtest/config.mak
new file mode 100644
index 0000000..9453944
--- /dev/null
+++ b/test/cdtest/config.mak
@@ -0,0 +1,24 @@
+APPNAME = cdtest
+
+SRC = cdtest.c cdtest_led.c colorbar.c drivers.c list.c rubber.c
+
+ifeq "$(TEC_SYSNAME)" "Win32"
+  SRC += cdtest.rc
+endif
+
+USE_CD=Yes
+USE_IUP=Yes
+
+cdtest_led.c: cdtest.led
+	ledc -f cdtest_loadled -o cdtest_led.c cdtest.led
+
+USE_STATIC = Yes
+
+#IUP = ../../../iup
+CD = ../..
+
+ifneq ($(findstring Win, $(TEC_SYSNAME)), )
+  LIBS = cdpdflib
+else
+  SLIB = $(CD)/lib/$(TEC_UNAME)/libcdpdflib.a
+endif
diff --git a/test/cdtest/drivers.c b/test/cdtest/drivers.c
new file mode 100644
index 0000000..93918d5
--- /dev/null
+++ b/test/cdtest/drivers.c
@@ -0,0 +1,457 @@
+/*=========================================================================*/
+/* DRIVERS.C - 10/02/95                                                    */
+/* Suporte para os drivers do CD.                                          */
+/*=========================================================================*/
+
+/*- Bibliotecas padrao usadas: --------------------------------------------*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/*- Inclusao das bibliotecas IUP e CD: ------------------------------------*/
+#include <iup.h>
+#include <cd.h>
+#include <cdiup.h>
+
+/*- Prototypes e declaracoes do CDTest: -----------------------------------*/
+#include "cdtest.h"
+
+/*- Contexto do CDTest (declarado em CDTEST.C): ---------------------------*/
+extern tCTC ctgc;
+
+#ifdef CDTEST_WIN32
+#define CLIPBOARD_WIN32
+#define WMF
+#define PRINTER
+#endif
+
+#define CLIPBOARD 
+#define CGM
+#define MF
+#define PS
+#define DXF
+#define DGN
+#define PDF
+
+static int LoadCanvas(char* ctx_name, cdContext* ctx, char *filename)
+{
+  if (IupGetFile(filename) == 0) 
+  { 
+    newmetafile(filename, ctx);
+    cdActivate(ctgc.iup_canvas);
+    cdWriteMode(CD_REPLACE);
+    cdLineStyle(CD_CONTINUOUS);
+    cdLineWidth(1);
+    cdBackground(CD_WHITE);
+    cdBackOpacity(CD_TRANSPARENT);
+    cdForeground(CD_BLACK);
+    cdInteriorStyle(CD_SOLID);
+    if (ctgc.stretch_play)
+    {
+      cdPlay(ctx, 0, ctgc.w-1, 0, ctgc.h-1, filename);
+      sprintf(ctgc.status_line, "cdPlay(%s, 0, %d, 0, %d, %s)", ctx_name, ctgc.w-1, ctgc.h-1, filename);
+    }
+    else
+    {
+      cdPlay(ctx, 0, 0, 0, 0, filename);
+      sprintf(ctgc.status_line, "cdPlay(%s, 0, 0, 0, 0, %s)", ctx_name, filename);
+    }
+    set_status();
+  }
+
+  return IUP_DEFAULT;
+}
+
+static int SaveCanvas(char* ctx_name, cdContext* ctx, char *data)
+{
+  cdCanvas *canvas;
+
+  canvas = cdCreateCanvas(ctx, data);
+  if (!canvas)
+  {
+    IupMessage("Error!", "Can not create canvas.");
+    return IUP_DEFAULT;
+  }
+
+  cdActivate(canvas);
+
+  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);
+
+  putlist(canvas);
+
+  cdKillCanvas(canvas);
+
+  return IUP_DEFAULT;
+}
+
+
+/*-------------------------------------------------------------------------*/
+/* Copia o conteudo do canvas para o clipboard do Windows, vetorial.       */
+/*-------------------------------------------------------------------------*/
+#ifdef CLIPBOARD
+#include <cdclipbd.h>
+
+static int fClipBoard(void)
+{
+  char data[1000];
+  sprintf(data, "%dx%d %g", ctgc.w, ctgc.h, ctgc.res);
+  return SaveCanvas("CD_CLIPBOARD", CD_CLIPBOARD, data);
+}
+
+/*-------------------------------------------------------------------------*/
+/* Copia o conteudo do canvas para o clipboard do Windows, BitMap.         */
+/*-------------------------------------------------------------------------*/
+static int fClipBoardBitmap(void)
+{
+  char data[1000];
+  sprintf(data, "%dx%d %g -b", ctgc.w, ctgc.h, ctgc.res);
+  return SaveCanvas("CD_CLIPBOARD", CD_CLIPBOARD, data);
+}
+
+static int fClipBoardMetafile(void)
+{
+  char data[1000];
+#ifdef WIN32
+  sprintf(data, "%gx%g %g -m", ((double)ctgc.w)/ctgc.res, ((double)ctgc.h)/ctgc.res, ctgc.res);
+#else
+  sprintf(data, "%p %gx%g %g", IupGetAttribute(IupGetHandle("cnvMain"), "XDISPLAY"), ((double)ctgc.w)/ctgc.res, ((double)ctgc.h)/ctgc.res, ctgc.res);
+#endif
+  return SaveCanvas("CD_CLIPBOARD", CD_CLIPBOARD, data);
+}
+
+static int fClipBoardPaste(void)
+{
+  char* data;
+  newmetafile("", CD_CLIPBOARD);
+  cdActivate(ctgc.iup_canvas);
+  cdWriteMode(CD_REPLACE);
+  cdLineStyle(CD_CONTINUOUS);
+  cdLineWidth(1);
+  cdBackground(CD_WHITE);
+  cdBackOpacity(CD_TRANSPARENT);
+  cdForeground(CD_BLACK);
+  cdInteriorStyle(CD_SOLID);
+  
+#ifdef WIN32
+  data = "";
+#else
+  data = IupGetAttribute(IupGetHandle("cnvMain"), "XDISPLAY");
+#endif
+  
+  if (ctgc.stretch_play)
+  {
+    cdPlay(CD_CLIPBOARD, 0, ctgc.w-1, 0, ctgc.h-1, data);
+    sprintf(ctgc.status_line, "cdPlay(CD_CLIPBOARD, 0, %d, 0, %d, \"\")", ctgc.w-1, ctgc.h-1);
+  }
+  else
+  {
+    cdPlay(CD_CLIPBOARD, 0, 0, 0, 0, data);
+    sprintf(ctgc.status_line, "cdPlay(CD_CLIPBOARD, 0, 0, 0, 0, \"\")");
+  }
+  set_status();
+  return IUP_DEFAULT;
+}
+
+#endif
+
+/*-------------------------------------------------------------------------*/
+/* Copia o conteudo do canvas para um arquivo PostScript.                  */
+/*-------------------------------------------------------------------------*/
+#ifdef PS
+#include <cdps.h>
+
+static int fPS(void)
+{
+  char filename[1024]="*.ps";
+  char data[1024];
+
+  if (IupGetFile(filename)>=0) 
+  { 
+    sprintf(data, "%s -s%d", filename, (int)(ctgc.res * 25.4));
+    return SaveCanvas("CD_PS", CD_PS, data);
+  }
+
+  return IUP_DEFAULT;
+}
+
+static int fEPS(void)
+{
+  char filename[1024]="*.eps";
+  char data[1024];
+
+  if (IupGetFile(filename)>=0) 
+  { 
+    sprintf(data, "%s -s%d -e -l0 -r0 -t0 -b0", filename, (int)(ctgc.res * 25.4));
+    return SaveCanvas("CD_PS", CD_PS, data);
+  }
+
+  return IUP_DEFAULT;
+}
+#endif
+
+#ifdef PDF
+#include <cdpdf.h>
+
+static int fPDF(void)
+{
+  char filename[1024]="*.pdf";
+  char data[1024];
+
+  if (IupGetFile(filename)>=0) 
+  { 
+    sprintf(data, "%s -s%d", filename, (int)(ctgc.res * 25.4));
+    return SaveCanvas("CD_PDF", CD_PDF, data);
+  }
+
+  return IUP_DEFAULT;
+}
+#endif
+
+/*-------------------------------------------------------------------------*/
+/* Copia o conteudo do canvas para um arquivo CGM.                         */
+/*-------------------------------------------------------------------------*/
+#ifdef CGM
+#include <cdcgm.h>
+
+static int fCGMb(void)
+{
+  char filename[1024]="*.cgm";
+  char data[1000];
+
+  if (IupGetFile(filename)>=0) 
+  { 
+    sprintf(data, "%s %gx%g %g", filename, ((double)ctgc.w)/ctgc.res, ((double)ctgc.h)/ctgc.res, ctgc.res);
+    return SaveCanvas("CD_CGM", CD_CGM, data);
+  }
+
+  return IUP_DEFAULT;
+}
+
+static int fCGMt(void)
+{
+  char filename[1024]="*.cgm";
+  char data[1000];
+
+  if (IupGetFile(filename)>=0) 
+  { 
+    sprintf(data, "%s %gx%g %g -t", filename, ((double)ctgc.w)/ctgc.res, ((double)ctgc.h)/ctgc.res, ctgc.res);
+    return SaveCanvas("CD_CGM", CD_CGM, data);
+  }
+
+  return IUP_DEFAULT;
+}
+
+static int fPlayCGM(void)
+{
+  char filename[1024]="*.cgm";
+  return LoadCanvas("CD_CGM", CD_CGM, filename);
+}
+
+#endif
+
+/*-------------------------------------------------------------------------*/
+/* Copia o conteudo do canvas para um arquivo DXF.                         */
+/*-------------------------------------------------------------------------*/
+#ifdef DXF
+#include <cddxf.h>
+
+static int fDXF(void)
+{
+  char filename[1024]="*.dxf";
+  char data[1000];
+
+  if (IupGetFile(filename)>=0) 
+  { 
+    sprintf(data, "%s %gx%g %g", filename, ((double)ctgc.w)/ctgc.res, ((double)ctgc.h)/ctgc.res, ctgc.res);
+    return SaveCanvas("CD_DXF", CD_DXF, data);
+  }
+
+  return IUP_DEFAULT;
+}
+#endif
+
+/*-------------------------------------------------------------------------*/
+/* Copia o conteudo do canvas para um arquivo DGN.                         */
+/*-------------------------------------------------------------------------*/
+#ifdef DGN
+#include <cddgn.h>
+
+static int fDGN(void)
+{
+  char filename[1024]="*.dgn";
+  char data[1000];
+
+  if (IupGetFile(filename)>=0) 
+  { 
+    sprintf(data, "%s %gx%g %g -sseed2d.dgn", filename, ((double)ctgc.w)/ctgc.res, ((double)ctgc.h)/ctgc.res, ctgc.res);
+    return SaveCanvas("CD_DGN", CD_DGN, data);
+  }
+
+  return IUP_DEFAULT;
+}
+#endif
+
+#ifdef MF
+#include <cdmf.h>
+/*-------------------------------------------------------------------------*/
+/* Copia o conteudo do canvas para um arquivo metafile do CD.              */
+/*-------------------------------------------------------------------------*/
+static int fMF(void)
+{
+  char filename[1024]="*.mf";
+  char data[1000];
+
+  if (IupGetFile(filename)>=0) 
+  { 
+    sprintf(data, "%s %gx%g %g", filename, ((double)ctgc.w)/ctgc.res, ((double)ctgc.h)/ctgc.res, ctgc.res);
+    return SaveCanvas("CD_METAFILE", CD_METAFILE, data);
+  }
+
+  return IUP_DEFAULT;
+}
+
+/*-------------------------------------------------------------------------*/
+/* Copia o conteudo do canvas para um arquivo metafile do CD.              */
+/*-------------------------------------------------------------------------*/
+static int fPlayMF(void)
+{
+  char filename[1024]="*.mf";
+  return LoadCanvas("CD_METAFILE", CD_METAFILE, filename);
+}
+#endif
+
+/*-------------------------------------------------------------------------*/
+/* Copia o conteudo do canvas para um arquivo WMF.                         */
+/*-------------------------------------------------------------------------*/
+#ifdef WMF
+#include <cdwmf.h>
+
+static int fWMF(void)
+{
+  char filename[1024]="*.wmf";
+  char data[1000];
+
+  if (IupGetFile(filename)>=0) 
+  { 
+    sprintf(data, "%s %dx%d %g", filename, ctgc.w, ctgc.h, ctgc.res);
+    return SaveCanvas("CD_WMF", CD_WMF, data);
+  }
+
+  return IUP_DEFAULT;
+}
+
+static int fPlayWMF(void)
+{
+  char filename[1024]="*.wmf";
+  return LoadCanvas("CD_WMF", CD_WMF, filename);
+}
+
+/*-------------------------------------------------------------------------*/
+/* Copia o conteudo do canvas para um arquivo EMF.                         */
+/*-------------------------------------------------------------------------*/
+#include <cdemf.h>
+
+static int fEMF(void)
+{
+  char filename[1024]="*.emf";
+  char data[1000];
+
+  if (IupGetFile(filename)>=0) 
+  { 
+    sprintf(data, "%s %dx%d %g", filename, ctgc.w, ctgc.h, ctgc.res);
+    return SaveCanvas("CD_EMF", CD_EMF, data);
+  }
+
+  return IUP_DEFAULT;
+}
+
+static int fPlayEMF(void)
+{
+  char filename[1024]="*.emf";
+  return LoadCanvas("CD_EMF", CD_EMF, filename);
+}
+#endif
+
+/*-------------------------------------------------------------------------*/
+/* Copia o conteudo do canvas para a impressora.                           */
+/*-------------------------------------------------------------------------*/
+#ifdef PRINTER
+#include <cdprint.h>
+
+static int fPrint(void)
+{
+  char *data = "CDTEST.PRN -d";
+  return SaveCanvas("CD_PRINTER", CD_PRINTER, data);
+  return IUP_DEFAULT;
+}
+#endif
+
+/*-------------------------------------------------------------------------*/
+/* Inicializa os menus de Save e Open.                                     */
+/*-------------------------------------------------------------------------*/
+void DriversInit(void)
+{
+#ifdef MF
+  IupSetFunction("cmdMF", (Icallback) fMF);
+  IupSetFunction("cmdPlayMF", (Icallback) fPlayMF);
+#endif
+#ifdef PS
+  IupSetAttribute(IupGetHandle("itPS"), IUP_ACTIVE, IUP_YES);
+  IupSetAttribute(IupGetHandle("itEPS"), IUP_ACTIVE, IUP_YES);
+  IupSetFunction("cmdPS", (Icallback) fPS);
+  IupSetFunction("cmdEPS", (Icallback) fEPS);
+#endif
+#ifdef PDF
+  IupSetAttribute(IupGetHandle("itPDF"), IUP_ACTIVE, IUP_YES);
+  IupSetFunction("cmdPDF", (Icallback) fPDF);
+#endif
+#ifdef CLIPBOARD
+  IupSetAttribute(IupGetHandle("itClipBoardMetafile"), IUP_ACTIVE, IUP_YES);
+  IupSetAttribute(IupGetHandle("itClipBoardPaste"), IUP_ACTIVE, IUP_YES);
+  IupSetFunction("cmdClipBoardMetafile", (Icallback)fClipBoardMetafile);
+  IupSetFunction("cmdClipBoardPaste", (Icallback)fClipBoardPaste);
+#endif
+#ifdef CLIPBOARD_WIN32
+  IupSetAttribute(IupGetHandle("itClipBoardBitmap"), IUP_ACTIVE, IUP_YES);
+  IupSetAttribute(IupGetHandle("itClipBoard"), IUP_ACTIVE, IUP_YES);
+  IupSetFunction("cmdClipBoardBitmap", (Icallback)fClipBoardBitmap);
+  IupSetFunction("cmdClipBoard", (Icallback)fClipBoard);
+#endif
+#ifdef DXF
+  IupSetAttribute(IupGetHandle("itDXF"), IUP_ACTIVE, IUP_YES);
+  IupSetFunction("cmdDXF", (Icallback) fDXF);
+#endif
+#ifdef DGN
+  IupSetAttribute(IupGetHandle("itDGN"), IUP_ACTIVE, IUP_YES);
+  IupSetFunction("cmdDGN", (Icallback) fDGN);
+#endif
+#ifdef CGM
+  IupSetAttribute(IupGetHandle("itCGMb"), IUP_ACTIVE, IUP_YES);
+  IupSetFunction("cmdCGMb", (Icallback) fCGMb);
+  IupSetAttribute(IupGetHandle("itCGMt"), IUP_ACTIVE, IUP_YES);
+  IupSetFunction("cmdCGMt", (Icallback) fCGMt);
+  IupSetAttribute(IupGetHandle("itPlayCGM"), IUP_ACTIVE, IUP_YES);
+  IupSetFunction("cmdPlayCGM", (Icallback) fPlayCGM);
+#endif
+#ifdef WMF
+  IupSetAttribute(IupGetHandle("itEMF"), IUP_ACTIVE, IUP_YES);
+  IupSetAttribute(IupGetHandle("itWMF"), IUP_ACTIVE, IUP_YES);
+  IupSetFunction("cmdEMF", (Icallback) fEMF);
+  IupSetFunction("cmdWMF", (Icallback) fWMF);
+  IupSetAttribute(IupGetHandle("itPlayEMF"), IUP_ACTIVE, IUP_YES);
+  IupSetAttribute(IupGetHandle("itPlayWMF"), IUP_ACTIVE, IUP_YES);
+  IupSetFunction("cmdPlayEMF", (Icallback) fPlayEMF);
+  IupSetFunction("cmdPlayWMF", (Icallback) fPlayWMF);
+#endif
+#ifdef PRINTER
+  IupSetAttribute(IupGetHandle("itPrint"), IUP_ACTIVE, IUP_YES);
+  IupSetFunction("cmdPrint", (Icallback) fPrint);
+#endif
+}
diff --git a/test/cdtest/list.c b/test/cdtest/list.c
new file mode 100644
index 0000000..a41c5bc
--- /dev/null
+++ b/test/cdtest/list.c
@@ -0,0 +1,278 @@
+/*=========================================================================*/
+/* LIST.C 10/12/95                                                         */
+/* Funcoes para a manipulacao da lista de primitivas.                      */
+/*=========================================================================*/
+
+/*- Bibliotecas padrao usadas ---------------------------------------------*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+/*- Inclusao das bibliotecas IUP e CD: ------------------------------------*/
+#include <iup.h>
+#include <cd.h>
+#include <cdiup.h>
+
+/*- Prototypes e declaracoes do CD Test: ----------------------------------*/
+#include "cdtest.h"
+
+/*- Contexto do CD Test (declarado em CDTEST.C): --------------------------*/
+extern tCTC ctgc;
+
+/*-------------------------------------------------------------------------*/
+/* Adiciona um ponto ao poligono temporario corrente.                      */
+/*-------------------------------------------------------------------------*/
+int newpolypoint(int x, int y)
+{
+  if (ctgc.num_points <= MAXPOINTS) {
+    ctgc.points[ctgc.num_points].x = x;
+    ctgc.points[ctgc.num_points].y = y;
+    ctgc.num_points++;
+    return TRUE;
+  }
+  else return FALSE;
+}
+
+tList* newNode(void)
+{
+  tList *newnode = (tList *) malloc(sizeof (tList));
+  newnode->next = NULL;
+
+  if (ctgc.head != NULL) 
+  {
+    tList *temp;
+    for(temp = ctgc.head; temp->next; temp = (tList *)temp->next);
+    temp->next = newnode;        /* coloca o novo item no final da lista */
+  }
+  else 
+    ctgc.head = newnode;
+
+  return newnode;
+}
+
+/*-------------------------------------------------------------------------*/
+/* Adiciona uma linha/rect/caixa a lista de primitivas.                    */
+/*-------------------------------------------------------------------------*/
+
+static int newtLB(int x1, int y1, int x2, int y2, int type)
+{
+  tList* newnode = newNode();
+
+  newnode->type = type;
+  newnode->par.lineboxpar.x1 = x1;
+  newnode->par.lineboxpar.x2 = x2;
+  newnode->par.lineboxpar.y1 = y1;
+  newnode->par.lineboxpar.y2 = y2;
+  newnode->par.lineboxpar.foreground = ctgc.foreground;
+  newnode->par.lineboxpar.background = ctgc.background;
+  newnode->par.lineboxpar.line_style = ctgc.line_style;
+  newnode->par.lineboxpar.line_width = ctgc.line_width;
+  newnode->par.lineboxpar.write_mode = ctgc.write_mode;
+  newnode->par.lineboxpar.line_cap = ctgc.line_cap;
+  newnode->par.lineboxpar.line_join = ctgc.line_join;
+  newnode->par.lineboxpar.interior_style = ctgc.interior_style;
+  newnode->par.lineboxpar.back_opacity = ctgc.back_opacity;
+  newnode->par.lineboxpar.hatch = ctgc.hatch;
+
+  return TRUE;                 
+}
+
+int newline(int x1, int y1, int x2, int y2)
+{
+  return newtLB(x1, y1, x2, y2, LINE);
+}
+
+int newrect(int x1, int x2, int y1, int y2)
+{
+  return newtLB(x1, y1, x2, y2, RECT);
+}
+
+int newbox(int x1, int x2, int y1, int y2)
+{
+  return newtLB(x1, y1, x2, y2, BOX);
+}
+
+/*-------------------------------------------------------------------------*/
+/* Adiciona um arc/sector/chord a lista de primitivas.                     */
+/*-------------------------------------------------------------------------*/
+static int newtAS(int xc, int yc, int w, int h, double angle1, double angle2, int type)
+{
+  tList* newnode = newNode();
+
+  newnode->type = type;
+  newnode->par.arcsectorpar.xc = xc;
+  newnode->par.arcsectorpar.yc = yc;
+  newnode->par.arcsectorpar.w = w;
+  newnode->par.arcsectorpar.h = h;
+  newnode->par.arcsectorpar.angle1 = angle1;
+  newnode->par.arcsectorpar.angle2 = angle2;
+  newnode->par.arcsectorpar.foreground = ctgc.foreground;
+  newnode->par.arcsectorpar.background = ctgc.background;
+  newnode->par.arcsectorpar.line_style = ctgc.line_style;
+  newnode->par.arcsectorpar.line_width = ctgc.line_width;
+  newnode->par.arcsectorpar.line_cap = ctgc.line_cap;
+  newnode->par.arcsectorpar.line_join = ctgc.line_join;
+  newnode->par.arcsectorpar.write_mode = ctgc.write_mode;
+  newnode->par.arcsectorpar.interior_style = ctgc.interior_style;
+  newnode->par.arcsectorpar.back_opacity = ctgc.back_opacity;
+  newnode->par.arcsectorpar.hatch = ctgc.hatch;
+
+  return TRUE;
+}
+
+int newarc(int xc, int yc, int w, int h, double angle1, double angle2)
+{
+  return newtAS(xc, yc, w, h, angle1, angle2, ARC);
+}
+
+int newsector(int xc, int yc, int w, int h, double angle1, double angle2)
+{
+  return newtAS(xc, yc, w, h, angle1, angle2, SECTOR);
+}
+
+int newchord(int xc, int yc, int w, int h, double angle1, double angle2)
+{
+  return newtAS(xc, yc, w, h, angle1, angle2, CHORD);
+}
+
+/*-------------------------------------------------------------------------*/
+/* Adiciona um pixel a lista de primitivas.                                */
+/*-------------------------------------------------------------------------*/
+int newpixel(int x, int y)
+{
+  tList* newnode = newNode();
+
+  newnode->type = PIXEL;
+  newnode->par.pixelpar.x = x;
+  newnode->par.pixelpar.y = y;
+  newnode->par.pixelpar.foreground = ctgc.foreground;
+  newnode->par.pixelpar.write_mode = ctgc.write_mode;
+
+  return TRUE;
+}
+
+/*-------------------------------------------------------------------------*/
+/* Adiciona um metafile a lista de primitivas.                             */
+/*-------------------------------------------------------------------------*/
+int newmetafile(char *filename, cdContext* ctx)
+{
+  tList* newnode = newNode();
+
+  newnode->type = META;
+  newnode->par.metapar.filename = (char *) malloc(strlen(filename) + 1);
+  newnode->par.metapar.ctx = ctx;
+  strcpy(newnode->par.metapar.filename, filename);
+
+  return TRUE;
+}
+
+/*-------------------------------------------------------------------------*/
+/* Adiciona uma marca a lista de primitivas.                               */
+/*-------------------------------------------------------------------------*/
+int newmark(int x, int y, int mark_size)
+{
+  tList* newnode = newNode();
+
+  newnode->type = MARK;
+  newnode->par.markpar.x = x;
+  newnode->par.markpar.y = y;
+  newnode->par.markpar.mark_size = mark_size;
+  newnode->par.markpar.foreground = ctgc.foreground;
+  newnode->par.markpar.write_mode = ctgc.write_mode;
+  newnode->par.markpar.mark_type = ctgc.mark_type;
+
+  return TRUE;
+}
+
+/*-------------------------------------------------------------------------*/
+/* Adiciona um texto a lista de primitivas.                                */
+/*-------------------------------------------------------------------------*/
+int newtext(int x, int y, char *s)
+{
+  tList* newnode = newNode();
+
+  newnode->type = TEXT;
+  newnode->par.textpar.x = x;
+  newnode->par.textpar.y = y;
+  newnode->par.textpar.foreground = ctgc.foreground;
+  newnode->par.textpar.background = ctgc.background;
+  newnode->par.textpar.font_style = ctgc.font_style;
+  newnode->par.textpar.font_typeface = ctgc.font_typeface;
+  newnode->par.textpar.font_size = ctgc.font_size;
+  newnode->par.textpar.write_mode = ctgc.write_mode;
+  newnode->par.textpar.back_opacity = ctgc.back_opacity;
+  newnode->par.textpar.text_alignment = ctgc.text_alignment;
+  newnode->par.textpar.text_orientation = ctgc.text_orientation;
+  newnode->par.textpar.s = (char *) malloc(strlen(s) + 1);
+  strcpy(newnode->par.textpar.s, s);
+
+  return TRUE;
+}
+
+/*-------------------------------------------------------------------------*/
+/* Adiciona um poligono a lista de primitivas.                             */
+/*-------------------------------------------------------------------------*/
+int newpoly(void)
+{
+  tList* newnode = newNode();
+
+  newnode->type = POLY;
+  newnode->par.polypar.foreground = ctgc.foreground;
+  newnode->par.polypar.background = ctgc.background;
+  newnode->par.polypar.line_style = ctgc.line_style;
+  newnode->par.polypar.line_width = ctgc.line_width;
+  newnode->par.polypar.write_mode = ctgc.write_mode;
+  newnode->par.polypar.fill_mode = ctgc.fill_mode;
+  newnode->par.polypar.line_cap = ctgc.line_cap;
+  newnode->par.polypar.line_join = ctgc.line_join;
+  newnode->par.polypar.poly_mode = ctgc.poly_mode;
+  newnode->par.polypar.interior_style = ctgc.interior_style;
+  newnode->par.polypar.back_opacity = ctgc.back_opacity;
+  newnode->par.polypar.hatch = ctgc.hatch;
+  newnode->par.polypar.points = (tPoint *) malloc(ctgc.num_points*sizeof(tPoint));
+  newnode->par.polypar.num_points = ctgc.num_points;
+  memcpy(newnode->par.polypar.points, ctgc.points, ctgc.num_points*sizeof(tPoint));
+  newnode->next = NULL;
+
+  return TRUE;
+}
+
+/*-------------------------------------------------------------------------*/
+/* Mata a lista de primitivas.                                             */
+/*-------------------------------------------------------------------------*/
+void dellist(void)
+{
+  tList *killer, *back;
+
+  for (killer = ctgc.head; killer; killer = back) {
+    back = (tList *) (killer->next);
+    if (killer->type == TEXT) {         /* se for TEXT... */
+      free(killer->par.textpar.s);      /* ...mata a string */
+    }
+    if (killer->type == POLY) {         /* se for POLY... */
+      free(killer->par.polypar.points); /* ...mata os pontos */
+    }
+    free(killer);
+  }
+  ctgc.head = NULL;
+}
+
+/*-------------------------------------------------------------------------*/
+/* Mata a ultima primitiva.                                                */
+/*-------------------------------------------------------------------------*/
+void dellast(void)
+{
+  tList *killer;
+
+  if (ctgc.head == NULL ) return;
+  else if (ctgc.head->next == NULL) {
+    free(ctgc.head);
+    ctgc.head = NULL;
+  }
+  else {
+    for (killer = ctgc.head; killer->next->next; killer = killer->next);
+    free(killer->next);
+    killer->next = NULL;
+  }
+}
diff --git a/test/cdtest/rubber.c b/test/cdtest/rubber.c
new file mode 100644
index 0000000..80a5921
--- /dev/null
+++ b/test/cdtest/rubber.c
@@ -0,0 +1,387 @@
+/*=========================================================================*/
+/* RUBBER.C - 10/12/95                                                     */
+/* Funcoes para o desenho interativo das primitivas.                       */
+/*=========================================================================*/
+
+/*- Bibliotecas padrao usadas ---------------------------------------------*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+/*- Inclusao das bibliotecas IUP e CD: ------------------------------------*/
+#include <iup.h>
+#include <cd.h>
+#include <cdiup.h>
+
+/*- Prototypes e declaracoes do CD Test: ----------------------------------*/
+#include "cdtest.h"
+
+/*- Contexto do CD Test (declarado em CDTEST.C): --------------------------*/
+extern tCTC ctgc;
+
+/*- Parametros para o desenho das primitivas: -----------------------------*/
+extern tLinePos line_pos;
+extern tBoxPos box_pos;
+extern tPixelPos pixel_pos;
+extern tMarkPos mark_pos;
+extern tArcPos arc_pos;
+
+/*-------------------------------------------------------------------------*/
+/* Segue as coordenadas do mouse atualizando o TXT apropriado.             */
+/*-------------------------------------------------------------------------*/
+void follow(int x, int y)
+{
+  static char mx[10], my[10];
+  static char nx[10], ny[10];
+
+  sprintf(nx, "%d", x);
+  sprintf(ny, "%d", y);
+
+  switch(ctgc.cur_prim) {
+    case PIXEL:
+      /* atualiza os parametros do pixel */
+      pixel_pos.x = x;
+      pixel_pos.y = y;
+      /* atualiza a caixa de dialogo */
+      sprintf(mx, "%d", x);
+      sprintf(my, "%d", y);
+      IupSetAttribute(IupGetHandle("txtPixelX"), IUP_VALUE, mx);
+      IupSetAttribute(IupGetHandle("txtPixelY"), IUP_VALUE, my);
+      break;
+    case MARK:
+      /* atualiza os parametros da mark */
+      mark_pos.x = x;
+      mark_pos.y = y;
+      /* atualiza a caixa de dialogo */
+      sprintf(mx, "%d", x);
+      sprintf(my, "%d", y);
+      IupSetAttribute(IupGetHandle("txtMarkX"), IUP_VALUE, mx);
+      IupSetAttribute(IupGetHandle("txtMarkY"), IUP_VALUE, my);
+      break;
+    case RECT:
+    case BOX:
+      /* atualiza os parametros da box */
+      if (ctgc.following) {
+        if (x < box_pos.x) {
+          box_pos.xmin = x;
+          box_pos.xmax = box_pos.x;
+        }
+        else {
+          box_pos.xmax = x;
+          box_pos.xmin = box_pos.x;
+        }
+
+        if (y < box_pos.y) {
+          box_pos.ymin = y;
+          box_pos.ymax = box_pos.y;
+        }
+        else {
+          box_pos.ymax = y;
+          box_pos.ymin = box_pos.y;
+        }
+      }
+      else {
+        box_pos.xmax = box_pos.xmin = x;
+        box_pos.ymax = box_pos.ymin = y;
+      }  
+      /* atualiza a caixa de dialogo */
+      sprintf(mx, "%d", box_pos.xmin);
+      sprintf(nx, "%d", box_pos.xmax);
+      sprintf(my, "%d", box_pos.ymin);
+      sprintf(ny, "%d", box_pos.ymax);
+      IupSetAttribute(IupGetHandle("txtLBX1"), IUP_VALUE, mx);
+      IupSetAttribute(IupGetHandle("txtLBX2"), IUP_VALUE, nx);
+      IupSetAttribute(IupGetHandle("txtLBY1"), IUP_VALUE, my);
+      IupSetAttribute(IupGetHandle("txtLBY2"), IUP_VALUE, ny);
+      break;
+    case LINE:
+      sprintf(mx, "%d", x);
+      sprintf(my, "%d", y);
+      line_pos.x2 = x;
+      line_pos.y2 = y;
+      if (ctgc.following) {
+        IupSetAttribute(IupGetHandle("txtLBX2"), IUP_VALUE, mx);
+        IupSetAttribute(IupGetHandle("txtLBY2"), IUP_VALUE, my);
+      }
+      else {
+        line_pos.x1 = x;
+        line_pos.y1 = y;
+        IupSetAttribute(IupGetHandle("txtLBX1"), IUP_VALUE, mx);
+        IupSetAttribute(IupGetHandle("txtLBX2"), IUP_VALUE, mx);
+        IupSetAttribute(IupGetHandle("txtLBY1"), IUP_VALUE, my);
+        IupSetAttribute(IupGetHandle("txtLBY2"), IUP_VALUE, my);
+      }
+      break;
+    case ARC:    /* ARC e SECTOR... */
+    case CHORD: 
+    case SECTOR: /* ...sao equivalentes */
+      if (ctgc.following) {
+        /* atualiza os parametros do arc */
+        arc_pos.w = 2*abs(arc_pos.xc-x+1);
+        arc_pos.h = 2*abs(arc_pos.yc-y+1);
+        /* atualiza a caixa de dialogo */
+        sprintf(mx, "%d", arc_pos.w);
+        sprintf(my, "%d", arc_pos.h);
+        IupSetAttribute(IupGetHandle("txtASW"), IUP_VALUE, mx);
+        IupSetAttribute(IupGetHandle("txtASH"), IUP_VALUE, my);
+      }
+      else {
+        /* atualiza os parametros do arc */
+        arc_pos.xc = x;
+        arc_pos.xc = y;
+        /* atualiza a caixa de dialogo */
+        sprintf(mx, "%d", x);
+        sprintf(my, "%d", y);
+        IupSetAttribute(IupGetHandle("txtASXC"), IUP_VALUE, mx);
+        IupSetAttribute(IupGetHandle("txtASYC"), IUP_VALUE, my);
+      }
+      break;
+    case TEXT:
+      IupSetAttribute(IupGetHandle("txtTextX"), IUP_VALUE, nx);
+      IupSetAttribute(IupGetHandle("txtTextY"), IUP_VALUE, ny);
+      break;
+    case CLIP:
+      if (ctgc.following) {
+        if (atoi(nx) >= atoi(mx)) {
+          IupSetAttribute(IupGetHandle("txtClipXmax"), IUP_VALUE, nx);
+          IupSetAttribute(IupGetHandle("txtClipXmin"), IUP_VALUE, mx);
+        }
+        else {
+          IupSetAttribute(IupGetHandle("txtClipXmin"), IUP_VALUE, nx);
+          IupSetAttribute(IupGetHandle("txtClipXmax"), IUP_VALUE, mx);
+        }
+        if (atoi(ny) >= atoi(my)) {
+          IupSetAttribute(IupGetHandle("txtClipYmax"), IUP_VALUE, ny);
+          IupSetAttribute(IupGetHandle("txtClipYmin"), IUP_VALUE, my);
+        }
+        else {
+          IupSetAttribute(IupGetHandle("txtClipYmin"), IUP_VALUE, ny);
+          IupSetAttribute(IupGetHandle("txtClipYmax"), IUP_VALUE, my);
+        }
+      }
+      else {
+        IupSetAttribute(IupGetHandle("txtClipXmin"), IUP_VALUE, nx);
+        IupSetAttribute(IupGetHandle("txtClipYmin"), IUP_VALUE, ny);
+        IupSetAttribute(IupGetHandle("txtClipXmax"), IUP_VALUE, nx);
+        IupSetAttribute(IupGetHandle("txtClipYmax"), IUP_VALUE, ny);
+        strcpy(mx, nx);
+        strcpy(my, ny);
+      }
+      break;
+    case IMAGE:
+      if (ctgc.following) {
+        if (atoi(mx) <= atoi(nx)) {
+          sprintf(nx, "%d", abs(atoi(nx)-atoi(mx)));
+          IupSetAttribute(IupGetHandle("txtImageW"), IUP_VALUE, nx);
+        }
+        else {
+          IupSetAttribute(IupGetHandle("txtImageX"), IUP_VALUE, nx);
+          sprintf(nx, "%d", abs(atoi(nx)-atoi(mx)));
+          IupSetAttribute(IupGetHandle("txtImageW"), IUP_VALUE, nx);
+        }
+        if (atoi(my) <= atoi(ny)) {
+          sprintf(ny, "%d", abs(atoi(ny)-atoi(my)));
+          IupSetAttribute(IupGetHandle("txtImageH"), IUP_VALUE, ny);
+        }
+        else {
+          IupSetAttribute(IupGetHandle("txtImageY"), IUP_VALUE, ny);
+          sprintf(ny, "%d", abs(atoi(ny)-atoi(my)));
+          IupSetAttribute(IupGetHandle("txtImageH"), IUP_VALUE, ny);
+        }
+      }
+      else {
+        IupSetAttribute(IupGetHandle("txtImageX"), IUP_VALUE, nx);
+        IupSetAttribute(IupGetHandle("txtImageY"), IUP_VALUE, ny);
+        strcpy(mx, nx);
+        strcpy(my, ny);
+      }
+      break;
+    case RGB:
+      if (ctgc.following) {
+        if (atoi(mx) <= atoi(nx)) {
+          sprintf(nx, "%d", abs(atoi(nx)-atoi(mx)));
+          IupSetAttribute(IupGetHandle("txtImageRGBW"), IUP_VALUE, nx);
+        }
+        else {
+          IupSetAttribute(IupGetHandle("txtImageRGBX"), IUP_VALUE, nx);
+          sprintf(nx, "%d", abs(atoi(nx)-atoi(mx)));
+          IupSetAttribute(IupGetHandle("txtImageRGBW"), IUP_VALUE, nx);
+        }
+        if (atoi(my) <= atoi(ny)) {
+          sprintf(ny, "%d", abs(atoi(ny)-atoi(my)));
+          IupSetAttribute(IupGetHandle("txtImageRGBH"), IUP_VALUE, ny);
+        }
+        else {
+          IupSetAttribute(IupGetHandle("txtImageRGBY"), IUP_VALUE, ny);
+          sprintf(ny, "%d", abs(atoi(ny)-atoi(my)));
+          IupSetAttribute(IupGetHandle("txtImageRGBH"), IUP_VALUE, ny);
+        }
+      }
+      else {
+        IupSetAttribute(IupGetHandle("txtImageRGBX"), IUP_VALUE, nx);
+        IupSetAttribute(IupGetHandle("txtImageRGBY"), IUP_VALUE, ny);
+        strcpy(mx, nx);
+        strcpy(my, ny);
+      }
+      break;
+    default:
+      break;
+  }
+}
+
+
+/*-------------------------------------------------------------------------*/
+/* Desenha uma linha em rubber band.                                       */
+/*-------------------------------------------------------------------------*/
+void line(tRubber what, int x, int y)
+{
+  static int x1, x2, y1, y2;
+  static int lastwhat = CLOSE;
+
+  switch (what) {
+    case NEWPOINT:
+      x1 = x2 = x;                   /* novo segmento comeca no... */
+      y1 = y2 = y;                   /* ...fim do primeiro */
+      break;
+    case MOVE:
+      if (lastwhat == MOVE) {
+        cdLine(x1, y1, x2, y2);      /* apaga o segmento velho */
+      }
+      cdLine(x1, y1, x, y);          /* desenha o novo */
+      x2 = x;                        /* o novo se... */
+      y2 = y;                        /* ...torna velho */
+      break;
+    case REPAINT:
+      cdLine(x1, y1, x2, y2);        /* recupera o segmento perdido */
+      return;                        /* nao modifica lastwhat */
+    case CLOSE:
+      cdLine(x1, y1, x2, y2);        /* apaga o ultimo segmento */
+      break;
+    default:
+      break;
+  }
+  lastwhat = what;
+}
+
+/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+/* Desenha uma caixa vazia (funcao nao exportada).                         */
+/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
+static void frame(int x1, int y1, int x2, int y2)
+{
+  cdLine(x1, y1, x1, y2);
+  cdLine(x2, y1, x2, y2);
+  cdLine(x1, y1, x2, y1);
+  cdLine(x1, y2, x2, y2);
+}
+
+/*-------------------------------------------------------------------------*/
+/* Desenha uma caixa em rubber band.                                       */
+/*-------------------------------------------------------------------------*/
+void box(tRubber what, int x, int y)
+{
+  static int x1, x2, y1, y2;
+  static int lastwhat = CLOSE;
+
+  switch (what) {
+    case NEWPOINT:
+      x1 = x2 = x;                   /* novo segmento comeca no... */
+      y1 = y2 = y;                   /* fim do primeiro */
+      break;
+    case MOVE:
+      if (lastwhat == MOVE) {
+        frame(x1, y1, x2, y2);       /* apaga a caixa anterior */
+      }
+      frame(x1, y1, x, y);           /* desenha a nova */
+      x2 = x;                        /* o novo se... */
+      y2 = y;                        /* torna velho */
+      break;
+    case REPAINT:
+      frame(x1, y1, x2, y2);         /* restaura a caixa perdida */
+      return;                        /* nao modifica lastwhat */
+    case CLOSE:
+      frame(x1, y1, x2, y2);         /* apaga a caixa definitiva */
+      break;
+    default:
+      break;
+  }
+  lastwhat = what;
+}
+
+/*-------------------------------------------------------------------------*/
+/* Desenha uma caixa centrada, em rubber band.                             */
+/*-------------------------------------------------------------------------*/
+void arc(tRubber what, int x, int y)
+{
+  static int xc, yc, y1, x1;
+  static int lastwhat = CLOSE;
+
+  switch (what) {
+    case CENTER:
+      xc = x1 = x;                   /* novo segmento comeca no... */
+      yc = y1 = y;                   /* fim do primeiro */
+      break;
+    case MOVE:
+      if (lastwhat == MOVE) {
+        cdArc(xc, yc, 2*abs(xc-x1+1), 2*abs(yc-y1+1), 0, 360);
+      }
+      cdArc(xc, yc, 2*abs(xc-x+1), 2*abs(yc-y+1), 0, 360);
+      x1 = x;                        /* o novo se... */
+      y1 = y;                        /* torna velho */
+      break;
+    case REPAINT:
+      cdArc(xc, yc, 2*abs(xc-x1+1), 2*abs(yc-y1+1), 0, 360);
+      return;                        /* nao modifica lastwhat */
+    case CLOSE:
+      cdArc(xc, yc, 2*abs(xc-x1+1), 2*abs(yc-y1+1), 0, 360);
+      break;
+    default:
+      break;
+  }
+  lastwhat = what;
+}
+
+/*-------------------------------------------------------------------------*/
+/* Desenha o poligono em rubber band.                                      */
+/*-------------------------------------------------------------------------*/
+void polygon(tRubber what, int x, int y)
+{
+  static int x1, x2, y1, y2;
+  static int lastwhat = CLOSE;
+
+  switch (what) {
+    case NEWPOINT:
+      if (lastwhat != CLOSE) {
+        cdLine(x1, y1, x2, y2);      /* ...apaga a anterior e... */
+        cdLine(x1, y1, x, y);        /* desenha a definitiva */
+      }
+      x1 = x;                        /* novo segmento comeca no... */
+      y1 = y;                        /* fim do primeiro */
+      break;
+    case MOVE:
+      if (lastwhat == MOVE) {
+        cdLine(x1, y1, x2, y2);      /* apaga o segmento velho */
+      }
+      cdLine(x1, y1, x, y);          /* desenha o novo */
+      x2 = x;                        /* o novo se... */
+      y2 = y;                        /* torna velho */
+      break;
+    case REPAINT:
+      cdLine(x1, y1, x2, y2);        /* recupera o segmento perdido */
+      return;                        /* nao modifica lastwhat */
+    case CLOSE: 
+      if (lastwhat != CLOSE) {
+        int i;
+        cdLine(x1, y1, x2, y2);        /* apaga o ultimo segmento */
+        /* apaga o poligono temporario inteiro */
+        for (i=0; (i<ctgc.num_points-1); i++) {
+          cdLine(ctgc.points[i].x, ctgc.points[i].y,
+                 ctgc.points[i+1].x, ctgc.points[i+1].y);
+        }
+      }
+      break;
+    default:
+      break;
+  }
+  lastwhat = what;
+}
diff --git a/test/lua/cdalign.wlua b/test/lua/cdalign.wlua
new file mode 100644
index 0000000..849d258
--- /dev/null
+++ b/test/lua/cdalign.wlua
@@ -0,0 +1,67 @@
+require("iupcdaux") -- utility module used in some samples
+
+dlg = iupcdaux.new_dialog(w, h)
+cnv = dlg[1]     -- retrieve the IUP canvas
+
+function DrawText(canvas, x, y, text, align)
+  canvas:TextAlignment(align)
+  canvas:Mark(x, y)
+  canvas:Text(x, y, text)
+  xmin, xmax, ymin, ymax = canvas:GetTextBox(x, y, text)
+  canvas:Rect(xmin, xmax, ymin, ymax)
+end
+
+text_aligment = {
+ cd.NORTH,
+ cd.SOUTH,
+ cd.EAST,
+ cd.WEST,
+ cd.NORTH_EAST,
+ cd.NORTH_WEST,
+ cd.SOUTH_EAST,
+ cd.SOUTH_WEST,
+ cd.CENTER,
+ cd.BASE_LEFT,
+ cd.BASE_CENTER,
+ cd.BASE_RIGHT
+}
+
+text_aligment_str = {
+ "NORTH",
+ "SOUTH",
+ "EAST",
+ "WEST",
+ "NORTH EAST",
+ "NORTH WEST",
+ "SOUTH EAST",
+ "SOUTH WEST",
+ "CENTER",
+ "BASE LEFT",
+ "BASE CENTER",
+ "BASE RIGHT"
+}
+
+
+-- custom function used in action callback
+-- from the iupcdaux module
+function cnv:Draw(canvas)
+  canvas:MarkSize(40)
+  canvas:Font("Courier", cd.PLAIN, 12)
+
+  i = 1
+  while (i <= 12) do
+    DrawText(canvas, 100, 35*i + 30, text_aligment_str[i], text_aligment[i])
+    i = i + 1
+  end
+end
+
+
+--tmpCanvas = cd.CreateCanvas(cd.PS, "cdalign.ps")
+--tmpCanvas:Clear()
+--cnv:Draw(tmpCanvas)
+--tmpCanvas:Kill()
+
+
+dlg:show()
+iup.MainLoop()
+
diff --git a/test/lua/cdtext.wlua b/test/lua/cdtext.wlua
new file mode 100644
index 0000000..556d02f
--- /dev/null
+++ b/test/lua/cdtext.wlua
@@ -0,0 +1,59 @@
+require("iupcdaux") -- utility module used in some samples
+
+--require"cdluacontextplus"
+--cd.UseContextPlus(1)
+
+dlg = iupcdaux.new_dialog(w, h)
+cnv = dlg[1]     -- retrieve the IUP canvas
+
+function DrawTextBox(canvas, x, y, text)
+  canvas:Mark(x, y)
+  canvas:Text(x, y, text)
+  w, h = canvas:GetTextSize(text)
+  xmin = x - w/2
+  ymin = y - h/2
+  xmax = x + w/2
+  ymax = y + h/2
+  canvas:Line(xmin, ymin, xmax, ymin)
+  canvas:Line(xmin, ymin, xmin, ymax)
+  canvas:Line(xmin, ymax, xmax, ymax)
+  canvas:Line(xmax, ymin, xmax, ymax)
+end
+
+-- custom function used in action callback
+-- from the iupcdaux module
+function cnv:Draw(canvas)
+
+  -- Available in ContextPlus drivers or in IMAGERGB driver
+  -- canvas:SetAttribute("ANTIALIAS", "1")
+
+  canvas:TextAlignment(cd.CENTER)
+  canvas:MarkSize(40)
+
+  canvas:Font("Courier", cd.PLAIN, 12)
+  local aa = canvas:GetAttribute("ANTIALIAS")
+  if (aa == "1") then
+    DrawTextBox(canvas, 130, 30, "ANTIALIAS=1")
+  else
+    DrawTextBox(canvas, 130, 30, "ANTIALIAS=0")
+  end
+
+  canvas:Font("Courier", cd.ITALIC, 34)
+  DrawTextBox(canvas, 130, 160, "xxxxxppx")
+
+  canvas:Font("Times", cd.PLAIN, 12)
+  DrawTextBox(canvas, 130, 290, "taaaa")
+
+  canvas:Font("Times", cd.BOLD, 14)
+  DrawTextBox(canvas, 130, 370, "gggggggg")
+end
+
+
+--tmpCanvas = cd.CreateCanvas(cd.PS, "cdtext.ps")
+--tmpCanvas:Clear()
+--cnv:Draw(tmpCanvas)
+--tmpCanvas:Kill()
+
+
+dlg:show()
+iup.MainLoop()
diff --git a/test/lua/imagergb.wlua b/test/lua/imagergb.wlua
new file mode 100644
index 0000000..b7c6f11
--- /dev/null
+++ b/test/lua/imagergb.wlua
@@ -0,0 +1,35 @@
+require("iupcdaux") -- utility module used in some samples
+
+w = 100
+h = 100
+
+image_rgb = cd.CreateImageRGB(w, h)
+
+size = w * h
+i = 0
+while i < size do
+
+  if i < size/2 then
+    image_rgb.r[i] = 255
+    image_rgb.g[i] = 0
+    image_rgb.b[i] = 0
+  else
+    image_rgb.r[i] = 0
+    image_rgb.g[i] = 0
+    image_rgb.b[i] = 255
+  end
+
+  i = i + 1
+end
+
+dlg = iupcdaux.new_dialog(w, h)
+cnv = dlg[1]     -- retrieve the IUP canvas
+
+-- custom function used in action callback
+-- from the iupcdaux module
+function cnv:Draw(canvas)
+  canvas:PutImageRectRGB(image_rgb, 0, 0, w, h, 0, 0, 0, 0)
+end
+
+dlg:show()
+iup.MainLoop()
diff --git a/test/lua/iupcdaux.lua b/test/lua/iupcdaux.lua
new file mode 100644
index 0000000..a56ac1a
--- /dev/null
+++ b/test/lua/iupcdaux.lua
@@ -0,0 +1,45 @@
+require"cdlua"
+require"cdluaiup"
+require"iuplua"
+
+iupcdaux = {}
+iupcdaux.count = 0
+
+-- Function to easy create a new IUP dialog with an IUP canvas,
+-- and a CD canvas pointing to that IUP canvas
+
+function iupcdaux.new_dialog(w, h)
+
+  -- defaul size
+  w = w or 300
+  h = h or 200
+  
+  cnv = iup.canvas { bgcolor="255 255 255", rastersize=w.."x"..h }
+  dlg = iup.dialog { cnv; title="canvas_"..(iupcdaux.count+1) }
+
+  function cnv:map_cb()
+    canvas = cd.CreateCanvas(cd.IUP, self)
+    self.canvas = canvas     -- store the CD canvas in a IUP attribute
+  end
+  
+  function cnv:action()
+    canvas = self.canvas     -- retrieve the CD canvas from the IUP attribute
+    canvas:Activate()
+    canvas:Clear()
+    
+    if (self.Draw) then
+      self:Draw(canvas)
+    end
+  end
+
+  function dlg:close_cb()
+    cnv = self[1]
+    canvas = cnv.canvas     -- retrieve the CD canvas from the IUP attribute
+    canvas:Kill()
+    self:destroy()
+    return iup.IGNORE -- because we destroy the dialog
+  end
+
+  iupcdaux.count = iupcdaux.count + 1
+  return dlg
+end
diff --git a/test/lua/iuplua_cdlua.wlua b/test/lua/iuplua_cdlua.wlua
new file mode 100644
index 0000000..f595987
--- /dev/null
+++ b/test/lua/iuplua_cdlua.wlua
@@ -0,0 +1,58 @@
+require"iuplua"
+require"cdlua"
+require"cdluaiup"
+
+cnv = iup.canvas {size = "200x100"}
+
+box = iup.vbox{
+       iup.button { title="Version" },
+       cnv,
+       iup.button { title="Close" },
+     }
+
+dlg = iup.dialog{box; title="Example IUPLUA/CDLUA"}
+
+function cnv:map_cb()
+  canvas = cd.CreateCanvas(cd.IUP, self)
+  self.canvas = canvas     -- store the CD canvas in a IUP attribute
+end
+
+function dlg:close_cb()
+  cnv = self[1][2]
+  canvas = cnv.canvas     -- retrieve the CD canvas from the IUP attribute
+  canvas:Kill()
+  self:destroy()
+  return iup.IGNORE -- because we destroy the dialog
+end
+
+bt_version = dlg[1][1]
+function bt_version:action()
+  iup.Message("Version", "CD Version: " .. cd.Version() .. "\nIUP Version: " .. iup.Version() .. "\n" .. _VERSION)
+end
+
+bt_close = dlg[1][3]
+function bt_close:action()
+  return iup.CLOSE
+end
+
+function cnv:action()
+  canvas = self.canvas     -- retrieve the CD canvas from the IUP attribute
+
+  canvas:Activate()
+  canvas:Clear()
+  canvas:Foreground (cd.RED)
+  canvas:Box (10, 55, 10, 55)
+  canvas:Foreground(cd.EncodeColor(255, 32, 140))
+  canvas:Line(0, 0, 300, 100)
+end
+
+function cnv:button_cb(b, e, x, y, r)
+  print ("Button: " .. "Button="..tostring(b).." Pressed="..tostring(e).." X="..tostring(x).." Y="..tostring(y) )
+end
+
+function cnv:resize_cb(w, h)
+  print("Resize: Width="..w.."   Height="..h)
+end
+
+dlg:show()
+iup.MainLoop()
diff --git a/test/lua/rubberband.wlua b/test/lua/rubberband.wlua
new file mode 100644
index 0000000..595373a
--- /dev/null
+++ b/test/lua/rubberband.wlua
@@ -0,0 +1,54 @@
+require("iupcdaux") -- utility module used in some samples
+
+dlg = iupcdaux.new_dialog(w, h)
+cnv = dlg[1]     -- retrieve the IUP canvas
+
+
+function cnv:button_cb(button,pressed,x,y,r)
+  canvas = self.canvas     -- retrieve the CD canvas from the IUP attribute
+
+  -- start drag if button1 is pressed
+  if button ==iup.BUTTON1 and pressed == 1 then
+    y = canvas:UpdateYAxis(y)
+
+    -- prepare for XOR
+    canvas:Foreground(cd.WHITE)
+    canvas:WriteMode(cd.XOR)
+
+    xstart = x
+    ystart = y
+    drag = 1
+    first = 1
+  else
+    if (drag == 1) then
+      drag = 0
+      canvas:Rect(xstart,xend,ystart,yend)
+    end
+  end
+end
+
+
+function cnv:motion_cb(x,y,r)
+  canvas = self.canvas     -- retrieve the CD canvas from the IUP attribute
+
+  if (drag == 1) then
+    y = canvas:UpdateYAxis(y)
+
+    if (first == 1) then
+      first = 0
+    else
+      canvas:Rect(xstart,xend,ystart,yend)
+    end
+
+    canvas:Rect(xstart,x,ystart,y)
+
+    xend = x
+    yend = y
+  end
+end
+
+first = 1
+drag = 0
+
+dlg:show()
+iup.MainLoop()
diff --git a/test/metafile.c b/test/metafile.c
new file mode 100644
index 0000000..ab34795
--- /dev/null
+++ b/test/metafile.c
@@ -0,0 +1,107 @@
+#include <cd.h>
+#include <cdmf.h>
+void draw();
+int marktype;
+
+void main(void)
+{
+	cdCanvas *canvas;
+	canvas = cdCreateCanvas(CD_METAFILE,"TESTE.MF 100x100");
+	cdActivate(canvas);
+	draw();
+	cdKillCanvas(canvas);
+}
+
+void draw(void)
+{
+	cdMarkSize(5)
+	cdMarkType(CD_PLUS);
+	cdMark(10,90);
+	cdMarkType(CD_STAR);
+	cdMark(20,90);
+	cdMarkType(CD_CIRCLE);
+	cdMark(30,90);
+	cdMarkType(CD_X);
+	cdMark(40,90);
+	cdMarkType(CD_BOX);
+	cdMark(50,90);
+	cdMarkType(CD_DIAMOND);
+	cdMark(60,90);
+	cdMarkType(CD_HOLLOW_CIRCLE);
+	cdMark(70,90);
+	cdMarkType(CD_HOLLOW_BOX);
+	cdMark(80,90);
+	cdMarkType(CD_HOLLOW_DIAMOND);
+	cdMark(90,90);
+
+	cdLineStyle(CD_CONTINUOUS);
+	cdLine(10,80,80,80);
+	cdLineStyle(CD_DASHED);
+	cdLine(10,75,80,75);
+	cdLineStyle(CD_DOTTED);
+	cdLine(10,70,80,70);
+	cdLineStyle(CD_DASH_DOT);
+	cdLine(10,65,80,65);
+	cdLineStyle(CD_DASH_DOT_DOT);
+	cdLine(10,60,80,60);
+
+	cdLineStyle(CD_CONTINUOUS);
+
+	cdHatch(CD_HORIZONTAL);
+
+	cdBegin(CD_FILL);
+	cdVertex(10,50);
+	cdVertex(50,50);
+	cdVertex(50,10);
+	cdVertex(10,10);
+	cdEnd();
+
+	cdHatch(CD_VERTICAL);
+	cdBegin(CD_FILL);
+	cdVertex(60,50);
+	cdVertex(100,50);
+	cdVertex(100,10);
+	cdVertex(60,10);
+	cdEnd();	
+
+	cdHatch(CD_FDIAGONAL);
+	cdBegin(CD_FILL);
+	cdVertex(110,50);
+	cdVertex(150,50);
+	cdVertex(150,10);
+	cdVertex(110,10);
+	cdEnd();	
+
+	cdHatch(CD_BDIAGONAL);
+	cdBegin(CD_FILL);
+	cdVertex(160,50);
+	cdVertex(200,50);
+	cdVertex(200,10);
+	cdVertex(160,10);
+	cdEnd();	
+
+	cdHatch(CD_CROSS);
+	cdBegin(CD_FILL);
+	cdVertex(210,50);
+	cdVertex(250,50);
+	cdVertex(250,10);
+	cdVertex(210,10);
+	cdEnd();	
+
+	cdHatch(CD_DIAGCROSS);
+	cdBegin(CD_FILL);
+	cdVertex(260,50);
+	cdVertex(300,50);
+	cdVertex(300,10);
+	cdVertex(260,10);
+	cdEnd();	
+	
+	cdFont(CD_SYSTEM,CD_BOLD,CD_STANDARD);
+	cdText(10,100,'Teste');
+	cdFont(CD_COURIER,CD_BOLD,CD_STANDARD);
+	cdText(60,100,'Teste');
+	cdFont(CD_TIMES_ROMAN,CD_BOLD,CD_STANDARD);
+	cdText(110,100,'Teste');
+	cdFont(CD_HELVETICA,CD_BOLD,CD_STANDARD);
+	cdText(160,100,'Teste');
+}
diff --git a/test/mf/align.mf b/test/mf/align.mf
new file mode 100644
index 0000000..110ac39
--- /dev/null
+++ b/test/mf/align.mf
@@ -0,0 +1,45 @@
+CDMF 383 410
+27 255 255 255
+28 0 0 0
+13 1
+14 0
+15 0
+16 1
+18 0
+17 0
+21 0 0 12
+23 9
+33 0
+24 1
+25 10
+1
+25 5
+27 0 255 255
+12 151 328
+21 2 0 10
+8 151 329 TMWjfgoiu�
+23 10
+8 150 328 TMWjfgoiu�
+23 11
+8 151 327 TMWjfgoiu�
+12 151 253
+23 0
+8 151 253 TMWjfgoiu�
+23 1
+8 151 252 TMWjfgoiu�
+23 2
+8 150 254 TMWjfgoiu�
+23 3
+8 152 255 TMWjfgoiu�
+12 285 335
+23 8
+8 285 336 TMWjfgoiu�
+12 150 151
+23 4
+8 151 151 TMWjfgoiu�
+23 5
+8 150 151 TMWjfgoiu�
+23 6
+8 149 152 TMWjfgoiu�
+23 7
+8 149 152 TMWjfgoiu�
diff --git a/test/mf/alignorient.mf b/test/mf/alignorient.mf
new file mode 100644
index 0000000..dbaa907
--- /dev/null
+++ b/test/mf/alignorient.mf
@@ -0,0 +1,44 @@
+CDMF 383 410
+27 255 255 255
+28 0 255 255
+13 1
+14 1
+15 0
+16 1
+18 0
+17 0
+21 0 0 12
+23 9
+33 60
+24 1
+25 10
+1
+25 5
+12 151 328
+21 2 0 24
+8 151 329 Text
+23 10
+8 150 328 Text
+23 11
+8 151 327 Text
+12 151 253
+23 0
+8 151 253 Text
+23 1
+8 151 252 Text
+23 2
+8 150 254 Text
+23 3
+8 152 255 Text
+12 285 335
+23 8
+8 285 336 Text
+12 150 151
+23 4
+8 151 151 Text
+23 5
+8 150 151 Text
+23 6
+8 149 152 Text
+23 7
+8 149 152 Text
diff --git a/test/mf/alignxor.mf b/test/mf/alignxor.mf
new file mode 100644
index 0000000..0b7f25d
--- /dev/null
+++ b/test/mf/alignxor.mf
@@ -0,0 +1,44 @@
+CDMF 383 410
+27 255 255 255
+28 0 255 255
+13 0
+14 1
+15 0
+16 1
+18 0
+17 0
+21 0 0 12
+23 9
+33 0
+24 1
+25 10
+1
+25 5
+12 151 328
+21 2 0 24
+8 151 329 Text
+23 10
+8 150 328 Text
+23 11
+8 151 327 Text
+12 151 253
+23 0
+8 151 253 Text
+23 1
+8 151 252 Text
+23 2
+8 150 254 Text
+23 3
+8 152 255 Text
+12 285 335
+23 8
+8 285 336 Text
+12 150 151
+23 4
+8 151 151 Text
+23 5
+8 150 151 Text
+23 6
+8 149 152 Text
+23 7
+8 149 152 Text
diff --git a/test/mf/arc.mf b/test/mf/arc.mf
new file mode 100644
index 0000000..cf4a8b7
--- /dev/null
+++ b/test/mf/arc.mf
@@ -0,0 +1,25 @@
+CDMF 383 410
+27 255 255 255
+28 0 0 0
+13 1
+14 0
+15 0
+16 1
+18 0
+17 0
+21 0 0 12
+23 9
+33 0
+24 1
+25 10
+1
+13 0
+6 59 351 74 84 0 360
+6 185 348 86 76 0 180
+6 155 309 94 60 180 360
+6 307 284 86 84 180 360
+6 55 218 80 72 0 90
+6 181 190 66 84 90 180
+6 79 124 86 96 180 270
+6 236 150 82 92 45 100
+6 228 104 112 118 100 200
diff --git a/test/mf/circles.mf b/test/mf/circles.mf
new file mode 100644
index 0000000..e1ea53c
--- /dev/null
+++ b/test/mf/circles.mf
@@ -0,0 +1,47 @@
+CDMF 619334269 619334269
+27 255 255 255
+28 0 0 0
+13 1
+14 0
+15 0
+16 1
+60 0
+61 0
+18 0
+17 0
+74 0 12 System
+23 9
+33 0
+20 10 10
+255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 19 10 10
+0 0 0 0 0 0 0 0 0 0 
+0 1 1 1 1 1 0 0 0 0 
+0 1 0 0 0 1 1 0 0 0 
+0 1 0 0 0 1 0 1 0 0 
+0 1 0 0 0 1 0 0 1 0 
+0 1 1 1 1 1 0 0 1 0 
+0 0 1 0 0 0 1 0 1 0 
+0 0 0 1 0 0 0 1 1 0 
+0 0 0 0 1 1 1 1 1 0 
+0 0 0 0 0 0 0 0 0 0 
+17 0
+1
+3 0 272 0 396
+6 582 376 788 718 0 360
+6 555 359 376 374 0 360
+6 537 360 124 116 0 360
+6 534 359 32 32 0 360
+6 534 359 8 8 0 360
+6 858 436 4 4 0 360
+6 869 425 4 6 0 360
+6 851 424 2 2 0 360
diff --git a/test/mf/cliparea.mf b/test/mf/cliparea.mf
new file mode 100644
index 0000000..eb5a938
--- /dev/null
+++ b/test/mf/cliparea.mf
@@ -0,0 +1,80 @@
+CDMF 499 442
+27 255 255 255
+28 0 0 0
+13 1
+14 0
+15 0
+16 1
+18 0
+17 0
+21 0 0 12
+23 9
+33 0
+24 1
+25 10
+20 10 10
+255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 19 10 10
+0 0 0 0 0 0 0 0 0 0 
+0 1 1 1 1 1 0 0 0 0 
+0 1 0 0 0 1 1 0 0 0 
+0 1 0 0 0 1 0 1 0 0 
+0 1 0 0 0 1 0 0 1 0 
+0 1 1 1 1 1 0 0 1 0 
+0 0 1 0 0 0 1 0 1 0 
+0 0 0 1 0 0 0 1 1 0 
+0 0 0 0 1 1 1 1 1 0 
+0 0 0 0 0 0 0 0 0 0 
+1
+3 72 308 136 284
+2 1
+28 255 0 0
+18 0
+17 0
+5 7 369 38 368
+27 0 0 0
+4 144 347 376 144
+28 0 0 255
+4 214 329 362 161
+4 202 136 362 220
+4 18 282 169 83
+27 255 255 255
+34 27 161 211 318
+27 0 0 0
+6 56 190 114 72 0 360
+27 255 255 255
+18 0
+17 0
+7 166 150 52 60 0 360
+8 57 129 Text
+8 92 132 Text
+8 101 134 Text
+8 166 278 Text
+8 169 287 Text
+8 206 285 Text
+18 0
+17 0
+9 1
+10 190 260
+10 305 342
+10 399 254
+10 262 197
+10 181 220
+11
+18 0
+17 0
+9 0
+10 120 253
+10 72 324
+10 134 326
+10 141 294
+11
diff --git a/test/mf/fill.mf b/test/mf/fill.mf
new file mode 100644
index 0000000..8367875
--- /dev/null
+++ b/test/mf/fill.mf
@@ -0,0 +1,48 @@
+CDMF 480 405
+27 255 255 255
+28 0 0 0
+13 1
+14 0
+15 0
+16 1
+18 0
+17 0
+21 0 0 12
+23 9
+33 0
+24 1
+25 10
+20 10 10
+255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 19 10 10
+0 0 0 0 0 0 0 0 0 0 
+0 1 1 1 1 1 0 0 0 0 
+0 1 0 0 0 1 1 0 0 0 
+0 1 0 0 0 1 0 1 0 0 
+0 1 0 0 0 1 0 0 1 0 
+0 1 1 1 1 1 0 0 1 0 
+0 0 1 0 0 0 1 0 1 0 
+0 0 0 1 0 0 0 1 1 0 
+0 0 0 0 1 1 1 1 1 0 
+0 0 0 0 0 0 0 0 0 0 
+1
+3 0 272 0 396
+28 255 0 0
+17 0
+13 0
+5 40 111 256 330
+17 1
+5 153 215 265 326
+17 2
+5 43 155 140 206
+17 3
+5 219 324 107 201
diff --git a/test/mf/fill_x_hollow.mf b/test/mf/fill_x_hollow.mf
new file mode 100644
index 0000000..b8f429a
--- /dev/null
+++ b/test/mf/fill_x_hollow.mf
@@ -0,0 +1,170 @@
+CDMF 1239 759
+27 255 255 255
+28 0 0 0
+13 1
+14 0
+15 0
+16 1
+60 0
+61 0
+18 0
+17 0
+74 0 12 System
+23 9
+33 0
+20 10 10
+255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 19 10 10
+0 0 0 0 0 0 0 0 0 0 
+0 1 1 1 1 1 0 0 0 0 
+0 1 0 0 0 1 1 0 0 0 
+0 1 0 0 0 1 0 1 0 0 
+0 1 0 0 0 1 0 0 1 0 
+0 1 1 1 1 1 0 0 1 0 
+0 0 1 0 0 0 1 0 1 0 
+0 0 0 1 0 0 0 1 1 0 
+0 0 0 0 1 1 1 1 1 0 
+0 0 0 0 0 0 0 0 0 0 
+17 0
+1
+3 0 272 0 396
+18 0
+17 0
+20 10 10
+255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 19 10 10
+0 0 0 0 0 0 0 0 0 0 
+0 1 1 1 1 1 0 0 0 0 
+0 1 0 0 0 1 1 0 0 0 
+0 1 0 0 0 1 0 1 0 0 
+0 1 0 0 0 1 0 0 1 0 
+0 1 1 1 1 1 0 0 1 0 
+0 0 1 0 0 0 1 0 1 0 
+0 0 0 1 0 0 0 1 1 0 
+0 0 0 0 1 1 1 1 1 0 
+0 0 0 0 0 0 0 0 0 0 
+17 0
+1
+18 0
+17 0
+9 2
+10 55 428
+10 300 427
+10 121 345
+10 159 499
+10 252 334
+11
+18 0
+17 0
+9 2
+10 444 432
+10 637 430
+10 472 357
+10 529 502
+10 596 350
+11
+18 0
+17 0
+9 2
+10 499 98
+10 684 96
+10 680 215
+10 546 215
+10 546 171
+10 633 169
+10 634 132
+10 578 132
+10 578 258
+10 473 256
+11
+18 0
+17 0
+9 2
+10 90 94
+10 264 95
+10 259 220
+10 140 220
+10 141 149
+10 218 151
+10 218 117
+10 168 116
+10 168 255
+10 73 253
+11
+28 255 0 0
+9 0
+10 55 428
+10 300 427
+10 121 345
+10 159 499
+10 252 334
+11
+18 0
+17 0
+58 1
+9 0
+10 444 432
+10 637 430
+10 472 357
+10 529 502
+10 596 350
+11
+18 0
+17 0
+9 0
+10 499 98
+10 684 96
+10 680 215
+10 546 215
+10 546 171
+10 633 169
+10 634 132
+10 578 132
+10 578 258
+10 473 256
+11
+18 0
+17 0
+58 0
+9 0
+10 90 94
+10 264 95
+10 259 220
+10 140 220
+10 141 149
+10 218 151
+10 218 117
+10 168 116
+10 168 255
+10 73 253
+11
+28 0 0 0
+34 318 394 283 376
+28 255 0 0
+18 0
+17 0
+5 318 394 283 376
+28 0 0 0
+6 363 174 82 148 0 360
+28 255 0 0
+18 0
+17 0
+7 363 174 82 148 0 360
diff --git a/test/mf/font.mf b/test/mf/font.mf
new file mode 100644
index 0000000..72f16ad
--- /dev/null
+++ b/test/mf/font.mf
@@ -0,0 +1,49 @@
+CDMF 488 466
+27 255 255 255
+28 0 0 0
+13 1
+14 0
+15 0
+16 1
+18 0
+17 0
+21 0 0 12
+23 9
+33 0
+24 1
+25 10
+1
+3 0 382 0 409
+21 0 0 24
+13 0
+8 39 420 System
+21 0 1 24
+8 48 383 System
+21 0 2 24
+8 49 352 System
+21 0 3 24
+8 67 317 System
+21 1 3 24
+8 229 316 Courier
+21 1 2 24
+8 236 352 Courier
+21 1 1 24
+8 233 387 Courier
+21 1 0 24
+8 229 430 Courier
+21 2 0 24
+8 57 264 Times
+21 2 1 24
+8 89 226 Times
+21 2 2 24
+8 104 187 Times
+21 2 3 24
+8 99 157 Times
+21 3 0 24
+8 302 273 Helvetica
+21 3 1 24
+8 326 238 Helvetica
+21 3 2 24
+8 337 200 Helvetica
+21 3 3 24
+8 336 145 Helvetica
diff --git a/test/mf/grays.mf b/test/mf/grays.mf
new file mode 100644
index 0000000..23a176c
--- /dev/null
+++ b/test/mf/grays.mf
@@ -0,0 +1,59 @@
+CDMF 980 599
+27 255 255 255
+28 0 0 0
+13 1
+14 0
+15 0
+16 1
+18 0
+17 0
+21 0 0 12
+23 9
+33 0
+24 1
+25 10
+20 10 10
+255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 19 10 10
+0 0 0 0 0 0 0 0 0 0 
+0 1 1 1 1 1 0 0 0 0 
+0 1 0 0 0 1 1 0 0 0 
+0 1 0 0 0 1 0 1 0 0 
+0 1 0 0 0 1 0 0 1 0 
+0 1 1 1 1 1 0 0 1 0 
+0 0 1 0 0 0 1 0 1 0 
+0 0 0 1 0 0 0 1 1 0 
+0 0 0 0 1 1 1 1 1 0 
+0 0 0 0 0 0 0 0 0 0 
+17 0
+1
+3 0 272 0 396
+25 5
+12 167 511
+12 166 487
+12 167 472
+12 168 440
+12 167 423
+12 168 402
+12 167 377
+12 166 358
+12 166 329
+12 166 312
+31 227 512 0 0 0
+31 227 313 255 255 255
+31 232 401 128 128 128
+31 229 460 64 64 64
+31 232 348 192 192 192
+31 228 484 32 32 32
+31 230 431 96 96 96
+31 233 374 160 160 160
+31 232 326 224 224 224
diff --git a/test/mf/hatch.mf b/test/mf/hatch.mf
new file mode 100644
index 0000000..d8e30d6
--- /dev/null
+++ b/test/mf/hatch.mf
@@ -0,0 +1,47 @@
+CDMF 472 410
+27 255 255 255
+28 0 0 0
+13 1
+14 0
+15 0
+16 1
+18 0
+17 0
+21 0 0 12
+23 9
+33 0
+24 1
+25 10
+1
+3 0 382 0 409
+28 255 0 0
+18 5
+17 0
+5 20 455 264 370
+5 21 452 124 229
+28 0 0 255
+18 0
+13 0
+5 29 78 286 347
+18 1
+5 97 142 285 346
+18 2
+5 165 214 286 345
+18 3
+5 231 287 285 346
+18 4
+5 307 366 284 346
+18 5
+5 386 438 286 347
+13 1
+5 383 439 142 202
+18 4
+5 308 362 145 203
+18 3
+5 234 290 144 202
+18 2
+5 163 218 142 203
+18 1
+5 99 149 140 208
+18 0
+5 28 87 141 208
diff --git a/test/mf/lines.mf b/test/mf/lines.mf
new file mode 100644
index 0000000..1b91129
--- /dev/null
+++ b/test/mf/lines.mf
@@ -0,0 +1,44 @@
+CDMF 511 397
+27 255 255 255
+28 0 0 0
+13 1
+14 0
+15 0
+16 1
+18 0
+17 0
+21 0 0 12
+23 9
+33 0
+24 1
+25 10
+1
+3 0 272 0 396
+28 255 0 0
+13 0
+5 58 439 214 345
+5 59 454 40 158
+28 0 0 255
+4 74 318 419 315
+15 1
+4 79 294 409 286
+15 2
+4 81 276 414 260
+15 3
+4 79 258 416 236
+15 4
+4 77 231 411 223
+13 1
+4 81 49 417 47
+15 3
+4 84 63 427 59
+15 2
+4 88 80 443 75
+15 1
+4 78 100 440 93
+15 0
+4 79 122 436 113
+16 10
+4 76 201 438 201
+15 1
+4 80 174 441 176
diff --git a/test/mf/marks.mf b/test/mf/marks.mf
new file mode 100644
index 0000000..2e3d561
--- /dev/null
+++ b/test/mf/marks.mf
@@ -0,0 +1,33 @@
+CDMF 511 397
+27 255 255 255
+28 0 0 0
+13 1
+14 0
+15 0
+16 1
+18 0
+17 0
+21 0 0 12
+23 9
+33 0
+24 1
+25 10
+1
+3 0 272 0 396
+25 15
+28 0 0 255
+12 37 344
+24 2
+12 84 343
+24 3
+12 129 335
+24 4
+12 173 332
+24 5
+12 227 334
+24 6
+12 274 331
+24 7
+12 297 329
+24 8
+12 338 319
diff --git a/test/mf/natal.mf b/test/mf/natal.mf
new file mode 100644
index 0000000..85de77f
--- /dev/null
+++ b/test/mf/natal.mf
@@ -0,0 +1,1933 @@
+CDMF 719 433
+27 255 255 255
+2 0
+1
+3 0 383 0 381
+2 0
+28 0 128 0
+27 255 255 255
+14 0
+15 0
+16 1
+18 0
+17 0
+13 0
+9 1
+10 297 384
+10 375 314
+10 313 310
+10 413 246
+10 331 243
+10 407 166
+10 328 165
+10 368 112
+10 243 115
+10 295 151
+10 228 153
+10 281 225
+10 210 229
+10 283 294
+10 226 299
+10 297 383
+11
+3 0 383 0 381
+2 0
+14 0
+31 285 351 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 301 356 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 285 338 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 275 331 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 318 332 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 299 332 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 297 313 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 307 289 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 296 267 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 274 254 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 256 253 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 252 253 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 252 246 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 293 243 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 295 244 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 292 272 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 290 277 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 345 271 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 363 260 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 387 254 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 374 258 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 300 256 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 310 254 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 312 244 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 323 264 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 316 267 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 302 238 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 282 198 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 319 193 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 325 216 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 350 193 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 365 187 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 331 182 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 236 176 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 281 169 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 270 169 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 277 195 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 297 219 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 299 215 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 291 171 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 306 164 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 309 147 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 273 137 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 295 128 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 363 119 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 317 119 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 320 123 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 321 127 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 341 123 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 342 127 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 318 143 0 128 0
+3 0 383 0 381
+2 0
+14 0
+31 316 163 0 128 0
+3 0 383 0 381
+2 0
+28 0 128 0
+27 0 128 0
+14 0
+15 0
+16 1
+18 0
+17 0
+13 0
+9 1
+10 297 382
+10 374 314
+10 316 310
+10 416 244
+10 338 240
+10 406 168
+10 329 164
+10 369 114
+10 243 114
+10 296 151
+10 235 153
+10 281 229
+10 208 229
+10 279 293
+10 238 302
+10 297 380
+11
+3 0 383 0 381
+2 0
+14 0
+25 5
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 107 123 111 127
+4 107 127 111 123
+4 107 125 111 125
+4 109 123 109 127
+17 0
+15 0
+16 1
+3 0 383 0 381
+2 0
+14 0
+25 5
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 294 224 298 228
+4 294 228 298 224
+4 294 226 298 226
+4 296 224 296 228
+17 0
+15 0
+16 1
+3 0 383 0 381
+2 0
+14 0
+25 5
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 318 173 322 177
+4 318 177 322 173
+4 318 175 322 175
+4 320 173 320 177
+17 0
+15 0
+16 1
+3 0 383 0 381
+2 0
+14 0
+25 5
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 293 165 297 169
+4 293 169 297 165
+4 293 167 297 167
+4 295 165 295 169
+17 0
+15 0
+16 1
+3 0 383 0 381
+2 0
+14 0
+25 5
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 294 164 298 168
+4 294 168 298 164
+4 294 166 298 166
+4 296 164 296 168
+17 0
+15 0
+16 1
+3 0 383 0 381
+2 0
+14 0
+25 5
+24 1
+28 153 153 153
+17 0
+15 0
+16 1
+4 153 62 157 66
+4 153 66 157 62
+4 153 64 157 64
+4 155 62 155 66
+17 0
+15 0
+16 1
+3 0 383 0 381
+2 0
+14 0
+25 5
+24 1
+28 153 153 153
+17 0
+15 0
+16 1
+4 251 95 255 99
+4 251 99 255 95
+4 251 97 255 97
+4 253 95 253 99
+17 0
+15 0
+16 1
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 153 153 153
+4 298 377 300 377
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 300 379 245 308
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 241 303 288 300
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 288 297 217 232
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 217 232 287 232
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 286 229 227 156
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 227 156 285 153
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 285 152 228 104
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 228 104 360 106
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 359 112 324 166
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 324 166 395 167
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 392 177 331 238
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 331 240 411 249
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 411 249 310 312
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 310 312 363 321
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 363 321 302 375
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 302 375 333 323
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 319 322 292 367
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 285 353 302 316
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 273 335 333 243
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 258 320 283 308
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 303 309 348 253
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 333 291 366 254
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 369 266 377 261
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 282 284 352 182
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 328 235 374 174
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 345 177 351 173
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 294 286 313 234
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 277 268 336 180
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 257 267 274 244
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 240 249 261 241
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 288 238 323 169
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 280 217 340 119
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 268 200 315 116
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 248 177 253 165
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 255 187 263 170
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 263 199 329 113
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 282 141 306 112
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 271 130 280 110
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 261 123 264 106
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 0 128 0
+4 255 177 323 165
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 245 307 10 8 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 259 314 10 8 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 277 343 6 10 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 331 328 10 14 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 357 322 6 6 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 284 270 2 2 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 297 296 8 6 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 329 280 18 26 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 356 260 8 8 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 298 256 8 6 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 271 254 8 8 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 244 248 2 6 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 284 235 22 14 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 323 224 12 16 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 341 204 12 16 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 379 177 2 4 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 337 177 10 4 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 354 183 6 10 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 356 172 4 10 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 268 199 10 14 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 294 205 4 6 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 266 190 4 14 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 240 174 8 6 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 276 170 24 10 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 309 165 0 4 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 310 176 6 8 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 314 158 2 4 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 320 138 6 10 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 338 114 6 2 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 287 115 8 6 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 291 131 6 4 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 264 122 6 10 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 244 111 6 6 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 0 0
+27 0 128 0
+18 0
+17 0
+13 0
+7 322 110 8 2 0 360
+3 0 383 0 381
+2 0
+14 0
+15 0
+16 14
+28 255 255 255
+27 0 128 0
+18 0
+17 0
+13 0
+7 287 359 0 0 0 360
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 273 355 285 367
+4 273 367 285 355
+4 273 361 285 361
+4 279 355 279 367
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 309 352 321 364
+4 309 364 321 352
+4 309 358 321 358
+4 315 352 315 364
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 309 318 321 330
+4 309 330 321 318
+4 309 324 321 324
+4 315 318 315 330
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 279 299 291 311
+4 279 311 291 299
+4 279 305 291 305
+4 285 299 285 311
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 268 267 280 279
+4 268 279 280 267
+4 268 273 280 273
+4 274 267 274 279
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 269 242 281 254
+4 269 254 281 242
+4 269 248 281 248
+4 275 242 275 254
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 237 236 249 248
+4 237 248 249 236
+4 237 242 249 242
+4 243 236 243 248
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 214 239 226 251
+4 214 251 226 239
+4 214 245 226 245
+4 220 239 220 251
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 212 206 224 218
+4 212 218 224 206
+4 212 212 224 212
+4 218 206 218 218
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 280 240 292 252
+4 280 252 292 240
+4 280 246 292 246
+4 286 240 286 252
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 344 249 356 261
+4 344 261 356 249
+4 344 255 356 255
+4 350 249 350 261
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 342 287 354 299
+4 342 299 354 287
+4 342 293 354 293
+4 348 287 348 299
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 376 264 388 276
+4 376 276 388 264
+4 376 270 388 270
+4 382 264 382 276
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 380 229 392 241
+4 380 241 392 229
+4 380 235 392 235
+4 386 229 386 241
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 380 241 392 253
+4 380 253 392 241
+4 380 247 392 247
+4 386 241 386 253
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 311 283 323 295
+4 311 295 323 283
+4 311 289 323 289
+4 317 283 317 295
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 306 339 318 351
+4 306 351 318 339
+4 306 345 318 345
+4 312 339 312 351
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 299 359 311 371
+4 299 371 311 359
+4 299 365 311 365
+4 305 359 305 371
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 277 325 289 337
+4 277 337 289 325
+4 277 331 289 331
+4 283 325 283 337
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 259 315 271 327
+4 259 327 271 315
+4 259 321 271 321
+4 265 315 265 327
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 306 282 318 294
+4 306 294 318 282
+4 306 288 318 288
+4 312 282 312 294
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 308 236 320 248
+4 308 248 320 236
+4 308 242 320 242
+4 314 236 314 248
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 294 215 306 227
+4 294 227 306 215
+4 294 221 306 221
+4 300 215 300 227
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 290 191 302 203
+4 290 203 302 191
+4 290 197 302 197
+4 296 191 296 203
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 248 156 260 168
+4 248 168 260 156
+4 248 162 260 162
+4 254 156 254 168
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 216 157 228 169
+4 216 169 228 157
+4 216 163 228 163
+4 222 157 222 169
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 246 187 258 199
+4 246 199 258 187
+4 246 193 258 193
+4 252 187 252 199
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 296 182 308 194
+4 296 194 308 182
+4 296 188 308 188
+4 302 182 302 194
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 360 175 372 187
+4 360 187 372 175
+4 360 181 372 181
+4 366 175 366 187
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 398 170 410 182
+4 398 182 410 170
+4 398 176 410 176
+4 404 170 404 182
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 355 208 367 220
+4 355 220 367 208
+4 355 214 367 214
+4 361 208 361 220
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 323 210 335 222
+4 323 222 335 210
+4 323 216 335 216
+4 329 210 329 222
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 324 183 336 195
+4 324 195 336 183
+4 324 189 336 189
+4 330 183 330 195
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 323 152 335 164
+4 323 164 335 152
+4 323 158 335 158
+4 329 152 329 164
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 328 131 340 143
+4 328 143 340 131
+4 328 137 340 137
+4 334 131 334 143
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 334 110 346 122
+4 334 122 346 110
+4 334 116 346 116
+4 340 110 340 122
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 289 109 301 121
+4 289 121 301 109
+4 289 115 301 115
+4 295 109 295 121
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 284 135 296 147
+4 284 147 296 135
+4 284 141 296 141
+4 290 135 290 147
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 267 127 279 139
+4 267 139 279 127
+4 267 133 279 133
+4 273 127 273 139
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 259 111 271 123
+4 259 123 271 111
+4 259 117 271 117
+4 265 111 265 123
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 233 109 245 121
+4 233 121 245 109
+4 233 115 245 115
+4 239 109 239 121
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 303 107 315 119
+4 303 119 315 107
+4 303 113 315 113
+4 309 107 309 119
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 317 111 329 123
+4 317 123 329 111
+4 317 117 329 117
+4 323 111 323 123
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 312 134 324 146
+4 312 146 324 134
+4 312 140 324 140
+4 318 134 318 146
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 255
+17 0
+15 0
+16 1
+4 313 191 325 203
+4 313 203 325 191
+4 313 197 325 197
+4 319 191 319 203
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 12
+24 1
+28 255 255 0
+17 0
+15 0
+16 1
+4 295 377 307 389
+4 295 389 307 377
+4 295 383 307 383
+4 301 377 301 389
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 22
+24 1
+28 255 255 0
+17 0
+15 0
+16 1
+4 292 369 314 391
+4 292 391 314 369
+4 292 380 314 380
+4 303 369 303 391
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 22
+24 1
+28 255 255 0
+17 0
+15 0
+16 1
+4 287 371 309 393
+4 287 393 309 371
+4 287 382 309 382
+4 298 371 298 393
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 22
+24 1
+28 255 255 0
+17 0
+15 0
+16 1
+4 292 380 314 402
+4 292 402 314 380
+4 292 391 314 391
+4 303 380 303 402
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 22
+24 1
+28 255 255 0
+17 0
+15 0
+16 1
+4 287 370 309 392
+4 287 392 309 370
+4 287 381 309 381
+4 298 370 298 392
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 22
+24 1
+28 255 255 0
+17 0
+15 0
+16 1
+4 287 372 309 394
+4 287 394 309 372
+4 287 383 309 383
+4 298 372 298 394
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 22
+24 1
+28 255 255 0
+17 0
+15 0
+16 1
+4 290 373 312 395
+4 290 395 312 373
+4 290 384 312 384
+4 301 373 301 395
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 22
+24 1
+28 255 255 0
+17 0
+15 0
+16 1
+4 292 373 314 395
+4 292 395 314 373
+4 292 384 314 384
+4 303 373 303 395
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 22
+24 1
+28 255 255 0
+17 0
+15 0
+16 1
+4 294 373 316 395
+4 294 395 316 373
+4 294 384 316 384
+4 305 373 305 395
+17 0
+15 0
+16 14
+3 0 383 0 381
+2 0
+14 0
+25 22
+24 1
+28 255 255 0
+17 0
+15 0
+16 1
+4 291 383 313 405
+4 291 405 313 383
+4 291 394 313 394
+4 302 383 302 405
+17 0
+15 0
+16 14
+2 0
diff --git a/test/mf/poly.mf b/test/mf/poly.mf
new file mode 100644
index 0000000..d299180
--- /dev/null
+++ b/test/mf/poly.mf
@@ -0,0 +1,88 @@
+CDMF 619334269 619334269
+27 255 255 255
+28 0 0 0
+13 1
+14 0
+15 0
+16 1
+60 0
+61 0
+18 0
+17 0
+74 0 12 System
+23 9
+33 0
+20 10 10
+255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 19 10 10
+0 0 0 0 0 0 0 0 0 0 
+0 1 1 1 1 1 0 0 0 0 
+0 1 0 0 0 1 1 0 0 0 
+0 1 0 0 0 1 0 1 0 0 
+0 1 0 0 0 1 0 0 1 0 
+0 1 1 1 1 1 0 0 1 0 
+0 0 1 0 0 0 1 0 1 0 
+0 0 0 1 0 0 0 1 1 0 
+0 0 0 0 1 1 1 1 1 0 
+0 0 0 0 0 0 0 0 0 0 
+17 0
+1
+3 0 272 0 396
+18 0
+17 0
+58 0
+9 0
+10 55 428
+10 300 427
+10 121 345
+10 159 499
+10 252 334
+11
+18 0
+17 0
+58 1
+9 0
+10 444 432
+10 637 430
+10 472 357
+10 529 502
+10 596 350
+11
+18 0
+17 0
+9 0
+10 499 98
+10 684 96
+10 680 215
+10 546 215
+10 546 171
+10 633 169
+10 634 132
+10 578 132
+10 578 258
+10 473 256
+11
+18 0
+17 0
+58 0
+9 0
+10 90 94
+10 264 95
+10 259 220
+10 140 220
+10 141 149
+10 218 151
+10 218 117
+10 168 116
+10 168 255
+10 73 253
+11
diff --git a/test/mf/poly2.mf b/test/mf/poly2.mf
new file mode 100644
index 0000000..387431c
--- /dev/null
+++ b/test/mf/poly2.mf
@@ -0,0 +1,88 @@
+CDMF 619334269 619334269
+27 255 255 255
+28 0 0 0
+13 1
+14 0
+15 0
+16 1
+60 0
+61 0
+18 0
+17 0
+74 0 12 System
+23 9
+33 0
+20 10 10
+255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 19 10 10
+0 0 0 0 0 0 0 0 0 0 
+0 1 1 1 1 1 0 0 0 0 
+0 1 0 0 0 1 1 0 0 0 
+0 1 0 0 0 1 0 1 0 0 
+0 1 0 0 0 1 0 0 1 0 
+0 1 1 1 1 1 0 0 1 0 
+0 0 1 0 0 0 1 0 1 0 
+0 0 0 1 0 0 0 1 1 0 
+0 0 0 0 1 1 1 1 1 0 
+0 0 0 0 0 0 0 0 0 0 
+17 0
+1
+3 0 272 0 396
+18 0
+17 0
+58 0
+9 2
+10 55 428
+10 300 427
+10 121 345
+10 159 499
+10 252 334
+11
+18 0
+17 0
+58 1
+9 2
+10 444 432
+10 637 430
+10 472 357
+10 529 502
+10 596 350
+11
+18 0
+17 0
+9 2
+10 499 98
+10 684 96
+10 680 215
+10 546 215
+10 546 171
+10 633 169
+10 634 132
+10 578 132
+10 578 258
+10 473 256
+11
+18 0
+17 0
+58 0
+9 2
+10 90 94
+10 264 95
+10 259 220
+10 140 220
+10 141 149
+10 218 151
+10 218 117
+10 168 116
+10 168 255
+10 73 253
+11
diff --git a/test/mf/poly3.mf b/test/mf/poly3.mf
new file mode 100644
index 0000000..e9f06d1
--- /dev/null
+++ b/test/mf/poly3.mf
@@ -0,0 +1,136 @@
+CDMF 619334269 619334269
+27 255 255 255
+28 0 0 0
+13 1
+14 0
+15 0
+16 1
+60 0
+61 0
+18 0
+17 0
+74 0 12 System
+23 9
+33 0
+20 10 10
+255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 19 10 10
+0 0 0 0 0 0 0 0 0 0 
+0 1 1 1 1 1 0 0 0 0 
+0 1 0 0 0 1 1 0 0 0 
+0 1 0 0 0 1 0 1 0 0 
+0 1 0 0 0 1 0 0 1 0 
+0 1 1 1 1 1 0 0 1 0 
+0 0 1 0 0 0 1 0 1 0 
+0 0 0 1 0 0 0 1 1 0 
+0 0 0 0 1 1 1 1 1 0 
+0 0 0 0 0 0 0 0 0 0 
+17 0
+1
+3 0 272 0 396
+18 0
+17 0
+58 0
+9 2
+10 55 428
+10 300 427
+10 121 345
+10 159 499
+10 252 334
+11
+18 0
+17 0
+58 1
+9 2
+10 444 432
+10 637 430
+10 472 357
+10 529 502
+10 596 350
+11
+18 0
+17 0
+9 2
+10 499 98
+10 684 96
+10 680 215
+10 546 215
+10 546 171
+10 633 169
+10 634 132
+10 578 132
+10 578 258
+10 473 256
+11
+18 0
+17 0
+58 0
+9 2
+10 90 94
+10 264 95
+10 259 220
+10 140 220
+10 141 149
+10 218 151
+10 218 117
+10 168 116
+10 168 255
+10 73 253
+11
+28 255 0 0
+58 0
+9 0
+10 55 428
+10 300 427
+10 121 345
+10 159 499
+10 252 334
+11
+18 0
+17 0
+58 1
+9 0
+10 444 432
+10 637 430
+10 472 357
+10 529 502
+10 596 350
+11
+18 0
+17 0
+9 0
+10 499 98
+10 684 96
+10 680 215
+10 546 215
+10 546 171
+10 633 169
+10 634 132
+10 578 132
+10 578 258
+10 473 256
+11
+18 0
+17 0
+58 0
+9 0
+10 90 94
+10 264 95
+10 259 220
+10 140 220
+10 141 149
+10 218 151
+10 218 117
+10 168 116
+10 168 255
+10 73 253
+11
diff --git a/test/mf/poly4.mf b/test/mf/poly4.mf
new file mode 100644
index 0000000..83cf601
--- /dev/null
+++ b/test/mf/poly4.mf
@@ -0,0 +1,136 @@
+CDMF 619334269 619334269
+27 255 255 255
+28 0 0 0
+13 1
+14 0
+15 0
+16 1
+60 0
+61 0
+18 0
+17 0
+74 0 12 System
+23 9
+33 0
+20 10 10
+255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 19 10 10
+0 0 0 0 0 0 0 0 0 0 
+0 1 1 1 1 1 0 0 0 0 
+0 1 0 0 0 1 1 0 0 0 
+0 1 0 0 0 1 0 1 0 0 
+0 1 0 0 0 1 0 0 1 0 
+0 1 1 1 1 1 0 0 1 0 
+0 0 1 0 0 0 1 0 1 0 
+0 0 0 1 0 0 0 1 1 0 
+0 0 0 0 1 1 1 1 1 0 
+0 0 0 0 0 0 0 0 0 0 
+17 0
+1
+3 0 272 0 396
+18 0
+17 0
+58 0
+9 0
+10 55 428
+10 300 427
+10 121 345
+10 159 499
+10 252 334
+11
+18 0
+17 0
+58 1
+9 0
+10 444 432
+10 637 430
+10 472 357
+10 529 502
+10 596 350
+11
+18 0
+17 0
+9 0
+10 499 98
+10 684 96
+10 680 215
+10 546 215
+10 546 171
+10 633 169
+10 634 132
+10 578 132
+10 578 258
+10 473 256
+11
+18 0
+17 0
+58 0
+9 0
+10 90 94
+10 264 95
+10 259 220
+10 140 220
+10 141 149
+10 218 151
+10 218 117
+10 168 116
+10 168 255
+10 73 253
+11
+28 255 0 0
+58 0
+9 2
+10 55 428
+10 300 427
+10 121 345
+10 159 499
+10 252 334
+11
+18 0
+17 0
+58 1
+9 2
+10 444 432
+10 637 430
+10 472 357
+10 529 502
+10 596 350
+11
+18 0
+17 0
+9 2
+10 499 98
+10 684 96
+10 680 215
+10 546 215
+10 546 171
+10 633 169
+10 634 132
+10 578 132
+10 578 258
+10 473 256
+11
+18 0
+17 0
+58 0
+9 2
+10 90 94
+10 264 95
+10 259 220
+10 140 220
+10 141 149
+10 218 151
+10 218 117
+10 168 116
+10 168 255
+10 73 253
+11
diff --git a/test/mf/poly5.mf b/test/mf/poly5.mf
new file mode 100644
index 0000000..acbb116
--- /dev/null
+++ b/test/mf/poly5.mf
@@ -0,0 +1,89 @@
+CDMF 619334269 619334269
+27 255 255 255
+28 0 0 0
+13 1
+14 0
+15 0
+16 1
+60 0
+61 0
+18 0
+17 0
+74 0 12 System
+23 9
+33 0
+20 10 10
+255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 255 255 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 255 255 255 255 255 255 
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 19 10 10
+0 0 0 0 0 0 0 0 0 0 
+0 1 1 1 1 1 0 0 0 0 
+0 1 0 0 0 1 1 0 0 0 
+0 1 0 0 0 1 0 1 0 0 
+0 1 0 0 0 1 0 0 1 0 
+0 1 1 1 1 1 0 0 1 0 
+0 0 1 0 0 0 1 0 1 0 
+0 0 0 1 0 0 0 1 1 0 
+0 0 0 0 1 1 1 1 1 0 
+0 0 0 0 0 0 0 0 0 0 
+17 0
+1
+3 0 272 0 396
+18 0
+17 0
+28 255 0 0
+58 0
+9 0
+10 55 428
+10 300 427
+10 121 345
+10 159 499
+10 252 334
+11
+18 0
+17 0
+58 1
+9 0
+10 444 432
+10 637 430
+10 472 357
+10 529 502
+10 596 350
+11
+18 0
+17 0
+9 0
+10 499 98
+10 684 96
+10 680 215
+10 546 215
+10 546 171
+10 633 169
+10 634 132
+10 578 132
+10 578 258
+10 473 256
+11
+18 0
+17 0
+58 0
+9 0
+10 90 94
+10 264 95
+10 259 220
+10 140 220
+10 141 149
+10 218 151
+10 218 117
+10 168 116
+10 168 255
+10 73 253
+11
diff --git a/test/mf/sector.mf b/test/mf/sector.mf
new file mode 100644
index 0000000..d889752
--- /dev/null
+++ b/test/mf/sector.mf
@@ -0,0 +1,22 @@
+CDMF 383 410
+27 255 255 255
+28 0 0 0
+13 1
+14 0
+15 0
+16 1
+18 0
+17 0
+21 0 0 12
+23 9
+33 0
+24 1
+25 10
+1
+13 0
+7 66 336 70 74 0 360
+7 181 348 74 88 45 100
+7 188 234 122 102 0 180
+7 126 96 150 100 180 360
+7 238 159 88 70 180 360
+7 309 63 76 68 100 200
diff --git a/test/screencapture.c b/test/screencapture.c
new file mode 100644
index 0000000..1ac8d2c
--- /dev/null
+++ b/test/screencapture.c
@@ -0,0 +1,36 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <cd.h>
+#include <cdnative.h>
+#include <im.h>
+
+void main()
+{
+  cdCanvas *cd_canvas;
+  unsigned char *red, *green, *blue;
+  int width, height, size;
+
+  cd_canvas = cdCreateCanvas(CD_NATIVEWINDOW, NULL);
+  if (!cd_canvas)
+  {
+    printf("Error creating canvas.\n");
+    return;
+  }        
+  
+  cdActivate(cd_canvas);
+
+  cdGetCanvasSize(&width, &height, NULL, NULL);
+  size = width * height;
+  red = (unsigned char*)calloc(size, 1);
+  green = (unsigned char*)calloc(size, 1);
+  blue = (unsigned char*)calloc(size, 1);
+
+  cdGetImageRGB(red, green, blue, 0, 0, width, height);
+  imSaveRGB(width, height, IM_JPG|IM_COMPRESSED, red, green, blue, "scap.jpg");
+
+  cdKillCanvas(cd_canvas);
+  
+  free(red);
+  free(green);
+  free(blue);
+}
diff --git a/test/screencapture.mak b/test/screencapture.mak
new file mode 100644
index 0000000..1744375
--- /dev/null
+++ b/test/screencapture.mak
@@ -0,0 +1,8 @@
+APPNAME = screencapture
+APPTYPE = console
+               
+USE_CD = Yes
+USE_IUP = YEs
+USE_IM = Yes
+
+SRC = screencapture.c
diff --git a/test/simple/.cvsignore b/test/simple/.cvsignore
new file mode 100644
index 0000000..c29a181
--- /dev/null
+++ b/test/simple/.cvsignore
@@ -0,0 +1,21 @@
+*.emf
+*.mf
+*.cgm
+*.eps
+*.ps
+*.wmf
+*.pdf
+simple_debug.txt
+so_locations
+*.dep
+*.wdep
+*.loh
+.plan
+.project
+*.err
+Makefile
+*.make
+*.suo
+*.ncb
+*.opt
+*.user
diff --git a/test/simple/config.mak b/test/simple/config.mak
new file mode 100644
index 0000000..319568a
--- /dev/null
+++ b/test/simple/config.mak
@@ -0,0 +1,25 @@
+APPNAME = simple
+
+#SRC = simple.c simple_led.c iupmain.c
+SRC = teste.cpp
+            
+#DBG = Yes
+USE_CD=Yes
+USE_IUP=Yes
+
+simple_led.c: simple.led
+	ledc -f simple_loadled -o simple_led.c simple.led
+
+USE_STATIC = Yes
+
+#IUP = ../../../iup
+#CD = ../..
+
+USE_IM = Yes
+
+#ifneq ($(findstring Win, $(TEC_SYSNAME)), )
+#  LIBS = cdpdflib cdgdiplus gdiplus
+#else
+#  SLIB = $(CD)/lib/$(TEC_UNAME)/libcdpdflib.a $(CD)/lib/$(TEC_UNAME)/libcdxrender.a
+#  LIBS = Xrender Xft
+#endif
diff --git a/test/simple/gdiplustest.cpp b/test/simple/gdiplustest.cpp
new file mode 100644
index 0000000..af7b643
--- /dev/null
+++ b/test/simple/gdiplustest.cpp
@@ -0,0 +1,116 @@
+#include <windows.h>
+#include <gdiplus.h>
+using namespace Gdiplus;
+
+/* Visual C++ 7.1 + SP1
+   GDI+ 1.0 File Version 5.1.3102.2180
+*/
+
+void DrawLineMarks(Graphics* graphics, Pen* greenPen, int x, int y, int w, int h)
+{
+  graphics->DrawLine(greenPen, x+w-1, y-5, x+w-1, y+5); // end markers
+  graphics->DrawLine(greenPen, x-5, y+h-1, x+5, y+h-1);
+}
+
+void SimpleImageTest(HWND hWnd)
+{
+  int x, y;
+  Graphics* graphics = new Graphics(hWnd);
+  graphics->Clear(Color(255, 255, 255)); // white background
+
+  Bitmap image(16, 16, PixelFormat24bppRGB);
+  image.SetResolution(graphics->GetDpiX(), graphics->GetDpiX());
+
+  /* black pixel border */
+  for (y = 0; y < 16; y++)
+    image.SetPixel(0, y, Color(0, 0, 0));
+  for (y = 0; y < 16; y++)
+    image.SetPixel(15, y, Color(0, 0, 0));
+  for (x = 1; x < 15; x++)
+    image.SetPixel(x, 0, Color(0, 0, 0));
+  for (x = 1; x < 15; x++)
+    image.SetPixel(x, 15, Color(0, 0, 0));
+
+  /* light yellow contents */
+  for (y = 1; y < 15; y++)
+    for (x = 1; x < 15; x++)
+      image.SetPixel(x, y, Color(192, 192, 0));
+
+  Pen redPen(Color(255, 0, 0), 1);
+  redPen.SetDashStyle(DashStyleDash);
+  Pen greenPen(Color(0, 255, 0), 1);
+  greenPen.SetDashStyle(DashStyleDash);
+
+  // I add {} to avoid reusing some Rect in the next test
+
+  graphics->SetPixelOffsetMode(PixelOffsetModeHalf); // pixel center is (.5,.5) instead of (0, 0)
+
+  // NO zoom
+  {
+  RectF actualRect(10, 10, 16, 16);
+  graphics->DrawImage(&image, 10, 10);  
+  graphics->DrawRectangle(&redPen, actualRect);
+  DrawLineMarks(graphics, &greenPen, 10, 10, 16, 16);
+  }
+
+  // zoom using Bilinear Interpolation
+  {
+  RectF zoomRect(50, 10, 160, 160);
+  graphics->SetInterpolationMode(InterpolationModeBilinear);
+  graphics->DrawImage(&image, zoomRect);
+  graphics->DrawRectangle(&redPen, zoomRect);
+  DrawLineMarks(graphics, &greenPen, 50, 10, 160, 160);
+  }
+
+  // zoom using Nearest Neighborhood
+  {
+  RectF zoomRect2(250, 10, 160, 160);
+  graphics->SetInterpolationMode(InterpolationModeNearestNeighbor);
+  graphics->DrawImage(&image, zoomRect2);
+  graphics->DrawRectangle(&redPen, zoomRect2);
+  DrawLineMarks(graphics, &greenPen, 250, 10, 160, 160);
+  }
+
+
+  // Using a source image size, smaller than actual
+
+
+  // NO zoom
+  {
+  RectF actualRect3(10, 200, 16, 16);
+  graphics->DrawImage(&image, actualRect3, 0, 0, 16-1, 16-1, UnitPixel, NULL, NULL);
+  graphics->DrawRectangle(&redPen, actualRect3);
+  DrawLineMarks(graphics, &greenPen, 10, 400, 16, 16);
+  }
+
+  // zoom using Bilinear Interpolation
+  {
+  RectF zoomRect6(50, 200, 160, 160);
+  graphics->SetInterpolationMode(InterpolationModeBilinear);
+  graphics->DrawImage(&image, zoomRect6, 0, 0, 16-1, 16-1, UnitPixel, NULL, NULL);
+  graphics->DrawRectangle(&redPen, zoomRect6);
+  DrawLineMarks(graphics, &greenPen, 50, 400, 160, 160);
+  }
+
+  // zoom using Nearest Neighborhood
+  {
+  RectF zoomRect7(250, 200, 160, 160);
+  graphics->SetInterpolationMode(InterpolationModeNearestNeighbor);
+  graphics->DrawImage(&image, zoomRect7, 0, 0, 16-1, 16-1, UnitPixel, NULL, NULL);
+  graphics->DrawRectangle(&redPen, zoomRect7);
+  DrawLineMarks(graphics, &greenPen, 250, 400, 160, 160);
+  }
+
+  delete graphics;
+}
+
+#include <iup.h>
+
+extern "C" char* winData;
+extern "C" void SimpleDrawTest(void);
+
+void SimpleDrawTest(void)
+{
+  HWND hWnd = (HWND)IupGetAttribute((Ihandle*)winData, "HWND");
+  SimpleImageTest(hWnd);
+}
diff --git a/test/simple/iupmain.c b/test/simple/iupmain.c
new file mode 100644
index 0000000..7db2672
--- /dev/null
+++ b/test/simple/iupmain.c
@@ -0,0 +1,83 @@
+
+#include <iup.h>
+#include <cd.h>
+
+#include "simple.h"
+
+int cmdExit(void)
+{
+  return IUP_CLOSE;
+}
+
+void simple_loadled (void);
+
+int main(void)
+{
+  IupOpen();
+
+  cdInitContextPlus();
+
+  simple_loadled();
+
+  IupSetAttribute(IupGetHandle("SimpleDialog"), "PLACEMENT", "MAXIMIZED");
+  IupShow(IupGetHandle("SimpleDialog"));
+
+  SimpleCreateCanvas((char*)IupGetHandle("SimpleCanvas"));
+
+  IupSetFunction("cmdExit", (Icallback) cmdExit);
+
+  IupSetFunction("SimplePlayClipboard", (Icallback) SimplePlayClipboard);
+  IupSetFunction("SimplePlayCGMText", (Icallback) SimplePlayCGMText);
+  IupSetFunction("SimplePlayCGMBin", (Icallback) SimplePlayCGMBin);
+  IupSetFunction("SimplePlayMetafile", (Icallback) SimplePlayMetafile);
+  IupSetFunction("SimplePlayWMF", (Icallback) SimplePlayWMF);
+  IupSetFunction("SimplePlayEMF", (Icallback) SimplePlayEMF);
+
+  IupSetFunction("SimpleDrawDebug", (Icallback) SimpleDrawDebug);
+  IupSetFunction("SimpleDrawWindow", (Icallback) SimpleDrawWindow);
+  IupSetFunction("SimpleDrawCGMText", (Icallback) SimpleDrawCGMText);
+  IupSetFunction("SimpleDrawCGMBin", (Icallback) SimpleDrawCGMBin);
+  IupSetFunction("SimpleDrawDXF", (Icallback) SimpleDrawDXF);
+  IupSetFunction("SimpleDrawDGN", (Icallback) SimpleDrawDGN);
+  IupSetFunction("SimpleDrawEMF", (Icallback) SimpleDrawEMF);
+  IupSetFunction("SimpleDrawMetafile", (Icallback) SimpleDrawMetafile);
+  IupSetFunction("SimpleDrawPDF", (Icallback) SimpleDrawPDF);
+  IupSetFunction("SimpleDrawPS", (Icallback) SimpleDrawPS);
+  IupSetFunction("SimpleDrawEPS", (Icallback) SimpleDrawEPS);
+  IupSetFunction("SimpleDrawWMF", (Icallback) SimpleDrawWMF);
+  IupSetFunction("SimpleDrawPrint", (Icallback) SimpleDrawPrint);
+  IupSetFunction("SimpleDrawPrintDialog", (Icallback) SimpleDrawPrintDialog);
+  IupSetFunction("SimpleDrawClipboardBitmap", (Icallback) SimpleDrawClipboardBitmap);
+  IupSetFunction("SimpleDrawClipboardMetafile", (Icallback) SimpleDrawClipboardMetafile);
+  IupSetFunction("SimpleDrawClipboardEMF", (Icallback) SimpleDrawClipboardEMF);
+  IupSetFunction("SimpleDrawImage", (Icallback) SimpleDrawImage);
+  IupSetFunction("SimpleDrawImageRGB", (Icallback) SimpleDrawImageRGB);
+  IupSetFunction("SimpleDrawSimulate", (Icallback) SimpleDrawSimulate);
+
+  IupSetFunction("SimpleNotXor", (Icallback) SimpleNotXor);
+  IupSetFunction("SimpleXor", (Icallback) SimpleXor);
+  IupSetFunction("SimpleReplace", (Icallback) SimpleReplace);
+  IupSetFunction("SimpleClippingOff", (Icallback) SimpleClippingOff);
+  IupSetFunction("SimpleClippingArea", (Icallback) SimpleClippingArea);
+  IupSetFunction("SimpleClippingPolygon", (Icallback) SimpleClippingPolygon);
+  IupSetFunction("SimpleClippingRegion", (Icallback) SimpleClippingRegion);
+  IupSetFunction("SimpleContextPlus", (Icallback) SimpleContextPlus);
+  IupSetFunction("SimpleTransform", (Icallback) SimpleTransform);
+
+  IupSetFunction("SimpleDrawAll", (Icallback) SimpleDrawAll);
+  IupSetFunction("SimpleDrawTextAlign", (Icallback) SimpleDrawTextAlign);
+  IupSetFunction("SimpleDrawTextFonts", (Icallback) SimpleDrawTextFonts);
+  IupSetFunction("SimpleDrawTest", (Icallback) SimpleDrawTest);
+
+  IupSetFunction("SimpleRepaint", (Icallback) SimpleDrawRepaint);
+
+  SimpleDrawWindow();
+
+  IupMainLoop();
+
+  SimpleKillCanvas();
+
+  IupClose();
+
+  return 1;
+}
diff --git a/test/simple/makefile.linux b/test/simple/makefile.linux
new file mode 100644
index 0000000..5d014e0
--- /dev/null
+++ b/test/simple/makefile.linux
@@ -0,0 +1,18 @@
+CC = gcc
+
+CFLAGS = -I../cd/include -I../iup/include -I/usr/X11R6/include
+
+LIBS = -L../cd/lib/Linux26 -L../iup/lib/Linux26 -L/usr/X11R6/lib \
+       -lcdiup -lcd -liup \
+       -lXm -lXpm -lXmu -lXt -lXext -lX11
+       
+OBJS = simple.o iupmain.o
+
+simple.o: simple.c simple.h
+	$(CC) -o $@ -c simple.c $(CFLAGS)
+
+iupmain.o: iupmain.c simple.h
+	$(CC) -o $@ -c iupmain.c $(CFLAGS)
+
+simple: $(OBJS)
+	$(CC) -o $@ $(OBJS) $(LIBS)
diff --git a/test/simple/makefile.mingw3 b/test/simple/makefile.mingw3
new file mode 100644
index 0000000..cf735e8
--- /dev/null
+++ b/test/simple/makefile.mingw3
@@ -0,0 +1,20 @@
+CC = gcc
+
+CFLAGS = -I../cd/include -I../iup/include
+
+LIBS = -L../cd/lib/mingw3 -L../iup/lib/mingw3 \
+       -lcdiup -lcd -liup \
+       -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lole32 -lcomctl32
+
+OBJS = simple.o iupmain.o
+
+all: simple.exe
+
+simple.o:  simple.c simple.h
+	$(CC) -o $@ -c simple.c $(CFLAGS)
+
+iupmain.o:  iupmain.c simple.h
+	$(CC) -o $@ -c iupmain.c $(CFLAGS)
+
+simple.exe: $(OBJS)
+	$(CC) -o $@ $(OBJS) $(LIBS)
diff --git a/test/simple/simple.bat b/test/simple/simple.bat
new file mode 100644
index 0000000..fa8f118
--- /dev/null
+++ b/test/simple/simple.bat
@@ -0,0 +1,3 @@
+@echo off
+REM Script generated automatically by tecmake v3.13
+..\bin\Win32\simple.exe  %*
diff --git a/test/simple/simple.c b/test/simple/simple.c
new file mode 100644
index 0000000..efdee2e
--- /dev/null
+++ b/test/simple/simple.c
@@ -0,0 +1,1312 @@
+/*
+
+  Simple Draw Application
+
+  Shows the same picture on several canvas. Used to quick test the CD library and
+  to demonstrate the use of CD library functions.
+
+  This module uses only the CD library, there is another module to initialize the Window and its menus.
+
+*/
+
+
+#include "cd.h"
+#include "cdcgm.h"
+#include "cddgn.h"
+#include "cddxf.h"
+#include "cdclipbd.h"
+#include "cdemf.h"
+#include "cdimage.h"
+#include "cdirgb.h"
+#include "cdmf.h"
+#include "cdprint.h"
+#include "cdps.h"
+#include "cdpdf.h"
+#include "cdwmf.h"
+#include "cdiup.h"
+#include "cddbuf.h"
+#include "cddebug.h"
+#include "wd.h"
+#include "cdgdiplus.h"
+
+#include "simple.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <memory.h>
+#include <string.h>
+
+/* Global variables */
+
+cdCanvas *winCanvas = NULL;        /* The window drawing canvas */
+char* winData = NULL;
+cdCanvas *dbCanvas = NULL;        /* The double buffer canvas */
+cdCanvas *curCanvas = NULL;        /* The current canvas */
+
+int clipping = CD_CLIPOFF;                     /* Clipping flag, same as the CD */
+int write_mode = CD_REPLACE;                   /* Write Mode flag, same as the CD */
+int gdpiplus = 0;
+int simple_draw = 0;
+int use_transform = 0;
+int simulate = 0;
+
+enum {DRAW_ALL, DRAW_TEXTFONTS, DRAW_TEXTALIGN, DRAW_TEST};
+
+#define STYLE_SIZE 10 /* A small pattern and stipple size */
+long pattern[STYLE_SIZE*STYLE_SIZE];          /* Pattern buffer */
+unsigned char stipple[STYLE_SIZE*STYLE_SIZE]; /* Stipple buffer */
+
+#define IMAGE_SIZE 100
+unsigned char red[IMAGE_SIZE*IMAGE_SIZE];       /* Red image buffer */
+unsigned char green[IMAGE_SIZE*IMAGE_SIZE];     /* Green image buffer */
+unsigned char blue[IMAGE_SIZE*IMAGE_SIZE];      /* Blue image buffer */
+unsigned char alpha[IMAGE_SIZE*IMAGE_SIZE];     /* Alpha image buffer */
+
+
+/* Prototype of the function that makes the drawing independent of canvas. */
+void SimpleDraw(void);
+
+void SimpleInitAlpha(int width, int height, unsigned char* _alpha)
+{
+  int c, l;
+  /* initialize the alpha image buffer with a degrade from transparent to opaque */
+  for (l = 0; l < height; l++)
+    for (c = 0; c < width; c++)
+      _alpha[l*width + c] = (unsigned char)((c*255)/(width-1));
+}
+
+void SimpleCreateCanvasWindow(void)
+{
+  /* creates the canvas based in an existing window */
+  if (gdpiplus) cdUseContextPlus(1);
+  winCanvas = cdCreateCanvas(CD_IUP, winData);
+  if (gdpiplus) cdUseContextPlus(0);
+  curCanvas = winCanvas;
+}
+
+void SimpleCreateCanvas(char* data)
+{
+  int c, l;
+
+  memset(pattern, 0xFF, STYLE_SIZE*STYLE_SIZE*4);
+
+  pattern[11] = CD_RED;   /*------------*/
+  pattern[21] = CD_RED;   /*  0123456789*/               
+  pattern[31] = CD_RED;   /*            */               
+  pattern[41] = CD_RED;   /*9 WWWWWWWWWW*/               
+  pattern[51] = CD_RED;   /*8 WWWWGGGGGW*/               
+  pattern[12] = CD_RED;   /*7 WWWGGGGGBW*/                                         
+  pattern[22] = CD_RED;   /*6 WWGGGGGBBW*/                                         
+  pattern[32] = CD_RED;   /*5 WrrrrrBBBW*/                                         
+  pattern[42] = CD_RED;   /*4 WrrrrrBBBW*/                                         
+  pattern[52] = CD_RED;   /*3 WrrrrrBBWW*/                                         
+  pattern[13] = CD_RED;   /*2 WrrrrrBWWW*/                                         
+  pattern[23] = CD_RED;   /*1 WrrrrrWWWW*/                                         
+  pattern[33] = CD_RED;   /*0 WWWWWWWWWW*/                                         
+  pattern[43] = CD_RED;   /*------------*/                                         
+  pattern[53] = CD_RED;                                            
+  pattern[14] = CD_RED;   pattern[15] = CD_RED;
+  pattern[24] = CD_RED;   pattern[25] = CD_RED;
+  pattern[34] = CD_RED;   pattern[35] = CD_RED;
+  pattern[44] = CD_RED;   pattern[45] = CD_RED;
+  pattern[54] = CD_RED;   pattern[55] = CD_RED;
+  
+  pattern[26] = CD_BLUE;  pattern[37] = CD_BLUE;
+  pattern[36] = CD_BLUE;  pattern[47] = CD_BLUE;
+  pattern[46] = CD_BLUE;  pattern[57] = CD_BLUE;
+  pattern[56] = CD_BLUE;  pattern[67] = CD_BLUE;
+  
+  pattern[48] = CD_BLUE;  pattern[62] = CD_GREEN;
+  pattern[58] = CD_BLUE;  pattern[63] = CD_GREEN;
+  pattern[68] = CD_BLUE;  pattern[64] = CD_GREEN;
+  pattern[78] = CD_BLUE;  pattern[65] = CD_GREEN;
+                               pattern[66] = CD_GREEN;
+
+  pattern[73] = CD_GREEN; pattern[84] = CD_GREEN;
+  pattern[74] = CD_GREEN; pattern[85] = CD_GREEN;
+  pattern[75] = CD_GREEN; pattern[86] = CD_GREEN;
+  pattern[76] = CD_GREEN; pattern[87] = CD_GREEN;
+  pattern[77] = CD_GREEN; pattern[88] = CD_GREEN;
+
+  /* initialize the stipple buffer with cross pattern */
+  for (l = 0; l < STYLE_SIZE; l++)
+    for (c = 0; c < STYLE_SIZE; c++)
+      stipple[l*STYLE_SIZE + c] = (c % 4) == 0? 1: 0;
+
+  SimpleInitAlpha(IMAGE_SIZE, IMAGE_SIZE, alpha);
+
+  winData = data;
+  SimpleCreateCanvasWindow();
+  SimpleDrawWindow();
+}
+
+int SimpleTransform(void)
+{
+  use_transform = !use_transform;
+  SimpleDrawRepaint();
+  return 0;
+}
+
+int SimpleContextPlus(void)
+{
+  gdpiplus = !gdpiplus;
+  SimpleKillCanvas();
+  SimpleCreateCanvasWindow();
+  SimpleDrawRepaint();
+  return 0;
+}
+
+void PlayCanvasDriver(cdContext* ctx, char* StrData)
+{
+  int w, h;
+  cdActivate(curCanvas);
+  cdBackground(CD_WHITE);
+  cdClear();
+  cdGetCanvasSize(&w, &h, 0, 0);
+  cdPlay(ctx, 100, w-100, 100, h-100, StrData);
+//  cdPlay(ctx, 0, 0, 0, 0, StrData);
+}
+
+int SimplePlayClipboard(void)
+{
+  PlayCanvasDriver(CD_CLIPBOARD, NULL);
+  return 0;
+}
+
+int SimplePlayCGMBin(void)
+{
+  PlayCanvasDriver(CD_CGM, "simple_b.cgm");
+  return 0;
+}
+
+int SimplePlayCGMText(void)
+{
+  PlayCanvasDriver(CD_CGM, "simple_t.cgm");
+  return 0;
+}
+
+int SimplePlayMetafile(void)
+{
+  PlayCanvasDriver(CD_METAFILE, "simple.mf");
+  return 0;
+}
+
+int SimplePlayWMF(void)
+{
+  PlayCanvasDriver(CD_WMF, "simple.wmf");
+  return 0;
+}
+
+int SimplePlayEMF(void)
+{
+  PlayCanvasDriver(CD_EMF, "simple.emf");
+  return 0;
+}
+
+int SimpleDrawRepaint(void)
+{
+  cdActivate(curCanvas);
+  SimpleDraw();
+  cdFlush();
+  return 0;
+}
+
+int SimpleDrawWindow(void)
+{
+  curCanvas = winCanvas;
+  return SimpleDrawRepaint();
+}
+
+void DrawCanvasDriver(cdContext* ctx, char* StrData)
+{
+  cdCanvas* tmpCanvas = cdCreateCanvas(ctx, StrData);
+  if (tmpCanvas == NULL) return;
+  cdActivate(tmpCanvas);
+  SimpleDraw();
+  cdKillCanvas(tmpCanvas);
+  cdActivate(curCanvas);
+}
+
+void DrawCanvasDriverSize(cdContext* ctx, char* name, int pixels)
+{
+  char StrData[100];
+  int w, h;
+  double w_mm, h_mm;
+  cdActivate(curCanvas);
+  cdGetCanvasSize(&w, &h, &w_mm, &h_mm);
+  if (pixels)
+    sprintf(StrData, "%s %dx%d", name, w, h);
+  else
+    sprintf(StrData, "%s %gx%g", name, w_mm, h_mm);
+  DrawCanvasDriver(ctx, StrData);
+}
+
+void DrawCanvasDriverSizeParam(cdContext* ctx, char* param)
+{
+  char StrData[100];
+  int w, h;
+  cdActivate(curCanvas);
+  cdGetCanvasSize(&w, &h, 0, 0);
+  sprintf(StrData, "%dx%d %s", w, h, param);
+  DrawCanvasDriver(ctx, StrData);
+}
+
+int SimpleDrawDebug(void)
+{
+  DrawCanvasDriverSize(CD_DEBUG, "simple_debug.txt", 0);
+  return 0;
+}
+
+int SimpleDrawCGMText(void)
+{
+  DrawCanvasDriverSize(CD_CGM, "simple_t.cgm - t", 0);
+  return 0;
+}
+
+int SimpleDrawCGMBin(void)
+{
+  DrawCanvasDriverSize(CD_CGM, "simple_b.cgm", 0);
+  return 0;
+}
+
+int SimpleDrawDXF(void)
+{
+  DrawCanvasDriverSize(CD_DXF, "simple.dxf", 0);
+  return 0;
+}
+
+int SimpleDrawDGN(void)
+{
+  DrawCanvasDriverSize(CD_DGN, "simple.dgn", 0);
+  return 0;
+}
+
+int SimpleDrawEMF(void)
+{
+  if (gdpiplus) cdUseContextPlus(1);
+  DrawCanvasDriverSize(CD_EMF, "simple.emf", 1);
+  if (gdpiplus) cdUseContextPlus(0);
+  return 0;
+}
+
+int SimpleDrawMetafile(void)
+{
+  DrawCanvasDriverSize(CD_METAFILE, "simple.mf", 0);
+  return 0;
+}
+
+int SimpleDrawPS(void)
+{
+  DrawCanvasDriver(CD_PS, "simple.ps");
+  return 0;
+}
+
+int SimpleDrawPDF(void)
+{
+//  DrawCanvasDriver(CD_PDF, "simple.pdf");
+  return 0;
+}
+
+int SimpleDrawEPS(void)
+{
+  DrawCanvasDriver(CD_PS, "simple.eps -e");
+  return 0;
+}
+
+int SimpleDrawWMF(void)
+{
+  DrawCanvasDriverSize(CD_WMF, "simple.wmf", 1);
+  return 0;
+}
+
+int SimpleDrawPrint(void)
+{
+  if (gdpiplus) cdUseContextPlus(1);
+  DrawCanvasDriver(CD_PRINTER, "simple print");
+  if (gdpiplus) cdUseContextPlus(0);
+  return 0;
+}
+
+int SimpleDrawPrintDialog(void)
+{
+  if (gdpiplus) cdUseContextPlus(1);
+  DrawCanvasDriver(CD_PRINTER, "simple -d");
+  if (gdpiplus) cdUseContextPlus(0);
+  return 0;
+}
+
+int SimpleDrawClipboardBitmap(void)
+{
+  if (gdpiplus) cdUseContextPlus(1);
+  DrawCanvasDriverSizeParam(CD_CLIPBOARD, "-b");
+  if (gdpiplus) cdUseContextPlus(0);
+  return 0;
+}
+
+int SimpleDrawClipboardMetafile(void)
+{
+  if (gdpiplus) cdUseContextPlus(1);
+  DrawCanvasDriverSizeParam(CD_CLIPBOARD, "-m");
+  if (gdpiplus) cdUseContextPlus(0);
+  return 0;
+}
+
+int SimpleDrawClipboardEMF(void)
+{
+  if (gdpiplus) cdUseContextPlus(1);
+  DrawCanvasDriverSizeParam(CD_CLIPBOARD, "");
+  if (gdpiplus) cdUseContextPlus(0);
+  return 0;
+}
+
+int SimpleReplace(void)
+{
+  write_mode = CD_REPLACE;
+  cdActivate(curCanvas);
+  SimpleDrawAll();
+  return 0;
+}
+
+int SimpleXor(void)
+{
+  write_mode = CD_XOR;
+  cdActivate(curCanvas);
+  SimpleDrawAll();
+  return 0;
+}
+
+int SimpleNotXor(void)
+{
+  write_mode = CD_NOT_XOR;
+  cdActivate(curCanvas);
+  SimpleDrawAll();
+  return 0;
+}
+
+int SimpleClippingOff(void)
+{
+  clipping = CD_CLIPOFF;
+  cdActivate(curCanvas);
+  SimpleDrawAll();
+  return 0;
+}
+
+int SimpleClippingArea(void)
+{
+  clipping = CD_CLIPAREA;
+  cdActivate(curCanvas);
+  SimpleDrawAll();
+  return 0;
+}
+
+int SimpleClippingPolygon(void)
+{
+  clipping = CD_CLIPPOLYGON;
+  cdActivate(curCanvas);
+  SimpleDrawAll();
+  return 0;
+}
+
+int SimpleClippingRegion(void)
+{
+  clipping = CD_CLIPREGION;
+  cdActivate(curCanvas);
+  SimpleDrawAll();
+  return 0;
+}
+
+void* CreateImageRGBA(int w, int h)
+{
+  void* myImage;
+  unsigned char * _alpha = malloc(w * h);
+  SimpleInitAlpha(w, h, _alpha);
+  cdSetAttribute("IMAGEALPHA", (char*)_alpha);    
+  cdSetAttribute("IMAGEFORMAT", "32");    // afetara� o proximo cdCreateImage
+  myImage = cdCreateImage(w, h);
+  cdSetAttribute("IMAGEFORMAT", NULL);    // remove o atributo para nao afetar outros cdCreateImage
+  return myImage;
+}
+
+int SimpleDrawImage(void)
+{
+  if (dbCanvas) cdKillCanvas(dbCanvas);
+
+  if (gdpiplus) cdUseContextPlus(1);
+  dbCanvas = cdCreateCanvas(CD_DBUFFER, winCanvas);
+  if (gdpiplus) cdUseContextPlus(0);
+
+  curCanvas = dbCanvas;
+  SimpleDrawRepaint();
+
+  return 0;
+}
+
+int SimpleDrawImageRGB(void)
+{
+  if (dbCanvas) cdKillCanvas(dbCanvas);
+
+  if (gdpiplus) cdUseContextPlus(1);
+  dbCanvas = cdCreateCanvas(CD_DBUFFERRGB, winCanvas);
+  if (gdpiplus) cdUseContextPlus(0);
+
+  curCanvas = dbCanvas;
+  SimpleDrawRepaint();
+
+  return 0;
+}
+
+int SimpleDrawSimulate(void)
+{
+  cdActivate(curCanvas);
+
+  simulate = !simulate;
+
+  if (simulate)
+    cdSimulate(CD_SIM_ALL);
+  else
+    cdSimulate(CD_SIM_NONE);
+
+  SimpleDrawRepaint();
+
+  return 0;
+}
+
+void SimpleKillCanvas(void)
+{
+  if (dbCanvas)
+  {
+    cdKillCanvas(dbCanvas);
+    dbCanvas = NULL;
+  }
+  if (winCanvas)
+  {
+    cdKillCanvas(winCanvas);
+    winCanvas = NULL;
+  }
+}
+
+void SimpleDraw(void)
+{
+  if (simple_draw == DRAW_TEXTFONTS)
+    SimpleDrawTextFonts();
+  else if (simple_draw == DRAW_TEXTALIGN)
+    SimpleDrawTextAlign();
+  else if (simple_draw == DRAW_TEST)
+    SimpleDrawTest();
+  else
+    SimpleDrawAll();
+}
+
+int SimpleDrawAll(void)
+{
+  int w, h;
+  cdGetCanvasSize(&w, &h, 0, 0);
+  
+  simple_draw = DRAW_ALL;
+
+  wdViewport(0,w-1,0,h-1);
+  if (w>h)
+    wdWindow(0,(double)w/(double)h,0,1);
+  else
+    wdWindow(0,1,0,(double)h/(double)w);
+
+  /* Clear the background to be white */
+//  cdBackground(CD_WHITE);
+  cdBackground(CD_GREEN);
+  cdClear();
+
+  cdLineWidth(3);
+  cdForeground(cdEncodeAlpha(CD_DARK_MAGENTA, 128));
+  cdRect(100, 200, 100, 200);
+
+  cdBegin(CD_OPEN_LINES);
+  cdVertex(300, 250);
+  cdVertex(320, 270);
+  cdVertex(350, 260);
+  cdVertex(340, 200);
+  cdVertex(310, 210);
+  cdEnd();
+  
+  cdInteriorStyle(CD_SOLID);
+
+  cdForeground(CD_RED);
+  cdLineWidth(3);
+  {
+    int dashes[] = {20, 15, 5, 5};
+    cdLineStyleDashes(dashes, 4);
+  }
+  cdLineStyle(CD_CUSTOM);
+  cdLine(0, 0, w-1, h-1);
+
+  cdForeground(CD_BLUE);
+  cdLineWidth(10);
+  cdLineStyle(CD_DOTTED);
+  //cdLine(0, 0, 500, 500);
+//  wdLine(0, 1, 1, 0);
+  cdLine(0, h-1, w-1, 0);
+
+  switch(clipping)
+  {
+  case CD_CLIPOFF:
+    cdClip(CD_CLIPOFF);
+    break;
+  case CD_CLIPAREA:
+    /* Defines the clipping area equals the canvas area minus a 100 pixels margin. */
+    cdClipArea(100, w - 100, 100, h - 100);
+    cdClip(CD_CLIPAREA);
+    break;
+  case CD_CLIPPOLYGON:
+    cdBegin(CD_CLIP);
+    cdVertex(100, 100);
+    cdVertex(w - 100, 100);
+    cdVertex(w / 2, h - 100);
+    cdEnd();
+    cdClip(CD_CLIPPOLYGON);
+    break;
+  case CD_CLIPREGION:
+    cdTextAlignment(CD_CENTER);
+    cdFont(CD_TIMES_ROMAN, CD_BOLD, 50);
+
+    cdBegin(CD_REGION);
+    cdRegionCombineMode(CD_UNION);
+    cdBox(100, 200, 100, 200);
+    cdSector(w/2-50, h/2+50, 150, 150, 0, 360);
+    cdSector(w/2-50, h/2-50, 150, 150, 0, 360);
+    cdSector(w/2+50, h/2+50, 150, 150, 0, 360);
+    cdSector(w/2+50, h/2-50, 150, 150, 0, 360);
+    cdRegionCombineMode(CD_DIFFERENCE); 
+    cdText(w/2, h/2, "TEXT");
+    cdEnd();
+//    cdOffsetRegion(-50, 50);
+    cdClip(CD_CLIPREGION);
+
+    cdForeground(CD_DARK_RED);
+    cdBox(0,w,0,h);
+    break;
+  }
+
+  switch(write_mode)
+  {
+  case CD_REPLACE:
+    cdWriteMode(CD_REPLACE);
+    break;
+  case CD_XOR:
+    cdWriteMode(CD_XOR);
+    break;
+  case CD_NOT_XOR:
+    cdWriteMode(CD_NOT_XOR);
+    break;
+  }
+
+  if (use_transform)
+  {
+    cdCanvasTransform(cdActiveCanvas(), NULL);
+    cdCanvasTransformTranslate(cdActiveCanvas(), w/2, h/2);
+    cdCanvasTransformRotate(cdActiveCanvas(), 30);
+    cdCanvasTransformScale(cdActiveCanvas(), 0.5, 0.5);
+    cdCanvasTransformTranslate(cdActiveCanvas(), -w/2, -h/2);
+  }
+
+//  cdSetfAttribute("ROTATE", "15 %d %d", w/2, h/2);
+
+  cdLineStyle(CD_CONTINUOUS);
+  cdLineWidth(1);
+  cdBackOpacity(CD_TRANSPARENT); 
+                            
+  cdForeground(CD_MAGENTA);
+  cdSector(w-100, 100, 100, 100, 50, 180);
+  cdForeground(CD_RED);
+  cdArc(100, 100, 100, 100, 50, 180);
+
+  cdForeground(CD_YELLOW);
+  cdBox(w/2 - 100, w/2 + 100, h/2 - 100, h/2 + 100); 
+
+  cdTextAlignment(CD_CENTER);
+  cdTextOrientation(70);
+  cdFont(CD_TIMES_ROMAN, CD_BOLD, 24);
+
+  {
+    int rect[8];
+    cdTextBounds(w/2, h/2, "cdMin Draw (���)", rect);
+    cdForeground(CD_RED);
+    cdBegin(CD_CLOSED_LINES);
+    cdVertex(rect[0], rect[1]);
+    cdVertex(rect[2], rect[3]);
+    cdVertex(rect[4], rect[5]);
+    cdVertex(rect[6], rect[7]);
+    cdEnd();
+  }
+  cdForeground(CD_BLUE);
+  cdText(w/2, h/2, "cdMin Draw (���)");
+  cdTextOrientation(0);
+
+  wdBox(0.20, 0.30, 0.40, 0.50);
+  cdForeground(CD_RED);
+  wdLine(0.20, 0.40, 0.30, 0.50);
+
+//  wdVectorTextDirection(0, 0, 1, 1);
+  wdVectorCharSize(0.07);
+
+//  wdVectorText(0.1, 0.4, "�� ����� ����� ����� �����");
+//  wdVectorText(0.1, 0.2, "�� ����� ����� ����� �����");
+  //{
+  //  int i;
+  //  char t[2];
+  //  char s[10];
+  //  int x = 20;
+  //  int y = 0;
+  //  t[1] = 0;
+  //  for (i = 0; i < 256; i++)
+  //  {
+  //    int dx = 90;
+  //    t[0] = (char)i;
+  //    sprintf(s, "%d", i);
+  //    cdText(x, y, s);
+  //    cdText(x+dx, y, t);
+  //    cdVectorText(x+2*dx, y, t);
+  //    
+  //    x += 3*dx + 2*dx/3;
+  //    if ((i+1) % 7 == 0)
+  //    {
+  //      x = 20;
+  //      y += 90;
+  //    }
+
+  //  }
+  //}
+
+  {
+    double rect[8];
+    cdForeground(CD_RED);
+    if (gdpiplus)
+      wdGetVectorTextBounds("WDj-Plus", 0.25, 0.35, rect);
+    else
+      wdGetVectorTextBounds("WDj", 0.25, 0.35, rect);
+    cdBegin(CD_CLOSED_LINES);
+    wdVertex(rect[0], rect[1]);
+    wdVertex(rect[2], rect[3]);
+    wdVertex(rect[4], rect[5]);
+    wdVertex(rect[6], rect[7]);
+    cdEnd();
+  }
+
+  cdPixel(10, h/2+0, CD_RED);
+  cdPixel(11, h/2+1, CD_GREEN);
+  cdPixel(12, h/2+2, CD_BLUE);
+
+  /* draws all the mark type possibilities */
+  cdForeground(CD_RED);
+  cdMarkSize(30);
+  cdMarkType(CD_PLUS);
+  cdMark(200, 200);
+  cdMarkType(CD_CIRCLE);
+  cdMark(w - 200, 200);
+  cdMarkType(CD_HOLLOW_CIRCLE);
+  cdMark(200, h - 200);
+  cdMarkType(CD_DIAMOND);
+  cdMark(w - 200, h - 200);
+
+  /* draws all the line style possibilities */
+  cdLineWidth(1);
+  cdLineStyle(CD_CONTINUOUS);
+  cdLine(0, 10, w, 10);
+  cdLineStyle(CD_DASHED);
+  cdLine(0, 20, w, 20);
+  cdLineStyle(CD_DASH_DOT);
+  cdLine(0, 30, w, 30);
+  cdLineStyle(CD_DASH_DOT_DOT);
+  cdLine(0, 40, w, 40);
+
+  /* draws all the hatch style possibilities */
+  cdHatch(CD_VERTICAL); 
+  cdBox(0, 50, h - 60, h);
+  cdHatch(CD_FDIAGONAL); 
+  cdBox(50, 100, h - 60, h);
+  cdHatch(CD_BDIAGONAL); 
+  cdBox(100, 150, h - 60, h);
+  cdHatch(CD_CROSS); 
+  cdBox(150, 200, h - 60, h);
+  cdHatch(CD_HORIZONTAL); 
+  cdBox(200, 250, h - 60, h);
+  cdHatch(CD_DIAGCROSS); 
+  cdBox(250, 300, h - 60, h);
+
+  /* closed polygon */
+  cdBegin(CD_CLOSED_LINES);
+  cdVertex(w/2, h - 100); 
+  cdVertex(w/2 + 50, h - 150); 
+  cdVertex(w/2, h - 200); 
+  cdVertex(w/2 - 50, h - 150); 
+  cdEnd();
+
+  /* hatch filled polygon */
+  cdHatch(CD_DIAGCROSS); 
+  cdBegin(CD_FILL);
+  cdVertex(100, h/2); 
+  cdVertex(150, h/2 + 50); 
+  cdVertex(200, h/2); 
+  cdVertex(150, h/2 - 50); 
+  cdEnd();
+
+  /* pattern filled polygon */
+  cdPattern(STYLE_SIZE, STYLE_SIZE, pattern);
+  cdBegin(CD_FILL);
+  cdVertex(w - 100, h/2); 
+  cdVertex(w - 150, h/2 + 50); 
+  cdVertex(w - 200, h/2); 
+  cdVertex(w - 150, h/2 - 50); 
+  cdEnd();
+  
+  /* stipple filled polygon */
+  cdStipple(STYLE_SIZE, STYLE_SIZE, stipple);
+  cdBegin(CD_FILL);
+  cdVertex(w/2, 100); 
+  cdVertex(w/2 + 50, 150); 
+  cdVertex(w/2, 200); 
+  cdVertex(w/2 - 50, 150); 
+  cdEnd();
+
+  cdBegin(CD_BEZIER);
+  cdVertex(100, 100); 
+  cdVertex(150, 200); 
+  cdVertex(180, 250); 
+  cdVertex(180, 200); 
+  cdVertex(180, 150); 
+  cdVertex(150, 100); 
+  cdVertex(300, 100); 
+  cdEnd();
+
+  cdLineWidth(2);
+  cdLineStyle(CD_CONTINUOUS);
+  if (gdpiplus)
+    wdVectorText(0.25, 0.35, "WDj-Plus");
+  else
+    wdVectorText(0.25, 0.35, "WDj");
+
+  /* always clear the image buffer contents */
+//#define IMAGE_SIZE 16
+  memset(red, 0xFF, IMAGE_SIZE*IMAGE_SIZE/2);
+  memset(green, 0x5F, IMAGE_SIZE*IMAGE_SIZE/2);
+  memset(blue, 0x5F, IMAGE_SIZE*IMAGE_SIZE/2);
+  memset(red+IMAGE_SIZE*IMAGE_SIZE/2, 0x5F, IMAGE_SIZE*IMAGE_SIZE/2);
+  memset(green+IMAGE_SIZE*IMAGE_SIZE/2, 0x8F, IMAGE_SIZE*IMAGE_SIZE/2);
+  memset(blue+IMAGE_SIZE*IMAGE_SIZE/2, 0x5F, IMAGE_SIZE*IMAGE_SIZE/2);
+  memset(red+IMAGE_SIZE*(IMAGE_SIZE-1), 0, IMAGE_SIZE);
+  memset(green+IMAGE_SIZE*(IMAGE_SIZE-1), 0, IMAGE_SIZE);
+  memset(blue+IMAGE_SIZE*(IMAGE_SIZE-1), 0, IMAGE_SIZE);
+  memset(red, 0, IMAGE_SIZE);
+  memset(green, 0, IMAGE_SIZE);
+  memset(blue, 0, IMAGE_SIZE);
+  {
+    int i, offset;
+    for (i = 0; i < IMAGE_SIZE; i++)
+    {
+      offset = i*IMAGE_SIZE;
+      red[offset] = 0;
+      green[offset] = 0;
+      blue[offset] = 0;
+      red[offset+IMAGE_SIZE-1] = 0;
+      green[offset+IMAGE_SIZE-1] = 0;
+      blue[offset+IMAGE_SIZE-1] = 0;
+    }
+  }
+
+  //cdSetAttribute("ANTIALIAS", "0");
+//  cdGetImageRGB(red, green, blue, w/2 - 50, h/2-50, 100, 100);
+//  cdPutImageRectRGB(14, 13, red, green, blue, -20, -15, 649, 603, 0, 13, 0, 12);
+//  cdPutImageRectRGB(16, 16, red, green, blue, 10, 10, 608, 608, 5, 10, 5, 10);
+//  cdPutImageRectRGB(16, 16, red, green, blue, 10, 10, 64, 64, 5, 10, 5, 10);
+
+//  cdPutImageRGB(IMAGE_SIZE, IMAGE_SIZE, red, green, blue, 100, h - 200, IMAGE_SIZE, IMAGE_SIZE);
+//  cdPutImageRGBA(IMAGE_SIZE, IMAGE_SIZE, red, green, blue, alpha, 100, h - 200, IMAGE_SIZE, IMAGE_SIZE);
+  cdPutImageRGB(IMAGE_SIZE, IMAGE_SIZE, red, green, blue, w - 400, h - 310, 3*IMAGE_SIZE, 3*IMAGE_SIZE);
+//  cdPutImageRGBA(IMAGE_SIZE, IMAGE_SIZE, red, green, blue, alpha, w - 400, h - 310, 3*IMAGE_SIZE, 3*IMAGE_SIZE);
+
+  cdSetAttribute("ROTATE", NULL);
+  if (use_transform)
+    cdCanvasTransform(cdActiveCanvas(), NULL);
+  cdClip(CD_CLIPOFF);
+  cdFlush();
+
+  return 0;
+}
+
+void DrawTextBox(int x, int y, char* text)
+{
+  int xmin, xmax, ymin, ymax;
+
+  cdLineWidth(1);
+  cdLineStyle(CD_CONTINUOUS);
+
+  /* bounding box */
+  cdTextBox(x, y, text, &xmin, &xmax, &ymin, &ymax);
+  cdForeground(CD_GREEN);
+  cdRect(xmin, xmax, ymin, ymax);
+
+  /* baseline */
+  cdForeground(CD_RED);
+  cdLine(xmin, y, xmax, y);
+
+  /* reference point */
+  cdForeground(CD_BLUE);
+  cdMarkType(CD_PLUS);
+  cdMarkSize(30);
+  cdMark(x, y);
+
+  cdForeground(CD_BLACK);
+  cdText(x, y, text);
+}
+
+int SimpleDrawTextAlign(void)
+{
+  int w, h, i, xoff, yoff;
+
+  int text_aligment[] = {
+  CD_NORTH,
+  CD_SOUTH,
+  CD_EAST,
+  CD_WEST,
+  CD_NORTH_EAST,
+  CD_NORTH_WEST,
+  CD_SOUTH_EAST,
+  CD_SOUTH_WEST,
+  CD_CENTER,
+  CD_BASE_CENTER,
+  CD_BASE_RIGHT,
+  CD_BASE_LEFT
+  };
+
+  char* text_aligment_str[] = {
+  "jNorth (�y)",
+  "jSouth (�y)",
+  "jEast (�y)",
+  "jWest (�y)",
+  "jNorth East (�y)",
+  "jNorth West (�y)",
+  "jSouth East (�y)",
+  "jSouth West (�y)",
+  "jCenter (�y)",
+  "jBase Center (�y)",
+  "jBase Right (�y)",
+  "jBase Left (�y)"
+  };
+
+  cdGetCanvasSize(&w, &h, 0, 0);
+
+  cdBackground(CD_WHITE);
+  cdClear();
+
+  simple_draw = DRAW_TEXTALIGN;
+
+//  cdTextOrientation(45);
+
+  xoff = w/4;
+  yoff = h/7;
+
+//cdFont(CD_TIMES_ROMAN, CD_PLAIN, 14);
+  cdFont(CD_HELVETICA, CD_PLAIN, 18);
+
+  for (i = 0; i < 12; i++)
+  {
+    cdTextAlignment(text_aligment[i]);
+    if (i < 6)
+    {
+      DrawTextBox(xoff, yoff*(i+1), text_aligment_str[i]);
+    }
+    else
+    {
+      DrawTextBox(3*xoff, yoff*(i-5), text_aligment_str[i]);
+    }
+  }
+  cdFlush();
+  return 0;
+}
+
+void DrawTextFont(int font, int size, int xoff, int yoff, char* text)
+{
+  cdFont(font, CD_PLAIN, size);
+  DrawTextBox(xoff, yoff, text);
+
+  cdFont(font, CD_BOLD, size);
+  DrawTextBox(2*xoff, yoff, text);
+
+  cdFont(font, CD_ITALIC, size);
+  DrawTextBox(3*xoff, yoff, text);
+
+  cdFont(font, CD_BOLD_ITALIC, size);
+  DrawTextBox(4*xoff, yoff, text);
+}
+
+int SimpleDrawTextFonts(void)
+{
+  int xoff, yoff, size;
+
+  cdBackground(CD_WHITE);
+  cdClear();
+
+  simple_draw = DRAW_TEXTFONTS;
+
+  xoff = 470;
+  yoff = 150;
+  size = -30;
+
+  cdTextAlignment(CD_CENTER);
+
+//  DrawTextFont(CD_COURIER, size, xoff, yoff, "Courier");
+
+//  DrawTextFont(CD_TIMES_ROMAN, size, xoff, 2*yoff, "Times Roman");
+
+//  DrawTextFont(CD_HELVETICA, size, xoff, 3*yoff, "Helvetica");
+
+//  DrawTextFont(CD_SYSTEM, size, xoff, 4*yoff, "System");
+
+  {
+//    static char native[50] = "Tecmedia, -60";
+//    static char native[50] = "-*-helvetica-medium-r-*-*-8-*";
+//    static char native[50] = "Edwardian Script ITC, 24";
+//    cdSetAttribute("ADDFONTMAP","Edwardian Script ITC=ITCEDSCR");
+
+//    char native[50] = "Book Antiqua, 24";
+//    cdSetAttribute("ADDFONTMAP", "Book Antiqua=BKANT");
+
+//    cdNativeFont("-d");
+//    cdNativeFont(native);
+//    DrawTextBox(xoff, yoff, native);
+//    DrawTextBox(xoff, yoff, "The quick brown fox.");
+  }
+
+  //cdNativeFont("Tecmedia, 36");
+
+  cdSetAttribute("ADDFONTMAP", "WingDings=WingDing");
+  cdNativeFont("WingDings, 36");
+
+  cdText(500, 50, "X");
+  //cdText(500, 50, "abcdefghijklmnopqrstuvwxyz");
+  //cdText(500, 150, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
+  //cdText(500, 250, "1234567890");
+  //cdText(500, 350, "'\"!@#$%�&*()_+-=[]^/;.,");
+
+  //cdFont(CD_COURIER, 0, 22);
+  //cdText(10, 60, "abcdefghijklmnopqrstuvwxyz");
+  //cdText(10, 160, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
+  //cdText(10, 260, "1234567890");
+  //cdText(500, 360, "'\"!@#$%�&*()_+-=[]^/;.,");
+
+  cdFlush();
+  return 0;
+}
+
+void SimpleDrawTest(void)
+//void SimpleDrawMainTest(void)
+{
+  long pattern[16];  /* 4x4 pattern */
+  int w, h;
+  int xmin, xmax, ymin, ymax;
+
+  simple_draw = DRAW_TEST;
+
+/* notice that if we are not using world coordinates 
+   it is harder to position all the objetcs we want. */
+  cdGetCanvasSize(&w, &h, 0, 0);
+
+  cdBackground(CD_WHITE);
+  cdClear();
+
+/* pattern initialization */
+  pattern[0]  = CD_RED;    pattern[1]  = CD_RED;    /* first line */
+  pattern[2]  = CD_YELLOW; pattern[3]  = CD_YELLOW;
+  pattern[4]  = CD_RED;    pattern[5]  = CD_RED;    /* second line */
+  pattern[6]  = CD_YELLOW; pattern[7]  = CD_YELLOW;
+  pattern[8]  = CD_YELLOW; pattern[9]  = CD_YELLOW; /* third line */
+  pattern[10] = CD_YELLOW; pattern[11] = CD_YELLOW;
+  pattern[12] = CD_YELLOW; pattern[13] = CD_YELLOW; /* fourth line */
+  pattern[14] = CD_YELLOW; pattern[15] = CD_YELLOW;
+
+/* set the line attributes */
+  cdLineWidth(4);
+  cdLineStyle(CD_CONTINUOUS);
+
+/* in the center draw a pattern pizza 
+   with a slice mising */
+  cdPattern(4, 4, pattern);
+  cdSector(w/2, h/2, w/2, h/2, 45, 0);
+/* draws a dark red border */
+  cdForeground(CD_DARK_RED);
+  cdInteriorStyle(CD_HOLLOW);
+  cdSector(w/2, h/2, w/2, h/2, 45, 0);
+
+/* on the left a red hash diamond */
+/* notice the the default back opacity is transparent
+   and the pattern of the sector will still be visible
+   inside the hatch where the two objects intersect */
+  cdForeground(CD_RED);
+  cdHatch(CD_DIAGCROSS); 
+  cdBegin(CD_FILL);
+  cdVertex(w/4, h/4); 
+  cdVertex(w/2-w/8, h/2); 
+  cdVertex(w/4, 3*h/4); 
+  cdVertex(w/8, h/2); 
+  cdEnd();
+
+/* draws a blue roof.*/
+  cdForeground(CD_BLUE);
+  cdLine(w/8, h/2, w/4, 3*h/4);
+  cdLine(w/4, 3*h/4, w/2-w/8, h/2);
+
+/* draws a dashed ribbon on the right 
+   with a custom color */
+  cdForeground(cdEncodeColor(100, 25, 200));
+  cdLineStyle(CD_DASH_DOT);
+  cdBegin(CD_BEZIER);
+  cdVertex(3*w/4-20, h/2-50); 
+  cdVertex(3*w/4+150, 3*h/4-50); 
+  cdVertex(3*w/4-150, 3*h/4-50); 
+  cdVertex(3*w/4+20, h/2-50); 
+  cdEnd();
+
+  cdFont(CD_HELVETICA, CD_BOLD, 40);
+  cdTextAlignment(CD_CENTER);
+  cdText(w/2, h/4-50, "Canvas Draw");
+  cdTextBox(w/2, h/4-50, "Canvas Draw", &xmin, &xmax, &ymin, &ymax);
+  cdRect(xmin, xmax, ymin, ymax);
+  cdFlush();
+}
+
+void draw_wd(void)
+{
+  cdBackground(CD_WHITE);
+  cdClear();
+  cdLineStyle(CD_CONTINUOUS);
+  cdLineWidth(1);
+
+  wdVectorTextDirection(0, 0, 1, 1);
+
+  wdVectorCharSize(0.1);
+  wdVectorText(0.25, 0.35, "Vector Text");
+
+  {
+    double rect[8];
+    cdForeground(CD_RED);
+    wdGetVectorTextBounds("Vector Text", 0.25, 0.35, rect);
+    cdBegin(CD_CLOSED_LINES);
+    wdVertex(rect[0], rect[1]);
+    wdVertex(rect[2], rect[3]);
+    wdVertex(rect[4], rect[5]);
+    wdVertex(rect[6], rect[7]);
+    cdEnd();
+  }
+  cdFlush();
+}
+
+void SimpleDrawTestHardCopy(void)
+{
+  int w, h;
+  cdGetCanvasSize(&w, &h, 0, 0);
+  
+  simple_draw = DRAW_ALL;
+
+  wdViewport(0,w-1,0,h-1);
+  if (w>h)
+    wdWindow(0,(double)w/(double)h,0,1);
+  else
+    wdWindow(0,1,0,(double)h/(double)w);
+
+  draw_wd();
+
+  wdHardcopy(CD_CLIPBOARD, "800x600", cdActiveCanvas(), draw_wd );
+  cdFlush();
+}
+
+void SimpleDrawTestImageRGB(void)
+{
+  int size = 2048*2048;
+  unsigned char *red, *green, *blue;
+  cdCanvas* canvas = cdCreateCanvas(CD_IMAGERGB, "2048x2048");
+  cdActivate(canvas);
+
+  red = calloc(size, 1);
+  green = calloc(size, 1);
+  blue = calloc(size, 1);
+
+  cdPutImageRectRGB(2048, 2048, red, green, blue, 0, 3, 2048, 2017, 0, 2047, 3, 2020);
+
+  free(red);
+  free(green);
+  free(blue);
+
+  cdKillCanvas(canvas);
+  cdFlush();
+}
+
+//void SimpleDrawTest(void)
+void SimpleDrawVectorText(void)
+{
+  simple_draw = DRAW_TEST;
+  cdBackground(CD_WHITE);
+  cdClear();
+  cdLineStyle(CD_CONTINUOUS);
+  cdLineWidth(1);
+
+//  wdVectorText(0.1, 0.4, "���� ����� ����� ����� �����");
+//  wdVectorText(0.1, 0.2, "���� ����� ����� ����� ����� ");
+  cdVectorFont("../../etc/vectorfont26.txt"); /* original Simplex II */
+  {
+    int i;
+    char t[2];
+    char s[10];
+    int x = 10;
+    int y = 600;
+    t[1] = 0;
+  cdFont(CD_COURIER, CD_BOLD, 14);
+  cdVectorCharSize(25);
+    for (i = 128; i < 256; i++)
+    {
+      int dx = 30;
+      t[0] = (char)i;
+      sprintf(s, "%3d", i);
+      cdForeground(CD_DARK_RED);
+      cdText(x, y, s);
+//      cdText(x+dx, y, t);
+      cdForeground(CD_BLACK);
+      cdVectorText(x+2*dx-10, y, t);
+      
+      x += 3*dx;
+      if ((i+1) % 8 == 0)
+      {
+        x = 10;
+        y -= 30;
+      }
+    }
+  //cdFont(CD_TIMES_ROMAN, CD_PLAIN, 24);
+  //cdVectorCharSize(24);
+  //  for (i = 192; i < 256; i++)
+  //  {
+  //    int dx = 92;
+  //    t[0] = (char)i;
+  //    sprintf(s, "%d", i);
+  //    cdText(x, y, s);
+  //    cdText(x+dx, y, t);
+  //    cdVectorText(x+2*dx, y, t);
+  //    
+  //    x += 3*dx + 2*dx/3;
+  //    if ((i+1) % 4 == 0)
+  //    {
+  //      x = 30;
+  //      y += 52;
+  //    }
+  //  }
+  }
+  cdFlush();
+}
+
+typedef struct _point
+{
+  double x, y;
+} point;
+
+point* load_point_file(const char* file_name, int *count)
+{
+  float x, y;
+  point* point_list;
+  int max_count = 100, dummy;
+  FILE* file = fopen(file_name, "rb");
+  if (!file)
+    return NULL;
+
+  point_list = malloc(max_count*sizeof(point));
+
+  /* read header */
+  fscanf(file, "##### %d\n", &dummy);
+
+  *count = 0;
+  while (!feof(file))
+  {
+     if (fscanf(file, "( %g | %g )\n", &x, &y) == 2)
+     {
+       if (*count == max_count)
+       {
+         max_count += 100;
+         point_list = realloc(point_list, max_count*sizeof(point));
+       }
+
+       point_list[*count].x = x;
+       point_list[*count].y = y;
+
+       (*count)++;
+     }
+  }
+
+  fclose(file);
+
+  return point_list;
+}
+
+point square[4] = {
+  {100,100},
+  {200,100},
+  {200,200},
+  {100,200},
+};
+
+point corner[6] = {
+  {100,100},
+  {200,100},
+  {200,200},
+  {150,200},
+  {150,300},
+  {100,300},
+};
+
+//void SimpleDrawTest(void)
+void SimpleDrawPolygon(void)
+{
+  int count, i;
+  point* point_list;
+  char* file_name;
+
+  simple_draw = DRAW_TEST;
+  cdBackground(CD_WHITE);
+  cdClear();
+  cdLineStyle(CD_CONTINUOUS);
+  cdLineWidth(1);
+  cdInteriorStyle(CD_SOLID);
+
+//  file_name = "D:\\Downloads\\TesteCdCanvas\\example_data\\continentes_geom_id_78_polygon_1_440x512.txt";
+//  file_name = "D:\\Downloads\\TesteCdCanvas\\example_data\\continentes_geom_id_78_polygon_1_558x650.txt";
+//  file_name = "D:\\Downloads\\TesteCdCanvas\\example_data\\guanabara_oceano_obj_id_5_geom_id_11_polygon_ring_2.txt";
+  file_name = "D:\\Downloads\\TesteCdCanvas\\example_data\\guanabara_oceano_obj_id_5_geom_id_11_polygon_ring_6.txt";
+//  file_name = "D:\\Downloads\\TesteCdCanvas\\example_data\\guanabara_oceano_obj_id_5_geom_id_11_polygon_ring_15.txt";
+//  file_name = "D:\\Downloads\\TesteCdCanvas\\example_data\\guanabara_oceano_obj_id_5_geom_id_11_polygon_ring_34.txt";
+//  file_name = "D:\\Downloads\\TesteCdCanvas\\example_data\\guanabara_oceano_obj_id_5_geom_id_11_polygon_ring_37.txt";
+//  file_name = "D:\\Downloads\\TesteCdCanvas\\example_data\\guanabara_oceano_obj_id_5_geom_id_11_polygon_ring_53.txt";
+//  file_name = "D:\\Downloads\\TesteCdCanvas\\example_data\\guanabara_oceano_obj_id_5_geom_id_11_polygon_ring_59.txt";
+
+//  point_list = square;
+//  count = 4;
+//  point_list = corner;
+//  count = 6;
+
+  point_list = load_point_file(file_name, &count);
+  if (!point_list)
+    return;
+
+  cdForeground(CD_BLACK);
+  cdBegin(CD_CLOSED_LINES);
+  for (i=0; i<count; i++)
+  {
+    cdVertex((int)point_list[i].x, (int)point_list[i].y);
+  }
+  cdEnd();
+
+  cdForeground(CD_RED);
+  cdBegin(CD_FILL);
+  for (i=0; i<count; i++)
+  {
+    cdVertex((int)point_list[i].x, (int)point_list[i].y);
+  }
+  cdEnd();
+
+  cdFlush();
+
+  free(point_list);
+}
diff --git a/test/simple/simple.dsp b/test/simple/simple.dsp
new file mode 100644
index 0000000..c69b8df
--- /dev/null
+++ b/test/simple/simple.dsp
@@ -0,0 +1,83 @@
+# Microsoft Developer Studio Project File - Name="simple" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Application" 0x0101
+
+CFG=simple - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "simple.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "simple.mak" CFG="simple - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "simple - Win32 Debug" (based on "Win32 (x86) Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "simple - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "..\bin"
+# PROP BASE Intermediate_Dir "..\obj\simple"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "..\bin"
+# PROP Intermediate_Dir "..\obj\simple"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /I "..\..\include" /I "..\..\..\iup\include" /Z7 /W4 /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "__CD__" /D "simple" /D "_CRT_SECURE_NO_DEPRECATE" /D "_MBCS" /Fp".\..\obj\simple/simple.pch" /Fo".\..\obj\simple/" /Fd".\..\obj\simple/" /GZ /c /GX 
+# ADD CPP /nologo /MT /I "..\..\include" /I "..\..\..\iup\include" /Z7 /W4 /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "__CD__" /D "simple" /D "_CRT_SECURE_NO_DEPRECATE" /D "_MBCS" /Fp".\..\obj\simple/simple.pch" /Fo".\..\obj\simple/" /Fd".\..\obj\simple/" /GZ /c /GX 
+# ADD BASE MTL /nologo /tlb".\..\bin\simple.tlb" /win32 
+# ADD MTL /nologo /tlb".\..\bin\simple.tlb" /win32 
+# ADD BASE RSC /l 1046 /d "_DEBUG" 
+# ADD RSC /l 1046 /d "_DEBUG" 
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo 
+# ADD BSC32 /nologo 
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib cd.lib cdiup.lib iup.lib comctl32.lib cdgdiplus.lib gdiplus.lib cdpdflib.lib iupcontrols.lib /nologo /out:"..\bin\simple.exe" /incremental:yes /libpath:"..\..\lib" /libpath:"..\..\..\iup\lib" /debug /pdb:".\..\bin\simple.pdb" /pdbtype:sept /subsystem:windows /MACHINE:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib cd.lib cdiup.lib iup.lib comctl32.lib cdgdiplus.lib gdiplus.lib cdpdflib.lib iupcontrols.lib /nologo /out:"..\bin\simple.exe" /incremental:yes /libpath:"..\..\lib" /libpath:"..\..\..\iup\lib" /debug /pdb:".\..\bin\simple.pdb" /pdbtype:sept /subsystem:windows /MACHINE:I386
+
+!ENDIF
+
+# Begin Target
+
+# Name "simple - Win32 Debug"
+# Begin Source File
+
+SOURCE=iupmain.c
+# End Source File
+# Begin Source File
+
+SOURCE=simple.c
+# End Source File
+# Begin Source File
+
+SOURCE=simple.h
+# End Source File
+# Begin Source File
+
+SOURCE=simple.led
+# End Source File
+# Begin Source File
+
+SOURCE=simple_led.c
+# End Source File
+# End Target
+# End Project
+
diff --git a/test/simple/simple.h b/test/simple/simple.h
new file mode 100644
index 0000000..123b31c
--- /dev/null
+++ b/test/simple/simple.h
@@ -0,0 +1,54 @@
+
+#ifndef __Simple_H
+#define __Simple_H
+
+#include <cd.h>
+
+void SimpleCreateCanvas(char* data);
+void SimpleKillCanvas(void);
+
+int SimplePlayClipboard(void);
+int SimplePlayCGMBin(void);
+int SimplePlayCGMText(void);
+int SimplePlayMetafile(void);
+int SimplePlayWMF(void);
+int SimplePlayEMF(void);
+
+int SimpleDrawDebug(void);
+int SimpleDrawWindow(void);
+int SimpleDrawCGMText(void);
+int SimpleDrawCGMBin(void);
+int SimpleDrawDXF(void);
+int SimpleDrawDGN(void);
+int SimpleDrawEMF(void);
+int SimpleDrawMetafile(void);
+int SimpleDrawPDF(void);
+int SimpleDrawPS(void);
+int SimpleDrawEPS(void);
+int SimpleDrawWMF(void);
+int SimpleDrawPrint(void);
+int SimpleDrawPrintDialog(void);
+int SimpleDrawClipboardBitmap(void);
+int SimpleDrawClipboardMetafile(void);
+int SimpleDrawClipboardEMF(void);
+int SimpleDrawImage(void);
+int SimpleDrawImageRGB(void);
+int SimpleDrawSimulate(void);
+
+int SimpleNotXor(void);
+int SimpleXor(void);
+int SimpleReplace(void);
+int SimpleClippingOff(void);
+int SimpleClippingArea(void);
+int SimpleClippingPolygon(void);
+int SimpleClippingRegion(void);
+
+int SimpleTransform(void);
+int SimpleContextPlus(void);
+int SimpleDrawAll(void);
+int SimpleDrawTextAlign(void);
+int SimpleDrawTextFonts(void);
+void SimpleDrawTest(void);
+int SimpleDrawRepaint(void);
+
+#endif
diff --git a/test/simple/simple.led b/test/simple/simple.led
new file mode 100644
index 0000000..cdf4430
--- /dev/null
+++ b/test/simple/simple.led
@@ -0,0 +1,93 @@
+mnOpen = MENU
+(
+ ITEM("CGM - Binary", SimplePlayCGMBin),
+ ITEM("CGM - Text", SimplePlayCGMText),
+ ITEM("METAFILE", SimplePlayMetafile),
+ ITEM("WMF", SimplePlayWMF),
+ ITEM("EMF", SimplePlayEMF)
+)
+
+mnSaveAs = MENU
+(
+ ITEM("DEBUG", SimpleDrawDebug),
+ ITEM("CGM - Binary", SimpleDrawCGMBin),
+ ITEM("CGM - Text", SimpleDrawCGMText),
+ ITEM("DGN", SimpleDrawDGN),
+ ITEM("DXF", SimpleDrawDXF),
+ ITEM("EMF", SimpleDrawEMF),
+ ITEM("METAFILE", SimpleDrawMetafile),
+ ITEM("PDF", SimpleDrawPDF),
+ ITEM("PS", SimpleDrawPS),
+ ITEM("EPS", SimpleDrawEPS),
+ ITEM("WMF", SimpleDrawWMF)
+)
+
+mnFile = MENU
+(
+ SUBMENU("Open", mnOpen),
+ SUBMENU("Save As", mnSaveAs),
+ SEPARATOR(),
+ ITEM("Print", SimpleDrawPrint),
+ ITEM("Print Dialog...", SimpleDrawPrintDialog),
+ SEPARATOR(),
+ ITEM("Exit", cmdExit)
+)
+
+mnEdit = MENU
+(
+ ITEM("Copy as Metafile", SimpleDrawClipboardMetafile),
+ ITEM("Copy as EMF", SimpleDrawClipboardEMF),
+ ITEM("Copy as Bitmap", SimpleDrawClipboardBitmap),
+ ITEM("Paste", SimplePlayClipboard)
+)
+
+mnClipping = MENU
+(
+ ITEM("Off", SimpleClippingOff),
+ ITEM("Area", SimpleClippingArea),
+ ITEM("Polygon", SimpleClippingPolygon),
+ ITEM("Region", SimpleClippingRegion)
+)
+
+mnWriteMode = MENU
+(
+ ITEM("Replace", SimpleReplace),
+ ITEM("Xor", SimpleXor),
+ ITEM("Not Xor", SimpleNotXor)
+)
+
+mnOptions = MENU
+(
+ SUBMENU("Clipping", mnClipping),
+ SUBMENU("Write Mode", mnWriteMode),
+ ITEM("Simulate", SimpleDrawSimulate),
+ ITEM("Transform", SimpleTransform),
+ ITEM("Context Plus", SimpleContextPlus)
+)    
+
+mnSurface = MENU
+(
+ ITEM("Window", SimpleDrawWindow),
+ ITEM("Server Image", SimpleDrawImage),
+ ITEM("Image RGB", SimpleDrawImageRGB)
+)    
+
+mnPrimitives = MENU
+(
+ ITEM("All", SimpleDrawAll),
+ ITEM("Text Align", SimpleDrawTextAlign),
+ ITEM("Text Fonts", SimpleDrawTextFonts),
+ ITEM("Test", SimpleDrawTest)
+)    
+
+mnSimpleMenu = MENU
+(
+ SUBMENU("File", mnFile),
+ SUBMENU("Edit", mnEdit),
+ SUBMENU("Options", mnOptions),
+ SUBMENU("Surface", mnSurface),
+ SUBMENU("Primitives", mnPrimitives)
+)
+
+SimpleCanvas = CANVAS[BORDER=0](SimpleRepaint)
+SimpleDialog = DIALOG [TITLE="Simple Draw", MENU=mnSimpleMenu](SimpleCanvas)
diff --git a/test/simple/simple.sln b/test/simple/simple.sln
new file mode 100644
index 0000000..fc2222e
--- /dev/null
+++ b/test/simple/simple.sln
@@ -0,0 +1,20 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "simple", "simple.vcproj", "{82BC36B1-9F7A-41D4-A24F-DBE012378CE6}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Global
+	GlobalSection(SolutionConfiguration) = preSolution
+		Debug = Debug
+	EndGlobalSection
+	GlobalSection(ProjectDependencies) = postSolution
+	EndGlobalSection
+	GlobalSection(ProjectConfiguration) = postSolution
+		{82BC36B1-9F7A-41D4-A24F-DBE012378CE6}.Debug.ActiveCfg = Debug|Win32
+		{82BC36B1-9F7A-41D4-A24F-DBE012378CE6}.Debug.Build.0 = Debug|Win32
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+	EndGlobalSection
+	GlobalSection(ExtensibilityAddIns) = postSolution
+	EndGlobalSection
+EndGlobal
diff --git a/test/simple/simple.vcproj b/test/simple/simple.vcproj
new file mode 100644
index 0000000..87a199c
--- /dev/null
+++ b/test/simple/simple.vcproj
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9,00"
+	Name="simple"
+	ProjectGUID="{82BC36B1-9F7A-41D4-A24F-DBE012378CE6}"
+	TargetFrameworkVersion="131072"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\bin"
+			IntermediateDirectory="..\obj\simple"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				TypeLibraryName=".\..\bin/simple.tlb"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\include,..\..\..\iup\include"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;__CD__;simple;_CRT_SECURE_NO_DEPRECATE"
+				RuntimeLibrary="0"
+				PrecompiledHeaderFile=".\..\obj\simple/simple.pch"
+				AssemblerListingLocation=".\..\obj\simple/"
+				ObjectFile=".\..\obj\simple/"
+				ProgramDataBaseFileName=".\..\obj\simple/"
+				WarningLevel="4"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="1"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1046"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalOptions="/MACHINE:I386"
+				AdditionalDependencies="freetype6.lib cd.lib iupcd.lib iup.lib comctl32.lib cdgdiplus.lib gdiplus.lib cdpdflib.lib iupcontrols.lib"
+				OutputFile="..\bin/simple.exe"
+				LinkIncremental="2"
+				SuppressStartupBanner="true"
+				AdditionalLibraryDirectories="..\..\lib,..\..\..\iup\lib"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile=".\..\bin/simple.pdb"
+				SubSystem="2"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<File
+			RelativePath="iupmain.c"
+			>
+		</File>
+		<File
+			RelativePath="simple.c"
+			>
+		</File>
+		<File
+			RelativePath="simple.h"
+			>
+		</File>
+		<File
+			RelativePath="simple.led"
+			>
+		</File>
+		<File
+			RelativePath="simple_led.c"
+			>
+		</File>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/test/simple/simple_led.c b/test/simple/simple_led.c
new file mode 100644
index 0000000..07eebc8
--- /dev/null
+++ b/test/simple/simple_led.c
@@ -0,0 +1,125 @@
+/* Arquivo gerado automaticamente por ledc 2.5         */
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <iup.h>
+
+static Ihandle* named[     13 ];
+
+static Ihandle* decl( char* name, Ihandle* elem, char* first, ...)
+{
+  char *attr, *val;
+  va_list arg;
+  va_start (arg, first);
+  attr = first;
+  while (attr)
+  {
+    val = va_arg(arg,char*);
+    IupSetAttribute( elem, attr, val );
+    attr = va_arg(arg,char*);
+  }
+  va_end (arg);
+  if(name) IupSetHandle( name, elem );
+  return elem;
+}
+
+
+void simple_loadled (void)
+{
+  named[0] = decl( "mnOpen", IupMenu(
+    IupItem( "CGM - Binary", "SimplePlayCGMBin" ),
+    IupItem( "CGM - Text", "SimplePlayCGMText" ),
+    IupItem( "METAFILE", "SimplePlayMetafile" ),
+    IupItem( "WMF", "SimplePlayWMF" ),
+    IupItem( "EMF", "SimplePlayEMF" ),
+  NULL), NULL );
+  named[1] = decl( "mnSaveAs", IupMenu(
+    IupItem( "DEBUG", "SimpleDrawDebug" ),
+    IupItem( "CGM - Binary", "SimpleDrawCGMBin" ),
+    IupItem( "CGM - Text", "SimpleDrawCGMText" ),
+    IupItem( "DGN", "SimpleDrawDGN" ),
+    IupItem( "DXF", "SimpleDrawDXF" ),
+    IupItem( "EMF", "SimpleDrawEMF" ),
+    IupItem( "METAFILE", "SimpleDrawMetafile" ),
+    IupItem( "PDF", "SimpleDrawPDF" ),
+    IupItem( "PS", "SimpleDrawPS" ),
+    IupItem( "EPS", "SimpleDrawEPS" ),
+    IupItem( "WMF", "SimpleDrawWMF" ),
+  NULL), NULL );
+  named[2] = decl( "mnFile", IupMenu(
+    IupSubmenu( "Open",
+      named[0] /* mnOpen */
+    ),
+    IupSubmenu( "Save As",
+      named[1] /* mnSaveAs */
+    ),
+    IupSeparator(),
+    IupItem( "Print", "SimpleDrawPrint" ),
+    IupItem( "Print Dialog...", "SimpleDrawPrintDialog" ),
+    IupSeparator(),
+    IupItem( "Exit", "cmdExit" ),
+  NULL), NULL );
+  named[3] = decl( "mnEdit", IupMenu(
+    IupItem( "Copy as Metafile", "SimpleDrawClipboardMetafile" ),
+    IupItem( "Copy as EMF", "SimpleDrawClipboardEMF" ),
+    IupItem( "Copy as Bitmap", "SimpleDrawClipboardBitmap" ),
+    IupItem( "Paste", "SimplePlayClipboard" ),
+  NULL), NULL );
+  named[4] = decl( "mnClipping", IupMenu(
+    IupItem( "Off", "SimpleClippingOff" ),
+    IupItem( "Area", "SimpleClippingArea" ),
+    IupItem( "Polygon", "SimpleClippingPolygon" ),
+    IupItem( "Region", "SimpleClippingRegion" ),
+  NULL), NULL );
+  named[5] = decl( "mnWriteMode", IupMenu(
+    IupItem( "Replace", "SimpleReplace" ),
+    IupItem( "Xor", "SimpleXor" ),
+    IupItem( "Not Xor", "SimpleNotXor" ),
+  NULL), NULL );
+  named[6] = decl( "mnOptions", IupMenu(
+    IupSubmenu( "Clipping",
+      named[4] /* mnClipping */
+    ),
+    IupSubmenu( "Write Mode",
+      named[5] /* mnWriteMode */
+    ),
+    IupItem( "Simulate", "SimpleDrawSimulate" ),
+    IupItem( "Transform", "SimpleTransform" ),
+    IupItem( "Context Plus", "SimpleContextPlus" ),
+  NULL), NULL );
+  named[7] = decl( "mnSurface", IupMenu(
+    IupItem( "Window", "SimpleDrawWindow" ),
+    IupItem( "Server Image", "SimpleDrawImage" ),
+    IupItem( "Image RGB", "SimpleDrawImageRGB" ),
+  NULL), NULL );
+  named[8] = decl( "mnPrimitives", IupMenu(
+    IupItem( "All", "SimpleDrawAll" ),
+    IupItem( "Text Align", "SimpleDrawTextAlign" ),
+    IupItem( "Text Fonts", "SimpleDrawTextFonts" ),
+    IupItem( "Test", "SimpleDrawTest" ),
+  NULL), NULL );
+  named[9] = decl( "mnSimpleMenu", IupMenu(
+    IupSubmenu( "File",
+      named[2] /* mnFile */
+    ),
+    IupSubmenu( "Edit",
+      named[3] /* mnEdit */
+    ),
+    IupSubmenu( "Options",
+      named[6] /* mnOptions */
+    ),
+    IupSubmenu( "Surface",
+      named[7] /* mnSurface */
+    ),
+    IupSubmenu( "Primitives",
+      named[8] /* mnPrimitives */
+    ),
+  NULL), NULL );
+  named[10] = decl( "SimpleCanvas", IupCanvas( "SimpleRepaint" ), 
+    "BORDER", "0", NULL );
+  named[11] = decl( "SimpleDialog", IupDialog(
+    named[10] /* SimpleCanvas */
+  ), 
+    "TITLE", "Simple Draw", 
+    "MENU", "mnSimpleMenu", NULL );
+}
diff --git a/test/simple/teste.cpp b/test/simple/teste.cpp
new file mode 100644
index 0000000..83fbbac
--- /dev/null
+++ b/test/simple/teste.cpp
@@ -0,0 +1,219 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <io.h>
+
+#include "iup.h"
+#include "cd.h"
+#include "cdiup.h"
+#include "cdirgb.h"
+
+/***************************************************************************
+*  callbacks do IUP                                                        *
+****************************************************************************/
+int Draw( Ihandle *dial )
+{
+	cdCanvas *cnv = (cdCanvas *) IupGetAttribute(dial, "CDCANVAS");
+	cdCanvas *imgCnv = (cdCanvas *) IupGetAttribute(dial, "IMGCNV");
+
+	if (cnv==NULL)
+		return IUP_DEFAULT;
+
+	int width, height;
+	cdCanvasGetSize(cnv, &width, &height, NULL, NULL);
+
+	cdCanvasInteriorStyle(cnv, CD_SOLID);
+	cdCanvasForeground(cnv, CD_WHITE);
+	cdCanvasBox(cnv, 0, width, 0, height);
+
+	if (imgCnv==NULL)
+		return IUP_DEFAULT;
+
+	int w, h;
+	cdCanvasGetSize(imgCnv, &w, &h, NULL, NULL);
+
+	unsigned char* red = cdRedImage(imgCnv);
+	unsigned char* green = cdGreenImage(imgCnv);
+	unsigned char* blue = cdBlueImage(imgCnv);
+
+	int dx = width - w;
+	int dy = height - h;
+
+	cdCanvasPutImageRectRGB(cnv, w, h, red, green, blue, (int)(dx / 2.0), (int)(dy / 2.0), 0, 0, 0, 0, 0, 0);
+
+	return IUP_DEFAULT;
+}
+
+int repaint (Ihandle *self, float x, float y)
+{
+ Ihandle *dial = (Ihandle *) IupGetDialog(self);
+
+ cdCanvas *cnv = (cdCanvas *) IupGetAttribute(dial, "CDCANVAS");
+
+ Draw(dial);
+
+ return IUP_DEFAULT;
+}
+
+static int Resize (Ihandle *self, int larg, int alt)
+{
+ Ihandle *dial = IupGetDialog(self);
+
+ if (dial==NULL) return IUP_DEFAULT;
+
+ cdCanvas *cnv = (cdCanvas *) IupGetAttribute(dial, "CDCANVAS");
+
+ if (cnv!=NULL)
+	cdCanvasActivate(cnv);
+
+ Draw(dial);
+
+ return IUP_DEFAULT;
+}
+
+static int doexit(Ihandle *self)
+{
+ return IUP_CLOSE;
+}
+
+cdCanvas* buildBackImage(Ihandle* dial)
+{
+	unsigned char* r = (unsigned char*) IupGetAttribute(dial, "BUFFRED");
+	unsigned char* g = (unsigned char*) IupGetAttribute(dial, "BUFFGREEN");
+	unsigned char* b = (unsigned char*) IupGetAttribute(dial, "BUFFBLUE");
+
+	cdCanvas* imgCnv = (cdCanvas*) IupGetAttribute(dial, "IMGCNV");
+
+	if (imgCnv!=NULL)
+		delete imgCnv;
+
+	if (r!=NULL)
+		delete r;
+	if (g!=NULL)
+		delete g;
+	if (b!=NULL)
+		delete b;
+
+	int w = 200;
+	int h = 200;
+
+	int size = w * h;
+
+	r = new unsigned char[size];
+	g = new unsigned char[size];
+	b = new unsigned char[size];
+
+	char data[100];
+	sprintf(data, "%dx%d %p %p %p", w, h, r, g, b);
+	imgCnv = cdCreateCanvas(CD_IMAGERGB, data);
+
+	IupSetAttribute(dial, "BUFFRED", (char*) r);
+	IupSetAttribute(dial, "BUFFGREEN", (char*) g);
+	IupSetAttribute(dial, "BUFFBLUE", (char*) b);
+
+	IupSetAttribute(dial, "IMGCNV", (char*) imgCnv);
+
+	return imgCnv;
+}
+
+void drawInImage(cdCanvas* cnv)
+{
+	int w, h;
+	cdCanvasGetSize(cnv, &w, &h, NULL, NULL);
+
+	cdCanvasBegin(cnv, CD_CLIP);
+#if 0
+	cdCanvasVertex(cnv, 0, 0);
+	cdCanvasVertex(cnv, w, 0);
+	cdCanvasVertex(cnv, w, h);
+	cdCanvasVertex(cnv, 0, h);
+#else
+	cdCanvasVertex(cnv, -100, -100);
+	cdCanvasVertex(cnv, w+100, -100);
+	cdCanvasVertex(cnv, w+100, h+100);
+	cdCanvasVertex(cnv, -100, h+100);
+#endif
+	cdCanvasEnd(cnv);
+
+	cdCanvasClip(cnv, CD_CLIPPOLYGON);
+
+	cdCanvasInteriorStyle(cnv, CD_SOLID);
+	cdCanvasForeground(cnv, CD_WHITE);
+	cdCanvasBox(cnv, 0, w, 0, h);
+
+	cdCanvasForeground(cnv, CD_RED);
+	cdCanvasTextAlignment(cnv, CD_CENTER);
+	cdCanvasText(cnv, w/2, h/2, "SCURI � BOIOLA!");
+}
+
+static int tofly(Ihandle *self)
+{
+ Ihandle *dial = IupGetDialog(self);
+
+ cdCanvas* back =  buildBackImage(dial);
+
+ if (back!=NULL)
+	drawInImage(back);
+
+ Draw(dial);
+
+ return IUP_DEFAULT;
+}
+
+Ihandle *BuildDialog(void)
+{
+ Ihandle *saida = IupItem ("Saida", "acao_sai");
+ Ihandle *voe = IupItem ("Voe", "acao_voar");
+ Ihandle *main_menu = IupMenu ( saida, voe, NULL );
+
+ Ihandle *tela = IupCanvas("rpaint");
+ IupSetAttribute(tela, IUP_BUTTON_CB, "buttonCb");
+ IupSetAttribute(tela, IUP_MOTION_CB, "motionCb");
+
+ Ihandle *hbox = IupHbox ( tela, NULL );
+
+ Ihandle *dial = IupDialog ( hbox );
+
+ IupSetHandle( "main_menu", main_menu );
+ IupSetHandle( "tela", tela );
+ IupSetAttribute( dial, IUP_MENU, "main_menu" );
+ IupSetAttribute( dial, IUP_SIZE, "HALFxHALF" );
+ IupSetAttribute( tela, IUP_SIZE, "300x200" );
+ IupSetAttribute( tela, IUP_RESIZE_CB, "resize_cb");
+
+ IupSetFunction( "rpaint", (Icallback) repaint );
+ IupSetFunction( "acao_sai", (Icallback) doexit );
+ IupSetFunction( "acao_voar", (Icallback) tofly );
+ IupSetFunction( "resize_cb", (Icallback) Resize );
+
+ IupMap(dial);
+
+ return dial;
+}
+
+int main (void)
+{
+ Ihandle *dial;
+
+ /* Abre IUP */
+ IupOpen();   
+
+ dial = BuildDialog();
+
+ cdCanvas *cnv = cdCreateCanvas( CD_IUP, IupGetHandle("tela") );
+
+ IupSetAttribute(dial, "CDCANVAS", (char *) cnv);
+
+ /* Exibe dialogo */
+ IupShow(dial);
+
+ /* Interage com o usuario */
+ IupMainLoop();
+
+ cdKillCanvas( cnv );
+
+ /* Fecha IUP */
+ IupClose();
+
+ return 1;
+}
-- 
cgit v1.2.3