From 5f557fbb737d21d738366713da4b1bf8f1155496 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9tro?= <yann.roberge@polymtl.ca>
Date: Sat, 29 May 2021 13:20:17 -0400
Subject: [PATCH] =?UTF-8?q?Impl=C3=A9mentation=20de=20la=20conversion=20HS?=
 =?UTF-8?q?V->RGB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 rgb2hsv.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 46 insertions(+), 3 deletions(-)

diff --git a/rgb2hsv.c b/rgb2hsv.c
index 60b175e..49a6d0f 100644
--- a/rgb2hsv.c
+++ b/rgb2hsv.c
@@ -34,11 +34,11 @@ void rgb2hsv(PixelHSV* hsv, PixelRGB8* rgb) {
     }
     else if (r >= g && r >= b) {
         maxComp = r;
-        if (g < b) {
-            minComp = g;
+        if (g >= b) {
+            minComp = b;
         }
         else {
-            minComp = b;
+            minComp = g;
         }
         tempSubtract = g - b;
     }
@@ -90,5 +90,48 @@ void rgb2hsv(PixelHSV* hsv, PixelRGB8* rgb) {
 
 void hsv2rgb(PixelRGB8* rgb, PixelHSV* hsv) {
     //TODO: Implémenter
+    int hueMSB = (int)hsv->hue & 0x1C0;
+    int hueLSB = (int)hsv->hue & 0x03F;
+
+    int tempVS = hsv->value * hsv->sat;
+    int vMinusVS = hsv->value - tempVS;
+    int evenMSB = hsv->value - ( (tempVS * hueLSB) / 0x40);
+    int oddMSB = hsv->value - ( (tempVS * (0x40 - hueLSB)) / 0x40);
+
+    // Formulas for HueMBS shifted down by 1
+    // so as to take the hue offset into account
+    // (equation 6.69 in Bailey does not)
+    switch (hueMSB >> 6) {
+        case 0:
+            rgb->red = hsv->value;
+            rgb->green = vMinusVS;
+            rgb->blue = evenMSB;
+            break;
+        case 1:
+            rgb->red = hsv->value;
+            rgb->green = oddMSB;
+            rgb->blue = vMinusVS;
+            break;
+        case 2:
+            rgb->red = evenMSB;
+            rgb->green = hsv->value;
+            rgb->blue = vMinusVS;
+            break;
+        case 3:
+            rgb->red = vMinusVS;
+            rgb->green = hsv->value;
+            rgb->blue = oddMSB;
+            break;
+        case 4:
+            rgb->red = vMinusVS;
+            rgb->green = evenMSB;
+            rgb->blue = hsv->value;
+            break;
+        case 5:
+            rgb->red = oddMSB;
+            rgb->green = vMinusVS;
+            rgb->blue = hsv->value;
+            break;
+    }
 }
 
-- 
GitLab