updates
parent
09a83f8587
commit
1610fdecd0
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,90 @@
|
|||||||
|
#ifndef __AMSCPPIMGLIB4_INTLUTIL_HPP__
|
||||||
|
#define __AMSCPPIMGLIB4_INTLUTIL_HPP__
|
||||||
|
|
||||||
|
namespace ams
|
||||||
|
{
|
||||||
|
namespace imglib4
|
||||||
|
{
|
||||||
|
|
||||||
|
//A template function that takes as input a function pointer and a series of arguments
|
||||||
|
//The function is executed with fptr(threadnum, nthreads, otherargs...) with a certain number of threads
|
||||||
|
//psize must be supplied to determine whether to execute in threaded mode or not.
|
||||||
|
template<typename callable, typename ... argst> int threaded_execute(callable &&fptr, int64_t psize, argst&&... args)
|
||||||
|
{
|
||||||
|
int ret = amsimage_success;
|
||||||
|
int nthreads;
|
||||||
|
int I;
|
||||||
|
std::vector<std::thread*> threads;
|
||||||
|
|
||||||
|
if(psize<amsimage_threadpsz)
|
||||||
|
{
|
||||||
|
nthreads = 1;
|
||||||
|
I = 0;
|
||||||
|
fptr(I,nthreads,std::forward<argst>(args)...);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nthreads = std::thread::hardware_concurrency(); //number of cpu cores the system thinks you have
|
||||||
|
nthreads = (nthreads<=0) ? 1 : nthreads;
|
||||||
|
nthreads = (nthreads>amsimage_maxthreads) ? amsimage_maxthreads : nthreads;
|
||||||
|
threads.resize(nthreads);
|
||||||
|
for(I=0;I<nthreads;I++) threads[I] = NULL;
|
||||||
|
for(I=0;I<nthreads;I++)
|
||||||
|
{
|
||||||
|
threads[I] = new(std::nothrow) std::thread
|
||||||
|
(
|
||||||
|
std::forward<callable>(fptr),
|
||||||
|
I,
|
||||||
|
nthreads,
|
||||||
|
std::forward<argst>(args)...
|
||||||
|
);
|
||||||
|
}
|
||||||
|
for(I=0;I<nthreads;I++)
|
||||||
|
{
|
||||||
|
if(threads[I]==NULL)
|
||||||
|
{ //null thread creation failure check
|
||||||
|
//printf("debug check!\n");
|
||||||
|
ret = amsimage_failure;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(I=0;I<nthreads;I++)
|
||||||
|
{
|
||||||
|
if(threads[I]!=NULL)
|
||||||
|
{
|
||||||
|
threads[I]->join();
|
||||||
|
delete threads[I];
|
||||||
|
threads[I] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void amsimage_region_copy(
|
||||||
|
uint8_t *datato,
|
||||||
|
int Nxto,
|
||||||
|
int Nyto,
|
||||||
|
const uint8_t *datafrom,
|
||||||
|
int Nxfrom,
|
||||||
|
int Nyfrom,
|
||||||
|
int offsetx,
|
||||||
|
int offsety
|
||||||
|
);
|
||||||
|
|
||||||
|
void amsimage_region_set(
|
||||||
|
uint8_t *data,
|
||||||
|
int Nx, int Ny,
|
||||||
|
int x0, int y0,
|
||||||
|
int x1, int y1,
|
||||||
|
amspixel val
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}; //end namespace imglib4
|
||||||
|
}; //end namespace ams
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,11 @@
|
|||||||
|
#ifndef __AMSCPPIMGLIB4_TESTS_HPP__
|
||||||
|
#define __AMSCPPIMGLIB4_TESTS_HPP__
|
||||||
|
|
||||||
|
namespace ams
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
}; //end namespace ams
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,8 @@
|
|||||||
|
#include <amscppimglib4/amscppimglib4.hpp>
|
||||||
|
|
||||||
|
namespace ams
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
};
|
@ -0,0 +1,461 @@
|
|||||||
|
#include <amscppimglib4/amscppimglib4.hpp>
|
||||||
|
#include <amscppimglib4/amscppimglib4_intlutil.hpp>
|
||||||
|
|
||||||
|
namespace ams
|
||||||
|
{
|
||||||
|
|
||||||
|
amsimage::amsimage() : Nx(0), Ny(0),data(NULL),width(Nx),height(Ny)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
amsimage::~amsimage()
|
||||||
|
{
|
||||||
|
Nx = 0;
|
||||||
|
Ny = 0;
|
||||||
|
if(data!=NULL) {delete[] data; data=NULL;}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int amsimage::resize(int _Nx, int _Ny)
|
||||||
|
{
|
||||||
|
int ret = amsimage_success;
|
||||||
|
|
||||||
|
uint8_t *newdata = NULL;
|
||||||
|
|
||||||
|
_Nx = (_Nx<0) ? 0 : _Nx;
|
||||||
|
_Ny = (_Ny<0) ? 0 : _Ny;
|
||||||
|
|
||||||
|
if(_Nx == Nx && _Ny == Ny)
|
||||||
|
{
|
||||||
|
return ret; //no resize necessary
|
||||||
|
}
|
||||||
|
|
||||||
|
if(_Nx==0 || _Ny == 0)
|
||||||
|
{
|
||||||
|
//zero size image
|
||||||
|
if(data!=NULL) {delete[] data; data=NULL;}
|
||||||
|
Nx = 0;
|
||||||
|
Ny = 0;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
newdata = new(std::nothrow) uint8_t[4*_Nx*_Ny];
|
||||||
|
if(newdata==NULL)
|
||||||
|
{
|
||||||
|
ret = amsimage_failure;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
imglib4::amsimage_region_set(
|
||||||
|
newdata,
|
||||||
|
_Nx,_Ny,
|
||||||
|
0,0,_Nx,_Ny,
|
||||||
|
amspixel(0,0,0,0)
|
||||||
|
);
|
||||||
|
|
||||||
|
if(data!=NULL)
|
||||||
|
{
|
||||||
|
imglib4::amsimage_region_copy(
|
||||||
|
newdata,
|
||||||
|
_Nx,_Ny,
|
||||||
|
data,
|
||||||
|
Nx,Ny,
|
||||||
|
0,0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(data!=NULL) {delete[] data; data=NULL;}
|
||||||
|
data = newdata;
|
||||||
|
Nx = _Nx;
|
||||||
|
Ny = _Ny;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
amsimage::amsimage(const amsimage& other) :
|
||||||
|
Nx(0), Ny(0),data(NULL),width(Nx),height(Ny)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
// Nx = 0;
|
||||||
|
// Ny = 0;
|
||||||
|
// data = NULL;
|
||||||
|
|
||||||
|
if(this!=&other)
|
||||||
|
{
|
||||||
|
res = this->resize(other.Nx,other.Ny);
|
||||||
|
if(res==amsimage_success)
|
||||||
|
{
|
||||||
|
imglib4::amsimage_region_copy(
|
||||||
|
data, Nx, Ny,
|
||||||
|
other.data, other.Nx, other.Ny,
|
||||||
|
0,0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
amsimage::amsimage(amsimage&& other) noexcept :
|
||||||
|
Nx(0), Ny(0),data(NULL),width(Nx),height(Ny)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
// Nx = 0;
|
||||||
|
// Ny = 0;
|
||||||
|
// data = NULL;
|
||||||
|
|
||||||
|
if(this!=&other)
|
||||||
|
{
|
||||||
|
this->Nx = other.Nx;
|
||||||
|
this->Ny = other.Ny;
|
||||||
|
this->data = other.data;
|
||||||
|
|
||||||
|
other.Nx = 0;
|
||||||
|
other.Ny = 0;
|
||||||
|
other.data = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
amsimage& amsimage::operator=(const amsimage& other)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
|
||||||
|
if(this!=&other)
|
||||||
|
{
|
||||||
|
res = this->resize(other.Nx,other.Ny);
|
||||||
|
if(res==amsimage_success)
|
||||||
|
{
|
||||||
|
imglib4::amsimage_region_copy(
|
||||||
|
data, Nx, Ny,
|
||||||
|
other.data, other.Nx, other.Ny,
|
||||||
|
0,0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
amsimage& amsimage::operator=(amsimage&& other) noexcept
|
||||||
|
{
|
||||||
|
if(this!=&other)
|
||||||
|
{
|
||||||
|
if(this->data!=NULL) {delete[] this->data; this->data=NULL;}
|
||||||
|
this->Nx = 0;
|
||||||
|
this->Ny = 0;
|
||||||
|
|
||||||
|
this->Nx = other.Nx;
|
||||||
|
this->Ny = other.Ny;
|
||||||
|
this->data = other.data;
|
||||||
|
|
||||||
|
other.Nx = 0;
|
||||||
|
other.Ny = 0;
|
||||||
|
other.data = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
amsimage amsimage::subimage(int I0, int J0, int I1, int J1) const
|
||||||
|
{
|
||||||
|
amsimage ret;
|
||||||
|
int _Nx,_Ny;
|
||||||
|
_Nx = ((I1-I0) < 0) ? 0 : I1-I0;
|
||||||
|
_Ny = ((J1-J0) < 0) ? 0 : J1-J0;
|
||||||
|
|
||||||
|
ret.resize(_Nx,_Ny);
|
||||||
|
|
||||||
|
imglib4::amsimage_region_copy(
|
||||||
|
ret.data, ret.Nx, ret.Ny,
|
||||||
|
this->data, Nx,Ny,
|
||||||
|
I0,J0
|
||||||
|
);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void amsimage_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[0 + 4*Ia] = datafrom[0 + 4*Ib];
|
||||||
|
datato[1 + 4*Ia] = datafrom[1 + 4*Ib];
|
||||||
|
datato[2 + 4*Ia] = datafrom[2 + 4*Ib];
|
||||||
|
datato[3 + 4*Ia] = datafrom[3 + 4*Ib];
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
amsimage amsimage::transpose() const
|
||||||
|
{
|
||||||
|
amsimage ret;
|
||||||
|
int64_t N;
|
||||||
|
|
||||||
|
ret.resize(Ny,Nx);
|
||||||
|
N = Nx*Ny;
|
||||||
|
|
||||||
|
imglib4::threaded_execute(
|
||||||
|
amsimage_transpose_tf,
|
||||||
|
N,
|
||||||
|
ret.data,this->data,Nx,Ny
|
||||||
|
);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void amsimage_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[0 + 4*Ia] = datafrom[0 + 4*Ib];
|
||||||
|
datato[1 + 4*Ia] = datafrom[1 + 4*Ib];
|
||||||
|
datato[2 + 4*Ia] = datafrom[2 + 4*Ib];
|
||||||
|
datato[3 + 4*Ia] = datafrom[3 + 4*Ib];
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
amsimage amsimage::rotcw() const
|
||||||
|
{
|
||||||
|
amsimage ret;
|
||||||
|
int64_t N;
|
||||||
|
|
||||||
|
ret.resize(Ny,Nx);
|
||||||
|
N = Nx*Ny;
|
||||||
|
|
||||||
|
imglib4::threaded_execute(
|
||||||
|
amsimage_rotcw_tf,
|
||||||
|
N,
|
||||||
|
ret.data,this->data,Nx,Ny
|
||||||
|
);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void amsimage_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[0 + 4*Ia] = datafrom[0 + 4*Ib];
|
||||||
|
datato[1 + 4*Ia] = datafrom[1 + 4*Ib];
|
||||||
|
datato[2 + 4*Ia] = datafrom[2 + 4*Ib];
|
||||||
|
datato[3 + 4*Ia] = datafrom[3 + 4*Ib];
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
amsimage amsimage::rotccw() const
|
||||||
|
{
|
||||||
|
amsimage ret;
|
||||||
|
int64_t N;
|
||||||
|
|
||||||
|
ret.resize(Ny,Nx);
|
||||||
|
N = Nx*Ny;
|
||||||
|
|
||||||
|
imglib4::threaded_execute(
|
||||||
|
amsimage_rotccw_tf,
|
||||||
|
N,
|
||||||
|
ret.data,this->data,Nx,Ny
|
||||||
|
);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void amsimage_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[0 + 4*Ia] = datafrom[0 + 4*Ib];
|
||||||
|
datato[1 + 4*Ia] = datafrom[1 + 4*Ib];
|
||||||
|
datato[2 + 4*Ia] = datafrom[2 + 4*Ib];
|
||||||
|
datato[3 + 4*Ia] = datafrom[3 + 4*Ib];
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
amsimage amsimage::flipx() const
|
||||||
|
{
|
||||||
|
amsimage ret;
|
||||||
|
int64_t N;
|
||||||
|
|
||||||
|
ret.resize(Nx,Ny);
|
||||||
|
N = Nx*Ny;
|
||||||
|
|
||||||
|
imglib4::threaded_execute(
|
||||||
|
amsimage_flipx_tf,
|
||||||
|
N,
|
||||||
|
ret.data,this->data,Nx,Ny
|
||||||
|
);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void amsimage_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[0 + 4*Ia] = datafrom[0 + 4*Ib];
|
||||||
|
datato[1 + 4*Ia] = datafrom[1 + 4*Ib];
|
||||||
|
datato[2 + 4*Ia] = datafrom[2 + 4*Ib];
|
||||||
|
datato[3 + 4*Ia] = datafrom[3 + 4*Ib];
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
amsimage amsimage::flipy() const
|
||||||
|
{
|
||||||
|
amsimage ret;
|
||||||
|
int64_t N;
|
||||||
|
|
||||||
|
ret.resize(Nx,Ny);
|
||||||
|
N = Nx*Ny;
|
||||||
|
|
||||||
|
imglib4::threaded_execute(
|
||||||
|
amsimage_flipy_tf,
|
||||||
|
N,
|
||||||
|
ret.data,this->data,Nx,Ny
|
||||||
|
);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
amspixel amsimage::get_pixel(int I,int J) const
|
||||||
|
{
|
||||||
|
amspixel ret;
|
||||||
|
if(I>=0 && I<Nx && J>=0 && J<Ny)
|
||||||
|
{
|
||||||
|
ret.R = data[0 + 4*(I + Nx*J)];
|
||||||
|
ret.G = data[1 + 4*(I + Nx*J)];
|
||||||
|
ret.B = data[2 + 4*(I + Nx*J)];
|
||||||
|
ret.A = data[3 + 4*(I + Nx*J)];
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int amsimage::set_pixel(int I,int J,const amspixel pix)
|
||||||
|
{
|
||||||
|
int ret = amsimage_failure;
|
||||||
|
if(I>=0 && I<Nx && J>=0 && J<Ny)
|
||||||
|
{
|
||||||
|
ret = amsimage_success;
|
||||||
|
data[0 + 4*(I + Nx*J)] = pix.R;
|
||||||
|
data[1 + 4*(I + Nx*J)] = pix.G;
|
||||||
|
data[2 + 4*(I + Nx*J)] = pix.B;
|
||||||
|
data[3 + 4*(I + Nx*J)] = pix.A;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int amsimage::set_pixel(int I,int J,uint8_t R, uint8_t G, uint8_t B, uint8_t A)
|
||||||
|
{
|
||||||
|
return this->set_pixel(I,J,amspixel(R,G,B,A));
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t& amsimage::operator[](int ind)
|
||||||
|
{
|
||||||
|
return data[ind];
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint8_t& amsimage::operator[](int ind) const
|
||||||
|
{
|
||||||
|
return data[ind];
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t& amsimage::operator()(int Nc, int I, int J)
|
||||||
|
{
|
||||||
|
return data[Nc + 4*(I + Nx*J)];
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint8_t& amsimage::operator()(int Nc, int I, int J) const
|
||||||
|
{
|
||||||
|
return data[Nc + 4*(I + Nx*J)];
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
@ -0,0 +1,37 @@
|
|||||||
|
#include <amscppimglib4/amscppimglib4.hpp>
|
||||||
|
|
||||||
|
namespace ams
|
||||||
|
{
|
||||||
|
|
||||||
|
amspixel::amspixel()
|
||||||
|
{
|
||||||
|
R = 0; G = 0; B = 0; A = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
amspixel::amspixel(uint8_t _R ,uint8_t _G, uint8_t _B, uint8_t _A)
|
||||||
|
{
|
||||||
|
R = _R; G = _G; B = _B; A = _A;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t& amspixel::operator[](const int ind)
|
||||||
|
{
|
||||||
|
if(ind==0) return R;
|
||||||
|
if(ind==1) return G;
|
||||||
|
if(ind==2) return B;
|
||||||
|
if(ind==3) return A;
|
||||||
|
return A;
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint8_t& amspixel::operator[](const int ind) const
|
||||||
|
{
|
||||||
|
if(ind==0) return R;
|
||||||
|
if(ind==1) return G;
|
||||||
|
if(ind==2) return B;
|
||||||
|
if(ind==3) return A;
|
||||||
|
return A;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
@ -0,0 +1,169 @@
|
|||||||
|
#include <amscppimglib4/amscppimglib4.hpp>
|
||||||
|
#include <amscppimglib4/amscppimglib4_intlutil.hpp>
|
||||||
|
|
||||||
|
namespace ams
|
||||||
|
{
|
||||||
|
namespace imglib4
|
||||||
|
{
|
||||||
|
|
||||||
|
void amsimage_region_copy_tf(
|
||||||
|
int threadnum,
|
||||||
|
int nthreads,
|
||||||
|
uint8_t *datato,
|
||||||
|
int Nxto,
|
||||||
|
int Nyto,
|
||||||
|
const uint8_t *datafrom,
|
||||||
|
int Nxfrom,
|
||||||
|
int Nyfrom,
|
||||||
|
int offsetx,
|
||||||
|
int offsety
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int64_t I,I0,I1,Is,N,Ix,Iy;
|
||||||
|
int dx,dy;
|
||||||
|
|
||||||
|
dx = Nxfrom;
|
||||||
|
dx = (dx>(Nxto-offsetx)) ? (Nxto-offsetx) : dx;
|
||||||
|
dx = (dx<0) ? 0 : dx;
|
||||||
|
|
||||||
|
dy = Nyfrom;
|
||||||
|
dy = (dy>(Nyto-offsety)) ? (Nyto-offsety) : dy;
|
||||||
|
dy = (dy<0) ? 0 : dy;
|
||||||
|
|
||||||
|
N = dx*dy;
|
||||||
|
|
||||||
|
Is = N/nthreads;
|
||||||
|
I0 = (threadnum)*Is;
|
||||||
|
I1 = (threadnum<nthreads-1) ? (threadnum+1)*Is : N;
|
||||||
|
|
||||||
|
for(I=I0;I<I1;I++)
|
||||||
|
{
|
||||||
|
Ix = I%dx;
|
||||||
|
Iy = I/dx;
|
||||||
|
|
||||||
|
datato[0 + 4*(Ix+offsetx) + 4*Nxto*(Iy+offsety)] =
|
||||||
|
datafrom[0 + 4*Ix + 4*Nxfrom*Iy];
|
||||||
|
|
||||||
|
datato[1 + 4*(Ix+offsetx) + 4*Nxto*(Iy+offsety)] =
|
||||||
|
datafrom[1 + 4*Ix + 4*Nxfrom*Iy];
|
||||||
|
|
||||||
|
datato[2 + 4*(Ix+offsetx) + 4*Nxto*(Iy+offsety)] =
|
||||||
|
datafrom[2 + 4*Ix + 4*Nxfrom*Iy];
|
||||||
|
|
||||||
|
datato[3 + 4*(Ix+offsetx) + 4*Nxto*(Iy+offsety)] =
|
||||||
|
datafrom[3 + 4*Ix + 4*Nxfrom*Iy];
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void amsimage_region_copy(
|
||||||
|
uint8_t *datato,
|
||||||
|
int Nxto,
|
||||||
|
int Nyto,
|
||||||
|
const uint8_t *datafrom,
|
||||||
|
int Nxfrom,
|
||||||
|
int Nyfrom,
|
||||||
|
int offsetx,
|
||||||
|
int offsety
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int dx,dy;
|
||||||
|
int64_t N;
|
||||||
|
|
||||||
|
if(datato==NULL) return;
|
||||||
|
if(datafrom==NULL) return;
|
||||||
|
|
||||||
|
dx = Nxfrom;
|
||||||
|
dx = (dx>(Nxto-offsetx)) ? (Nxto-offsetx) : dx;
|
||||||
|
dx = (dx<0) ? 0 : dx;
|
||||||
|
|
||||||
|
dy = Nyfrom;
|
||||||
|
dy = (dy>(Nyto-offsety)) ? (Nyto-offsety) : dy;
|
||||||
|
dy = (dy<0) ? 0 : dy;
|
||||||
|
|
||||||
|
N = dx*dy;
|
||||||
|
|
||||||
|
threaded_execute(
|
||||||
|
amsimage_region_copy_tf,
|
||||||
|
N,
|
||||||
|
datato,
|
||||||
|
Nxto,Nyto,
|
||||||
|
datafrom,
|
||||||
|
Nxfrom,Nyfrom,
|
||||||
|
offsetx,offsety
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void amsimage_region_set_tf(
|
||||||
|
int threadnum,
|
||||||
|
int nthreads,
|
||||||
|
uint8_t *data,
|
||||||
|
int Nx, int Ny,
|
||||||
|
int x0, int y0,
|
||||||
|
int x1, int y1,
|
||||||
|
amspixel val
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int64_t I,I0,I1,Is,N,Ix,Iy;
|
||||||
|
int dx,dy;
|
||||||
|
|
||||||
|
dx = (x1-x0); dy = (y1-y0);
|
||||||
|
dx = (dx<0) ? 0 : dx;
|
||||||
|
dy = (dy<0) ? 0 : dy;
|
||||||
|
N = dx*dy;
|
||||||
|
|
||||||
|
Is = N/nthreads;
|
||||||
|
I0 = (threadnum)*Is;
|
||||||
|
I1 = (threadnum<nthreads-1) ? (threadnum+1)*Is : N;
|
||||||
|
|
||||||
|
for(I=I0;I<I1;I++)
|
||||||
|
{
|
||||||
|
Ix = I%dx;
|
||||||
|
Iy = I/dx;
|
||||||
|
|
||||||
|
data[0 + 4*(Ix+x0) + 4*Nx*(Iy+y0)] = val.R;
|
||||||
|
data[1 + 4*(Ix+x0) + 4*Nx*(Iy+y0)] = val.G;
|
||||||
|
data[2 + 4*(Ix+x0) + 4*Nx*(Iy+y0)] = val.B;
|
||||||
|
data[3 + 4*(Ix+x0) + 4*Nx*(Iy+y0)] = val.A;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void amsimage_region_set(
|
||||||
|
uint8_t *data,
|
||||||
|
int Nx, int Ny,
|
||||||
|
int x0, int y0,
|
||||||
|
int x1, int y1,
|
||||||
|
amspixel val
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int dx,dy;
|
||||||
|
int64_t N;
|
||||||
|
|
||||||
|
if(data==NULL) return;
|
||||||
|
|
||||||
|
dx = (x1-x0); dy = (y1-y0);
|
||||||
|
dx = (dx<0) ? 0 : dx;
|
||||||
|
dy = (dy<0) ? 0 : dy;
|
||||||
|
N = dx*dy;
|
||||||
|
|
||||||
|
threaded_execute(
|
||||||
|
amsimage_region_set_tf,
|
||||||
|
N,
|
||||||
|
data, Nx,Ny,
|
||||||
|
x0, y0, x1, y1,
|
||||||
|
val
|
||||||
|
);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}; //end namespace imglib4
|
||||||
|
}; //end namespace ams
|
@ -0,0 +1,8 @@
|
|||||||
|
#include <amscppimglib4/amscppimglib4.hpp>
|
||||||
|
|
||||||
|
namespace ams
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
};
|
@ -0,0 +1,20 @@
|
|||||||
|
#include <amscppimglib4/amscppimglib4.hpp>
|
||||||
|
|
||||||
|
namespace ams
|
||||||
|
{
|
||||||
|
|
||||||
|
void amscppimglib_test1()
|
||||||
|
{
|
||||||
|
amsimage img1, img2;
|
||||||
|
|
||||||
|
img1.resize(1000,2000);
|
||||||
|
printf("img1:(%d,%d)\n",img1.width,img1.height);
|
||||||
|
|
||||||
|
img2 = img1.transpose();
|
||||||
|
img2 = img1.transpose().flipx();
|
||||||
|
printf("img1:(%d,%d)\n",img2.width,img2.height);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
@ -1,12 +0,0 @@
|
|||||||
#include <amscppimglib4/amscppimglib4.hpp>
|
|
||||||
|
|
||||||
namespace ams
|
|
||||||
{
|
|
||||||
|
|
||||||
void amscpptemplate_testfn2()
|
|
||||||
{
|
|
||||||
printf("Test function 2.\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
@ -1,12 +0,0 @@
|
|||||||
#include <amscppimglib4/amscppimglib4.hpp>
|
|
||||||
|
|
||||||
namespace ams
|
|
||||||
{
|
|
||||||
|
|
||||||
void amscpptemplate_testfn()
|
|
||||||
{
|
|
||||||
printf("Test function.\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
@ -1,9 +1,12 @@
|
|||||||
#include <amscppimglib4/amscppimglib4.hpp>
|
#include <amscppimglib4/amscppimglib4.hpp>
|
||||||
|
|
||||||
|
using namespace ams;
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
printf("ams c++ image library tests.\n");
|
|
||||||
ams::amscpptemplate_testfn();
|
amscppimglib_test1();
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
Loading…
Reference in New Issue