diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/benoit/arghandl.cc | 15 | ||||
-rw-r--r-- | src/benoit/d/alpha.cc | 2 | ||||
-rw-r--r-- | src/benoit/d/logdoprint.cc | 4 | ||||
-rw-r--r-- | src/benoit/helpscrn.cc | 60 | ||||
-rw-r--r-- | src/benoit/plotmandelbrot.cc | 99 | ||||
-rw-r--r-- | src/benoit/t/pos/pos.cc | 4 |
6 files changed, 96 insertions, 88 deletions
diff --git a/src/benoit/arghandl.cc b/src/benoit/arghandl.cc index 0b0b4cc..d54cde8 100644 --- a/src/benoit/arghandl.cc +++ b/src/benoit/arghandl.cc @@ -1,7 +1,9 @@ # include <benoit/archstr.hh> # include <benoit/arghandl.hh> +# include <benoit/d/alpha.hh> # include <benoit/d/dobt.hh> # include <benoit/d/imgfmt.hh> +# include <benoit/d/maxiter.hh> # include <benoit/d/numthrds.hh> # include <benoit/d/outimg.hh> # include <benoit/d/resx.hh> @@ -44,7 +46,15 @@ void benoit::arghandl(int const & argc,char const * * & argv) { benoit::log(funcname,fmt::format("Found object “{}”.",obj)); std::string val = arg.substr(eqpos + 0x1); benoit::log(funcname,fmt::format("Found value “{}”.",val)); - if(obj == "force-backtrace"s) { + if(obj == "alpha"s) { + if(!strtobool.contains(val)) { + benoit::print(fmt::format(invalvalforobj,val,obj)); + } + else { + benoit::d::alpha = strtobool[val]; + } + } + else if(obj == "force-backtrace"s) { if(!strtobool.contains(val)) { benoit::print(fmt::format(invalvalforobj,val,obj)); } @@ -70,6 +80,9 @@ void benoit::arghandl(int const & argc,char const * * & argv) { benoit::d::resy = 0x10000; } } + else if(obj == "maximum-iterations"s) { + std::from_chars(val.c_str(),(val.c_str() + val.size()),benoit::d::maxiter); + } else if(obj == "output"s) { benoit::d::outimg = val; } diff --git a/src/benoit/d/alpha.cc b/src/benoit/d/alpha.cc new file mode 100644 index 0000000..65d2dcc --- /dev/null +++ b/src/benoit/d/alpha.cc @@ -0,0 +1,2 @@ +# include <benoit/d/alpha.hh> +bool benoit::d::alpha = false; diff --git a/src/benoit/d/logdoprint.cc b/src/benoit/d/logdoprint.cc index 5b68c6a..71de54b 100644 --- a/src/benoit/d/logdoprint.cc +++ b/src/benoit/d/logdoprint.cc @@ -1,7 +1,7 @@ # include <benoit/d/logdoprint.hh> bool benoit::d::logdoprint = # if defined(NDEBUG) - false; +false; # else - true; +true; # endif diff --git a/src/benoit/helpscrn.cc b/src/benoit/helpscrn.cc index 140f5ef..70dd5c6 100644 --- a/src/benoit/helpscrn.cc +++ b/src/benoit/helpscrn.cc @@ -2,6 +2,8 @@ # include <benoit/helpscrn.hh> # include <benoit/d/arch.hh> # include <benoit/d/kernel.hh> +# include <benoit/d/logdoprint.hh> +# include <benoit/d/printdolog.hh> # include <benoit/d/ver.hh> # include <benoit/exit.hh> # include <benoit/kernelstr.hh> @@ -20,58 +22,58 @@ using namespace std::literals::string_literals; std::string time = __TIME__; std::unordered_map<std::string,std::string> monthmap = { { - "Jan", - "01", + "Jan"s, + "01"s, }, { - "Feb", - "02", + "Feb"s, + "02"s, }, { - "Mar", - "03", + "Mar"s, + "03"s, }, { - "Apr", - "04", + "Apr"s, + "04"s, }, { - "May", - "05", + "May"s, + "05"s, }, { - "Jun", - "06", + "Jun"s, + "06"s, }, { - "Jul", - "07", + "Jul"s, + "07"s, }, { - "Aug", - "08", + "Aug"s, + "08"s, }, { - "Sep", - "09", + "Sep"s, + "09"s, }, { - "Oct", - "10", + "Oct"s, + "10"s, }, { - "Nov", - "11", + "Nov"s, + "11"s, }, { - "Dec", - "12", + "Dec"s, + "12"s, }, }; std::string year = date.substr(0x7); std::string month = monthmap[date.substr(0x0,0x3)]; std::string day = date.substr(0x4,0x2); - cmdate = year + "-"s + month + "-"s + day + "T"s + time; + cmdate = fmt::format("{}-{}-{}T{}"s,year,month,day,time); } std::string cppver = ""s; { @@ -113,17 +115,23 @@ using namespace std::literals::string_literals; else { datmod = fmt::format("{} AKA how the fuck did this get compiled?"s,datmod); } + benoit::d::logdoprint = false; + benoit::d::printdolog = false; benoit::print(""s); benoit::print(fmt::format("benoit {}",benoit::d::ver)); benoit::print("Copyright 2021 Gabriel Jensen"s); benoit::print(""s); benoit::print("Arguments:"s); + benoit::print("\u0009alpha={false,true}:"s); + benoit::print("\u0009\u0009Sets whether or not to use alpha or background colour for rendered image."s); benoit::print("\u0009force-backtrace={false,true}:"s); benoit::print("\u0009\u0009Forces the backtrace of the at programme exit."s); benoit::print("\u0009height={0..65536}:"s); benoit::print("\u0009\u0009Sets the height for the rendered image."s); benoit::print("\u0009help, --help:"s); benoit::print("\u0009\u0009Displays this information screen."s); + benoit::print("\u0009maximum-iterations={0..18446744073709551615}:"s); + benoit::print("\u0009\u0009Sets the maximum number of iterations allowed."s); benoit::print("\u0009threads={0..65536}:"s); benoit::print("\u0009\u0009Sets the number of threads that will be used."s); benoit::print("\u0009height={0..65536}:"s); @@ -136,5 +144,7 @@ using namespace std::literals::string_literals; benoit::print(fmt::format("\u0009Data Model: {}"s,datmod)); benoit::print(fmt::format("\u0009System Kernel: {}"s,benoit::kernelstr(benoit::d::kernel))); benoit::print(""s); + benoit::d::logdoprint = true; + benoit::d::printdolog = true; benoit::exit(EXIT_SUCCESS); } diff --git a/src/benoit/plotmandelbrot.cc b/src/benoit/plotmandelbrot.cc index bbc5f8a..8517c99 100644 --- a/src/benoit/plotmandelbrot.cc +++ b/src/benoit/plotmandelbrot.cc @@ -1,3 +1,5 @@ +# include <benoit/d/alpha.hh> +# include <benoit/d/maxiter.hh> # include <benoit/d/numthrds.hh> # include <benoit/d/pos.hh> # include <benoit/d/resx.hh> @@ -20,11 +22,38 @@ using namespace std::literals::string_literals; namespace { void * plotarea(void * thrddatptr) { benoit::t::thrddat * thrddat = reinterpret_cast<benoit::t::thrddat *>(thrddatptr); + const long double maxR = 0x2p0; + const long double minR = -0x2p0; + const long double maxI = 0x2p0; + const long double minI = -0x2p0; for(unsigned long long px = *thrddat->imgbegin;(px <= *thrddat->imgend);++px) { - thrddat->img[px].r = *thrddat->thrdcol; - thrddat->img[px].g = *thrddat->thrdcol; - thrddat->img[px].b = *thrddat->thrdcol; - thrddat->img[px].a = 0xBF; + unsigned x = (px % benoit::d::resx); + unsigned y = ((px - (px % benoit::d::resy)) / benoit::d::resy); + long double r = x * ((maxR + benoit::d::pos.x * benoit::d::pos.zoom) / benoit::d::pos.zoom - (minR + benoit::d::pos.x * benoit::d::pos.zoom) / benoit::d::pos.zoom) / benoit::d::resx + (minR + benoit::d::pos.x * benoit::d::pos.zoom) / benoit::d::pos.zoom; + long double i = y * ((maxI + benoit::d::pos.y * benoit::d::pos.zoom) / benoit::d::pos.zoom - (minI + benoit::d::pos.y * benoit::d::pos.zoom) / benoit::d::pos.zoom) / benoit::d::resx + (minI + benoit::d::pos.y * benoit::d::pos.zoom) / benoit::d::pos.zoom; + long double r2 = 0x0p0; + long double i2 = 0x0p0; + unsigned iter; + for(iter = 0x0u; iter < benoit::d::maxiter; ++iter) { + if(r2 * r2 + i2 * i2 >= 0x4p0) { + break; + } + long double r2Temp = r2 * r2 - i2 * i2 + r; + long double i2Temp = 0x2p0 * r2 * i2 + i; + if(r2 == r2Temp && i2 == i2Temp) { + iter = benoit::d::maxiter; + break; + } + r2 = r2Temp; + i2 = i2Temp; + } + { + float tmp = ((float)(iter) / (float)(benoit::d::maxiter)); + thrddat->img[px].r = static_cast<std::uint8_t>((0x1p0 - tmp) * 0xFFp0); + thrddat->img[px].g = static_cast<std::uint8_t>((0x1p0 - tmp) * 0xFFp0); + thrddat->img[px].b = static_cast<std::uint8_t>((0x1p0 - tmp) * 0xFFp0); + thrddat->img[px].a = static_cast<std::uint8_t>(tmp * 0xFFp0); + } } pthread_exit(nullptr); } @@ -50,77 +79,31 @@ std::vector<std::uint8_t> * benoit::plotmandelbrot() { --*thrds[thrdid].imgend; assert(*thrds[thrdid].imgend <= numpx); remainpx -= (*thrds[thrdid].imgend - *thrds[thrdid].imgbegin + 0x1); - thrds[thrdid].thrdcol = ::new std::uint8_t((float)(thrdid + 0x1) / (float)(benoit::d::numthrds) * 0xFFp0); thrds[thrdid].thrd = ::new pthread_t; - benoit::log(fmt::format("Thread #{} will render a total of {} pixels, starting at position {} and ending at position {}, each with the colour {}, which means there are {} pixels remaining."s,thrdid,(*thrds[thrdid].imgend - *thrds[thrdid].imgbegin + 0x1),*thrds[thrdid].imgbegin,*thrds[thrdid].imgend,*thrds[thrdid].thrdcol,remainpx)); + benoit::log(fmt::format("Thread #{} will render a total of {} pixels, starting at position {} and ending at position {}, which means there are {} pixels remaining."s,thrdid,(*thrds[thrdid].imgend - *thrds[thrdid].imgbegin + 0x1),*thrds[thrdid].imgbegin,*thrds[thrdid].imgend,remainpx)); ::pthread_create(thrds[thrdid].thrd,nullptr,::plotarea,&thrds[thrdid]); } for(auto thrd : thrds) { ::pthread_join(*thrd.thrd,nullptr); - benoit::log(fmt::format("Thread #{}, which coloured it's pixels with {}, has joined."s,*thrd.id,*thrd.thrdcol)); + benoit::log(fmt::format("Thread #{} has joined."s,*thrd.id)); ::delete thrd.id; ::delete thrd.imgbegin; ::delete thrd.imgend; ::delete thrd.thrd; - ::delete thrd.thrdcol; } std::vector<std::uint8_t> * img = ::new std::vector<std::uint8_t>; for(unsigned long long pos = 0x0ull;(pos < numpx);++pos) { img->push_back(rgbaimg[pos].r); img->push_back(rgbaimg[pos].g); img->push_back(rgbaimg[pos].b); - img->push_back(rgbaimg[pos].a); + if(benoit::d::alpha) { + img->push_back(rgbaimg[pos].a); + } + else { + img->push_back(0xFF); + } } ::delete rgbaimg; benoit::logfuncret(funcname); return img; } -/* -const double maxR = 2.25; -const double minR = -2.25; -const double maxI = 2.25; -const double minI = -2.25; - -for(unsigned int y = 0; y < benoit::d::resy; ++y) - for(unsigned int x = 0; x < benoit::d::resx; ++x) { - long double r = x * ((maxR + benoit::real * benoit::d::zoom) / benoit::d::zoom - (minR + benoit::real * benoit::d::zoom) / benoit::d::zoom) / benoit::d::resx + (minR + benoit::real * benoit::d::zoom) / benoit::d::zoom; - long double i = y * ((maxI + benoit::imag * benoit::d::zoom) / benoit::d::zoom - (minI + benoit::imag * benoit::d::zoom) / benoit::d::zoom) / benoit::d::resx + (minI + benoit::imag * benoit::d::zoom) / benoit::d::zoom; - long double r2 = 0.0; - long double i2 = 0.0; - - unsigned int iter; - for(iter = 0; iter < benoit::maxiter; ++iter) { - if(r2 * r2 + i2 * i2 >= 4.0) - break; - - long double r2Temp = r2 * r2 - i2 * i2 + r; - long double i2Temp = 2.0 * r2 * i2 + i; - - if(r2 == r2Temp && i2 == i2Temp) { - iter = benoit::maxiter; - break; - } - - r2 = r2Temp; - i2 = i2Temp; - } - - std::uint8_t blue = 0x0; - std::uint8_t green = 0x0; - std::uint8_t red = 0x0; - - if(iter != benoit::maxiter) { - float tmp = ((float)(iter) / (float)(benoit::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)(benoit::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(blue); - buf.push_back(green); - buf.push_back(red); - } -*/ diff --git a/src/benoit/t/pos/pos.cc b/src/benoit/t/pos/pos.cc index f1237e0..a69f8ec 100644 --- a/src/benoit/t/pos/pos.cc +++ b/src/benoit/t/pos/pos.cc @@ -1,6 +1,6 @@ # include <benoit/t/pos.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; + //this->x = x; + //this->y = y; } |