summaryrefslogtreecommitdiffstats
path: root/tksao
diff options
context:
space:
mode:
authorWilliam Joye <wjoye@cfa.harvard.edu>2019-03-18 20:20:56 (GMT)
committerWilliam Joye <wjoye@cfa.harvard.edu>2019-03-18 20:20:56 (GMT)
commit36b9b0a0b803adbfff16a795708b589985e8df2a (patch)
tree8edef924d41ce7b7c61c53522d0fde5ca09830f5 /tksao
parentea09157093cc41a1ea6ecbef02b17af8ca80dd45 (diff)
downloadblt-36b9b0a0b803adbfff16a795708b589985e8df2a.zip
blt-36b9b0a0b803adbfff16a795708b589985e8df2a.tar.gz
blt-36b9b0a0b803adbfff16a795708b589985e8df2a.tar.bz2
thread contour
Diffstat (limited to 'tksao')
-rw-r--r--tksao/frame/context.C12
-rw-r--r--tksao/frame/fvcontour.C55
-rw-r--r--tksao/frame/fvcontour.h4
3 files changed, 49 insertions, 22 deletions
diff --git a/tksao/frame/context.C b/tksao/frame/context.C
index 3d797ae..4dc7abf 100644
--- a/tksao/frame/context.C
+++ b/tksao/frame/context.C
@@ -404,6 +404,10 @@ void Context::contourCreateFV(const char* color, int width, int dash,
if (rr)
internalError("Unable to Join Thread");
+ fvcontour_.append(targ[ii].lcl);
+
+ if (targ[ii].lcl)
+ delete targ[ii].lcl;
if (targ[ii].kernel)
delete [] targ[ii].kernel;
if (targ[ii].src)
@@ -423,6 +427,10 @@ void Context::contourCreateFV(const char* color, int width, int dash,
if (rr)
internalError("Unable to Join Thread");
+ fvcontour_.append(targ[ii].lcl);
+
+ if (targ[ii].lcl)
+ delete targ[ii].lcl;
if (targ[ii].kernel)
delete [] targ[ii].kernel;
if (targ[ii].src)
@@ -2691,6 +2699,10 @@ void Context::updateContours()
if (rr)
internalError("Unable to Join Thread");
+ fvcontour_.append(targ[0].lcl);
+
+ if (targ[0].lcl)
+ delete targ[0].lcl;
if (targ[0].kernel)
delete [] targ[0].kernel;
if (targ[0].src)
diff --git a/tksao/frame/fvcontour.C b/tksao/frame/fvcontour.C
index f23bdaf..27a31c0 100644
--- a/tksao/frame/fvcontour.C
+++ b/tksao/frame/fvcontour.C
@@ -22,12 +22,12 @@ static const char* methodName_[] = {
enum Edge {TOP, RIGHT, BOTTOM, LEFT, NONE};
-static void build(long xdim, long ydim, double *image, Matrix* mx,
- FVContour* fv);
+static void build(long xdim, long ydim, double *image, Matrix& mx,
+ FVContour* fv, List<ContourLevel>* lcl);
static void trace(long xdim, long ydim, double cntr,
long xCell, long yCell, int side,
double** rows, char* usedGrid,
- Matrix* mx, ContourLevel* cl);
+ Matrix& mx, ContourLevel* cl);
// It is a modified version of contour code found in Fv 2.4
// Fv may be obtained from the HEASARC (High Energy Astrophysics Science
@@ -164,6 +164,14 @@ const char* FVContour::methodName()
return methodName_[method_];
}
+void FVContour::append(List<ContourLevel> *lcl)
+{
+ while (lcl->head()) {
+ ContourLevel* ncl = lcl->extract();
+ lcontourlevel_.append(ncl);
+ }
+}
+
void FVContour::append(FitsImage* fits, pthread_t* thread, void* targ)
{
if (smooth_ == 1)
@@ -182,7 +190,7 @@ void FVContour::append(FitsImage* fits, pthread_t* thread, void* targ)
static void* fvUnityThread(void*vv)
{
t_fvcontour_arg* tt = (t_fvcontour_arg*)vv;
- build(tt->width, tt->height, tt->dest, tt->mm, tt->fv);
+ build(tt->width, tt->height, tt->dest, tt->mm, tt->fv, tt->lcl);
return NULL;
}
@@ -219,15 +227,16 @@ void FVContour::unity(FitsImage* fits, pthread_t* thread, void* targ)
tt->kernel = NULL;
tt->src = NULL;
tt->dest = dest;
- tt->xmin = params->xmin;
- tt->xmax = params->xmax;
- tt->ymin = params->ymin;
- tt->ymax = params->ymax;
+ tt->xmin = 0;
+ tt->xmax = 0;
+ tt->ymin = 0;
+ tt->ymax = 0;
tt->width = width;
tt->height = height;
tt->r = 0;
- tt->mm = &mm;
+ tt->mm = mm;
tt->fv = this;
+ tt->lcl = new List<ContourLevel>;
int result = pthread_create(thread, NULL, fvUnityThread, targ);
if (result)
@@ -240,7 +249,7 @@ static void* fvSmoothThread(void*vv)
convolve(tt->kernel, tt->src, tt->dest,
tt->xmin, tt->ymin, tt->xmax, tt->ymax,
tt->width, tt->r);
- build(tt->width, tt->height, tt->dest, tt->mm, tt->fv);
+ build(tt->width, tt->height, tt->dest, tt->mm, tt->fv, tt->lcl);
return NULL;
}
@@ -296,8 +305,9 @@ void FVContour::smooth(FitsImage* fits, pthread_t* thread, void* targ)
tt->width = width;
tt->height = height;
tt->r = r;
- tt->mm = &mm;
+ tt->mm = mm;
tt->fv = this;
+ tt->lcl = new List<ContourLevel>;
int result = pthread_create(thread, NULL, fvSmoothThread, targ);
if (result)
@@ -307,7 +317,7 @@ void FVContour::smooth(FitsImage* fits, pthread_t* thread, void* targ)
static void* fvBlockThread(void*vv)
{
t_fvcontour_arg* tt = (t_fvcontour_arg*)vv;
- build(tt->width, tt->height, tt->dest, tt->mm, tt->fv);
+ build(tt->width, tt->height, tt->dest, tt->mm, tt->fv, tt->lcl);
return NULL;
}
@@ -377,22 +387,24 @@ void FVContour::block(FitsImage* fits, pthread_t* thread, void* targ)
tt->kernel = NULL;
tt->src = NULL;
tt->dest = dest;
- tt->xmin = params->xmin;
- tt->xmax = params->xmax;
- tt->ymin = params->ymin;
- tt->ymax = params->ymax;
+ tt->xmin = 0;
+ tt->xmax = 0;
+ tt->ymin = 0;
+ tt->ymax = 0;
tt->width = w2;
tt->height = h2;
tt->r = 0;
- tt->mm = &mm;
+ tt->mm = mm;
tt->fv = this;
+ tt->lcl = new List<ContourLevel>;
int result = pthread_create(thread, NULL, fvBlockThread, targ);
if (result)
internalError("Unable to Create Thread");
}
-void build(long xdim, long ydim, double *image, Matrix* mx, FVContour* fv)
+void build(long xdim, long ydim, double *image, Matrix& mx,
+ FVContour* fv, List<ContourLevel>* lcl)
{
long nelem = xdim*ydim;
char* usedGrid = new char[nelem];
@@ -441,7 +453,8 @@ void build(long xdim, long ydim, double *image, Matrix* mx, FVContour* fv)
trace(xdim, ydim, cntour, ii, jj, TOP, rows, usedGrid, mx, cl);
if (!cl->lcontour().isEmpty())
- fv->lcontourlevel().append(cl);
+ lcl->append(cl);
+ // fv->lcontourlevel().append(cl);
}
delete [] usedGrid;
@@ -451,7 +464,7 @@ void build(long xdim, long ydim, double *image, Matrix* mx, FVContour* fv)
void trace(long xdim, long ydim, double cntr,
long xCell, long yCell, int side,
double** rows, char* usedGrid,
- Matrix* mx, ContourLevel* cl)
+ Matrix& mx, ContourLevel* cl)
{
long ii = xCell;
long jj = yCell;
@@ -546,7 +559,7 @@ void trace(long xdim, long ydim, double cntr,
done = 1;
}
- cc->lvertex().append(new Vertex(Vector(X+.5,Y+.5) * (*mx)));
+ cc->lvertex().append(new Vertex(Vector(X+.5,Y+.5) * mx));
}
if (!cc->lvertex().isEmpty())
diff --git a/tksao/frame/fvcontour.h b/tksao/frame/fvcontour.h
index 47710d7..dcd6897 100644
--- a/tksao/frame/fvcontour.h
+++ b/tksao/frame/fvcontour.h
@@ -23,8 +23,9 @@ typedef struct {
int width;
int height;
int r;
- Matrix* mm;
+ Matrix mm;
FVContour* fv;
+ List<ContourLevel>* lcl;
} t_fvcontour_arg;
class FVContour {
@@ -66,6 +67,7 @@ public:
void update(FitsImage*);
void update(FitsImage*, FrScale*);
+ void append(List<ContourLevel>*);
void append(FitsImage*, pthread_t* thread, void* targ);
int isEmpty() {return lcontourlevel_.isEmpty();}