From 26e90b4ca6cb1ee6fcf1e98deb3e45cc9db89b39 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 11 Jan 2026 17:18:13 -1000 Subject: [PATCH] [light] Move LightColorValues::lerp() out of header to reduce code duplication (#13138) --- .../components/light/light_color_values.cpp | 28 +++++++++++++++++++ esphome/components/light/light_color_values.h | 21 +------------- 2 files changed, 29 insertions(+), 20 deletions(-) create mode 100644 esphome/components/light/light_color_values.cpp diff --git a/esphome/components/light/light_color_values.cpp b/esphome/components/light/light_color_values.cpp new file mode 100644 index 0000000000..2f22bb3c68 --- /dev/null +++ b/esphome/components/light/light_color_values.cpp @@ -0,0 +1,28 @@ +#include "light_color_values.h" + +#include + +namespace esphome::light { + +LightColorValues LightColorValues::lerp(const LightColorValues &start, const LightColorValues &end, float completion) { + // Directly interpolate the raw values to avoid getter/setter overhead. + // This is safe because: + // - All LightColorValues have their values clamped when set via the setters + // - std::lerp guarantees output is in the same range as inputs + // - Therefore the output doesn't need clamping, so we can skip the setters + LightColorValues v; + v.color_mode_ = end.color_mode_; + v.state_ = std::lerp(start.state_, end.state_, completion); + v.brightness_ = std::lerp(start.brightness_, end.brightness_, completion); + v.color_brightness_ = std::lerp(start.color_brightness_, end.color_brightness_, completion); + v.red_ = std::lerp(start.red_, end.red_, completion); + v.green_ = std::lerp(start.green_, end.green_, completion); + v.blue_ = std::lerp(start.blue_, end.blue_, completion); + v.white_ = std::lerp(start.white_, end.white_, completion); + v.color_temperature_ = std::lerp(start.color_temperature_, end.color_temperature_, completion); + v.cold_white_ = std::lerp(start.cold_white_, end.cold_white_, completion); + v.warm_white_ = std::lerp(start.warm_white_, end.warm_white_, completion); + return v; +} + +} // namespace esphome::light diff --git a/esphome/components/light/light_color_values.h b/esphome/components/light/light_color_values.h index bedfad2c35..97756b9f26 100644 --- a/esphome/components/light/light_color_values.h +++ b/esphome/components/light/light_color_values.h @@ -82,26 +82,7 @@ class LightColorValues { * @param completion The completion value. 0 -> start, 1 -> end. * @return The linearly interpolated LightColorValues. */ - static LightColorValues lerp(const LightColorValues &start, const LightColorValues &end, float completion) { - // Directly interpolate the raw values to avoid getter/setter overhead. - // This is safe because: - // - All LightColorValues have their values clamped when set via the setters - // - std::lerp guarantees output is in the same range as inputs - // - Therefore the output doesn't need clamping, so we can skip the setters - LightColorValues v; - v.color_mode_ = end.color_mode_; - v.state_ = std::lerp(start.state_, end.state_, completion); - v.brightness_ = std::lerp(start.brightness_, end.brightness_, completion); - v.color_brightness_ = std::lerp(start.color_brightness_, end.color_brightness_, completion); - v.red_ = std::lerp(start.red_, end.red_, completion); - v.green_ = std::lerp(start.green_, end.green_, completion); - v.blue_ = std::lerp(start.blue_, end.blue_, completion); - v.white_ = std::lerp(start.white_, end.white_, completion); - v.color_temperature_ = std::lerp(start.color_temperature_, end.color_temperature_, completion); - v.cold_white_ = std::lerp(start.cold_white_, end.cold_white_, completion); - v.warm_white_ = std::lerp(start.warm_white_, end.warm_white_, completion); - return v; - } + static LightColorValues lerp(const LightColorValues &start, const LightColorValues &end, float completion); /** Normalize the color (RGB/W) component. *