Permalink
Cannot retrieve contributors at this time
Join GitHub today
GitHub is home to over 28 million developers working together to host and review code, manage projects, and build software together.
Sign up
Fetching contributors…
| //// Written by Johan De Bock <johan.debock@gmail.com> | |
| //// | |
| //// memory requirements : td_nb * (Rw * Rh * 4 + bb_bail * 24) + (Rlrmax[0] + Rlrmax[1] + Rlrmax[2] + 3) * 4 + (Ww * Wh + Tw * Th) * 12 | |
| //// R2000x2000 bb1000 th3 : 48 MB | |
| //// R4000x4000 bb1000 th3 : 192 MB | |
| //// R8000x8000 bb1000 th3 : 768 MB | |
| //// R16000x16000 bb1000 th3 : 3072 MB | |
| //// R32000x32000 bb1000 th3 : 12288 MB | |
| //// R40000x40000 bb1000 th3 : 19200 MB | |
| //// R50000x50000 bb1000 th3 : 30000 MB tested | |
| #define __USE_MINGW_ANSI_STDIO 1 | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <math.h> | |
| #include <time.h> | |
| #include <omp.h> | |
| #include "SDL.h" | |
| #include "dSFMT.h" | |
| #include "png.h" | |
| #ifdef WINDOWS | |
| #include <windows.h> | |
| #define wait_ms(x) Sleep(x) | |
| #endif | |
| #ifdef LINUX | |
| #include <unistd.h> | |
| #define wait_ms(x) usleep((x) * 1000) | |
| #endif | |
| #define MIN(a,b) (((a)<(b))?(a):(b)) | |
| #define MAX(a,b) (((a)>(b))?(a):(b)) | |
| //// strings | |
| char titlebar[512]; | |
| int tbs = 0; // title bar switch | |
| #define TBS_NB 3 | |
| char filename[512]; | |
| char dirname[512]; | |
| char commandname[512]; | |
| //// SDL | |
| SDL_Window* sdl_window; | |
| SDL_Renderer* sdl_renderer; | |
| SDL_Surface* sdl_surface; | |
| SDL_Texture* sdl_texture; | |
| SDL_Event sdl_event; | |
| //// keep total number of paths plotted for a render | |
| long long unsigned int Ppsum; | |
| //// fps frames per second functionality | |
| double fps = 1.0; | |
| Uint32 t_last_frame = 0; // time last frame was rendered | |
| //// auto write PNG functionality | |
| //// auto write mode 0 : no auto write | |
| //// auto write mode 1 : auto write based on time | |
| //// auto write mode 2 : auto write based on Ppsum | |
| int autoWtoPNG = 0; // auto write window to one png | |
| int autoRTtoPNG = 0; // auto write tiled render to multiple pngs | |
| int autoRtoPNG = 0; // auto write render to one png | |
| #define AUTOWRITE_MODE_NB 3 // number of auto write PNG modes | |
| //// auto write mode 1 | |
| Uint32 t_autoPNG_last = 0; // time last auto PNG was written | |
| Uint32 t_autoPNG_delta = 6e5; // time between each auto PNG write, default 10min | |
| //// auto write mode 2 | |
| long long unsigned int Ppsum_autoPNG_last = 0; // Ppsum of last written auto PNG | |
| long long unsigned int Ppsum_autoPNG_delta = 1e9; // Ppsum difference between each auto PNG write, default 1e9 | |
| //// td threads | |
| #define TD_MAX 18 // maximum number of calc threads | |
| int td_nb; // number of calc threads | |
| int td_vc_nb = 2; // number of virtual cores | |
| int td_stop = 0; // signal td_stop to all threads | |
| int td_pause = 0; // signal td_pause to all calc threads | |
| int td_paused[TD_MAX]; // which calc threads are paused | |
| //// lr layer | |
| //// suppose 3 calc threads | |
| //// layer mode 0 : sum 3 threads -> 1 index in 1 RGB/Grey color table -> pixels RGB/Grey | |
| //// layer mode 1 : sum 3 threads -> 1 index in 3 Grey color tables -> pixels RGB | |
| //// layer mode 2 : 3 threads -> 3 indexes in 3 Grey color tables -> pixels RGB | |
| int lr_mode; // layer mode | |
| #define LR_MODE_NB 3 // number of layer modes | |
| #define LR_NB 3 // number of layers | |
| //// C seeding complex rectangle | |
| #define C_BATCH_NB 100 // number of c to try in one batch, without interruption | |
| double Cr_lo = -2.0, Cr_up = 2.0; // real lower and upper bound of rectangle C in complex plane | |
| double Ci_lo = 0.0, Ci_up = 2.0; // imaginary lower and upper bound of rectangle C in complex plane : only positive : symmetric | |
| double Cr_ra = Cr_up - Cr_lo; // real range of rectangle C in complex plane | |
| double Ci_ra = Ci_up - Ci_lo; // imaginary range of rectangle C in complex plane | |
| //// P path (in complex plane), Mandelbrot | |
| //// P[n] = z_{n+1} = z_n²+c | |
| //// P = [c, c²+c, (c²+c)²+c, ...] | |
| typedef struct { | |
| double r; // real | |
| double i; // imaginary | |
| } complex; // complex number | |
| complex* P[TD_MAX]; // 1 path , per thread | |
| unsigned int* RPo[TD_MAX]; // offsets of a path in render , per thread | |
| long long unsigned int Pp[TD_MAX]; // number of paths plotted , per thread | |
| //// bb BuddhaBrot types and parameters | |
| //// BuddhaBrot type 0 : the Buddhabrot | |
| //// BuddhaBrot type 1 : the Anti-Buddhabrot | |
| //// BuddhaBrot type 2 : the Anti-Buddhabrot with some lobes cut | |
| //// Mandelbrot set = Mset = set of c for which : z_n bounded : lim_{n->inf} z_n != inf | |
| //// notMset = set of c for which : z_n unbounded : lim_{n->inf} z_n == inf | |
| //// | |
| //// Buddhabrot : notMset : unbounded | |
| //// plot the unbounded paths = P[n_inf]² > 4 for n_inf < bailout | |
| //// -> n_inf = core_mandelbrot(c) | |
| //// skip the certainly bounded paths | |
| //// | |
| //// Anti-Buddhabrot : Mset : bounded | |
| //// plot the bounded paths = P[n_inf]² <= 4 for n_inf == bailout | |
| //// -> n_inf = core_mandelbrot(c) | |
| int bb_type[TD_MAX]; // BuddhaBrot type , per thread | |
| #define BB_TYPE_NB 3 // number of BuddhaBrot types | |
| int bb_bail[TD_MAX]; // bailout , per thread | |
| int bb_pps[TD_MAX]; // path plot start : start plotting for n = bb_pps , per thread | |
| int bb_ppe[TD_MAX]; // path plot end : end plotting for n = n_inf - bb_ppe , per thread | |
| int bb_minn[TD_MAX]; // path minimum n_inf : plot path only if n_inf >= bb_minn , per thread | |
| //// R render (count matrix (of pixels)) | |
| //// registers the number of times a path passed in a pixel | |
| //// mapped in a complex rectangle | |
| unsigned int* R[TD_MAX]; // 1 render , per thread | |
| int Rw = 0; // render width | |
| int Rh = 0; // render height | |
| unsigned int Rlrmax[LR_NB]; // maximum count sum , per layer | |
| double Rr_lo, Rr_up; // real lower and upper bound of rectangle R in complex plane | |
| double Rr_ra; // real range of rectangle R in complex plane | |
| double Ri_lo, Ri_up; // imaginary lower and upper bound of rectangle R in complex plane | |
| double Ri_ra; // imaginary range of rectangle R in complex plane | |
| double Rhdivr; // Rhdivr = Rh / Rr_ra | |
| double Rwdivi; // Rwdivi = Rw / Ri_ra | |
| double Rr_f = 0.5; // factor to change Rr_ra | |
| double Ri_f = 0.5; // factor to change Ri_ra TODO | |
| double Rw_f = 0.5; // factor to change render width | |
| double Rh_f = 0.5; // factor to change render height | |
| //// H histogram | |
| //// a histogram of the values in a render, bins 0, 1, 2, ..., Rlrmax | |
| unsigned int* H[LR_NB]; // 1 histogram , per layer | |
| unsigned int Hl[LR_NB] = {0, 0, 0}; // histogram length > Rlrmax , per layer | |
| //// W window (count matrix (of pixels)) | |
| //// for the pixels shown in the BuddhaBrot window | |
| //// it is located somewhere in the render | |
| unsigned int* W[LR_NB]; // 1 window , per layer | |
| int Ww = 1000; // window width | |
| int Wh = 1000; // window height | |
| int RWow = 0; // x offset of window in render | |
| int RWoh = 0; // y offset of window in render | |
| double Wr_lo, Wr_up; // real lower and upper bound of rectangle W in complex plane | |
| double Wi_lo, Wi_up; // imaginary lower and upper bound of rectangle W in complex plane | |
| int recalc_WH_if_paused = 0; // indicate that H and W need to be recalculated when changing layer mode/coloring method/panning window when paused | |
| //// T tile (count matrix (of pixels)) | |
| //// for the pixels outputted to a png image | |
| //// it is located somewhere in the render | |
| unsigned int* T[LR_NB]; // 1 tile , per layer | |
| int Tw = 1000; // tile width | |
| int Th = 1000; // tile height | |
| //// cm coloring methods | |
| //// coloring method 0 : rank-order mapping : each unique sum get a unique color : independent of sum frequency | |
| //// coloring method 1 : histogram equalization : frequent sums get spread more in color table : ideally resulting in flat histogram or each color evenly represented | |
| //// coloring method 2 : linear | |
| //// coloring method 0 : problematic : when lots of low freq unique sums : 25% of unique -> spread over 25% of color table | |
| //// coloring method 1 : problematic : when a few high freq sums : 25% of pixels = sum -> 25% jump in color table | |
| //// coloring method 0 : effect on Buddhabrot 0->255 : more detail in mid sums : low sums lost in black | |
| //// coloring method 1 : effect on Buddhabrot 0->255 : more detail in low sums : high sums lost in white | |
| //// coloring method 0 : if cm0n > 1 : i = e * Rank[sum] / (cm0n - 1) | |
| //// coloring method 0 : else i = 0 | |
| //// coloring method 1 : if cm1n > 0 : i = e * CumulativeH[sum] / cm1n : | |
| //// coloring method 1 : else i = 0 TODO check e * () in code optim | |
| int cm[LR_NB]; // coloring method , per layer | |
| #define CM_NB 3 // number of coloring methods | |
| unsigned int cm0n[LR_NB]; // normalization value for coloring method 0 = number of filled bins in histogram = number of unique values in render , per layer | |
| unsigned int cm1n[LR_NB]; // normalization value for coloring method 1 = (number of pixels in render - number of 0 pixels in render) , per layer | |
| //// csf coloring sum function | |
| //// sum function 0 : none | |
| //// sum function 1 : log | |
| //// sum function 0 : sum -> sum | |
| //// sum function 1 : if sum >= (unsigned int)csfp1 : sum -> csfp1 + log(sum - csfp1 + 1) | |
| //// sum function 1 : else sum -> sum | |
| int csf[LR_NB]; // coloring sum function , per layer | |
| #define CSF_NB 2 // number of coloring sum functions | |
| int csfp1[LR_NB]; // parameter 1 , per layer | |
| //// CT color tables | |
| //// index -> Grey value | |
| unsigned char* CT[LR_NB]; // 1 color table , per layer | |
| int CTe[LR_NB]; // color table end (= length-1) , per layer | |
| int ct_type[LR_NB]; // 1 color table type, per layer | |
| #define CT_TYPE_NB 6 // number of color table types | |
| double ct_f[LR_NB] = {1.0, 1.0, 1.0}; // scale index in color table with this factor (with clipping) i = MIN(e, ct_f * i) , per layer | |
| int ct_o[LR_NB]; // start offset in color table (0 index gets mapped on this color) , per layer | |
| int ct_v[LR_NB] = {0, 0, 0}; // cycle speed : diff per frame in index , per layer | |
| //// plc permutate layer color functionality | |
| int plc = 0; | |
| #define PLC_NB 6 | |
| int ct_cycle(int i, int e) | |
| { | |
| return ((i > e) ? (i - e - 1) : ((i < 0) ? (e + i + 1) : i)); | |
| } | |
| void ct_load(int load_selectedlayer, int load_ct_type1, int load_ct_type2, int load_ct_type3) | |
| { | |
| ct_type[0] = load_ct_type1; | |
| ct_type[1] = load_ct_type2; | |
| ct_type[2] = load_ct_type3; | |
| int layer_start = 0; | |
| int layer_end = LR_NB - 1; | |
| if (load_selectedlayer != -1) { | |
| layer_start = load_selectedlayer; | |
| layer_end = load_selectedlayer; | |
| } | |
| for (int layer_iter = layer_start; layer_iter <= layer_end; layer_iter++) { | |
| if (ct_type[layer_iter] == 0) { | |
| CTe[layer_iter] = 255; | |
| free(CT[layer_iter]); | |
| CT[layer_iter] = (unsigned char*)calloc(CTe[layer_iter] + 1, sizeof(unsigned char)); | |
| for (int i = 0; i <= 255; i++) { | |
| CT[layer_iter][i] = i; | |
| } | |
| } | |
| if (ct_type[layer_iter] == 1) { | |
| CTe[layer_iter] = 255; | |
| free(CT[layer_iter]); | |
| CT[layer_iter] = (unsigned char*)calloc(CTe[layer_iter] + 1, sizeof(unsigned char)); | |
| for (int i = 0, j = 255; j >= 0; i++, j--) { | |
| CT[layer_iter][i] = j; | |
| } | |
| } | |
| if (ct_type[layer_iter] == 2) { | |
| CTe[layer_iter] = 509; | |
| free(CT[layer_iter]); | |
| CT[layer_iter] = (unsigned char*)calloc(CTe[layer_iter] + 1, sizeof(unsigned char)); | |
| for (int i = 0; i < 255; i++) { | |
| CT[layer_iter][i] = i; | |
| } | |
| for (int i = 255, j = 255; j > 0; i++, j--) { | |
| CT[layer_iter][i] = j; | |
| } | |
| } | |
| if (ct_type[layer_iter] == 3) { | |
| CTe[layer_iter] = 509; | |
| free(CT[layer_iter]); | |
| CT[layer_iter] = (unsigned char*)calloc(CTe[layer_iter] + 1, sizeof(unsigned char)); | |
| for (int i = 0, j = 255; j > 0; i++, j--) { | |
| CT[layer_iter][i] = j; | |
| } | |
| for (int i = 255, j = 0; j < 255; i++, j++) { | |
| CT[layer_iter][i] = j; | |
| } | |
| } | |
| if (ct_type[layer_iter] == 4) { | |
| CTe[layer_iter] = 255; | |
| free(CT[layer_iter]); | |
| CT[layer_iter] = (unsigned char*)calloc(CTe[layer_iter] + 1, sizeof(unsigned char)); | |
| for (int i = 0; i <= 255; i++) { | |
| CT[layer_iter][i] = 0; | |
| } | |
| } | |
| if (ct_type[layer_iter] == 5) { | |
| CTe[layer_iter] = 255; | |
| free(CT[layer_iter]); | |
| CT[layer_iter] = (unsigned char*)calloc(CTe[layer_iter] + 1, sizeof(unsigned char)); | |
| for (int i = 0; i <= 255; i++) { | |
| CT[layer_iter][i] = 255; | |
| } | |
| } | |
| } | |
| } | |
| void reponsive_caption_update(const char* string) | |
| { | |
| SDL_SetWindowTitle(sdl_window, string); | |
| SDL_PollEvent(&sdl_event); | |
| } | |
| void pause_calcthreads_and_wait() | |
| { | |
| td_pause = 1; | |
| #pragma omp flush(td_pause) | |
| while (1) { | |
| int td_paused_nb = 0; | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| td_paused_nb += td_paused[td_i]; | |
| } | |
| if (td_paused_nb == td_nb) { | |
| break; | |
| } | |
| wait_ms(50); | |
| } | |
| } | |
| void reset_R(int td_i) | |
| { | |
| Pp[td_i] = 0; | |
| memset(R[td_i], 0, (unsigned int)Rw * Rh * sizeof(unsigned int)); | |
| Hl[0] = 0; | |
| Hl[1] = 0; | |
| Hl[2] = 0; | |
| t_autoPNG_last = (SDL_GetTicks() / t_autoPNG_delta) * t_autoPNG_delta; | |
| Ppsum_autoPNG_last = 0; | |
| } | |
| void realloc_R(int td_i) | |
| { | |
| Pp[td_i] = 0; | |
| if (R[td_i] != NULL) { | |
| free(R[td_i]); | |
| R[td_i] = NULL; | |
| } | |
| R[td_i] = (unsigned int*)calloc((unsigned int)Rw * Rh, sizeof(unsigned int)); | |
| Hl[0] = 0; | |
| Hl[1] = 0; | |
| Hl[2] = 0; | |
| t_autoPNG_last = (SDL_GetTicks() / t_autoPNG_delta) * t_autoPNG_delta; | |
| Ppsum_autoPNG_last = 0; | |
| } | |
| void realloc_P(int td_i) | |
| { | |
| if (P[td_i] != NULL) { | |
| free(P[td_i]); | |
| P[td_i] = NULL; | |
| } | |
| P[td_i] = (complex*)calloc(bb_bail[td_i], sizeof(complex)); | |
| if (RPo[td_i] != NULL) { | |
| free(RPo[td_i]); | |
| RPo[td_i] = NULL; | |
| } | |
| RPo[td_i] = (unsigned int*)calloc(2 * bb_bail[td_i], sizeof(unsigned int)); | |
| } | |
| void free_calcthread(int td_i) | |
| { | |
| Pp[td_i] = 0; | |
| if (R[td_i] != NULL) { | |
| free(R[td_i]); | |
| R[td_i] = NULL; | |
| } | |
| if (P[td_i] != NULL) { | |
| free(P[td_i]); | |
| P[td_i] = NULL; | |
| } | |
| if (RPo[td_i] != NULL) { | |
| free(RPo[td_i]); | |
| RPo[td_i] = NULL; | |
| } | |
| } | |
| void realloc_calcthread(int td_i) | |
| { | |
| realloc_R(td_i); | |
| realloc_P(td_i); | |
| } | |
| void decrease_num_calcthreads() | |
| { | |
| pause_calcthreads_and_wait(); | |
| int new_num_calcthreads = MAX(td_nb - 3, 3); | |
| for (int td_i = new_num_calcthreads; td_i < td_nb; td_i++) { | |
| for (unsigned int Ri = 0; Ri < (unsigned int)Rw * Rh; Ri++) { | |
| R[td_i % 3][Ri] += R[td_i][Ri]; | |
| } | |
| Pp[td_i % 3] += Pp[td_i]; | |
| free_calcthread(td_i); | |
| } | |
| td_nb = new_num_calcthreads; | |
| td_pause = 0; | |
| #pragma omp flush(td_pause, td_nb) | |
| } | |
| void increase_num_calcthreads() | |
| { | |
| int new_num_calcthreads = MIN(td_nb + 3, TD_MAX); | |
| for (int td_i = td_nb; td_i < new_num_calcthreads; td_i++) { | |
| bb_type[td_i] = bb_type[td_i - 3]; | |
| bb_bail[td_i] = bb_bail[td_i - 3]; | |
| bb_pps[td_i] = bb_pps[td_i - 3]; | |
| bb_ppe[td_i] = bb_ppe[td_i - 3]; | |
| bb_minn[td_i] = bb_minn[td_i - 3]; | |
| realloc_calcthread(td_i); | |
| } | |
| td_nb = new_num_calcthreads; | |
| #pragma omp flush(td_nb) | |
| } | |
| void load_location(int pause_calcthreads, double load_zoom, double load_centerx, double load_centery, int load_renderw, int load_renderh) | |
| { | |
| if (pause_calcthreads) { | |
| pause_calcthreads_and_wait(); | |
| } | |
| double rangediv2x = 2.0 / load_zoom; | |
| double rangediv2y = 2.0 / load_zoom; | |
| Rr_lo = load_centerx - rangediv2x; | |
| Rr_up = load_centerx + rangediv2x; | |
| Ri_lo = load_centery - rangediv2y; | |
| Ri_up = load_centery + rangediv2y; | |
| Rr_ra = Rr_up - Rr_lo; | |
| Ri_ra = Ri_up - Ri_lo; | |
| if (Rw == load_renderw && Rh == load_renderh) { | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| reset_R(td_i); | |
| } | |
| } else { | |
| if (Rw == 0) { | |
| RWow = 0.5 * (load_renderw - Ww); | |
| } else if (Rw < load_renderw) { | |
| RWow = RWow / Rw_f + 0.5 * Ww * (1.0 / Rw_f - 1.0); | |
| } else { | |
| RWow = RWow * Rw_f + 0.5 * Ww * (Rw_f - 1.0); | |
| } | |
| if (Rh == 0) { | |
| RWoh = 0.5 * (load_renderh - Wh); | |
| } else if (Rh < load_renderh) { | |
| RWoh = RWoh / Rh_f + 0.5 * Wh * (1.0 / Rh_f - 1.0); | |
| } else { | |
| RWoh = RWoh * Rh_f + 0.5 * Wh * (Rh_f - 1.0); | |
| } | |
| Rw = load_renderw; | |
| Rh = load_renderh; | |
| if (Rw < Ww) { | |
| Rw = Ww; | |
| RWow = 0; | |
| } else if (RWow < 0) { | |
| RWow = 0; | |
| } else if (RWow + Ww > Rw) { | |
| RWow = Rw - Ww; | |
| } | |
| if (Rh < Wh) { | |
| Rh = Wh; | |
| RWoh = 0; | |
| } else if (RWoh < 0) { | |
| RWoh = 0; | |
| } else if (RWoh + Wh > Rh) { | |
| RWoh = Rh - Wh; | |
| } | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| realloc_R(td_i); | |
| } | |
| } | |
| Rhdivr = Rh / Rr_ra; | |
| Rwdivi = Rw / Ri_ra; | |
| Wr_lo = Rr_lo + RWoh / Rhdivr; | |
| Wr_up = Wr_lo + Wh / Rhdivr; | |
| Wi_lo = Ri_lo + RWow / Rwdivi; | |
| Wi_up = Wi_lo + Ww / Rwdivi; | |
| if (pause_calcthreads) { | |
| td_pause = 0; | |
| #pragma omp flush(td_pause) | |
| } | |
| } | |
| void load_bb_param(int load_selectedlayer, int load_bb_type, int load_bb_bail, int load_bb_pps, int load_bb_ppe, int load_bb_minn) | |
| { | |
| pause_calcthreads_and_wait(); | |
| load_bb_bail = MAX(load_bb_bail, 0); | |
| load_bb_pps = MIN(MAX(load_bb_pps, 0), load_bb_bail); | |
| load_bb_ppe = MIN(MAX(load_bb_ppe, 0), load_bb_bail); | |
| load_bb_minn = MIN(MAX(load_bb_minn, 0), load_bb_bail); | |
| int layer_start = 0; | |
| int layer_step = 1; | |
| if (load_selectedlayer != -1) { | |
| layer_start = load_selectedlayer; | |
| layer_step = LR_NB; | |
| } | |
| for (int td_i = layer_start; td_i < td_nb; td_i += layer_step) { | |
| bb_type[td_i] = load_bb_type; | |
| if (bb_bail[td_i] != load_bb_bail) { | |
| bb_bail[td_i] = load_bb_bail; | |
| realloc_P(td_i); | |
| } | |
| bb_pps[td_i] = load_bb_pps; | |
| bb_ppe[td_i] = load_bb_ppe; | |
| bb_minn[td_i] = load_bb_minn; | |
| reset_R(td_i); | |
| } | |
| td_pause = 0; | |
| #pragma omp flush(td_pause) | |
| } | |
| void load_location_bb_color_param(int pause_calcthreads, double load_zoom, double load_centerx, double load_centery, int load_renderw, int load_renderh, int load_lr_mode, int load_bb_type1, int load_bb_bail1, int load_bb_pps1, int load_bb_ppe1, int load_bb_minn1, int load_bb_type2, int load_bb_bail2, int load_bb_pps2, int load_bb_ppe2, int load_bb_minn2, int load_bb_type3, int load_bb_bail3, int load_bb_pps3, int load_bb_ppe3, int load_bb_minn3, int load_ct_type1, int load_ct_type2, int load_ct_type3, int load_cm1, int load_csf1, int load_csfp11, double load_ct_f1, int load_ct_o1, int load_cm2, int load_csf2, int load_csfp12, double load_ct_f2, int load_ct_o2, int load_cm3, int load_csf3, int load_csfp13, double load_ct_f3, int load_ct_o3) | |
| { | |
| if (pause_calcthreads) { | |
| pause_calcthreads_and_wait(); | |
| } | |
| load_bb_bail1 = MAX(load_bb_bail1, 0); | |
| load_bb_bail2 = MAX(load_bb_bail2, 0); | |
| load_bb_bail3 = MAX(load_bb_bail3, 0); | |
| load_bb_pps1 = MIN(MAX(load_bb_pps1, 0), load_bb_bail1); | |
| load_bb_pps2 = MIN(MAX(load_bb_pps2, 0), load_bb_bail2); | |
| load_bb_pps3 = MIN(MAX(load_bb_pps3, 0), load_bb_bail3); | |
| load_bb_ppe1 = MIN(MAX(load_bb_ppe1, 0), load_bb_bail1); | |
| load_bb_ppe2 = MIN(MAX(load_bb_ppe2, 0), load_bb_bail2); | |
| load_bb_ppe3 = MIN(MAX(load_bb_ppe3, 0), load_bb_bail3); | |
| load_bb_minn1 = MIN(MAX(load_bb_minn1, 0), load_bb_bail1); | |
| load_bb_minn2 = MIN(MAX(load_bb_minn2, 0), load_bb_bail2); | |
| load_bb_minn3 = MIN(MAX(load_bb_minn3, 0), load_bb_bail3); | |
| lr_mode = load_lr_mode; | |
| ct_load(-1, load_ct_type1, load_ct_type2, load_ct_type3); | |
| cm[0] = load_cm1; | |
| cm[1] = load_cm2; | |
| cm[2] = load_cm3; | |
| csf[0] = load_csf1; | |
| csf[1] = load_csf2; | |
| csf[2] = load_csf3; | |
| csfp1[0] = load_csfp11; | |
| csfp1[1] = load_csfp12; | |
| csfp1[2] = load_csfp13; | |
| ct_f[0] = load_ct_f1; | |
| ct_f[1] = load_ct_f2; | |
| ct_f[2] = load_ct_f3; | |
| ct_o[0] = load_ct_o1; | |
| ct_o[1] = load_ct_o2; | |
| ct_o[2] = load_ct_o3; | |
| for (int td_i = 0; td_i < td_nb; td_i += LR_NB) { | |
| bb_type[td_i] = load_bb_type1; | |
| if (bb_bail[td_i] != load_bb_bail1) { | |
| bb_bail[td_i] = load_bb_bail1; | |
| realloc_P(td_i); | |
| } | |
| bb_pps[td_i] = load_bb_pps1; | |
| bb_ppe[td_i] = load_bb_ppe1; | |
| bb_minn[td_i] = load_bb_minn1; | |
| } | |
| for (int td_i = 1; td_i < td_nb; td_i += LR_NB) { | |
| bb_type[td_i] = load_bb_type2; | |
| if (bb_bail[td_i] != load_bb_bail2) { | |
| bb_bail[td_i] = load_bb_bail2; | |
| realloc_P(td_i); | |
| } | |
| bb_pps[td_i] = load_bb_pps2; | |
| bb_ppe[td_i] = load_bb_ppe2; | |
| bb_minn[td_i] = load_bb_minn2; | |
| } | |
| for (int td_i = 2; td_i < td_nb; td_i += LR_NB) { | |
| bb_type[td_i] = load_bb_type3; | |
| if (bb_bail[td_i] != load_bb_bail3) { | |
| bb_bail[td_i] = load_bb_bail3; | |
| realloc_P(td_i); | |
| } | |
| bb_pps[td_i] = load_bb_pps3; | |
| bb_ppe[td_i] = load_bb_ppe3; | |
| bb_minn[td_i] = load_bb_minn3; | |
| } | |
| load_location(0, load_zoom, load_centerx, load_centery, load_renderw, load_renderh); | |
| if (pause_calcthreads) { | |
| td_pause = 0; | |
| #pragma omp flush(td_pause) | |
| } | |
| } | |
| int core_mandelbrot(int td_i, complex c) | |
| { | |
| int n; | |
| complex z = {0.0, 0.0}; | |
| for (n = 0; n < bb_bail[td_i]; n++) { | |
| P[td_i][n].r = z.r * z.r - z.i * z.i + c.r; | |
| P[td_i][n].i = z.r * z.i + z.r * z.i + c.i; | |
| z = P[td_i][n]; | |
| if (z.r * z.r + z.i * z.i > 4.0) { | |
| break; | |
| } | |
| } | |
| return (n); | |
| } | |
| void calculation_thread(int td_i) | |
| { | |
| printf("thread %i start\n", td_i); | |
| while (1) { | |
| #pragma omp flush(td_pause) | |
| if (td_pause == 1) { | |
| td_paused[td_i] = 1; | |
| while (1) { | |
| #pragma omp flush(td_pause, td_stop) | |
| if (td_pause == 0 || td_stop == 1) { | |
| break; | |
| } | |
| wait_ms(1000); | |
| } | |
| td_paused[td_i] = 0; | |
| } | |
| while (1) { | |
| #pragma omp flush(td_nb, td_stop) | |
| if (td_i < td_nb || td_stop == 1) { | |
| break; | |
| } | |
| wait_ms(1000); | |
| } | |
| #pragma omp flush(td_stop) | |
| if (td_stop == 1) { | |
| break; | |
| } | |
| if (bb_type[td_i] == 0) { | |
| for (int c_iter = 0; c_iter < C_BATCH_NB; c_iter++) { | |
| complex c; | |
| while (1) { | |
| c.r = Cr_lo + Cr_ra * dsfmt_gv_genrand_close_open(); | |
| c.i = Ci_lo + Ci_ra * dsfmt_gv_genrand_close_open(); | |
| double c2 = c.r * c.r + c.i * c.i; | |
| //// skip the certainly bounded paths | |
| //// skip period 1 cardioid period 2 circle period 3 circle period 4 circle | |
| //// period 1 cardioid = exact = 3/32 = 0.09375 | |
| //// http://www.mrob.com/pub/muency/r2a.html | |
| //// period 2 circle = exact = -15/16 = -0.9375 | |
| //// http://www.mrob.com/pub/muency/r212a.html | |
| //// period 3 circle = inexact = estimated by slightly smaller circle c (-0.125,0.744) r 0.092 | |
| //// http://www.mrob.com/pub/muency/r213a.html | |
| //// http://www.mrob.com/pub/muency/muatomsizes.html | |
| //// < -0.560697 --> corrected by testing (bail = 1000000, see fix! below) ever larger circles to < -0.5603 --> r 0.0941328847 | |
| //// period 4 circle = inexact = estimated by slightly smaller circle c (-1.308,0) r 0.058 | |
| if (!(c2 * (8.0 * c2 - 3.0) + c.r < 0.09375 || c2 + c.r + c.r < -0.9375 || c2 + 0.25 * c.r - 1.488 * c.i < -0.5603 || c2 + 2.616 * c.r < -1.7075)) { | |
| break; | |
| } else if (0) { | |
| //// certainly bounded | |
| int n_inf = core_mandelbrot(td_i, c); | |
| if (n_inf < bb_bail[td_i]) { | |
| printf("fix! notMset %f %f\n", c.r, c.i); | |
| } | |
| } | |
| } | |
| //// plot the unbounded paths = P[n_inf]² > 4 for n_inf < bailout | |
| int n_inf = core_mandelbrot(td_i, c); | |
| if (n_inf < bb_bail[td_i] && n_inf >= bb_minn[td_i]) { | |
| int minimum_one_point_inside_window = 0; | |
| int offset_count = 0; | |
| //// |P[td_i][n_inf]| > 2.0 but is handy for getting rid of radius 2.0 circle in plot | |
| for (int xy_p = bb_pps[td_i]; xy_p <= n_inf - bb_ppe[td_i]; xy_p++) { | |
| if ((P[td_i][xy_p].r >= Rr_up) || (P[td_i][xy_p].r < Rr_lo)) { | |
| continue; | |
| } | |
| if ((P[td_i][xy_p].i >= Ri_lo) && (P[td_i][xy_p].i < Ri_up)) { | |
| minimum_one_point_inside_window = 1; | |
| int ix = Rhdivr * (P[td_i][xy_p].r - Rr_lo); | |
| int iy = Rwdivi * (P[td_i][xy_p].i - Ri_lo); | |
| RPo[td_i][offset_count++] = (unsigned int)ix * Rw + iy; | |
| if ((-P[td_i][xy_p].i >= Ri_lo) && (-P[td_i][xy_p].i < Ri_up)) { | |
| int iyc = Rwdivi * (-P[td_i][xy_p].i - Ri_lo); | |
| RPo[td_i][offset_count++] = (unsigned int)ix * Rw + iyc; | |
| } | |
| } else { | |
| if ((-P[td_i][xy_p].i >= Ri_lo) && (-P[td_i][xy_p].i < Ri_up)) { | |
| minimum_one_point_inside_window = 1; | |
| int ix = Rhdivr * (P[td_i][xy_p].r - Rr_lo); | |
| int iyc = Rwdivi * (-P[td_i][xy_p].i - Ri_lo); | |
| RPo[td_i][offset_count++] = (unsigned int)ix * Rw + iyc; | |
| } | |
| } | |
| } | |
| if (minimum_one_point_inside_window) { | |
| Pp[td_i] += 2; | |
| } | |
| for (int offset_iter = 0; offset_iter < offset_count; offset_iter++) { | |
| R[td_i][RPo[td_i][offset_iter]]++; | |
| } | |
| } | |
| } | |
| } | |
| if (bb_type[td_i] == 1) { | |
| for (int c_iter = 0; c_iter < C_BATCH_NB; c_iter++) { | |
| complex c; | |
| c.r = Cr_lo + Cr_ra * dsfmt_gv_genrand_close_open(); | |
| c.i = Ci_lo + Ci_ra * dsfmt_gv_genrand_close_open(); | |
| int n_inf = core_mandelbrot(td_i, c); | |
| //// plot the bounded paths = P[n_inf]² <= 4 for n_inf == bailout | |
| if (n_inf == bb_bail[td_i]) { | |
| int minimum_one_point_inside_window = 0; | |
| int offset_count = 0; | |
| for (int xy_p = bb_pps[td_i]; xy_p < n_inf - bb_ppe[td_i]; xy_p++) { | |
| if ((P[td_i][xy_p].r >= Rr_up) || (P[td_i][xy_p].r < Rr_lo)) { | |
| continue; | |
| } | |
| if ((P[td_i][xy_p].i >= Ri_lo) && (P[td_i][xy_p].i < Ri_up)) { | |
| minimum_one_point_inside_window = 1; | |
| int ix = Rhdivr * (P[td_i][xy_p].r - Rr_lo); | |
| int iy = Rwdivi * (P[td_i][xy_p].i - Ri_lo); | |
| RPo[td_i][offset_count++] = (unsigned int)ix * Rw + iy; | |
| if ((-P[td_i][xy_p].i >= Ri_lo) && (-P[td_i][xy_p].i < Ri_up)) { | |
| int iyc = Rwdivi * (-P[td_i][xy_p].i - Ri_lo); | |
| RPo[td_i][offset_count++] = (unsigned int)ix * Rw + iyc; | |
| } | |
| } else { | |
| if ((-P[td_i][xy_p].i >= Ri_lo) && (-P[td_i][xy_p].i < Ri_up)) { | |
| minimum_one_point_inside_window = 1; | |
| int ix = Rhdivr * (P[td_i][xy_p].r - Rr_lo); | |
| int iyc = Rwdivi * (-P[td_i][xy_p].i - Ri_lo); | |
| RPo[td_i][offset_count++] = (unsigned int)ix * Rw + iyc; | |
| } | |
| } | |
| } | |
| if (minimum_one_point_inside_window) { | |
| Pp[td_i] += 2; | |
| } | |
| for (int offset_iter = 0; offset_iter < offset_count; offset_iter++) { | |
| R[td_i][RPo[td_i][offset_iter]]++; | |
| } | |
| } | |
| } | |
| } | |
| if (bb_type[td_i] == 2) { | |
| for (int c_iter = 0; c_iter < C_BATCH_NB; c_iter++) { | |
| complex c; | |
| while (1) { | |
| c.r = Cr_lo + Cr_ra * dsfmt_gv_genrand_close_open(); | |
| c.i = Ci_lo + Ci_ra * dsfmt_gv_genrand_close_open(); | |
| double c2 = c.r * c.r + c.i * c.i; | |
| //// skip the bounded paths with large footprint = small periods | |
| //// period 3 circle = inexact = estimated by slightly larger circle c (-0.125,0.744) r 0.092 | |
| //// < -0.560697 --> corrected by testing (bail = 1000000, look at output png) ever smaller circles to < -0.5601 --> r 0.0951892851 | |
| if (!(c2 * (8.0 * c2 - 3.0) + c.r < 0.09375 || c2 + c.r + c.r < -0.9375 || c2 + 0.25 * c.r - 1.488 * c.i < -0.5601 || c2 + 2.616 * c.r < -1.7072)) { | |
| break; | |
| } | |
| } | |
| int n_inf = core_mandelbrot(td_i, c); | |
| if (n_inf == bb_bail[td_i]) { | |
| int minimum_one_point_inside_window = 0; | |
| int offset_count = 0; | |
| for (int xy_p = bb_pps[td_i]; xy_p < n_inf - bb_ppe[td_i]; xy_p++) { | |
| if ((P[td_i][xy_p].r >= Rr_up) || (P[td_i][xy_p].r < Rr_lo)) { | |
| continue; | |
| } | |
| if ((P[td_i][xy_p].i >= Ri_lo) && (P[td_i][xy_p].i < Ri_up)) { | |
| minimum_one_point_inside_window = 1; | |
| int ix = Rhdivr * (P[td_i][xy_p].r - Rr_lo); | |
| int iy = Rwdivi * (P[td_i][xy_p].i - Ri_lo); | |
| RPo[td_i][offset_count++] = (unsigned int)ix * Rw + iy; | |
| if ((-P[td_i][xy_p].i >= Ri_lo) && (-P[td_i][xy_p].i < Ri_up)) { | |
| int iyc = Rwdivi * (-P[td_i][xy_p].i - Ri_lo); | |
| RPo[td_i][offset_count++] = (unsigned int)ix * Rw + iyc; | |
| } | |
| } else { | |
| if ((-P[td_i][xy_p].i >= Ri_lo) && (-P[td_i][xy_p].i < Ri_up)) { | |
| minimum_one_point_inside_window = 1; | |
| int ix = Rhdivr * (P[td_i][xy_p].r - Rr_lo); | |
| int iyc = Rwdivi * (-P[td_i][xy_p].i - Ri_lo); | |
| RPo[td_i][offset_count++] = (unsigned int)ix * Rw + iyc; | |
| } | |
| } | |
| } | |
| if (minimum_one_point_inside_window) { | |
| Pp[td_i] += 2; | |
| } | |
| for (int offset_iter = 0; offset_iter < offset_count; offset_iter++) { | |
| R[td_i][RPo[td_i][offset_iter]]++; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| printf("thread %i end\n", td_i); | |
| } | |
| int save_param_file() | |
| { | |
| FILE* parameters_file; | |
| if ((parameters_file = fopen("BuddhaBrot-MT-parameters.txt", "wb")) == NULL) { | |
| return (0); | |
| } | |
| fprintf(parameters_file, "centerx %lf\ncentery %lf\nzoom %lf\nwindowcenterx %lf\nwindowcentery %lf\nwindowzoom %lf\nrenderw %d\nrenderh %d\nwindowoffsetw %d\nwindowoffseth %d\n\nlayermode %d\n\nbuddhatype1 %d\nbailout1 %d\npathplotstart1 %d\npathplotend1 %d\npathminninf1 %d\n\nbuddhatype2 %d\nbailout2 %d\npathplotstart2 %d\npathplotend2 %d\npathminninf2 %d\n\nbuddhatype3 %d\nbailout3 %d\npathplotstart3 %d\npathplotend3 %d\npathminninf3 %d\n\ncolortabletype1 %d\ncolortabletype2 %d\ncolortabletype3 %d\n\ncoloringmethod1 %d\ncoloringsumfunc1 %d\ncoloringsumfuncparam11 %d\ncolortablescale1 %d\ncolortableoffset1 %d\n\ncoloringmethod2 %d\ncoloringsumfunc2 %d\ncoloringsumfuncparam12 %d\ncolortablescale2 %d\ncolortableoffset2 %d\n\ncoloringmethod3 %d\ncoloringsumfunc3 %d\ncoloringsumfuncparam13 %d\ncolortablescale3 %d\ncolortableoffset3 %d\n\nnumberofcalculationthreads %d\n", 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up), 4.0 / (Rr_up - Rr_lo), 0.5 * (Wr_lo + Wr_up), 0.5 * (Wi_lo + Wi_up), 4.0 / (Wr_up - Wr_lo), Rw, Rh, RWow, RWoh, lr_mode, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0], bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1], bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2], ct_type[0], ct_type[1], ct_type[2], cm[0], csf[0], csfp1[0], (int)(10.0 * (ct_f[0] - 1.0)), ct_o[0], cm[1], csf[1], csfp1[1], (int)(10.0 * (ct_f[1] - 1.0)), ct_o[1], cm[2], csf[2], csfp1[2], (int)(10.0 * (ct_f[2] - 1.0)), ct_o[2], td_nb); | |
| fprintf(parameters_file, "\n"); | |
| for (int td_i = 0; td_i < TD_MAX; td_i++) { | |
| fprintf(parameters_file, "pathsplottedthread%02d %llu\n", td_i, Pp[td_i]); | |
| } | |
| fprintf(parameters_file, "\n"); | |
| fprintf(parameters_file, "pathsplottedsum %llu\n", Ppsum); | |
| fprintf(parameters_file, "\n"); | |
| fprintf(parameters_file, "rendercountmatrixmax1 %d\n", Rlrmax[0]); | |
| fprintf(parameters_file, "rendercountmatrixmax2 %d\n", Rlrmax[1]); | |
| fprintf(parameters_file, "rendercountmatrixmax3 %d\n", Rlrmax[2]); | |
| fclose(parameters_file); | |
| return (1); | |
| } | |
| int load_param_file(int pause_calcthreads, int load_status_files, int minmem) | |
| { | |
| FILE* parameters_file; | |
| if ((parameters_file = fopen("BuddhaBrot-MT-parameters.txt", "rb")) == NULL) { | |
| return (0); | |
| } | |
| double centerx = 0.0, centery = 0.0, zoom = 0.0; | |
| double windowcenterx = 0.0, windowcentery = 0.0, windowzoom = 0.0; | |
| int renderw = 0, renderh = 0; | |
| int windowoffsetw = 0, windowoffseth = 0; | |
| int layermode = 0; | |
| int buddhatype1 = 0, bailout1 = 0, pathplotstart1 = 0, pathplotend1 = 0, pathminninf1 = 0; | |
| int buddhatype2 = 0, bailout2 = 0, pathplotstart2 = 0, pathplotend2 = 0, pathminninf2 = 0; | |
| int buddhatype3 = 0, bailout3 = 0, pathplotstart3 = 0, pathplotend3 = 0, pathminninf3 = 0; | |
| int colortabletype1 = 0; | |
| int colortabletype2 = 0; | |
| int colortabletype3 = 0; | |
| int coloringmethod1 = 0, coloringsumfunc1 = 0, coloringsumfuncparam11 = 0, colortablescale1 = 0, colortableoffset1 = 0; | |
| int coloringmethod2 = 0, coloringsumfunc2 = 0, coloringsumfuncparam12 = 0, colortablescale2 = 0, colortableoffset2 = 0; | |
| int coloringmethod3 = 0, coloringsumfunc3 = 0, coloringsumfuncparam13 = 0, colortablescale3 = 0, colortableoffset3 = 0; | |
| int numberofcalculationthreads = 0; | |
| if (fscanf(parameters_file, "centerx %lf\ncentery %lf\nzoom %lf\nwindowcenterx %lf\nwindowcentery %lf\nwindowzoom %lf\nrenderw %d\nrenderh %d\nwindowoffsetw %d\nwindowoffseth %d\n\nlayermode %d\n\nbuddhatype1 %d\nbailout1 %d\npathplotstart1 %d\npathplotend1 %d\npathminninf1 %d\n\nbuddhatype2 %d\nbailout2 %d\npathplotstart2 %d\npathplotend2 %d\npathminninf2 %d\n\nbuddhatype3 %d\nbailout3 %d\npathplotstart3 %d\npathplotend3 %d\npathminninf3 %d\n\ncolortabletype1 %d\ncolortabletype2 %d\ncolortabletype3 %d\n\ncoloringmethod1 %d\ncoloringsumfunc1 %d\ncoloringsumfuncparam11 %d\ncolortablescale1 %d\ncolortableoffset1 %d\n\ncoloringmethod2 %d\ncoloringsumfunc2 %d\ncoloringsumfuncparam12 %d\ncolortablescale2 %d\ncolortableoffset2 %d\n\ncoloringmethod3 %d\ncoloringsumfunc3 %d\ncoloringsumfuncparam13 %d\ncolortablescale3 %d\ncolortableoffset3 %d\n\nnumberofcalculationthreads %d\n", ¢erx, ¢ery, &zoom, &windowcenterx, &windowcentery, &windowzoom, &renderw, &renderh, &windowoffsetw, &windowoffseth, &layermode, &buddhatype1, &bailout1, &pathplotstart1, &pathplotend1, &pathminninf1, &buddhatype2, &bailout2, &pathplotstart2, &pathplotend2, &pathminninf2, &buddhatype3, &bailout3, &pathplotstart3, &pathplotend3, &pathminninf3, &colortabletype1, &colortabletype2, &colortabletype3, &coloringmethod1, &coloringsumfunc1, &coloringsumfuncparam11, &colortablescale1, &colortableoffset1, &coloringmethod2, &coloringsumfunc2, &coloringsumfuncparam12, &colortablescale2, &colortableoffset2, &coloringmethod3, &coloringsumfunc3, &coloringsumfuncparam13, &colortablescale3, &colortableoffset3, &numberofcalculationthreads)) {} | |
| if (minmem == 0) { | |
| while (numberofcalculationthreads > td_nb) { | |
| increase_num_calcthreads(); | |
| } | |
| while (numberofcalculationthreads < td_nb) { | |
| decrease_num_calcthreads(); | |
| } | |
| } else { | |
| while (3 < td_nb) { | |
| decrease_num_calcthreads(); | |
| } | |
| } | |
| load_location_bb_color_param(pause_calcthreads, zoom, centerx, centery, renderw, renderh, layermode, buddhatype1, bailout1, pathplotstart1, pathplotend1, pathminninf1, buddhatype2, bailout2, pathplotstart2, pathplotend2, pathminninf2, buddhatype3, bailout3, pathplotstart3, pathplotend3, pathminninf3, colortabletype1, colortabletype2, colortabletype3, coloringmethod1, coloringsumfunc1, coloringsumfuncparam11, (double)colortablescale1 / 10.0 + 1.0, colortableoffset1, coloringmethod2, coloringsumfunc2, coloringsumfuncparam12, (double)colortablescale2 / 10.0 + 1.0, colortableoffset2, coloringmethod3, coloringsumfunc3, coloringsumfuncparam13, (double)colortablescale3 / 10.0 + 1.0, colortableoffset3); | |
| RWow = windowoffsetw; | |
| Wi_lo = Ri_lo + RWow / Rwdivi; | |
| Wi_up = Wi_lo + Ww / Rwdivi; | |
| RWoh = windowoffseth; | |
| Wr_lo = Rr_lo + RWoh / Rhdivr; | |
| Wr_up = Wr_lo + Wh / Rhdivr; | |
| if (load_status_files == 1) { | |
| if (fscanf(parameters_file, "\n")) {} | |
| for (int td_i = 0; td_i < TD_MAX; td_i++) { | |
| int temp; | |
| if (fscanf(parameters_file, "pathsplottedthread%d %llu\n", &temp, &Pp[td_i])) {} | |
| } | |
| } | |
| Ppsum = 0; | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| Ppsum += Pp[td_i]; | |
| } | |
| Ppsum_autoPNG_last = (Ppsum / Ppsum_autoPNG_delta) * Ppsum_autoPNG_delta; | |
| fclose(parameters_file); | |
| return (numberofcalculationthreads); | |
| } | |
| int save_status_files() | |
| { | |
| reponsive_caption_update("BuddhaBrot-MT: saving status: pausing calculation threads..."); | |
| pause_calcthreads_and_wait(); | |
| Ppsum = 0; | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| Ppsum += Pp[td_i]; | |
| } | |
| if (lr_mode == 0) { | |
| Rlrmax[0] = 0; | |
| Rlrmax[1] = 0; | |
| Rlrmax[2] = 0; | |
| for (int Wy = 0, Ry = RWoh; Wy < Wh; Wy++, Ry++) { | |
| for (int Wx = 0, Rx = RWow; Wx < Ww; Wx++, Rx++) { | |
| unsigned int Ri = (unsigned int)Ry * Rw + Rx; | |
| unsigned int sum = 0; | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| sum += R[td_i][Ri]; | |
| } | |
| if (csf[0] == 1) { | |
| if (sum >= (unsigned int)csfp1[0]) { | |
| sum = csfp1[0] + (unsigned int) log((double)(sum - csfp1[0] + 1)); | |
| } | |
| } | |
| if (sum > Rlrmax[0]) { | |
| Rlrmax[0] = sum; | |
| } | |
| } | |
| } | |
| } | |
| if (lr_mode == 1) { | |
| for (int layer_iter = 0; layer_iter < LR_NB; layer_iter++) { | |
| Rlrmax[layer_iter] = 0; | |
| for (int Wy = 0, Ry = RWoh; Wy < Wh; Wy++, Ry++) { | |
| for (int Wx = 0, Rx = RWow; Wx < Ww; Wx++, Rx++) { | |
| unsigned int Ri = (unsigned int)Ry * Rw + Rx; | |
| unsigned int sum = 0; | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| sum += R[td_i][Ri]; | |
| } | |
| if (csf[layer_iter] == 1) { | |
| if (sum >= (unsigned int)csfp1[layer_iter]) { | |
| sum = csfp1[layer_iter] + (unsigned int) log((double)(sum - csfp1[layer_iter] + 1)); | |
| } | |
| } | |
| if (sum > Rlrmax[layer_iter]) { | |
| Rlrmax[layer_iter] = sum; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| if (lr_mode == 2) { | |
| for (int layer_iter = 0; layer_iter < LR_NB; layer_iter++) { | |
| Rlrmax[layer_iter] = 0; | |
| for (int Wy = 0, Ry = RWoh; Wy < Wh; Wy++, Ry++) { | |
| for (int Wx = 0, Rx = RWow; Wx < Ww; Wx++, Rx++) { | |
| unsigned int Ri = (unsigned int)Ry * Rw + Rx; | |
| unsigned int sum = 0; | |
| for (int td_i = layer_iter; td_i < td_nb; td_i += LR_NB) { | |
| sum += R[td_i][Ri]; | |
| } | |
| if (csf[layer_iter] == 1) { | |
| if (sum >= (unsigned int)csfp1[layer_iter]) { | |
| sum = csfp1[layer_iter] + (unsigned int) log((double)(sum - csfp1[layer_iter] + 1)); | |
| } | |
| } | |
| if (sum > Rlrmax[layer_iter]) { | |
| Rlrmax[layer_iter] = sum; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| save_param_file(); | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| sprintf(titlebar, "BuddhaBrot-MT: saving status: saving render count matrix of thread %i...", td_i); | |
| reponsive_caption_update(titlebar); | |
| sprintf(filename, "BuddhaBrot-MT-status-thread%02i.bin", td_i); | |
| FILE* status_file; | |
| if ((status_file = fopen(filename, "wb")) == NULL) { | |
| return (0); | |
| } | |
| fwrite(R[td_i], sizeof(unsigned int), (unsigned int)Rw * Rh, status_file); | |
| fclose(status_file); | |
| } | |
| td_pause = 0; | |
| #pragma omp flush(td_pause) | |
| return (1); | |
| } | |
| int load_status_files() | |
| { | |
| reponsive_caption_update("BuddhaBrot-MT: loading status: pausing calculation threads..."); | |
| pause_calcthreads_and_wait(); | |
| load_param_file(0, 1, 0); | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| sprintf(titlebar, "BuddhaBrot-MT: loading status: loading render count matrix of thread %i...", td_i); | |
| reponsive_caption_update(titlebar); | |
| sprintf(filename, "BuddhaBrot-MT-status-thread%02i.bin", td_i); | |
| FILE* status_file; | |
| if ((status_file = fopen(filename, "rb")) == NULL) { | |
| return (0); | |
| } | |
| if (fread(R[td_i], sizeof(unsigned int), (unsigned int)Rw * Rh, status_file)) {} | |
| fclose(status_file); | |
| } | |
| td_pause = 0; | |
| #pragma omp flush(td_pause) | |
| return (1); | |
| } | |
| int load_status_files_minmem() | |
| { | |
| reponsive_caption_update("BuddhaBrot-MT: loading status: pausing calculation threads..."); | |
| pause_calcthreads_and_wait(); | |
| int original_num_calcthreads = load_param_file(0, 1, 1); | |
| unsigned int* tmp_R = (unsigned int*)calloc((unsigned int)Rw * Rh, sizeof(unsigned int)); | |
| for (int td_i = 0; td_i < 3; td_i++) { | |
| sprintf(titlebar, "BuddhaBrot-MT: loading status: loading render count matrix of thread %i...", td_i); | |
| reponsive_caption_update(titlebar); | |
| sprintf(filename, "BuddhaBrot-MT-status-thread%02i.bin", td_i); | |
| FILE* status_file; | |
| if ((status_file = fopen(filename, "rb")) == NULL) { | |
| return (0); | |
| } | |
| if (fread(R[td_i], sizeof(unsigned int), (unsigned int)Rw * Rh, status_file)) {} | |
| fclose(status_file); | |
| } | |
| for (int td_i = 3; td_i < original_num_calcthreads; td_i++) { | |
| sprintf(titlebar, "BuddhaBrot-MT: loading status: loading render count matrix of thread %i...", td_i); | |
| reponsive_caption_update(titlebar); | |
| sprintf(filename, "BuddhaBrot-MT-status-thread%02i.bin", td_i); | |
| FILE* status_file; | |
| if ((status_file = fopen(filename, "rb")) == NULL) { | |
| return (0); | |
| } | |
| if (fread(tmp_R, sizeof(unsigned int), (unsigned int)Rw * Rh, status_file)) {} | |
| for (unsigned int Ri = 0; Ri < (unsigned int)Rw * Rh; Ri++) { | |
| R[td_i % 3][Ri] += tmp_R[Ri]; | |
| } | |
| Pp[td_i % 3] += Pp[td_i]; | |
| Pp[td_i] = 0; | |
| fclose(status_file); | |
| } | |
| free(tmp_R); | |
| td_pause = 0; | |
| #pragma omp flush(td_pause) | |
| return (1); | |
| } | |
| void writeRtoPNG(const char* filename) | |
| { | |
| reponsive_caption_update("BuddhaBrot-MT: writing to 8-bit png: pausing calculation threads..."); | |
| pause_calcthreads_and_wait(); | |
| if (lr_mode == 0) { | |
| Rlrmax[0] = 0; | |
| for (unsigned int Ri = 0; Ri < (unsigned int)Rw * Rh; Ri++) { | |
| unsigned int sum = 0; | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| sum += R[td_i][Ri]; | |
| } | |
| if (csf[0] == 1) { | |
| if (sum >= (unsigned int)csfp1[0]) { | |
| sum = csfp1[0] + (unsigned int) log((double)(sum - csfp1[0] + 1)); | |
| } | |
| } | |
| if (sum > Rlrmax[0]) { | |
| Rlrmax[0] = sum; | |
| } | |
| } | |
| if (Rlrmax[0] >= Hl[0]) { | |
| if (H[0] != NULL) { | |
| free(H[0]); | |
| H[0] = NULL; | |
| } | |
| Hl[0] = Rlrmax[0] + 1; | |
| H[0] = (unsigned int*)calloc(Hl[0], sizeof(unsigned int)); | |
| } else { | |
| memset(H[0], 0, Hl[0] * sizeof(unsigned int)); | |
| } | |
| Rlrmax[1] = 0; | |
| Rlrmax[2] = 0; | |
| Hl[1] = 0; | |
| Hl[2] = 0; | |
| if (H[1] != NULL) { | |
| free(H[1]); | |
| H[1] = NULL; | |
| } | |
| if (H[2] != NULL) { | |
| free(H[2]); | |
| H[2] = NULL; | |
| } | |
| for (unsigned int Ri = 0; Ri < (unsigned int)Rw * Rh; Ri++) { | |
| unsigned int sum = 0; | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| sum += R[td_i][Ri]; | |
| } | |
| if (csf[0] == 1) { | |
| if (sum >= (unsigned int)csfp1[0]) { | |
| sum = csfp1[0] + (unsigned int) log((double)(sum - csfp1[0] + 1)); | |
| } | |
| } | |
| H[0][sum]++; | |
| } | |
| if (cm[0] == 0) { | |
| cm0n[0] = 0; | |
| for (unsigned int i = 0; i <= Rlrmax[0]; i++) { | |
| if (H[0][i] > 0) { | |
| H[0][i] = cm0n[0]++; | |
| } | |
| } | |
| } | |
| if (cm[0] == 1) { | |
| cm1n[0] = (unsigned int)Rw * Rh - H[0][0]; | |
| H[0][0] = 0; | |
| for (unsigned int i = 2; i <= Rlrmax[0]; i++) { | |
| H[0][i] += H[0][i - 1]; | |
| } | |
| } | |
| } | |
| if (lr_mode == 1) { | |
| for (int layer_iter = 0; layer_iter < LR_NB; layer_iter++) { | |
| Rlrmax[layer_iter] = 0; | |
| for (unsigned int Ri = 0; Ri < (unsigned int)Rw * Rh; Ri++) { | |
| unsigned int sum = 0; | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| sum += R[td_i][Ri]; | |
| } | |
| if (csf[layer_iter] == 1) { | |
| if (sum >= (unsigned int)csfp1[layer_iter]) { | |
| sum = csfp1[layer_iter] + (unsigned int) log((double)(sum - csfp1[layer_iter] + 1)); | |
| } | |
| } | |
| if (sum > Rlrmax[layer_iter]) { | |
| Rlrmax[layer_iter] = sum; | |
| } | |
| } | |
| if (Rlrmax[layer_iter] >= Hl[layer_iter]) { | |
| if (H[layer_iter] != NULL) { | |
| free(H[layer_iter]); | |
| H[layer_iter] = NULL; | |
| } | |
| Hl[layer_iter] = Rlrmax[layer_iter] + 1; | |
| H[layer_iter] = (unsigned int*)calloc(Hl[layer_iter], sizeof(unsigned int)); | |
| } else { | |
| memset(H[layer_iter], 0, Hl[layer_iter] * sizeof(unsigned int)); | |
| } | |
| for (unsigned int Ri = 0; Ri < (unsigned int)Rw * Rh; Ri++) { | |
| unsigned int sum = 0; | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| sum += R[td_i][Ri]; | |
| } | |
| if (csf[layer_iter] == 1) { | |
| if (sum >= (unsigned int)csfp1[layer_iter]) { | |
| sum = csfp1[layer_iter] + (unsigned int) log((double)(sum - csfp1[layer_iter] + 1)); | |
| } | |
| } | |
| H[layer_iter][sum]++; | |
| } | |
| if (cm[layer_iter] == 0) { | |
| cm0n[layer_iter] = 0; | |
| for (unsigned int i = 0; i <= Rlrmax[layer_iter]; i++) { | |
| if (H[layer_iter][i] > 0) { | |
| H[layer_iter][i] = cm0n[layer_iter]++; | |
| } | |
| } | |
| } | |
| if (cm[layer_iter] == 1) { | |
| cm1n[layer_iter] = (unsigned int)Rw * Rh - H[layer_iter][0]; | |
| H[layer_iter][0] = 0; | |
| for (unsigned int i = 2; i <= Rlrmax[layer_iter]; i++) { | |
| H[layer_iter][i] += H[layer_iter][i - 1]; | |
| } | |
| } | |
| } | |
| } | |
| if (lr_mode == 2) { | |
| for (int layer_iter = 0; layer_iter < LR_NB; layer_iter++) { | |
| Rlrmax[layer_iter] = 0; | |
| for (unsigned int Ri = 0; Ri < (unsigned int)Rw * Rh; Ri++) { | |
| unsigned int sum = 0; | |
| for (int td_i = layer_iter; td_i < td_nb; td_i += LR_NB) { | |
| sum += R[td_i][Ri]; | |
| } | |
| if (csf[layer_iter] == 1) { | |
| if (sum >= (unsigned int)csfp1[layer_iter]) { | |
| sum = csfp1[layer_iter] + (unsigned int) log((double)(sum - csfp1[layer_iter] + 1)); | |
| } | |
| } | |
| if (sum > Rlrmax[layer_iter]) { | |
| Rlrmax[layer_iter] = sum; | |
| } | |
| } | |
| if (Rlrmax[layer_iter] >= Hl[layer_iter]) { | |
| if (H[layer_iter] != NULL) { | |
| free(H[layer_iter]); | |
| H[layer_iter] = NULL; | |
| } | |
| Hl[layer_iter] = Rlrmax[layer_iter] + 1; | |
| H[layer_iter] = (unsigned int*)calloc(Hl[layer_iter], sizeof(unsigned int)); | |
| } else { | |
| memset(H[layer_iter], 0, Hl[layer_iter] * sizeof(unsigned int)); | |
| } | |
| for (unsigned int Ri = 0; Ri < (unsigned int)Rw * Rh; Ri++) { | |
| unsigned int sum = 0; | |
| for (int td_i = layer_iter; td_i < td_nb; td_i += LR_NB) { | |
| sum += R[td_i][Ri]; | |
| } | |
| if (csf[layer_iter] == 1) { | |
| if (sum >= (unsigned int)csfp1[layer_iter]) { | |
| sum = csfp1[layer_iter] + (unsigned int) log((double)(sum - csfp1[layer_iter] + 1)); | |
| } | |
| } | |
| H[layer_iter][sum]++; | |
| } | |
| if (cm[layer_iter] == 0) { | |
| cm0n[layer_iter] = 0; | |
| for (unsigned int i = 0; i <= Rlrmax[layer_iter]; i++) { | |
| if (H[layer_iter][i] > 0) { | |
| H[layer_iter][i] = cm0n[layer_iter]++; | |
| } | |
| } | |
| } | |
| if (cm[layer_iter] == 1) { | |
| cm1n[layer_iter] = (unsigned int)Rw * Rh - H[layer_iter][0]; | |
| H[layer_iter][0] = 0; | |
| for (unsigned int i = 2; i <= Rlrmax[layer_iter]; i++) { | |
| H[layer_iter][i] += H[layer_iter][i - 1]; | |
| } | |
| } | |
| } | |
| } | |
| FILE* outfile = fopen(filename, "wb"); | |
| png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); | |
| png_infop info_ptr = png_create_info_struct(png_ptr); | |
| png_init_io(png_ptr, outfile); | |
| png_set_compression_level(png_ptr, 1); | |
| png_set_IHDR(png_ptr, info_ptr, Rw, Rh, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); | |
| png_write_info(png_ptr, info_ptr); | |
| png_bytep row_buffer = (png_bytep)calloc(Rw * 3, sizeof(png_byte)); | |
| if (lr_mode == 0) { | |
| if (cm[0] == 0) { | |
| for (int png_y = 0; png_y < Rh; png_y++) { | |
| sprintf(titlebar, "BuddhaBrot-MT: writing to 8-bit png: %.0f%% done...", (double)png_y / Rh * 100); | |
| reponsive_caption_update(titlebar); | |
| for (int png_x = 0; png_x < Rw; png_x++) { | |
| unsigned int Ri = (unsigned int)png_y * Rw + png_x; | |
| unsigned int sum = 0; | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| sum += R[td_i][Ri]; | |
| } | |
| if (csf[0] == 1) { | |
| if (sum >= (unsigned int)csfp1[0]) { | |
| sum = csfp1[0] + (unsigned int) log((double)(sum - csfp1[0] + 1)); | |
| } | |
| } | |
| int ct_i = 0; | |
| if (cm0n[0] > 1) { | |
| ct_i = MIN(CTe[0], ct_f[0] * CTe[0] * ((double)H[0][sum] / (cm0n[0] - 1))); | |
| } | |
| ct_i = ct_cycle(ct_i + ct_o[0], CTe[0]); | |
| row_buffer[png_x * 3 + 0] = CT[0][ct_i]; | |
| row_buffer[png_x * 3 + 1] = CT[0][ct_i]; | |
| row_buffer[png_x * 3 + 2] = CT[0][ct_i]; | |
| } | |
| png_write_row(png_ptr, row_buffer); | |
| } | |
| } | |
| if (cm[0] == 1) { | |
| for (int png_y = 0; png_y < Rh; png_y++) { | |
| sprintf(titlebar, "BuddhaBrot-MT: writing to 8-bit png: %.0f%% done...", (double)png_y / Rh * 100); | |
| reponsive_caption_update(titlebar); | |
| for (int png_x = 0; png_x < Rw; png_x++) { | |
| unsigned int Ri = (unsigned int)png_y * Rw + png_x; | |
| unsigned int sum = 0; | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| sum += R[td_i][Ri]; | |
| } | |
| if (csf[0] == 1) { | |
| if (sum >= (unsigned int)csfp1[0]) { | |
| sum = csfp1[0] + (unsigned int) log((double)(sum - csfp1[0] + 1)); | |
| } | |
| } | |
| int ct_i = 0; | |
| if (cm1n[0] > 0) { | |
| ct_i = MIN(CTe[0], ct_f[0] * CTe[0] * ((double)H[0][sum] / cm1n[0])); | |
| } | |
| ct_i = ct_cycle(ct_i + ct_o[0], CTe[0]); | |
| row_buffer[png_x * 3 + 0] = CT[0][ct_i]; | |
| row_buffer[png_x * 3 + 1] = CT[0][ct_i]; | |
| row_buffer[png_x * 3 + 2] = CT[0][ct_i]; | |
| } | |
| png_write_row(png_ptr, row_buffer); | |
| } | |
| } | |
| if (cm[0] == 2) { | |
| for (int png_y = 0; png_y < Rh; png_y++) { | |
| sprintf(titlebar, "BuddhaBrot-MT: writing to 8-bit png: %.0f%% done...", (double)png_y / Rh * 100); | |
| reponsive_caption_update(titlebar); | |
| for (int png_x = 0; png_x < Rw; png_x++) { | |
| unsigned int Ri = (unsigned int)png_y * Rw + png_x; | |
| unsigned int sum = 0; | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| sum += R[td_i][Ri]; | |
| } | |
| if (csf[0] == 1) { | |
| if (sum >= (unsigned int)csfp1[0]) { | |
| sum = csfp1[0] + (unsigned int) log((double)(sum - csfp1[0] + 1)); | |
| } | |
| } | |
| int ct_i = 0; | |
| if (Rlrmax[0] > 0) { | |
| ct_i = MIN(CTe[0], ct_f[0] * CTe[0] * ((double)sum / Rlrmax[0])); | |
| } | |
| ct_i = ct_cycle(ct_i + ct_o[0], CTe[0]); | |
| row_buffer[png_x * 3 + 0] = CT[0][ct_i]; | |
| row_buffer[png_x * 3 + 1] = CT[0][ct_i]; | |
| row_buffer[png_x * 3 + 2] = CT[0][ct_i]; | |
| } | |
| png_write_row(png_ptr, row_buffer); | |
| } | |
| } | |
| } | |
| if (lr_mode == 1) { | |
| for (int png_y = 0; png_y < Rh; png_y++) { | |
| sprintf(titlebar, "BuddhaBrot-MT: writing to 8-bit png: %.0f%% done...", (double)png_y / Rh * 100); | |
| reponsive_caption_update(titlebar); | |
| for (int png_x = 0; png_x < Rw; png_x++) { | |
| unsigned int Ri = (unsigned int)png_y * Rw + png_x; | |
| int ct_i[LR_NB] = {0}; | |
| for (int layer_iter = 0; layer_iter < LR_NB; layer_iter++) { | |
| unsigned int sum = 0; | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| sum += R[td_i][Ri]; | |
| } | |
| if (csf[layer_iter] == 1) { | |
| if (sum >= (unsigned int)csfp1[layer_iter]) { | |
| sum = csfp1[layer_iter] + (unsigned int) log((double)(sum - csfp1[layer_iter] + 1)); | |
| } | |
| } | |
| if (cm[layer_iter] == 0) { | |
| if (cm0n[layer_iter] > 1) { | |
| ct_i[layer_iter] = MIN(CTe[layer_iter], ct_f[layer_iter] * CTe[layer_iter] * ((double)H[layer_iter][sum] / (cm0n[layer_iter] - 1))); | |
| } | |
| } | |
| if (cm[layer_iter] == 1) { | |
| if (cm1n[layer_iter] > 0) { | |
| ct_i[layer_iter] = MIN(CTe[layer_iter], ct_f[layer_iter] * CTe[layer_iter] * ((double)H[layer_iter][sum] / cm1n[layer_iter])); | |
| } | |
| } | |
| if (cm[layer_iter] == 2) { | |
| if (Rlrmax[layer_iter] > 0) { | |
| ct_i[layer_iter] = MIN(CTe[layer_iter], ct_f[layer_iter] * CTe[layer_iter] * ((double)sum / Rlrmax[layer_iter])); | |
| } | |
| } | |
| ct_i[layer_iter] = ct_cycle(ct_i[layer_iter] + ct_o[layer_iter], CTe[layer_iter]); | |
| } | |
| row_buffer[png_x * 3 + 0] = CT[0][ct_i[0]]; | |
| row_buffer[png_x * 3 + 1] = CT[1][ct_i[1]]; | |
| row_buffer[png_x * 3 + 2] = CT[2][ct_i[2]]; | |
| } | |
| png_write_row(png_ptr, row_buffer); | |
| } | |
| } | |
| if (lr_mode == 2) { | |
| for (int png_y = 0; png_y < Rh; png_y++) { | |
| sprintf(titlebar, "BuddhaBrot-MT: writing to 8-bit png: %.0f%% done...", (double)png_y / Rh * 100); | |
| reponsive_caption_update(titlebar); | |
| for (int png_x = 0; png_x < Rw; png_x++) { | |
| unsigned int Ri = (unsigned int)png_y * Rw + png_x; | |
| int ct_i[LR_NB] = {0}; | |
| for (int layer_iter = 0; layer_iter < LR_NB; layer_iter++) { | |
| unsigned int sum = 0; | |
| for (int td_i = layer_iter; td_i < td_nb; td_i += LR_NB) { | |
| sum += R[td_i][Ri]; | |
| } | |
| if (csf[layer_iter] == 1) { | |
| if (sum >= (unsigned int)csfp1[layer_iter]) { | |
| sum = csfp1[layer_iter] + (unsigned int) log((double)(sum - csfp1[layer_iter] + 1)); | |
| } | |
| } | |
| if (cm[layer_iter] == 0) { | |
| if (cm0n[layer_iter] > 1) { | |
| ct_i[layer_iter] = MIN(CTe[layer_iter], ct_f[layer_iter] * CTe[layer_iter] * ((double)H[layer_iter][sum] / (cm0n[layer_iter] - 1))); | |
| } | |
| } | |
| if (cm[layer_iter] == 1) { | |
| if (cm1n[layer_iter] > 0) { | |
| ct_i[layer_iter] = MIN(CTe[layer_iter], ct_f[layer_iter] * CTe[layer_iter] * ((double)H[layer_iter][sum] / cm1n[layer_iter])); | |
| } | |
| } | |
| if (cm[layer_iter] == 2) { | |
| if (Rlrmax[layer_iter] > 0) { | |
| ct_i[layer_iter] = MIN(CTe[layer_iter], ct_f[layer_iter] * CTe[layer_iter] * ((double)sum / Rlrmax[layer_iter])); | |
| } | |
| } | |
| ct_i[layer_iter] = ct_cycle(ct_i[layer_iter] + ct_o[layer_iter], CTe[layer_iter]); | |
| } | |
| row_buffer[png_x * 3 + 0] = CT[0][ct_i[0]]; | |
| row_buffer[png_x * 3 + 1] = CT[1][ct_i[1]]; | |
| row_buffer[png_x * 3 + 2] = CT[2][ct_i[2]]; | |
| } | |
| png_write_row(png_ptr, row_buffer); | |
| } | |
| } | |
| png_write_end(png_ptr, NULL); | |
| if (row_buffer != NULL) { | |
| free(row_buffer); | |
| row_buffer = NULL; | |
| } | |
| png_destroy_write_struct(&png_ptr, &info_ptr); | |
| fclose(outfile); | |
| td_pause = 0; | |
| #pragma omp flush(td_pause) | |
| } | |
| void writeTtoPNG(const char* filename, int local_png_offset_x, int local_png_offset_y, int local_png_width, int local_png_height) | |
| { | |
| reponsive_caption_update("BuddhaBrot-MT: writing to 8-bit png: pausing calculation threads..."); | |
| pause_calcthreads_and_wait(); | |
| for (int layer_iter = 0; layer_iter < LR_NB; layer_iter++) { | |
| T[layer_iter] = (unsigned int*)calloc((unsigned int)local_png_width * local_png_height, sizeof(unsigned int)); | |
| } | |
| if (lr_mode == 0) { | |
| Rlrmax[0] = 0; | |
| for (int png_y = 0, Ry = local_png_offset_y; png_y < local_png_height; png_y++, Ry++) { | |
| for (int png_x = 0, Rx = local_png_offset_x; png_x < local_png_width; png_x++, Rx++) { | |
| unsigned int Ri = (unsigned int)Ry * Rw + Rx; | |
| unsigned int sum = 0; | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| sum += R[td_i][Ri]; | |
| } | |
| if (csf[0] == 1) { | |
| if (sum >= (unsigned int)csfp1[0]) { | |
| sum = csfp1[0] + (unsigned int) log((double)(sum - csfp1[0] + 1)); | |
| } | |
| } | |
| if (sum > Rlrmax[0]) { | |
| Rlrmax[0] = sum; | |
| } | |
| T[0][png_y * local_png_width + png_x] = sum; | |
| } | |
| } | |
| if (Rlrmax[0] >= Hl[0]) { | |
| if (H[0] != NULL) { | |
| free(H[0]); | |
| H[0] = NULL; | |
| } | |
| Hl[0] = Rlrmax[0] + 1; | |
| H[0] = (unsigned int*)calloc(Hl[0], sizeof(unsigned int)); | |
| } else { | |
| memset(H[0], 0, Hl[0] * sizeof(unsigned int)); | |
| } | |
| Rlrmax[1] = 0; | |
| Rlrmax[2] = 0; | |
| Hl[1] = 0; | |
| Hl[2] = 0; | |
| if (H[1] != NULL) { | |
| free(H[1]); | |
| H[1] = NULL; | |
| } | |
| if (H[2] != NULL) { | |
| free(H[2]); | |
| H[2] = NULL; | |
| } | |
| for (int png_y = 0; png_y < local_png_height; png_y++) { | |
| for (int png_x = 0; png_x < local_png_width; png_x++) { | |
| H[0][T[0][png_y * local_png_width + png_x]]++; | |
| } | |
| } | |
| if (cm[0] == 0) { | |
| cm0n[0] = 0; | |
| for (unsigned int i = 0; i <= Rlrmax[0]; i++) { | |
| if (H[0][i] > 0) { | |
| H[0][i] = cm0n[0]++; | |
| } | |
| } | |
| } | |
| if (cm[0] == 1) { | |
| cm1n[0] = (unsigned int)local_png_width * local_png_height - H[0][0]; | |
| H[0][0] = 0; | |
| for (unsigned int i = 2; i <= Rlrmax[0]; i++) { | |
| H[0][i] += H[0][i - 1]; | |
| } | |
| } | |
| } | |
| if (lr_mode == 1) { | |
| for (int layer_iter = 0; layer_iter < LR_NB; layer_iter++) { | |
| Rlrmax[layer_iter] = 0; | |
| for (int png_y = 0, Ry = local_png_offset_y; png_y < local_png_height; png_y++, Ry++) { | |
| for (int png_x = 0, Rx = local_png_offset_x; png_x < local_png_width; png_x++, Rx++) { | |
| unsigned int Ri = (unsigned int)Ry * Rw + Rx; | |
| unsigned int sum = 0; | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| sum += R[td_i][Ri]; | |
| } | |
| if (csf[layer_iter] == 1) { | |
| if (sum >= (unsigned int)csfp1[layer_iter]) { | |
| sum = csfp1[layer_iter] + (unsigned int) log((double)(sum - csfp1[layer_iter] + 1)); | |
| } | |
| } | |
| if (sum > Rlrmax[layer_iter]) { | |
| Rlrmax[layer_iter] = sum; | |
| } | |
| T[layer_iter][png_y * local_png_width + png_x] = sum; | |
| } | |
| } | |
| if (Rlrmax[layer_iter] >= Hl[layer_iter]) { | |
| if (H[layer_iter] != NULL) { | |
| free(H[layer_iter]); | |
| H[layer_iter] = NULL; | |
| } | |
| Hl[layer_iter] = Rlrmax[layer_iter] + 1; | |
| H[layer_iter] = (unsigned int*)calloc(Hl[layer_iter], sizeof(unsigned int)); | |
| } else { | |
| memset(H[layer_iter], 0, Hl[layer_iter] * sizeof(unsigned int)); | |
| } | |
| for (int png_y = 0; png_y < local_png_height; png_y++) { | |
| for (int png_x = 0; png_x < local_png_width; png_x++) { | |
| H[layer_iter][T[layer_iter][png_y * local_png_width + png_x]]++; | |
| } | |
| } | |
| if (cm[layer_iter] == 0) { | |
| cm0n[layer_iter] = 0; | |
| for (unsigned int i = 0; i <= Rlrmax[layer_iter]; i++) { | |
| if (H[layer_iter][i] > 0) { | |
| H[layer_iter][i] = cm0n[layer_iter]++; | |
| } | |
| } | |
| } | |
| if (cm[layer_iter] == 1) { | |
| cm1n[layer_iter] = (unsigned int)local_png_width * local_png_height - H[layer_iter][0]; | |
| H[layer_iter][0] = 0; | |
| for (unsigned int i = 2; i <= Rlrmax[layer_iter]; i++) { | |
| H[layer_iter][i] += H[layer_iter][i - 1]; | |
| } | |
| } | |
| } | |
| } | |
| if (lr_mode == 2) { | |
| for (int layer_iter = 0; layer_iter < LR_NB; layer_iter++) { | |
| Rlrmax[layer_iter] = 0; | |
| for (int png_y = 0, Ry = local_png_offset_y; png_y < local_png_height; png_y++, Ry++) { | |
| for (int png_x = 0, Rx = local_png_offset_x; png_x < local_png_width; png_x++, Rx++) { | |
| unsigned int Ri = (unsigned int)Ry * Rw + Rx; | |
| unsigned int sum = 0; | |
| for (int td_i = layer_iter; td_i < td_nb; td_i += LR_NB) { | |
| sum += R[td_i][Ri]; | |
| } | |
| if (csf[layer_iter] == 1) { | |
| if (sum >= (unsigned int)csfp1[layer_iter]) { | |
| sum = csfp1[layer_iter] + (unsigned int) log((double)(sum - csfp1[layer_iter] + 1)); | |
| } | |
| } | |
| if (sum > Rlrmax[layer_iter]) { | |
| Rlrmax[layer_iter] = sum; | |
| } | |
| T[layer_iter][png_y * local_png_width + png_x] = sum; | |
| } | |
| } | |
| if (Rlrmax[layer_iter] >= Hl[layer_iter]) { | |
| if (H[layer_iter] != NULL) { | |
| free(H[layer_iter]); | |
| H[layer_iter] = NULL; | |
| } | |
| Hl[layer_iter] = Rlrmax[layer_iter] + 1; | |
| H[layer_iter] = (unsigned int*)calloc(Hl[layer_iter], sizeof(unsigned int)); | |
| } else { | |
| memset(H[layer_iter], 0, Hl[layer_iter] * sizeof(unsigned int)); | |
| } | |
| for (int png_y = 0; png_y < local_png_height; png_y++) { | |
| for (int png_x = 0; png_x < local_png_width; png_x++) { | |
| H[layer_iter][T[layer_iter][png_y * local_png_width + png_x]]++; | |
| } | |
| } | |
| if (cm[layer_iter] == 0) { | |
| cm0n[layer_iter] = 0; | |
| for (unsigned int i = 0; i <= Rlrmax[layer_iter]; i++) { | |
| if (H[layer_iter][i] > 0) { | |
| H[layer_iter][i] = cm0n[layer_iter]++; | |
| } | |
| } | |
| } | |
| if (cm[layer_iter] == 1) { | |
| cm1n[layer_iter] = (unsigned int)local_png_width * local_png_height - H[layer_iter][0]; | |
| H[layer_iter][0] = 0; | |
| for (unsigned int i = 2; i <= Rlrmax[layer_iter]; i++) { | |
| H[layer_iter][i] += H[layer_iter][i - 1]; | |
| } | |
| } | |
| } | |
| } | |
| FILE* outfile = fopen(filename, "wb"); | |
| png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); | |
| png_infop info_ptr = png_create_info_struct(png_ptr); | |
| png_init_io(png_ptr, outfile); | |
| png_set_compression_level(png_ptr, 1); | |
| png_set_IHDR(png_ptr, info_ptr, local_png_width, local_png_height, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); | |
| png_write_info(png_ptr, info_ptr); | |
| png_bytep row_buffer = (png_bytep)calloc(local_png_width * 3, sizeof(png_byte)); | |
| if (lr_mode == 0) { | |
| if (cm[0] == 0) { | |
| for (int png_y = 0; png_y < local_png_height; png_y++) { | |
| sprintf(titlebar, "BuddhaBrot-MT: writing to 8-bit png: %.0f%% done...", (double)png_y / local_png_height * 100); | |
| reponsive_caption_update(titlebar); | |
| for (int png_x = 0; png_x < local_png_width; png_x++) { | |
| int ct_i = 0; | |
| if (cm0n[0] > 1) { | |
| ct_i = MIN(CTe[0], ct_f[0] * CTe[0] * ((double)H[0][T[0][png_y * local_png_width + png_x]] / (cm0n[0] - 1))); | |
| } | |
| ct_i = ct_cycle(ct_i + ct_o[0], CTe[0]); | |
| row_buffer[png_x * 3 + 0] = CT[0][ct_i]; | |
| row_buffer[png_x * 3 + 1] = CT[0][ct_i]; | |
| row_buffer[png_x * 3 + 2] = CT[0][ct_i]; | |
| } | |
| png_write_row(png_ptr, row_buffer); | |
| } | |
| } | |
| if (cm[0] == 1) { | |
| for (int png_y = 0; png_y < local_png_height; png_y++) { | |
| sprintf(titlebar, "BuddhaBrot-MT: writing to 8-bit png: %.0f%% done...", (double)png_y / Rh * 100); | |
| reponsive_caption_update(titlebar); | |
| for (int png_x = 0; png_x < local_png_width; png_x++) { | |
| int ct_i = 0; | |
| if (cm1n[0] > 0) { | |
| ct_i = MIN(CTe[0], ct_f[0] * CTe[0] * ((double)H[0][T[0][png_y * local_png_width + png_x]] / cm1n[0])); | |
| } | |
| ct_i = ct_cycle(ct_i + ct_o[0], CTe[0]); | |
| row_buffer[png_x * 3 + 0] = CT[0][ct_i]; | |
| row_buffer[png_x * 3 + 1] = CT[0][ct_i]; | |
| row_buffer[png_x * 3 + 2] = CT[0][ct_i]; | |
| } | |
| png_write_row(png_ptr, row_buffer); | |
| } | |
| } | |
| if (cm[0] == 2) { | |
| for (int png_y = 0; png_y < local_png_height; png_y++) { | |
| sprintf(titlebar, "BuddhaBrot-MT: writing to 8-bit png: %.0f%% done...", (double)png_y / Rh * 100); | |
| reponsive_caption_update(titlebar); | |
| for (int png_x = 0; png_x < local_png_width; png_x++) { | |
| int ct_i = 0; | |
| if (Rlrmax[0] > 0) { | |
| ct_i = MIN(CTe[0], ct_f[0] * CTe[0] * ((double)T[0][png_y * local_png_width + png_x] / Rlrmax[0])); | |
| } | |
| ct_i = ct_cycle(ct_i + ct_o[0], CTe[0]); | |
| row_buffer[png_x * 3 + 0] = CT[0][ct_i]; | |
| row_buffer[png_x * 3 + 1] = CT[0][ct_i]; | |
| row_buffer[png_x * 3 + 2] = CT[0][ct_i]; | |
| } | |
| png_write_row(png_ptr, row_buffer); | |
| } | |
| } | |
| } | |
| if (lr_mode == 1) { | |
| for (int png_y = 0; png_y < local_png_height; png_y++) { | |
| sprintf(titlebar, "BuddhaBrot-MT: writing to 8-bit png: %.0f%% done...", (double)png_y / Rh * 100); | |
| reponsive_caption_update(titlebar); | |
| for (int png_x = 0; png_x < local_png_width; png_x++) { | |
| int ct_i[LR_NB] = {0}; | |
| for (int layer_iter = 0; layer_iter < LR_NB; layer_iter++) { | |
| if (cm[layer_iter] == 0) { | |
| if (cm0n[layer_iter] > 1) { | |
| ct_i[layer_iter] = MIN(CTe[layer_iter], ct_f[layer_iter] * CTe[layer_iter] * ((double)H[layer_iter][T[layer_iter][png_y * local_png_width + png_x]] / (cm0n[layer_iter] - 1))); | |
| } | |
| } | |
| if (cm[layer_iter] == 1) { | |
| if (cm1n[layer_iter] > 0) { | |
| ct_i[layer_iter] = MIN(CTe[layer_iter], ct_f[layer_iter] * CTe[layer_iter] * ((double)H[layer_iter][T[layer_iter][png_y * local_png_width + png_x]] / cm1n[layer_iter])); | |
| } | |
| } | |
| if (cm[layer_iter] == 2) { | |
| if (Rlrmax[layer_iter] > 0) { | |
| ct_i[layer_iter] = MIN(CTe[layer_iter], ct_f[layer_iter] * CTe[layer_iter] * ((double)T[layer_iter][png_y * local_png_width + png_x] / Rlrmax[layer_iter])); | |
| } | |
| } | |
| ct_i[layer_iter] = ct_cycle(ct_i[layer_iter] + ct_o[layer_iter], CTe[layer_iter]); | |
| } | |
| row_buffer[png_x * 3 + 0] = CT[0][ct_i[0]]; | |
| row_buffer[png_x * 3 + 1] = CT[1][ct_i[1]]; | |
| row_buffer[png_x * 3 + 2] = CT[2][ct_i[2]]; | |
| } | |
| png_write_row(png_ptr, row_buffer); | |
| } | |
| } | |
| if (lr_mode == 2) { | |
| for (int png_y = 0; png_y < local_png_height; png_y++) { | |
| sprintf(titlebar, "BuddhaBrot-MT: writing to 8-bit png: %.0f%% done...", (double)png_y / Rh * 100); | |
| reponsive_caption_update(titlebar); | |
| for (int png_x = 0; png_x < local_png_width; png_x++) { | |
| int ct_i[LR_NB] = {0}; | |
| for (int layer_iter = 0; layer_iter < LR_NB; layer_iter++) { | |
| if (cm[layer_iter] == 0) { | |
| if (cm0n[layer_iter] > 1) { | |
| ct_i[layer_iter] = MIN(CTe[layer_iter], ct_f[layer_iter] * CTe[layer_iter] * ((double)H[layer_iter][T[layer_iter][png_y * local_png_width + png_x]] / (cm0n[layer_iter] - 1))); | |
| } | |
| } | |
| if (cm[layer_iter] == 1) { | |
| if (cm1n[layer_iter] > 0) { | |
| ct_i[layer_iter] = MIN(CTe[layer_iter], ct_f[layer_iter] * CTe[layer_iter] * ((double)H[layer_iter][T[layer_iter][png_y * local_png_width + png_x]] / cm1n[layer_iter])); | |
| } | |
| } | |
| if (cm[layer_iter] == 2) { | |
| if (Rlrmax[layer_iter] > 0) { | |
| ct_i[layer_iter] = MIN(CTe[layer_iter], ct_f[layer_iter] * CTe[layer_iter] * ((double)T[layer_iter][png_y * local_png_width + png_x] / Rlrmax[layer_iter])); | |
| } | |
| } | |
| ct_i[layer_iter] = ct_cycle(ct_i[layer_iter] + ct_o[layer_iter], CTe[layer_iter]); | |
| } | |
| row_buffer[png_x * 3 + 0] = CT[0][ct_i[0]]; | |
| row_buffer[png_x * 3 + 1] = CT[1][ct_i[1]]; | |
| row_buffer[png_x * 3 + 2] = CT[2][ct_i[2]]; | |
| } | |
| png_write_row(png_ptr, row_buffer); | |
| } | |
| } | |
| png_write_end(png_ptr, NULL); | |
| if (row_buffer != NULL) { | |
| free(row_buffer); | |
| row_buffer = NULL; | |
| } | |
| png_destroy_write_struct(&png_ptr, &info_ptr); | |
| fclose(outfile); | |
| for (int layer_iter = 0; layer_iter < LR_NB; layer_iter++) { | |
| if (T[layer_iter] != NULL) { | |
| free(T[layer_iter]); | |
| T[layer_iter] = NULL; | |
| } | |
| } | |
| td_pause = 0; | |
| #pragma omp flush(td_pause) | |
| } | |
| void sdl_message_check() | |
| { | |
| recalc_WH_if_paused = 0; | |
| if (sdl_event.type == SDL_QUIT) { | |
| td_stop = 1; | |
| #pragma omp flush(td_stop) | |
| } | |
| if (sdl_event.type == SDL_KEYDOWN) { | |
| //// switch title bar display | |
| if (sdl_event.key.keysym.sym == SDLK_ESCAPE && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| tbs = (tbs + 1) % TBS_NB; | |
| } | |
| //// save status | |
| if (sdl_event.key.keysym.sym == SDLK_F9 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| save_status_files(); | |
| } | |
| //// load status | |
| if (sdl_event.key.keysym.sym == SDLK_F10 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_status_files(); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_F10 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_param_file(1, 0, 0); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_F10 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_status_files_minmem(); | |
| } | |
| //// td_pause | |
| if (sdl_event.key.keysym.sym == SDLK_F11 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| td_pause = 1 - td_pause; | |
| #pragma omp flush(td_pause) | |
| } | |
| //// increase threads | |
| if (sdl_event.key.keysym.sym == SDLK_F11 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| increase_num_calcthreads(); | |
| } | |
| //// decrease threads | |
| if (sdl_event.key.keysym.sym == SDLK_F11 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| decrease_num_calcthreads(); | |
| } | |
| //// set fps at 1 frame per second | |
| if (sdl_event.key.keysym.sym == SDLK_F12 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| fps = 1.0; | |
| } | |
| //// set fps at 10 frames per second | |
| if (sdl_event.key.keysym.sym == SDLK_F12 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| fps = 10.0; | |
| } | |
| //// set fps at 30 frames per second | |
| if (sdl_event.key.keysym.sym == SDLK_F12 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| fps = 30.0; | |
| } | |
| //// change lr_mode | |
| if (sdl_event.key.keysym.sym == SDLK_F1 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| lr_mode = (lr_mode + 1) % LR_MODE_NB; | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// change ct_type layer 123 | |
| if (sdl_event.key.keysym.sym == SDLK_F5 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_type[0] = (ct_type[0] + 1) % CT_TYPE_NB; | |
| ct_type[1] = ct_type[0]; | |
| ct_type[2] = ct_type[0]; | |
| ct_load(-1, ct_type[0], ct_type[1], ct_type[2]); | |
| } | |
| //// change ct_type layer 1 | |
| if (sdl_event.key.keysym.sym == SDLK_F2 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_type[0] = (ct_type[0] + 1) % CT_TYPE_NB; | |
| ct_load(0, ct_type[0], ct_type[1], ct_type[2]); | |
| } | |
| //// change ct_type layer 2 | |
| if (sdl_event.key.keysym.sym == SDLK_F3 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_type[1] = (ct_type[1] + 1) % CT_TYPE_NB; | |
| ct_load(1, ct_type[0], ct_type[1], ct_type[2]); | |
| } | |
| //// change ct_type layer 3 | |
| if (sdl_event.key.keysym.sym == SDLK_F4 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_type[2] = (ct_type[2] + 1) % CT_TYPE_NB; | |
| ct_load(2, ct_type[0], ct_type[1], ct_type[2]); | |
| } | |
| //// change CTe layer 1 | |
| if (sdl_event.key.keysym.sym == SDLK_F6 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| CTe[0] = MAX(CTe[0] - 1, 0); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_F6 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| CTe[0] = 192; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_F6 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_load(0, ct_type[0], ct_type[1], ct_type[2]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_F6 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| CTe[0] = 128; | |
| } | |
| //// change CTe layer 2 | |
| if (sdl_event.key.keysym.sym == SDLK_F7 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| CTe[1] = MAX(CTe[1] - 1, 0); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_F7 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| CTe[1] = 192; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_F7 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_load(1, ct_type[0], ct_type[1], ct_type[2]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_F7 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| CTe[1] = 128; | |
| } | |
| //// change CTe layer 3 | |
| if (sdl_event.key.keysym.sym == SDLK_F8 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| CTe[2] = MAX(CTe[2] - 1, 0); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_F8 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| CTe[2] = 192; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_F8 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_load(2, ct_type[0], ct_type[1], ct_type[2]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_F8 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| CTe[2] = 128; | |
| } | |
| //// change bb_type layer 123 | |
| if (sdl_event.key.keysym.sym == SDLK_BACKQUOTE && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(-1, (bb_type[0] + 1) % BB_TYPE_NB, bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0]); | |
| } | |
| //// change bb_bail layer 123 | |
| if (sdl_event.key.keysym.sym == SDLK_1 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(-1, bb_type[0], bb_bail[0] + 1, bb_pps[0], bb_ppe[0], bb_minn[0]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_1 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(-1, bb_type[0], bb_bail[0] * 10, bb_pps[0], bb_ppe[0], bb_minn[0]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_1 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(-1, bb_type[0], bb_bail[0] - 1, bb_pps[0], bb_ppe[0], bb_minn[0]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_1 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(-1, bb_type[0], bb_bail[0] / 10, bb_pps[0], bb_ppe[0], bb_minn[0]); | |
| } | |
| //// change bb_bail layer 1 | |
| if (sdl_event.key.keysym.sym == SDLK_q && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(0, bb_type[0], bb_bail[0] + 1, bb_pps[0], bb_ppe[0], bb_minn[0]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_q && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(0, bb_type[0], bb_bail[0] * 10, bb_pps[0], bb_ppe[0], bb_minn[0]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_q && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(0, bb_type[0], bb_bail[0] - 1, bb_pps[0], bb_ppe[0], bb_minn[0]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_q && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(0, bb_type[0], bb_bail[0] / 10, bb_pps[0], bb_ppe[0], bb_minn[0]); | |
| } | |
| //// change bb_bail layer 2 | |
| if (sdl_event.key.keysym.sym == SDLK_a && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(1, bb_type[1], bb_bail[1] + 1, bb_pps[1], bb_ppe[1], bb_minn[1]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_a && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(1, bb_type[1], bb_bail[1] * 10, bb_pps[1], bb_ppe[1], bb_minn[1]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_a && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(1, bb_type[1], bb_bail[1] - 1, bb_pps[1], bb_ppe[1], bb_minn[1]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_a && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(1, bb_type[1], bb_bail[1] / 10, bb_pps[1], bb_ppe[1], bb_minn[1]); | |
| } | |
| //// change bb_bail layer 3 | |
| if (sdl_event.key.keysym.sym == SDLK_z && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(2, bb_type[2], bb_bail[2] + 1, bb_pps[2], bb_ppe[2], bb_minn[2]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_z && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(2, bb_type[2], bb_bail[2] * 10, bb_pps[2], bb_ppe[2], bb_minn[2]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_z && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(2, bb_type[2], bb_bail[2] - 1, bb_pps[2], bb_ppe[2], bb_minn[2]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_z && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(2, bb_type[2], bb_bail[2] / 10, bb_pps[2], bb_ppe[2], bb_minn[2]); | |
| } | |
| //// change bb_pps layer 123 | |
| if (sdl_event.key.keysym.sym == SDLK_2 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(-1, bb_type[0], bb_bail[0], bb_pps[0] + 1, bb_ppe[0], bb_minn[0]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_2 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(-1, bb_type[0], bb_bail[0], bb_pps[0] * 10, bb_ppe[0], bb_minn[0]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_2 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(-1, bb_type[0], bb_bail[0], bb_pps[0] - 1, bb_ppe[0], bb_minn[0]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_2 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(-1, bb_type[0], bb_bail[0], bb_pps[0] / 10, bb_ppe[0], bb_minn[0]); | |
| } | |
| //// change bb_pps layer 1 | |
| if (sdl_event.key.keysym.sym == SDLK_w && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(0, bb_type[0], bb_bail[0], bb_pps[0] + 1, bb_ppe[0], bb_minn[0]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_w && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(0, bb_type[0], bb_bail[0], bb_pps[0] * 10, bb_ppe[0], bb_minn[0]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_w && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(0, bb_type[0], bb_bail[0], bb_pps[0] - 1, bb_ppe[0], bb_minn[0]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_w && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(0, bb_type[0], bb_bail[0], bb_pps[0] / 10, bb_ppe[0], bb_minn[0]); | |
| } | |
| //// change bb_pps layer 2 | |
| if (sdl_event.key.keysym.sym == SDLK_s && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(1, bb_type[1], bb_bail[1], bb_pps[1] + 1, bb_ppe[1], bb_minn[1]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_s && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(1, bb_type[1], bb_bail[1], bb_pps[1] * 10, bb_ppe[1], bb_minn[1]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_s && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(1, bb_type[1], bb_bail[1], bb_pps[1] - 1, bb_ppe[1], bb_minn[1]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_s && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(1, bb_type[1], bb_bail[1], bb_pps[1] / 10, bb_ppe[1], bb_minn[1]); | |
| } | |
| //// change bb_pps layer 3 | |
| if (sdl_event.key.keysym.sym == SDLK_x && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(2, bb_type[2], bb_bail[2], bb_pps[2] + 1, bb_ppe[2], bb_minn[2]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_x && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(2, bb_type[2], bb_bail[2], bb_pps[2] * 10, bb_ppe[2], bb_minn[2]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_x && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(2, bb_type[2], bb_bail[2], bb_pps[2] - 1, bb_ppe[2], bb_minn[2]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_x && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(2, bb_type[2], bb_bail[2], bb_pps[2] / 10, bb_ppe[2], bb_minn[2]); | |
| } | |
| //// change bb_ppe layer 123 | |
| if (sdl_event.key.keysym.sym == SDLK_3 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(-1, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0] + 1, bb_minn[0]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_3 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(-1, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0] * 10, bb_minn[0]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_3 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(-1, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0] - 1, bb_minn[0]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_3 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(-1, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0] / 10, bb_minn[0]); | |
| } | |
| //// change bb_ppe layer 1 | |
| if (sdl_event.key.keysym.sym == SDLK_e && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(0, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0] + 1, bb_minn[0]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_e && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(0, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0] * 10, bb_minn[0]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_e && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(0, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0] - 1, bb_minn[0]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_e && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(0, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0] / 10, bb_minn[0]); | |
| } | |
| //// change bb_ppe layer 2 | |
| if (sdl_event.key.keysym.sym == SDLK_d && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(1, bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1] + 1, bb_minn[1]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_d && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(1, bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1] * 10, bb_minn[1]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_d && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(1, bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1] - 1, bb_minn[1]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_d && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(1, bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1] / 10, bb_minn[1]); | |
| } | |
| //// change bb_ppe layer 3 | |
| if (sdl_event.key.keysym.sym == SDLK_c && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(2, bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2] + 1, bb_minn[2]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_c && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(2, bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2] * 10, bb_minn[2]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_c && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(2, bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2] - 1, bb_minn[2]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_c && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(2, bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2] / 10, bb_minn[2]); | |
| } | |
| //// change bb_minn layer 123 | |
| if (sdl_event.key.keysym.sym == SDLK_4 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(-1, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0] + 1); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_4 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(-1, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0] * 10); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_4 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(-1, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0] - 1); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_4 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(-1, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0] / 10); | |
| } | |
| //// change bb_minn layer 1 | |
| if (sdl_event.key.keysym.sym == SDLK_r && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(0, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0] + 1); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_r && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(0, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0] * 10); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_r && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(0, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0] - 1); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_r && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(0, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0] / 10); | |
| } | |
| //// change bb_minn layer 2 | |
| if (sdl_event.key.keysym.sym == SDLK_f && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(1, bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1] + 1); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_f && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(1, bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1] * 10); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_f && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(1, bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1] - 1); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_f && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(1, bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1] , bb_minn[1] / 10); | |
| } | |
| //// change bb_minn layer 3 | |
| if (sdl_event.key.keysym.sym == SDLK_v && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(2, bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2] + 1); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_v && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(2, bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2] * 10); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_v && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(2, bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2] - 1); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_v && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_bb_param(2, bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2] / 10); | |
| } | |
| //// change cm layer 123 | |
| if (sdl_event.key.keysym.sym == SDLK_5 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| cm[0] = (cm[0] + 1) % CM_NB; | |
| cm[1] = cm[0]; | |
| cm[2] = cm[0]; | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// change cm layer 1 | |
| if (sdl_event.key.keysym.sym == SDLK_t&& !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| cm[0] = (cm[0] + 1) % CM_NB; | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// change cm layer 2 | |
| if (sdl_event.key.keysym.sym == SDLK_g && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| cm[1] = (cm[1] + 1) % CM_NB; | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// change cm layer 3 | |
| if (sdl_event.key.keysym.sym == SDLK_b && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| cm[2] = (cm[2] + 1) % CM_NB; | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// change csf layer 123 | |
| if (sdl_event.key.keysym.sym == SDLK_5 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| csf[0] = (csf[0] + 1) % CSF_NB; | |
| csf[1] = csf[0]; | |
| csf[2] = csf[0]; | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// change csf layer 1 | |
| if (sdl_event.key.keysym.sym == SDLK_t&& (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| csf[0] = (csf[0] + 1) % CSF_NB; | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// change csf layer 2 | |
| if (sdl_event.key.keysym.sym == SDLK_g && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| csf[1] = (csf[1] + 1) % CSF_NB; | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// change csf layer 3 | |
| if (sdl_event.key.keysym.sym == SDLK_b && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| csf[2] = (csf[2] + 1) % CSF_NB; | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// change csfp1 layer 123 | |
| if (sdl_event.key.keysym.sym == SDLK_6 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| csfp1[0] += 1; | |
| csfp1[1] = csfp1[0]; | |
| csfp1[2] = csfp1[0]; | |
| recalc_WH_if_paused = 1; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_6 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| csfp1[0] *= 10; | |
| csfp1[1] = csfp1[0]; | |
| csfp1[2] = csfp1[0]; | |
| recalc_WH_if_paused = 1; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_6 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| csfp1[0] = MAX(csfp1[0] - 1, 0); | |
| csfp1[1] = csfp1[0]; | |
| csfp1[2] = csfp1[0]; | |
| recalc_WH_if_paused = 1; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_6 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| csfp1[0] = MAX(csfp1[0] / 10, 0); | |
| csfp1[1] = csfp1[0]; | |
| csfp1[2] = csfp1[0]; | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// change csfp1 layer 1 | |
| if (sdl_event.key.keysym.sym == SDLK_y && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| csfp1[0] += 1; | |
| recalc_WH_if_paused = 1; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_y && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| csfp1[0] *= 10; | |
| recalc_WH_if_paused = 1; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_y && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| csfp1[0] = MAX(csfp1[0] - 1, 0); | |
| recalc_WH_if_paused = 1; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_y && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| csfp1[0] = MAX(csfp1[0] / 10, 0); | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// change csfp1 layer 2 | |
| if (sdl_event.key.keysym.sym == SDLK_h && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| csfp1[1] += 1; | |
| recalc_WH_if_paused = 1; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_h && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| csfp1[1] *= 10; | |
| recalc_WH_if_paused = 1; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_h && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| csfp1[1] = MAX(csfp1[1] - 1, 0); | |
| recalc_WH_if_paused = 1; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_h && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| csfp1[1] = MAX(csfp1[1] / 10, 0); | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// change csfp1 layer 3 | |
| if (sdl_event.key.keysym.sym == SDLK_n && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| csfp1[2] += 1; | |
| recalc_WH_if_paused = 1; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_n && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| csfp1[2] *= 10; | |
| recalc_WH_if_paused = 1; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_n && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| csfp1[2] = MAX(csfp1[2] - 1, 0); | |
| recalc_WH_if_paused = 1; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_n && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| csfp1[2] = MAX(csfp1[2] / 10, 0); | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// change ct_f layer 123 | |
| if (sdl_event.key.keysym.sym == SDLK_7 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_f[0] += 0.1; | |
| ct_f[1] = ct_f[0]; | |
| ct_f[2] = ct_f[0]; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_7 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_f[0] += 1.0; | |
| ct_f[1] = ct_f[0]; | |
| ct_f[2] = ct_f[0]; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_7 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_f[0] = 1.0; | |
| ct_f[1] = 1.0; | |
| ct_f[2] = 1.0; | |
| } | |
| //// change ct_f layer 1 | |
| if (sdl_event.key.keysym.sym == SDLK_u && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_f[0] += 0.1; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_u && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_f[0] += 1.0; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_u && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_f[0] = 1.0; | |
| } | |
| //// change ct_f layer 2 | |
| if (sdl_event.key.keysym.sym == SDLK_j && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_f[1] += 0.1; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_j && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_f[1] += 1.0; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_j && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_f[1] = 1.0; | |
| } | |
| //// change ct_f layer 3 | |
| if (sdl_event.key.keysym.sym == SDLK_m && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_f[2] += 0.1; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_m && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_f[2] += 1.0; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_m && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_f[2] = 1.0; | |
| } | |
| //// change ct_o layer 123 | |
| if (sdl_event.key.keysym.sym == SDLK_8 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_o[0] = ct_cycle(ct_o[0] + 1, CTe[0]); | |
| ct_o[1] = ct_o[0]; | |
| ct_o[2] = ct_o[0]; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_8 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_o[0] = ct_cycle(ct_o[0] + 10, CTe[0]); | |
| ct_o[1] = ct_o[0]; | |
| ct_o[2] = ct_o[0]; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_8 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_o[0] = 0; | |
| ct_o[1] = 0; | |
| ct_o[2] = 0; | |
| } | |
| //// change ct_o layer 1 | |
| if (sdl_event.key.keysym.sym == SDLK_i && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_o[0] = ct_cycle(ct_o[0] + 1, CTe[0]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_i && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_o[0] = ct_cycle(ct_o[0] + 10, CTe[0]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_i && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_o[0] = 0; | |
| } | |
| //// change ct_o layer 2 | |
| if (sdl_event.key.keysym.sym == SDLK_k && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_o[1] = ct_cycle(ct_o[1] + 1, CTe[1]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_k && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_o[1] = ct_cycle(ct_o[1] + 10, CTe[1]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_k && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_o[1] = 0; | |
| } | |
| //// change ct_o layer 3 | |
| if (sdl_event.key.keysym.sym == SDLK_COMMA && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_o[2] = ct_cycle(ct_o[2] + 1, CTe[2]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_COMMA && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_o[2] = ct_cycle(ct_o[2] + 10, CTe[2]); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_COMMA && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_o[2] = 0; | |
| } | |
| //// change ct_v layer 123 | |
| if (sdl_event.key.keysym.sym == SDLK_9 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_v[0]++; | |
| ct_v[1] = ct_v[0]; | |
| ct_v[2] = ct_v[0]; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_9 && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_v[0]--; | |
| ct_v[1] = ct_v[0]; | |
| ct_v[2] = ct_v[0]; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_9 && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_v[0] = 0; | |
| ct_v[1] = 0; | |
| ct_v[2] = 0; | |
| } | |
| //// change ct_v layer 1 | |
| if (sdl_event.key.keysym.sym == SDLK_o && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_v[0]++; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_o && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_v[0]--; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_o && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_v[0] = 0; | |
| } | |
| //// change ct_v layer 2 | |
| if (sdl_event.key.keysym.sym == SDLK_l && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_v[1]++; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_l && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_v[1]--; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_l && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_v[1] = 0; | |
| } | |
| //// change ct_v layer 3 | |
| if (sdl_event.key.keysym.sym == SDLK_PERIOD && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_v[2]++; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_PERIOD && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_v[2]--; | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_PERIOD && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| ct_v[2] = 0; | |
| } | |
| //// permutate layer color | |
| if (sdl_event.key.keysym.sym == SDLK_TAB && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| if (plc == 0 || plc == 3) { | |
| int tmp_cm = cm[0]; | |
| int tmp_csf = csf[0]; | |
| int tmp_csfp1 = csfp1[0]; | |
| double tmp_ct_f = ct_f[0]; | |
| int tmp_ct_o = ct_o[0]; | |
| int tmp_ct_v = ct_v[0]; | |
| cm[0] = cm[1]; | |
| csf[0] = csf[1]; | |
| csfp1[0] = csfp1[1]; | |
| ct_f[0] = ct_f[1]; | |
| ct_o[0] = ct_o[1]; | |
| ct_v[0] = ct_v[1]; | |
| cm[1] = tmp_cm; | |
| csf[1] = tmp_csf; | |
| csfp1[1] = tmp_csfp1; | |
| ct_f[1] = tmp_ct_f; | |
| ct_o[1] = tmp_ct_o; | |
| ct_v[1] = tmp_ct_v; | |
| } | |
| if (plc == 1 || plc == 4) { | |
| int tmp_cm = cm[1]; | |
| int tmp_csf = csf[1]; | |
| int tmp_csfp1 = csfp1[1]; | |
| double tmp_ct_f = ct_f[1]; | |
| int tmp_ct_o = ct_o[1]; | |
| int tmp_ct_v = ct_v[1]; | |
| cm[1] = cm[2]; | |
| csf[1] = csf[2]; | |
| csfp1[1] = csfp1[2]; | |
| ct_f[1] = ct_f[2]; | |
| ct_o[1] = ct_o[2]; | |
| ct_v[1] = ct_v[2]; | |
| cm[2] = tmp_cm; | |
| csf[2] = tmp_csf; | |
| csfp1[2] = tmp_csfp1; | |
| ct_f[2] = tmp_ct_f; | |
| ct_o[2] = tmp_ct_o; | |
| ct_v[2] = tmp_ct_v; | |
| } | |
| if (plc == 2 || plc == 5) { | |
| int tmp_cm = cm[0]; | |
| int tmp_csf = csf[0]; | |
| int tmp_csfp1 = csfp1[0]; | |
| double tmp_ct_f = ct_f[0]; | |
| int tmp_ct_o = ct_o[0]; | |
| int tmp_ct_v = ct_v[0]; | |
| cm[0] = cm[2]; | |
| csf[0] = csf[2]; | |
| csfp1[0] = csfp1[2]; | |
| ct_f[0] = ct_f[2]; | |
| ct_o[0] = ct_o[2]; | |
| ct_v[0] = ct_v[2]; | |
| cm[2] = tmp_cm; | |
| csf[2] = tmp_csf; | |
| csfp1[2] = tmp_csfp1; | |
| ct_f[2] = tmp_ct_f; | |
| ct_o[2] = tmp_ct_o; | |
| ct_v[2] = tmp_ct_v; | |
| } | |
| plc = (plc + 1) % PLC_NB; | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// increase render size | |
| if (sdl_event.key.keysym.sym == SDLK_PAGEUP && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_location(1, 4.0 / (Rr_up - Rr_lo), 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up), Rw / Rw_f, Rh / Rh_f); | |
| } | |
| //// decrease render size | |
| if (sdl_event.key.keysym.sym == SDLK_PAGEDOWN && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| if ((RWow > 0) || (RWoh > 0) || (Rw > Ww) || (Rh > Wh)) { | |
| load_location(1, 4.0 / (Rr_up - Rr_lo), 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up), Rw * Rw_f, Rh * Rh_f); | |
| } | |
| } | |
| //// pan window left in render, 10% of window | |
| if (sdl_event.key.keysym.sym == SDLK_LEFT && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| RWow -= Ww * 0.1; | |
| if (RWow < 0) { | |
| RWow = 0; | |
| } | |
| Wi_lo = Ri_lo + RWow / Rwdivi; | |
| Wi_up = Wi_lo + Ww / Rwdivi; | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// pan window left in render, 1% of window | |
| if (sdl_event.key.keysym.sym == SDLK_LEFT && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| RWow -= Ww * 0.01; | |
| if (RWow < 0) { | |
| RWow = 0; | |
| } | |
| Wi_lo = Ri_lo + RWow / Rwdivi; | |
| Wi_up = Wi_lo + Ww / Rwdivi; | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// pan window right in render, 10% of window | |
| if (sdl_event.key.keysym.sym == SDLK_RIGHT && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| RWow += Ww * 0.1; | |
| if (RWow + Ww > Rw) { | |
| RWow = Rw - Ww; | |
| } | |
| Wi_lo = Ri_lo + RWow / Rwdivi; | |
| Wi_up = Wi_lo + Ww / Rwdivi; | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// pan window right in render, 1% of window | |
| if (sdl_event.key.keysym.sym == SDLK_RIGHT && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| RWow += Ww * 0.01; | |
| if (RWow + Ww > Rw) { | |
| RWow = Rw - Ww; | |
| } | |
| Wi_lo = Ri_lo + RWow / Rwdivi; | |
| Wi_up = Wi_lo + Ww / Rwdivi; | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// pan window up in render, 10% of window | |
| if (sdl_event.key.keysym.sym == SDLK_UP && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| RWoh -= Wh * 0.1; | |
| if (RWoh < 0) { | |
| RWoh = 0; | |
| } | |
| Wr_lo = Rr_lo + RWoh / Rhdivr; | |
| Wr_up = Wr_lo + Wh / Rhdivr; | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// pan window up in render, 1% of window | |
| if (sdl_event.key.keysym.sym == SDLK_UP && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| RWoh -= Wh * 0.01; | |
| if (RWoh < 0) { | |
| RWoh = 0; | |
| } | |
| Wr_lo = Rr_lo + RWoh / Rhdivr; | |
| Wr_up = Wr_lo + Wh / Rhdivr; | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// pan window down in render, 10% of window | |
| if (sdl_event.key.keysym.sym == SDLK_DOWN && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| RWoh += Wh * 0.1; | |
| if (RWoh + Wh > Rh) { | |
| RWoh = Rh - Wh; | |
| } | |
| Wr_lo = Rr_lo + RWoh / Rhdivr; | |
| Wr_up = Wr_lo + Wh / Rhdivr; | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// pan window down in render, 1% of window | |
| if (sdl_event.key.keysym.sym == SDLK_DOWN && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| RWoh += Wh * 0.01; | |
| if (RWoh + Wh > Rh) { | |
| RWoh = Rh - Wh; | |
| } | |
| Wr_lo = Rr_lo + RWoh / Rhdivr; | |
| Wr_up = Wr_lo + Wh / Rhdivr; | |
| recalc_WH_if_paused = 1; | |
| } | |
| //// zoom in fractal | |
| if (sdl_event.key.keysym.sym == SDLK_PAGEUP && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_location(1, 4.0 / (Rr_up - Rr_lo) / Rr_f, 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up), Rw, Rh); | |
| } | |
| //// zoom out fractal | |
| if (sdl_event.key.keysym.sym == SDLK_PAGEDOWN && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_location(1, 4.0 / (Rr_up - Rr_lo) * Rr_f, 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up), Rw, Rh); | |
| } | |
| //// pan fractal location left, 10% of render size | |
| if (sdl_event.key.keysym.sym == SDLK_LEFT && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_location(1, 4.0 / (Rr_up - Rr_lo), 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up) - Ri_ra * 0.1, Rw, Rh); | |
| } | |
| //// pan fractal location left, 1% of render size | |
| if (sdl_event.key.keysym.sym == SDLK_LEFT && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_location(1, 4.0 / (Rr_up - Rr_lo), 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up) - Ri_ra * 0.01, Rw, Rh); | |
| } | |
| //// pan fractal location right, 10% of render size | |
| if (sdl_event.key.keysym.sym == SDLK_RIGHT && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_location(1, 4.0 / (Rr_up - Rr_lo), 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up) + Ri_ra * 0.1, Rw, Rh); | |
| } | |
| //// pan fractal location right, 1% of render size | |
| if (sdl_event.key.keysym.sym == SDLK_RIGHT && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_location(1, 4.0 / (Rr_up - Rr_lo), 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up) + Ri_ra * 0.01, Rw, Rh); | |
| } | |
| //// pan fractal location up, 10% of render size | |
| if (sdl_event.key.keysym.sym == SDLK_UP && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_location(1, 4.0 / (Rr_up - Rr_lo), 0.5 * (Rr_lo + Rr_up) - Rr_ra * 0.1, 0.5 * (Ri_lo + Ri_up), Rw, Rh); | |
| } | |
| //// pan fractal location up, 1% of render size | |
| if (sdl_event.key.keysym.sym == SDLK_UP && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_location(1, 4.0 / (Rr_up - Rr_lo), 0.5 * (Rr_lo + Rr_up) - Rr_ra * 0.01, 0.5 * (Ri_lo + Ri_up), Rw, Rh); | |
| } | |
| //// pan fractal location down, 10% of render size | |
| if (sdl_event.key.keysym.sym == SDLK_DOWN && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_location(1, 4.0 / (Rr_up - Rr_lo), 0.5 * (Rr_lo + Rr_up) + Rr_ra * 0.1, 0.5 * (Ri_lo + Ri_up), Rw, Rh); | |
| } | |
| //// pan fractal location down, 1% of render size | |
| if (sdl_event.key.keysym.sym == SDLK_DOWN && (sdl_event.key.keysym.mod & KMOD_SHIFT) && (sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| load_location(1, 4.0 / (Rr_up - Rr_lo), 0.5 * (Rr_lo + Rr_up) + Rr_ra * 0.01, 0.5 * (Ri_lo + Ri_up), Rw, Rh); | |
| } | |
| //// write window to one png | |
| if (sdl_event.key.keysym.sym == SDLK_BACKSPACE && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| if (lr_mode == 0) { | |
| sprintf(filename, "lm%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i W(%.6f %.6f %.1f) ct%i%i%i cm%i%i.%i.%i.%i %g.png", lr_mode, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0], bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1], bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2], 0.5 * (Wr_lo + Wr_up), 0.5 * (Wi_lo + Wi_up), 4.0 / (Wr_up - Wr_lo), ct_type[0], ct_type[1], ct_type[2], cm[0], csf[0], csfp1[0], (int)(10.0 * (ct_f[0] - 1.0)), ct_o[0], (double)Ppsum); | |
| } | |
| if (lr_mode == 1) { | |
| sprintf(filename, "lm%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i W(%.6f %.6f %.1f) ct%i%i%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i %g.png", lr_mode, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0], bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1], bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2], 0.5 * (Wr_lo + Wr_up), 0.5 * (Wi_lo + Wi_up), 4.0 / (Wr_up - Wr_lo), ct_type[0], ct_type[1], ct_type[2], cm[0], csf[0], csfp1[0], (int)(10.0 * (ct_f[0] - 1.0)), ct_o[0], cm[1], csf[1], csfp1[1], (int)(10.0 * (ct_f[1] - 1.0)), ct_o[1], cm[2], csf[2], csfp1[2], (int)(10.0 * (ct_f[2] - 1.0)), ct_o[2], (double)Ppsum); | |
| } | |
| if (lr_mode == 2) { | |
| sprintf(filename, "lm%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i W(%.6f %.6f %.1f) ct%i%i%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i %g.png", lr_mode, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0], bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1], bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2], 0.5 * (Wr_lo + Wr_up), 0.5 * (Wi_lo + Wi_up), 4.0 / (Wr_up - Wr_lo), ct_type[0], ct_type[1], ct_type[2], cm[0], csf[0], csfp1[0], (int)(10.0 * (ct_f[0] - 1.0)), ct_o[0], cm[1], csf[1], csfp1[1], (int)(10.0 * (ct_f[1] - 1.0)), ct_o[1], cm[2], csf[2], csfp1[2], (int)(10.0 * (ct_f[2] - 1.0)), ct_o[2], (double)Ppsum); | |
| } | |
| writeTtoPNG(filename, RWow, RWoh, Ww, Wh); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_BACKSPACE && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| autoWtoPNG = (autoWtoPNG + 1) % AUTOWRITE_MODE_NB; | |
| } | |
| //// write tiled render to multiple pngs | |
| if (sdl_event.key.keysym.sym == SDLK_BACKSLASH && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| if (lr_mode == 0) { | |
| sprintf(dirname, "lm%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i R(%.6f %.6f %.1f) ct%i%i%i cm%i%i.%i.%i.%i %g", lr_mode, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0], bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1], bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2], 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up), 4.0 / (Rr_up - Rr_lo), ct_type[0], ct_type[1], ct_type[2], cm[0], csf[0], csfp1[0], (int)(10.0 * (ct_f[0] - 1.0)), ct_o[0], (double)Ppsum); | |
| } | |
| if (lr_mode == 1) { | |
| sprintf(dirname, "lm%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i R(%.6f %.6f %.1f) ct%i%i%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i %g", lr_mode, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0], bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1], bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2], 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up), 4.0 / (Rr_up - Rr_lo), ct_type[0], ct_type[1], ct_type[2], cm[0], csf[0], csfp1[0], (int)(10.0 * (ct_f[0] - 1.0)), ct_o[0], cm[1], csf[1], csfp1[1], (int)(10.0 * (ct_f[1] - 1.0)), ct_o[1], cm[2], csf[2], csfp1[2], (int)(10.0 * (ct_f[2] - 1.0)), ct_o[2], (double)Ppsum); | |
| } | |
| if (lr_mode == 2) { | |
| sprintf(dirname, "lm%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i R(%.6f %.6f %.1f) ct%i%i%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i %g", lr_mode, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0], bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1], bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2], 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up), 4.0 / (Rr_up - Rr_lo), ct_type[0], ct_type[1], ct_type[2], cm[0], csf[0], csfp1[0], (int)(10.0 * (ct_f[0] - 1.0)), ct_o[0], cm[1], csf[1], csfp1[1], (int)(10.0 * (ct_f[1] - 1.0)), ct_o[1], cm[2], csf[2], csfp1[2], (int)(10.0 * (ct_f[2] - 1.0)), ct_o[2], (double)Ppsum); | |
| } | |
| sprintf(commandname, "mkdir \"%s\"", dirname); | |
| system(commandname); | |
| for (int png_offset_x = 0; png_offset_x < Rw; png_offset_x += Tw) { | |
| for (int png_offset_y = 0; png_offset_y < Rh; png_offset_y += Th) { | |
| double Tr_lo = Rr_lo + png_offset_y / Rhdivr; | |
| double Tr_up = Tr_lo + Th / Rhdivr; | |
| double Ti_lo = Ri_lo + png_offset_x / Rwdivi; | |
| double Ti_up = Ti_lo + Tw / Rwdivi; | |
| sprintf(filename, "%s/T%ix%i %05i %05i W(%.6f %.6f %.1f).png", dirname, Tw, Th, png_offset_y, png_offset_x, 0.5 * (Tr_lo + Tr_up), 0.5 * (Ti_lo + Ti_up), 4.0 / (Tr_up - Tr_lo)); | |
| writeTtoPNG(filename, png_offset_x, png_offset_y, Tw, Th); | |
| } | |
| } | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_BACKSLASH && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| autoRTtoPNG = (autoRTtoPNG + 1) % AUTOWRITE_MODE_NB; | |
| } | |
| //// write render to one png | |
| if (sdl_event.key.keysym.sym == SDLK_RETURN && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| if (lr_mode == 0) { | |
| sprintf(filename, "lm%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i R(%.6f %.6f %.1f) ct%i%i%i cm%i%i.%i.%i.%i R%ix%i %g.png", lr_mode, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0], bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1], bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2], 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up), 4.0 / (Rr_up - Rr_lo), ct_type[0], ct_type[1], ct_type[2], cm[0], csf[0], csfp1[0], (int)(10.0 * (ct_f[0] - 1.0)), ct_o[0], Rw, Rh, (double)Ppsum); | |
| } | |
| if (lr_mode == 1) { | |
| sprintf(filename, "lm%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i R(%.6f %.6f %.1f) ct%i%i%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i R%ix%i %g.png", lr_mode, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0], bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1], bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2], 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up), 4.0 / (Rr_up - Rr_lo), ct_type[0], ct_type[1], ct_type[2], cm[0], csf[0], csfp1[0], (int)(10.0 * (ct_f[0] - 1.0)), ct_o[0], cm[1], csf[1], csfp1[1], (int)(10.0 * (ct_f[1] - 1.0)), ct_o[1], cm[2], csf[2], csfp1[2], (int)(10.0 * (ct_f[2] - 1.0)), ct_o[2], Rw, Rh, (double)Ppsum); | |
| } | |
| if (lr_mode == 2) { | |
| sprintf(filename, "lm%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i R(%.6f %.6f %.1f) ct%i%i%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i R%ix%i %g.png", lr_mode, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0], bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1], bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2], 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up), 4.0 / (Rr_up - Rr_lo), ct_type[0], ct_type[1], ct_type[2], cm[0], csf[0], csfp1[0], (int)(10.0 * (ct_f[0] - 1.0)), ct_o[0], cm[1], csf[1], csfp1[1], (int)(10.0 * (ct_f[1] - 1.0)), ct_o[1], cm[2], csf[2], csfp1[2], (int)(10.0 * (ct_f[2] - 1.0)), ct_o[2], Rw, Rh, (double)Ppsum); | |
| } | |
| writeRtoPNG(filename); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_RETURN && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| autoRtoPNG = (autoRtoPNG + 1) % AUTOWRITE_MODE_NB; | |
| } | |
| //// change t_autoPNG_delta | |
| if (sdl_event.key.keysym.sym == SDLK_MINUS && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| t_autoPNG_delta = MAX(t_autoPNG_delta / 10, 6e4); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_EQUALS && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| t_autoPNG_delta = MIN(t_autoPNG_delta * 10, 6e7); | |
| } | |
| //// change Ppsum_autoPNG_delta | |
| if (sdl_event.key.keysym.sym == SDLK_LEFTBRACKET && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| Ppsum_autoPNG_delta = MAX(Ppsum_autoPNG_delta / 10, 1e4); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_RIGHTBRACKET && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| Ppsum_autoPNG_delta = Ppsum_autoPNG_delta * 10; | |
| } | |
| //// change tile size | |
| if (sdl_event.key.keysym.sym == SDLK_SEMICOLON && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| Tw = MIN(Tw / Rw_f, Rw); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_SEMICOLON && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| Tw = MAX(Tw * Rw_f, 1000); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_QUOTE && !(sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| Th = MIN(Th / Rh_f, Rh); | |
| } | |
| if (sdl_event.key.keysym.sym == SDLK_QUOTE && (sdl_event.key.keysym.mod & KMOD_SHIFT) && !(sdl_event.key.keysym.mod & KMOD_CTRL)) { | |
| Th = MAX(Th * Rh_f, 1000); | |
| } | |
| } | |
| } | |
| void visualisation_thread() | |
| { | |
| printf("thread v start\n"); | |
| if (SDL_Init(SDL_INIT_VIDEO) != 0) { | |
| td_stop = 1; | |
| #pragma omp flush(td_stop) | |
| } else { | |
| sdl_window = SDL_CreateWindow("BuddhaBrot-MT", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, Ww, Wh, 0); | |
| sdl_renderer = SDL_CreateRenderer(sdl_window, -1, SDL_RENDERER_ACCELERATED); | |
| sdl_surface = SDL_CreateRGBSurface(0, Ww, Wh, 32, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff); | |
| sdl_texture = SDL_CreateTexture(sdl_renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STREAMING, Ww, Wh); | |
| dsfmt_gv_init_gen_rand(0); | |
| while (1) { | |
| #pragma omp flush(td_stop) | |
| if (td_stop == 1) { | |
| sprintf(titlebar, "BuddhaBrot-MT: exiting: closing down %i calculation threads...", td_nb); | |
| reponsive_caption_update(titlebar); | |
| break; | |
| } | |
| Ppsum = 0; | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| Ppsum += Pp[td_i]; | |
| } | |
| wait_ms(MAX(1000.0 / fps - (SDL_GetTicks() - t_last_frame), 0)); | |
| t_last_frame = SDL_GetTicks(); | |
| while (SDL_PollEvent(&sdl_event)) { | |
| sdl_message_check(); | |
| } | |
| if ((autoWtoPNG == 1 && (SDL_GetTicks() > t_autoPNG_last + t_autoPNG_delta)) || (autoWtoPNG == 2 && (Ppsum > Ppsum_autoPNG_last + Ppsum_autoPNG_delta))) { | |
| if (lr_mode == 0) { | |
| sprintf(filename, "lm%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i W(%.6f %.6f %.1f) ct%i%i%i cm%i%i.%i.%i.%i %g.png", lr_mode, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0], bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1], bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2], 0.5 * (Wr_lo + Wr_up), 0.5 * (Wi_lo + Wi_up), 4.0 / (Wr_up - Wr_lo), ct_type[0], ct_type[1], ct_type[2], cm[0], csf[0], csfp1[0], (int)(10.0 * (ct_f[0] - 1.0)), ct_o[0], (double)Ppsum); | |
| } | |
| if (lr_mode == 1) { | |
| sprintf(filename, "lm%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i W(%.6f %.6f %.1f) ct%i%i%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i %g.png", lr_mode, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0], bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1], bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2], 0.5 * (Wr_lo + Wr_up), 0.5 * (Wi_lo + Wi_up), 4.0 / (Wr_up - Wr_lo), ct_type[0], ct_type[1], ct_type[2], cm[0], csf[0], csfp1[0], (int)(10.0 * (ct_f[0] - 1.0)), ct_o[0], cm[1], csf[1], csfp1[1], (int)(10.0 * (ct_f[1] - 1.0)), ct_o[1], cm[2], csf[2], csfp1[2], (int)(10.0 * (ct_f[2] - 1.0)), ct_o[2], (double)Ppsum); | |
| } | |
| if (lr_mode == 2) { | |
| sprintf(filename, "lm%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i W(%.6f %.6f %.1f) ct%i%i%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i %g.png", lr_mode, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0], bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1], bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2], 0.5 * (Wr_lo + Wr_up), 0.5 * (Wi_lo + Wi_up), 4.0 / (Wr_up - Wr_lo), ct_type[0], ct_type[1], ct_type[2], cm[0], csf[0], csfp1[0], (int)(10.0 * (ct_f[0] - 1.0)), ct_o[0], cm[1], csf[1], csfp1[1], (int)(10.0 * (ct_f[1] - 1.0)), ct_o[1], cm[2], csf[2], csfp1[2], (int)(10.0 * (ct_f[2] - 1.0)), ct_o[2], (double)Ppsum); | |
| } | |
| writeTtoPNG(filename, RWow, RWoh, Ww, Wh); | |
| } | |
| if ((autoRTtoPNG == 1 && (SDL_GetTicks() > t_autoPNG_last + t_autoPNG_delta)) || (autoRTtoPNG == 2 && (Ppsum > Ppsum_autoPNG_last + Ppsum_autoPNG_delta))) { | |
| if (lr_mode == 0) { | |
| sprintf(dirname, "lm%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i R(%.6f %.6f %.1f) ct%i%i%i cm%i%i.%i.%i.%i %g", lr_mode, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0], bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1], bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2], 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up), 4.0 / (Rr_up - Rr_lo), ct_type[0], ct_type[1], ct_type[2], cm[0], csf[0], csfp1[0], (int)(10.0 * (ct_f[0] - 1.0)), ct_o[0], (double)Ppsum); | |
| } | |
| if (lr_mode == 1) { | |
| sprintf(dirname, "lm%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i R(%.6f %.6f %.1f) ct%i%i%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i %g", lr_mode, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0], bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1], bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2], 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up), 4.0 / (Rr_up - Rr_lo), ct_type[0], ct_type[1], ct_type[2], cm[0], csf[0], csfp1[0], (int)(10.0 * (ct_f[0] - 1.0)), ct_o[0], cm[1], csf[1], csfp1[1], (int)(10.0 * (ct_f[1] - 1.0)), ct_o[1], cm[2], csf[2], csfp1[2], (int)(10.0 * (ct_f[2] - 1.0)), ct_o[2], (double)Ppsum); | |
| } | |
| if (lr_mode == 2) { | |
| sprintf(dirname, "lm%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i R(%.6f %.6f %.1f) ct%i%i%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i %g", lr_mode, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0], bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1], bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2], 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up), 4.0 / (Rr_up - Rr_lo), ct_type[0], ct_type[1], ct_type[2], cm[0], csf[0], csfp1[0], (int)(10.0 * (ct_f[0] - 1.0)), ct_o[0], cm[1], csf[1], csfp1[1], (int)(10.0 * (ct_f[1] - 1.0)), ct_o[1], cm[2], csf[2], csfp1[2], (int)(10.0 * (ct_f[2] - 1.0)), ct_o[2], (double)Ppsum); | |
| } | |
| sprintf(commandname, "mkdir \"%s\"", dirname); | |
| system(commandname); | |
| for (int png_offset_x = 0; png_offset_x < Rw; png_offset_x += Tw) { | |
| for (int png_offset_y = 0; png_offset_y < Rh; png_offset_y += Th) { | |
| double Tr_lo = Rr_lo + png_offset_y / Rhdivr; | |
| double Tr_up = Tr_lo + Th / Rhdivr; | |
| double Ti_lo = Ri_lo + png_offset_x / Rwdivi; | |
| double Ti_up = Ti_lo + Tw / Rwdivi; | |
| sprintf(filename, "%s/T%ix%i %05i %05i W(%.6f %.6f %.1f).png", dirname, Tw, Th, png_offset_y, png_offset_x, 0.5 * (Tr_lo + Tr_up), 0.5 * (Ti_lo + Ti_up), 4.0 / (Tr_up - Tr_lo)); | |
| writeTtoPNG(filename, png_offset_x, png_offset_y, Tw, Th); | |
| } | |
| } | |
| } | |
| if ((autoRtoPNG == 1 && (SDL_GetTicks() > t_autoPNG_last + t_autoPNG_delta)) || (autoRtoPNG == 2 && (Ppsum > Ppsum_autoPNG_last + Ppsum_autoPNG_delta))) { | |
| if (lr_mode == 0) { | |
| sprintf(filename, "lm%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i R(%.6f %.6f %.1f) ct%i%i%i cm%i%i.%i.%i.%i R%ix%i %g.png", lr_mode, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0], bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1], bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2], 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up), 4.0 / (Rr_up - Rr_lo), ct_type[0], ct_type[1], ct_type[2], cm[0], csf[0], csfp1[0], (int)(10.0 * (ct_f[0] - 1.0)), ct_o[0], Rw, Rh, (double)Ppsum); | |
| } | |
| if (lr_mode == 1) { | |
| sprintf(filename, "lm%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i R(%.6f %.6f %.1f) ct%i%i%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i R%ix%i %g.png", lr_mode, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0], bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1], bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2], 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up), 4.0 / (Rr_up - Rr_lo), ct_type[0], ct_type[1], ct_type[2], cm[0], csf[0], csfp1[0], (int)(10.0 * (ct_f[0] - 1.0)), ct_o[0], cm[1], csf[1], csfp1[1], (int)(10.0 * (ct_f[1] - 1.0)), ct_o[1], cm[2], csf[2], csfp1[2], (int)(10.0 * (ct_f[2] - 1.0)), ct_o[2], Rw, Rh, (double)Ppsum); | |
| } | |
| if (lr_mode == 2) { | |
| sprintf(filename, "lm%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i R(%.6f %.6f %.1f) ct%i%i%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i R%ix%i %g.png", lr_mode, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0], bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1], bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2], 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up), 4.0 / (Rr_up - Rr_lo), ct_type[0], ct_type[1], ct_type[2], cm[0], csf[0], csfp1[0], (int)(10.0 * (ct_f[0] - 1.0)), ct_o[0], cm[1], csf[1], csfp1[1], (int)(10.0 * (ct_f[1] - 1.0)), ct_o[1], cm[2], csf[2], csfp1[2], (int)(10.0 * (ct_f[2] - 1.0)), ct_o[2], Rw, Rh, (double)Ppsum); | |
| } | |
| writeRtoPNG(filename); | |
| } | |
| if ((autoWtoPNG == 1 || autoRTtoPNG == 1 || autoRtoPNG == 1) && (SDL_GetTicks() > t_autoPNG_last + t_autoPNG_delta)) { | |
| t_autoPNG_last = (SDL_GetTicks() / t_autoPNG_delta) * t_autoPNG_delta; | |
| } | |
| if ((autoWtoPNG == 2 || autoRTtoPNG == 2 || autoRtoPNG == 2) && (Ppsum > Ppsum_autoPNG_last + Ppsum_autoPNG_delta)) { | |
| Ppsum_autoPNG_last = (Ppsum / Ppsum_autoPNG_delta) * Ppsum_autoPNG_delta; | |
| } | |
| #pragma omp flush(td_pause) | |
| if (td_pause == 0 || recalc_WH_if_paused == 1) { | |
| if (lr_mode == 0) { | |
| Rlrmax[0] = 0; | |
| for (int Wy = 0, Ry = RWoh; Wy < Wh; Wy++, Ry++) { | |
| for (int Wx = 0, Rx = RWow; Wx < Ww; Wx++, Rx++) { | |
| unsigned int Ri = (unsigned int)Ry * Rw + Rx; | |
| unsigned int sum = 0; | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| sum += R[td_i][Ri]; | |
| } | |
| if (csf[0] == 1) { | |
| if (sum >= (unsigned int)csfp1[0]) { | |
| sum = csfp1[0] + (unsigned int) log((double)(sum - csfp1[0] + 1)); | |
| } | |
| } | |
| if (sum > Rlrmax[0]) { | |
| Rlrmax[0] = sum; | |
| } | |
| W[0][Wy * Ww + Wx] = sum; | |
| } | |
| } | |
| if (Rlrmax[0] >= Hl[0]) { | |
| if (H[0] != NULL) { | |
| free(H[0]); | |
| H[0] = NULL; | |
| } | |
| Hl[0] = MAX(Rlrmax[0] + 1, 2 * Hl[0]); | |
| H[0] = (unsigned int*)calloc(Hl[0], sizeof(unsigned int)); | |
| } else { | |
| memset(H[0], 0, Hl[0] * sizeof(unsigned int)); | |
| } | |
| Rlrmax[1] = 0; | |
| Rlrmax[2] = 0; | |
| Hl[1] = 0; | |
| Hl[2] = 0; | |
| if (H[1] != NULL) { | |
| free(H[1]); | |
| H[1] = NULL; | |
| } | |
| if (H[2] != NULL) { | |
| free(H[2]); | |
| H[2] = NULL; | |
| } | |
| for (int Wy = 0; Wy < Wh; Wy++) { | |
| for (int Wx = 0; Wx < Ww; Wx++) { | |
| H[0][W[0][Wy * Ww + Wx]]++; | |
| } | |
| } | |
| if (cm[0] == 0) { | |
| cm0n[0] = 0; | |
| for (unsigned int i = 0; i <= Rlrmax[0]; i++) { | |
| if (H[0][i] > 0) { | |
| H[0][i] = cm0n[0]++; | |
| } | |
| } | |
| } | |
| if (cm[0] == 1) { | |
| cm1n[0] = Ww * Wh - H[0][0]; | |
| H[0][0] = 0; | |
| for (unsigned int i = 2; i <= Rlrmax[0]; i++) { | |
| H[0][i] += H[0][i - 1]; | |
| } | |
| } | |
| } | |
| if (lr_mode == 1) { | |
| for (int layer_iter = 0; layer_iter < LR_NB; layer_iter++) { | |
| Rlrmax[layer_iter] = 0; | |
| for (int Wy = 0, Ry = RWoh; Wy < Wh; Wy++, Ry++) { | |
| for (int Wx = 0, Rx = RWow; Wx < Ww; Wx++, Rx++) { | |
| unsigned int Ri = (unsigned int)Ry * Rw + Rx; | |
| unsigned int sum = 0; | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| sum += R[td_i][Ri]; | |
| } | |
| if (csf[layer_iter] == 1) { | |
| if (sum >= (unsigned int)csfp1[layer_iter]) { | |
| sum = csfp1[layer_iter] + (unsigned int) log((double)(sum - csfp1[layer_iter] + 1)); | |
| } | |
| } | |
| if (sum > Rlrmax[layer_iter]) { | |
| Rlrmax[layer_iter] = sum; | |
| } | |
| W[layer_iter][Wy * Ww + Wx] = sum; | |
| } | |
| } | |
| if (Rlrmax[layer_iter] >= Hl[layer_iter]) { | |
| if (H[layer_iter] != NULL) { | |
| free(H[layer_iter]); | |
| H[layer_iter] = NULL; | |
| } | |
| Hl[layer_iter] = MAX(Rlrmax[layer_iter] + 1, 2 * Hl[layer_iter]); | |
| H[layer_iter] = (unsigned int*)calloc(Hl[layer_iter], sizeof(unsigned int)); | |
| } else { | |
| memset(H[layer_iter], 0, Hl[layer_iter] * sizeof(unsigned int)); | |
| } | |
| for (int Wy = 0; Wy < Wh; Wy++) { | |
| for (int Wx = 0; Wx < Ww; Wx++) { | |
| H[layer_iter][W[layer_iter][Wy * Ww + Wx]]++; | |
| } | |
| } | |
| if (cm[layer_iter] == 0) { | |
| cm0n[layer_iter] = 0; | |
| for (unsigned int i = 0; i <= Rlrmax[layer_iter]; i++) { | |
| if (H[layer_iter][i] > 0) { | |
| H[layer_iter][i] = cm0n[layer_iter]++; | |
| } | |
| } | |
| } | |
| if (cm[layer_iter] == 1) { | |
| cm1n[layer_iter] = Ww * Wh - H[layer_iter][0]; | |
| H[layer_iter][0] = 0; | |
| for (unsigned int i = 2; i <= Rlrmax[layer_iter]; i++) { | |
| H[layer_iter][i] += H[layer_iter][i - 1]; | |
| } | |
| } | |
| } | |
| } | |
| if (lr_mode == 2) { | |
| for (int layer_iter = 0; layer_iter < LR_NB; layer_iter++) { | |
| Rlrmax[layer_iter] = 0; | |
| for (int Wy = 0, Ry = RWoh; Wy < Wh; Wy++, Ry++) { | |
| for (int Wx = 0, Rx = RWow; Wx < Ww; Wx++, Rx++) { | |
| unsigned int Ri = (unsigned int)Ry * Rw + Rx; | |
| unsigned int sum = 0; | |
| for (int td_i = layer_iter; td_i < td_nb; td_i += LR_NB) { | |
| sum += R[td_i][Ri]; | |
| } | |
| if (csf[layer_iter] == 1) { | |
| if (sum >= (unsigned int)csfp1[layer_iter]) { | |
| sum = csfp1[layer_iter] + (unsigned int) log((double)(sum - csfp1[layer_iter] + 1)); | |
| } | |
| } | |
| if (sum > Rlrmax[layer_iter]) { | |
| Rlrmax[layer_iter] = sum; | |
| } | |
| W[layer_iter][Wy * Ww + Wx] = sum; | |
| } | |
| } | |
| if (Rlrmax[layer_iter] >= Hl[layer_iter]) { | |
| if (H[layer_iter] != NULL) { | |
| free(H[layer_iter]); | |
| H[layer_iter] = NULL; | |
| } | |
| Hl[layer_iter] = MAX(Rlrmax[layer_iter] + 1, 2 * Hl[layer_iter]); | |
| H[layer_iter] = (unsigned int*)calloc(Hl[layer_iter], sizeof(unsigned int)); | |
| } else { | |
| memset(H[layer_iter], 0, Hl[layer_iter] * sizeof(unsigned int)); | |
| } | |
| for (int Wy = 0; Wy < Wh; Wy++) { | |
| for (int Wx = 0; Wx < Ww; Wx++) { | |
| H[layer_iter][W[layer_iter][Wy * Ww + Wx]]++; | |
| } | |
| } | |
| if (cm[layer_iter] == 0) { | |
| cm0n[layer_iter] = 0; | |
| for (unsigned int i = 0; i <= Rlrmax[layer_iter]; i++) { | |
| if (H[layer_iter][i] > 0) { | |
| H[layer_iter][i] = cm0n[layer_iter]++; | |
| } | |
| } | |
| } | |
| if (cm[layer_iter] == 1) { | |
| cm1n[layer_iter] = Ww * Wh - H[layer_iter][0]; | |
| H[layer_iter][0] = 0; | |
| for (unsigned int i = 2; i <= Rlrmax[layer_iter]; i++) { | |
| H[layer_iter][i] += H[layer_iter][i - 1]; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| Uint32* pixel_p; | |
| if (lr_mode == 0) { | |
| ct_o[0] = ct_cycle(ct_o[0] + ct_v[0], CTe[0]); | |
| if (cm[0] == 0) { | |
| for (int Wy = 0; Wy < Wh; Wy++) { | |
| for (int Wx = 0; Wx < Ww; Wx++) { | |
| int ct_i = 0; | |
| if (cm0n[0] > 1) { | |
| ct_i = MIN(CTe[0], ct_f[0] * CTe[0] * ((double)H[0][W[0][Wy * Ww + Wx]] / (cm0n[0] - 1))); | |
| } | |
| ct_i = ct_cycle(ct_i + ct_o[0], CTe[0]); | |
| pixel_p = (Uint32*)sdl_surface->pixels + Wy * Ww + Wx; | |
| *pixel_p = SDL_MapRGBA(sdl_surface->format, CT[0][ct_i], CT[0][ct_i], CT[0][ct_i], SDL_ALPHA_OPAQUE); | |
| } | |
| } | |
| } | |
| if (cm[0] == 1) { | |
| for (int Wy = 0; Wy < Wh; Wy++) { | |
| for (int Wx = 0; Wx < Ww; Wx++) { | |
| int ct_i = 0; | |
| if (cm1n[0] > 0) { | |
| ct_i = MIN(CTe[0], ct_f[0] * CTe[0] * ((double)H[0][W[0][Wy * Ww + Wx]] / cm1n[0])); | |
| } | |
| ct_i = ct_cycle(ct_i + ct_o[0], CTe[0]); | |
| pixel_p = (Uint32*)sdl_surface->pixels + Wy * Ww + Wx; | |
| *pixel_p = SDL_MapRGBA(sdl_surface->format, CT[0][ct_i], CT[0][ct_i], CT[0][ct_i], SDL_ALPHA_OPAQUE); | |
| } | |
| } | |
| } | |
| if (cm[0] == 2) { | |
| for (int Wy = 0; Wy < Wh; Wy++) { | |
| for (int Wx = 0; Wx < Ww; Wx++) { | |
| int ct_i = 0; | |
| if (Rlrmax[0] > 0) { | |
| ct_i = MIN(CTe[0], ct_f[0] * CTe[0] * ((double)W[0][Wy * Ww + Wx] / Rlrmax[0])); | |
| } | |
| ct_i = ct_cycle(ct_i + ct_o[0], CTe[0]); | |
| pixel_p = (Uint32*)sdl_surface->pixels + Wy * Ww + Wx; | |
| *pixel_p = SDL_MapRGBA(sdl_surface->format, CT[0][ct_i], CT[0][ct_i], CT[0][ct_i], SDL_ALPHA_OPAQUE); | |
| } | |
| } | |
| } | |
| } | |
| if (lr_mode == 1) { | |
| for (int layer_iter = 0; layer_iter < LR_NB; layer_iter++) { | |
| ct_o[layer_iter] = ct_cycle(ct_o[layer_iter] + ct_v[layer_iter], CTe[layer_iter]); | |
| } | |
| for (int Wy = 0; Wy < Wh; Wy++) { | |
| for (int Wx = 0; Wx < Ww; Wx++) { | |
| int ct_i[LR_NB] = {0}; | |
| for (int layer_iter = 0; layer_iter < LR_NB; layer_iter++) { | |
| if (cm[layer_iter] == 0) { | |
| if (cm0n[layer_iter] > 1) { | |
| ct_i[layer_iter] = MIN(CTe[layer_iter], ct_f[layer_iter] * CTe[layer_iter] * ((double)H[layer_iter][W[layer_iter][Wy * Ww + Wx]] / (cm0n[layer_iter] - 1))); | |
| } | |
| } | |
| if (cm[layer_iter] == 1) { | |
| if (cm1n[layer_iter] > 0) { | |
| ct_i[layer_iter] = MIN(CTe[layer_iter], ct_f[layer_iter] * CTe[layer_iter] * ((double)H[layer_iter][W[layer_iter][Wy * Ww + Wx]] / cm1n[layer_iter])); | |
| } | |
| } | |
| if (cm[layer_iter] == 2) { | |
| if (Rlrmax[layer_iter] > 0) { | |
| ct_i[layer_iter] = MIN(CTe[layer_iter], ct_f[layer_iter] * CTe[layer_iter] * ((double)W[layer_iter][Wy * Ww + Wx] / Rlrmax[layer_iter])); | |
| } | |
| } | |
| ct_i[layer_iter] = ct_cycle(ct_i[layer_iter] + ct_o[layer_iter], CTe[layer_iter]); | |
| } | |
| pixel_p = (Uint32*)sdl_surface->pixels + Wy * Ww + Wx; | |
| *pixel_p = SDL_MapRGBA(sdl_surface->format, CT[0][ct_i[0]], CT[1][ct_i[1]], CT[2][ct_i[2]], SDL_ALPHA_OPAQUE); | |
| } | |
| } | |
| } | |
| if (lr_mode == 2) { | |
| for (int layer_iter = 0; layer_iter < LR_NB; layer_iter++) { | |
| ct_o[layer_iter] = ct_cycle(ct_o[layer_iter] + ct_v[layer_iter], CTe[layer_iter]); | |
| } | |
| for (int Wy = 0; Wy < Wh; Wy++) { | |
| for (int Wx = 0; Wx < Ww; Wx++) { | |
| int ct_i[LR_NB] = {0}; | |
| for (int layer_iter = 0; layer_iter < LR_NB; layer_iter++) { | |
| if (cm[layer_iter] == 0) { | |
| if (cm0n[layer_iter] > 1) { | |
| ct_i[layer_iter] = MIN(CTe[layer_iter], ct_f[layer_iter] * CTe[layer_iter] * ((double)H[layer_iter][W[layer_iter][Wy * Ww + Wx]] / (cm0n[layer_iter] - 1))); | |
| } | |
| } | |
| if (cm[layer_iter] == 1) { | |
| if (cm1n[layer_iter] > 0) { | |
| ct_i[layer_iter] = MIN(CTe[layer_iter], ct_f[layer_iter] * CTe[layer_iter] * ((double)H[layer_iter][W[layer_iter][Wy * Ww + Wx]] / cm1n[layer_iter])); | |
| } | |
| } | |
| if (cm[layer_iter] == 2) { | |
| if (Rlrmax[layer_iter] > 0) { | |
| ct_i[layer_iter] = MIN(CTe[layer_iter], ct_f[layer_iter] * CTe[layer_iter] * ((double)W[layer_iter][Wy * Ww + Wx] / Rlrmax[layer_iter])); | |
| } | |
| } | |
| ct_i[layer_iter] = ct_cycle(ct_i[layer_iter] + ct_o[layer_iter], CTe[layer_iter]); | |
| } | |
| pixel_p = (Uint32*)sdl_surface->pixels + Wy * Ww + Wx; | |
| *pixel_p = SDL_MapRGBA(sdl_surface->format, CT[0][ct_i[0]], CT[1][ct_i[1]], CT[2][ct_i[2]], SDL_ALPHA_OPAQUE); | |
| } | |
| } | |
| } | |
| if (tbs == 0) { | |
| sprintf(titlebar, "lm%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i bb%i.%i.%i.%i.%i R(%.6f %.6f %.1f) W(%.6f %.6f %.1f) th%i %g", lr_mode, bb_type[0], bb_bail[0], bb_pps[0], bb_ppe[0], bb_minn[0], bb_type[1], bb_bail[1], bb_pps[1], bb_ppe[1], bb_minn[1], bb_type[2], bb_bail[2], bb_pps[2], bb_ppe[2], bb_minn[2], 0.5 * (Rr_lo + Rr_up), 0.5 * (Ri_lo + Ri_up), 4.0 / (Rr_up - Rr_lo), 0.5 * (Wr_lo + Wr_up), 0.5 * (Wi_lo + Wi_up), 4.0 / (Wr_up - Wr_lo), td_nb, (double)Ppsum); | |
| } | |
| if (tbs == 1) { | |
| sprintf(titlebar, "lm%i ct%i%i%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i cm%i%i.%i.%i.%i cte%i.%i.%i th%i %g", lr_mode, ct_type[0], ct_type[1], ct_type[2], cm[0], csf[0], csfp1[0], (int)(10.0 * (ct_f[0] - 1.0)), ct_o[0], cm[1], csf[1], csfp1[1], (int)(10.0 * (ct_f[1] - 1.0)), ct_o[1], cm[2], csf[2], csfp1[2], (int)(10.0 * (ct_f[2] - 1.0)), ct_o[2], CTe[0], CTe[1], CTe[2], td_nb, (double)Ppsum); | |
| } | |
| if (tbs == 2) { | |
| sprintf(titlebar, "lm%i R%ix%i T%ix%i autoPNG%i%i%i deltat%.0e deltaPp%.0e Rmax%g th%i %g", lr_mode, Rw, Rh, Tw, Th, autoWtoPNG, autoRTtoPNG, autoRtoPNG, (double)t_autoPNG_delta, (double)Ppsum_autoPNG_delta, (double)(Rlrmax[0] + Rlrmax[1] + Rlrmax[2]), td_nb, (double)Ppsum); | |
| } | |
| SDL_SetWindowTitle(sdl_window, titlebar); | |
| SDL_UpdateTexture(sdl_texture, NULL, sdl_surface->pixels, Ww * sizeof(Uint32)); | |
| SDL_RenderClear(sdl_renderer); | |
| SDL_RenderCopy(sdl_renderer, sdl_texture, NULL, NULL); | |
| SDL_RenderPresent(sdl_renderer); | |
| } | |
| SDL_DestroyTexture(sdl_texture); | |
| SDL_FreeSurface(sdl_surface); | |
| SDL_DestroyRenderer(sdl_renderer); | |
| SDL_DestroyWindow(sdl_window); | |
| SDL_Quit(); | |
| } | |
| printf("thread v end\n"); | |
| } | |
| int main(int argc, char* argv[]) | |
| { | |
| printf("main start\n"); | |
| #pragma omp parallel | |
| { | |
| td_vc_nb = omp_get_num_threads(); | |
| } | |
| if (argc >= 2) { | |
| td_nb = MIN(atoi(argv[1]), TD_MAX); | |
| } else { | |
| td_nb = MIN(ceil((double)td_vc_nb / 3) * 3, TD_MAX); | |
| } | |
| load_location_bb_color_param(0, 1.6, -0.4, 0.0, 1000, 1000, 0, 0, 1000, 0, 0, 0, 0, 1000, 0, 0, 0, 0, 1000, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1.0, 0, 0, 0, 5, 1.0, 0, 0, 0, 5, 1.0, 0); | |
| for (int layer_iter = 0; layer_iter < LR_NB; layer_iter++) { | |
| W[layer_iter] = (unsigned int*)calloc(Ww * Wh, sizeof(unsigned int)); | |
| H[layer_iter] = NULL; | |
| } | |
| #pragma omp parallel sections num_threads(TD_MAX + 1) | |
| { | |
| #pragma omp section | |
| visualisation_thread(); | |
| #pragma omp section | |
| calculation_thread(0); | |
| #pragma omp section | |
| calculation_thread(1); | |
| #pragma omp section | |
| calculation_thread(2); | |
| #pragma omp section | |
| calculation_thread(3); | |
| #pragma omp section | |
| calculation_thread(4); | |
| #pragma omp section | |
| calculation_thread(5); | |
| #pragma omp section | |
| calculation_thread(6); | |
| #pragma omp section | |
| calculation_thread(7); | |
| #pragma omp section | |
| calculation_thread(8); | |
| #pragma omp section | |
| calculation_thread(9); | |
| #pragma omp section | |
| calculation_thread(10); | |
| #pragma omp section | |
| calculation_thread(11); | |
| #pragma omp section | |
| calculation_thread(12); | |
| #pragma omp section | |
| calculation_thread(13); | |
| #pragma omp section | |
| calculation_thread(14); | |
| #pragma omp section | |
| calculation_thread(15); | |
| #pragma omp section | |
| calculation_thread(16); | |
| #pragma omp section | |
| calculation_thread(17); | |
| } | |
| for (int layer_iter = 0; layer_iter < LR_NB; layer_iter++) { | |
| if (W[layer_iter] != NULL) { | |
| free(W[layer_iter]); | |
| W[layer_iter] = NULL; | |
| } | |
| if (H[layer_iter] != NULL) { | |
| free(H[layer_iter]); | |
| H[layer_iter] = NULL; | |
| } | |
| } | |
| for (int td_i = 0; td_i < td_nb; td_i += 1) { | |
| if (R[td_i] != NULL) { | |
| free(R[td_i]); | |
| R[td_i] = NULL; | |
| } | |
| if (P[td_i] != NULL) { | |
| free(P[td_i]); | |
| P[td_i] = NULL; | |
| } | |
| if (RPo[td_i] != NULL) { | |
| free(RPo[td_i]); | |
| RPo[td_i] = NULL; | |
| } | |
| } | |
| printf("main end\n"); | |
| return (0); | |
| } |