diff options
-rw-r--r-- | generic/tkbltGrAxis.C | 6 | ||||
-rw-r--r-- | generic/tkbltGrAxisOp.C | 48 | ||||
-rw-r--r-- | generic/tkbltGrElemLine.C | 29 | ||||
-rw-r--r-- | generic/tkbltGrElemOp.C | 64 | ||||
-rw-r--r-- | generic/tkbltGrMarkerOp.C | 69 | ||||
-rw-r--r-- | generic/tkbltVecCmd.C | 4 |
6 files changed, 172 insertions, 48 deletions
diff --git a/generic/tkbltGrAxis.C b/generic/tkbltGrAxis.C index 418abbb..26560d0 100644 --- a/generic/tkbltGrAxis.C +++ b/generic/tkbltGrAxis.C @@ -902,6 +902,12 @@ void Axis::fixRange() (ops->reqMin >= ops->reqMax)) { ops->reqMin = ops->reqMax = NAN; } + if (ops->reqMin < -DBL_MAX) { + ops->reqMin = -DBL_MAX; + } + if (ops->reqMax > DBL_MAX) { + ops->reqMax = DBL_MAX; + } if (ops->logScale) { if ((!isnan(ops->reqMin)) && (ops->reqMin <= 0.0)) ops->reqMin = NAN; diff --git a/generic/tkbltGrAxisOp.C b/generic/tkbltGrAxisOp.C index e467d53..fb3277e 100644 --- a/generic/tkbltGrAxisOp.C +++ b/generic/tkbltGrAxisOp.C @@ -98,8 +98,10 @@ static int CgetOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + if (objc!=5) { + Tcl_WrongNumArgs(interp, 3, objv, "axisId option"); return TCL_ERROR; + } Axis* axisPtr; if (graphPtr->getAxis(objv[3], &axisPtr) != TCL_OK) @@ -112,8 +114,10 @@ static int ConfigureOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + if (objc<4) { + Tcl_WrongNumArgs(interp, 3, objv, "axisId ?option value?..."); return TCL_ERROR; + } Axis* axisPtr; if (graphPtr->getAxis(objv[3], &axisPtr) != TCL_OK) @@ -126,8 +130,10 @@ static int ActivateOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + if (objc!=4) { + Tcl_WrongNumArgs(interp, 3, objv, "axisId"); return TCL_ERROR; + } Axis* axisPtr; if (graphPtr->getAxis(objv[3], &axisPtr) != TCL_OK) @@ -160,8 +166,10 @@ static int CreateOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + if (objc!=4) { + Tcl_WrongNumArgs(interp, 3, objv, "axisId"); return TCL_ERROR; + } if (graphPtr->createAxis(objc, objv) != TCL_OK) return TCL_ERROR; @@ -174,8 +182,10 @@ static int DeleteOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + if (objc!=4) { + Tcl_WrongNumArgs(interp, 3, objv, "axisId"); return TCL_ERROR; + } Axis* axisPtr; if (graphPtr->getAxis(objv[3], &axisPtr) != TCL_OK) @@ -194,8 +204,10 @@ static int InvTransformOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + if (objc!=5) { + Tcl_WrongNumArgs(interp, 3, objv, "axisId scoord"); return TCL_ERROR; + } Axis* axisPtr; if (graphPtr->getAxis(objv[3], &axisPtr) != TCL_OK) @@ -208,8 +220,10 @@ static int LimitsOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + if (objc!=4) { + Tcl_WrongNumArgs(interp, 3, objv, "axisId"); return TCL_ERROR; + } Axis* axisPtr; if (graphPtr->getAxis(objv[3], &axisPtr) != TCL_OK) @@ -222,8 +236,10 @@ static int MarginOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + if (objc!=4) { + Tcl_WrongNumArgs(interp, 3, objv, "axisId"); return TCL_ERROR; + } Axis* axisPtr; if (graphPtr->getAxis(objv[3], &axisPtr) != TCL_OK) @@ -237,6 +253,10 @@ static int NamesOp(ClientData clientData, Tcl_Interp* interp, { Graph* graphPtr = (Graph*)clientData; Tcl_Obj *listObjPtr = Tcl_NewListObj(0, (Tcl_Obj **)NULL); + if (objc<3) { + Tcl_WrongNumArgs(interp, 3, objv, "?pattern...?"); + return TCL_ERROR; + } if (objc == 3) { Tcl_HashSearch cursor; for (Tcl_HashEntry *hPtr = Tcl_FirstHashEntry(&graphPtr->axes_.table, &cursor); hPtr; hPtr = Tcl_NextHashEntry(&cursor)) { @@ -267,8 +287,10 @@ static int TransformOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + if (objc!=5) { + Tcl_WrongNumArgs(interp, 3, objv, "axisId coord"); return TCL_ERROR; + } Axis* axisPtr; if (graphPtr->getAxis(objv[3], &axisPtr) != TCL_OK) @@ -281,8 +303,10 @@ static int TypeOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + if (objc!=4) { + Tcl_WrongNumArgs(interp, 3, objv, "axisId"); return TCL_ERROR; + } Axis* axisPtr; if (graphPtr->getAxis(objv[3], &axisPtr) != TCL_OK) @@ -295,8 +319,10 @@ static int ViewOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + if (objc!=4) { + Tcl_WrongNumArgs(interp, 3, objv, "axisId"); return TCL_ERROR; + } Axis* axisPtr; if (graphPtr->getAxis(objv[3], &axisPtr) != TCL_OK) diff --git a/generic/tkbltGrElemLine.C b/generic/tkbltGrElemLine.C index 19a572e..9e3f39a 100644 --- a/generic/tkbltGrElemLine.C +++ b/generic/tkbltGrElemLine.C @@ -309,7 +309,6 @@ void LineElement::map() if (!ops->coords.x || !ops->coords.y || !ops->coords.x->nValues() || !ops->coords.y->nValues()) return; - int np = NUMBEROFPOINTS(ops); MapInfo mi; getScreenPoints(&mi); @@ -320,7 +319,7 @@ void LineElement::map() // Map connecting line segments if they are to be displayed. smooth_ = (Smoothing)ops->reqSmooth; - if ((np > 1) && (ops->builtinPen.traceWidth > 0)) { + if ((mi.nScreenPts > 1) && (ops->builtinPen.traceWidth > 0)) { // Do smoothing if necessary. This can extend the coordinate array, // so both mi.points and mi.nPoints may change. switch (smooth_) { @@ -534,11 +533,27 @@ void LineElement::draw(Drawable drawable) delete [] points; } + // Error bars + for (ChainLink* link = Chain_FirstLink(ops->stylePalette); link; + link = Chain_NextLink(link)) { + LineStyle* stylePtr = (LineStyle*)Chain_GetValue(link); + LinePen* penPtr = (LinePen *)stylePtr->penPtr; + LinePenOptions* penOps = (LinePenOptions*)penPtr->ops(); + + if ((stylePtr->xeb.length > 0) && (penOps->errorBarShow & SHOW_X)) + graphPtr_->drawSegments(drawable, penPtr->errorBarGC_, + stylePtr->xeb.segments, stylePtr->xeb.length); + + if ((stylePtr->yeb.length > 0) && (penOps->errorBarShow & SHOW_Y)) + graphPtr_->drawSegments(drawable, penPtr->errorBarGC_, + stylePtr->yeb.segments, stylePtr->yeb.length); + } + // traces if ((Chain_GetLength(traces_) > 0) && (penOps->traceWidth > 0)) drawTraces(drawable, penPtr); - // Symbols, error bars, values + // Symbols, values if (ops->reqMaxSymbols > 0) { int total = 0; for (ChainLink* link = Chain_FirstLink(ops->stylePalette); link; @@ -557,14 +572,6 @@ void LineElement::draw(Drawable drawable) LinePen* penPtr = (LinePen *)stylePtr->penPtr; LinePenOptions* penOps = (LinePenOptions*)penPtr->ops(); - if ((stylePtr->xeb.length > 0) && (penOps->errorBarShow & SHOW_X)) - graphPtr_->drawSegments(drawable, penPtr->errorBarGC_, - stylePtr->xeb.segments, stylePtr->xeb.length); - - if ((stylePtr->yeb.length > 0) && (penOps->errorBarShow & SHOW_Y)) - graphPtr_->drawSegments(drawable, penPtr->errorBarGC_, - stylePtr->yeb.segments, stylePtr->yeb.length); - if ((stylePtr->symbolPts.length > 0) && (penOps->symbol.type != SYMBOL_NONE)) drawSymbols(drawable, penPtr, stylePtr->symbolSize, diff --git a/generic/tkbltGrElemOp.C b/generic/tkbltGrElemOp.C index af6fc0c..1102c30 100644 --- a/generic/tkbltGrElemOp.C +++ b/generic/tkbltGrElemOp.C @@ -89,8 +89,8 @@ static int CgetOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc != 5) { - Tcl_WrongNumArgs(interp, 3, objv, "cget option"); + if (objc!=5) { + Tcl_WrongNumArgs(interp, 3, objv, "elemId option"); return TCL_ERROR; } @@ -113,8 +113,10 @@ static int ConfigureOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + if (objc<4) { + Tcl_WrongNumArgs(interp, 3, objv, "elemId ?option value...?"); return TCL_ERROR; + } Element* elemPtr; if (graphPtr->getElement(objv[3], &elemPtr) != TCL_OK) @@ -140,6 +142,11 @@ static int ActivateOp(ClientData clientData, Tcl_Interp* interp, { Graph* graphPtr = (Graph*)clientData; + if (objc<3) { + Tcl_WrongNumArgs(interp, 3, objv, "?elemId? ?index...?"); + return TCL_ERROR; + } + // List all the currently active elements if (objc == 3) { Tcl_Obj *listObjPtr = Tcl_NewListObj(0, (Tcl_Obj **)NULL); @@ -211,8 +218,10 @@ static int ClosestOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<5) + if (objc<5) { + Tcl_WrongNumArgs(interp, 3, objv, "x y ?elemName?..."); return TCL_ERROR; + } GraphOptions* gops = (GraphOptions*)graphPtr->ops_; ClosestSearch* searchPtr = &gops->search; @@ -283,8 +292,11 @@ static int CreateOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + + if (objc!=4) { + Tcl_WrongNumArgs(interp, 3, objv, "elemId"); return TCL_ERROR; + } if (graphPtr->createElement(objc, objv) != TCL_OK) return TCL_ERROR; @@ -299,6 +311,10 @@ static int CreateOp(ClientData clientData, Tcl_Interp* interp, static int DeactivateOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { + if (objc<4) { + Tcl_WrongNumArgs(interp, 3, objv, "elemId..."); + return TCL_ERROR; + } Graph* graphPtr = (Graph*)clientData; for (int ii=3; ii<objc; ii++) { Element* elemPtr; @@ -320,6 +336,10 @@ static int DeactivateOp(ClientData clientData, Tcl_Interp* interp, static int DeleteOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { + if (objc<4) { + Tcl_WrongNumArgs(interp, 3, objv, "elemId..."); + return TCL_ERROR; + } Graph* graphPtr = (Graph*)clientData; for (int ii=3; ii<objc; ii++) { Element* elemPtr; @@ -339,8 +359,11 @@ static int ExistsOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + + if (objc!=4) { + Tcl_WrongNumArgs(interp, 3, objv, "elemId"); return TCL_ERROR; + } Tcl_HashEntry *hPtr = Tcl_FindHashEntry(&graphPtr->elements_.table, Tcl_GetString(objv[3])); @@ -353,6 +376,11 @@ static int LowerOp(ClientData clientData, Tcl_Interp* interp, { Graph* graphPtr = (Graph*)clientData; + if (objc<4) { + Tcl_WrongNumArgs(interp, 3, objv, "elemId..."); + return TCL_ERROR; + } + // Move the links of lowered elements out of the display list into // a temporary list Chain* chain = new Chain(); @@ -400,6 +428,11 @@ static int NamesOp(ClientData clientData, Tcl_Interp* interp, { Graph* graphPtr = (Graph*)clientData; + if (objc<3) { + Tcl_WrongNumArgs(interp, 3, objv, "?pattern...?"); + return TCL_ERROR; + } + Tcl_Obj *listObjPtr = Tcl_NewListObj(0, (Tcl_Obj **)NULL); if (objc == 3) { Tcl_HashSearch iter; @@ -433,6 +466,11 @@ static int RaiseOp(ClientData clientData, Tcl_Interp* interp, { Graph* graphPtr = (Graph*)clientData; + if (objc<4) { + Tcl_WrongNumArgs(interp, 3, objv, "elemId..."); + return TCL_ERROR; + } + Chain* chain = new Chain(); for (int ii=3; ii<objc; ii++) { Element* elemPtr; @@ -476,8 +514,15 @@ static int ShowOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + if (objc!=3 || objc!=4) { + Tcl_WrongNumArgs(interp, 3, objv, "?nameList?"); return TCL_ERROR; + } + + if (objc == 3) { + Tcl_SetObjResult(interp, DisplayListObj(graphPtr)); + return TCL_OK; + } int elemObjc; Tcl_Obj** elemObjv; @@ -535,8 +580,11 @@ static int TypeOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + + if (objc!=4) { + Tcl_WrongNumArgs(interp, 3, objv, "elemId"); return TCL_ERROR; + } Element* elemPtr; if (graphPtr->getElement(objv[3], &elemPtr) != TCL_OK) diff --git a/generic/tkbltGrMarkerOp.C b/generic/tkbltGrMarkerOp.C index 20933ab..5103a3d 100644 --- a/generic/tkbltGrMarkerOp.C +++ b/generic/tkbltGrMarkerOp.C @@ -121,6 +121,7 @@ static int CreateMarker(Graph* graphPtr, Tcl_Interp* interp, Tcl_AppendResult(graphPtr->interp_, "marker \"", name, "\" already exists in \"", Tcl_GetString(objv[0]), "\"", NULL); + delete [] name; return TCL_ERROR; } @@ -133,6 +134,8 @@ static int CreateMarker(Graph* graphPtr, Tcl_Interp* interp, else if (!strcmp(type, "text")) markerPtr = new TextMarker(graphPtr, name, hPtr); else { + Tcl_DeleteHashEntry(hPtr); + delete [] name; Tcl_AppendResult(interp, "unknown marker type ", type, NULL); return TCL_ERROR; } @@ -141,6 +144,7 @@ static int CreateMarker(Graph* graphPtr, Tcl_Interp* interp, if ((Tk_InitOptions(graphPtr->interp_, (char*)markerPtr->ops(), markerPtr->optionTable(), graphPtr->tkwin_) != TCL_OK) || (MarkerObjConfigure(graphPtr, markerPtr, interp, objc-offset, objv+offset) != TCL_OK)) { delete markerPtr; + delete [] name; return TCL_ERROR; } @@ -157,8 +161,10 @@ static int CgetOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + if (objc!=5) { + Tcl_WrongNumArgs(interp, 3, objv, "markerId option"); return TCL_ERROR; + } Marker* markerPtr; if (GetMarkerFromObj(interp, graphPtr, objv[3], &markerPtr) != TCL_OK) @@ -179,8 +185,10 @@ static int ConfigureOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + if (objc<4) { + Tcl_WrongNumArgs(interp, 3, objv, "markerId ?option value...?"); return TCL_ERROR; + } Marker* markerPtr; if (GetMarkerFromObj(interp, graphPtr, objv[3], &markerPtr) != TCL_OK) @@ -219,15 +227,22 @@ static int BindOp(ClientData clientData, Tcl_Interp* interp, } Tcl_SetObjResult(interp, listObjPtr); return TCL_OK; + } else if (objc >= 4) { + return graphPtr->bindTable_->configure(graphPtr->markerTag(Tcl_GetString(objv[3])), objc - 4, objv + 4); + } else { + Tcl_WrongNumArgs(interp, 3, objv, "markerId ?tag? ?sequence? ?command?"); + return TCL_ERROR; } - - return graphPtr->bindTable_->configure(graphPtr->markerTag(Tcl_GetString(objv[3])), objc - 4, objv + 4); } static int CreateOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; + if (objc<4) { + Tcl_WrongNumArgs(interp, 2, objv, "markerId ?type? ?option value...?"); + return TCL_ERROR; + } if (CreateMarker(graphPtr, interp, objc, objv) != TCL_OK) return TCL_ERROR; // set in CreateMarker @@ -243,29 +258,45 @@ static int DeleteOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; + + if (objc<4) { + Tcl_WrongNumArgs(interp, 2, objv, "markerId..."); + return TCL_ERROR; + } + + int res = TCL_OK; + for (int ii=3; ii<objc; ii++) { Marker* markerPtr; - if (GetMarkerFromObj(NULL, graphPtr, objv[ii], &markerPtr) != TCL_OK) { - Tcl_AppendResult(interp, "can't find marker \"", - Tcl_GetString(objv[ii]), "\" in \"", - Tk_PathName(graphPtr->tkwin_), "\"", NULL); - return TCL_ERROR; + const char* string = Tcl_GetString(objv[ii]); + Tcl_HashEntry* hPtr = Tcl_FindHashEntry(&graphPtr->markers_.table, string); + if (!hPtr) { + if (res == TCL_OK) { + Tcl_AppendResult(interp, "can't find markers in \"", + Tk_PathName(graphPtr->tkwin_), "\":", NULL); + } + Tcl_AppendResult(interp, " ", Tcl_GetString(objv[ii])); + res = TCL_ERROR; + } else { + markerPtr = (Marker*)Tcl_GetHashValue(hPtr); + delete markerPtr; } - delete markerPtr; } graphPtr->flags |= CACHE; graphPtr->eventuallyRedraw(); - return TCL_OK; + return res; } static int ExistsOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + if (objc!=4) { + Tcl_WrongNumArgs(interp, 3, objv, "markerId"); return TCL_ERROR; + } Tcl_HashEntry* hPtr = Tcl_FindHashEntry(&graphPtr->markers_.table, Tcl_GetString(objv[3])); @@ -278,8 +309,10 @@ static int FindOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + if (objc!=8) { + Tcl_WrongNumArgs(interp, 3, objv, "searchtype left top right bottom"); return TCL_ERROR; + } const char* string = Tcl_GetString(objv[3]); int mode; @@ -378,8 +411,10 @@ static int RelinkOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + if (objc!=4 && objc!=5) { + Tcl_WrongNumArgs(interp, 3, objv, "markerId ?placeId?"); return TCL_ERROR; + } Marker* markerPtr; if (GetMarkerFromObj(interp, graphPtr, objv[3], &markerPtr) != TCL_OK) @@ -411,8 +446,10 @@ static int TypeOp(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { Graph* graphPtr = (Graph*)clientData; - if (objc<4) + if (objc!=4) { + Tcl_WrongNumArgs(interp, 3, objv, "markerId"); return TCL_ERROR; + } Marker* markerPtr; if (GetMarkerFromObj(interp, graphPtr, objv[3], &markerPtr) != TCL_OK) @@ -450,7 +487,7 @@ static int GetMarkerFromObj(Tcl_Interp* interp, Graph* graphPtr, } if (interp) { Tcl_AppendResult(interp, "can't find marker \"", string, - "\" in \"", Tk_PathName(graphPtr->tkwin_), NULL); + "\" in \"", Tk_PathName(graphPtr->tkwin_), "\"", NULL); } return TCL_ERROR; diff --git a/generic/tkbltVecCmd.C b/generic/tkbltVecCmd.C index 5d49c37..8a03fe6 100644 --- a/generic/tkbltVecCmd.C +++ b/generic/tkbltVecCmd.C @@ -162,11 +162,11 @@ static int Blt_ExprDoubleFromObj(Tcl_Interp* interp, Tcl_Obj *objPtr, if (Tcl_GetDoubleFromObj((Tcl_Interp *)NULL, objPtr, valuePtr) == TCL_OK) return TCL_OK; - // Interpret the empty string as NaN + // Interpret the empty string "" and "NaN" as NaN. int length; char *string; string = Tcl_GetStringFromObj(objPtr, &length); - if (length == 0) { + if (length == 0 || (length == 3 && strcmp(string, "NaN") == 0)) { *valuePtr = NAN; return TCL_OK; } |