diff --git a/firmware/src/hcolor.h b/firmware/src/hcolor.h
index c5ceef7b1c0ab3e53dfb442b49d56fa2c44d41ac..b1291e58fdabbe72b969c250246155f98faea619 100644
--- a/firmware/src/hcolor.h
+++ b/firmware/src/hcolor.h
@@ -28,9 +28,9 @@ static inline HColor HColor16(uint16_t r, uint16_t g, uint16_t b) {
 /// Constructor for 8-bit colors
 static inline HColor HColor8(uint8_t r, uint8_t g, uint8_t b) {
     HColor c = {
-        r | (unsigned(r) << 8),
-        g | (unsigned(g) << 8),
-        b | (unsigned(b) << 8),
+        uint16_t(r | (unsigned(r) << 8)),
+        uint16_t(g | (unsigned(g) << 8)),
+        uint16_t(b | (unsigned(b) << 8)),
     };
     return c;
 }
@@ -43,9 +43,9 @@ static inline HColor HColor8(uint32_t rgb) {
 /// Constructor for float colors, with clamping.
 static inline HColor HColorF(float r, float g, float b) {
     HColor c = {
-        std::min<int>(0xffff, std::max<int>(0, r * 65535.0f + 0.5f)),
-        std::min<int>(0xffff, std::max<int>(0, g * 65535.0f + 0.5f)),
-        std::min<int>(0xffff, std::max<int>(0, b * 65535.0f + 0.5f)),
+        uint16_t(std::min<int>(0xffff, std::max<int>(0, r * 65535.0f + 0.5f))),
+        uint16_t(std::min<int>(0xffff, std::max<int>(0, g * 65535.0f + 0.5f))),
+        uint16_t(std::min<int>(0xffff, std::max<int>(0, b * 65535.0f + 0.5f))),
     };
     return c;
 }
@@ -53,9 +53,9 @@ static inline HColor HColorF(float r, float g, float b) {
 /// Add two colors, with saturation
 static inline HColor operator + (HColor a, HColor b) {
     HColor c = {
-        std::min<int>(0xffff, unsigned(a.r) + unsigned(b.r)),
-        std::min<int>(0xffff, unsigned(a.g) + unsigned(b.g)),
-        std::min<int>(0xffff, unsigned(a.b) + unsigned(b.b)),
+        uint16_t(std::min<int>(0xffff, unsigned(a.r) + unsigned(b.r))),
+        uint16_t(std::min<int>(0xffff, unsigned(a.g) + unsigned(b.g))),
+        uint16_t(std::min<int>(0xffff, unsigned(a.b) + unsigned(b.b))),
     };
     return c;
 }
@@ -65,24 +65,24 @@ static inline HColor operator + (HColor a, HColor b) {
  * Returns c1 if alpha==0, or c2 if alpha==0x100. Values outside this range will extrapolate.
  */
 static inline HColor lerp8(HColor c1, HColor c2, int alpha) {
-  int invA = 0x100 - alpha;
-  HColor c = {
-    (c1.r * invA + c2.r * alpha) >> 8,
-    (c1.g * invA + c2.g * alpha) >> 8,
-    (c1.b * invA + c2.b * alpha) >> 8,
-  };
-  return c;
+    int invA = 0x100 - alpha;
+    HColor c = {
+        uint16_t((c1.r * invA + c2.r * alpha) >> 8),
+        uint16_t((c1.g * invA + c2.g * alpha) >> 8),
+        uint16_t((c1.b * invA + c2.b * alpha) >> 8),
+    };
+    return c;
 }
 
 /// Floating point linear interpolation, with clamping.
 static inline HColor lerp(HColor c1, HColor c2, float alpha) {
-  float invA = 1.0f - alpha;
-  HColor c = {
-    std::min<int>(0xffff, std::max<int>(0, c1.r * invA + c2.r * alpha)),
-    std::min<int>(0xffff, std::max<int>(0, c1.g * invA + c2.g * alpha)),
-    std::min<int>(0xffff, std::max<int>(0, c1.b * invA + c2.b * alpha)),
-  };
-  return c;
+    float invA = 1.0f - alpha;
+    HColor c = {
+        uint16_t(std::min<int>(0xffff, std::max<int>(0, c1.r * invA + c2.r * alpha))),
+        uint16_t(std::min<int>(0xffff, std::max<int>(0, c1.g * invA + c2.g * alpha))),
+        uint16_t(std::min<int>(0xffff, std::max<int>(0, c1.b * invA + c2.b * alpha))),
+    };
+    return c;
 }
 
 /// Data type for one display pixel
@@ -104,11 +104,9 @@ struct HPixel {
         int b8 = std::min<int>(0xff, std::max<int>(0, (b16 + 0x80) >> 8));
 
         // Compute the error, after expanding the 8-bit value back to 16-bit.
-        #if 1
         residual[0] = r16 - (r8 * 257);
         residual[1] = g16 - (g8 * 257);
         residual[2] = b16 - (b8 * 257);
-        #endif
 
         return (r8 << 16) | (g8 << 8) | b8;
     }