blob: e1e3a4f595caff803a794d30bc09a477c02e3ff4 [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "lib/escher/material/color_utils.h"
namespace escher {
namespace {
float LinearToSrgb(float linear_color_channel) {
if (linear_color_channel <= 0.00313066844250063f) {
return linear_color_channel * 12.92f;
} else {
return 1.055f * pow(linear_color_channel, 1 / 2.4f) - 0.055f;
}
}
float SrgbToLinear(float srgb_color_channel) {
if (srgb_color_channel <= 0.0404482362771082f) {
return srgb_color_channel / 12.92f;
} else {
return pow((srgb_color_channel + 0.055f) / 1.055f, 2.4f);
}
}
} // namespace
vec3 LinearToSrgb(vec3 linear_color) {
return vec3(LinearToSrgb(linear_color.x), LinearToSrgb(linear_color.y),
LinearToSrgb(linear_color.z));
}
vec3 SrgbToLinear(vec3 srgb_color) {
return vec3(SrgbToLinear(srgb_color.x), SrgbToLinear(srgb_color.y),
SrgbToLinear(srgb_color.z));
}
vec3 HsvToLinear(vec3 hsv_color) {
float h = hsv_color.x;
float s = hsv_color.y;
float v = hsv_color.z;
float r, g, b;
float chroma = s * v;
float h_prime = fmod(h / 60.0, 6);
float x = chroma * (1 - fabs(fmod(h_prime, 2) - 1));
float m = v - chroma;
if (h_prime < 1) {
r = chroma;
g = x;
b = 0;
} else if (1 <= h_prime && h_prime < 2) {
r = x;
g = chroma;
b = 0;
} else if (2 <= h_prime && h_prime < 3) {
r = 0;
g = chroma;
b = x;
} else if (3 <= h_prime && h_prime < 4) {
r = 0;
g = x;
b = chroma;
} else if (4 <= h_prime && h_prime < 5) {
r = x;
g = 0;
b = chroma;
} else if (5 <= h_prime && h_prime < 6) {
r = chroma;
g = 0;
b = x;
} else {
r = 0;
g = 0;
b = 0;
}
r += m;
g += m;
b += m;
return vec3(r, g, b);
}
} // namespace escher