diff --git a/LinearRgb.zig b/LinearRgb.zig index 689aa841e23f76c8792f80d2f526cbd13756e831..9bfbf8ff423f365551be025815f04898a1a569cd 100644 --- a/LinearRgb.zig +++ b/LinearRgb.zig @@ -30,14 +30,15 @@ pub fn eql(x: Self, y: Self) bool { // https://www.w3.org/TR/WCAG/#dfn-relative-luminance pub fn relative_luminance(x: Self) f32 { - return (0.2126 * x.r) + (0.7152 * x.g) + (0.0722 * x.b); + const r, const g, const b, _ = x.to_array(); + return (0.2126 * r) + (0.7152 * g) + (0.0722 * b); } pub usingnamespace _x.mixin(@This(), f32, .r, .g, .b); // https://gamedev.stackexchange.com/a/194038 pub fn to_srgb(x: Self) color.sRGB { - const v: vec4 = x.to_array(); + const v = x.to_vec(); const cutoff = v < @as(vec4, @splat(0.0031308)); const higher = @as(vec4, @splat(1.055)) * std.math.pow(vec4, v, @splat(1.0 / 2.4)) - @as(vec4, @splat(0.055)); const lower = v * @as(vec4, @splat(12.92)); diff --git a/YUV.zig b/YUV.zig index 7093a2bf3ee4f88ce8bb387fcacbe962902ed94f..115baf18bf3603406bd4cefab5c9168019679a7b 100644 --- a/YUV.zig +++ b/YUV.zig @@ -40,6 +40,5 @@ pub fn to_srgb(x: Self) color.sRGB { } pub fn normal(x: Self) vec4 { - const v: vec4 = x.to_array(); - return v * @as(vec4, .{ 255, 255, 255, 1 }); + return x.to_vec() * @as(vec4, .{ 255, 255, 255, 1 }); } diff --git a/_x.zig b/_x.zig index 5a0bd07ff9b35c860a9a2b4167c482c3cf676eb6..3a61a928ac5a68640c346ba90f8fd2469a10959e 100644 --- a/_x.zig +++ b/_x.zig @@ -9,6 +9,9 @@ pub fn mixin( ) type { return struct { pub fn to_vec(x: T) @Vector(4, f32) { + if (I == f32) { + return x.to_array(); + } return .{ @floatFromInt(@field(x, @tagName(f1))), @floatFromInt(@field(x, @tagName(f2))), @@ -18,6 +21,14 @@ pub fn mixin( } pub fn from_vec(in: @Vector(4, f32)) T { + if (I == f32) { + var x: T = undefined; + @field(x, @tagName(f1)) = in[0]; + @field(x, @tagName(f2)) = in[1]; + @field(x, @tagName(f3)) = in[2]; + x.a = in[3]; + return x; + } var x: T = undefined; @field(x, @tagName(f1)) = @intFromFloat(in[0]); @field(x, @tagName(f2)) = @intFromFloat(in[1]);