diff options
Diffstat (limited to 'zinclib.d/src')
-rw-r--r-- | zinclib.d/src/Zinc.cpp | 4540 | ||||
-rw-r--r-- | zinclib.d/src/Zinc.hpp | 1365 | ||||
-rw-r--r-- | zinclib.d/src/ZincExtern.hpp | 74 | ||||
-rw-r--r-- | zinclib.d/src/ZincInternal.hpp | 182 | ||||
-rw-r--r-- | zinclib.d/src/ZincObjects.cpp | 201 | ||||
-rw-r--r-- | zinclib.d/src/ZincObjects.hpp | 198 | ||||
-rw-r--r-- | zinclib.d/src/ZincPath.cpp | 415 | ||||
-rw-r--r-- | zinclib.d/src/ZincPath.hpp | 162 | ||||
-rw-r--r-- | zinclib.d/src/ZincTypes.hpp | 188 |
9 files changed, 7325 insertions, 0 deletions
diff --git a/zinclib.d/src/Zinc.cpp b/zinclib.d/src/Zinc.cpp new file mode 100644 index 0000000..4c60acf --- /dev/null +++ b/zinclib.d/src/Zinc.cpp @@ -0,0 +1,4540 @@ +/** Zinc.cpp + * zinclib + * + * This software is the property of IntuiLab SA, France. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Here is the definition of the Zinc object + * + * 08/03/05 + * + * Contributors: + * Benoit Peccatte <peccatte@intuilab.com> + * David Thevenin <thevenin@intuilab.com> + * + */ +#include "Zinc.hpp" +#include "ZincInternal.hpp" +#include <iostream> +#include <sstream> +#include <tk.h> + +/** + * How To call Zinc or Tcl functions: + * + * All arguments of the function are Tcl_Obj. To accelerate their call, there + * is a pool of preconstructed Tcl_Obj and some often used constant Tcl_Obj. + * p1 and p2 are tables of pointers to be used for arguments. + * Fill p1 using either predefined objects like ZITM_* or a pool objet that + * you can fill with the value you want. + * Ex : p1[1] = ZFCT_add; + * Macros have been defined to fill and use a pool object + * Ex : p1[2] = Z_INT_POOL (1, 200); + * Do not use twice the same pool index for the same function call. + * p2 is used to construct and argument which is a list of Tcl_Obj. + * To call the function use z_tcl_call which automaticly handle error return + * codes or z_command to call a Zinc command which handle all arguments too. + */ + +//predeclare private function +#ifdef _WIN32 +int __cdecl tclCallback (ClientData client_data, Tcl_Interp *interp, + int argc, Tcl_Obj *CONST args[]); +#else +int tclCallback (ClientData client_data, Tcl_Interp *interp, + int argc, Tcl_Obj *CONST args[]) __attribute__((cdecl)); +#endif + +/******************************************************* + ZINC OBJECT +*******************************************************/ + + +int Zinc::znCount = 0; ///< count to create unique ids +Tcl_Interp *Zinc::interp; ///< the tcl interpreter +Tcl_CmdInfo Zinc::topCmdInfo; ///< the command associated with toplevel +Tcl_CmdInfo Zinc::zncCmdInfo; ///< the command associated with zinc +Tcl_CmdInfo Zinc::imgCmdInfo; ///< the command associated with image +Tcl_CmdInfo Zinc::fntCmdInfo; ///< the command associated with font +Tcl_CmdInfo Zinc::focCmdInfo; ///< the command associated with focus +Tcl_CmdInfo Zinc::bndCmdInfo; ///< the command associated with bind +Tcl_Obj* Zinc::pool[ZINC_POOL_COUNT];///< a pool of tclobj ready to be used +Tcl_Obj* Zinc::p1[ZINC_PARAM_COUNT]; ///< a table of pointeurs use for parameters +Tcl_Obj* Zinc::p2[ZINC_PARAM_COUNT]; ///< a table of pointeurs use for parameters + +static Tcl_Obj *DEFAULT_GROUP_OBJ = Tcl_NewIntObj (DEFAULT_GROUP); + +//option constants +//Tcl_Obj* Z_render = Tcl_NewStringObj ("-render", -1); +Z_DEFINE_ZOPT (render); ///< the "-render" option +Z_DEFINE_ZOPT (firstend); ///< the "-firstend" option +Z_DEFINE_ZOPT (lastend); ///< the "-lastend" option +Z_DEFINE_ZOPT (position); ///< the "-position" option +Z_DEFINE_ZOPT (tags); ///< the "-tags" option +Z_DEFINE_ZOPT (backcolor); ///< the "-backcolor" option +Z_DEFINE_ZOPT (forecolor); ///< the "-forecolor" option +Z_DEFINE_ZOPT (height); ///< the "-height" option +Z_DEFINE_ZOPT (borderwidth); ///< the "-borderwidth" option + + +//autogenerated constants +Z_DEFINE_ZOPT (closed); ///< the "-closed" option +Z_DEFINE_ZOPT (composealpha); ///< the "-composealpha" option +Z_DEFINE_ZOPT (composerotation); ///< the "-composerotation" option +Z_DEFINE_ZOPT (composescale); ///< the "-composescale" option +Z_DEFINE_ZOPT (extent); ///< the "-extent" option +Z_DEFINE_ZOPT (fillcolor); ///< the "-fillcolor" option +Z_DEFINE_ZOPT (filled); ///< the "-filled" option +Z_DEFINE_ZOPT (fillpattern); ///< the "-fillpattern" option +Z_DEFINE_ZOPT (linecolor); ///< the "-linecolor" option +Z_DEFINE_ZOPT (linepattern); ///< the "-linepattern" option +Z_DEFINE_ZOPT (linestyle); ///< the "-linestyle" option +Z_DEFINE_ZOPT (linewidth); ///< the "-linewidth" option +Z_DEFINE_ZOPT (pieslice); ///< the "-pieslice" option +Z_DEFINE_ZOPT (priority); ///< the "-priority" option +Z_DEFINE_ZOPT (sensitive); ///< the "-sensitive" option +Z_DEFINE_ZOPT (startangle); ///< the "-startangle" option +Z_DEFINE_ZOPT (tile); ///< the "-tile" option +Z_DEFINE_ZOPT (visible); ///< the "-visible" option +Z_DEFINE_ZOPT (capstyle); ///< the "-capstyle" option +Z_DEFINE_ZOPT (fillrule); ///< the "-fillrule" option +Z_DEFINE_ZOPT (joinstyle); ///< the "-joinstyle" option +Z_DEFINE_ZOPT (marker); ///< the "-marker" option +Z_DEFINE_ZOPT (markercolor); ///< the "-markercolor" option +Z_DEFINE_ZOPT (relief); ///< the "-relief" option +Z_DEFINE_ZOPT (smoothrelief); ///< the "-smoothrelief" option +Z_DEFINE_ZOPT (alpha); ///< the "-alpha" option +Z_DEFINE_ZOPT (atomic); ///< the "-atomic" option +Z_DEFINE_ZOPT (clip); ///< the "-clip" option +Z_DEFINE_ZOPT (anchor); ///< the "-anchor" option +Z_DEFINE_ZOPT (color); ///< the "-color" option +Z_DEFINE_ZOPT (connecteditem); ///< the "-connecteditem" option +Z_DEFINE_ZOPT (connectionanchor); ///< the "-connectionanchor" option +Z_DEFINE_ZOPT (image); ///< the "-image" option +Z_DEFINE_ZOPT (mask); ///< the "-mask" option +Z_DEFINE_ZOPT (alignment); ///< the "-alignment" option +Z_DEFINE_ZOPT (font); ///< the "-font" option +Z_DEFINE_ZOPT (overstriked); ///< the "-overstriked" option +Z_DEFINE_ZOPT (spacing); ///< the "-spacing" option +Z_DEFINE_ZOPT (text); ///< the "-text" option +Z_DEFINE_ZOPT (underlined); ///< the "-underlined" option +Z_DEFINE_ZOPT (width); ///< the "-width" option + +//other constants +Z_DEFINE_ZFCT (device); ///< the "device" keyword + +///< function constants +Z_DEFINE_ZFCT (add); ///< the "add" function +Z_DEFINE_ZFCT (addtag); ///< the "addtag" function +Z_DEFINE_ZFCT (bind); ///< the "bind" function +Z_DEFINE_ZFCT (bbox); ///< the "bbox" function +Z_DEFINE_ZFCT (cget); ///< the "cget" function +Z_DEFINE_ZFCT (chggroup); ///< the "chggroup" function +Z_DEFINE_ZFCT (clone); ///< the "clone" function +Z_DEFINE_ZFCT (configure); ///< the "configure" function +Z_DEFINE_ZFCT (contour); ///< the "contour" function +Z_DEFINE_ZFCT (coords); ///< the "coords" function +Z_DEFINE_ZFCT (dtag); ///< the "dtag" function +Z_DEFINE_ZFCT (focus); ///< the "focus" function +Z_DEFINE_ZFCT (gettags); ///< the "gettags" function +Z_DEFINE_ZFCT (gname); ///< the "gname" function +Z_DEFINE_ZFCT (group); ///< the "group" function +Z_DEFINE_ZFCT (itemconfigure); ///< the "itemconfigure" function +Z_DEFINE_ZFCT (itemcget); ///< the "itemcget" function +Z_DEFINE_ZFCT (lower); ///< the "lower" function +Z_DEFINE_ZFCT (raise); ///< the "raise" function +Z_DEFINE_ZFCT (remove); ///< the "remove" function +Z_DEFINE_ZFCT (rotate); ///< the "rotate" function +Z_DEFINE_ZFCT (scale); ///< the "scale" function +Z_DEFINE_ZFCT (skew); ///< the "skew" function +Z_DEFINE_ZFCT (tget); ///< the "tget" function +Z_DEFINE_ZFCT (translate); ///< the "translate" function +Z_DEFINE_ZFCT (transform); ///< the "transform" function +Z_DEFINE_ZFCT (treset); ///< the "treset" function +Z_DEFINE_ZFCT (tset); ///< the "tset" function +Z_DEFINE_ZFCT (type); ///< the "type" function + +//Item constants +Z_DEFINE_ZITM (add); ///< the "add" constant +Z_DEFINE_ZITM (arc); ///< the "arc" constant +Z_DEFINE_ZITM (curve); ///< the "curve" constant +Z_DEFINE_ZITM (icon); ///< the "icon" constant +Z_DEFINE_ZITM (group); ///< the "group" constant +Z_DEFINE_ZITM (rectangle); ///< the "rectangle" constant +Z_DEFINE_ZITM (text); ///< the "text" constant +Z_DEFINE_ZITM (withtag); ///< the "withtag" constant + +/********************************************* + Prepare enum Tcl_Obj +*********************************************/ + +//lineStyles strings +const char* lineStylesStrings [] = +{ "simple", "dashed", "mixed", "dotted" }; +//lineStyles Tcl_Obj +Tcl_Obj* lineStyles [] = +{ + Tcl_NewStringObj ("simple", -1), + Tcl_NewStringObj ("dashed", -1), + Tcl_NewStringObj ("mixed", -1), + Tcl_NewStringObj ("dotted", -1), +}; + +//capStyles strings +const char* capStylesStrings [] = +{ "butt", "projecting", "round" }; +//capStyles Tcl_Obj +Tcl_Obj* capStyles [] = +{ + Tcl_NewStringObj ("butt", -1), + Tcl_NewStringObj ("projecting", -1), + Tcl_NewStringObj ("round", -1), +}; + +// fillRules strings +const char* fillRulesStrings [] = +{ "odd", "nonzero", "positive", "negative", "abs_geq_2" }; +//fillRules Tcl_Obj +Tcl_Obj* fillRules [] = +{ + Tcl_NewStringObj ("odd", -1), + Tcl_NewStringObj ("nonzero", -1), + Tcl_NewStringObj ("positive", -1), + Tcl_NewStringObj ("negative", -1), + Tcl_NewStringObj ("abs_geq_2", -1), +}; + +// joinStyle strings +const char* joinStylesStrings [] = +{ "bevel", "miter", "round" }; +// joinStyles Tcl_Obj +Tcl_Obj* joinStyles [] = +{ + Tcl_NewStringObj ("bevel", -1), + Tcl_NewStringObj ("miter", -1), + Tcl_NewStringObj ("round", -1), +}; + +// reliefs strings +const char* reliefsStrings [] = +{ "flat", "raised", "sunken", "ridge", "groove", "roundraised", + "roundsunken", "roundridge", "roundgroove", "raisedrule", "sunkenrule" }; +// reliefs Tcl_Obj +Tcl_Obj* reliefs [] = +{ + Tcl_NewStringObj ("flat", -1), + Tcl_NewStringObj ("raised", -1), + Tcl_NewStringObj ("sunken", -1), + Tcl_NewStringObj ("ridge", -1), + Tcl_NewStringObj ("groove", -1), + Tcl_NewStringObj ("roundraised", -1), + Tcl_NewStringObj ("roundsunken", -1), + Tcl_NewStringObj ("roundridge", -1), + Tcl_NewStringObj ("roundgroove", -1), + Tcl_NewStringObj ("raisedrule", -1), + Tcl_NewStringObj ("sunkenrule", -1), +}; + +// alignments strings +const char* alignmentsStrings [] = +{ "left", "right", "center" }; +// alignments Tcl_obj +Tcl_Obj* alignments [] = +{ + Tcl_NewStringObj ("left", -1), + Tcl_NewStringObj ("right", -1), + Tcl_NewStringObj ("center", -1), +}; + +// anchors strings +const char* anchorsStrings [] = +{ "nw", "n", "ne", "e", "se", "s", "sw", "w", "center" }; +// anchors Tcl_Obj +Tcl_Obj* anchors [] = +{ + Tcl_NewStringObj ("nw", -1), + Tcl_NewStringObj ("n", -1), + Tcl_NewStringObj ("ne", -1), + Tcl_NewStringObj ("e", -1), + Tcl_NewStringObj ("se", -1), + Tcl_NewStringObj ("s", -1), + Tcl_NewStringObj ("sw", -1), + Tcl_NewStringObj ("w", -1), + Tcl_NewStringObj ("center", -1), +}; + +// itemType strings +const char* itemTypeStrings [] = +{ + "group", + "arc", + "text", + "rectangle", + "curve", + "icon", + NULL +}; +//no need for Tcl_Objs because they are only used as return values + + +/********************************** + Zinc Object +**********************************/ + +/** + * The public constructor + * + * @param renderingMode ZINC_BACKEND_X11 or ZINC_BACKEND_OPENGL + */ +Zinc::Zinc (int renderingMode) +{ + String theId; + + //preparating id (.zn and a unique number) + znCount++; + theId = ".zn"; + theId += itos(znCount); + window = "."; + + //create a new window for each other widget + if (znCount != 1) + { + window = ".zwin"; + window += itos (znCount); + + //create a new toplevel window + const char* para[2]; + para[0] = "toplevel"; + para[1] = window.c_str(); + //call the toplevel Tk function with 2 arguments + z_tcl_call ((*topCmdInfo.proc)(topCmdInfo.clientData, interp, 2, para), + "toplevel Failed : "); + + //adapt the zinc id to the window path + theId = window + theId; + } + + // String noResizeCommand = String ("wm resizable ") + window + " 0 0"; + //Tcl_Eval (interp, noResizeCommand.c_str ()); + + //use a tcl_obj for the id + id = Tcl_NewStringObj (theId.c_str (), theId.length ()); + Tcl_IncrRefCount (id); + + //get top windows for zinc widget + Tk_Window top_w = Tk_MainWindow (interp); + + //creation of the zinc item + // call "Zinc id -render mode + Tcl_ResetResult (interp); + p1[0] = NULL; + p1[1] = id; + p1[2] = ZOPT_render; + p1[3] = Z_INT_POOL (0, renderingMode); + // call the function with 4 arguments and check non error + z_tcl_call ((*zncCmdInfo.objProc) (ClientData (top_w), interp, 4, p1), + "ZincObjCmd failed :"); + + // get back ZnWInfo *wi and WidgetObjCmd + Tcl_CmdInfo cmdInfo; + int result = Tcl_GetCommandInfo (interp, theId.c_str (), &cmdInfo); + if (!result) + { + throw ZincException (String ("zinclib: Tcl command not found") + + Tcl_GetStringResult (interp), __FILE__, __LINE__); + } + + //get informations necessary to call WidgetObjCmd + wi = cmdInfo.objClientData; + objCmd = (WidgetObjCmd)cmdInfo.objProc; + + //call the Tk function pack + String packCmd = String ("pack ") + theId + " -expand 1 -fill both"; + Tcl_Eval (interp, packCmd.c_str ()); + + // Prepare for binding with callback (create a Tcl function) + tclCb = String (Z_TCLCB) + itos(znCount); + Tcl_CreateObjCommand(interp, tclCb.c_str (), tclCallback, + (ClientData) this, (Tcl_CmdDeleteProc *) NULL); + + //give focus to the window + const char* para[2]; + para[0] = "focus"; + para[1] = theId.c_str(); + // call the function with 4 arguments + z_tcl_call ((*focCmdInfo.proc)(focCmdInfo.clientData, interp, 2, para), + "focus Failed : "); +} + +/** + * The public destructor + */ +Zinc::~Zinc () +{ + //delete the Tcl function + Tcl_DeleteCommand (interp, tclCb.c_str ()); + // delete the tcl_obj + Tcl_DecrRefCount (id); +} + +/** + * Change window title + * + * @param title the title string + */ +void Zinc::setTitle (String title) +{ + //use tcl interpreter directly since this won't be called often + String command = String ("wm title ") + window + " \"" + title + "\""; + Tcl_Eval (interp, command.c_str ()); +} + +/***************************************** + WIDGET PROPERTIES +*****************************************/ +/** + * How To call Zinc or Tcl functions: + * + * All arguments of the function are Tcl_Obj. To accelerate their call, there + * is a pool of preconstructed Tcl_Obj and some often used constant Tcl_Obj. + * p1 and p2 are tables of pointers to be used for arguments. + * Fill p1 using either predefined objects like ZITM_* or a pool objet that + * you can fill with the value you want. + * Ex : p1[1] = ZFCT_add; + * Macros have been defined to fill and use a pool object + * Ex : p1[2] = Z_INT_POOL(1, 200); + * Do not use twice the same pool index for the same function call. + * p2 is used to construct and argument which is a list of Tcl_Obj. + * To call the function use z_tcl_call which automaticly handle error return + * codes or z_command to call a Zinc command which handle all arguments too. + */ + +/** + * Call zinc->configure ( -backcolor ) + * + * @param value the backcolor to set + */ +void Zinc::setBackcolor (String value) +{ + //call .zinc configure -backcolor value + p1[0] = id; + p1[1] = ZFCT_configure; + p1[2] = ZOPT_backcolor; + p1[3] = Z_STR_POOL (0, value.c_str(), value.length()); + // call the function with 4 arguments + z_command (4, "setBackcolor Failed : "); +} + +/** + * Call zinc->cget ( -backcolor ) + * + * @return backcolor value + */ +String Zinc::getBackcolor () +{ + Tcl_Obj* tmp; + //discard old results + Tcl_ResetResult (interp); + //call .zinc cget -backcolor + p1[0] = id; + p1[1] = ZFCT_cget; + p1[2] = ZOPT_backcolor; + // call the function with 3 arguments + z_command (3, "getBackcolor Failed : "); + + //retreive the result as a string + tmp = Tcl_GetObjResult (interp); + return String (Tcl_GetStringFromObj (tmp, NULL)); +} + +/** + * Call zinc->configure ( -forecolor ) + * + * @param value the forecolor to set + */ +void Zinc::setForecolor (String value) +{ + //call .zinc configure -forecolor value + p1[0] = id; + p1[1] = ZFCT_configure; + p1[2] = ZOPT_forecolor; + p1[3] = Z_STR_POOL (0, value.c_str(), value.length()); + // call the function with 4 arguments + z_command (4, "setForecolor Failed : "); +} + +/** + * Call zinc->cget ( -forecolor ) + * + * @return forecolor value + */ +String Zinc::getForecolor () +{ + Tcl_Obj* tmp; + //discard old results + Tcl_ResetResult (interp); + //call .zinc cget -forecolor + p1[0] = id; + p1[1] = ZFCT_cget; + p1[2] = ZOPT_forecolor; + // call the function with 3 arguments + z_command (3, "getForecolor Failed : "); + + //retreive the result as a string + tmp = Tcl_GetObjResult (interp); + return String (Tcl_GetStringFromObj (tmp, NULL)); +} + +/** + * Call zinc->configure ( -width ) + * + * @param value the width to set + */ +void Zinc::setWidth (int value) +{ + //call .zinc configure -width value + p1[0] = id; + p1[1] = ZFCT_configure; + p1[2] = ZOPT_width; + p1[3] = Z_INT_POOL (0, value); + // call the function with 4 arguments + z_command (4, "setWidth Failed : "); + + char *strid = Tcl_GetString(id); + //call the Tk function pack + String packCmd = String ("pack ") + strid + " -expand 1 -fill both"; + Tcl_Eval (interp, packCmd.c_str ()); +} + +/** + * Call zinc->cget ( -width ) + * + * @return width value + */ +int Zinc::getWidth () +{ + Tcl_Obj* tmp; + //discard old results + Tcl_ResetResult (interp); + //call .zinc cget -width + p1[0] = id; + p1[1] = ZFCT_cget; + p1[2] = ZOPT_width; + // call the function with 3 arguments + z_command (3, "getWidth Failed : "); + + //retreive the result as an integer + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetIntFromObj (interp, tmp, &value), + "getWidth Failed : "); + return value; +} + +/** + * Call zinc->configure ( -height ) + * + * @param value the height to set + */ +void Zinc::setHeight (int value) +{ + //call .zinc configure -height value + p1[0] = id; + p1[1] = ZFCT_configure; + p1[2] = ZOPT_height; + p1[3] = Z_INT_POOL (0, value); + // call the function with 4 arguments + z_command (4, "setHeight Failed : "); + + char *strid = Tcl_GetString(id); + //call the Tk function pack + String packCmd = String ("pack ") + strid + " -expand 1 -fill both"; + Tcl_Eval (interp, packCmd.c_str ()); +} + +/** + * Call zinc->cget ( -height ) + * + * @return height value + */ +int Zinc::getHeight () +{ + Tcl_Obj* tmp; + //discard old results + Tcl_ResetResult (interp); + //call .zinc cget -height + p1[0] = id; + p1[1] = ZFCT_cget; + p1[2] = ZOPT_height; + // call the function with 3 arguments + z_command (3, "getHeight Failed : "); + + //retreive the result as an integer + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetIntFromObj (interp, tmp, &value), + "getHeight Failed : "); + return value; +} + +/** + * Call zinc->configure ( -borderwidth ) + * + * @param value the borderwidth to set + */ +void Zinc::setBorderwidth (int value) +{ + //call .zinc configure -borderwidth value + p1[0] = id; + p1[1] = ZFCT_configure; + p1[2] = ZOPT_borderwidth; + p1[3] = Z_INT_POOL (0, value); + // call the function with 4 arguments + z_command (4, "setBorderwidth Failed : "); +} + +/** + * Call zinc->cget ( -borderwidth ) + * + * @return borderwidth value + */ +int Zinc::getBorderwidth () +{ + Tcl_Obj* tmp; + //discard old results + Tcl_ResetResult (interp); + //call .zinc cget -borderwidth + p1[0] = id; + p1[1] = ZFCT_cget; + p1[2] = ZOPT_borderwidth; + // call the function with 3 arguments + z_command (3, "getBorderwidth Failed : "); + + //retreive the result as an integer + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetIntFromObj (interp, tmp, &value), + "getBorderwidth Failed : "); + return value; +} + +/** + * Call zinc->configure ( -font ) + * + * @param value the font to set + */ +void Zinc::setFont (ZincFont* value) +{ + //call .zinc configure -font value + p1[0] = id; + p1[1] = ZFCT_configure; + p1[2] = ZOPT_font; + p1[3] = Z_STR_POOL (0, value->name.c_str(), value->name.length()); + // call the function with 4 arguments + z_command (4, "setFont Failed : "); +} + +/** + * Call zinc->cget ( -font ) + * + * @return font value + */ +ZincFont* Zinc::getFont () +{ + //discard old results + Tcl_ResetResult (interp); + //call .zinc cget -font + p1[0] = id; + p1[1] = ZFCT_cget; + p1[2] = ZOPT_font; + // call the function with 3 arguments + z_command (3, "getFont Failed : "); + + //retreive the result as a string + return new ZincFont (Tcl_GetStringResult (interp)); +} + + +/***************************************** + WIDGET METHODS +*****************************************/ +/** + * How To call Zinc or Tcl functions: + * + * All arguments of the function are Tcl_Obj. To accelerate their call, there + * is a pool of preconstructed Tcl_Obj and some often used constant Tcl_Obj. + * p1 and p2 are tables of pointers to be used for arguments. + * Fill p1 using either predefined objects like ZITM_* or a pool objet that + * you can fill with the value you want. + * Ex : p1[1] = ZFCT_add; + * Macros have been defined to fill and use a pool object + * Ex : p1[2] = Z_INT_POOL(1, 200); + * Do not use twice the same pool index for the same function call. + * p2 is used to construct and argument which is a list of Tcl_Obj. + * To call the function use z_tcl_call which automaticly handle error return + * codes or z_command to call a Zinc command which handle all arguments too. + */ + +/** + * Get the bounding box of an item + * + * @param item the item to get bbox + * @param bbox a table where we'll put the bounding box + * bbox[0] = x0, bbox[1] = y0, bbox[2] = xc, bbox[3] = yc + */ +void Zinc::bbox (ZincItem* item, double _bbox[4]) +{ + Tcl_Obj* tmp; + Tcl_Obj** list; + int count; + //discard old results + Tcl_ResetResult (interp); + // call .zinc bbox item + p1[0] = id; + p1[1] = ZFCT_bbox; + p1[2] = item->object; + + // call the function with 3 arguments + z_command (3, "bbox Failed : "); + + //retreive the result as a list + tmp = Tcl_GetObjResult (interp); + z_tcl_call (Tcl_ListObjGetElements (interp, tmp, &count, &list), + "bbox Failed : "); + //extract 4 double from the list + if (count != 4) + { + throw ZincException (String ("bbox Failed count=") + itos(count), + __FILE__, __LINE__); + } + z_tcl_call (Tcl_GetDoubleFromObj (interp, list[0], &_bbox[0]), + "bbox Failed"); + z_tcl_call (Tcl_GetDoubleFromObj (interp, list[1], &_bbox[1]), + "bbox Failed"); + z_tcl_call (Tcl_GetDoubleFromObj (interp, list[2], &_bbox[2]), + "bbox Failed"); + z_tcl_call (Tcl_GetDoubleFromObj (interp, list[3], &_bbox[3]), + "bbox Failed"); +} + + +/** + * Get the bounding box of an item in its parent group + * + * @param item the item to get bbox in its parent group + * @param bbox a table where we'll put the bounding box + * bbox[0] = x0, bbox[1] = y0, bbox[2] = xc, bbox[3] = yc + */ +void Zinc::relativeBbox (ZincItem* item, double _bbox[4]) +{ + //1) get bounding bbox + double tempBbox[4]; + this->bbox (item, tempBbox); + + //2) call transform + Tcl_Obj* tmp; + Tcl_Obj** list; + int count; + //discard old results + Tcl_ResetResult (interp); + // call .zinc transform device parentGroup {_bbox[0] _bbox[1] _bbox[2] _bbox[3]} + p1[0] = id; + p1[1] = ZFCT_transform; + p1[2] = ZFCT_device; + p1[3] = item->object; + + //coordinates as a list + p2[0] = Z_DBL_POOL (0, tempBbox[0]); + p2[1] = Z_DBL_POOL (1, tempBbox[1]); + p2[2] = Z_DBL_POOL (2, tempBbox[2]); + p2[3] = Z_DBL_POOL (3, tempBbox[3]); + p1[4] = Z_LST_POOL (4, p2, 4); + + // call the function with 5 arguments + z_command (5, "relativeBbox z_command Failed : "); + //free the list in pool No 4 + Z_CLEANLIST (4); + + //retreive the result as a list + tmp = Tcl_GetObjResult (interp); + z_tcl_call (Tcl_ListObjGetElements (interp, tmp, &count, &list), + "relativeBbox z_tcl_call Failed : "); + + //3) extract 4 double from the list + if (count != 4) + { + throw ZincException (String ("relativeBbox Failed count=") + itos(count), + __FILE__, __LINE__); + } + z_tcl_call (Tcl_GetDoubleFromObj (interp, list[0], &_bbox[0]), + "relativeBbox Failed"); + z_tcl_call (Tcl_GetDoubleFromObj (interp, list[1], &_bbox[1]), + "relativeBbox Failed"); + z_tcl_call (Tcl_GetDoubleFromObj (interp, list[2], &_bbox[2]), + "relativeBbox Failed"); + z_tcl_call (Tcl_GetDoubleFromObj (interp, list[3], &_bbox[3]), + "bbox Failed"); +} + + + + +/** + * Change the group of an item + * + * @param item the item to move + * @param parentGroup new group for the item + */ +void Zinc::chggroup (ZincItem *item, ZincItem *parentGroup) +{ + // call .zinc chggroup item parentGroup + p1[0] = id; + p1[1] = ZFCT_chggroup; + p1[2] = item->object; + p1[3] = Z_PARENTGROUP (parentGroup); + // call the function with 4 arguments + z_command (4, "chggroup Failed : "); +} + +/** + * Clone an item + * + * @param item the item to clone + * @return the cloned item + */ +ZincItem* Zinc::clone (ZincItem *item) +{ + // call .zinc clone item + p1[0] = id; + p1[1] = ZFCT_clone; + p1[2] = item->object; + // call the function with 3 arguments + z_command (3, "clone Failed: "); + + //retreive the result as a tcl_obj + return new ZincItem (Tcl_GetObjResult (interp)); +} + +/** + * Get the number of contour of an item + * + * @return number of contour + */ +int Zinc::contour (ZincItem *item) +{ + Tcl_Obj* tmp; + int result; + // call .zinc contour item + p1[0] = id; + p1[1] = ZFCT_contour; + p1[2] = item->object; + // call the function with 3 arguments + z_command (3, "contour Failed: "); + + //retreive the result as an int + tmp = Tcl_GetObjResult (interp); + z_tcl_call (Tcl_GetIntFromObj (interp, tmp, &result), + "contour Failed: "); + return result; +} + +/** + * Set the contour of an item to the one of an other + * + * @param item the item on which we set the contour + * @param flag the operation to do on the contour + * @param reference the item to set contour from + * @return the number of contour + */ +int Zinc::contour (ZincItem *item, itemOperator flag, ZincItem *reference) +{ + Tcl_Obj* tmp; + int result; + //discard old results + Tcl_ResetResult (interp); + // call .zinc contour item flag reference + p1[0] = id; + p1[1] = ZFCT_contour; + p1[2] = item->object; + + //different possible actions depending on the flag + switch (flag) + { + case item_add_clockwise: + p1[3] = ZFCT_add; + p1[4] = Z_INT_POOL (0, -1); //add clockwise (-1) + break; + case item_add_counterclockwise: + p1[3] = ZFCT_add; + p1[4] = Z_INT_POOL (0, 1); //add counterclockwise (1) + break; + default: + p1[3] = ZFCT_remove; + p1[4] = Z_INT_POOL (0, 0); //no meaning (0) + } + // contour index (0) + p1[5] = Z_INT_POOL (1, 0); + // item reference + p1[6] = reference->object; + + // call the function with 7 arguments + z_command (7, "contour Failed: "); + + // retreive the result as an int + tmp = Tcl_GetObjResult (interp); + z_tcl_call (Tcl_GetIntFromObj (interp, tmp, &result), + "contour Failed: "); + return result; +} + +/** + * Set the contour of an item + * + * @param item the item on which we set the contour + * @param add true to add a path, false to remove + * @param reference the new contour + * @return the number of contour + */ +int Zinc::contour (ZincItem *item, bool add, ZincPath *_contour) +{ + Tcl_Obj* tmp; + int result; + //discard old results + Tcl_ResetResult (interp); + // call .zinc contour item flag contour + p1[0] = id; + p1[1] = ZFCT_contour; + p1[2] = item->object; + + //different possible actions depending on the add flag + if (add) + { + p1[3] = ZFCT_add; + p1[4] = Z_INT_POOL (0, 0); //add contour (0) + } + else + { + p1[3] = ZFCT_remove; + p1[4] = Z_INT_POOL (0, 0); //no meaning (0) + } + // contour index + p1[5] = Z_INT_POOL (1, 0); + //contour + p1[6] = _contour->getTable (); + + // call the function with 7 arguments + z_command (7, "contour Failed: "); + + // retreive the result as an integer + tmp = Tcl_GetObjResult (interp); + z_tcl_call (Tcl_GetIntFromObj (interp, tmp, &result), + "contour Failed: "); + return result; +} + +/** + * Set or modify the coordinates of an item + * + * @param item the item to modify + * @param contour new coords for the item + * @param add true to add coords, false to replace + * @param contourIndex the contour do modify + * @param coordIndex the coordinate to modify (WARNING, path must be one + * point if the is not the default) + */ +void Zinc::coords (ZincItem *item, ZincPath *_contour, bool add, + int contourIndex, int coordIndex) +{ + int i; + // call .zinc contour item ?flag? ?contourIndex? ?coordIndex? _contour + p1[0] = id; + p1[1] = ZFCT_coords; + p1[2] = item->object; + + // use i as a variable index for parameters + i = 3; // last parameter is p1[2] + // do we add or not + if (add) + { + p1[i++] = ZFCT_add; + } + + //ith there a contour + if (contourIndex != -1) + { + p1[i++] = Z_INT_POOL (1, contourIndex); + + //is there a coord index + if (coordIndex != -1) + { + p1[i++] = Z_INT_POOL (1, coordIndex); + } + } + + p1[i++] = _contour->getTable (); + + // call the function with i arguments + z_command (i, "coords Failed: "); +} + +/** + * Remove coords of an item + * + * @param item the item to modify + * @param coordIndex the coordinate to rmove + * @param contourIndex the contour on which we remove + */ +void Zinc::coordsRemove (ZincItem *item, int coordIndex, int contourIndex) +{ + int i; + // call .zinc coords item remove ?contourIndex? + p1[0] = id; + p1[1] = ZFCT_coords; + p1[2] = item->object; + p1[3] = ZFCT_remove; + + i = 4; + // is there a contourIndex + if (contourIndex != -1) + { + p1[i++] = Z_INT_POOL (1, contourIndex); + } + p1[i++] = Z_INT_POOL (1, coordIndex); + + // call the function with i arguments + z_command (i, "coordsRemove Failed: "); +} + +/** + * Add a tag to an item + * + * @param item the item to add tag to + * @param tag a tag to add + */ +void Zinc::addTag (ZincItem *item, String tag) +{ + // call .zinc addtag tag withtag + p1[0] = id; + p1[1] = ZFCT_addtag; + p1[2] = Z_STR_POOL (0, tag.c_str (), tag.length ()); + p1[3] = ZITM_withtag; + p1[4] = item->object; + // call the function with 5 arguments + z_command (5, "addTag Failed: "); +} + +/** + * Remove a tag from an item + * + * @param item the item to remove tag from + * @param tag a tag to remove + */ +void Zinc::dTag (ZincItem *item, String tag) +{ + // call .zinc dtag item tag + p1[0] = id; + p1[1] = ZFCT_dtag; + p1[2] = item->object; + + int i = 3; + //create a tg if nexessary + if (tag != "") + { + p1[i++] = Z_STR_POOL (0, tag.c_str (), tag.length ()); + } + + // call the function with i arguments + z_command (i, "dTag Failed: "); +} + +/** + * List all tags of an item + * It's up to the caller to delete the resulting table + * + * @param item the item to list tag from + * @param lagList a pointer to a table of String containing tags + * @return the number of tags + */ +int Zinc::getTags (ZincItem *item, String*** tagList) +{ + Tcl_Obj* tmp; + Tcl_Obj** list; + int count; + + //discard old results + Tcl_ResetResult (interp); + // call .zinc gettags item + p1[0] = id; + p1[1] = ZFCT_gettags; + p1[2] = item->object; + // call the function with 3 arguments + z_command (3, "getTags Failed : "); + + //retreive the result as a list + tmp = Tcl_GetObjResult (interp); + z_tcl_call (Tcl_ListObjGetElements (interp, tmp, &count, &list), + "bbox Failed : "); + + // put strings into a new table + char *str; + //store the table into tagList + (*tagList) = new String* [count]; + + // fill the table + for (int i (0) ; i < count ; i++) + { + str = Tcl_GetString (list[i]); + (*tagList)[i] = new String (str); + } + return count; +} + +/** + * Set the focus to an item + * + * @param item the item to set the focus to + */ +void Zinc::focus (ZincItem *item) +{ + // .zinc focus item + p1[0] = id; + p1[1] = ZFCT_focus; + p1[2] = item->object; + // call the function with 3 arguments + z_command (3, "focus Failed: "); +} + +/** + * Tell if the name is a gradient name + * + * @param gname a gradient name + * @return true if the name is a gradient name, false otherwise + */ +bool Zinc::isGname (String _gname) +{ + Tcl_Obj* tmp; + int result; + //discard old results + Tcl_ResetResult (interp); + // call .zinc gname _gname + p1[0] = id; + p1[1] = ZFCT_gname; + p1[2] = Z_STR_POOL (0, _gname.c_str (), _gname.length ()); + // call the function with 3 arguments + z_command (3, "isGname Failed: "); + + //retreive the result as a boolean + tmp = Tcl_GetObjResult (interp); + z_tcl_call (Tcl_GetBooleanFromObj (interp, tmp, &result), + "isGname Failed: "); + return bool (result); +} + +/** + * Create a named gradient + * + * @param gradient a gradient + * @param gname a gradient name + */ +void Zinc::gname (String gradient, String _gname) +{ + // call .zinc gname gradient gname + p1[0] = id; + p1[1] = ZFCT_gname; + p1[2] = Z_STR_POOL (0, gradient.c_str (), gradient.length ()); + p1[3] = Z_STR_POOL (1, _gname.c_str (), _gname.length ()); + // call the function with 4 arguments + z_command (4, "gname Failed: "); +} + +/** + * Retreive the group of an item + * + * @param item the item to get the group from + * @return the group + */ +ZincItem* Zinc::group (ZincItem *item) +{ + Tcl_Obj* tmp; + //discard old results + Tcl_ResetResult (interp); + // call .zinc group item + p1[0] = id; + p1[1] = ZFCT_group; + p1[2] = item->object; + // call the function with 3 arguments + z_command (3, "group Failed: "); + + //retreive the result as a tcl_obj + tmp = Tcl_GetObjResult (interp); + return new ZincItem (tmp); +} + +/** + * Reorder items to lower one + * + * @param item the item to lower + */ +void Zinc::lower (ZincItem *item) +{ + // call .zinc lower item + p1[0] = id; + p1[1] = ZFCT_lower; + p1[2] = item->object; + // call the function with 3 arguments + z_command (3, "lower Failed: "); +} + +/** + * Reorder items to lower one + * + * @param item the item to lower + * @param belowThis and item that will be over item + */ +void Zinc::lower (ZincItem *item, ZincItem *belowThis) +{ + // call .zinc lower item belowThis + p1[0] = id; + p1[1] = ZFCT_lower; + p1[2] = item->object; + p1[3] = belowThis->object; + // call the function with 4 arguments + z_command (4, "lower Failed: "); +} + +/** + * Reorder items to raise one + * + * @param item the item to raise + */ +void Zinc::raise (ZincItem *item) +{ + // call .zinc raise item + p1[0] = id; + p1[1] = ZFCT_raise; + p1[2] = item->object; + // call the function with 3 arguments + z_command (3, "raise Failed: "); +} + +/** + * Reorder items to raise one + * + * @param item the item to raise + * @param aboveThis an item that will be under item + */ +void Zinc::raise (ZincItem *item, ZincItem *aboveThis) +{ + // call .zinc raise item aboveThis + p1[0] = id; + p1[1] = ZFCT_raise; + p1[2] = item->object; + p1[3] = aboveThis->object; + // call the function with 4 arguments + z_command (4, "raise Failed: "); +} + +/** + * Return the type of an item + * + * @param item an item + * @return the type of the item + */ +itemType Zinc::type (ZincItem *item) +{ + Tcl_Obj *tmp; + //discard old results + Tcl_ResetResult (interp); + // call .zinc type item + p1[0] = id; + p1[1] = ZFCT_type; + p1[2] = item->object; + // call the function with 3 arguments + z_command (3, "type Failed: "); + + //retreive the result as a string + tmp = Tcl_GetObjResult (interp); + + // convert the string to the right enum value + int value; + z_tcl_call (Tcl_GetIndexFromObj (interp, tmp, + itemTypeStrings, + "itemType", + 0, &value), + "type Failed : "); + return itemType (value); +} + +/** + * Create a Zinc Tag that can be used in place of any item + * for zinc functions that must be called using tagOrId + * + * @param tag the text of the tag + * @return a tag item + */ +ZincItem* Zinc::createTag(String tag) +{ + //just create an item + return new ZincItem (Tcl_NewStringObj (tag.c_str (), tag.length ())); +} + +/******************************************************* + ITEM MANIPULATION +*******************************************************/ +/** + * How To call Zinc or Tcl functions: + * + * All arguments of the function are Tcl_Obj. To accelerate their call, there + * is a pool of preconstructed Tcl_Obj and some often used constant Tcl_Obj. + * p1 and p2 are tables of pointers to be used for arguments. + * Fill p1 using either predefined objects like ZITM_* or a pool objet that + * you can fill with the value you want. + * Ex : p1[1] = ZFCT_add; + * Macros have been defined to fill and use a pool object + * Ex : p1[2] = Z_INT_POOL(1, 200); + * Do not use twice the same pool index for the same function call. + * p2 is used to construct and argument which is a list of Tcl_Obj. + * To call the function use z_tcl_call which automaticly handle error return + * codes or z_command to call a Zinc command which handle all arguments too. + */ + +/** + * Suppress an item + * + * @param item the item to suppress + */ +void Zinc::itemRemove (ZincItem *item) +{ + //call .zinc remove item + p1[0] = id; + p1[1] = ZFCT_remove; + p1[2] = item->object; + // call the function with 3 arguments + z_command (3, "itemRemove failed :"); +} + +/** + * Create a group item + * + * @param parentGroup group where we'll put the new group, if NULL we create + * in the defaults group + * @return the group item + */ +ZincItem *Zinc::itemCreateGroup (ZincItem *parentGroup) +{ + //call .zinc add group parentGroup + p1[0] = id; + p1[1] = ZFCT_add; + p1[2] = ZITM_group; + p1[3] = Z_PARENTGROUP (parentGroup); + // call the function with 4 arguments + z_command (4, "itemCreateGroup failed :"); + + return new ZincItem (Tcl_GetObjResult (interp)); +} + +/** + * Create a rectangle item + * + * @param parentGroup group where we'll put it + * @param x y width height the coordinates of the new rectangle + * @return the rectangle item + */ +ZincItem* Zinc::itemCreateRectangle (ZincItem *parentGroup, double x, double y, + double width, double height) +{ + //call .zinc add rectangle parentGroup {coords} + p1[0] = id; + p1[1] = ZFCT_add; + p1[2] = ZITM_rectangle; + p1[3] = Z_PARENTGROUP (parentGroup); + //coordinates as a list + p2[0] = Z_DBL_POOL (0, x); + p2[1] = Z_DBL_POOL (1, y); + p2[2] = Z_DBL_POOL (2, width + x); + p2[3] = Z_DBL_POOL (3, height + y); + p1[4] = Z_LST_POOL (4, p2, 4); // a list with 4 items + // call the function with 4 arguments + z_command (5, "itemCreateRectangle failed :"); + + //clear the list in the pool No 4 + Z_CLEANLIST (4); + + return new ZincItem (Tcl_GetObjResult (interp)); +} + +/** + * Create an arc item + * + * @param parentGroup group where we'll put it + * @param x y width height the coordinates of the new rectangle + * @return the arc item + */ +ZincItem *Zinc::itemCreateArc (ZincItem *parentGroup, double x, double y, + double width, double height) +{ + //call .zinc add arc parentGroup {coords} + p1[0] = id; + p1[1] = ZFCT_add; + p1[2] = ZITM_arc; + p1[3] = Z_PARENTGROUP (parentGroup); + //coordinates as a list + p2[0] = Z_DBL_POOL (0, x); + p2[1] = Z_DBL_POOL (1, y); + p2[2] = Z_DBL_POOL (2, width + x); + p2[3] = Z_DBL_POOL (3, height + y); + p1[4] = Z_LST_POOL (4, p2, 4); + // call the function with 5 arguments + z_command (5, "itemCreateArc failed :"); + + //clear the list in the pool No 4 to reuse it later + Z_CLEANLIST (4); + + return new ZincItem (Tcl_GetObjResult (interp)); +} + +/** + * Create a text item + * + * @param parentGroup group where we'll put it + * @return the text item + */ +ZincItem *Zinc::itemCreateText (ZincItem *parentGroup) +{ + //call .zinc add text parentGroup + p1[0] = id; + p1[1] = ZFCT_add; + p1[2] = ZITM_text; + p1[3] = Z_PARENTGROUP (parentGroup); + // call the function with 4 arguments + z_command (4, "itemCreateText failed :"); + + return new ZincItem (Tcl_GetObjResult (interp)); +} + +/** + * Create a curve item + * + * @param parentGroup group where we'll put it + * @param path the path to display + * @return the curve item + */ +ZincItem *Zinc::itemCreateCurve (ZincItem *parentGroup, ZincPath *path) +{ + Tcl_Obj *table; + table = path->getTable (); + //call .zinc add curve parentGroup {path} + p1[0] = id; + p1[1] = ZFCT_add; + p1[2] = ZITM_curve; + p1[3] = Z_PARENTGROUP (parentGroup); + p1[4] = table; + // call the function with 5 arguments + z_command (5, "itemCreateCurve failed :"); + return new ZincItem (Tcl_GetObjResult (interp)); +} + + +/** + * Create an icon item + * + * @param parentGroup group where we'll put it + * @param image a zincImage to display + * @return the icon item + */ +ZincItem *Zinc::itemCreateIcon (ZincItem *parentGroup, ZincImage* image) +{ + //call .zinc add icon parentGroup + p1[0] = id; + p1[1] = ZFCT_add; + p1[2] = ZITM_icon; + p1[3] = Z_PARENTGROUP (parentGroup); + // call the function with 4 arguments + z_command (4, "itemCreateIcon failed :"); + + //retreive the result + ZincItem *result = new ZincItem (Tcl_GetObjResult (interp)); + //to be able to set the image + itemSetImage (result, image); + + return result; +} + +/************************************************** + TRANSFORMATION METHODS +**************************************************/ + +/** + * How To call Zinc or Tcl functions: + * + * All arguments of the function are Tcl_Obj. To accelerate their call, there + * is a pool of preconstructed Tcl_Obj and some often used constant Tcl_Obj. + * p1 and p2 are tables of pointers to be used for arguments. + * Fill p1 using either predefined objects like ZITM_* or a pool objet that + * you can fill with the value you want. + * Ex : p1[1] = ZFCT_add; + * Macros have been defined to fill and use a pool object + * Ex : p1[2] = Z_INT_POOL(1, 200); + * Do not use twice the same pool index for the same function call. + * p2 is used to construct and argument which is a list of Tcl_Obj. + * To call the function use z_tcl_call which automaticly handle error return + * codes or z_command to call a Zinc command which handle all arguments too. + */ + +/** + * Translate the item + * + * @param item the item to which we apply the transform + * @param dx dy translation vector + */ +void Zinc::itemTranslate (ZincItem * item, double dx, double dy) +{ + // call .zinc translate item dx dy + p1[0] = id; + p1[1] = ZFCT_translate; + p1[2] = item->object; + p1[3] = Z_DBL_POOL (0, dx); + p1[4] = Z_DBL_POOL (1, dy); + // call the function with 5 arguments + z_command (5, "itemTranslateRelative Failed : "); +} + +/** + * Translate the item + * + * @param item the item to which we apply the transform + * @param x y translation vector + * @param absolute true if the translation is absolute + */ +void Zinc::itemTranslate (ZincItem * item, double x, double y, bool absolute) +{ + // call .zinc translate item x y absolute + p1[0] = id; + p1[1] = ZFCT_translate; + p1[2] = item->object; + p1[3] = Z_DBL_POOL (0, x); + p1[4] = Z_DBL_POOL (1, y); + p1[5] = Z_BOO_POOL (2, absolute); + // call the function with 6 arguments + z_command (6, "itemTranslateAbsolute Failed : "); +} + +/** + * Rotate an item + * + * @param item the item to which we apply the transform + * @param angle the angle to rotate in radian + */ +void Zinc::itemRotate (ZincItem * item, double angle) +{ + // call .zinc rotate item angle + p1[0] = id; + p1[1] = ZFCT_rotate; + p1[2] = item->object; + p1[3] = Z_DBL_POOL (0, angle); + // call the function with 4 arguments + z_command (4, "itemRotate (angle) Failed : "); +} + +/** + * Rotate an item + * + * @param item the item to which we apply the transform + * @param angle the angle to rotate in radian + * @param x y the center of the rotation + */ +void Zinc::itemRotate (ZincItem * item, double angle, double x, double y) +{ + // call .zinc rotate item angle x y + p1[0] = id; + p1[1] = ZFCT_rotate; + p1[2] = item->object; + p1[3] = Z_DBL_POOL (0, angle); + p1[4] = Z_DBL_POOL (1, x); + p1[5] = Z_DBL_POOL (2, y); + // call the function with 6 arguments + z_command (6, "itemRotateDegree (angle,center) Failed : "); +} + +/** + * Rotate an item + * + * @param item the item to which we apply the transform + * @param angle the angle to rotate + * @param degree true for an angle in degree, false for an angle in radians + */ +void Zinc::itemRotate (ZincItem * item, double angle, bool degree) +{ + // call .zinc rotate item angle degree + p1[0] = id; + p1[1] = ZFCT_rotate; + p1[2] = item->object; + p1[3] = Z_DBL_POOL (0, angle); + p1[4] = Z_BOO_POOL (1, degree); + // call the function with 5 arguments + z_command (5, "itemRotate (angle,degree) Failed : "); +} + +/** + * Rotate an item + * + * @param item the item to which we apply the transform + * @param angle the angle to rotate in radian + * @param x y the center of the rotation + * @param degree true for an angle in degree, false for an angle in radians + */ +void Zinc::itemRotate (ZincItem * item, double angle, double x, double y, + bool degree) +{ + // call .zinc rotate item angle degree x y + p1[0] = id; + p1[1] = ZFCT_rotate; + p1[2] = item->object; + p1[3] = Z_DBL_POOL (0, angle); + p1[4] = Z_BOO_POOL (1, degree); + p1[5] = Z_DBL_POOL (2, x); + p1[6] = Z_DBL_POOL (3, y); + // call the function with 7 arguments + z_command (7, "itemRotate (angle,center,degree) Failed : "); +} + +/** + * Scale an item + * + * @param item the item to which we apply the transform + * @param ax horizontal scale + * @param ay vertical scale + */ +void Zinc::itemScale (ZincItem * item, double ax, double ay) +{ + // call .zinc scale item ax ay + p1[0] = id; + p1[1] = ZFCT_scale; + p1[2] = item->object; + p1[3] = Z_DBL_POOL (0, ax); + p1[4] = Z_DBL_POOL (1, ay); + // call the function with 5 arguments + z_command (5, "itemScale Failed : "); +} + +/** + * Scale an item using a specified center + * + * @param item the item to which we apply the transform + * @param ax horizontal scale + * @param ay vertical scale + * @param cx cy center of the scale + */ +void Zinc::itemScale (ZincItem * item, double ax, double ay, double cx, double cy) +{ + // call .zinc scale item ax ay cx cy + p1[0] = id; + p1[1] = ZFCT_scale; + p1[2] = item->object; + p1[3] = Z_DBL_POOL (0, ax); + p1[4] = Z_DBL_POOL (1, ay); + p1[5] = Z_DBL_POOL (2, cx); + p1[6] = Z_DBL_POOL (3, cy); + // call the function with 7 arguments + z_command (7, "itemScale (center) Failed : "); +} + +/** + * Skew an item + * + * @param item the item to which we apply the transform + * @param sx horizontal skew + * @param sy vertical skew + */ +void Zinc::itemSkew (ZincItem * item, double sx, double sy) +{ + // call .zinc skew item sx sy + p1[0] = id; + p1[1] = ZFCT_skew; + p1[2] = item->object; + p1[3] = Z_DBL_POOL (0, sx); + p1[4] = Z_DBL_POOL (1, sy); + // call the function with 5 arguments + z_command (5, "itemSkew Failed : "); +} + +/** + * Skew an item horizontaly + * + * @param item the item to which we apply the transform + * @param sx horizontal skew + */ +void Zinc::itemSkewX (ZincItem * item, double sx) +{ + // call .zinc skew item sx 0 + p1[0] = id; + p1[1] = ZFCT_skew; + p1[2] = item->object; + p1[3] = Z_DBL_POOL (0, sx); + p1[4] = Z_DBL_POOL (1, 0); + // call the function with 5 arguments + z_command (5, "itemSkewX Failed : "); +} + +/** + * Skew an item verticaly + * + * @param item the item to which we apply the transform + * @param sy vertical skew + */ +void Zinc::itemSkewY (ZincItem * item, double sy) +{ + // call .zinc skew item 0 sy + p1[0] = id; + p1[1] = ZFCT_skew; + p1[2] = item->object; + p1[3] = Z_DBL_POOL (0, 0); + p1[4] = Z_DBL_POOL (1, sy); + // call the function with 5 arguments + z_command (5, "itemSkewY Failed : "); +} + +/** + * Reset all transformations associated with the item + * + * @param item the item to which we apply the transform + */ +void Zinc::itemResetTransformation (ZincItem * item) +{ + // call .zinc treset item + p1[0] = id; + p1[1] = ZFCT_treset; + p1[2] = item->object; + // call the function with 3 arguments + z_command (3, "itemResetTransformation Failed : "); +} + +/** + * Replace current transform by a matrix + * + * @param item the item to which we apply the transform + * @param a,b,c,d,e,f the new transform matrix + */ +void Zinc::itemSetTransformation (ZincItem * item, + double a, double b, double c, + double d, double e, double f) +{ + // call .zinc tset item a b c d e f + p1[0] = id; + p1[1] = ZFCT_tset; + p1[2] = item->object; + p1[3] = Z_DBL_POOL (0, a); + p1[4] = Z_DBL_POOL (1, b); + p1[5] = Z_DBL_POOL (2, c); + p1[6] = Z_DBL_POOL (3, d); + p1[7] = Z_DBL_POOL (4, e); + p1[8] = Z_DBL_POOL (5, f); + // call the function with 9 arguments + z_command (9, "itemSetTransformation Failed : "); +} + +/** + * Get current transform matrix + * @param item the item to which we apply the transform + * @param a,b,c,d,e,f places where we'll put the transform matrix + */ +void Zinc::itemGetTransformation (ZincItem * item, + double *a, double *b, double *c, + double *d, double *e, double *f) +{ + // bug in zinc (or not?), it doesn't reset result for the tget function + // or apennd a result instead of replacing it + Tcl_ResetResult (interp); + // call .zinc tget item + p1[0] = id; + p1[1] = ZFCT_tget; + p1[2] = item->object; + // call the function with 3 arguments + z_command (3, "itemGetTransformation Failed : "); + + //retreive the result as a list object + Tcl_Obj* tmp = Tcl_GetObjResult (interp); + int num; + Tcl_Obj** elems; + z_tcl_call (Tcl_ListObjGetElements (interp, tmp, &num, &elems), + "itemGetTransformation Failed : "); + + //num is necessarily 6, extract 6 double + z_tcl_call (Tcl_GetDoubleFromObj(interp, elems[0], a), + "itemGetTransformation Failed : "); + z_tcl_call (Tcl_GetDoubleFromObj(interp, elems[1], b), + "itemGetTransformation Failed : "); + z_tcl_call (Tcl_GetDoubleFromObj(interp, elems[2], c), + "itemGetTransformation Failed : "); + z_tcl_call (Tcl_GetDoubleFromObj(interp, elems[3], d), + "itemGetTransformation Failed : "); + z_tcl_call (Tcl_GetDoubleFromObj(interp, elems[4], e), + "itemGetTransformation Failed : "); + z_tcl_call (Tcl_GetDoubleFromObj(interp, elems[5], f), + "itemGetTransformation Failed : "); +} + + +/** + * Multiply current transform by a matrix + * + * @param item the item to which we apply the transform + * @param a,b,c,d,e,f transform matrix + */ +void Zinc::itemMatrix (ZincItem * item, + double a, double b, double c, + double d, double e, double f) +{ + double a0,b0,c0,d0,e0,f0; + double a1,b1,c1,d1,e1,f1; + // get current transform + itemGetTransformation (item, &a0, &b0, &c0, &d0, &e0, &f0); + + //multiply + a1 = a * a0 + d * b0; + b1 = b * a0 + e * b0; + c1 = c * a0 + f * b0 + c0; + d1 = a * d0 + d * e0; + e1 = b * d0 + e * e0; + f1 = c * d0 + f * e0 + f0; + + // set to new transform + itemSetTransformation (item, a1, b1, c1, d1, e1, f1); +} + +/************************************************** + BINDING +**************************************************/ + +/** + * How To call Zinc or Tcl functions: + * + * All arguments of the function are Tcl_Obj. To accelerate their call, there + * is a pool of preconstructed Tcl_Obj and some often used constant Tcl_Obj. + * p1 and p2 are tables of pointers to be used for arguments. + * Fill p1 using either predefined objects like ZITM_* or a pool objet that + * you can fill with the value you want. + * Ex : p1[1] = ZFCT_add; + * Macros have been defined to fill and use a pool object + * Ex : p1[2] = Z_INT_POOL(1, 200); + * Do not use twice the same pool index for the same function call. + * p2 is used to construct and argument which is a list of Tcl_Obj. + * To call the function use z_tcl_call which automaticly handle error return + * codes or z_command to call a Zinc command which handle all arguments too. + */ + +//number of elements in the ZincEvent structure +#define EVENT_COUNT 10 +//number of basic parameters to a widget callback +#define WIDGETCB_COUNT 3 +//number of basic parameters to an item callback +#define ITEMCB_COUNT 4 + +//the equivalent of z_tcl_call able to be called in a callback +#define z_tcl_call2(fct,msg) \ + { \ + int result = (fct); \ + if (result != TCL_OK) \ + { \ + Tcl_AppendResult (Zinc::interp, msg, NULL); \ + return TCL_ERROR; \ + } \ + } + +/** + * Real callback used by zinc TCL + * + * @param client_data the Zinc object + * @param interp current interpreter + * @param argc number of arguments + * @param args table of arguments + */ +int tclCallback (ClientData client_data, Tcl_Interp *interp, + int argc, Tcl_Obj *CONST args[]) +{ + Zinc *zinc = (Zinc*) client_data; + int cb; + ZincItem *item; + void *userData; + ZincEvent *ev; + long value; + + //count arguments + if ((argc != WIDGETCB_COUNT + EVENT_COUNT) && (argc != ITEMCB_COUNT + EVENT_COUNT)) + { + Tcl_SetResult (Zinc::interp, "Zinclib: Invalid argument count in tclCallback", NULL); + return TCL_ERROR; + } + // skip the bind name + args++; + + // get the item if this is an item bind + if (argc == ITEMCB_COUNT + EVENT_COUNT) + { + // retreive item + z_tcl_call2 (Tcl_GetLongFromObj (interp, args[0], &value), + "Zinclib: No item in tclCallback"); + item = (ZincItem*) value; + args++; + } + + // retreive callback + z_tcl_call2 (Tcl_GetLongFromObj (interp, args[0], &value), + "Zinclib: No callback in tclCallback"); + cb = value; + + // retreive userdata + args++; + z_tcl_call2 (Tcl_GetLongFromObj (interp, args[0], &value), + "Zinclib: No userData in tclCallback"); + userData = (void*) value; + + // point args to events values + args++; + //fill event structure with all avent values we support + ev = new ZincEvent; + // x position of the mouse + if (Tcl_GetIntFromObj (interp, args[0], &(ev->x)) != TCL_OK) + { + ev->x = 0; + } + // y position of the mouse + if (Tcl_GetIntFromObj (interp, args[1], &(ev->y)) != TCL_OK) + { + ev->y = 0; + } + // keycode + if (Tcl_GetIntFromObj (interp, args[2], &(ev->k)) != TCL_OK) + { + ev->k = 0; + } + // timestamp + if (Tcl_GetLongFromObj (interp, args[3], &(ev->t)) != TCL_OK) + { + ev->t = 0; + } + // keysyms + ev->K = String (Tcl_GetString (args[4])); + // window height + if (Tcl_GetIntFromObj (interp, args[5], &(ev->h)) != TCL_OK) + { + ev->h = 0; + } + // window width + if (Tcl_GetIntFromObj (interp, args[6], &(ev->w)) != TCL_OK) + { + ev->w = 0; + } + // x position of the mouse within display + if (Tcl_GetIntFromObj (interp, args[7], &(ev->X)) != TCL_OK) + { + ev->X = 0; + } + // y position of the mouse within display + if (Tcl_GetIntFromObj (interp, args[8], &(ev->Y)) != TCL_OK) + { + ev->Y = 0; + } + // button pressed + if (Tcl_GetIntFromObj (interp, args[9], &(ev->b)) != TCL_OK) + { + ev->b = 0; + } + + // Call the callback + if (argc == ITEMCB_COUNT + EVENT_COUNT) + { + // this is a callback on an item + ZincItemCallback itemCb = (ZincItemCallback)cb; + (*itemCb) (zinc, item, ev, userData); + } + else + { + // this is a callback on the zinc widget + ZincWidgetCallback zincCb = (ZincWidgetCallback)cb; + (*zincCb) (zinc, ev, userData); + } + + delete ev; + return TCL_OK; +} + +/** + * Bind a function to an event on the zinc widget + * + * @param eventSpecification tcl style event specicication + * @param callBack the function which will be called back + * @param userData data we will give back to the callback when called + * @param add false to replace existing bind or true to add + */ +void Zinc::bind (String eventSpecification, + ZincWidgetCallback callBack, void *userData, bool add) +{ + // call bind .zinc eventSpec script + const char* para[4]; + para[0] = "bind"; + para[1] = window.c_str (); + para[2] = eventSpecification.c_str (); + + //create callback script + // this script is a call to the tclCallback function using all arguments we need + String script; + // do we add or replace the callback + if (add) + { + script = String("+"); + } + script += tclCb + " "; // name of the tcl function we created + script += ltos ((long)callBack) + " "; // the real callback (as a pointer) + script += ltos ((long)userData) + " "; // the user data (as a pointer) + script += "%x %y %k %t %K %h %w %X %Y %b";// arguments for the event structure + para[3] = script.c_str (); + + //call the command with 4 arguments + z_tcl_call ((*bndCmdInfo.proc)(bndCmdInfo.clientData, interp, 4, para), + "bind Failed : "); +} + +/** + * Annulate a binding + * + * @param eventSpecification tcl style event specicication + */ +void Zinc::unbind (String eventSpecification) +{ + // call bind .zinc eventSpec "" + const char* para[4];; + para[0] = "bind"; + para[1] = window.c_str (); + para[2] = eventSpecification.c_str (); + para[3] = ""; + + //call the command with 4 arguments + z_tcl_call ((*bndCmdInfo.proc)(bndCmdInfo.clientData, interp, 4, para), + "unbind Failed : "); +} + +/** + * Bind a function to an event on an item + * + * @param item the item on which to bind + * @param eventSpecification tcl style event specicication + * @param callBack the function which will be called back + * @param userData data we will give back to the callback when called + */ +void Zinc::itemBind (ZincItem *item, String eventSpec, + ZincItemCallback callBack, void *userData, bool add) +{ + // call .zinc bind item eventSpec script + p1[0] = id; + p1[1] = ZFCT_bind; + p1[2] = item->object; + p1[3] = Z_STR_POOL (0, eventSpec.c_str (), eventSpec.length ()); + + //create callback script + // this script is a call to the tclCallback function using all arguments we need + String script; + // do we add or replace the callback + if (add) + { + script = String("+"); + } + script += tclCb + " "; // name of the tcl function we created + script += ltos ((long)item) + " "; // the item (as a pointer) + script += ltos ((long)callBack) + " "; // the real callback (as a pointer) + script += ltos ((long)userData) + " "; // the user data (as a pointer) + script += "%x %y %k %t %K %h %w %X %Y %b"; // arguments for the event structure + p1[4] = Z_STR_POOL (1, script.c_str (), script.length ()); + + // call the widget command with 5 arguments + z_command (5, "itemBind Failed : "); +} + +/** + * Annulate a binding + * + * @param item the item on which to unbind + * @param eventSpecification tcl style event specicication + */ +void Zinc::itemUnbind (ZincItem *item, String eventSpec) +{ + // call .zinc bind item eventSpec "" + p1[0] = id; + p1[1] = ZFCT_bind; + p1[2] = item->object; + p1[3] = Z_STR_POOL (0, eventSpec.c_str (), eventSpec.length ()); + p1[4] = Z_STR_POOL (1, "", -1); + + //call the command with 5 arguments + z_command (5, "itemUnbind Failed : "); +} + +/******************************************************* + STATIC PROCEDURES +*******************************************************/ + +/** + * How To call Zinc or Tcl functions: + * + * All arguments of the function are Tcl_Obj. To accelerate their call, there + * is a pool of preconstructed Tcl_Obj and some often used constant Tcl_Obj. + * p1 and p2 are tables of pointers to be used for arguments. + * Fill p1 using either predefined objects like ZITM_* or a pool objet that + * you can fill with the value you want. + * Ex : p1[1] = ZFCT_add; + * Macros have been defined to fill and use a pool object + * Ex : p1[2] = Z_INT_POOL(1, 200); + * Do not use twice the same pool index for the same function call. + * p2 is used to construct and argument which is a list of Tcl_Obj. + * To call the function use z_tcl_call which automaticly handle error return + * codes or z_command to call a Zinc command which handle all arguments too. + */ + +/** + * Loads the zinc library and initialize tcl and tk + * + * @param argv0 the name of the executable as passed in argv[0] + */ +void Zinc::loadZinc (char *argv0) throw (ZincException) +{ + //Initialise internal TCL structure + Tcl_FindExecutable (argv0); + //Create an interpreter + interp = Tcl_CreateInterp(); + if (interp == NULL) + { + throw ZincException("Tcl_CreateInterp Error", __FILE__, __LINE__); + } + + // set display + Tcl_SetVar(interp, "env", "DISPLAY", TCL_GLOBAL_ONLY); + //remove prompt + Tcl_SetVar(interp, "tcl_interactive", "0", TCL_GLOBAL_ONLY); + + // needed for Default system startup file for Tcl-based applications + z_tcl_call (Tcl_Init(interp), "Tcl_Init failed : "); + + //Initialize Tk +// Tk_Init(interp); + + z_tcl_call (Tk_Init (interp), "Tk_Init failed : "); + + //Initialize Zinc + z_tcl_call (Tkzinc_Init (interp), "Tkzinc_Init failed :"); + + // Load Img package in order to handle PNG, JPEG, .. + z_tcl_call (Tcl_GlobalEval (interp, "package require Img"), "Package Img not found"); + + //Initialize objects pool + for (int i(0); i<ZINC_POOL_COUNT ; i++) + { + pool[i] = Tcl_NewObj (); + Tcl_IncrRefCount (pool[i]); + } + + //initialise frame command info + if (!Tcl_GetCommandInfo(interp, "toplevel", &topCmdInfo)) + { + throw ZincException (String ("Toplevel command not found"), + __FILE__, __LINE__); + } + + //initialise zinc command info + if (!Tcl_GetCommandInfo(interp, "zinc", &zncCmdInfo)) + { + throw ZincException (String ("Zinc command not found"), + __FILE__, __LINE__); + } + + //initialise image command info + if (!Tcl_GetCommandInfo(interp, "image", &imgCmdInfo)) + { + throw ZincException (String ("Image command not found"), + __FILE__, __LINE__); + } + + //initialise font command info + if (!Tcl_GetCommandInfo(interp, "font", &fntCmdInfo)) + { + throw ZincException (String ("Font command not found"), + __FILE__, __LINE__); + } + + //initialise focus command info + if (!Tcl_GetCommandInfo(interp, "focus", &focCmdInfo)) + { + throw ZincException (String ("Focus command not found"), + __FILE__, __LINE__); + } + + //initialise bind command info + if (!Tcl_GetCommandInfo(interp, "bind", &bndCmdInfo)) + { + throw ZincException (String ("Bind command not found"), + __FILE__, __LINE__); + } +} + + +/** + * Run tk mainloop and returns when there is no more Tk window + */ +void Zinc::zincMainLoop () +{ + Tk_MainLoop(); +} + + +/******************************************************* + AUTOGENERATED METHODS (itemconfigure) +"code.cpp" in Tkzins/generic source from : + ./gen.pl Arc.c Attrs.c Color.c Curve.c Draw.c Group.c + Image.c List.c Item.c Icon.c Rectangle.c tkZinc.c Text.c +*******************************************************/ + +/** + * How To call Zinc or Tcl functions: + * + * All arguments of the function are Tcl_Obj. To accelerate their call, there + * is a pool of preconstructed Tcl_Obj and some often used constant Tcl_Obj. + * p1 and p2 are tables of pointers to be used for arguments. + * Fill p1 using either predefined objects like ZITM_* or a pool objet that + * you can fill with the value you want. + * Ex : p1[1] = ZFCT_add; + * Macros have been defined to fill and use a pool object + * Ex : p1[2] = Z_INT_POOL(1, 200); + * Do not use twice the same pool index for the same function call. + * p2 is used to construct and argument which is a list of Tcl_Obj. + * To call the function use z_tcl_call which automaticly handle error return + * codes or z_command to call a Zinc command which handle all arguments too. + */ + +/** + * Call zinc->itemconfigure ( -closed ) + * + * @param item the item to configure + * @param value the closed to set + */ +void Zinc::itemSetClosed (ZincItem * item, bool value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_closed; + p1[4] = Z_BOO_POOL (1, value); + + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetClosed Failed : "); +} + +/** + * Call zinc->itemcget ( -closed ) + * + * @param item the item to get closed from + * @return closed value + */ +bool Zinc::itemGetClosed (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_closed; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetClosed Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetBooleanFromObj (interp, tmp, &value), + "itemGetClosed Failed : "); + return bool (value); +} + +/** + * Call zinc->itemconfigure ( -composealpha ) + * + * @param item the item to configure + * @param value the composealpha to set + */ +void Zinc::itemSetComposealpha (ZincItem * item, bool value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_composealpha; + p1[4] = Z_BOO_POOL (1, value); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetComposealpha Failed : "); +} + +/** + * Call zinc->itemcget ( -composealpha ) + * + * @param item the item to get composealpha from + * @return composealpha value + */ +bool Zinc::itemGetComposealpha (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_composealpha; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetComposealpha Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetBooleanFromObj (interp, tmp, &value), + "itemGetComposealpha Failed : "); + return bool (value); +} + +/** + * Call zinc->itemconfigure ( -composerotation ) + * + * @param item the item to configure + * @param value the composerotation to set + */ +void Zinc::itemSetComposerotation (ZincItem * item, bool value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_composerotation; + p1[4] = Z_BOO_POOL (1, value); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetComposerotation Failed : "); +} + +/** + * Call zinc->itemcget ( -composerotation ) + * + * @param item the item to get composerotation from + * @return composerotation value + */ +bool Zinc::itemGetComposerotation (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_composerotation; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetComposerotation Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetBooleanFromObj (interp, tmp, &value), + "itemGetComposerotation Failed : "); + return (bool)value; +} + +/** + * Call zinc->itemconfigure ( -composescale ) + * + * @param item the item to configure + * @param value the composescale to set + */ +void Zinc::itemSetComposescale (ZincItem * item, bool value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_composescale; + p1[4] = Z_BOO_POOL (1, value); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetComposescale Failed : "); +} + +/** + * Call zinc->itemcget ( -composescale ) + * + * @param item the item to get composescale from + * @return composescale value + */ +bool Zinc::itemGetComposescale (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_composescale; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetComposescale Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetBooleanFromObj (interp, tmp, &value), + "itemGetComposescale Failed : "); + return (bool)value; +} + +/** + * Call zinc->itemconfigure ( -extent ) + * + * @param item the item to configure + * @param value the extent to set + */ +void Zinc::itemSetExtent (ZincItem * item, unsigned int value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_extent; + p1[4] = Z_INT_POOL (1, value); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetExtent Failed : "); +} + +/** + * Call zinc->itemcget ( -extent ) + * + * @param item the item to get extent from + * @return extent value + */ +unsigned int Zinc::itemGetExtent (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_extent; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetExtent Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetIntFromObj (interp, tmp, &value), + "itemGetExtent Failed : "); + return (unsigned int)value; +} + +/** + * Call zinc->itemconfigure ( -fillcolor ) + * + * @param item the item to configure + * @param value the fillcolor to set + */ +void Zinc::itemSetFillcolor (ZincItem * item, String value) +{ + //Warning, weird bug workaround + // here is a deep copy + // without this, on frequent calls, tcl mays segfault + String tmp = String(value.c_str ()); + + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_fillcolor; + p1[4] = Z_STR_POOL (1, tmp.c_str (), -1); + //call the zinc function in with 5 arguments internal form + z_command (5, "itemSetFillcolor Failed : "); +} + +/** + * Call zinc->itemcget ( -fillcolor ) + * + * @param item the item to get fillcolor from + * @return fillcolor value + */ +String Zinc::itemGetFillcolor (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_fillcolor; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetFillcolor Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + return String (Tcl_GetStringFromObj (tmp, NULL)); +} + +/** + * Call zinc->itemconfigure ( -filled ) + * + * @param item the item to configure + * @param value the filled to set + */ +void Zinc::itemSetFilled (ZincItem * item, bool value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_filled; + p1[4] = Z_BOO_POOL (1, value); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetFilled Failed : "); +} + +/** + * Call zinc->itemcget ( -filled ) + * + * @param item the item to get filled from + * @return filled value + */ +bool Zinc::itemGetFilled (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_filled; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetFilled Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetBooleanFromObj (interp, tmp, &value), + "itemGetFilled Failed : "); + return (bool)value; +} + +/** + * Call zinc->itemconfigure ( -fillpattern ) + * + * @param item the item to configure + * @param value the fillpattern to set + */ +void Zinc::itemSetFillpattern (ZincItem * item, ZincBitmap *value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_fillpattern; + p1[4] = value->object; + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetFillpattern Failed : "); +} + +/** + * Call zinc->itemcget ( -fillpattern ) + * + * @param item the item to get fillpattern from + * @return fillpattern value + */ +ZincBitmap * Zinc::itemGetFillpattern (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_fillpattern; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetFillpattern Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + return new ZincBitmap (tmp, true); +} + +/** + * Call zinc->itemconfigure ( -linecolor ) + * + * @param item the item to configure + * @param value the linecolor to set + */ +void Zinc::itemSetLinecolor (ZincItem * item, String value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_linecolor; + p1[4] = Z_STR_POOL (1, value.c_str (), value.length ()); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetLinecolor Failed : "); +} + +/** + * Call zinc->itemcget ( -linecolor ) + * + * @param item the item to get linecolor from + * @return linecolor value + */ +String Zinc::itemGetLinecolor (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_linecolor; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetLinecolor Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + return String (Tcl_GetStringFromObj (tmp, NULL)); +} + +/** + * Call zinc->itemconfigure ( -linepattern ) + * + * @param item the item to configure + * @param value the linepattern to set + */ +void Zinc::itemSetLinepattern (ZincItem * item, ZincBitmap * value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_linepattern; + p1[4] = value->object; + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetLinepattern Failed : "); +} + +/** + * Call zinc->itemcget ( -linepattern ) + * + * @param item the item to get linepattern from + * @return linepattern value + */ +ZincBitmap * Zinc::itemGetLinepattern (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_linepattern; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetLinepattern Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + return new ZincBitmap (tmp, true); +} + +/** + * Call zinc->itemconfigure ( -linestyle ) + * + * @param item the item to configure + * @param value the linestyle to set + */ +void Zinc::itemSetLinestyle (ZincItem * item, lineStyle value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_linestyle; + p1[4] = lineStyles[value]; + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetLinestyle Failed : "); +} + +/** + * Call zinc->itemcget ( -linestyle ) + * + * @param item the item to get linestyle from + * @return linestyle value + */ +lineStyle Zinc::itemGetLinestyle (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_linestyle; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetLinestyle Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetIndexFromObj (interp, tmp, + lineStylesStrings, + "lineStyles", + 0, &value), + "itemGetLinestyle Failed : "); + return (lineStyle)value; +} + +/** + * Call zinc->itemconfigure ( -linewidth ) + * + * @param item the item to configure + * @param value the linewidth to set + */ +void Zinc::itemSetLinewidth (ZincItem * item, double value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_linewidth; + p1[4] = Z_DBL_POOL (1, value); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetLinewidth Failed : "); +} + +/** + * Call zinc->itemcget ( -linewidth ) + * + * @param item the item to get linewidth from + * @return linewidth value + */ +double Zinc::itemGetLinewidth (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_linewidth; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetLinewidth Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + double value; + z_tcl_call (Tcl_GetDoubleFromObj (interp, tmp, &value), + "itemGetLinewidth Failed : "); + return (double)value; +} + +/** + * Call zinc->itemconfigure ( -pieslice ) + * + * @param item the item to configure + * @param value the pieslice to set + */ +void Zinc::itemSetPieslice (ZincItem * item, bool value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_pieslice; + p1[4] = Z_BOO_POOL (1, value); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetPieslice Failed : "); +} + +/** + * Call zinc->itemcget ( -pieslice ) + * + * @param item the item to get pieslice from + * @return pieslice value + */ +bool Zinc::itemGetPieslice (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_pieslice; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetPieslice Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetBooleanFromObj (interp, tmp, &value), + "itemGetPieslice Failed : "); + return (bool)value; +} + +/** + * Call zinc->itemconfigure ( -priority ) + * + * @param item the item to configure + * @param value the priority to set + */ +void Zinc::itemSetPriority (ZincItem * item, unsigned int value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_priority; + p1[4] = Z_INT_POOL (1, value); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetPriority Failed : "); +} + +/** + * Call zinc->itemcget ( -priority ) + * + * @param item the item to get priority from + * @return priority value + */ +unsigned int Zinc::itemGetPriority (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_priority; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetPriority Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetIntFromObj (interp, tmp, &value), + "itemGetPriority Failed : "); + return (unsigned int)value; +} + +/** + * Call zinc->itemconfigure ( -sensitive ) + * + * @param item the item to configure + * @param value the sensitive to set + */ +void Zinc::itemSetSensitive (ZincItem * item, bool value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_sensitive; + p1[4] = Z_BOO_POOL (1, value); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetSensitive Failed : "); +} + +/** + * Call zinc->itemcget ( -sensitive ) + * + * @param item the item to get sensitive from + * @return sensitive value + */ +bool Zinc::itemGetSensitive (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_sensitive; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetSensitive Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetBooleanFromObj (interp, tmp, &value), + "itemGetSensitive Failed : "); + return (bool)value; +} + +/** + * Call zinc->itemconfigure ( -startangle ) + * + * @param item the item to configure + * @param value the startangle to set + */ +void Zinc::itemSetStartangle (ZincItem * item, unsigned int value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_startangle; + p1[4] = Z_INT_POOL (1, value); + //call the zinc function with 5 argumentsin internal form + z_command (5, "itemSetStartangle Failed : "); +} + +/** + * Call zinc->itemcget ( -startangle ) + * + * @param item the item to get startangle from + * @return startangle value + */ +unsigned int Zinc::itemGetStartangle (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_startangle; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetStartangle Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetIntFromObj (interp, tmp, &value), + "itemGetStartangle Failed : "); + return (unsigned int)value; +} + +/** + * Call zinc->itemconfigure ( -tile ) + * + * @param item the item to configure + * @param value the tile to set + */ +void Zinc::itemSetTile (ZincItem * item, ZincBitmap * value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_tile; + p1[4] = value->object; + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetTile Failed : "); +} + +/** + * Call zinc->itemcget ( -tile ) + * + * @param item the item to get tile from + * @return tile value + */ +ZincBitmap * Zinc::itemGetTile (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_tile; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetTile Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + return new ZincBitmap (tmp, true); +} + +/** + * Call zinc->itemconfigure ( -visible ) + * + * @param item the item to configure + * @param value the visible to set + */ +void Zinc::itemSetVisible (ZincItem * item, bool value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_visible; + p1[4] = Z_BOO_POOL (1, value); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetVisible Failed : "); +} + +/** + * Call zinc->itemcget ( -visible ) + * + * @param item the item to get visible from + * @return visible value + */ +bool Zinc::itemGetVisible (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_visible; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetVisible Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetBooleanFromObj (interp, tmp, &value), + "itemGetVisible Failed : "); + return (bool)value; +} + +/** + * Call zinc->itemconfigure ( -capstyle ) + * + * @param item the item to configure + * @param value the capstyle to set + */ +void Zinc::itemSetCapstyle (ZincItem * item, capStyle value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_capstyle; + p1[4] = capStyles[value]; + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetCapstyle Failed : "); +} + +/** + * Call zinc->itemcget ( -capstyle ) + * + * @param item the item to get capstyle from + * @return capstyle value + */ +capStyle Zinc::itemGetCapstyle (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_capstyle; + //call the zinc function with 4 argumentsin internal form + z_command (4, "itemGetCapstyle Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetIndexFromObj (interp, tmp, + capStylesStrings, + "capStyles", + 0, &value), + "itemGetCapstyle Failed : "); + return (capStyle)value; +} + +/** + * Call zinc->itemconfigure ( -fillrule ) + * + * @param item the item to configure + * @param value the fillrule to set + */ +void Zinc::itemSetFillrule (ZincItem * item, fillRule value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_fillrule; + p1[4] = fillRules[value]; + //call the zinc function with 5 argumentsin internal form + z_command (5, "itemSetFillrule Failed : "); +} + +/** + * Call zinc->itemcget ( -fillrule ) + * + * @param item the item to get fillrule from + * @return fillrule value + */ +fillRule Zinc::itemGetFillrule (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_fillrule; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetFillrule Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetIndexFromObj (interp, tmp, + fillRulesStrings, + "fillRules", + 0, &value), + "itemGetFillrule Failed : "); + return (fillRule)value; +} + +/** + * Call zinc->itemconfigure ( -joinstyle ) + * + * @param item the item to configure + * @param value the joinstyle to set + */ +void Zinc::itemSetJoinstyle (ZincItem * item, joinStyle value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_joinstyle; + p1[4] = joinStyles[value]; + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetJoinstyle Failed : "); +} + +/** + * Call zinc->itemcget ( -joinstyle ) + * + * @param item the item to get joinstyle from + * @return joinstyle value + */ +joinStyle Zinc::itemGetJoinstyle (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_joinstyle; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetJoinstyle Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetIndexFromObj (interp, tmp, + joinStylesStrings, + "joinStyles", + 0, &value), + "itemGetJoinstyle Failed : "); + return (joinStyle)value; +} + +/** + * Call zinc->itemconfigure ( -relief ) + * + * @param item the item to configure + * @param value the relief to set + */ +void Zinc::itemSetRelief (ZincItem * item, relief value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_relief; + p1[4] = reliefs[value]; + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetRelief Failed : "); +} + +/** + * Call zinc->itemcget ( -relief ) + * + * @param item the item to get relief from + * @return relief value + */ +relief Zinc::itemGetRelief (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_relief; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetRelief Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetIndexFromObj (interp, tmp, + reliefsStrings, + "reliefs", + 0, &value), + "itemGetRelief Failed : "); + return (relief)value; +} + +/** + * Call zinc->itemconfigure ( -smoothrelief ) + * + * @param item the item to configure + * @param value the smoothrelief to set + */ +void Zinc::itemSetSmoothrelief (ZincItem * item, bool value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_smoothrelief; + p1[4] = Z_BOO_POOL (1, value); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetSmoothrelief Failed : "); +} + +/** + * Call zinc->itemcget ( -smoothrelief ) + * + * @param item the item to get smoothrelief from + * @return smoothrelief value + */ +bool Zinc::itemGetSmoothrelief (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_smoothrelief; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetSmoothrelief Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetBooleanFromObj (interp, tmp, &value), + "itemGetSmoothrelief Failed : "); + return (bool)value; +} + +/** + * Call zinc->itemconfigure ( -alpha ) + * + * @param item the item to configure + * @param value the alpha to set + */ +void Zinc::itemSetAlpha (ZincItem * item, unsigned int value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_alpha; + p1[4] = Z_INT_POOL (1, value); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetAlpha Failed : "); +} + +/** + * Call zinc->itemcget ( -alpha ) + * + * @param item the item to get alpha from + * @return alpha value + */ +unsigned int Zinc::itemGetAlpha (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_alpha; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetAlpha Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetIntFromObj (interp, tmp, &value), + "itemGetAlpha Failed : "); + return (unsigned int)value; +} + +/** + * Call zinc->itemconfigure ( -atomic ) + * + * @param item the item to configure + * @param value the atomic to set + */ +void Zinc::itemSetAtomic (ZincItem * item, bool value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_atomic; + p1[4] = Z_BOO_POOL (1, value); + //call the zinc function in with 5 arguments internal form + z_command (5, "itemSetAtomic Failed : "); +} + +/** + * Call zinc->itemcget ( -atomic ) + * + * @param item the item to get atomic from + * @return atomic value + */ +bool Zinc::itemGetAtomic (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_atomic; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetAtomic Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetBooleanFromObj (interp, tmp, &value), + "itemGetAtomic Failed : "); + return (bool)value; +} + +/** + * Call zinc->itemconfigure ( -clip ) + * + * @param item the item to configure + * @param value the clip to set + */ +void Zinc::itemSetClip (ZincItem * item, ZincItem * value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_clip; + p1[4] = value->object; + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetClip Failed : "); +} + +/** + * Call zinc->itemcget ( -clip ) + * + * @param item the item to get clip from + * @return clip value + */ +ZincItem * Zinc::itemGetClip (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_clip; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetClip Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + return new ZincItem(tmp); +} + +/** + * Call zinc->itemconfigure ( -anchor ) + * + * @param item the item to configure + * @param value the anchor to set + */ +void Zinc::itemSetAnchor (ZincItem * item, anchor value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_anchor; + p1[4] = anchors[value]; + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetAnchor Failed : "); +} + +/** + * Call zinc->itemcget ( -anchor ) + * + * @param item the item to get anchor from + * @return anchor value + */ +anchor Zinc::itemGetAnchor (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_anchor; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetAnchor Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetIndexFromObj (interp, tmp, + anchorsStrings, + "anchors", + 0, &value), + "itemGetAnchor Failed : "); + return (anchor)value; +} + +/** + * Call zinc->itemconfigure ( -color ) + * + * @param item the item to configure + * @param value the color to set + */ +void Zinc::itemSetColor (ZincItem * item, String value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_color; + p1[4] = Z_STR_POOL (1, value.c_str (), value.length ()); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetColor Failed : "); +} + +/** + * Call zinc->itemcget ( -color ) + * + * @param item the item to get color from + * @return color value + */ +String Zinc::itemGetColor (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_color; + //call the zinc function with 4 argument in internal form + z_command (4, "itemGetColor Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + return String (Tcl_GetStringFromObj (tmp, NULL)); +} + +/** + * Call zinc->itemconfigure ( -connecteditem ) + * + * @param item the item to configure + * @param value the connecteditem to set + */ +void Zinc::itemSetConnecteditem (ZincItem * item, ZincItem * value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_connecteditem; + p1[4] = value->object; + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetConnecteditem Failed : "); +} + +/** + * Call zinc->itemcget ( -connecteditem ) + * + * @param item the item to get connecteditem from + * @return connecteditem value + */ +ZincItem * Zinc::itemGetConnecteditem (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_connecteditem; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetConnecteditem Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + return new ZincItem(tmp); +} + +/** + * Call zinc->itemconfigure ( -connectionanchor ) + * + * @param item the item to configure + * @param value the connectionanchor to set + */ +void Zinc::itemSetConnectionanchor (ZincItem * item, anchor value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_connectionanchor; + p1[4] = anchors[value]; + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetConnectionanchor Failed : "); +} + +/** + * Call zinc->itemcget ( -connectionanchor ) + * + * @param item the item to get connectionanchor from + * @return connectionanchor value + */ +anchor Zinc::itemGetConnectionanchor (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_connectionanchor; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetConnectionanchor Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetIndexFromObj (interp, tmp, + anchorsStrings, + "anchors", + 0, &value), + "itemGetConnectionanchor Failed : "); + return (anchor)value; +} + +/** + * Call zinc->itemconfigure ( -image ) + * + * @param item the item to configure + * @param value the image to set + */ +void Zinc::itemSetImage (ZincItem * item, ZincImage * value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_image; + p1[4] = value->object; + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetImage Failed : "); +} + +/** + * Call zinc->itemcget ( -image ) + * + * @param item the item to get image from + * @return image value + */ +ZincImage * Zinc::itemGetImage (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_image; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetImage Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + return new ZincImage(tmp, true); +} + +/** + * Call zinc->itemconfigure ( -mask ) + * + * @param item the item to configure + * @param value the mask to set + */ +void Zinc::itemSetMask (ZincItem * item, ZincBitmap * value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_mask; + p1[4] = value->object; + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetMask Failed : "); +} + +/** + * Call zinc->itemcget ( -mask ) + * + * @param item the item to get mask from + * @return mask value + */ +ZincBitmap * Zinc::itemGetMask (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_mask; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetMask Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + return new ZincBitmap (tmp, true); +} + +/** + * Call zinc->itemconfigure ( -alignment ) + * + * @param item the item to configure + * @param value the alignment to set + */ +void Zinc::itemSetAlignment (ZincItem * item, alignment value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_alignment; + p1[4] = alignments[value]; + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetAlignment Failed : "); +} + +/** + * Call zinc->itemcget ( -alignment ) + * + * @param item the item to get alignment from + * @return alignment value + */ +alignment Zinc::itemGetAlignment (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_alignment; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetAlignment Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetIndexFromObj (interp, tmp, + alignmentsStrings, + "alignments", + 0, &value), + "itemGetAlignment Failed : "); + return (alignment)value; +} + +/** + * Call zinc->itemconfigure ( -font ) + * + * @param item the item to configure + * @param value the font to set + */ +void Zinc::itemSetFont (ZincItem * item, ZincFont * value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_font; + p1[4] = Z_STR_POOL (0, value->name.c_str(), value->name.length()); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetFont Failed : "); +} + +/** + * Call zinc->itemcget ( -font ) + * + * @param item the item to get font from + * @return font value + */ +ZincFont * Zinc::itemGetFont (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_font; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetFont Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + return new ZincFont (Tcl_GetStringResult (interp)); +} + +/** + * Call zinc->itemconfigure ( -overstriked ) + * + * @param item the item to configure + * @param value the overstriked to set + */ +void Zinc::itemSetOverstriked (ZincItem * item, bool value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_overstriked; + p1[4] = Z_BOO_POOL (1, value); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetOverstriked Failed : "); +} + +/** + * Call zinc->itemcget ( -overstriked ) + * + * @param item the item to get overstriked from + * @return overstriked value + */ +bool Zinc::itemGetOverstriked (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_overstriked; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetOverstriked Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetBooleanFromObj (interp, tmp, &value), + "itemGetOverstriked Failed : "); + return (bool)value; +} + +/** + * Call zinc->itemconfigure ( -spacing ) + * + * @param item the item to configure + * @param value the spacing to set + */ +void Zinc::itemSetSpacing (ZincItem * item, short value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_spacing; + p1[4] = Z_INT_POOL (1, value); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetSpacing Failed : "); +} + +/** + * Call zinc->itemcget ( -spacing ) + * + * @param item the item to get spacing from + * @return spacing value + */ +short Zinc::itemGetSpacing (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_spacing; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetSpacing Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetIntFromObj (interp, tmp, &value), + "itemGetSpacing Failed : "); + return (short)value; +} + +/** + * Call zinc->itemconfigure ( -text ) + * + * @param item the item to configure + * @param value the text to set + */ +void Zinc::itemSetText (ZincItem * item, String value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_text; + p1[4] = Z_STR_POOL (1, value.c_str (), value.length ()); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetText Failed : "); +} + +/** + * Call zinc->itemcget ( -text ) + * + * @param item the item to get text from + * @return text value + */ +String Zinc::itemGetText (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_text; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetText Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + return String (Tcl_GetStringFromObj (tmp, NULL)); +} + +/** + * Call zinc->itemconfigure ( -underlined ) + * + * @param item the item to configure + * @param value the underlined to set + */ +void Zinc::itemSetUnderlined (ZincItem * item, bool value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_underlined; + p1[4] = Z_BOO_POOL (1, value); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetUnderlined Failed : "); +} + +/** + * Call zinc->itemcget ( -underlined ) + * + * @param item the item to get underlined from + * @return underlined value + */ +bool Zinc::itemGetUnderlined (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_underlined; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetUnderlined Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetBooleanFromObj (interp, tmp, &value), + "itemGetUnderlined Failed : "); + return (bool)value; +} + +/** + * Call zinc->itemconfigure ( -width ) + * + * @param item the item to configure + * @param value the width to set + */ +void Zinc::itemSetWidth (ZincItem * item, unsigned short value) +{ + //prepare arguments : .zinc itemconfigure item attribute value + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_width; + p1[4] = Z_INT_POOL (1, value); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetWidth Failed : "); +} + +/** + * Call zinc->itemcget ( -width ) + * + * @param item the item to get width from + * @return width value + */ +unsigned short Zinc::itemGetWidth (ZincItem * item) +{ + Tcl_Obj* tmp; + //discard all old results + Tcl_ResetResult (interp); + //prepare arguments : .zinc itemcget item + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_width; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetWidth Failed : "); + + //retreive the result trough the tcl interpreter and convert it + tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetIntFromObj (interp, tmp, &value), + "itemGetWidth Failed : "); + return (unsigned short)value; +} + + + +/******************************************************* + END OF AUTOGENERATED METHODS +*******************************************************/ + + +/** + * How To call Zinc or Tcl functions: + * + * All arguments of the function are Tcl_Obj. To accelerate their call, there + * is a pool of preconstructed Tcl_Obj and some often used constant Tcl_Obj. + * p1 and p2 are tables of pointers to be used for arguments. + * Fill p1 using either predefined objects like ZITM_* or a pool objet that + * you can fill with the value you want. + * Ex : p1[1] = ZFCT_add; + * Macros have been defined to fill and use a pool object + * Ex : p1[2] = Z_INT_POOL(1, 200); + * Do not use twice the same pool index for the same function call. + * p2 is used to construct and argument which is a list of Tcl_Obj. + * To call the function use z_tcl_call which automaticly handle error return + * codes or z_command to call a Zinc command which handle all arguments too. + */ +/** + * Call zinc->itemconfigure ( -firstend ) + * + * @param item the item to get width from + * @param a,b,c values used to set end + */ +void Zinc::itemSetFirstend (ZincItem * item, double a, double b, double c) +{ + String value = dtos (a) + " " + dtos (b) + " " + dtos (c); + // call .zinc itemconfigure item -firstend "a b c" + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_firstend; + p1[4] = Z_STR_POOL (1, value.c_str (), value.length ()); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetFirstend Failed : "); +} + + +/** + * Call zinc->itemcget ( -firstend ) + * + * @param item the item to get width from + * @param a,b,c values used to sedwhere we'll put end + */ +void Zinc::itemGetFirstend (ZincItem * item, double *a, double *b, double *c) +{ + Tcl_Obj *tmp; + int argc; + char * line; + + //discard old results + Tcl_ResetResult (interp); + // call .zinc itemcget item -firstend + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_firstend; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetFirstend Failed : "); + + //get the result as a string + tmp = Tcl_GetObjResult (interp); + line = Tcl_GetStringFromObj (tmp, NULL); + + //interpret the string a 3 double + argc = sscanf(line, "%lf %lf %lf", a, b, c); + if (argc != 3) + { + throw ZincException (String("itemGetFirstend Failed"), __FILE__, __LINE__); + } +} + +/** + * Call zinc->itemconfigure ( -lastend ) + * + * @param item the item to get width from + * @param a,b,c values used to set end + */ +void Zinc::itemSetLastend (ZincItem * item, double a, double b, double c) +{ + String value = dtos (a) + " " + dtos (b) + " " + dtos (c); + // call .zinc itemconfigure item -lastend "a b c" + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_lastend; + p1[4] = Z_STR_POOL (1, value.c_str (), value.length ()); + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetLastend Failed : "); +} + +/** + * Call zinc->itemcget ( -lastend ) + * + * @param item the item to get width from + * @param a,b,c values used to sedwhere we'll put end + */ +void Zinc::itemGetLastend (ZincItem * item, double *a, double *b, double *c) +{ + Tcl_Obj *tmp; + int argc; + char * line; + + //discard old results + Tcl_ResetResult (interp); + // call .zinc itemcget item -lastend + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_lastend; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetLastend Failed : "); + + //get the result as a string + tmp = Tcl_GetObjResult (interp); + line = Tcl_GetStringFromObj (tmp, NULL); + + //interpret the string a 3 double + argc = sscanf(line, "%lf %lf %lf", a, b, c); + if (argc != 3) + { + throw ZincException (String("itemGetLastend Failed"), __FILE__, __LINE__); + } +} + +/** + * Call zinc->itemconfigure ( -position ) + * + * @param item the item to get width fromset position to + * @param x,y position + */ +void Zinc::itemSetPosition (ZincItem * item, double x, double y) +{ + // call .zinc itemconfigure item -position {x y} + p1[0] = id; + p1[1] = ZFCT_itemconfigure; + p1[2] = item->object; + p1[3] = ZOPT_position; + //make a pair + p2[0] = Z_DBL_POOL (1, x); + p2[1] = Z_DBL_POOL (2, y); + p1[4] = Z_LST_POOL (3, p2, 2); // a list of 2 items + //call the zinc function with 5 arguments in internal form + z_command (5, "itemSetPosition Failed : "); + // clean the list No 3 in the pool + Z_CLEANLIST (3); +} + +/** + * Call zinc->itemcget ( -position ) + * + * @param item the item to get position from + * @param x,y position + */ +void Zinc::itemGetPosition (ZincItem * item, double *x, double *y) +{ + Tcl_Obj *tmp; + int num; + Tcl_Obj** elems; + + //discard old results + Tcl_ResetResult (interp); + // call .zinc itemcget item -position + p1[0] = id; + p1[1] = ZFCT_itemcget; + p1[2] = item->object; + p1[3] = ZOPT_position; + //call the zinc function with 4 arguments in internal form + z_command (4, "itemGetPosition Failed : "); + + //retreive the result as a list + tmp = Tcl_GetObjResult (interp); + z_tcl_call (Tcl_ListObjGetElements (interp, tmp, &num, &elems), + "itemGetPosition Failed : "); + + //num is necessarily 2 extract 2 double + z_tcl_call (Tcl_GetDoubleFromObj(interp, elems[0], x), + "itemGetPosition Failed : "); + z_tcl_call (Tcl_GetDoubleFromObj(interp, elems[0], y), + "itemGetPosition Failed : "); +} + +/** + * Create an image object + * + * @param the image reference (a file name) + * @param isPhoto true for a picture, false for an X11 bitmap + */ +ZincImage* Zinc::createImageFromFile (String image) +{ + const char* para[5]; + //discard old results + Tcl_ResetResult (interp); + // prepare arguments to call : image create (photo|bitmap) -file image + para[0] = "image"; + para[1] = "create"; + para[2] = "photo"; + para[3] = "-file"; + para[4] = image.c_str (); + + // call the function with 5 arguments and check for error + z_tcl_call ((*imgCmdInfo.proc)(imgCmdInfo.clientData, interp, 5, para), + "createImageFromFile Failed : "); + return new ZincImage (Tcl_GetObjResult (interp)); +} + +/** + * Create an image object + * + * @param the image reference (a base64 String or binary data) + * @param isPhoto true for a picture, false for an X11 bitmap + */ +ZincImage* Zinc::createImageFromData (String image) +{ + const char* para[5]; + //discard old results + Tcl_ResetResult (interp); + // prepare arguments to call : image create (photo|bitmap) -data image + para[0] = "image"; + para[1] = "create"; + para[2] = "photo"; + para[3] = "-data"; + para[4] = image.c_str (); + + // call the function with 5 arguments and check for error + z_tcl_call ((*imgCmdInfo.proc)(imgCmdInfo.clientData, interp, 5, para), + "createImageFromData Failed : "); + return new ZincImage (Tcl_GetObjResult (interp)); +} + +/** + * Create a bitmap object from a file + * + * @param image the bitmap reference (a file name) + */ +ZincBitmap* Zinc::createBitmapFromFile (String image) +{ + const char* para[5]; + //discard old results + Tcl_ResetResult (interp); + // prepare arguments to call : image create (photo|bitmap) -file image + para[0] = "image"; + para[1] = "create"; + para[2] = "bitmap"; + para[3] = "-file"; + para[4] = image.c_str (); + + // call the function with 5 arguments and check for error + z_tcl_call ((*imgCmdInfo.proc)(imgCmdInfo.clientData, interp, 5, para), + "createBitmapFromFile Failed : "); + return new ZincBitmap (Tcl_GetObjResult (interp), false); +} + +/** + * Create a bitmap object base64 data + * + * @param image the bitmap reference (a base64 String or binary data) + */ +ZincBitmap* Zinc::createBitmapFromData (String image) +{ + const char* para[5]; + //discard old results + Tcl_ResetResult (interp); + // prepare arguments to call : image create (photo|bitmap) -data image + para[0] = "image"; + para[1] = "create"; + para[2] = "bitmap"; + para[3] = "-data"; + para[4] = image.c_str (); + + // call the function with 5 arguments and check for error + z_tcl_call ((*imgCmdInfo.proc)(imgCmdInfo.clientData, interp, 5, para), + "createBitmapFromData Failed : "); + return new ZincBitmap (Tcl_GetObjResult (interp), false); +} + +/** + * Create a bitmap object using a predefined name + * + * @param image the bitmap reference (a name) + */ +ZincBitmap* Zinc::createBitmapFromName (String image) +{ + return new ZincBitmap (image); +} + +/** + * Create an image object + * + * @param width Width of image + * @param height Height of image + * @param aggBuffer An AGG buffer + */ +ZincImage* Zinc::createImageFromAGGBuffer (int width, int height, unsigned char *aggBuffer) +{ + const char* para[7]; + //discard old results + Tcl_ResetResult (interp); + + // create a blank offscreen image + para[0] = "image"; + para[1] = "create"; + para[2] = "photo"; + para[3] = "-height"; + para[4] = String(itos (height).c_str ()).c_str (); + para[5] = "-width"; + para[6] = String(itos (width).c_str ()).c_str (); + + // call the function with 7 arguments and check for error + z_tcl_call ((*imgCmdInfo.proc)(imgCmdInfo.clientData, interp, 7, para), + "createImageFromBuffer Failed : "); + // save result + ZincImage *result = new ZincImage (Tcl_GetObjResult (interp)); + + // get tcl PhotoImage handle + Tk_PhotoHandle photo; + photo = Tk_FindPhoto (interp, Tcl_GetString (result->object)); + if (photo == NULL) + { + // todo: error + } + + // create a PhotoImageBlock + Tk_PhotoImageBlock block; + block.pixelPtr = aggBuffer; + block.width = width; + block.height = height; + block.pitch = block.width * 3; + block.pixelSize = 3; + block.offset[0] = 0; + block.offset[1] = 1; + block.offset[2] = 2; + block.offset[3] = 0; + + /* copy block to photo image and leave the rest to tk */ + Tk_PhotoPutBlock(photo, &block, 0, 0, block.width, block.height, TK_PHOTO_COMPOSITE_SET); + + // return result + return result; +} + + + +/** + * Create a font object + * + * @param family the font mamily + * @param size if a positive number, it is in points, if a negative number, + * its absolute value is a size in pixels. + * @param bold 1 for a bold font, 0 for a normal font, -1 for unspecified + * @param italic 1 an italic font, 0 for a roman font, -1 for unspecified + * @param underline 1 for an underlined, 0 for a normal font, -1 for + * unspecified + * @param overstrike 1 for an overstriked font, 0 for a normal font, -1 for unspecified + */ +ZincFont* Zinc::createFont (String family, int size, int bold, int italic, + int underline, int overstrike) +{ + const char* para[14]; + //quote family to avoid problems with spaces + + //discard old results + Tcl_ResetResult (interp); + // prepare arguments to call : font create -family family -size size + // -weight weight -slant slant -underline underline -overstrike overstrike + para[0] = "font"; + para[1] = "create"; + para[2] = "-family"; + para[3] = family.c_str (); + para[4] = "-size"; + //Warning, weird bug workaround + // here is a deep copy + // without this, on one MDK10.1 machine tcl sees an empty string + String tmp = String(itos (size).c_str ()); + para[5] = tmp.c_str (); + + // use i as a variable parameter pointer + int i=6; // last parameter is para[5] + //handle default value for weight + if (bold != -1) + { + para[i++] = "-weight"; + para[i++] = bold == 1 ? "bold" : "normal"; + } + //handle default value for italic + if (italic != -1) + { + para[i++] = "-slant"; + para[i++] = italic == 1 ? "italic" : "roman"; + } + //handle default value for underline + if (underline != -1) + { + para[i++] = "-underline"; + para[i++] = underline == 1 ? "true" : "false"; + } + //handle default value for overstrike + if (overstrike != -1) + { + para[i++] = "-overstrike"; + para[i++] = overstrike == 1 ? "true" : "false"; + } + + // call the function with i arguments and check for error + z_tcl_call ((*fntCmdInfo.proc)(fntCmdInfo.clientData, interp, i, para), + "createFont Failed : "); + return new ZincFont (Tcl_GetStringResult (interp)); +} + +/** + * Get font ascent + * + * @param font the font + * @return the font ascent + */ +int Zinc::getFontAscent (ZincFont* font) +{ + const char* para[4]; + + //discard old results + Tcl_ResetResult (interp); + // prepare arguments to call : font metrics font -ascent + para[0] = "font"; + para[1] = "metrics"; + para[2] = font->name.c_str(); + para[3] = "-ascent"; + + // call the function with 4 arguments and check for error + z_tcl_call ((*fntCmdInfo.proc)(fntCmdInfo.clientData, interp, 4, para), + "getFontAscent Failed : "); + + //retreive the result as an integer + Tcl_Obj *tmp = Tcl_GetObjResult (interp); + int value; + z_tcl_call (Tcl_GetIntFromObj (interp, tmp, &value), + "getFontAscent Failed : "); + return value; +} + + +/** + * Get Image width + * + * @param ZincImage the image to get width from + * @return the width of the image + */ +int Zinc::getImageWidth (ZincImage *image) +{ + const char* para[3]; + + //discard old results + Tcl_ResetResult (interp); + // prepare arguments to call : image create (photo|bitmap) -data image + para[0] = "image"; + para[1] = "width"; + para[2] = Tcl_GetString (image->object); + + // call the function with 3 arguments and check for error + z_tcl_call ((*imgCmdInfo.proc)(imgCmdInfo.clientData, interp, 3, para), + "getImageWidth Failed : "); + + int value; + // retreive the result as an integer + Tcl_Obj *tmp = Tcl_GetObjResult (interp); + z_tcl_call (Tcl_GetIntFromObj (interp, tmp, &value), + "getImageWidth Failed : "); + return value; +} + +/** + * Get Image height + * + * @param ZincImage the image to get height from + * @return the height of the image + */ +int Zinc::getImageHeight (ZincImage *image) +{ + const char* para[3]; + + //discard old results + Tcl_ResetResult (interp); + // prepare arguments to call : image create (photo|bitmap) -data image + para[0] = "image"; + para[1] = "height"; + para[2] = Tcl_GetString (image->object); + + // call the function with 3 arguments and check for error + z_tcl_call ((*imgCmdInfo.proc)(imgCmdInfo.clientData, interp, 3, para), + "getImageHeight Failed : "); + + int value; + // retreive the result as an integer + Tcl_Obj *tmp = Tcl_GetObjResult (interp); + z_tcl_call (Tcl_GetIntFromObj (interp, tmp, &value), + "getImageHeight Failed : "); + return value; +} + +/** + * This is inline because it is called frequently and needs to be optimized + * Use this when you need to call a function that can return a TCL error code. + * + * @param fct the full function call + * @param msg the error message to throw in case of error + */ +void Zinc::z_tcl_call (int result, char* p_msg) throw (ZincException) +{ + if (result != TCL_OK) + { + const char *r; + String msg = "zinclib: "; + if (p_msg != NULL) + { + msg.append (p_msg); + } + r = Tcl_GetStringResult (interp); + if (r != NULL) + { + msg.append (r); + } + throw ZincException (msg, __FILE__, __LINE__ ); + } +} + +/** + * This is a inline because it is called frequently and needs to be optimized + * Use this to call the zinObjectCommand fuction. The call is made using the + * pre allocated table p1, it must contain Tcl_Obj thar are parameters to + * the zinObjectCommand function. A parameter indicate how many parameters + * are passed to the zinObjectCommand function. + * + * @param count the number of parameters in p1 + * @param msg the error message to throw in case of error + */ +void Zinc::z_command (int count, char* p_msg) throw (ZincException) +{ + int result = (*objCmd) (wi, interp, (count), p1); + if (result != TCL_OK) + { + const char *r; + String msg = "zinclib: "; + if (p_msg != NULL) + { + msg.append (p_msg); + } + r = Tcl_GetStringResult (interp); + if (r != NULL) + { + msg.append (r); + } + throw ZincException (msg, __FILE__, __LINE__ ); + } +} diff --git a/zinclib.d/src/Zinc.hpp b/zinclib.d/src/Zinc.hpp new file mode 100644 index 0000000..417b697 --- /dev/null +++ b/zinclib.d/src/Zinc.hpp @@ -0,0 +1,1365 @@ +/** Zinc.hpp + * zinclib + * + * This software is the property of IntuiLab SA, France. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Here is the declaration of the Zinc object + * + * 08/03/05 + * + * Contributors: + * Benoit Peccatte <peccatte@intuilab.com> + * David Thevenin <thevenin@intuilab.com> + * + */ +#include "ZincTypes.hpp" +#include "ZincObjects.hpp" +#include "ZincPath.hpp" +#include "ZincExtern.hpp" +#include <tcl.h> + +#ifndef ZINC_HEADER +#define ZINC_HEADER + + +/** Number of objects in the pool */ +const int ZINC_POOL_COUNT = 7; +/** maximum number of parameter in a zinc function */ +const int ZINC_PARAM_COUNT = 10; + +/**Defaults zinc group */ +const int DEFAULT_GROUP = 1; + +/** + * This class contains a zinc widget and members to create and modify items + */ +class Zinc +{ + friend class ZincPath; + +public: + Tcl_Obj *id; ///< the id of this object + WidgetObjCmd objCmd; ///< the command associated with this object + ClientData wi; ///< the zinc object itself + String tclCb; ///< name of the binding callback + int znId; ///< the znCount at creation time + String window; ///< the window which contains the widget + + static int znCount; ///< count to create unique ids + static Tcl_CmdInfo topCmdInfo; ///< the command associated with toplevel + static Tcl_CmdInfo zncCmdInfo; ///< the command associated with zinc + static Tcl_CmdInfo imgCmdInfo; ///< the command associated with image + static Tcl_CmdInfo fntCmdInfo; ///< the command associated with font + static Tcl_CmdInfo focCmdInfo; ///< the command associated with fous + static Tcl_CmdInfo bndCmdInfo; ///< the command associated with bind + static Tcl_Obj* pool[ZINC_POOL_COUNT];///< a pool of tclobj ready to be used + static Tcl_Obj* p1[ZINC_PARAM_COUNT]; ///< table of pointeur use for parameters + static Tcl_Obj* p2[ZINC_PARAM_COUNT]; ///< table of pointeur use for parameters + +public: + static Tcl_Interp *interp; ///< the tcl interpreter + + /** + * The public constructor + * + * @param renderingMode ZINC_BACKEND_X11 or ZINC_BACKEND_OPENGL + */ + Zinc (int renderingMode); + + /** + * The public destructor + */ + ~Zinc (); + + /** + * Change window title + * + * @param title the title string + */ + void setTitle (String title); + +/***************************************** + WIDGET PROPERTIES +*****************************************/ + + /** + * Call zinc->configure ( -backcolor ) + * + * @param value the backcolor to set + */ + void setBackcolor (String value); + + /** + * Call zinc->cget ( -backcolor ) + * + * @return backcolor value + */ + String getBackcolor (); + + /** + * Call zinc->configure ( -forecolor ) + * + * @param value the forecolor to set + */ + void setForecolor (String value); + + /** + * Call zinc->cget ( -forecolor ) + * + * @return forecolor value + */ + String getForecolor (); + + /** + * Call zinc->configure ( -width ) + * + * @param value the width to set + */ + void setWidth (int value); + + /** + * Call zinc->cget ( -width ) + * + * @return width value + */ + int getWidth (); + + /** + * Call zinc->configure ( -height ) + * + * @param value the height to set + */ + void setHeight (int value); + + /** + * Call zinc->cget ( -height ) + * + * @return height value + */ + int getHeight (); + + /** + * Call zinc->configure ( -borderwidth ) + * + * @param value the borderwidth to set + */ + void setBorderwidth (int value); + + /** + * Call zinc->cget ( -borderwidth ) + * + * @return borderwidth value + */ + int getBorderwidth (); + + /** + * Call zinc->configure ( -font ) + * + * @param value the font to set + */ + void setFont (ZincFont* value); + + /** + * Call zinc->cget ( -font ) + * + * @return font value + */ + ZincFont* getFont (); + +/***************************************** + WIDGET METHODS +*****************************************/ + + /** + * Get the bounding box of an item + * + * @param item the item to get bbox + * @param bbox a table where we'll put the bounding box + * bbox[0] = x0, bbox[1] = y0, bbox[2] = xc, bbox[3] = yc + */ + void bbox (ZincItem* item, double bbox[4]); + + /** + * Get the bounding box of an item in its parent group + * + * @param item the item to get bbox in its parent group + * @param bbox a table where we'll put the bounding box + * bbox[0] = x0, bbox[1] = y0, bbox[2] = xc, bbox[3] = yc + */ + void relativeBbox (ZincItem* item, double bbox[4]); + + + /** + * Change the group of an item + * + * @param item the item to move + * @param parentGroup new group for the item + */ + void chggroup (ZincItem *item, ZincItem *parentGroup); + + /** + * Clone an item + * + * @param item the item to clone + * @return the cloned item + */ + ZincItem* clone (ZincItem *item); + + /** + * Get the number of contour of an item + * + * @return number of contour + */ + int contour (ZincItem *item); + + /** + * Set the contour of an item to the one of an other + * + * @param item the item on which we set the contour + * @param flag the operation to do on the contour + * @param reference the item to set contour from + * @return the number of contour + */ + int contour (ZincItem *item, itemOperator flag, ZincItem *reference); + + /** + * Set the contour of an item + * + * @param item the item on which we set the contour + * @param add true to add a path, false to remove + * @param reference the new contour + * @return the number of contour + */ + int contour (ZincItem *item, bool add, ZincPath *contour); + + /** + * Set or modify the coordinates of an item + * + * @param item the item to modify + * @param contour new coords for the item + * @param add true to add coords, false to replace + * @param contourIndex the contour do modify + * @param coordIndex the coordinate to modify (WARNING, path must be one + * point if the is not the default) + */ + void coords (ZincItem *item, ZincPath *contour, bool add, + int contourIndex = -1, int coordIndex = -1); + + /** + * Remove coords of an item + * + * @param item the item to modify + * @param coordIndex the coordinate to rmove + * @param contourIndex the contour on which we remove + */ + void coordsRemove (ZincItem *item, int coordIndex, int contourIndex = -1); + + /** + * Add a tag to an item + * + * @param item the item to add tag to + * @param tag a tag to add + */ + void addTag (ZincItem *item, String tag); + + /** + * Remove a tag from an item + * + * @param item the item to remove tag from + * @param tag a tag to remove (nothing to remove all tags) + */ + void dTag (ZincItem *item, String tag = String("")); + + /** + * List all tags of an item + * It's up to the caller to delete the resulting table and strings + * + * @param item the item to list tag from + * @param lagList a pointer to a table of String containing tags + * @return the number of tags + */ + int getTags (ZincItem *item, String*** tagList); + + /** + * Set the focus to an item + * + * @param item the item to set the focus to + */ + void focus (ZincItem *item); + + /** + * Tell if the name is a gradient name + * + * @param gname a gradient name + * @return true if the name is a gradient name, false otherwise + */ + bool isGname (String gname); + + /** + * Create a named gradient + * + * @param gradient a gradient + * @param gname a gradient name + */ + void gname (String gradient, String gname); + + /** + * Retreive the group of an item + * + * @param item the item to get the group from + * @return the group + */ + ZincItem* group (ZincItem *item); + + /** + * Reorder items to lower one + * + * @param item the item to lower + */ + void lower (ZincItem *item); + + /** + * Reorder items to lower one + * + * @param item the item to lower + * @param belowThis and item that will be over item + */ + void lower (ZincItem *item, ZincItem *belowThis); + + /** + * Reorder items to raise one + * + * @param item the item to raise + */ + void raise (ZincItem *item); + + /** + * Reorder items to raise one + * + * @param item the item to raise + * @param aboveThis an item that will be under item + */ + void raise (ZincItem *item, ZincItem *aboveThis); + + /** + * Return the type of an item + * + * @param item an item + * @return the type of the item + */ + itemType type (ZincItem *item); + + /** + * Create a Zinc Tag that can be used in place of any item + * for zinc functions that must be called using tagOrId + * + * @param tag the text of the tag + * @return a tag item + */ + ZincItem* createTag(String tag); + +/***************************************** + ITEMS MANIPULATION +*****************************************/ + /** + * Suppress an item + * + * @param item the item to suppress + */ + void itemRemove (ZincItem *item); + + /** + * Create a group item + * + * @param parentGroup group where we'll put the new group, if NULL we create + * in the defaults group + * @return the group item + */ + ZincItem *itemCreateGroup (ZincItem *parentGroup); + + /** + * Create a rectangle item + * + * @param parentGroup group where we'll put it + * @param x y width height the coordinates of the new rectangle + * @return the rectangle item + */ + ZincItem *itemCreateRectangle (ZincItem *parentGroup, double x, double y, + double width, double height); + + /** + * Create an arc item + * + * @param parentGroup group where we'll put it + * @param x y width height the coordinates of the new rectangle + * @return the arc item + */ + ZincItem *itemCreateArc (ZincItem *parentGroup, double x, double y, + double width, double height); + + /** + * Create a text item + * + * @param parentGroup group where we'll put it + * @return the text item + */ + ZincItem *itemCreateText (ZincItem *parentGroup); + + /** + * Create a curve item + * + * @param parentGroup group where we'll put it + * @param path the path to display + * @return the curve item + */ + ZincItem *itemCreateCurve (ZincItem *parentGroup, ZincPath *path); + + /** + * Create an icon item + * + * @param parentGroup group where we'll put it + * @param image a zincImage to display + * @return the icon item + */ + ZincItem *itemCreateIcon (ZincItem *parentGroup, ZincImage* image); + + +/************************************************** + BINDING +**************************************************/ + + /** + * Bind a function to an event on the zinc widget + * + * @param eventSpecification tcl style event specicication + * @param callBack the function which will be called back + * @param userData data we will give back to the callback when called + * @param add false to replace existing bind or true to add + */ + void bind (String eventSpecification, + ZincWidgetCallback callBack, void *userData, bool add = false); + + /** + * Annulate a binding + * + * @param eventSpecification tcl style event specicication + */ + void unbind (String eventSpecification); + + /** + * Bind a function to an event on an item + * + * @param item the item on which to bind + * @param eventSpecification tcl style event specicication + * @param callBack the function which will be called back + * @param userData data we will give back to the callback when called + * @param add false to replace existing bind or true to add + */ + void itemBind (ZincItem *item, String eventSpecification, + ZincItemCallback callBack, void *userData, bool add = false); + + /** + * Annulate a binding + * + * @param item the item on which to unbind + * @param eventSpecification tcl style event specicication + */ + void itemUnbind (ZincItem *item, String eventSpecification); + +/************************************************** + TRANSFORMATION METHODS +**************************************************/ + + /** + * Translate the item + * + * @param item the item to which we apply the transform + * @param dx dy translation vector + */ + void itemTranslate (ZincItem * item, double dx, double dy); + + /** + * Translate the item + * + * @param item the item to which we apply the transform + * @param x y translation vector + * @param absolute true if the translation is absolute + */ + void itemTranslate (ZincItem * item, double x, double y, bool absolute); + + /** + * Rotate an item + * + * @param item the item to which we apply the transform + * @param angle the angle to rotate in radian + */ + void itemRotate (ZincItem * item, double angle); + + /** + * Rotate an item + * + * @param item the item to which we apply the transform + * @param angle the angle to rotate in radian + * @param x y the center of the rotation + */ + void itemRotate (ZincItem * item, double angle, double x, double y); + + /** + * Rotate an item + * + * @param item the item to which we apply the transform + * @param angle the angle to rotate + * @param degree true for an angle in degree, false for an angle in radians + */ + void itemRotate (ZincItem * item, double angle, bool degree); + + /** + * Rotate an item + * + * @param item the item to which we apply the transform + * @param angle the angle to rotate in radian + * @param x y the center of the rotation + * @param degree true for an angle in degree, false for an angle in radians + */ + void itemRotate (ZincItem * item, double angle, double x, double y, + bool degree); + + /** + * Scale an item + * + * @param item the item to which we apply the transform + * @param ax horizontal scale + * @param ay vertical scale + */ + void itemScale (ZincItem * item, double ax, double ay); + + /** + * Scale an item using a specified center + * + * @param item the item to which we apply the transform + * @param ax horizontal scale + * @param ay vertical scale + * @param cx cy center of the scale + */ + void itemScale (ZincItem * item, double ax, double ay, double cx, double cy); + + + /** + * Skew an item + * + * @param item the item to which we apply the transform + * @param sx horizontal skew + * @param sy vertical skew + */ + void itemSkew (ZincItem * item, double sx, double sy); + + /** + * Skew an item horizontaly + * + * @param item the item to which we apply the transform + * @param sx horizontal skew + */ + void itemSkewX (ZincItem * item, double sx); + + /** + * Skew an item verticaly + * + * @param item the item to which we apply the transform + * @param sy vertical skew + */ + void itemSkewY (ZincItem * item, double sy); + + /** + * Reset all transformations associated with the item + * + * @param item the item to which we apply the transform + */ + void itemResetTransformation (ZincItem * item); + + /** + * Replace current transform by a matrix + * + * @param item the item to which we apply the transform + * @param a,b,c,d,e,f the new transform matrix + */ + void itemSetTransformation (ZincItem * item, + double a, double b, double c, + double d, double e, double f); + + /** + * Get current transform matrix + * + * @param item the item to which we apply the transform + * @param a,b,c,d,e,f places where we'll put the transform matrix + */ + void itemGetTransformation (ZincItem * item, + double *a, double *b, double *c, + double *d, double *e, double *f); + + /** + * Multiply current transform by a matrix + * + * @param item the item to which we apply the transform + * @param a,b,c,d,e,f the new transform matrix + */ + void itemMatrix (ZincItem * item, + double a, double b, double c, + double d, double e, double f); + +/******************************************************* + AUTOGENERATED METHODS (itemconfigure) +"code.hpp" in Tkzins/generic source from : + ./gen.pl Arc.c Attrs.c Color.c Curve.c Draw.c Group.c + Image.c List.c Item.c Icon.c Rectangle.c tkZinc.c Text.c +*******************************************************/ + + /** + * Call zinc->itemconfigure ( -closed ) + * @param item the item to configure + * @param value the closed to set + */ + void itemSetClosed (ZincItem * item, bool value); + + /** + * Call zinc->itemcget ( -closed ) + * @param item the item to get closed from + * @return closed value + */ + bool itemGetClosed (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -composealpha ) + * @param item the item to configure + * @param value the composealpha to set + */ + void itemSetComposealpha (ZincItem * item, bool value); + + /** + * Call zinc->itemcget ( -composealpha ) + * @param item the item to get composealpha from + * @return composealpha value + */ + bool itemGetComposealpha (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -composerotation ) + * @param item the item to configure + * @param value the composerotation to set + */ + void itemSetComposerotation (ZincItem * item, bool value); + + /** + * Call zinc->itemcget ( -composerotation ) + * @param item the item to get composerotation from + * @return composerotation value + */ + bool itemGetComposerotation (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -composescale ) + * @param item the item to configure + * @param value the composescale to set + */ + void itemSetComposescale (ZincItem * item, bool value); + + /** + * Call zinc->itemcget ( -composescale ) + * @param item the item to get composescale from + * @return composescale value + */ + bool itemGetComposescale (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -extent ) + * @param item the item to configure + * @param value the extent to set + */ + void itemSetExtent (ZincItem * item, unsigned int value); + + /** + * Call zinc->itemcget ( -extent ) + * @param item the item to get extent from + * @return extent value + */ + unsigned int itemGetExtent (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -fillcolor ) + * @param item the item to configure + * @param value the fillcolor to set + */ + void itemSetFillcolor (ZincItem * item, String value); + + /** + * Call zinc->itemcget ( -fillcolor ) + * @param item the item to get fillcolor from + * @return fillcolor value + */ + String itemGetFillcolor (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -filled ) + * @param item the item to configure + * @param value the filled to set + */ + void itemSetFilled (ZincItem * item, bool value); + + /** + * Call zinc->itemcget ( -filled ) + * @param item the item to get filled from + * @return filled value + */ + bool itemGetFilled (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -fillpattern ) + * @param item the item to configure + * @param value the fillpattern to set + */ + void itemSetFillpattern (ZincItem * item, ZincBitmap * value); + + /** + * Call zinc->itemcget ( -fillpattern ) + * @param item the item to get fillpattern from + * @return fillpattern value + */ + ZincBitmap * itemGetFillpattern (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -linecolor ) + * @param item the item to configure + * @param value the linecolor to set + */ + void itemSetLinecolor (ZincItem * item, String value); + + /** + * Call zinc->itemcget ( -linecolor ) + * @param item the item to get linecolor from + * @return linecolor value + */ + String itemGetLinecolor (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -linepattern ) + * @param item the item to configure + * @param value the linepattern to set + */ + void itemSetLinepattern (ZincItem * item, ZincBitmap * value); + + /** + * Call zinc->itemcget ( -linepattern ) + * @param item the item to get linepattern from + * @return linepattern value + */ + ZincBitmap * itemGetLinepattern (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -linestyle ) + * @param item the item to configure + * @param value the linestyle to set + */ + void itemSetLinestyle (ZincItem * item, lineStyle value); + + /** + * Call zinc->itemcget ( -linestyle ) + * @param item the item to get linestyle from + * @return linestyle value + */ + lineStyle itemGetLinestyle (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -linewidth ) + * @param item the item to configure + * @param value the linewidth to set + */ + void itemSetLinewidth (ZincItem * item, double value); + + /** + * Call zinc->itemcget ( -linewidth ) + * @param item the item to get linewidth from + * @return linewidth value + */ + double itemGetLinewidth (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -pieslice ) + * @param item the item to configure + * @param value the pieslice to set + */ + void itemSetPieslice (ZincItem * item, bool value); + + /** + * Call zinc->itemcget ( -pieslice ) + * @param item the item to get pieslice from + * @return pieslice value + */ + bool itemGetPieslice (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -priority ) + * @param item the item to configure + * @param value the priority to set + */ + void itemSetPriority (ZincItem * item, unsigned int value); + + /** + * Call zinc->itemcget ( -priority ) + * @param item the item to get priority from + * @return priority value + */ + unsigned int itemGetPriority (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -sensitive ) + * @param item the item to configure + * @param value the sensitive to set + */ + void itemSetSensitive (ZincItem * item, bool value); + + /** + * Call zinc->itemcget ( -sensitive ) + * @param item the item to get sensitive from + * @return sensitive value + */ + bool itemGetSensitive (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -startangle ) + * @param item the item to configure + * @param value the startangle to set + */ + void itemSetStartangle (ZincItem * item, unsigned int value); + + /** + * Call zinc->itemcget ( -startangle ) + * @param item the item to get startangle from + * @return startangle value + */ + unsigned int itemGetStartangle (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -tile ) + * @param item the item to configure + * @param value the tile to set + */ + void itemSetTile (ZincItem * item, ZincBitmap * value); + + /** + * Call zinc->itemcget ( -tile ) + * @param item the item to get tile from + * @return tile value + */ + ZincBitmap * itemGetTile (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -visible ) + * @param item the item to configure + * @param value the visible to set + */ + void itemSetVisible (ZincItem * item, bool value); + + /** + * Call zinc->itemcget ( -visible ) + * @param item the item to get visible from + * @return visible value + */ + bool itemGetVisible (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -capstyle ) + * @param item the item to configure + * @param value the capstyle to set + */ + void itemSetCapstyle (ZincItem * item, capStyle value); + + /** + * Call zinc->itemcget ( -capstyle ) + * @param item the item to get capstyle from + * @return capstyle value + */ + capStyle itemGetCapstyle (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -fillrule ) + * @param item the item to configure + * @param value the fillrule to set + */ + void itemSetFillrule (ZincItem * item, fillRule value); + + /** + * Call zinc->itemcget ( -fillrule ) + * @param item the item to get fillrule from + * @return fillrule value + */ + fillRule itemGetFillrule (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -joinstyle ) + * @param item the item to configure + * @param value the joinstyle to set + */ + void itemSetJoinstyle (ZincItem * item, joinStyle value); + + /** + * Call zinc->itemcget ( -joinstyle ) + * @param item the item to get joinstyle from + * @return joinstyle value + */ + joinStyle itemGetJoinstyle (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -relief ) + * @param item the item to configure + * @param value the relief to set + */ + void itemSetRelief (ZincItem * item, relief value); + + /** + * Call zinc->itemcget ( -relief ) + * @param item the item to get relief from + * @return relief value + */ + relief itemGetRelief (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -smoothrelief ) + * @param item the item to configure + * @param value the smoothrelief to set + */ + void itemSetSmoothrelief (ZincItem * item, bool value); + + /** + * Call zinc->itemcget ( -smoothrelief ) + * @param item the item to get smoothrelief from + * @return smoothrelief value + */ + bool itemGetSmoothrelief (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -alpha ) + * @param item the item to configure + * @param value the alpha to set + */ + void itemSetAlpha (ZincItem * item, unsigned int value); + + /** + * Call zinc->itemcget ( -alpha ) + * @param item the item to get alpha from + * @return alpha value + */ + unsigned int itemGetAlpha (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -atomic ) + * @param item the item to configure + * @param value the atomic to set + */ + void itemSetAtomic (ZincItem * item, bool value); + + /** + * Call zinc->itemcget ( -atomic ) + * @param item the item to get atomic from + * @return atomic value + */ + bool itemGetAtomic (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -clip ) + * @param item the item to configure + * @param value the clip to set + */ + void itemSetClip (ZincItem * item, ZincItem * value); + + /** + * Call zinc->itemcget ( -clip ) + * @param item the item to get clip from + * @return clip value + */ + ZincItem * itemGetClip (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -anchor ) + * @param item the item to configure + * @param value the anchor to set + */ + void itemSetAnchor (ZincItem * item, anchor value); + + /** + * Call zinc->itemcget ( -anchor ) + * @param item the item to get anchor from + * @return anchor value + */ + anchor itemGetAnchor (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -color ) + * @param item the item to configure + * @param value the color to set + */ + void itemSetColor (ZincItem * item, String value); + + /** + * Call zinc->itemcget ( -color ) + * @param item the item to get color from + * @return color value + */ + String itemGetColor (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -connecteditem ) + * @param item the item to configure + * @param value the connecteditem to set + */ + void itemSetConnecteditem (ZincItem * item, ZincItem * value); + + /** + * Call zinc->itemcget ( -connecteditem ) + * @param item the item to get connecteditem from + * @return connecteditem value + */ + ZincItem * itemGetConnecteditem (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -connectionanchor ) + * @param item the item to configure + * @param value the connectionanchor to set + */ + void itemSetConnectionanchor (ZincItem * item, anchor value); + + /** + * Call zinc->itemcget ( -connectionanchor ) + * @param item the item to get connectionanchor from + * @return connectionanchor value + */ + anchor itemGetConnectionanchor (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -image ) + * @param item the item to configure + * @param value the image to set + */ + void itemSetImage (ZincItem * item, ZincImage * value); + + /** + * Call zinc->itemcget ( -image ) + * @param item the item to get image from + * @return image value + */ + ZincImage * itemGetImage (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -mask ) + * @param item the item to configure + * @param value the mask to set + */ + void itemSetMask (ZincItem * item, ZincBitmap * value); + + /** + * Call zinc->itemcget ( -mask ) + * @param item the item to get mask from + * @return mask value + */ + ZincBitmap * itemGetMask (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -alignment ) + * @param item the item to configure + * @param value the alignment to set + */ + void itemSetAlignment (ZincItem * item, alignment value); + + /** + * Call zinc->itemcget ( -alignment ) + * @param item the item to get alignment from + * @return alignment value + */ + alignment itemGetAlignment (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -font ) + * @param item the item to configure + * @param value the font to set + */ + void itemSetFont (ZincItem * item, ZincFont * value); + + /** + * Call zinc->itemcget ( -font ) + * @param item the item to get font from + * @return font value + */ + ZincFont * itemGetFont (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -overstriked ) + * @param item the item to configure + * @param value the overstriked to set + */ + void itemSetOverstriked (ZincItem * item, bool value); + + /** + * Call zinc->itemcget ( -overstriked ) + * @param item the item to get overstriked from + * @return overstriked value + */ + bool itemGetOverstriked (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -spacing ) + * @param item the item to configure + * @param value the spacing to set + */ + void itemSetSpacing (ZincItem * item, short value); + + /** + * Call zinc->itemcget ( -spacing ) + * @param item the item to get spacing from + * @return spacing value + */ + short itemGetSpacing (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -text ) + * @param item the item to configure + * @param value the text to set + */ + void itemSetText (ZincItem * item, String value); + + /** + * Call zinc->itemcget ( -text ) + * @param item the item to get text from + * @return text value + */ + String itemGetText (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -underlined ) + * @param item the item to configure + * @param value the underlined to set + */ + void itemSetUnderlined (ZincItem * item, bool value); + + /** + * Call zinc->itemcget ( -underlined ) + * @param item the item to get underlined from + * @return underlined value + */ + bool itemGetUnderlined (ZincItem * item); + + /** + * Call zinc->itemconfigure ( -width ) + * @param item the item to configure + * @param value the width to set + */ + void itemSetWidth (ZincItem * item, unsigned short value); + + /** + * Call zinc->itemcget ( -width ) + * @param item the item to get width from + * @return width value + */ + unsigned short itemGetWidth (ZincItem * item); + + +/******************************************************* + END OF AUTOGENERATED METHODS +*******************************************************/ + + /** + * Call zinc->itemconfigure ( -firstend ) + * + * @param item the item to set firstend to + * @param a,b,c values used to set end + */ + void itemSetFirstend (ZincItem * item, double a, double b, double c); + + /** + * Call zinc->itemcget ( -firstend ) + * + * @param item the item to get firstend from + * @param a,b,c values used to sedwhere we'll put end + */ + void itemGetFirstend (ZincItem * item, double *a, double *b, double *c); + + /** + * Call zinc->itemconfigure ( -lastend ) + * + * @param item the item to set lastend to + * @param a,b,c values used to set end + */ + void itemSetLastend (ZincItem * item, double a, double b, double c); + + /** + * Call zinc->itemcget ( -lastend ) + * + * @param item the item to get lastend from + * @param a,b,c values used to sedwhere we'll put end + */ + void itemGetLastend (ZincItem * item, double *a, double *b, double *c); + + /** + * Call zinc->itemconfigure ( -position ) + * + * @param item the item to get width fromset position to + * @param x,y position + */ + void itemSetPosition (ZincItem * item, double x, double y); + + /** + * Call zinc->itemcget ( -position ) + * + * @param item the item to get position from + * @param x,y position + */ + void itemGetPosition (ZincItem * item, double *x, double *y); + + /** + * Create an image object from a file + * + * @param image the image reference (a file name) + */ + ZincImage* createImageFromFile (String image); + + /** + * Create an image object using base64 data + * + * @param image the image reference (a base64 String or binary data) + */ + ZincImage* createImageFromData (String image); + + /** + * Create a bitmap object from a file + * + * @param image the bitmap reference (a file name) + */ + ZincBitmap* createBitmapFromFile (String image); + + /** + * Create a bitmap object base64 data + * + * @param image the bitmap reference (a base64 String or binary data) + */ + ZincBitmap* createBitmapFromData (String image); + + /** + * Create a bitmap object using a predefined name + * + * @param image the bitmap reference (a name) + */ + ZincBitmap* createBitmapFromName (String image); + + /** + * Create an image object + * + * @param width Width of image + * @param height Height of image + * @param aggBuffer An AGG buffer + */ + ZincImage* createImageFromAGGBuffer (int width, int height, unsigned char *aggBuffer); + + + /** + * Create a font object + * + * @param family the font mamily + * @param size if a positive number, it is in points, if a negative number, + * its absolute value is a size in pixels. + * @param bold 1 for a bold font, 0 for a normal font, -1 for unspecified + * @param italic 1 an italic font, 0 for a roman font, -1 for unspecified + * @param underline 1 for an underlined, 0 for a normal font, -1 for + * unspecified + * @param overstrike 1 for an overstriked font, 0 for a normal font, -1 for unspecified + */ + ZincFont* createFont (String family, int size, int bold = -1, + int italic = -1, int underline = -1, + int overstrike = -1); + + /** + * Get font ascent + * + * @param font the font + * @return the font ascent + */ + int getFontAscent (ZincFont* font); + + /** + * Get Image width + * + * @param ZincImage the image to get width from + * @return the width of the image + */ + int getImageWidth (ZincImage *image); + + /** + * Get Image height + * + * @param ZincImage the image to get height from + * @return the height of the image + */ + int getImageHeight (ZincImage *image); + +/******************************************************* + STATIC PROCEDURES +*******************************************************/ + + /** + * Loads the zinc library and initialize tcl and tk + * + * @param argv0 the name of the execytable as passed in argv[0] + */ + static void loadZinc (char *argv0) throw (ZincException); + + /** + * Run tk mainloop and returns when there is no more Tk window + */ + static void zincMainLoop (); + +/******************************************************* + errors management +*******************************************************/ + /** + * This is inline because it is called frequently and needs to be optimized + * Use this when you need to call a function that can return a TCL error code. + * + * @param fct the full function call + * @param msg the error message to throw in case of error + */ + static void z_tcl_call (int result, char* p_msg) throw (ZincException); + + /** + * This is a inline because it is called frequently and needs to be optimized + * Use this to call the zinObjectCommand fuction. The call is made using the + * pre allocated table p1, it must contain Tcl_Obj thar are parameters to + * the zinObjectCommand function. A parameter indicate how many parameters + * are passed to the zinObjectCommand function. + * + * @param count the number of parameters in p1 + * @param msg the error message to throw in case of error + */ + void z_command (int count, char* p_msg) throw (ZincException); + +}; + +#endif diff --git a/zinclib.d/src/ZincExtern.hpp b/zinclib.d/src/ZincExtern.hpp new file mode 100644 index 0000000..193a684 --- /dev/null +++ b/zinclib.d/src/ZincExtern.hpp @@ -0,0 +1,74 @@ +/** ZincExtern.hpp + * zinclib + * + * This software is the property of IntuiLab SA, France. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Here we create TkZinc library headers since they don't exist + * + * 08/03/05 + * + * Contributors: + * Benoit Peccatte <peccatte@intuilab.com> + * + */ +#include <tcl.h> + +#ifndef ZINC_EXTERN +#define ZINC_EXTERN + + +// those are function have been created within a C compiler +extern "C" +{ + + //The TkZinc function that initialises tkzinc + int Tkzinc_Init(Tcl_Interp *interp); + + //The TkZinc function that creates a zinc object + int ZincObjCmd(ClientData client_data, // Main window associated with interpreter. + Tcl_Interp *interp, // Current interpreter. + int argc, // Number of arguments. + Tcl_Obj *CONST args[]); // Argument objects. + + //The TkZinc function that is called by tcl when calling ".zinc fct ..." +#ifdef _WIN32 + typedef int (__cdecl *WidgetObjCmd) + (ClientData client_data, // Information about the widget. + Tcl_Interp *interp, // Current interpreter. + int argc, // Number of arguments. + Tcl_Obj *CONST args[]); // Argument objects. +#else + typedef int (*WidgetObjCmd) + (ClientData client_data, // Information about the widget. + Tcl_Interp *interp, // Current interpreter. + int argc, // Number of arguments. + Tcl_Obj *CONST args[]) // Argument objects. + __attribute__((cdecl)); +#endif +} + +#endif + diff --git a/zinclib.d/src/ZincInternal.hpp b/zinclib.d/src/ZincInternal.hpp new file mode 100644 index 0000000..63feaf2 --- /dev/null +++ b/zinclib.d/src/ZincInternal.hpp @@ -0,0 +1,182 @@ +/** ZincInternal.hpp + * zinclib + * + * This software is the property of IntuiLab SA, France. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Here we defines macros and constants that are only used within Zinclib code + * + * 08/03/05 + * + * Contributors: + * Benoit Peccatte <peccatte@intuilab.com> + * David Thevenin <thevenin@intuilab.com> + * + */ + +#include <string> +#include <stdio.h> +#ifdef _WIN32 +#define snprintf _snprintf +#endif + +#include "ZincObjects.hpp" +#ifndef BAZAR +#define BAZAR + +#define MAX_NUM_LENGTH 32 + +// The base name of the TCL function that serve for callbacks +#define Z_TCLCB "zincTclCb" + +/** + * These are macro for shortness and readability of code. + * They take one Tcl_Obj from the pool and put one value into it. This object + * is returned. They all have the same signature. + * + * @param no the id of the Tcl_Obj to take within the pool (max is + * ZINC_POOL_COUNT-1) + * @param value the value to put in the extracted object + * @return the object from the pool + */ +// make a boolean object +#define Z_BOO_POOL(no, value) ( Tcl_SetBooleanObj (pool[no], value), pool[no] ) +// make an integer object +#define Z_INT_POOL(no, value) ( Tcl_SetIntObj (pool[no], value), pool[no] ) +// make a double object +#define Z_DBL_POOL(no, value) ( Tcl_SetDoubleObj (pool[no], value), pool[no] ) +// make a string object +#define Z_STR_POOL(no, value, length) ( Tcl_SetStringObj (pool[no], \ + value, length), \ + pool[no] ) + +/** + * Make a list object + * + * @param no the id of the Tcl_Obj to take within the pool + * @param value a table of pointer to Tcl_Obj to put in the list + * @param size the number objects in the table + * @return the list object from the pool + */ +#define Z_LST_POOL(no, value, size) ( Tcl_SetListObj (pool[no], size, value),\ + pool[no] ) + +/** + * Clear a list object. Tcl_Obj used in a list object have a refcount + * incremented and as such can't be reused for anything else. To free those + * object you need to clean the list object after use. + * + * @param no the id of a Tcl_Obj within the pool which contains a list to + * clear + */ +#define Z_CLEANLIST(no) Tcl_SetIntObj (pool[no], 0) + + +/** + * Create a constant Tcl_Obj that can be reused as a parameter later + * + * @parameter string define the name and the value ov the object + */ +//create an option object (value prefixed by '-') +#define Z_DEFINE_ZOPT(string) Tcl_Obj* ZOPT_##string = Tcl_NewStringObj ("-" #string, -1); +//create a function object +#define Z_DEFINE_ZFCT(string) Tcl_Obj* ZFCT_##string = Tcl_NewStringObj (#string, -1); +//create an item object +#define Z_DEFINE_ZITM(string) Tcl_Obj* ZITM_##string = Tcl_NewStringObj (#string, -1); + +/** + * Macro to return a parentGroup Tcl_Obj. If a NULL is group given, it returns + * the default one. + * + * @param parentGroup the parent group to take + */ +#define Z_PARENTGROUP(parentGroup) \ + ( (parentGroup != NULL) ? parentGroup->object : DEFAULT_GROUP_OBJ ); + +/** + * Convert an integer to a string + * + * @param integer the integer to convert + */ +inline std::string itos (int integer) +{ + char tmp[MAX_NUM_LENGTH]; + // use standard function to convert + if (snprintf (tmp, MAX_NUM_LENGTH, "%d", integer) < 0) + { + throw ZincException ("Error converting integer", __FILE__, __LINE__ ); + } + return std::string (tmp); +} + +/** + * Convert a long to a string + * + * @param l the long to convert + */ +inline std::string ltos (long l) +{ + char tmp[MAX_NUM_LENGTH]; + // use standard function to convert + if (snprintf (tmp, MAX_NUM_LENGTH, "%ld", l) < 0) + { + throw ZincException ("Error converting long", __FILE__, __LINE__ ); + } + return std::string (tmp); +} + +/** + * Convert a double to a string + * + * @param double the integer to convert + */ +inline std::string dtos (double d) +{ + char tmp[MAX_NUM_LENGTH]; + // use standard function to convert + if (snprintf (tmp, MAX_NUM_LENGTH, "%f", d) < 0) + { + throw ZincException ("Error converting double", __FILE__, __LINE__ ); + } + return std::string (tmp); +} + +/** + * How To call Zinc or Tcl functions: + * + * All arguments of the function are Tcl_Obj. To accelerate their call, there + * is a pool of preconstructed Tcl_Obj and some often used constant Tcl_Obj. + * p1 and p2 are tables of pointers to be used for arguments. + * Fill p1 using either predefined objects like ZITM_* or a pool objet that + * you can fill with the value you want. + * Ex : p1[1] = ZFCT_add; + * Macros have been defined to fill and use a pool object + * Ex : p1[2] = Z_INT_POOL(1, 200); + * Do not use twice the same pool index for the same function call. + * p2 is used to construct and argument which is a list of Tcl_Obj. + * To call the function use Z_TCL_CALL which automaticly handle error return + * codes or Z_COMMAND to call a Zinc command which handle all arguments too. + */ +#endif diff --git a/zinclib.d/src/ZincObjects.cpp b/zinclib.d/src/ZincObjects.cpp new file mode 100644 index 0000000..3a0ad2d --- /dev/null +++ b/zinclib.d/src/ZincObjects.cpp @@ -0,0 +1,201 @@ +/** ZincObjects.cpp + * zinclib + * + * This software is the property of IntuiLab SA, France. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Here we defines classes that are items in zinc + * + * 08/03/05 + * + * Contributors: + * Benoit Peccatte <peccatte@intuilab.com> + * David Thevenin <thevenin@intuilab.com> + * + */ +#include "ZincInternal.hpp" +#include "ZincObjects.hpp" +#include "Zinc.hpp" + + +/** + * The protected default constructor + */ +ZincItem::ZincItem () +{ } + +/** + * The public constructor + * + * @param obj the object we want to store + */ +ZincItem::ZincItem (Tcl_Obj *obj) + : object(obj) +{ + // manage refcount so that the tcl_obj can't be freed + Tcl_IncrRefCount (object); +} + +/** + * The public destructor + */ +ZincItem::~ZincItem () +{ + // dercrement refcount to free tcl_obj + Tcl_DecrRefCount (object); +} + +/** + * The public constructor + * + * @param obj the object we want to store + */ +ZincImage::ZincImage (Tcl_Obj *obj) + : ZincItem (obj), madeFromInternal (false) +{ } + +/** + * The public constructor + * + * @param obj the object we want to store + */ +ZincImage::ZincImage (Tcl_Obj *obj, bool internal) + : ZincItem (obj), madeFromInternal (internal) +{ } + +/** + * The public destructor + */ +ZincImage::~ZincImage () +{ + // do not delete returned values + if (madeFromInternal) + return; + + // delete using string commands + const char* para[5]; + para[0] = "image"; + para[1] = "delete"; + para[2] = Tcl_GetString(object); + + // call the function with 3 arguments + int res = (*Zinc::imgCmdInfo.proc)(Zinc::imgCmdInfo.clientData, + Zinc::interp, 3, para); + Zinc::z_tcl_call (res, "delete ZincImage Failed : "); +} + +/** + * The public constructor (redefine the inherited one) + * + * @param obj the object we want to store + */ +ZincBitmap::ZincBitmap (Tcl_Obj *obj) + : ZincItem (obj), madeFromInternal (false) +{ } + +/** + * The public constructor (redefine the inherited one) + * + * @param obj the object we want to store + */ +ZincBitmap::ZincBitmap (Tcl_Obj *obj, bool internal) + : ZincItem (obj), madeFromInternal (internal) +{ } + +/** + * The public constructor (redefine the inherited one) + * + * @param name the name of a predefined bitmap + */ +ZincBitmap::ZincBitmap (String name) + : madeFromInternal (true) +{ + object = Tcl_NewStringObj (name.c_str(), name.length ()); + Tcl_IncrRefCount (object); +} + +/** + * The public destructor + */ +ZincBitmap::~ZincBitmap () +{ + // do not delete Zinc default bitmaps or returned values + if (madeFromInternal) + return; + + // delete using string commands + const char* para[5]; + para[0] = "image"; + para[1] = "delete"; + para[2] = Tcl_GetString(object); + + // call the function with 3 arguments + int res = (*Zinc::imgCmdInfo.proc)(Zinc::imgCmdInfo.clientData, + Zinc::interp, 3, para); + Zinc::z_tcl_call (res, "delete ZincBitmap Failed : "); +} + +/** + * The public constructor + */ +ZincFont::ZincFont (const char *font) + : name (String (font)) +{ } + +/** + * A public constructor with a String parameter + * + * @param msg the error message + */ +ZincException::ZincException (String p_msg, char *p_file, int p_lineNo) + : msg (p_msg), file(p_file), line(p_lineNo) +{ } + +/** + * Copy constructor + * + * @param exception the original exception + */ +ZincException::ZincException (const ZincException &e) + : msg (e.msg), file(e.file), line(e.line) +{ } + +/** + * Public destructor + */ +ZincException::~ZincException () throw() +{ } + +/** + * Retreive the exception message + * + * @return the message + */ +const char* ZincException::what () const throw () +{ + String result = "Zinc Exception : "; + result += msg + " file " + file + ", line " + itos (line); + return result.c_str (); +} diff --git a/zinclib.d/src/ZincObjects.hpp b/zinclib.d/src/ZincObjects.hpp new file mode 100644 index 0000000..dc46567 --- /dev/null +++ b/zinclib.d/src/ZincObjects.hpp @@ -0,0 +1,198 @@ +/** ZincObjects.hpp + * zinclib + * + * This software is the property of IntuiLab SA, France. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Here we defines classes that are items in zinc + * + * 08/03/05 + * + * Contributors: + * Benoit Peccatte <peccatte@intuilab.com> + * David Thevenin <thevenin@intuilab.com> + * + */ +#include "ZincTypes.hpp" + +#include <exception> +#include <string> +#include <tcl.h> + +#ifndef ZINC_OBJECTS +#define ZINC_OBJECTS + +// Object representing a zinc item +class ZincItem +{ +protected: + /** + * The protected default constructor + */ + ZincItem (); + +public: + Tcl_Obj *object; //the object we are storing + + /** + * The public constructor + * + * @param obj the object we want to store + */ + ZincItem (Tcl_Obj *obj); + + /** + * The public destructor + */ + virtual ~ZincItem (); +}; + +// Object representing a zinc image +class ZincImage : public ZincItem +{ + /** + * The private constructor + */ + ZincImage (); + + bool madeFromInternal; + +public: + /** + * The public constructor (redefine the inherited one) + * + * @param obj the object we want to store + */ + ZincImage (Tcl_Obj *obj); + + /** + * The public constructor (redefine the inherited one) + * + * @param obj the object we want to store + */ + ZincImage (Tcl_Obj *obj, bool internal); + + /** + * The public destructor + */ + virtual ~ZincImage (); +}; + +// Object representing a zinc bitmap +class ZincBitmap : public ZincItem +{ + /** + * The private constructor + */ + ZincBitmap (); + + bool madeFromInternal; + +public: + /** + * The public constructor (redefine the inherited one) + * + * @param obj the object we want to store + */ + ZincBitmap (Tcl_Obj *obj); + + /** + * The public constructor (redefine the inherited one) + * + * @param obj the object we want to store + */ + ZincBitmap (Tcl_Obj *obj, bool internal); + + /** + * The public constructor (redefine the inherited one) + * + * @param name the name of a predefined bitmap + */ + ZincBitmap (String name); + + /** + * The public destructor + */ + virtual ~ZincBitmap (); +}; + +// Object representing a zinc font +class ZincFont +{ + /** + * The public default constructor + */ + ZincFont (); + +public: + String name; + + /** + * The public constructor + */ + ZincFont (const char *font); + +}; + +/** + * Exceptions that are throwed by zinclib + */ +class ZincException : public std::exception +{ + +private: + String msg; // the exception message + String file; // file where exception have been caught + int line; // line where exception have been caught + +public: + /** + * A public constructor with a String parameter + * + * @param msg the error message + */ + ZincException (String msg, char *file, int lineNo); + + /** + * Copy constructor + * + * @param exception the original exception + */ + ZincException (const ZincException &exception); + + /** + * Public destructor + */ + virtual ~ZincException () throw(); + + /** + * Retreive the exception message + * + * @return the message + */ + const char* what () const throw (); +}; + +#endif diff --git a/zinclib.d/src/ZincPath.cpp b/zinclib.d/src/ZincPath.cpp new file mode 100644 index 0000000..a120014 --- /dev/null +++ b/zinclib.d/src/ZincPath.cpp @@ -0,0 +1,415 @@ +/** Path.cpp + * zinclib + * + * This software is the property of IntuiLab SA, France. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Here we defines The ZincPath object + * + * 08/03/05 + * + * Contributors: + * Benoit Peccatte <peccatte@intuilab.com> + * + */ +#include "Zinc.hpp" +#include "ZincInternal.hpp" + +#include <math.h> + +// convert degree to radians +const double convertRatio = atan2 (1., 1.) * 4. / 180.; + +/** + * Calculate d % m for doubles + * this is because the C % works only for integers + */ +inline double modulo (double d, double m) +{ + return d - (floor (d / m) * m); +// return d; +} + +/** + * Append the point to the real path + * + * @param x,y the point coordinate + * @param c true if the point is a control point + */ +inline void ZincPath::addPoint (double x, double y, bool c) +{ + // update last control point + lastX = x; + lastY = y; + + // we can't use a flat list since zinc accepts flat list only for simple + // lines + Tcl_Obj* point[3]; + int i = 2; + //create a point object + //an object for x + point[0] = Tcl_NewDoubleObj (x); + // an object for y + point[1] = Tcl_NewDoubleObj (y); + // an object for 'c' only if needed + if (c) + { + point[2] = Tcl_NewStringObj ("c", -1); + i = 3; + } + + // the point (this increments refcount) + Tcl_Obj* tmp = Tcl_NewListObj (i, point); + // append the point to the list + Zinc::z_tcl_call ( Tcl_ListObjAppendElement (Zinc::interp, path, tmp), + "addpoint Error:"); +} + +/** + * Convert ellipse from SVG form to centered form (used only by arcTo) + * + * @param x0,y0 origin of the arc + * @param rx x-radius of ellipse in degree (can be modified) + * @param ry y-radius of ellipse in degree (can be modified) + * @param phi rotation of ellipse in degree (can be modified) + * @param largeArc true if the large part of the ellipse + * @param sweep true for a positive angle direction for the drawing + * @param x,y destination point + * @param cx,cy center coordinate + * @param theta begining of arc in degree + * @param delta extent of arc in degree + */ +void ZincPath::convertFromSvg (double x0, double y0, double &rx, double &ry, + double &phi, bool largeArc, bool sweep, + double x, double y, double &cx, double &cy, + double &theta, double &delta) +{ + /* all this strictly follow the script given in "SVG essentials" + * p85 : convert an elliptical arc fo SVG to an elliptical arc + * based around a central point + */ + + // temporary variables + double dx2, dy2, phiR, x1, y1; + double rxSq, rySq, x1Sq, y1Sq; + double sign, sq, coef, radiusCheck; + double cx1, cy1, sx2, sy2; + double p, n, ux, uy, vx, vy; + + // compute 1/2 distance between current and final point + dx2 = (x0 - x) / 2.; + dy2 = (y0 - y) / 2.; + + //convert from degree to radians + phi = modulo (phi, 360.); + phiR = phi * convertRatio; + + //compute (x1, y1) + x1 = cos (phiR) * dx2 + sin (phiR) * dy2; + y1 = -sin (phiR) * dx2 + cos (phiR) * dy2; + + // make sure radii are large enough + rx = fabs (rx); ry = fabs (ry); + rxSq = rx * rx; + rySq = ry * ry; + x1Sq = x1 * x1; + y1Sq = y1 * y1; + + radiusCheck = (x1Sq / rxSq) + (y1Sq / rySq); + if (radiusCheck > 1.) + { + rx *= sqrt (radiusCheck); + ry *= sqrt (radiusCheck); + rxSq = rx * rx; + rySq = ry * ry; + } + + //step 2 compute (cx1, cy1) + sign = (largeArc == sweep) ? -1. : 1.; + sq = ((rxSq * rySq) - (rxSq * y1Sq) - (rySq * x1Sq)) / + ((rxSq * y1Sq) + (rySq * x1Sq)); + sq = (sq < 0.) ? 0. : sq; + coef = (sign * sqrt (sq)); + cx1 = coef * ((rx * y1) / ry); + cy1 = coef * -((ry * x1) / rx); + + //step 3 : compute (cx, cy) from (cx1, cy1) + sx2 = (x0 + x) / 2; + sy2 = (y0 + y) / 2; + + cx = sx2 + (cos (phiR) * cx1 - sin (phiR) * cy1); + cy = sy2 + (sin (phiR) * cx1 + cos (phiR) * cy1); + + //step 4 : compute angle start angle extent + ux = (x1 - cx1) / rx; + uy = (y1 - cy1) / ry; + vx = (-x1 - cx1) / rx; + vy = (-y1 - cy1) / ry; + n = sqrt ((ux *ux) + (uy * uy)); + p = ux; // 1 * ux + 0 * uy + sign = (uy < 0.) ? -1. : 1.; + + theta = sign * acos (p /n); + theta = theta / convertRatio; + + n = sqrt ((ux * ux + uy * uy) * (vx * vx + vy * vy)); + p = ux * vx + uy * vy; + sign = ((ux * vy - uy * vx) < 0.) ? -1. : 1.; + delta = sign * acos (p / n); + delta = delta / convertRatio;; + + if (!sweep && delta > 0.) + { + delta -= 360.; + } + else if (sweep && delta < 0.) + { + delta += 360.; + } + +// delta = modulo (delta, 360.); +// theta = modulo (theta, 360.); +} + + +/** + * The public constructor + * + * @param x,y the initial point + */ +ZincPath::ZincPath (double x, double y) + : firstX (x), firstY (y) +{ + // create a default path + path = Tcl_NewListObj (0, NULL); + // the path must not be deleted by tcl + Tcl_IncrRefCount (path); + // add the first point + addPoint (x, y, false); +} + +/** + * The public destructor + * + * @warning Do not destroy a ZincPath if Zinc is not loaded + */ +ZincPath::~ZincPath () +{ + //decrement reference count on all objs in list -> free + Tcl_SetIntObj (path, 1); + //decrement reference count on the list -> free + Tcl_DecrRefCount (path); +} + +/** + * Close current path + */ +void ZincPath::close () +{ + addPoint (firstX, firstY, false); +} + +/** + * Draw a line from current point to next point + * + * @param x,y next point + */ +void ZincPath::lineTo (double x, double y) +{ + addPoint (x, y, false); +} + +/** + * Draw a cubic bezier using specified control and destination points + * call cubicBezierTo + * + * @param cx1,cy1 first control point + * @param cx2,cy2 second control point + * @param x,y destination point + */ +void ZincPath::curveTo (double cx1, double cy1, double cx2, double cy2, + double x, double y) +{ + cubicBezierTo (cx1, cy1, cx2, cy2, x, y); +} + +/** + * Draw a cubic bezier using specified control and destination points + * + * @param cx1,cy1 first control point + * @param cx2,cy2 second control point + * @param x,y destination point + */ +void ZincPath::cubicBezierTo (double cx1, double cy1, + double cx2, double cy2, + double x, double y) +{ + addPoint (cx1, cy1, true); + addPoint (cx2, cy2, true); + addPoint (x, y, false); +} + +/** + * Draw a quadratic bezier using specified control and destination point + * + * @param cx1,cy1 first control point + * @param cx2,cy2 second control point + * @param x,y destination point + */ +void ZincPath::quadraticBezierTo (double cx, double cy, double x, double y) +{ + // convert from a quadratic bezier to a cubic bezier + // since that's what is supported by zinc + /* [[x1, y1], [qx, qy, 'q'], [x2,y2]] + cx1 = x1 + (qx - x1) * 2/3 + cy1 = y1 + (qy - y1) * 2/3 + cx2 = qx + (x2 - qx)/3 + cy2 = qy + (y2 - qy)/3 + */ + double cx1 = lastX + (cx - lastX) * 2/3; + double cy1 = lastY + (cy - lastY) * 2/3; + double cx2 = cx + (x - cx) / 3; + double cy2 = cy + (y - cy) / 3; + addPoint (cx1, cy1, true); + addPoint (cx2, cy2, true); + addPoint (x, y, false); +} + +/** + * Draw an arc from current point to x,y + * + * @param rx x-radius of ellipse + * @param ry y-radius of ellipse + * @param xAxisRotation rotation of ellipse + * @param largeArc true if the large part of the ellipse + * @param sweepFlag true for a positive angle direction for the drawing + * @param x,y destination point + */ +void ZincPath::arcTo (double rx, double ry, double xAxisRotation, bool largeArc, + bool sweepFlag, double x, double y) +{ + double sx, sy, start, arc; + // convert to a centered representation + convertFromSvg (lastX, lastY, rx, ry, xAxisRotation, largeArc, sweepFlag, + x, y, sx, sy, start, arc); + + // this is all taken from first case study for Intuikit + + /* convert to a curve representation + * For a good approximation, we need 8 quadratic Bezier + * to make a circle : the maximal angle is 45° + */ + // local variables + int segs; + double segAngle, angle, angleMid; + double cosphi, sinphi, tx, ty; + double previousX, previousY; + double bx, by, qx, qy; + double cx1, cy1, cx2, cy2; + + //1) calculate segment counts + segs = int (ceil (fabs (arc) / 45.)); + + //let's create segments of the same angle + //2) calculate this angle + segAngle = arc / double(segs) * convertRatio; + + xAxisRotation = xAxisRotation * convertRatio; + start = start * convertRatio; + + //3) Our fake starting point (relative to (x,y)) + // true start point is (x,y) + sx = lastX - cos (start) * rx; + sy = lastY - sin (start) * ry; + + /* 4) calculate values that will be used for a rotation + * of centre (x,y) and angle phi + * the matrix is : + * cos(phi) -sin(phi) tx + * sin(phi) cos(phi) ty + * 0 0 1 + */ + cosphi = cos (xAxisRotation); + sinphi = sin (xAxisRotation); + tx = (1. - cosphi) * lastX + sinphi * lastY; + ty = (1. - cosphi) * lastY - sinphi * lastX; + + //5) save crrent values + previousX = lastX; + previousY = lastY; + angle = start; + + //6) we already got the first point + + //7) calculate segments + for (int i(0) ; i < segs ; i++) + { + //7.1) increment angle + angle += segAngle; + + //7.2) calculate intermediate angle value + angleMid = angle - segAngle / 2.; + + //7.3) calculate last point of the segment from center and rays + bx = sx + cos (angle) * rx; + by = sy + sin (angle) * ry; + + //7.4) calculate control point for the quadratic bezier curve + qx = sx + cos (angleMid) * (rx / cos (segAngle / 2.)); + qy = sy + sin (angleMid) * (ry / cos (segAngle / 2.)); + + //7.5) calculate control points for the equivalent bezier curve + cx1 = previousX + (qx - previousX) * 2. / 3.; + cy1 = previousY + (qy - previousY) * 2. / 3.; + cx2 = qx + (bx - qx) / 3.; + cy2 = qy + (by - qy) / 3.; + + //7.6) add points + addPoint (cosphi * cx1 - sinphi * cy1 + tx, + sinphi * cx1 + cosphi * cy1 + ty, true); + addPoint (cosphi * cx2 - sinphi * cy2 + tx, + sinphi * cx2 + cosphi * cy2 + ty, true); + addPoint (cosphi * bx - sinphi * by + tx, + sinphi * bx + cosphi * by + ty, false); + + //7.7) Save last point + previousX = bx; + previousY = by; + } + +} + +/** + * Return a table of Tcl_Obj* containing a liste of coords points + * It's up to the caller to delete the resulting table + * + * @return a Tcl_Obj* of type list + */ +Tcl_Obj* ZincPath::getTable () +{ + return path; +} + + diff --git a/zinclib.d/src/ZincPath.hpp b/zinclib.d/src/ZincPath.hpp new file mode 100644 index 0000000..4b6fa21 --- /dev/null +++ b/zinclib.d/src/ZincPath.hpp @@ -0,0 +1,162 @@ +/** Path.hpp + * zinclib + * + * This software is the property of IntuiLab SA, France. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Here we defines The ZincPath object + * + * 08/03/05 + * + * Contributors: + * Benoit Peccatte <peccatte@intuilab.com> + * + */ +#include "ZincTypes.hpp" + +#include <list> +#include <tcl.h> + +#ifndef ZINC_PATH +#define ZINC_PATH + +class ZincPath +{ + double firstX, firstY; //first point's coordinate + double lastX, lastY; //last point's coordinate + Tcl_Obj* path; //list of points + + /** + * Append the point to the real path + * + * @param x,y the point coordinate + * @param c true if the point is a control point + */ + inline void addPoint (double x, double y, bool c); + + /** + * Convert ellipse from SVG form to centered form (used only by arcTo) + * + * @param x0,y0 origin of the arc + * @param rx x-radius of ellipse in degree (can be modified) + * @param ry y-radius of ellipse in degree (can be modified) + * @param phi rotation of ellipse in degree (can be modified) + * @param largeArc true if the large part of the ellipse + * @param sweep true for a positive angle direction for the drawing + * @param x,y destination point + * @param cx,cy center coordinate + * @param theta begining of arc in degree + * @param delta extent of arc in degree + */ + void convertFromSvg (double x0, double y0, double &rx, double &ry, double &phi, + bool larcgeArc, bool sweep, double x, double y, + double &cx, double &cy, double &theta, double &delta); + + +public: + /** + * The public constructor + * + * @param x,y the initial point + */ + ZincPath (double x, double y); + + /** + * The public destructor + * + * @warning Do not destroy a ZincPath if Zinc is not loaded + */ + ~ZincPath (); + + /****************************************** + ZincPath manipulation + ******************************************/ + /** + * Close current path + */ + void close (); + + /** + * Draw a line from current point to next point + * + * @param x,y next point + */ + void lineTo (double x, double y); + + /** + * Draw a cubic bezier using specified control and destination points + * call cubicBezierTo + * + * @param cx1,cy1 first control point + * @param cx2,cy2 second control point + * @param x,y destination point + */ + void curveTo (double cx1, double cy1, double cx2, double cy2, + double x, double y); + + /** + * Draw a cubic bezier using specified control and destination points + * + * @param cx1,cy1 first control point + * @param cx2,cy2 second control point + * @param x,y destination point + */ + void cubicBezierTo (double cx1, double cy1, double cx2, double cy2, + double x, double y); + + /** + * Draw a quadratic bezier using specified control and destination point + * + * @param cx1,cy1 first control point + * @param cx2,cy2 second control point + * @param x,y destination point + */ + void quadraticBezierTo (double cx, double cy, double x, double y); + + /** + * Draw an arc from current point to x,y + * + * @param rx x-radius of ellipse + * @param ry y-radius of ellipse + * @param xAxisRotation rotation of ellipse + * @param largeArc true if the large part of the ellipse + * @param sweepFlag true for a positive angle direction for the drawing + * @param x,y destination point + */ + void arcTo (double rx, double ry, double xAxisRotation, bool largeArc, + bool sweepFlag, double x, double y); + + /** + * Return a Tcl_Obj* containing a list of coords points + * It's up to the caller to delete the resulting table + * + * @return a Tcl_Obj* of type list + */ + Tcl_Obj* getTable (); + +}; + +#endif + diff --git a/zinclib.d/src/ZincTypes.hpp b/zinclib.d/src/ZincTypes.hpp new file mode 100644 index 0000000..236ef1f --- /dev/null +++ b/zinclib.d/src/ZincTypes.hpp @@ -0,0 +1,188 @@ +/** ZincTypes.hpp + * zinclib + * + * This software is the property of IntuiLab SA, France. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Here we defines types and constants that may be usefull for a zinclib user + * + * 08/03/05 + * + * Contributors: + * Benoit Peccatte <peccatte@intuilab.com> + * + */ +#include <string> + +#ifndef ZINC_TYPES +#define ZINC_TYPES + +typedef std::string String; + +/********************************** + Predeclaration of Zinc types +**********************************/ +class Zinc; +class ZincPath; +class ZincItem; +class ZincImage; +class ZincFont; +struct ZincEvent; + +/******************************************************* + Signature to use when binding with a callback +*******************************************************/ +typedef void (*ZincItemCallback) + (Zinc *zinc, // Information about the widget. + ZincItem *item, // the item being evented + ZincEvent *event, // event information + void *userData); // user data provided with bind + +typedef void (*ZincWidgetCallback) + (Zinc *zinc, // Information about the widget. + ZincEvent *event, // event information + void *userData); // user data provided with bind + + +/*********************************** + Library constants +***********************************/ + +// Rendering model +const int ZINC_BACKEND_X11 = 0; +const int ZINC_BACKEND_OPENGL = 1; + + +/*********************************** + Library enums +***********************************/ + +//Styles for line items +typedef enum +{ + lineStyle_simple = 0, + lineStyle_dashed, + lineStyle_mixed, + lineStyle_dotted +} lineStyle; + +//Styles for line cap +typedef enum +{ + capStyle_butt = 0, + capStyle_projecting, + capStyle_round +} capStyle; + +//List of fill rules +typedef enum +{ + fillRule_odd = 0 , + fillRule_nonzero, + fillRule_positive, + fillRule_negative, + fillRule_abs_geq_2 +} fillRule; + +//list of join style +typedef enum +{ + joinStyle_bevel = 0, + joinStyle_miter, + joinStyle_round +} joinStyle; + +//list of reliefs +typedef enum +{ + relief_flat = 0, + relief_raised, + relief_sunken, + relief_ridge, + relief_groove, + relief_roundraised, + relief_roundsunken, + relief_roundridge, + relief_roundgroove, + relief_raisedrule, + relief_sunkenrule +} relief; + +//List of alignments +typedef enum +{ + alignment_left = 0, + alignment_right, + alignment_center +} alignment; + +//list of anchors +typedef enum +{ + anchor_nw = 0, + anchor_n, + anchor_ne, + anchor_e, + anchor_se, + anchor_s, + anchor_sw, + anchor_w, + anchor_center +} anchor; + +//actions to take when calling contour +typedef enum +{ + item_add_clockwise, + item_add_counterclockwise, + item_remove +} itemOperator; + +//list of possible itemtypes +typedef enum +{ + item_group, + item_arc, + item_text, + item_rectangle, + item_curve, + item_icon +} itemType; + +//informations contained in an event +struct ZincEvent +{ + int x,y; // pointer position none -> 0 + int k; // keycode none -> 0 + long t; // timestamp none -> 0 + int w,h; // window width,heigth none -> 0 + int X,Y; // pointer position within display none -> 0 + int b; // button pressed none -> 0 + String K; // keysym none -> "??" +}; + + + +#endif |