//**************************************************************************
#ifndef REGION_H
#define REGION_H
//**************************************************************************
#include "list.h"
#include "pixel.h"
//**************************************************************************
class Region
{
        private:
                List<Pixel> L;
                Pixel phead;
                Pixel ptail;
                int length;
                int closed;

        public:
                Region() { length = 0; closed = 0;}             // Constructor
                ~Region() { }                                   // Destructor
                void reInitialize() { length = 0; closed = 0; L.reInitialize(); }

                inline void Insert(int x, int y, double strength)
                        { Pixel P(x,y,strength); 
                          Insert(P);}
                inline void Insert(Pixel p)
                        { if (length == 0) phead = p;
                         L.Insert(p); ++length;
                         ptail = p;}
                inline Pixel &begin() { L.First(); return L();}
                inline Pixel &head() { return phead;}
                inline Pixel &tail() { return ptail;}
                inline Pixel &operator() ( ) { return L();}
                inline void get(int *x, int *y, double *strength)
                        { L().get(x, y, strength); }
                inline void operator++ ( ) {++L;}
                inline int operator! ( ) { return !L; }
                inline int x() { return L().x; }
                inline int y() { return L().y; }
                inline double strength() { return L().strength; }

                inline int size() {return length;}
                inline void close() {closed = 1;}
                inline void open() {closed = 0;}
                inline int isOpen() { return (closed == 0); }
                inline int isClosed() { return (closed == 1); }

                Region &operator= (Region &Reg);
};
//**************************************************************************
void makeRegions(Matrix &Im, int thresholdsize);
void followAndfillRegion(Region *R, Matrix *img);
void makeRegions(GrayImage &Im, int thresholdsize);
void writeAllRegions(GrayImage *img);
void joinRegions(Region &r1, Region &r2, Region *final, int r_num);
void insertLine(Region *r, Pixel &p0, Pixel &p1, int value);
void joinRegions(void);
int FindNearestRegion(Region &r, int regnum);
int dist(Region &r1, Region &r2);
void printRegionLengths(void);
void compactRegions(void);
int numNonzeroRegions(void);
void refineRegions(int reg_size, int n);
//**************************************************************************
#endif // REGION_H
//**************************************************************************