summaryrefslogtreecommitdiff
path: root/graphics.c
diff options
context:
space:
mode:
authorMitya Selivanov <automainint@guattari.tech>2025-04-24 03:58:52 +0200
committerMitya Selivanov <automainint@guattari.tech>2025-04-24 03:58:52 +0200
commit27291f388b02c6ba88efb79b9728b65f158589ef (patch)
treed6cce8eccf6101a6ee04bf1b35a2186d050de56e /graphics.c
parentf8bd7cfdb9ed7ec99d612dd03670e50aa0c60db2 (diff)
downloadreduced_system_layer-27291f388b02c6ba88efb79b9728b65f158589ef.zip
Global gamma correction
Diffstat (limited to 'graphics.c')
-rw-r--r--graphics.c85
1 files changed, 46 insertions, 39 deletions
diff --git a/graphics.c b/graphics.c
index f4bc699..3552792 100644
--- a/graphics.c
+++ b/graphics.c
@@ -50,13 +50,7 @@ vec4_f32 vec4_f32_lerp (vec4_f32 a, vec4_f32 b, f32 t);
// ================================================================
-typedef struct {
- // NOTE: Dimensions are in pixels.
- i64 width;
- i64 height;
- i64 stride;
- vec4_f32 *pixels;
-} Pixel_Buffer;
+// NOTE: Dimensions are in pixels.
typedef struct {
f64 x;
@@ -65,6 +59,31 @@ typedef struct {
f64 height;
} Box;
+// TODO:
+// typedef struct {
+// b8 enabled;
+// i64 x;
+// i64 y;
+// i64 width;
+// i64 height;
+// } Bounding_Box;
+
+typedef struct {
+ i64 width;
+ i64 height;
+ i64 stride;
+ // Bounding_Box bounds;
+ u8 *pixels;
+} Stencil_Buffer;
+
+typedef struct {
+ i64 width;
+ i64 height;
+ i64 stride;
+ // Bounding_Box bounds;
+ vec4_f32 *pixels;
+} Pixel_Buffer;
+
enum {
GRAPHICS_DRAW_PIXELS,
GRAPHICS_FILL_RECTANGLE,
@@ -981,49 +1000,37 @@ vec4_f32 vec4_f32_lerp(vec4_f32 a, vec4_f32 b, f32 t) {
// ================================================================
-static f64 gamma_(f64 x) {
- if (x >= 0.0031308)
- return 1.055 * pow(x, 1.0 / 2.4) - 0.055;
- return 12.92 * x;
-}
-
-static f64 gamma_re_(f64 x) {
- if (x >= 0.04045)
- return pow((x + 0.055) / 1.055, 2.4);
- return x / 12.92;
-}
-
vec3_f32 rgb_gamma_add(vec3_f32 rgb) {
return (vec3_f32) {
- .x = (f32) gamma_(rgb.x),
- .y = (f32) gamma_(rgb.y),
- .z = (f32) gamma_(rgb.z),
+ .x = gamma_(rgb.x),
+ .y = gamma_(rgb.y),
+ .z = gamma_(rgb.z),
};
}
vec3_f32 rgb_gamma_remove(vec3_f32 rgb) {
return (vec3_f32) {
- .x = (f32) gamma_re_(rgb.x),
- .y = (f32) gamma_re_(rgb.y),
- .z = (f32) gamma_re_(rgb.z),
+ .x = gamma_re_(rgb.x),
+ .y = gamma_re_(rgb.y),
+ .z = gamma_re_(rgb.z),
};
}
vec4_f32 rgba_gamma_add(vec4_f32 rgba) {
return (vec4_f32) {
- .x = (f32) gamma_(rgba.x),
- .y = (f32) gamma_(rgba.y),
- .z = (f32) gamma_(rgba.z),
- .w = (f32) gamma_(rgba.w),
+ .x = gamma_(rgba.x),
+ .y = gamma_(rgba.y),
+ .z = gamma_(rgba.z),
+ .w = gamma_(rgba.w),
};
}
vec4_f32 rgba_gamma_remove(vec4_f32 rgba) {
return (vec4_f32) {
- .x = (f32) gamma_re_(rgba.x),
- .y = (f32) gamma_re_(rgba.y),
- .z = (f32) gamma_re_(rgba.z),
- .w = (f32) gamma_re_(rgba.w),
+ .x = gamma_re_(rgba.x),
+ .y = gamma_re_(rgba.y),
+ .z = gamma_re_(rgba.z),
+ .w = gamma_re_(rgba.w),
};
}
@@ -2186,7 +2193,7 @@ TEST("colors") {
vec3_f32 white = rgb_from_lch(lch_from_rgb((vec3_f32) { 1.f, 1.f, 1.f, }));
REQUIRE_EQ(white.x * 100, 100);
REQUIRE_EQ(white.y * 100, 100);
- REQUIRE_EQ((white.z + 3e-7) * 100, 100);
+ REQUIRE_EQ((white.z + 6e-7) * 100, 100);
vec3_f32 black = rgb_from_lch(lch_from_rgb((vec3_f32) { 0.f, 0.f, 0.f, }));
REQUIRE_EQ(black.x * 100, 0);
@@ -2205,13 +2212,13 @@ TEST("colors") {
vec3_f32 green = rgb_from_lch(lch_from_rgb((vec3_f32) { 0.f, 1.f, 0.f, }));
REQUIRE_EQ(green.x * 100, 0);
- REQUIRE_EQ(green.y * 100, 100);
+ REQUIRE_EQ((green.y + 3e-7) * 100, 100);
REQUIRE_EQ(green.z * 100, 0);
vec3_f32 blue = rgb_from_lch(lch_from_rgb((vec3_f32) { 0.f, 0.f, 1.f, }));
REQUIRE_EQ(blue.x * 100, 0);
REQUIRE_EQ(blue.y * 100, 0);
- REQUIRE_EQ((blue.z + 6e-8) * 100, 100);
+ REQUIRE_EQ((blue.z + 3e-7) * 100, 100);
vec3_f32 yellow = rgb_from_lch(lch_from_rgb((vec3_f32) { 1.f, 1.f, 0.f, }));
REQUIRE_EQ(yellow.x * 100, 100);
@@ -2220,13 +2227,13 @@ TEST("colors") {
vec3_f32 cyan = rgb_from_lch(lch_from_rgb((vec3_f32) { 0.f, 1.f, 1.f, }));
REQUIRE_EQ(cyan.x * 100, 0);
- REQUIRE_EQ((cyan.y + 2e-7) * 100, 100);
- REQUIRE_EQ((cyan.z + 2e-7) * 100, 100);
+ REQUIRE_EQ((cyan.y + 3e-7) * 100, 100);
+ REQUIRE_EQ((cyan.z + 3e-7) * 100, 100);
vec3_f32 purple = rgb_from_lch(lch_from_rgb((vec3_f32) { 1.f, 0.f, 1.f, }));
REQUIRE_EQ(purple.x * 100, 100);
REQUIRE_EQ(purple.y * 100, 0);
- REQUIRE_EQ((purple.z + 2e-7) * 100, 100);
+ REQUIRE_EQ((purple.z + 3e-7) * 100, 100);
}
TEST("rectangle corners") {