diff options
author | joye <joye> | 2014-07-07 18:36:58 (GMT) |
---|---|---|
committer | joye <joye> | 2014-07-07 18:36:58 (GMT) |
commit | 2ee980a2ccdee7f03cfe914e85d7a2ede2682d36 (patch) | |
tree | 0aa8829aa581af4872ff1319f1cf62356028800d /src | |
parent | ca9f9a5e75e20cd2a842acf29f5cafb562b7f293 (diff) | |
download | blt-2ee980a2ccdee7f03cfe914e85d7a2ede2682d36.zip blt-2ee980a2ccdee7f03cfe914e85d7a2ede2682d36.tar.gz blt-2ee980a2ccdee7f03cfe914e85d7a2ede2682d36.tar.bz2 |
*** empty log message ***
Diffstat (limited to 'src')
-rw-r--r-- | src/bltGrElem.C | 56 | ||||
-rw-r--r-- | src/bltGrElem.h | 12 | ||||
-rw-r--r-- | src/bltGrElemOption.C | 120 |
3 files changed, 82 insertions, 106 deletions
diff --git a/src/bltGrElem.C b/src/bltGrElem.C index d173c14..17f74c1 100644 --- a/src/bltGrElem.C +++ b/src/bltGrElem.C @@ -84,10 +84,66 @@ ElemValuesSource::~ElemValuesSource() ElemValuesVector::ElemValuesVector() { + vectorSource.vector = NULL; } ElemValuesVector::~ElemValuesVector() { + FreeVectorSource(); +} + +int ElemValuesVector::GetVectorData(Tcl_Interp* interp, const char *vecName) +{ + vectorSource.vector = Blt_AllocVectorId(interp, vecName); + + Blt_Vector *vecPtr; + if (Blt_GetVectorById(interp, vectorSource.vector, &vecPtr) != TCL_OK) + return TCL_ERROR; + + if (FetchVectorValues(interp, vecPtr) != TCL_OK) { + FreeVectorSource(); + return TCL_ERROR; + } + + Blt_SetVectorChangedProc(vectorSource.vector, VectorChangedProc, this); + return TCL_OK; +} + +int ElemValuesVector::FetchVectorValues(Tcl_Interp* interp, Blt_Vector* vector) +{ + if (values) + delete [] values; + values = NULL; + nValues = 0; + min =0; + max =0; + + int ss = Blt_VecLength(vector); + if (!ss) + return TCL_OK; + + double* array = new double[ss]; + if (!array) { + Tcl_AppendResult(interp, "can't allocate new vector", NULL); + return TCL_ERROR; + } + + memcpy(array, Blt_VecData(vector), ss*sizeof(double)); + values = array; + nValues = Blt_VecLength(vector); + min = Blt_VecMin(vector); + max = Blt_VecMax(vector); + + return TCL_OK; +} + +void ElemValuesVector::FreeVectorSource() +{ + if (vectorSource.vector) { + Blt_SetVectorChangedProc(vectorSource.vector, NULL, NULL); + Blt_FreeVectorId(vectorSource.vector); + vectorSource.vector = NULL; + } } // Class Element diff --git a/src/bltGrElem.h b/src/bltGrElem.h index 042f6cd..1402eac 100644 --- a/src/bltGrElem.h +++ b/src/bltGrElem.h @@ -69,7 +69,6 @@ namespace Blt { public: ElemSource type; Element* elemPtr; - VectorDataSource vectorSource; double *values; int nValues; double min; @@ -92,8 +91,15 @@ namespace Blt { class ElemValuesVector : public ElemValues { public: + VectorDataSource vectorSource; + + public: ElemValuesVector(); ~ElemValuesVector(); + + int GetVectorData(Tcl_Interp*, const char*); + int FetchVectorValues(Tcl_Interp*, Blt_Vector*); + void FreeVectorSource(); }; typedef struct { @@ -192,4 +198,8 @@ namespace Blt { }; }; +extern void VectorChangedProc(Tcl_Interp* interp, ClientData clientData, + Blt_VectorNotify notify); + + #endif diff --git a/src/bltGrElemOption.C b/src/bltGrElemOption.C index 1880e0c..8c73056 100644 --- a/src/bltGrElemOption.C +++ b/src/bltGrElemOption.C @@ -49,13 +49,9 @@ using namespace Blt; // Defs -static void FreeDataValues(ElemValues* valuesPtr); -static void FreeVectorSource(ElemValues* valuesPtr); static int GetPenStyleFromObj(Tcl_Interp* interp, Graph* graphPtr, Tcl_Obj *objPtr, ClassId classId, PenStyle *stylePtr); -static int GetVectorData(Tcl_Interp* interp, ElemValues* valuesPtr, - const char *vecName); static int ParseValues(Tcl_Interp* interp, Tcl_Obj *objPtr, int *nValuesPtr, double **arrayPtr); @@ -96,7 +92,7 @@ static int ValuesSetProc(ClientData clientData, Tcl_Interp* interp, ElemValuesVector* valuesPtr = new ElemValuesVector(); valuesPtr->elemPtr = elemPtr; valuesPtr->type = ElemValues::SOURCE_VECTOR; - if (GetVectorData(interp, valuesPtr, string) != TCL_OK) + if (valuesPtr->GetVectorData(interp, string) != TCL_OK) return TCL_ERROR; *valuesPtrPtr = valuesPtr; } @@ -130,7 +126,7 @@ static Tcl_Obj* ValuesGetProc(ClientData clientData, Tk_Window tkwin, case ElemValues::SOURCE_VECTOR: { const char* vecName = - Blt_NameOfVectorId(valuesPtr->vectorSource.vector); + Blt_NameOfVectorId(((ElemValuesVector*)valuesPtr)->vectorSource.vector); return Tcl_NewStringObj(vecName, -1); } case ElemValues::SOURCE_VALUES: @@ -155,10 +151,8 @@ static Tcl_Obj* ValuesGetProc(ClientData clientData, Tk_Window tkwin, static void ValuesFreeProc(ClientData clientData, Tk_Window tkwin, char *ptr) { ElemValues* valuesPtr = *(ElemValues**)ptr; - if (valuesPtr) { - FreeDataValues(valuesPtr); + if (valuesPtr) delete valuesPtr; - } } static Tk_CustomOptionSetProc PairsSetProc; @@ -191,12 +185,10 @@ static int PairsSetProc(ClientData clientData, Tcl_Interp* interp, nValues /= 2; size_t newSize = nValues * sizeof(double); if (coordsPtr->x) { - FreeDataValues(coordsPtr->x); delete coordsPtr->x; coordsPtr->x = NULL; } if (coordsPtr->y) { - FreeDataValues(coordsPtr->y); delete coordsPtr->y; coordsPtr->y = NULL; } @@ -375,63 +367,26 @@ static int GetPenStyleFromObj(Tcl_Interp* interp, Graph* graphPtr, return TCL_OK; } -static void FreeVectorSource(ElemValues* valuesPtr) +void VectorChangedProc(Tcl_Interp* interp, ClientData clientData, + Blt_VectorNotify notify) { + ElemValuesVector* valuesPtr = (ElemValuesVector*)clientData; if (!valuesPtr) return; - if (valuesPtr->vectorSource.vector) { - Blt_SetVectorChangedProc(valuesPtr->vectorSource.vector, NULL, NULL); - Blt_FreeVectorId(valuesPtr->vectorSource.vector); - valuesPtr->vectorSource.vector = NULL; - } -} - -static int FetchVectorValues(Tcl_Interp* interp, ElemValues* valuesPtr, - Blt_Vector* vector) -{ - if (!valuesPtr) - return TCL_ERROR; - - if (valuesPtr->values) - delete [] valuesPtr->values; - valuesPtr->values = NULL; - valuesPtr->nValues = 0; - valuesPtr->min =0; - valuesPtr->max =0; - - int ss = Blt_VecLength(vector); - if (!ss) - return TCL_OK; - - double* array = new double[ss]; - if (!array) { - Tcl_AppendResult(interp, "can't allocate new vector", NULL); - return TCL_ERROR; + if (notify == BLT_VECTOR_NOTIFY_DESTROY) { + valuesPtr->FreeVectorSource(); + if (valuesPtr->values) + delete [] valuesPtr->values; + valuesPtr->values = NULL; + valuesPtr->nValues = 0; + valuesPtr->min =0; + valuesPtr->max =0; } - - memcpy(array, Blt_VecData(vector), ss*sizeof(double)); - valuesPtr->values = array; - valuesPtr->nValues = Blt_VecLength(vector); - valuesPtr->min = Blt_VecMin(vector); - valuesPtr->max = Blt_VecMax(vector); - - return TCL_OK; -} - -static void VectorChangedProc(Tcl_Interp* interp, ClientData clientData, - Blt_VectorNotify notify) -{ - ElemValues* valuesPtr = (ElemValues*)clientData; - if (!valuesPtr) - return; - - if (notify == BLT_VECTOR_NOTIFY_DESTROY) - FreeDataValues(valuesPtr); else { Blt_Vector* vector; Blt_GetVectorById(interp, valuesPtr->vectorSource.vector, &vector); - if (FetchVectorValues(interp, valuesPtr, vector) != TCL_OK) + if (valuesPtr->FetchVectorValues(interp, vector) != TCL_OK) return; } @@ -442,28 +397,6 @@ static void VectorChangedProc(Tcl_Interp* interp, ClientData clientData, graphPtr->eventuallyRedraw(); } -static int GetVectorData(Tcl_Interp* interp, ElemValues* valuesPtr, - const char *vecName) -{ - if (!valuesPtr) - return TCL_ERROR; - - VectorDataSource* srcPtr = &valuesPtr->vectorSource; - srcPtr->vector = Blt_AllocVectorId(interp, vecName); - - Blt_Vector *vecPtr; - if (Blt_GetVectorById(interp, srcPtr->vector, &vecPtr) != TCL_OK) - return TCL_ERROR; - - if (FetchVectorValues(interp, valuesPtr, vecPtr) != TCL_OK) { - FreeVectorSource(valuesPtr); - return TCL_ERROR; - } - - Blt_SetVectorChangedProc(srcPtr->vector, VectorChangedProc, valuesPtr); - return TCL_OK; -} - static int ParseValues(Tcl_Interp* interp, Tcl_Obj *objPtr, int *nValuesPtr, double **arrayPtr) { @@ -494,26 +427,3 @@ static int ParseValues(Tcl_Interp* interp, Tcl_Obj *objPtr, int *nValuesPtr, } return TCL_OK; } - -static void FreeDataValues(ElemValues* valuesPtr) -{ - if (!valuesPtr) - return; - - switch (valuesPtr->type) { - case ElemValues::SOURCE_VECTOR: - FreeVectorSource(valuesPtr); - break; - case ElemValues::SOURCE_VALUES: - break; - } - if (valuesPtr->values) - delete [] valuesPtr->values; - valuesPtr->type = ElemValues::SOURCE_VALUES; - valuesPtr->values = NULL; - valuesPtr->nValues = 0; - valuesPtr->min =0; - valuesPtr->max =0; -} - - |