This commit is contained in:
2025-06-12 19:53:53 -04:00
parent 13cda6c99b
commit 92169317f2
28 changed files with 316 additions and 36 deletions
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.
+5 -5
View File
@@ -149,15 +149,16 @@ namespace ams
const uint8_t& operator[](long I) const; const uint8_t& operator[](long I) const;
float getf(int x, int y) const; float getf(int x, int y) const;
int setf(int x, int y, float f) const; int setf(int x, int y, float f);
float interpolate(int x, int y); float interpolate(float x, float y) const;
int apply_bitplane(int x0, int y0, const amsbitplane *bp);
void clear(); void clear();
void setall(uint8_t val); void setall(uint8_t val);
//rescales the image with linear interpolation //rescales the image with linear interpolation
amsbitplane rescale(int _Nx, int _Ny); //todo amsbitplane rescale(int _Nx, int _Ny);
}; };
class amsfloatimage class amsfloatimage
@@ -200,10 +201,9 @@ namespace ams
void clear(); void clear();
void setall(amsfloatpixel color); void setall(amsfloatpixel color);
//don't implement this yet
amsfloatpixel interpolate(float x, float y) const; amsfloatpixel interpolate(float x, float y) const;
// //rescales the image with linear interpolation //rescales the image with linear interpolation
amsfloatimage rescale(int nnx, int nny); amsfloatimage rescale(int nnx, int nny);
//addition/subtraction/scaling operators? //addition/subtraction/scaling operators?
@@ -41,6 +41,7 @@ template<typename callable, typename ... argst> int threaded_execute(callable &&
} }
for(I=0;I<nthreads;I++) for(I=0;I<nthreads;I++)
{ {
if(threads[I]==NULL) if(threads[I]==NULL)
{ //null thread creation failure check { //null thread creation failure check
//printf("debug check!\n"); //printf("debug check!\n");
@@ -7,6 +7,9 @@ namespace ams
void amscppimglib4_test2(); void amscppimglib4_test2();
void amscppimglib4_test3(); void amscppimglib4_test3();
void amscppimglib4_bitplane_alloc_tests();
void amscppimglib4_image_alloc_tests();
}; //end namespace ams }; //end namespace ams
+208 -1
View File
@@ -125,6 +125,7 @@ namespace ams
if(data!=NULL) if(data!=NULL)
{ {
imglib4::amsimage_plane_copy( imglib4::amsimage_plane_copy(
newdata,0,1,_Nx,_Ny, newdata,0,1,_Nx,_Ny,
data,0,1,Nx,Ny, data,0,1,Nx,Ny,
@@ -465,6 +466,212 @@ namespace ams
return; return;
} }
void amsbitplane::clear()
{
this->setall(0);
}
float amsbitplane::getf(int x, int y) const
{
float ret = 0.0f;
int p;
p = get(x,y);
ret = (float)p/255.0;
return ret;
}
int amsbitplane::setf(int x, int y, float f)
{
int ret = amsimage_failure;
int p;
if(x>=0 && x<Nx && y>=0 && y<Ny)
{
ret = amsimage_success;
p = (int)(f*255.0);
if(p<0) p = 0;
if(p>255) p = 255;
set(x,y,p);
}
return ret;
}
float amsbitplane::interpolate(float x, float y) const
{
float ret = 0.0f;
float Nxf,Nyf;
//just do simple (0,N-1) interpolation for now
int xi,yi,xip,yip;
float xif,yif,xr,yr;
float w00,w01,w10,w11;
float p00,p01,p10,p11;
Nxf = (float)Nx;
Nyf = (float)Ny;
if(x>-0.5 && x<Nxf-0.5 && y>-0.5 && y<Nyf-0.5)
{
xr = imglib4::mod(x,1.0f);
yr = imglib4::mod(y,1.0f);
xif = x - xr;
yif = y - yr;
if(xif<0.0f) {xr = 1.0f;}
if(xif>=(Nxf-1.0f)) {xr = 0.0f;}
if(yif<0.0f) {yr = 1.0;}
if(yif>=(Nyf-1.0f)) {yr = 0.0f;}
xi = (int)xif;
yi = (int)yif;
w00 = (1.0-xr)*(1.0-yr);
w10 = (xr)*(1.0-yr);
w01 = (1.0-xr)*(yr);
w11 = (xr)*(yr);
xip = xi + 1;
yip = yi + 1;
if(xi<0) xi = 0;
if(xi>Nx-1) xi = Nx-1;
if(yi<0) yi = 0;
if(yi>Ny-1) yi = Ny-1;
if(xip>Nx-1) xip = Nx-1;
if(yip>Ny-1) yip = Ny-1;
p00 = getf(xi,yi);
p10 = getf(xip,yi);
p01 = getf(xi,yip);
p11 = getf(xip,yip);
ret = p00*w00 + p10*w10 + p01*w01 + p11*w11;
}
return ret;
}
void amsbitplane_rescale_tf(
int threadnum,
int nthreads,
amsbitplane *imgto,
const amsbitplane *imgfrom
)
{
int Nx = imgto->Nx;
int Ny = imgto->Ny;
int64_t I,I0,I1,Is,N,Ix,Iy;
float p;
int xs,ys;
N = Nx*Ny;
Is = N/nthreads; if(Is<1) Is = 1;
I0 = threadnum*Is;
I1 = (threadnum<nthreads-1) ? (threadnum+1)*Is : N;
for(I=I0;I<I1;I++)
{
Ix = I%Nx;
Iy = I/Nx;
xs = (float)Ix*((float)(imgfrom->Nx-1))/((float)(imgto->Nx-1));
ys = (float)Iy*((float)(imgfrom->Ny-1))/((float)(imgto->Ny-1));
p = imgfrom->interpolate(xs,ys);
imgto->setf(Ix,Iy,p);
}
}
amsbitplane amsbitplane::rescale(int nnx, int nny)
{
amsbitplane ret;
int res;
res = ret.resize(nnx,nny);
if(res!=amsimage_success)
{
printf("amsimage::rescale: error, could not allocate return image.\n");
return ret;
}
imglib4::threaded_execute(
amsbitplane_rescale_tf, nnx*nny,
&ret,this
);
return ret;
}
void amsimage_apply_bitplane_tf(
int threadnum,
int nthreads,
amsbitplane *imgto,
const amsbitplane *imgfrom,
int x0, int y0
)
{
int dx,dy;
int64_t N;
int64_t I,I0,I1,Is,Ix,Iy,Ia,Ib;
uint8_t v1,v2;
dx = (imgfrom->Nx < (imgto->Nx-x0)) ? imgfrom->Nx : imgto->Nx-x0;
dx = (dx<0) ? 0 : dx;
dy = (imgfrom->Ny < (imgto->Ny-y0)) ? imgfrom->Ny : imgto->Ny-y0;
dy = (dy<0) ? 0 : dy;
N = dx*dy;
Is = N/nthreads; if(Is<1) Is=1;
I0 = threadnum*Is;
I1 = (threadnum<nthreads-1) ? (threadnum+1)*Is : N;
for(I=I0;I<I1;I++)
{
Ix = I%dx;
Iy = I/dx;
Ia = (Ix + x0) + (Iy + y0)*imgto->Ny;
Ib = Ix + Iy*imgfrom->Ny;
v1 = imgto->data[Ia];
v2 = imgfrom->data[Ib];
if(v1<v2)
imgto->data[Ia] = v2;
}
return;
}
int amsbitplane::apply_bitplane(int x0, int y0, const amsbitplane *bp)
{
int ret = amsimage_success;
int dx,dy;
int64_t N;
if(bp==NULL)
{
ret = amsimage_failure;
return ret;
}
dx = (bp->Nx < (this->Nx-x0)) ? bp->Nx : this->Nx-x0;
dx = (dx<0) ? 0 : dx;
dy = (bp->Ny < (this->Ny-y0)) ? bp->Ny : this->Ny-y0;
dy = (dy<0) ? 0 : dy;
N = dx*dy;
imglib4::threaded_execute(
amsimage_apply_bitplane_tf, N,
this,bp,x0,y0
);
return ret;
}
};
}; //end namespace ams
@@ -673,7 +673,7 @@ namespace ams
float Nxf,Nyf; float Nxf,Nyf;
//just do simple (0,N-1) interpolation for now //just do simple (0,N-1) interpolation for now
int xi,yi; int xi,yi,xip,yip;
float xif,yif,xr,yr; float xif,yif,xr,yr;
float w00,w01,w10,w11; float w00,w01,w10,w11;
amsfloatpixel p00,p01,p10,p11; amsfloatpixel p00,p01,p10,p11;
@@ -698,15 +698,19 @@ namespace ams
w01 = (1.0-xr)*(yr); w01 = (1.0-xr)*(yr);
w11 = (xr)*(yr); w11 = (xr)*(yr);
xip = xi + 1;
yip = yi + 1;
if(xi<0) xi = 0; if(xi<0) xi = 0;
if(xi>Nx-2) xi = Nx-2; if(xi>Nx-1) xi = Nx-1;
if(yi<0) yi = 0; if(yi<0) yi = 0;
if(yi>Ny-2) yi = Ny-2; if(yi>Ny-1) yi = Ny-1;
if(xip>Nx-1) xip = Nx-1;
if(yip>Ny-1) yip = Ny-1;
p00 = get_pixel(xi,yi); p00 = get_pixel(xi,yi);
p10 = get_pixel(xi+1,yi); p10 = get_pixel(xip,yi);
p01 = get_pixel(xi,yi+1); p01 = get_pixel(xi,yip);
p11 = get_pixel(xi+1,yi+1); p11 = get_pixel(xip,yip);
ret = p00*w00 + p10*w10 + p01*w01 + p11*w11; ret = p00*w00 + p10*w10 + p01*w01 + p11*w11;
} }
@@ -714,6 +718,8 @@ namespace ams
return ret; return ret;
} }
void amsfloatimage_rescale_tf( void amsfloatimage_rescale_tf(
int threadnum, int threadnum,
int nthreads, int nthreads,
+10 -6
View File
@@ -848,7 +848,7 @@ namespace ams
float Nxf,Nyf; float Nxf,Nyf;
//just do simple (0,N-1) interpolation for now //just do simple (0,N-1) interpolation for now
int xi,yi; int xi,yi,xip,yip;
float xif,yif,xr,yr; float xif,yif,xr,yr;
float w00,w01,w10,w11; float w00,w01,w10,w11;
amsfloatpixel p00,p01,p10,p11; amsfloatpixel p00,p01,p10,p11;
@@ -873,15 +873,19 @@ namespace ams
w01 = (1.0-xr)*(yr); w01 = (1.0-xr)*(yr);
w11 = (xr)*(yr); w11 = (xr)*(yr);
xip = xi + 1;
yip = yi + 1;
if(xi<0) xi = 0; if(xi<0) xi = 0;
if(xi>Nx-2) xi = Nx-2; if(xi>Nx-1) xi = Nx-1;
if(yi<0) yi = 0; if(yi<0) yi = 0;
if(yi>Ny-2) yi = Ny-2; if(yi>Ny-1) yi = Ny-1;
if(xip>Nx-1) xip = Nx-1;
if(yip>Ny-1) yip = Ny-1;
p00 = get_fpixel(xi,yi); p00 = get_fpixel(xi,yi);
p10 = get_fpixel(xi+1,yi); p10 = get_fpixel(xip,yi);
p01 = get_fpixel(xi,yi+1); p01 = get_fpixel(xi,yip);
p11 = get_fpixel(xi+1,yi+1); p11 = get_fpixel(xip,yip);
ret = p00*w00 + p10*w10 + p01*w01 + p11*w11; ret = p00*w00 + p10*w10 + p01*w01 + p11*w11;
} }
+14 -18
View File
@@ -19,7 +19,7 @@ namespace imglib4
int offsety int offsety
) )
{ {
int64_t I,I0,I1,Is,N,Ix,Iy; int64_t I,I0,I1,Is,N,Ix,Iy,Ia,Ib;
int dx,dy; int dx,dy;
dx = Nxfrom; dx = Nxfrom;
@@ -32,26 +32,22 @@ namespace imglib4
N = dx*dy; N = dx*dy;
Is = N/nthreads; Is = (Is<1) ? 1 : N; Is = N/nthreads; Is = (Is<1) ? 1 : Is;
I0 = (threadnum)*Is; I0 = (threadnum)*Is;
I1 = (threadnum<nthreads-1) ? (threadnum+1)*Is : N; I1 = (threadnum<(nthreads-1)) ? (threadnum+1)*Is : N;
for(I=I0;I<I1;I++) for(I=I0;I<I1;I++)
{ {
Ix = I%dx; Ix = I%dx;
Iy = I/dx; Iy = I/dx;
datato[0 + 4*(Ix+offsetx) + 4*Nxto*(Iy+offsety)] = Ia = (Ix+offsetx) + Nxto*(Iy+offsety);
datafrom[0 + 4*Ix + 4*Nxfrom*Iy]; Ib = Ix + Nxfrom*Iy;
datato[1 + 4*(Ix+offsetx) + 4*Nxto*(Iy+offsety)] = datato[0 + 4*Ia] = datafrom[0 + 4*Ib];
datafrom[1 + 4*Ix + 4*Nxfrom*Iy]; datato[1 + 4*Ia] = datafrom[1 + 4*Ib];
datato[2 + 4*Ia] = datafrom[2 + 4*Ib];
datato[2 + 4*(Ix+offsetx) + 4*Nxto*(Iy+offsety)] = datato[3 + 4*Ia] = datafrom[3 + 4*Ib];
datafrom[2 + 4*Ix + 4*Nxfrom*Iy];
datato[3 + 4*(Ix+offsetx) + 4*Nxto*(Iy+offsety)] =
datafrom[3 + 4*Ix + 4*Nxfrom*Iy];
} }
return; return;
@@ -116,9 +112,9 @@ namespace imglib4
dy = (dy<0) ? 0 : dy; dy = (dy<0) ? 0 : dy;
N = dx*dy; N = dx*dy;
Is = N/nthreads; Is = (Is<1) ? 1 : N; Is = N/nthreads; Is = (Is<1) ? 1 : Is;
I0 = (threadnum)*Is; I0 = (threadnum)*Is;
I1 = (threadnum<nthreads-1) ? (threadnum+1)*Is : N; I1 = (threadnum<(nthreads-1)) ? (threadnum+1)*Is : N;
for(I=I0;I<I1;I++) for(I=I0;I<I1;I++)
{ {
@@ -193,9 +189,9 @@ namespace imglib4
N = dx*dy; N = dx*dy;
Is = N/nthreads; Is = (Is<1) ? 1 : N; Is = N/nthreads; Is = (Is<1) ? 1 : Is;
I0 = (threadnum)*Is; I0 = (threadnum)*Is;
I1 = (threadnum<nthreads-1) ? (threadnum+1)*Is : N; I1 = (threadnum<(nthreads-1)) ? (threadnum+1)*Is : N;
for(I=I0;I<I1;I++) for(I=I0;I<I1;I++)
{ {
@@ -272,7 +268,7 @@ namespace imglib4
dy = (dy<0) ? 0 : dy; dy = (dy<0) ? 0 : dy;
N = dx*dy; N = dx*dy;
Is = N/nthreads; Is = (Is<1) ? 1 : N; Is = N/nthreads; Is = (Is<1) ? 1 : Is;
I0 = (threadnum)*Is; I0 = (threadnum)*Is;
I1 = (threadnum<nthreads-1) ? (threadnum+1)*Is : N; I1 = (threadnum<nthreads-1) ? (threadnum+1)*Is : N;
+60
View File
@@ -63,6 +63,66 @@ namespace ams
return;
}
void amscppimglib4_bitplane_alloc_tests()
{
amsbitplane bp1;
int K;
printf("resize(100,100)\n");
bp1.resize(100,100);
printf("resize(0,0)\n");
bp1.resize(0,0);
printf("resize(100,100)\n");
bp1.resize(100,100);
printf("resize(1024,1024)\n");
bp1.resize(1024,1024);
printf("resize(0,0)\n");
bp1.resize(0,0);
printf("resize(-5,-5)\n");
bp1.resize(-5,-5);
printf("resize(0,0)\n");
bp1.resize(0,0);
printf("resize(1024,0)\n");
bp1.resize(1024,0);
printf("resize(1024,1024)\n");
bp1.resize(1024,1024);
printf("resize(1024,1024)\n");
bp1.resize(1024,1024);
return;
}
void amscppimglib4_image_alloc_tests()
{
amsimage bp1;
int K;
printf("image allocation tests - how on earth is this failing and everything else working?!\n");
printf("std::thread::hardware_concurrency() %d\n",(int)std::thread::hardware_concurrency());
printf("resize(100,100)\n");
bp1.resize(100,100);
printf("resize(0,0)\n");
bp1.resize(0,0);
printf("resize(100,100)\n");
bp1.resize(100,100);
printf("resize(1024,1024)\n");
bp1.resize(1024,1024);
printf("resize(0,0)\n");
bp1.resize(0,0);
printf("resize(-5,-5)\n");
bp1.resize(-5,-5);
printf("resize(0,0)\n");
bp1.resize(0,0);
printf("resize(1024,0)\n");
bp1.resize(1024,0);
printf("resize(1024,1024)\n");
bp1.resize(1024,1024);
printf("resize(1024,1024)\n");
bp1.resize(1024,1024);
return; return;
} }
+3
View File
@@ -8,6 +8,9 @@ int main(int argc, char* argv[])
//amscppimglib4_test1(); //amscppimglib4_test1();
//amscppimglib4_test2(); //amscppimglib4_test2();
amscppimglib4_bitplane_alloc_tests();
//amscppimglib4_image_alloc_tests();
return ret; return ret;
} }