updates
This commit is contained in:
@ -2,6 +2,12 @@
|
|||||||
"folders": [
|
"folders": [
|
||||||
{
|
{
|
||||||
"path": "."
|
"path": "."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "../../sourceprojs23/amsimglib3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "../amscimglib4"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
BIN
build/__pycache__/amsbuildlib4.cpython-312.pyc
Normal file
BIN
build/__pycache__/amsbuildlib4.cpython-312.pyc
Normal file
Binary file not shown.
@ -14,12 +14,12 @@ depdir = "./dependencies/linux64" #local pre-compiled dependency libraries and t
|
|||||||
installdir = "../../linux64" #directory to install to when finished
|
installdir = "../../linux64" #directory to install to when finished
|
||||||
builddir = "./build_linux64"
|
builddir = "./build_linux64"
|
||||||
|
|
||||||
doinstall = False #copies the build_output to the install dir when finished
|
doinstall = True #copies the build_output to the install dir when finished
|
||||||
cc = "g++" #compiler
|
cc = "g++" #compiler
|
||||||
cflags = "-fPIC"
|
cflags = "-fPIC"
|
||||||
libraries = "-l{}".format(libname)
|
libraries = "-l{} -lamscimglib4.linux64".format(libname)
|
||||||
libdirs = "-L{} -L{}/lib -L{}/lib".format(builddir,commondir,depdir)
|
libdirs = "-L{} -L{}/lib -L{}/lib".format(builddir,commondir,depdir)
|
||||||
linkerflags = "-static -static-libgcc -Wl,-rpath=."
|
linkerflags = "-static-libgcc -Wl,-rpath=."
|
||||||
srcexts = [".c",".cpp"]
|
srcexts = [".c",".cpp"]
|
||||||
binsrc = ["main.c","main.cpp"] #ignore these files when compiling the static library
|
binsrc = ["main.c","main.cpp"] #ignore these files when compiling the static library
|
||||||
|
|
||||||
@ -35,6 +35,16 @@ kwargs["recurse"] = True
|
|||||||
kwargs["objstore"] = "{}/objstore".format(builddir)
|
kwargs["objstore"] = "{}/objstore".format(builddir)
|
||||||
kwargs["searchincdirs"] = "./include"
|
kwargs["searchincdirs"] = "./include"
|
||||||
|
|
||||||
|
#Collect dependencies
|
||||||
|
shutil.copy(
|
||||||
|
"{}/lib/libamscimglib4.linux64.a".format(installdir),
|
||||||
|
'{}/'.format(builddir,libname)
|
||||||
|
)
|
||||||
|
shutil.copy(
|
||||||
|
"{}/lib/libamscimglib4.linux64.so".format(installdir),
|
||||||
|
'{}/'.format(builddir,libname)
|
||||||
|
)
|
||||||
|
|
||||||
#Find all source files, except the main project files
|
#Find all source files, except the main project files
|
||||||
srcfiles = flist('./src',exts = srcexts, recurse=True)
|
srcfiles = flist('./src',exts = srcexts, recurse=True)
|
||||||
srcfiles = except_contains(srcfiles,binsrc)
|
srcfiles = except_contains(srcfiles,binsrc)
|
||||||
@ -48,10 +58,11 @@ objlist = flist(kwargs['objstore'],exts='.o',recurse=True)
|
|||||||
ar_list(objlist,'{}/lib{}.a'.format(builddir,libname))
|
ar_list(objlist,'{}/lib{}.a'.format(builddir,libname))
|
||||||
|
|
||||||
if(doinstall):
|
if(doinstall):
|
||||||
#Copy a binary to the common bin folder
|
|
||||||
|
|
||||||
#Push any libraries to the common lib folder
|
#Push any libraries to the common lib folder
|
||||||
shutil.copy('{}/lib/lib{}.a'.format(builddir,libname),commondir)
|
shutil.copy(
|
||||||
|
'{}/lib{}.a'.format(builddir,libname),
|
||||||
|
"{}/lib".format(installdir)
|
||||||
|
)
|
||||||
|
|
||||||
#Copy include files to the common include folder
|
#Copy include files to the common include folder
|
||||||
copytree('./include/',commondir+'/include/',dirs_exist_ok=True)
|
copytree('./include/',installdir+'/include/',dirs_exist_ok=True)
|
||||||
|
@ -14,12 +14,12 @@ depdir = "./dependencies/linux64" #local pre-compiled dependency libraries and t
|
|||||||
installdir = "../../linux64" #directory to install to when finished
|
installdir = "../../linux64" #directory to install to when finished
|
||||||
builddir = "./build_linux64"
|
builddir = "./build_linux64"
|
||||||
|
|
||||||
doinstall = False #copies the build_output to the install dir when finished
|
doinstall = True #copies the build_output to the install dir when finished
|
||||||
cc = "g++" #compiler
|
cc = "g++" #compiler
|
||||||
cflags = "-fPIC"
|
cflags = "-fPIC"
|
||||||
libraries = "-l{}".format(libname)
|
libraries = "-l{} -lamscimglib4.linux64".format(libname)
|
||||||
libdirs = "-L{} -L{}/lib -L{}/lib".format(builddir,commondir,depdir)
|
libdirs = "-L{} -L{}/lib -L{}/lib".format(builddir,commondir,depdir)
|
||||||
linkerflags = "-static -static-libgcc -Wl,-rpath=."
|
linkerflags = "-static-libgcc -Wl,-rpath=."
|
||||||
srcexts = [".c",".cpp"]
|
srcexts = [".c",".cpp"]
|
||||||
binsrc = ["main.c","main.cpp"] #ignore these files when compiling the static library
|
binsrc = ["main.c","main.cpp"] #ignore these files when compiling the static library
|
||||||
|
|
||||||
|
@ -14,12 +14,12 @@ depdir = "./dependencies/winx64" #local pre-compiled dependency libraries and th
|
|||||||
installdir = "../../winx64" #directory to install to when finished
|
installdir = "../../winx64" #directory to install to when finished
|
||||||
builddir = "./build_mingw64"
|
builddir = "./build_mingw64"
|
||||||
|
|
||||||
doinstall = False #copies the build_output to the install dir when finished
|
doinstall = True #copies the build_output to the install dir when finished
|
||||||
cc = "x86_64-w64-mingw32-g++" #compiler
|
cc = "x86_64-w64-mingw32-g++" #compiler
|
||||||
cflags = "-fPIC -O3"
|
cflags = "-fPIC -O3"
|
||||||
libraries = "-l{}".format(libname)
|
libraries = "-l{} -lamscimglib4.winx64".format(libname)
|
||||||
libdirs = "-L{} -L{}/lib -L{}/lib".format(builddir,commondir,depdir)
|
libdirs = "-L{} -L{}/lib -L{}/lib".format(builddir,commondir,depdir)
|
||||||
linkerflags = "-static -static-libgcc -Wl,-rpath=."
|
linkerflags = "-static-libgcc -static-libstdc++ -Wl,-rpath=."
|
||||||
srcexts = [".c",".cpp"]
|
srcexts = [".c",".cpp"]
|
||||||
binsrc = ["main.c","main.cpp"] #ignore these files when compiling the static library
|
binsrc = ["main.c","main.cpp"] #ignore these files when compiling the static library
|
||||||
|
|
||||||
@ -36,6 +36,16 @@ kwargs["recurse"] = True
|
|||||||
kwargs["objstore"] = "{}/objstore".format(builddir)
|
kwargs["objstore"] = "{}/objstore".format(builddir)
|
||||||
kwargs["searchincdirs"] = "./include"
|
kwargs["searchincdirs"] = "./include"
|
||||||
|
|
||||||
|
#Collect dependencies
|
||||||
|
shutil.copy(
|
||||||
|
"{}/lib/libamscimglib4.winx64.a".format(installdir),
|
||||||
|
'{}/'.format(builddir,libname)
|
||||||
|
)
|
||||||
|
shutil.copy(
|
||||||
|
"{}/lib/libamscimglib4.winx64.dll".format(installdir),
|
||||||
|
'{}/'.format(builddir,libname)
|
||||||
|
)
|
||||||
|
|
||||||
#Find all source files, except the main project files
|
#Find all source files, except the main project files
|
||||||
srcfiles = flist('./src',exts = srcexts, recurse=True)
|
srcfiles = flist('./src',exts = srcexts, recurse=True)
|
||||||
srcfiles = except_contains(srcfiles,binsrc)
|
srcfiles = except_contains(srcfiles,binsrc)
|
||||||
@ -49,10 +59,11 @@ objlist = flist(kwargs['objstore'],exts='.o',recurse=True)
|
|||||||
ar_list(objlist,'{}/lib{}.a'.format(builddir,libname))
|
ar_list(objlist,'{}/lib{}.a'.format(builddir,libname))
|
||||||
|
|
||||||
if(doinstall):
|
if(doinstall):
|
||||||
#Copy a binary to the common bin folder
|
|
||||||
|
|
||||||
#Push any libraries to the common lib folder
|
#Push any libraries to the common lib folder
|
||||||
shutil.copy('{}/lib/lib{}.a'.format(builddir,libname),commondir)
|
shutil.copy(
|
||||||
|
'{}/lib{}.a'.format(builddir,libname),
|
||||||
|
"{}/lib".format(installdir)
|
||||||
|
)
|
||||||
|
|
||||||
#Copy include files to the common include folder
|
#Copy include files to the common include folder
|
||||||
copytree('./include/',commondir+'/include/',dirs_exist_ok=True)
|
copytree('./include/',installdir+'/include/',dirs_exist_ok=True)
|
||||||
|
@ -14,12 +14,12 @@ depdir = "./dependencies/winx64" #local pre-compiled dependency libraries and th
|
|||||||
installdir = "../../winx64" #directory to install to when finished
|
installdir = "../../winx64" #directory to install to when finished
|
||||||
builddir = "./build_mingw64"
|
builddir = "./build_mingw64"
|
||||||
|
|
||||||
doinstall = False #copies the build_output to the install dir when finished
|
doinstall = True #copies the build_output to the install dir when finished
|
||||||
cc = "x86_64-w64-mingw32-g++" #compiler
|
cc = "x86_64-w64-mingw32-g++" #compiler
|
||||||
cflags = "-fPIC -O3"
|
cflags = "-fPIC -O3"
|
||||||
libraries = "-l{}".format(libname)
|
libraries = "-l{} -lamscimglib4.winx64".format(libname)
|
||||||
libdirs = "-L{} -L{}/lib -L{}/lib".format(builddir,commondir,depdir)
|
libdirs = "-L{} -L{}/lib -L{}/lib".format(builddir,commondir,depdir)
|
||||||
linkerflags = "-static -static-libgcc -Wl,-rpath=."
|
linkerflags = "-static-libgcc -static-libstdc++ -Wl,-rpath=."
|
||||||
srcexts = [".c",".cpp"]
|
srcexts = [".c",".cpp"]
|
||||||
binsrc = ["main.c","main.cpp"] #ignore these files when compiling the static library
|
binsrc = ["main.c","main.cpp"] #ignore these files when compiling the static library
|
||||||
|
|
||||||
|
@ -14,10 +14,10 @@ depdir = "./dependencies/winx64" #local pre-compiled dependency libraries and th
|
|||||||
installdir = "../../winx64" #directory to install to when finished
|
installdir = "../../winx64" #directory to install to when finished
|
||||||
builddir = "./build_msvc64"
|
builddir = "./build_msvc64"
|
||||||
|
|
||||||
doinstall = False #copies the build_output to the install dir when finished
|
doinstall = True #copies the build_output to the install dir when finished
|
||||||
cc = "cl" #compiler
|
cc = "cl" #compiler
|
||||||
cflags = "/O2"
|
cflags = "/O2"
|
||||||
libraries = "lib{}.lib".format(libname)
|
libraries = "lib{}.lib libamscimglib4.winx64.a".format(libname)
|
||||||
libdirs = "/LIBPATH:{} /LIBPATH:{}/lib /LIBPATH:{}/lib".format(builddir,commondir,depdir)
|
libdirs = "/LIBPATH:{} /LIBPATH:{}/lib /LIBPATH:{}/lib".format(builddir,commondir,depdir)
|
||||||
linkerflags = "-static -static-libgcc -Wl,-rpath=."
|
linkerflags = "-static -static-libgcc -Wl,-rpath=."
|
||||||
srcexts = [".c",".cpp"]
|
srcexts = [".c",".cpp"]
|
||||||
@ -51,10 +51,11 @@ objlist = flist(kwargs['objstore'],exts='.obj',recurse=True)
|
|||||||
msvc_lib_list(objlist,'{}/lib{}.lib'.format(builddir,libname))
|
msvc_lib_list(objlist,'{}/lib{}.lib'.format(builddir,libname))
|
||||||
|
|
||||||
if(doinstall):
|
if(doinstall):
|
||||||
#Copy a binary to the common bin folder
|
|
||||||
|
|
||||||
#Push any libraries to the common lib folder
|
#Push any libraries to the common lib folder
|
||||||
shutil.copy('{}/lib/lib{}.lib'.format(builddir,libname),commondir)
|
shutil.copy(
|
||||||
|
'{}/lib{}.lib'.format(builddir,libname),
|
||||||
|
"{}/lib".format(installdir)
|
||||||
|
)
|
||||||
|
|
||||||
#Copy include files to the common include folder
|
#Copy include files to the common include folder
|
||||||
copytree('./include/',commondir+'/include/',dirs_exist_ok=True)
|
copytree('./include/',installdir+'/include/',dirs_exist_ok=True)
|
||||||
|
@ -17,7 +17,7 @@ builddir = "./build_msvc64"
|
|||||||
doinstall = False #copies the build_output to the install dir when finished
|
doinstall = False #copies the build_output to the install dir when finished
|
||||||
cc = "cl" #compiler
|
cc = "cl" #compiler
|
||||||
cflags = "/O2"
|
cflags = "/O2"
|
||||||
libraries = "lib{}.lib".format(libname)
|
libraries = "lib{}.lib libamscimglib4.winx64.a".format(libname)
|
||||||
libdirs = "/LIBPATH:{} /LIBPATH:{}/lib /LIBPATH:{}/lib".format(builddir,commondir,depdir)
|
libdirs = "/LIBPATH:{} /LIBPATH:{}/lib /LIBPATH:{}/lib".format(builddir,commondir,depdir)
|
||||||
linkerflags = ""
|
linkerflags = ""
|
||||||
srcexts = [".c",".cpp"]
|
srcexts = [".c",".cpp"]
|
||||||
|
BIN
build_linux64/libamscimglib4.linux64.a
Normal file
BIN
build_linux64/libamscimglib4.linux64.a
Normal file
Binary file not shown.
BIN
build_linux64/libamscimglib4.linux64.so
Normal file
BIN
build_linux64/libamscimglib4.linux64.so
Normal file
Binary file not shown.
Binary file not shown.
BIN
build_linux64/objstore/amscppimglib4_amsbitplane.o
Normal file
BIN
build_linux64/objstore/amscppimglib4_amsbitplane.o
Normal file
Binary file not shown.
BIN
build_linux64/objstore/amscppimglib4_amsimage.o
Normal file
BIN
build_linux64/objstore/amscppimglib4_amsimage.o
Normal file
Binary file not shown.
BIN
build_linux64/objstore/amscppimglib4_amspixel.o
Normal file
BIN
build_linux64/objstore/amscppimglib4_amspixel.o
Normal file
Binary file not shown.
BIN
build_linux64/objstore/amscppimglib4_intlutil.o
Normal file
BIN
build_linux64/objstore/amscppimglib4_intlutil.o
Normal file
Binary file not shown.
BIN
build_linux64/objstore/amscppimglib4_template.o
Normal file
BIN
build_linux64/objstore/amscppimglib4_template.o
Normal file
Binary file not shown.
BIN
build_linux64/objstore/amscppimglib4_tests.o
Normal file
BIN
build_linux64/objstore/amscppimglib4_tests.o
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
build_mingw64/libamscimglib4.winx64.a
Normal file
BIN
build_mingw64/libamscimglib4.winx64.a
Normal file
Binary file not shown.
BIN
build_mingw64/libamscimglib4.winx64.dll
Normal file
BIN
build_mingw64/libamscimglib4.winx64.dll
Normal file
Binary file not shown.
BIN
build_mingw64/libamscppimglib4.mingw64.a
Normal file
BIN
build_mingw64/libamscppimglib4.mingw64.a
Normal file
Binary file not shown.
BIN
build_mingw64/objstore/amscppimglib4_amsbitplane.o
Normal file
BIN
build_mingw64/objstore/amscppimglib4_amsbitplane.o
Normal file
Binary file not shown.
BIN
build_mingw64/objstore/amscppimglib4_amsimage.o
Normal file
BIN
build_mingw64/objstore/amscppimglib4_amsimage.o
Normal file
Binary file not shown.
BIN
build_mingw64/objstore/amscppimglib4_amspixel.o
Normal file
BIN
build_mingw64/objstore/amscppimglib4_amspixel.o
Normal file
Binary file not shown.
BIN
build_mingw64/objstore/amscppimglib4_intlutil.o
Normal file
BIN
build_mingw64/objstore/amscppimglib4_intlutil.o
Normal file
Binary file not shown.
BIN
build_mingw64/objstore/amscppimglib4_template.o
Normal file
BIN
build_mingw64/objstore/amscppimglib4_template.o
Normal file
Binary file not shown.
BIN
build_mingw64/objstore/amscppimglib4_tests.o
Normal file
BIN
build_mingw64/objstore/amscppimglib4_tests.o
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
build_mingw64/tests.exe
Normal file
BIN
build_mingw64/tests.exe
Normal file
Binary file not shown.
@ -4,12 +4,136 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
namespace ams
|
namespace ams
|
||||||
{
|
{
|
||||||
void amscpptemplate_testfn();
|
|
||||||
void amscpptemplate_testfn2();
|
class amsimage;
|
||||||
};
|
class amsbitplane;
|
||||||
|
|
||||||
|
static const bool amsimage_usethreads = 1; //use threads for handling image initialization/copying
|
||||||
|
static const int amsimage_maxthreads = 20; //max number of threads to use
|
||||||
|
static const int amsimage_threadpsz = 5000; //when to break into threaded operation
|
||||||
|
static const int amsimage_success = 0;
|
||||||
|
static const int amsimage_failure = -1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct amspixel
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
uint8_t R,G,B,A;
|
||||||
|
|
||||||
|
amspixel();
|
||||||
|
amspixel(uint8_t _R ,uint8_t _G, uint8_t _B, uint8_t _A);
|
||||||
|
uint8_t& operator[](const int ind);
|
||||||
|
const uint8_t& operator[](const int ind) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
class amsimage
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int Nx,Ny; //image extent
|
||||||
|
//int Nc; //number of color-planes (1,3,4)
|
||||||
|
//Assume we're talking about an RGBA image internally, greyscale is what bitplane is for
|
||||||
|
uint8_t *data; //[(x + width*y)*4]
|
||||||
|
|
||||||
|
int& width; //aliases to Nx,Ny
|
||||||
|
int& height;
|
||||||
|
|
||||||
|
amsimage();
|
||||||
|
~amsimage();
|
||||||
|
amsimage(const amsimage& other);
|
||||||
|
amsimage(amsimage&& other) noexcept;
|
||||||
|
amsimage& operator=(const amsimage& other);
|
||||||
|
amsimage& operator=(amsimage&& other) noexcept;
|
||||||
|
|
||||||
|
int resize(int _Nx, int _Ny);
|
||||||
|
|
||||||
|
amsimage subimage(int I0, int J0, int I1, int J1) const;
|
||||||
|
amsimage transpose() const;
|
||||||
|
amsimage rotcw() const;
|
||||||
|
amsimage rotccw() const;
|
||||||
|
amsimage flipx() const;
|
||||||
|
amsimage flipy() const;
|
||||||
|
|
||||||
|
amspixel get_pixel(int I,int J) const;
|
||||||
|
int set_pixel(int I,int J,const amspixel pix);
|
||||||
|
int set_pixel(int I,int J,uint8_t R, uint8_t G, uint8_t B, uint8_t A);
|
||||||
|
uint8_t& operator[](int ind);
|
||||||
|
const uint8_t& operator[](int ind) const;
|
||||||
|
uint8_t& operator()(int Nc, int I, int J);
|
||||||
|
const uint8_t& operator()(int Nc, int I, int J) const;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void clear();
|
||||||
|
void setall(amspixel color);
|
||||||
|
int setallplane(int Ncp, uint8_t val);
|
||||||
|
|
||||||
|
int get_colorplane(int Ncp, amsbitplane* bp);
|
||||||
|
int set_colorplane(int Ncp, const amsbitplane* bp);
|
||||||
|
|
||||||
|
//applies image with alpha blending
|
||||||
|
int apply_image(int I0, int J0, amsimage *img);
|
||||||
|
//applied color to any pixels where the bitplane's value is >= thresh
|
||||||
|
int apply_bitplane_nz(int I0, int J0, amsbitplane* bp, amspixel color, uint8_t thresh);
|
||||||
|
|
||||||
|
//rescales the image with linear interpolation
|
||||||
|
int rescale(int nnx, int nny);
|
||||||
|
};
|
||||||
|
|
||||||
|
int read_image(const char *fname, amsimage* image);
|
||||||
|
int write_image(const char *fname, amsimage* image);
|
||||||
|
|
||||||
|
class amsbitplane
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int Nx,Ny;
|
||||||
|
uint8_t *data; //[x+width*y]
|
||||||
|
|
||||||
|
amsbitplane();
|
||||||
|
~amsbitplane();
|
||||||
|
amsbitplane(const amsbitplane& other);
|
||||||
|
amsbitplane(amsbitplane&& other) noexcept;
|
||||||
|
amsbitplane& operator=(const amsbitplane& other);
|
||||||
|
amsbitplane& operator=(amsbitplane&& other) noexcept;
|
||||||
|
|
||||||
|
int resize(int _Nx, int _Ny);
|
||||||
|
void transpose();
|
||||||
|
void rotcw();
|
||||||
|
void rotccw();
|
||||||
|
void flipx();
|
||||||
|
void flipy();
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
|
||||||
|
void clear();
|
||||||
|
|
||||||
|
//rescales the image with linear interpolation
|
||||||
|
int rescale(int nnx, int nny);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//Tests//
|
||||||
|
|
||||||
|
void amscppimglib_test1();
|
||||||
|
|
||||||
|
}; //end namespace ams
|
||||||
|
|
||||||
|
#include <amscppimglib4/amscppimglib4_tests.hpp>
|
||||||
|
|
||||||
#endif
|
#endif
|
90
include/amscppimglib4/amscppimglib4_intlutil.hpp
Normal file
90
include/amscppimglib4/amscppimglib4_intlutil.hpp
Normal file
@ -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
|
||||||
|
|
11
include/amscppimglib4/amscppimglib4_tests.hpp
Normal file
11
include/amscppimglib4/amscppimglib4_tests.hpp
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#ifndef __AMSCPPIMGLIB4_TESTS_HPP__
|
||||||
|
#define __AMSCPPIMGLIB4_TESTS_HPP__
|
||||||
|
|
||||||
|
namespace ams
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
}; //end namespace ams
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
8
src/amscppimglib4/amscppimglib4_amsbitplane.cpp
Normal file
8
src/amscppimglib4/amscppimglib4_amsbitplane.cpp
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#include <amscppimglib4/amscppimglib4.hpp>
|
||||||
|
|
||||||
|
namespace ams
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
};
|
461
src/amscppimglib4/amscppimglib4_amsimage.cpp
Normal file
461
src/amscppimglib4/amscppimglib4_amsimage.cpp
Normal file
@ -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)];
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
37
src/amscppimglib4/amscppimglib4_amspixel.cpp
Normal file
37
src/amscppimglib4/amscppimglib4_amspixel.cpp
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
169
src/amscppimglib4/amscppimglib4_intlutil.cpp
Normal file
169
src/amscppimglib4/amscppimglib4_intlutil.cpp
Normal file
@ -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
|
8
src/amscppimglib4/amscppimglib4_template.cpp
Normal file
8
src/amscppimglib4/amscppimglib4_template.cpp
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#include <amscppimglib4/amscppimglib4.hpp>
|
||||||
|
|
||||||
|
namespace ams
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
};
|
20
src/amscppimglib4/amscppimglib4_tests.cpp
Normal file
20
src/amscppimglib4/amscppimglib4_tests.cpp
Normal file
@ -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;
|
||||||
}
|
}
|
Reference in New Issue
Block a user