From 3bb2b7d2f5ef2135abc736e4cb87d31ff9688f10 Mon Sep 17 00:00:00 2001 From: Klemek Date: Thu, 5 Jun 2025 17:52:02 +0200 Subject: [PATCH] feat: remove math (#11) * feat: remove math * working * remove unused stdint * small fix --- Makefile.am | 3 +-- configure.ac | 1 - src/args.c | 8 ++++---- src/generator.c | 11 +++++------ src/rand.c | 26 +++++++++++++++----------- src/rand.h | 3 +-- 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Makefile.am b/Makefile.am index 7c6067c..a595ea5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,4 @@ AUTOMAKE_OPTIONS = foreign subdir-objects -Wall bin_PROGRAMS = margen margen_SOURCES = src/main.c src/args.c src/bmp.c src/generator.c src/rand.c -include_HEADERS = src/main.h src/args.h src/bmp.h src/generator.h src/rand.h src/config.h src/types.h -margen_LDADD = -lm \ No newline at end of file +include_HEADERS = src/main.h src/args.h src/bmp.h src/generator.h src/rand.h src/config.h src/types.h \ No newline at end of file diff --git a/configure.ac b/configure.ac index 8abbff4..8d5683a 100644 --- a/configure.ac +++ b/configure.ac @@ -6,6 +6,5 @@ AC_CHECK_HEADERS([stdlib.h]) AC_CHECK_HEADERS([stdbool.h]) AC_CHECK_HEADERS([string.h]) AC_CHECK_HEADERS([time.h]) -AC_CHECK_HEADERS([math.h]) AC_CONFIG_FILES([Makefile]) AC_OUTPUT \ No newline at end of file diff --git a/src/args.c b/src/args.c index 1907af7..31d12c6 100644 --- a/src/args.c +++ b/src/args.c @@ -23,7 +23,7 @@ void print_help(int status_code) { "[-va=R,G,B] " "[-vr=VAR_RANGE] " "[-r=ROTATION] " - // "[-m]" + "[-m]" "\n\n" "generate a marble-like pattern bitmap image, blazing fast.\n\n" "options:\n" @@ -216,9 +216,9 @@ parameters parse_args(int argc, char **argv) { } if (!var_set) { - params.var[0] = rand_uchar(var_range); - params.var[1] = rand_uchar(var_range); - params.var[2] = rand_uchar(var_range); + params.var[0] = rand_uchar(var_range + 1); + params.var[1] = rand_uchar(var_range + 1); + params.var[2] = rand_uchar(var_range + 1); } if (!rot_set) { diff --git a/src/generator.c b/src/generator.c index f5ecba3..9d56dd1 100644 --- a/src/generator.c +++ b/src/generator.c @@ -2,7 +2,6 @@ #include "bmp.h" #include "config.h" #include "rand.h" -#include #include #include #include @@ -18,11 +17,10 @@ unsigned char *current_line; unsigned char generate_pixel(unsigned char depth, unsigned char top_pixel, unsigned char left_pixel) { - float v = fminf( - 255.0, fmaxf(0.0, (rand_float(2.0) - 1.0) * global_params.var[depth] + - ((float)left_pixel) * slope + - ((float)top_pixel) * (1.0 - slope))); - return (unsigned char)v; + short k = rand_uchar(global_params.var[depth] + 1); + short v = (rand_uchar(2) == 0 ? k : -k) + (left_pixel)*slope + + (top_pixel) * (1.0 - slope); + return (unsigned char)(v < 0 ? 0 : (v > 255 ? (unsigned char)255 : v)); } void generate_line() { @@ -62,6 +60,7 @@ void debug_parameters(parameters params) { printf(" width %d\n", params.width); printf(" height %d\n", params.height); printf(" pixel %d\n", params.size); + printf(" slope %d\n", params.slope); if (params.monochrome) { printf(" color %u\n", params.start[0]); printf(" var. %u\n", params.var[0]); diff --git a/src/rand.c b/src/rand.c index 767f71a..aabfa46 100644 --- a/src/rand.c +++ b/src/rand.c @@ -1,21 +1,25 @@ -#include +static unsigned long long mcg_state = 0xcafef00dd15ea5e5u; // Must be odd +static unsigned long long const multiplier = 6364136223846793005u; -float seed; +// https://en.wikipedia.org/wiki/Permuted_congruential_generator +unsigned long rand(void) { + unsigned long long x = mcg_state; + unsigned count = (unsigned)(x >> 61); -void set_seed(unsigned long new_seed) { seed = (float)(new_seed % 1000000); } - -float rand(float seed) { - float v = powf(seed, 6. / 7.); - v *= sinf(v) + 1.; - return v - floorf(v); + mcg_state = x * multiplier; + x ^= x >> 22; + return (unsigned long)(x >> (22 + count)); } -float rand_float(const float max) { return rand(seed++) * max; } +void set_seed(unsigned long long seed) { + mcg_state = 2 * seed + 1; + (void)rand(); +} unsigned char rand_uchar(const unsigned int max) { - return (unsigned char)(rand(seed++) * max); + return max == 0 ? 0 : (unsigned char)(rand() % max); } unsigned short rand_ushort(const unsigned int max) { - return (unsigned short)(rand(seed++) * max); + return max == 0 ? 0 : (unsigned short)(rand() % max); } diff --git a/src/rand.h b/src/rand.h index 38b182b..fab48c5 100644 --- a/src/rand.h +++ b/src/rand.h @@ -1,8 +1,7 @@ #ifndef RAND_H #define RAND_H -void set_seed(unsigned long new_seed); -float rand_float(const float max); +void set_seed(unsigned long long seed); unsigned char rand_uchar(unsigned int max); unsigned short rand_ushort(unsigned int max);