updating bitplane
This commit is contained in:
Binary file not shown.
Binary file not shown.
@ -107,6 +107,7 @@ namespace ams
|
||||
amsbitplane& operator=(amsbitplane&& other) noexcept;
|
||||
|
||||
int resize(int _Nx, int _Ny);
|
||||
amsbitplane subimage(int I0, int J0, int I1, int J1) const;
|
||||
amsbitplane transpose();
|
||||
amsbitplane rotcw();
|
||||
amsbitplane rotccw();
|
||||
@ -115,18 +116,19 @@ namespace ams
|
||||
|
||||
uint8_t get(int I, int J) const;
|
||||
int set(int I, int J, uint8_t val);
|
||||
|
||||
uint8_t& at(int I, int J);
|
||||
uint8_t& operator()(const int I, const int J);
|
||||
const uint8_t& operator()(const int I, const int J) const;
|
||||
uint8_t& operator[](const long I);
|
||||
const uint8_t& operator[](const long I) const;
|
||||
const uint8_t& at(int I, int J) const;
|
||||
uint8_t& operator()(int I, int J);
|
||||
const uint8_t& operator()(int I, int J) const;
|
||||
uint8_t& operator[](long I);
|
||||
const uint8_t& operator[](long I) const;
|
||||
|
||||
|
||||
void clear();
|
||||
void setall(uint8_t val);
|
||||
|
||||
//rescales the image with linear interpolation
|
||||
int rescale(int _Nx, int _Ny);
|
||||
int rescale(int _Nx, int _Ny); //todo
|
||||
};
|
||||
|
||||
|
||||
|
@ -141,5 +141,330 @@ namespace ams
|
||||
}
|
||||
|
||||
|
||||
uint8_t amsbitplane::get(int I, int J) const
|
||||
{
|
||||
uint8_t ret = 0;
|
||||
if(I>=0 && I<Nx && J>=0 && J<Ny)
|
||||
{
|
||||
ret = data[I+Nx*J];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int amsbitplane::set(int I, int J, uint8_t val)
|
||||
{
|
||||
int ret = amsimage_success;
|
||||
if(I>=0 && I<Nx && J>=0 && J<Ny)
|
||||
{
|
||||
data[I+Nx*J] = val;
|
||||
}
|
||||
else
|
||||
ret = amsimage_failure;
|
||||
return ret;
|
||||
}
|
||||
|
||||
uint8_t& amsbitplane::at(int I, int J)
|
||||
{
|
||||
return data[I + Nx*J];
|
||||
}
|
||||
|
||||
const uint8_t& amsbitplane::at(int I, int J) const
|
||||
{
|
||||
return data[I + Nx*J];
|
||||
}
|
||||
|
||||
uint8_t& amsbitplane::operator()(int I, int J)
|
||||
{
|
||||
return data[I + Nx*J];
|
||||
}
|
||||
|
||||
const uint8_t& amsbitplane::operator()(int I, int J) const
|
||||
{
|
||||
return data[I + Nx*J];
|
||||
}
|
||||
|
||||
uint8_t& amsbitplane::operator[](long I)
|
||||
{
|
||||
return data[I];
|
||||
}
|
||||
|
||||
const uint8_t& amsbitplane::operator[](long I) const
|
||||
{
|
||||
return data[I];
|
||||
}
|
||||
|
||||
// Lots of Thread Functions //
|
||||
|
||||
void amsbitplane_transpose_tf(
|
||||
int threadnum,
|
||||
int nthreads,
|
||||
uint8_t *datato,
|
||||
const uint8_t *datafrom,
|
||||
int Nx, int Ny
|
||||
)
|
||||
{
|
||||
int64_t I,I0,I1,Is,N,Ia,Ib,Ix,Iy;
|
||||
N = Nx*Ny;
|
||||
Is = N/nthreads;
|
||||
I0 = (threadnum)*Is;
|
||||
I1 = (threadnum<nthreads-1) ? (threadnum+1)*Is : N;
|
||||
|
||||
for(I=I0;I<I1;I++)
|
||||
{
|
||||
Ix = I%Nx;
|
||||
Iy = I/Nx;
|
||||
Ia = Iy + Ny*Ix;
|
||||
Ib = Ix+Nx*Iy;
|
||||
|
||||
datato[Ia] = datafrom[Ib];
|
||||
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void amsbitplane_rotcw_tf(
|
||||
int threadnum,
|
||||
int nthreads,
|
||||
uint8_t *datato,
|
||||
const uint8_t *datafrom,
|
||||
int Nx, int Ny
|
||||
)
|
||||
{
|
||||
int64_t I,I0,I1,Is,N,Ia,Ib,Ix,Iy;
|
||||
N = Nx*Ny;
|
||||
Is = N/nthreads;
|
||||
I0 = (threadnum)*Is;
|
||||
I1 = (threadnum<nthreads-1) ? (threadnum+1)*Is : N;
|
||||
|
||||
for(I=I0;I<I1;I++)
|
||||
{
|
||||
Ix = I%Nx;
|
||||
Iy = I/Nx;
|
||||
Ia = Iy + Ny*Ix;
|
||||
Ib = Ix+Nx*(Ny-Iy-1);
|
||||
|
||||
datato[Ia] = datafrom[Ib];
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void amsbitplane_rotccw_tf(
|
||||
int threadnum,
|
||||
int nthreads,
|
||||
uint8_t *datato,
|
||||
const uint8_t *datafrom,
|
||||
int Nx, int Ny
|
||||
)
|
||||
{
|
||||
int64_t I,I0,I1,Is,N,Ia,Ib,Ix,Iy;
|
||||
N = Nx*Ny;
|
||||
Is = N/nthreads;
|
||||
I0 = (threadnum)*Is;
|
||||
I1 = (threadnum<nthreads-1) ? (threadnum+1)*Is : N;
|
||||
|
||||
for(I=I0;I<I1;I++)
|
||||
{
|
||||
Ix = I%Nx;
|
||||
Iy = I/Nx;
|
||||
Ia = Iy + Ny*Ix;
|
||||
Ib = (Nx-Ix-1)+Nx*Iy;
|
||||
|
||||
datato[Ia] = datafrom[Ib];
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void amsbitplane_flipx_tf(
|
||||
int threadnum,
|
||||
int nthreads,
|
||||
uint8_t *datato,
|
||||
const uint8_t *datafrom,
|
||||
int Nx, int Ny
|
||||
)
|
||||
{
|
||||
int64_t I,I0,I1,Is,N,Ia,Ib,Ix,Iy;
|
||||
N = Nx*Ny;
|
||||
Is = N/nthreads;
|
||||
I0 = (threadnum)*Is;
|
||||
I1 = (threadnum<nthreads-1) ? (threadnum+1)*Is : N;
|
||||
|
||||
for(I=I0;I<I1;I++)
|
||||
{
|
||||
Ix = I%Nx;
|
||||
Iy = I/Nx;
|
||||
Ia = Ix + Nx*Iy;
|
||||
Ib = (Nx-Ix-1)+Nx*Iy;
|
||||
|
||||
datato[Ia] = datafrom[Ib];
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void amsbitplane_flipy_tf(
|
||||
int threadnum,
|
||||
int nthreads,
|
||||
uint8_t *datato,
|
||||
const uint8_t *datafrom,
|
||||
int Nx, int Ny
|
||||
)
|
||||
{
|
||||
int64_t I,I0,I1,Is,N,Ia,Ib,Ix,Iy;
|
||||
N = Nx*Ny;
|
||||
Is = N/nthreads;
|
||||
I0 = (threadnum)*Is;
|
||||
I1 = (threadnum<nthreads-1) ? (threadnum+1)*Is : N;
|
||||
|
||||
for(I=I0;I<I1;I++)
|
||||
{
|
||||
Ix = I%Nx;
|
||||
Iy = I/Nx;
|
||||
Ia = Ix + Nx*Iy;
|
||||
Ib = Ix+Nx*(Ny-Iy-1);
|
||||
|
||||
datato[Ia] = datafrom[Ib];
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void amsbitplane_setall_tf(
|
||||
int threadnum,
|
||||
int nthreads,
|
||||
amsbitplane *img,
|
||||
const uint8_t val
|
||||
)
|
||||
{
|
||||
int64_t I,I0,I1,Is,N,Ix,Iy;
|
||||
|
||||
N = img->Nx*img->Ny;
|
||||
Is = N/nthreads; Is = (Is<1) ? 1 : Is;
|
||||
I0 = Is*threadnum;
|
||||
I1 = (threadnum<(nthreads-1)) ? Is*(threadnum+1) : N;
|
||||
|
||||
for(I=I0;I<I1;I++)
|
||||
{
|
||||
Ix = I%img->Nx;
|
||||
Iy = I/img->Nx;
|
||||
|
||||
img->data[Ix + img->Nx*Iy] = val;
|
||||
}
|
||||
}
|
||||
|
||||
// Methods again //
|
||||
|
||||
amsbitplane amsbitplane::subimage(int I0, int J0, int I1, int J1) const
|
||||
{
|
||||
amsbitplane ret;
|
||||
int _Nx,_Ny;
|
||||
_Nx = ((I1-I0) < 0) ? 0 : I1-I0;
|
||||
_Ny = ((J1-J0) < 0) ? 0 : J1-J0;
|
||||
|
||||
ret.resize(_Nx,_Ny);
|
||||
|
||||
imglib4::amsimage_plane_copy(
|
||||
ret.data, 0, 1, ret.Nx, ret.Ny,
|
||||
this->data, 0, 1, Nx,Ny,
|
||||
I0,J0
|
||||
);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
amsbitplane amsbitplane::transpose()
|
||||
{
|
||||
amsbitplane ret;
|
||||
int64_t N;
|
||||
|
||||
ret.resize(Ny,Nx);
|
||||
N = Nx*Ny;
|
||||
|
||||
imglib4::threaded_execute(
|
||||
amsbitplane_transpose_tf,
|
||||
N,
|
||||
ret.data,this->data,Nx,Ny
|
||||
);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
amsbitplane amsbitplane::rotcw()
|
||||
{
|
||||
amsbitplane ret;
|
||||
int64_t N;
|
||||
|
||||
ret.resize(Ny,Nx);
|
||||
N = Nx*Ny;
|
||||
|
||||
imglib4::threaded_execute(
|
||||
amsbitplane_rotcw_tf,
|
||||
N,
|
||||
ret.data,this->data,Nx,Ny
|
||||
);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
amsbitplane amsbitplane::rotccw()
|
||||
{
|
||||
amsbitplane ret;
|
||||
int64_t N;
|
||||
|
||||
ret.resize(Ny,Nx);
|
||||
N = Nx*Ny;
|
||||
|
||||
imglib4::threaded_execute(
|
||||
amsbitplane_rotccw_tf,
|
||||
N,
|
||||
ret.data,this->data,Nx,Ny
|
||||
);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
amsbitplane amsbitplane::flipx()
|
||||
{
|
||||
amsbitplane ret;
|
||||
int64_t N;
|
||||
|
||||
ret.resize(Nx,Ny);
|
||||
N = Nx*Ny;
|
||||
|
||||
imglib4::threaded_execute(
|
||||
amsbitplane_flipx_tf,
|
||||
N,
|
||||
ret.data,this->data,Nx,Ny
|
||||
);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
amsbitplane amsbitplane::flipy()
|
||||
{
|
||||
amsbitplane ret;
|
||||
int64_t N;
|
||||
|
||||
ret.resize(Nx,Ny);
|
||||
N = Nx*Ny;
|
||||
|
||||
imglib4::threaded_execute(
|
||||
amsbitplane_flipy_tf,
|
||||
N,
|
||||
ret.data,this->data,Nx,Ny
|
||||
);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void amsbitplane::setall(uint8_t val)
|
||||
{
|
||||
imglib4::threaded_execute(
|
||||
amsbitplane_setall_tf,
|
||||
this->Nx*this->Ny,
|
||||
this,
|
||||
val
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
};
|
Reference in New Issue
Block a user