1/*
2 * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
3 * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
4 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved.
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 * Library General Public License for more details.
15 *
16 * You should have received a copy of the GNU Library General Public License
17 * along with this library; see the file COPYING.LIB.  If not, write to
18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
20 */
21
22#include "config.h"
23#include "core/svg/SVGPaint.h"
24
25#include "bindings/v8/ExceptionState.h"
26#include "wtf/text/WTFString.h"
27
28namespace WebCore {
29
30static inline SVGColor::SVGColorType colorTypeForPaintType(const SVGPaint::SVGPaintType& paintType)
31{
32    switch (paintType) {
33    case SVGPaint::SVG_PAINTTYPE_NONE:
34    case SVGPaint::SVG_PAINTTYPE_UNKNOWN:
35    case SVGPaint::SVG_PAINTTYPE_URI:
36    case SVGPaint::SVG_PAINTTYPE_URI_NONE:
37        return SVGColor::SVG_COLORTYPE_UNKNOWN;
38    case SVGPaint::SVG_PAINTTYPE_URI_RGBCOLOR:
39    case SVGPaint::SVG_PAINTTYPE_RGBCOLOR:
40        return SVGColor::SVG_COLORTYPE_RGBCOLOR;
41    case SVGPaint::SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR:
42    case SVGPaint::SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR:
43        return SVGColor::SVG_COLORTYPE_RGBCOLOR_ICCCOLOR;
44    case SVGPaint::SVG_PAINTTYPE_URI_CURRENTCOLOR:
45    case SVGPaint::SVG_PAINTTYPE_CURRENTCOLOR:
46        return SVGColor::SVG_COLORTYPE_CURRENTCOLOR;
47    }
48
49    ASSERT_NOT_REACHED();
50    return SVGColor::SVG_COLORTYPE_UNKNOWN;
51}
52
53SVGPaint::SVGPaint(const SVGPaintType& paintType, const String& uri)
54    : SVGColor(SVGPaintClass, colorTypeForPaintType(paintType))
55    , m_paintType(paintType)
56    , m_uri(uri)
57{
58}
59
60void SVGPaint::setUri(const String&)
61{
62    // The whole SVGPaint interface is deprecated in SVG 1.1 (2nd edition).
63    // The setters are the most problematic part so we remove the support for those first.
64}
65
66void SVGPaint::setPaint(unsigned short, const String&, const String&, const String&, ExceptionState& es)
67{
68    es.throwDOMException(NoModificationAllowedError);
69}
70
71String SVGPaint::customCssText() const
72{
73    switch (m_paintType) {
74    case SVG_PAINTTYPE_UNKNOWN:
75    case SVG_PAINTTYPE_RGBCOLOR:
76    case SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR:
77    case SVG_PAINTTYPE_CURRENTCOLOR:
78        return SVGColor::customCssText();
79    case SVG_PAINTTYPE_NONE:
80        return "none";
81    case SVG_PAINTTYPE_URI_NONE:
82        return m_uri + " none";
83    case SVG_PAINTTYPE_URI_CURRENTCOLOR:
84    case SVG_PAINTTYPE_URI_RGBCOLOR:
85    case SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR: {
86        String color = SVGColor::customCssText();
87        if (color.isEmpty())
88            return m_uri;
89        return m_uri + ' ' + color;
90    }
91    case SVG_PAINTTYPE_URI:
92        return m_uri;
93    };
94
95    ASSERT_NOT_REACHED();
96    return String();
97}
98
99SVGPaint::SVGPaint(const SVGPaint& cloneFrom)
100    : SVGColor(SVGPaintClass, cloneFrom)
101    , m_paintType(cloneFrom.m_paintType)
102    , m_uri(cloneFrom.m_uri)
103{
104}
105
106PassRefPtr<SVGPaint> SVGPaint::cloneForCSSOM() const
107{
108    return adoptRef(new SVGPaint(*this));
109}
110
111bool SVGPaint::equals(const SVGPaint& other) const
112{
113    return m_paintType == other.m_paintType && m_uri == other.m_uri && SVGColor::equals(other);
114}
115
116}
117