diff --git a/build_linux64/libamscimglib4.linux64.a b/build_linux64/libamscimglib4.linux64.a index 889d11a..e9e2953 100644 Binary files a/build_linux64/libamscimglib4.linux64.a and b/build_linux64/libamscimglib4.linux64.a differ diff --git a/build_linux64/libamscimglib4.linux64.so b/build_linux64/libamscimglib4.linux64.so index fe55311..c48ace3 100644 Binary files a/build_linux64/libamscimglib4.linux64.so and b/build_linux64/libamscimglib4.linux64.so differ diff --git a/build_linux64/libamscppimglib4.linux64.a b/build_linux64/libamscppimglib4.linux64.a index 3605aef..5657dff 100644 Binary files a/build_linux64/libamscppimglib4.linux64.a and b/build_linux64/libamscppimglib4.linux64.a differ diff --git a/build_linux64/objstore/amscppimglib4_amsbitplane.o b/build_linux64/objstore/amscppimglib4_amsbitplane.o index 4f8c5de..7c82e7a 100644 Binary files a/build_linux64/objstore/amscppimglib4_amsbitplane.o and b/build_linux64/objstore/amscppimglib4_amsbitplane.o differ diff --git a/build_linux64/objstore/amscppimglib4_amsfloatimage.o b/build_linux64/objstore/amscppimglib4_amsfloatimage.o index dd9002e..68d4314 100644 Binary files a/build_linux64/objstore/amscppimglib4_amsfloatimage.o and b/build_linux64/objstore/amscppimglib4_amsfloatimage.o differ diff --git a/build_linux64/objstore/amscppimglib4_amsimage.o b/build_linux64/objstore/amscppimglib4_amsimage.o index 6b27193..e4bbdfa 100644 Binary files a/build_linux64/objstore/amscppimglib4_amsimage.o and b/build_linux64/objstore/amscppimglib4_amsimage.o differ diff --git a/build_linux64/objstore/amscppimglib4_amspixel.o b/build_linux64/objstore/amscppimglib4_amspixel.o index aa83d4f..2a3cc6a 100644 Binary files a/build_linux64/objstore/amscppimglib4_amspixel.o and b/build_linux64/objstore/amscppimglib4_amspixel.o differ diff --git a/build_linux64/objstore/amscppimglib4_intlutil.o b/build_linux64/objstore/amscppimglib4_intlutil.o index f2368ff..13f0aba 100644 Binary files a/build_linux64/objstore/amscppimglib4_intlutil.o and b/build_linux64/objstore/amscppimglib4_intlutil.o differ diff --git a/build_linux64/objstore/amscppimglib4_template.o b/build_linux64/objstore/amscppimglib4_template.o index 938b43b..8791256 100644 Binary files a/build_linux64/objstore/amscppimglib4_template.o and b/build_linux64/objstore/amscppimglib4_template.o differ diff --git a/build_linux64/objstore/amscppimglib4_tests.o b/build_linux64/objstore/amscppimglib4_tests.o index 0fc9a97..c7cf59c 100644 Binary files a/build_linux64/objstore/amscppimglib4_tests.o and b/build_linux64/objstore/amscppimglib4_tests.o differ diff --git a/build_linux64/tests b/build_linux64/tests index f6c0add..97c84a3 100644 Binary files a/build_linux64/tests and b/build_linux64/tests differ diff --git a/build_mingw64/libamscimglib4.winx64.a b/build_mingw64/libamscimglib4.winx64.a index 089c742..0408e05 100644 Binary files a/build_mingw64/libamscimglib4.winx64.a and b/build_mingw64/libamscimglib4.winx64.a differ diff --git a/build_mingw64/libamscimglib4.winx64.dll b/build_mingw64/libamscimglib4.winx64.dll index 0e6e243..4473f11 100644 Binary files a/build_mingw64/libamscimglib4.winx64.dll and b/build_mingw64/libamscimglib4.winx64.dll differ diff --git a/build_mingw64/libamscppimglib4.mingw64.a b/build_mingw64/libamscppimglib4.mingw64.a index 77212bd..7969d08 100644 Binary files a/build_mingw64/libamscppimglib4.mingw64.a and b/build_mingw64/libamscppimglib4.mingw64.a differ diff --git a/build_mingw64/objstore/amscppimglib4_amsbitplane.o b/build_mingw64/objstore/amscppimglib4_amsbitplane.o index e7002fb..2295c08 100644 Binary files a/build_mingw64/objstore/amscppimglib4_amsbitplane.o and b/build_mingw64/objstore/amscppimglib4_amsbitplane.o differ diff --git a/build_mingw64/objstore/amscppimglib4_intlutil.o b/build_mingw64/objstore/amscppimglib4_intlutil.o index 48e2417..a01bb94 100644 Binary files a/build_mingw64/objstore/amscppimglib4_intlutil.o and b/build_mingw64/objstore/amscppimglib4_intlutil.o differ diff --git a/build_mingw64/objstore/amscppimglib4_template.o b/build_mingw64/objstore/amscppimglib4_template.o index 04c7917..cf14878 100644 Binary files a/build_mingw64/objstore/amscppimglib4_template.o and b/build_mingw64/objstore/amscppimglib4_template.o differ diff --git a/build_mingw64/objstore/amscppimglib4_tests.o b/build_mingw64/objstore/amscppimglib4_tests.o index 3ba9911..aab130b 100644 Binary files a/build_mingw64/objstore/amscppimglib4_tests.o and b/build_mingw64/objstore/amscppimglib4_tests.o differ diff --git a/build_mingw64/tests.exe b/build_mingw64/tests.exe index d4337bb..e23cf2c 100644 Binary files a/build_mingw64/tests.exe and b/build_mingw64/tests.exe differ diff --git a/include/amscppimglib4/amscppimglib4.hpp b/include/amscppimglib4/amscppimglib4.hpp index 3b43460..9cffe0e 100644 --- a/include/amscppimglib4/amscppimglib4.hpp +++ b/include/amscppimglib4/amscppimglib4.hpp @@ -149,15 +149,16 @@ namespace ams const uint8_t& operator[](long I) const; float getf(int x, int y) const; - int setf(int x, int y, float f) const; - float interpolate(int x, int y); + int setf(int x, int y, float f); + float interpolate(float x, float y) const; + int apply_bitplane(int x0, int y0, const amsbitplane *bp); void clear(); void setall(uint8_t val); //rescales the image with linear interpolation - amsbitplane rescale(int _Nx, int _Ny); //todo + amsbitplane rescale(int _Nx, int _Ny); }; class amsfloatimage @@ -200,10 +201,9 @@ namespace ams void clear(); void setall(amsfloatpixel color); - //don't implement this yet 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); //addition/subtraction/scaling operators? diff --git a/include/amscppimglib4/amscppimglib4_intlutil.hpp b/include/amscppimglib4/amscppimglib4_intlutil.hpp index 49642a8..1dda3fc 100644 --- a/include/amscppimglib4/amscppimglib4_intlutil.hpp +++ b/include/amscppimglib4/amscppimglib4_intlutil.hpp @@ -41,6 +41,7 @@ template int threaded_execute(callable && } for(I=0;Isetall(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=0 && y255) 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-0.5 && y=(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 = (threadnumNx-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 = (threadnumNy; + Ib = Ix + Iy*imgfrom->Ny; + + v1 = imgto->data[Ia]; + v2 = imgfrom->data[Ib]; + if(v1data[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; + } + + -}; \ No newline at end of file + + +}; //end namespace ams \ No newline at end of file diff --git a/src/amscppimglib4/amscppimglib4_amsfloatimage.cpp b/src/amscppimglib4/amscppimglib4_amsfloatimage.cpp index b640ac2..e4fe650 100644 --- a/src/amscppimglib4/amscppimglib4_amsfloatimage.cpp +++ b/src/amscppimglib4/amscppimglib4_amsfloatimage.cpp @@ -673,7 +673,7 @@ namespace ams float Nxf,Nyf; //just do simple (0,N-1) interpolation for now - int xi,yi; + int xi,yi,xip,yip; float xif,yif,xr,yr; float w00,w01,w10,w11; amsfloatpixel p00,p01,p10,p11; @@ -698,15 +698,19 @@ namespace ams w01 = (1.0-xr)*(yr); w11 = (xr)*(yr); + xip = xi + 1; + yip = yi + 1; 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>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); - p10 = get_pixel(xi+1,yi); - p01 = get_pixel(xi,yi+1); - p11 = get_pixel(xi+1,yi+1); + p10 = get_pixel(xip,yi); + p01 = get_pixel(xi,yip); + p11 = get_pixel(xip,yip); ret = p00*w00 + p10*w10 + p01*w01 + p11*w11; } @@ -714,6 +718,8 @@ namespace ams return ret; } + + void amsfloatimage_rescale_tf( int threadnum, int nthreads, diff --git a/src/amscppimglib4/amscppimglib4_amsimage.cpp b/src/amscppimglib4/amscppimglib4_amsimage.cpp index 6594f28..195ca8e 100644 --- a/src/amscppimglib4/amscppimglib4_amsimage.cpp +++ b/src/amscppimglib4/amscppimglib4_amsimage.cpp @@ -848,7 +848,7 @@ namespace ams float Nxf,Nyf; //just do simple (0,N-1) interpolation for now - int xi,yi; + int xi,yi,xip,yip; float xif,yif,xr,yr; float w00,w01,w10,w11; amsfloatpixel p00,p01,p10,p11; @@ -873,15 +873,19 @@ namespace ams w01 = (1.0-xr)*(yr); w11 = (xr)*(yr); + xip = xi + 1; + yip = yi + 1; 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>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); - p10 = get_fpixel(xi+1,yi); - p01 = get_fpixel(xi,yi+1); - p11 = get_fpixel(xi+1,yi+1); + p10 = get_fpixel(xip,yi); + p01 = get_fpixel(xi,yip); + p11 = get_fpixel(xip,yip); ret = p00*w00 + p10*w10 + p01*w01 + p11*w11; } diff --git a/src/amscppimglib4/amscppimglib4_intlutil.cpp b/src/amscppimglib4/amscppimglib4_intlutil.cpp index d0615e8..b951cfe 100644 --- a/src/amscppimglib4/amscppimglib4_intlutil.cpp +++ b/src/amscppimglib4/amscppimglib4_intlutil.cpp @@ -19,7 +19,7 @@ namespace imglib4 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; dx = Nxfrom; @@ -32,26 +32,22 @@ namespace imglib4 N = dx*dy; - Is = N/nthreads; Is = (Is<1) ? 1 : N; + Is = N/nthreads; Is = (Is<1) ? 1 : Is; I0 = (threadnum)*Is; - I1 = (threadnum