diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/benoit/arghandl.cc | 16 | ||||
-rw-r--r-- | src/benoit/benoit.cc | 112 | ||||
-rw-r--r-- | src/benoit/exit.cc | 13 | ||||
-rw-r--r-- | src/benoit/notiffunc.cc | 9 | ||||
-rw-r--r-- | src/benoit/plotmandelbrot.cc | 15 | ||||
-rw-r--r-- | src/benoit/print.cc | 23 | ||||
-rw-r--r-- | src/benoit/strlen.cc | 9 | ||||
-rw-r--r-- | src/benoit/t/pos/pos.cc | 6 | ||||
-rw-r--r-- | src/benoit/~benoit.cc | 10 |
9 files changed, 142 insertions, 71 deletions
diff --git a/src/benoit/arghandl.cc b/src/benoit/arghandl.cc new file mode 100644 index 0000000..059728b --- /dev/null +++ b/src/benoit/arghandl.cc @@ -0,0 +1,16 @@ +# include <benoit.hh> +# include <fmt/core.h> +void benoit::arghandl(int const & argc,char const * * & argv) { + std::string const funcname = "benoit::arghandl(int const &,char const * * &)"s; + this->notiffunc(funcname); + if(argc < 0x2) { + return; + } + for(int pos = 0x1;(pos < argc);++pos) { + std::string arg = argv[pos]; + if(arg == "--help") { + this->print(fmt::format("benoit {}",this->ver)); + this->exit(EXIT_SUCCESS); + } + } +} diff --git a/src/benoit/benoit.cc b/src/benoit/benoit.cc index 7fee86d..7f74282 100644 --- a/src/benoit/benoit.cc +++ b/src/benoit/benoit.cc @@ -2,39 +2,51 @@ # include <cstdint> # include <cstdlib> # include <fcntl.h> +# include <fmt/core.h> # include <string> # include <unistd.h> # include <vector> # include <webp/encode.h> # include <webp/types.h> using namespace std::literals::string_literals; -benoit::benoit(int const argc,char const * * argv) { - /* - let mut x0 = 0x0; - let mut y0 = 0x0; - let maxiter = 0x100; - let mut pos = 0x1; - while pos <= (resx * resy) { - let mut x = 0x0; - let mut y = 0x0; - let mut iter = 0x1; - while x * x + y * y <= 0x4 && iter <= maxiter { - let xtmp = x * x - y * y + x0; - y = 2 * x * y + y0; - x = xtmp; - iter += 0x1; - } - if iter == maxiter { - buf.push(0xFF); - } - else { - buf.push(0x0); - } - buf.push(0x0); - buf.push(0xFF); - pos += 0x1; +[[noreturn]] benoit::benoit(int const argc,char const * * argv) noexcept { + std::string const funcname = "benoit::benoit(int const,char const * *)"s; + this->notiffunc(funcname); + this->arghandl(argc,argv); + switch(this->imgfmt) { + case benoit::t::imgfmt::jpeg: + this->outimg.append(".jpeg"s); + break; + case benoit::t::imgfmt::png: + this->outimg.append(".png"s); + break; + case benoit::t::imgfmt::ppm: + this->outimg.append(".ppm"s); + break; + case benoit::t::imgfmt::webp: + if((this->resx > 0x1000) || (this->resy > 0x1000)) { + this->exit(EXIT_FAILURE,"WebP does not support a resolution of more than 4096"s); + } + this->outimg.append(".webp"s); + break; } - */ + this->exit(EXIT_SUCCESS); + std::vector<std::uint8_t> buf = this->plotmandelbrot(); + int file = ::open(this->outimg.c_str(),O_TRUNC | O_WRONLY); + std::string msg = ("P3 "s + std::to_string(this->resx) + " "s +std::to_string(this->resy) + " 255 "s); + for(auto val : buf) { + msg.append(std::to_string(val)); + msg.append(" "); + } + if(::write(file,msg.c_str(),std::strlen(msg.c_str())) < 0x0) { + this->print(fmt::format("Unable to write to \"{}\"."s,this->outimg)); + } + if(::close(file) < 0x0) { + this->print(fmt::format("Unable to close file \"{]\"."s,this->outimg)); + } + this->exit(EXIT_SUCCESS); +} +# if 0x0 /* auto webpconf = ::WebPConfig(); webpconf.lossless = 0x1; @@ -76,18 +88,17 @@ benoit::benoit(int const argc,char const * * argv) { //buf.push_back(0xFF); //buf.push_back(0x0); //buf.push_back(0x0); - //auto file = std::fstream("image.webp",std::fstream::binary | std::fstream::out | std::fstream::trunc); + //auto file = std::fstream(this->outimt,std::fstream::binary | std::fstream::out | std::fstream::trunc); //if(!file.is_open()) { // ::_exit(EXIT_FAILURE); //} - auto buf = std::vector<std::uint8_t>(); const double maxR = 2.25; const double minR = -2.25; const double maxI = 2.25; const double minI = -2.25; - for(unsigned int x = 0; x < this->resx; ++x) - for(unsigned int y = 0; y < this->resy; ++y) { + for(unsigned int y = 0; y < this->resy; ++y) + for(unsigned int x = 0; x < this->resx; ++x) { long double r = x * ((maxR + this->real * this->zoom) / this->zoom - (minR + this->real * this->zoom) / this->zoom) / this->resx + (minR + this->real * this->zoom) / this->zoom; long double i = y * ((maxI + this->imag * this->zoom) / this->zoom - (minI + this->imag * this->zoom) / this->zoom) / this->resx + (minI + this->imag * this->zoom) / this->zoom; long double r2 = 0.0; @@ -110,35 +121,22 @@ benoit::benoit(int const argc,char const * * argv) { i2 = i2Temp; } - unsigned short int red = 0; - unsigned short int green = 0; - unsigned short int blue = 0; + std::uint8_t blue = 0x0; + std::uint8_t green = 0x0; + std::uint8_t red = 0x0; if(iter != this->maxiter) { - double t = (double)(iter) / (double)(this->maxiter); - red = (int)(9.0 * (1.0 - t) * t * t * t * 255.0); - green = (int)(15.0 * (1.0 - t) * (1.0 - t) * t * t * 255.0); - blue = (int)(8.5 * (1.0 - t) * (1.0 - t) * (1.0 - t) * t * 255.0); + float tmp = ((float)(iter) / (float)(this->maxiter)); + blue = (std::uint8_t)((1.0 - tmp) * 255.0); + green = (std::uint8_t)((1.0 - tmp) * 255.0); + red = (std::uint8_t)((1.0 - tmp) * 255.0); + //double t = (double)(iter) / (double)(this->maxiter); + //red = (int)(8.0 * (1.0 - t) * t * t * t * 255.0); + //green = (int)(16.0 * (1.0 - t) * (1.0 - t) * t * t * 255.0); + //blue = (int)(8.0 * (1.0 - t) * (1.0 - t) * (1.0 - t) * t * 255.0); } - buf.push_back(red); - buf.push_back(green); buf.push_back(blue); + buf.push_back(green); + buf.push_back(red); } - auto file = ::open("image.webp",O_WRONLY); - //std::uint8_t * data; - //auto outimglen = WebPEncodeLosslessRGB(buf.data(),this->resx,this->resy,0x8,&data); - //file.write(reinterpret_cast<char *>(data),outimglen); - std::string msg = ("P3 "s + std::to_string(this->resx) + " "s +std::to_string(this->resy) + " 255 "s); - for(auto val : buf) { - msg.append(std::to_string(val)); - msg.append(" "); - } - if(::write(file,msg.c_str(),this->strlen(msg.c_str())) < 0x0) { - this->print("Unable to write to \"image.webp\"."); - } - if(::close(file) < 0x0) { - this->print("Unable to close file \"image.webp\"."); - } - //file.close(); - ::_exit(EXIT_SUCCESS); -} +# endif diff --git a/src/benoit/exit.cc b/src/benoit/exit.cc new file mode 100644 index 0000000..e408b9c --- /dev/null +++ b/src/benoit/exit.cc @@ -0,0 +1,13 @@ +# include <benoit.hh> +# include <fmt/core.h> +# include <string> +# include <unistd.h> +using namespace std::literals::string_literals; +[[noreturn]] void benoit::exit(int code,std::string msg) noexcept { + std::string const funcname = "benoit::exit(int,std::string)"s; + this->notiffunc(funcname); + if(msg != ""s) { + this->print(fmt::format("Exited with error code {}: {}",code,msg),true); + } + ::_exit(code); +} diff --git a/src/benoit/notiffunc.cc b/src/benoit/notiffunc.cc new file mode 100644 index 0000000..bb2152c --- /dev/null +++ b/src/benoit/notiffunc.cc @@ -0,0 +1,9 @@ +# include <benoit.hh> +# include <fmt/core.h> +# include <string> +void benoit::notiffunc(std::string const callfuncname) { + std::string const funcname = "benoit::notiffunc(std:.string constexpr)"s; + if constexpr(benoit::debug) { + this->print(fmt::format("Function \"{}\" has been called."s,callfuncname)); + } +} diff --git a/src/benoit/plotmandelbrot.cc b/src/benoit/plotmandelbrot.cc new file mode 100644 index 0000000..a4bf074 --- /dev/null +++ b/src/benoit/plotmandelbrot.cc @@ -0,0 +1,15 @@ +# include <benoit.hh> +# include <boost/multiprecision/mpfr.hpp> +# include <cstdint> +# include <vector> +/* +namespace { + void static * plotarea(); +} +*/ +std::vector<std::uint8_t> benoit::plotmandelbrot() { + std::string const funcname = "benoit::plotmandelbrot()"s; + this->notiffunc(funcname); + std::vector<std::uint8_t> img; + return img; +} diff --git a/src/benoit/print.cc b/src/benoit/print.cc index 441cfd5..7f7901c 100644 --- a/src/benoit/print.cc +++ b/src/benoit/print.cc @@ -1,13 +1,26 @@ # include <benoit.hh> # include <fcntl.h> # include <stdexcept> +# include <string> # include <unistd.h> -void benoit::print(char const * msg) { - auto file = ::open("/dev/stdout",O_WRONLY); - if(::write(file,msg,this->strlen(msg)) < 0x0) { - throw std::runtime_error("Unable to write to Stdout.\u000A"); +void benoit::print(char const * msg,bool stderr) { + std::string const funcname = "benoit::print(char const *)"s; + this->print(std::string(msg),stderr); +} +void benoit::print(std::string msg,bool stderr) { + std::string const funcname = "benoit::print(std::string)"s; + int file = 0x0; + if(stderr) { + ::open("/dev/stderr",O_WRONLY); + } + else { + ::open("/dev/stdout",O_WRONLY); + } + msg.append("\u000A"); + if(::write(file,msg.c_str(),msg.size()) < 0x0) { + throw std::runtime_error("Unable to write to Stdout."); } if(::close(file) < 0x0) { - throw std::runtime_error("Unable to close Stdout\u000A"); + throw std::runtime_error("Unable to close Stdout"); } } diff --git a/src/benoit/strlen.cc b/src/benoit/strlen.cc deleted file mode 100644 index c0947ba..0000000 --- a/src/benoit/strlen.cc +++ /dev/null @@ -1,9 +0,0 @@ -# include <benoit.hh> -# include <cstddef> -std::size_t benoit::strlen(char const * str) noexcept { - std::size_t len = 0x0; - while(str[len] != '\0') { - ++len; - } - return len; -} diff --git a/src/benoit/t/pos/pos.cc b/src/benoit/t/pos/pos.cc new file mode 100644 index 0000000..43941b2 --- /dev/null +++ b/src/benoit/t/pos/pos.cc @@ -0,0 +1,6 @@ +# include <benoit.hh> +# include <boost/multiprecision/mpfr.hpp> +benoit::t::pos::pos(boost::multiprecision::mpfr_float x,boost::multiprecision::mpfr_float y) { + this->x = x; + this->y = y; +} diff --git a/src/benoit/~benoit.cc b/src/benoit/~benoit.cc new file mode 100644 index 0000000..b16b42d --- /dev/null +++ b/src/benoit/~benoit.cc @@ -0,0 +1,10 @@ +# include <benoit.hh> +# include <cstdlib> +# include <string> +# include <unistd.h> +using namespace std::literals::string_literals; +[[noreturn]] benoit::~benoit() noexcept { + std::string const funcname = "benoit::~benoit()"s; + this->notiffunc(funcname); + this->exit(EXIT_SUCCESS); +} |