updating bitplane

master
Aaron 2 days ago
parent 4d1dba8e42
commit 90a477213f

@ -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;
}
};
Loading…
Cancel
Save