1/*
2 * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 * Library General Public License for more details.
13 *
14 * You should have received a copy of the GNU Library General Public License
15 * along with this library; see the file COPYING.LIB.  If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 */
19
20#include "config.h"
21#if ENABLE(SVG)
22#include "ColorDistance.h"
23
24#include "Color.h"
25#include <wtf/MathExtras.h>
26
27namespace WebCore {
28
29ColorDistance::ColorDistance()
30    : m_redDiff(0)
31    , m_greenDiff(0)
32    , m_blueDiff(0)
33{
34}
35
36ColorDistance::ColorDistance(const Color& fromColor, const Color& toColor)
37    : m_redDiff(toColor.red() - fromColor.red())
38    , m_greenDiff(toColor.green() - fromColor.green())
39    , m_blueDiff(toColor.blue() - fromColor.blue())
40{
41}
42
43ColorDistance::ColorDistance(int redDiff, int greenDiff, int blueDiff)
44    : m_redDiff(redDiff)
45    , m_greenDiff(greenDiff)
46    , m_blueDiff(blueDiff)
47{
48}
49
50static inline int clampColorValue(int v)
51{
52    if (v > 255)
53        v = 255;
54    else if (v < 0)
55        v = 0;
56    return v;
57}
58
59ColorDistance ColorDistance::scaledDistance(float scaleFactor) const
60{
61    return ColorDistance(static_cast<int>(scaleFactor * m_redDiff),
62                         static_cast<int>(scaleFactor * m_greenDiff),
63                         static_cast<int>(scaleFactor * m_blueDiff));
64}
65
66Color ColorDistance::clampColor(int red, int green, int blue, int alpha)
67{
68    return Color(clampColorValue(red), clampColorValue(green), clampColorValue(blue), clampColorValue(alpha));
69}
70
71Color ColorDistance::addColors(const Color& first, const Color& second)
72{
73    return Color(first.red() + second.red(), first.green() + second.green(), first.blue() + second.blue());
74}
75
76Color ColorDistance::addToColor(const Color& color) const
77{
78    return Color(color.red() + m_redDiff, color.green() + m_greenDiff, color.blue() + m_blueDiff);
79}
80
81bool ColorDistance::isZero() const
82{
83    return !m_redDiff && !m_blueDiff && !m_greenDiff;
84}
85
86float ColorDistance::distance() const
87{
88    // This is just a simple distance calculation, not respecting color spaces
89    return sqrtf(m_redDiff * m_redDiff + m_blueDiff * m_blueDiff + m_greenDiff * m_greenDiff);
90}
91
92}
93
94#endif
95