colourpicker

Simple Colour Picker written in C
git clone anongit@rnpnr.xyz:colourpicker.git
Log | Files | Refs | Feed | Submodules | README | LICENSE

Commit: 3cdc8af7c338197f368abb2d516e8e3405fc6847
Parent: 2886b729a546163d8c0fafbb82e40da26809e153
Author: Randy Palamar
Date:   Thu,  8 May 2025 13:46:43 -0600

bake shader using objcopy

this method is way simpler than baking it manually. It breaks when
using LTO but that can be investigated later. LTO doesn't really
offer us much anyways since we are using single compilation unit.

Diffstat:
Mbuild.sh | 28+++++++++++++++++++++-------
Mcolourpicker.c | 2+-
Mgen_incs.c | 43+------------------------------------------
Mutil.c | 6+++++-
4 files changed, 28 insertions(+), 51 deletions(-)

diff --git a/build.sh b/build.sh @@ -4,8 +4,9 @@ version=1.0 cflags=${CFLAGS:-"-march=native -O3"} cflags="${cflags} -std=c11 " -ldflags=${LDFLAGS:-"-flto"} -ldflags="$ldflags -lm" +ldflags=${LDFLAGS} +# TODO(rnp): embed shader without lto stripping it */ +ldflags="${ldflags} -fno-lto -lm" output="colourpicker" @@ -17,12 +18,24 @@ for arg; do esac done +machine=$(uname -m) + case $(uname -s) in MINGW64*) w32=1 output="Colour Picker" windres assets/colourpicker.rc out/colourpicker.rc.o ldflags="out/colourpicker.rc.o ${ldflags} -mwindows -lgdi32 -lwinmm" + case ${machine} in + x86_64) binary_format="pe-x86-64" ;; + *) binary_format="pe-${machine}" ;; + esac + ;; +*) + case ${machine} in + aarch64) binary_format="elf64-littleaarch64" ;; + x86_64) binary_format="elf64-x86-64" ;; + esac ;; esac @@ -70,10 +83,8 @@ raylib=out/libraylib.a cflags="${cflags} -Wall -Wextra -Iout" -if [ ! -e "out/shader_inc.h" ] || [ "slider_lerp.glsl" -nt "out/shader_inc.h" ]; then - ${cc} ${cflags} -o gen_incs gen_incs.c ${ldflags} ${raylib} - ./gen_incs - mv lora_sb*.h out/ +if [ ! -s "out/lora_sb_0_inc.h" ] || [ "gen_incs.c" -nt "out/lora_sb_0_inc.h" ]; then + ${cc} ${cflags} -o gen_incs gen_incs.c ${ldflags} ${raylib} && ./gen_incs fi if [ "$debug" ]; then @@ -83,7 +94,10 @@ if [ "$debug" ]; then ${cc} ${cflags} -fPIC -shared colourpicker.c -o colourpicker.so ldflags="${ldflags} -Wl,-rpath,. ${raylib}" else - ldflags="${raylib} ${ldflags}" + if [ ! -s "out/slider_lerp.o" ] || [ "slider_lerp.glsl" -nt "out/slider_lerp.o" ]; then + objcopy --input-target=binary slider_lerp.glsl --output-target=${binary_format} out/slider_lerp.o + fi + ldflags="${raylib} out/slider_lerp.o ${ldflags}" fi ${cc} ${cflags} -DVERSION="\"${version}\"" main.c -o "${output}" ${ldflags} diff --git a/colourpicker.c b/colourpicker.c @@ -1062,7 +1062,7 @@ do_colour_picker(ColourPickerCtx *ctx, f32 dt, Vector2 window_pos, Vector2 mouse #ifdef _DEBUG ctx->picker_shader = LoadShader(0, HSV_LERP_SHADER_NAME); #else - ctx->picker_shader = LoadShaderFromMemory(0, g_hsv_shader_text); + ctx->picker_shader = LoadShaderFromMemory(0, _binary_slider_lerp_glsl_start); #endif ctx->mode_id = GetShaderLocation(ctx->picker_shader, "u_mode"); ctx->colour_mode_id = GetShaderLocation(ctx->picker_shader, "u_colour_mode"); diff --git a/gen_incs.c b/gen_incs.c @@ -43,21 +43,6 @@ read_whole_file(char *name, str8 *mem) return res; } -function str8 -get_line(str8 *s) -{ - str8 res = {.data = s->data}; - while (s->len && s->data[0] != '\n') { - s->data++; - s->len--; - res.len++; - } - /* NOTE: skip over trailing \n */ - s->data++; - s->len--; - return res; -} - /* NOTE: modified from raylib */ function void export_font_as_code(char *font_path, char *output_name, int font_size, str8 mem) @@ -153,37 +138,11 @@ main(void) for (unsigned int i = 0; i < sizeof(font_sizes)/sizeof(*font_sizes); i++) { str8 tmem = smem; str8 rmem = smem; - size_t tlen = snprintf((char *)tmem.data, tmem.len, "lora_sb_%d_inc.h", i); + size_t tlen = snprintf((char *)tmem.data, tmem.len, "out/lora_sb_%d_inc.h", i); rmem.len -= (tlen + 1); rmem.data += (tlen + 1); export_font_as_code("assets/Lora-SemiBold.ttf", (char *)tmem.data, font_sizes[i], rmem); } - FILE *out_file = fopen("out/shader_inc.h", "w"); - if (!out_file) { - fputs("Failed to open necessary files!\n", stdout); - return 1; - } - - str8 shader_data = read_whole_file(HSV_LERP_SHADER_NAME, &smem); - str8 s = shader_data; - /* NOTE: skip over license notice */ - str8 line = get_line(&s); - fputs("static char *g_hsv_shader_text =\n\t", out_file); - do { - line = get_line(&s); - while (line.len && ISSPACE(*line.data)) { - line.data++; - line.len--; - } - if (line.len) { - fputc('"', out_file); - fwrite(line.data, 1, line.len, out_file); - fputs("\\n\"\n\t", out_file); - } - } while (s.len > 0); - fputs(";\n", out_file); - fclose(out_file); - return 0; } diff --git a/util.c b/util.c @@ -18,11 +18,15 @@ typedef ptrdiff_t sz; #define global static #define local_persist static -#include "shader_inc.h" #include "lora_sb_0_inc.h" #include "lora_sb_1_inc.h" #include "config.h" +/* NOTE(rnp): symbols in release builds shaders are embedded in the binary */ +#ifndef _DEBUG +extern char _binary_slider_lerp_glsl_start[]; +#endif + #ifndef asm #define asm __asm__ #endif