From d689c496800c5d31b5fc1dba6950d75e2799cd38 Mon Sep 17 00:00:00 2001 From: lostjared Date: Mon, 13 Feb 2017 15:13:09 -0800 Subject: [PATCH] working on plugin support, first doing Linux --- src/main_window.cpp | 10 +++ src/plugin.cpp | 125 +++++++++++++++++++++++++++++++++++- src/plugin.h | 25 ++++++++ src/plugins/basic/Makefile | 9 +++ src/plugins/basic/basic.cpp | 14 ++++ src/plugins/basic/basic.so | Bin 0 -> 8480 bytes src/qtheaders.h | 3 + 7 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 src/plugins/basic/Makefile create mode 100644 src/plugins/basic/basic.cpp create mode 100755 src/plugins/basic/basic.so diff --git a/src/main_window.cpp b/src/main_window.cpp index 7b88ba0..87c9d10 100644 --- a/src/main_window.cpp +++ b/src/main_window.cpp @@ -1,5 +1,7 @@ #include "main_window.h" #include +#include"plugin.h" + std::unordered_map> filter_map; @@ -204,6 +206,7 @@ AC_MainWindow::~AC_MainWindow() { } AC_MainWindow::AC_MainWindow(QWidget *parent) : QMainWindow(parent) { generate_map(); + init_plugins(); setGeometry(100, 100, 800, 600); setFixedSize(800, 600); setWindowTitle(tr("Acid Cam v2 - Qt")); @@ -221,6 +224,13 @@ AC_MainWindow::AC_MainWindow(QWidget *parent) : QMainWindow(parent) { disp = new DisplayWindow(this); playback = new Playback(); QObject::connect(playback, SIGNAL(procImage(QImage)), this, SLOT(updateFrame(QImage))); + + for(unsigned int i = 0; i < plugins.plugin_list.size(); ++i) { + QString text; + QTextStream stream(&text); + stream << "Loaded Plugin: " << plugins.plugin_list[i]->name().c_str() << "\n"; + Log(text); + } } void AC_MainWindow::createControls() { diff --git a/src/plugin.cpp b/src/plugin.cpp index ee3391d..74459eb 100644 --- a/src/plugin.cpp +++ b/src/plugin.cpp @@ -1,5 +1,128 @@ #include "plugin.h" +#if defined(__linux__) || defined(__APPLE__) +#include +#include +#else -void ac::plugin(cv::Mat &/*frame*/) { +#endif + +PluginList plugins; + +#if defined(__linux__) || defined(__APPLE__) +void add_directory(std::string path, std::vector &files) { + DIR *dir = opendir(path.c_str()); + if(dir == NULL) { + std::cerr << "Error could not open directory: " << path << "\n"; + return; + } + dirent *file_info; + while( (file_info = readdir(dir)) != 0 ) { + std::string f_info = file_info->d_name; + if(f_info == "." || f_info == "..") continue; + std::string fullpath=path+"/"+f_info; + struct stat s; + + lstat(fullpath.c_str(), &s); + if(S_ISDIR(s.st_mode)) { + if(f_info.length()>0 && f_info[0] != '.') + add_directory(path+"/"+f_info, files); + + continue; + } + if(f_info.length()>0 && f_info[0] != '.' && fullpath.rfind(".so") != std::string::npos) { + files.push_back(fullpath); + std::cout << "found: " << fullpath << "\n"; + } + } + closedir(dir); +} +#else +void add_directory(std::string path, std::vector &files) { } +#endif + +void init_plugins() { + std::vector files; + add_directory("plugins", files); + if(files.size()>0) { + for(unsigned int i = 0; i < files.size(); ++i) { + Plugin *p = new Plugin(); + if(p->loadPlugin(files[i])) + plugins.plugin_list.push_back(p); + } + } +} + + +void ac::plugin(cv::Mat &frame) { + for(int z = 0; z < frame.rows; ++z) { + for(int i = 0; i < frame.cols; ++i) { + unsigned char rgb[3]; + cv::Vec3b &cpixel = frame.at(z, i); + rgb[0] = cpixel[0]; + rgb[1] = cpixel[1]; + rgb[2] = cpixel[2]; + //plugins.plugin_list[0]->call_Pixel(i, z, rgb); + cpixel[0] = rgb[0]; + cpixel[1] = rgb[1]; + cpixel[2] = rgb[2]; + } + } + //plugins.plugin_list[0]->call_Complete(); +} + +Plugin::Plugin() { + library = 0; +} + +Plugin::~Plugin() { + if(library) delete library; +} + +bool Plugin::loadPlugin(const std::string &text) { + library = new QLibrary(text.c_str()); + if(!library) { + QMessageBox::information(0, QObject::tr("Could not load Library"), text.c_str()); + return false; + } + + pixel_function = (pixel) library->resolve("pixel"); + if(!pixel_function) { + QMessageBox::information(0, "Could not find pixel function", text.c_str()); + return false; + } + + complete_function = (complete) library->resolve("complete"); + if(!complete_function) { + QMessageBox::information(0, "Could not find complete function", text.c_str()); + return false; + } + mod_name = text; + return true; +} + + +void Plugin::call_Pixel(int x, int y, unsigned char *rgb) { + + if(pixel_function) + pixel_function(x, y, rgb); + +} +void Plugin::call_Complete() { + if(complete_function) + complete_function(); +} + +PluginList::PluginList() { + +} + +PluginList::~PluginList() { + if(plugin_list.size() == 0) return; + + for(auto i = plugin_list.begin(); i != plugin_list.end(); ++i) + delete *i; +} + + diff --git a/src/plugin.h b/src/plugin.h index bb768cd..0616270 100644 --- a/src/plugin.h +++ b/src/plugin.h @@ -4,5 +4,30 @@ #include "qtheaders.h" +typedef void (*pixel)(int x, int y, unsigned char *buf); +typedef void (*complete)(); +class Plugin { +public: + Plugin(); + ~Plugin(); + bool loadPlugin(const std::string &text); + void call_Pixel(int x, int y, unsigned char *rgb); + void call_Complete(); + std::string name() const { return mod_name; } +private: + pixel pixel_function; + complete complete_function; + QLibrary *library; + std::string mod_name; +}; + +class PluginList { +public: + PluginList(); + ~PluginList(); + std::vector plugin_list; +}; + +extern PluginList plugins; #endif diff --git a/src/plugins/basic/Makefile b/src/plugins/basic/Makefile new file mode 100644 index 0000000..b3b549f --- /dev/null +++ b/src/plugins/basic/Makefile @@ -0,0 +1,9 @@ + +all: basic.so + +basic.so: + g++ -std=c++11 -shared -fPIC basic.cpp -o basic.so + +clean: + rm -f basic.so + diff --git a/src/plugins/basic/basic.cpp b/src/plugins/basic/basic.cpp new file mode 100644 index 0000000..dbc8097 --- /dev/null +++ b/src/plugins/basic/basic.cpp @@ -0,0 +1,14 @@ +#include + + +extern "C" void pixel(int x, int y, unsigned char *rgb); +extern "C" void complete(); + + +void pixel(int x, int y, unsigned char *rgb) { + rgb[0] = rgb[1] = rgb[2] = 0; +} + +void complete() { + +} diff --git a/src/plugins/basic/basic.so b/src/plugins/basic/basic.so new file mode 100755 index 0000000000000000000000000000000000000000..c8651256e1cf5a8e671edf0f77dc02b9fd4b262a GIT binary patch literal 8480 zcmeHMZ){W76~DF#1PF{G1%*i?Ihm(C$pa+ zu(GnIYl&DU)U7Sks%am(O8thk32FVXhEXx5epvRWQt5{&+k_ORR!x~!rBWB~cka8# zdA@e0X`0k8-01n-^E-d;-*?}+Cr`%u4)}dO!6hKRB#4_??IIB+nEQ;XfJ8*6ScBis ziY-#NZdp`SJF(VF=9`(EUkfLlytn6B&D;JF+x1#8*8Vb{T zrM3!`o|{Up)169>Dd|!5_D z3i#8&n``L*Vg>xA74U7qLwNMk2_U3{;QR6HsDZx+EGSw;XE0PDeMjP(MVp5IMd|A} zOVQQtbuS$hnA4~6h!ue&cx z0K47$M^i@pEGVr@2v2cK3MW-S+(n%V$*+O(hId+@!wUJul9bZ96_Pbxwo7U~<~6)q zDJ*FCQKi3I?H~5T{A`o!pI#^R%FFiN_Tcm`bD8tt-dAwmgYzCDn*|TfZ4=u`aVVB+T#5ICb+;D4UaS)L$p7tPvf^~ zdjvJ&$4KGMTnS~@S>k=f&q{s^_>oJcU5`j=PVY;hVoui)88llL&8gew7+rIruVf<`;Hy1{Sw($NPR{tui>Ocj z+JD0@nyxlq2sT{}lITM4(#h*&p$HZ!=o(L+``A}(|IWF^QVE@J#jI?k?q-)tC3AXH zX$@MQ?(k6uF4nzD+|+O8Z3r*@R{HxDnY~VnH2*RU?m7m5^;gU7+ZuSZ4Kmsv+hEiO zdID+===VW?2>LuIo$-GL{S)X$JXCyV`-N{J=-b+`rv4Hd*a?iz_M87ImB^=P3?67~ zIn=cNbp3g;f6Jo}?Aa-ganiwZi#fC>&&aOE;4}W{hSeE30#5P-p1Y9C_k!i!%W_)b zTafpH3YPnOqypK$jK`1uZt}{Hy7mO!EB9vL-VEHEflqPvZ8oxxQ8xm3y#T~G~k3~^HhHyq2f zsUV2%DOA=e{q-)32;D8^m`KGX96QNx1yuOE!m-e1Ww%>3#CWIb2={YA>8(|i+r#HU z_J47eE5PSK^4#u%;{TxJA1Pk3%G)PM)V*2n!3%0WUQv|e(u2|HBca`c!^Nyq40RZL zjPOI@y+z5k8{t+L3bnU|A8y+l-lKc1drT#cx2ncI3W!aD?=hA7xb>>{ zvl8Ddc%N0`Emikyk_QBzKFiv4EUXeAARMhMbdLE%b^pnOANOp|cd-?nV}zG4-b!F7 zTt7#9fctO?@x7nV(PI*?p3k$&51-FqWqAg_K2g0cjc{0NTtAcg%lm=bosoEp2&;K! z{CB`%cm(*48u}-I*UB3u6|U!vz5$%_TfA@C!*pVK}*2$USI`X$x%v1_yPk-6VV+Rf#iw#%>yFdS!3t|<@9>Ka-{2UZxkApIl&q!Je47=owkwiIk3of;#cNnjeJg~HjU(% z+MiqQ~D0lrvk6H zEF7;f-KlUUdR$B2%MTIrvOULjOe4yW<90nvp?p2X_-xPdAJfY?PpMG5q{H?cpGSa^ zZ?@++ktyFJpdyQM$E+|>qnMuUIi6&?LuqpVS&!);Y74IWo7U|4|1?as@JG%yw@vg1%AVJs z<94Q6^K!1d_CMC_SNi`W+vxNEs%Fpk0H$xSp`!Zy{Tz5B9^PMbD*osHPwMlf+rJLm zCXYSeD;88DLD$#$H(^V2#O?F_WAVSVpM@>$UA8aZQ)o~qvuXi&-ne}p*Hh5(w$JyO zSsD~dn@h^SY|r!-BwqXSy+<{$yKL!J*pBI6HG7V4cPo3=V>dcK4*_93evb3nR #include #include +#include #include"ac.h" #include"fractal.h" #include #include +void init_plugins(); + #endif