diff --git a/include/rive/math/color.hpp b/include/rive/math/color.hpp
deleted file mode 100644
index 6ad5937..0000000
--- a/include/rive/math/color.hpp
+++ /dev/null
@@ -1,76 +0,0 @@
-#ifndef _RIVE_COLOR_HPP_
-#define _RIVE_COLOR_HPP_
-
-#include "rive/rive_types.hpp"
-
-namespace rive {
-    class Color {
-    private:
-        float m_Buffer[4];
-
-    public:
-        Color() : m_Buffer{1.0f, 1.0f, 1.0f, 1.0f} {}
-
-        Color(float r, float g, float b) : m_Buffer{r, g, b, 1.0f} {}
-
-        Color(float r, float g, float b, float a) : m_Buffer{r, g, b, a} {}
-
-        Color(int r, int g, int b, int a) :
-            m_Buffer{r / 255.0f, g / 255.0f, b / 255.0f, a / 255.0f} {}
-
-        Color(int r, int g, int b) : m_Buffer{r / 255.0f, g / 255.0f, b / 255.0f, 1.0f} {}
-
-        Color(float rgba) : m_Buffer{rgba, rgba, rgba, rgba} {}
-
-        inline const float* values() const { return m_Buffer; }
-
-        float& operator[](std::size_t idx) { return m_Buffer[idx]; }
-        const float& operator[](std::size_t idx) const { return m_Buffer[idx]; }
-        bool operator==(const Color& b) const {
-            return m_Buffer[0] == b[0] && m_Buffer[1] == b[1] && m_Buffer[2] == b[2] &&
-                   m_Buffer[3] == b[3];
-        }
-
-        void set(float r, float g, float b, float a) {
-            m_Buffer[0] = r;
-            m_Buffer[1] = g;
-            m_Buffer[2] = b;
-            m_Buffer[3] = a;
-        }
-
-        void lerp(const Color& second, float amount) {
-            float iamount = 1.0f - amount;
-            for (int i = 0; i < 4; i++) {
-                m_Buffer[i] = second.m_Buffer[i] * amount + m_Buffer[i] * iamount;
-            }
-        }
-
-        void multiply(const Color& second) {
-            for (int i = 0; i < 4; i++) {
-                m_Buffer[i] *= second.m_Buffer[i];
-            }
-        }
-
-        void copy(const Color& second) {
-            for (int i = 0; i < 4; i++) {
-                m_Buffer[i] = second.m_Buffer[i];
-            }
-        }
-
-        void red(float r) { m_Buffer[0] = r; }
-        void green(float r) { m_Buffer[1] = r; }
-        void blue(float r) { m_Buffer[2] = r; }
-        void alpha(float r) { m_Buffer[3] = r; }
-
-        float red() const { return m_Buffer[0]; }
-        float green() const { return m_Buffer[1]; }
-        float blue() const { return m_Buffer[2]; }
-        float alpha() const { return m_Buffer[3]; }
-
-        float r() const { return m_Buffer[0]; }
-        float g() const { return m_Buffer[1]; }
-        float b() const { return m_Buffer[2]; }
-        float a() const { return m_Buffer[3]; }
-    };
-} // namespace rive
-#endif
