18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
3dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved.
5dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
6dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This library is free software; you can redistribute it and/or
7dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * modify it under the terms of the GNU Library General Public
8dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * License as published by the Free Software Foundation; either
9dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * version 2 of the License, or (at your option) any later version.
10dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
11dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This library is distributed in the hope that it will be useful,
12dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * but WITHOUT ANY WARRANTY; without even the implied warranty of
13dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Library General Public License for more details.
15dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
16dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * You should have received a copy of the GNU Library General Public License
17dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * along with this library; see the file COPYING.LIB.  If not, write to
18dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Boston, MA 02110-1301, USA.
20dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch */
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
23967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGPaint.h"
26f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
2781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "SVGException.h"
28967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include "SVGURIReference.h"
2981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <wtf/text/StringConcatenate.h>
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic inline SVGColor::SVGColorType colorTypeForPaintType(const SVGPaint::SVGPaintType& paintType)
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    switch (paintType) {
3681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVGPaint::SVG_PAINTTYPE_NONE:
3781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVGPaint::SVG_PAINTTYPE_UNKNOWN:
3881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVGPaint::SVG_PAINTTYPE_URI:
3981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVGPaint::SVG_PAINTTYPE_URI_NONE:
4081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return SVGColor::SVG_COLORTYPE_UNKNOWN;
4181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVGPaint::SVG_PAINTTYPE_URI_RGBCOLOR:
4281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVGPaint::SVG_PAINTTYPE_RGBCOLOR:
4381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return SVGColor::SVG_COLORTYPE_RGBCOLOR;
4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVGPaint::SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR:
4581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVGPaint::SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR:
4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return SVGColor::SVG_COLORTYPE_RGBCOLOR_ICCCOLOR;
4781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVGPaint::SVG_PAINTTYPE_URI_CURRENTCOLOR:
4881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVGPaint::SVG_PAINTTYPE_CURRENTCOLOR:
4981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return SVGColor::SVG_COLORTYPE_CURRENTCOLOR;
5081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
5181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
5281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT_NOT_REACHED();
5381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return SVGColor::SVG_COLORTYPE_UNKNOWN;
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochSVGPaint::SVGPaint(const SVGPaintType& paintType, String uri)
5781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    : SVGColor(colorTypeForPaintType(paintType))
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_paintType(paintType)
5981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_uri(uri)
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGPaint::setUri(const String& uri)
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Spec: Sets the paintType to SVG_PAINTTYPE_URI_NONE and sets uri to the specified value.
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_uri = uri;
6781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_paintType = SVG_PAINTTYPE_URI_NONE;
6881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setColor(Color());
6981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setColorType(colorTypeForPaintType(m_paintType));
7054cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    // FIXME: A follow up patch will call valueChanged() here.
7154cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block}
7254cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block
7354cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve BlockSVGPaint* SVGPaint::defaultFill()
7454cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block{
7554cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    static SVGPaint* staticDefaultFill = createColor(Color::black).releaseRef();
7654cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    return staticDefaultFill;
7754cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block}
7854cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block
7954cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve BlockSVGPaint* SVGPaint::defaultStroke()
8054cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block{
8154cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    static SVGPaint* staticDefaultStroke = createNone().releaseRef();
8254cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    return staticDefaultStroke;
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid SVGPaint::setPaint(unsigned short paintType, const String& uri, const String& rgbColor, const String& iccColor, ExceptionCode& ec)
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if ((paintType > SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR && paintType < SVG_PAINTTYPE_NONE) || paintType > SVG_PAINTTYPE_URI) {
8881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        ec = SVGException::SVG_WRONG_TYPE_ERR;
8981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
9081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
9181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool requiresURI = false;
9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    SVGPaintType type = static_cast<SVGPaintType>(paintType);
9581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    switch (type) {
9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_UNKNOWN:
9781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Spec: It is invalid to attempt to define a new value of this type or to attempt to switch an existing value to this type.
9881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        ec = SVGException::SVG_INVALID_VALUE_ERR;
9981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
10081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_RGBCOLOR:
10181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR:
10281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_NONE:
10381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_CURRENTCOLOR:
10481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        break;
10581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_URI_NONE:
10681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_URI_CURRENTCOLOR:
10781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_URI_RGBCOLOR:
10881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR:
10981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_URI:
11081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        requiresURI = true;
11181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        break;
11281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    };
11381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
11481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Spec: If paintType requires a URI, then uri must be non-null; otherwise, uri must be null.
11581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (requiresURI && uri.isEmpty()) {
11681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        ec = SVGException::SVG_INVALID_VALUE_ERR;
11781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
11881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
11981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
12081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    SVGColor::SVGColorType colorType = colorTypeForPaintType(type);
12181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (colorType == SVGColor::SVG_COLORTYPE_UNKNOWN) {
12281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // The standard setColor() code path used in the else branch
12381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // raises an exception when attempting to switch to an unknown color type.
12481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Here we explicitely want to reset to Color() and an unknown type, so force it.
12581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        setColorType(colorType);
12681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        setColor(Color());
12781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else {
12881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        setColor(colorType, rgbColor, iccColor, ec);
12981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (ec)
13081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return;
13181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
13281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
13381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_paintType = type;
13481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_uri = requiresURI ? uri : String();
13554cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    // FIXME: A follow up patch will call valueChanged() here.
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString SVGPaint::cssText() const
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
14081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    switch (m_paintType) {
14181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_UNKNOWN:
14281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_RGBCOLOR:
14381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR:
14481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_CURRENTCOLOR:
14581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return SVGColor::cssText();
14681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_NONE:
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return "none";
14881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_URI_NONE:
14981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return makeString(m_uri, " none");
15081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_URI_CURRENTCOLOR:
15181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_URI_RGBCOLOR:
15281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR: {
15381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        String color = SVGColor::cssText();
15481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (color.isEmpty())
15581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return m_uri;
15681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return makeString(m_uri, ' ', color);
15781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
15881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_URI:
15981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return m_uri;
16081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    };
16181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
16281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT_NOT_REACHED();
16381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return String();
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
166967717af5423377c967781471ee106e2bb4e11c8Ben Murdochbool SVGPaint::matchesTargetURI(const String& referenceId)
167967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
16881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    switch (m_paintType) {
16981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_UNKNOWN:
17081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_RGBCOLOR:
17181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR:
17281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_CURRENTCOLOR:
17381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_NONE:
174967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return false;
17581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_URI_NONE:
17681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_URI_CURRENTCOLOR:
17781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_URI_RGBCOLOR:
17881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR:
17981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case SVG_PAINTTYPE_URI:
18081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return referenceId == SVGURIReference::getTarget(m_uri);
18181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
18281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
18381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT_NOT_REACHED();
18481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return false;
185967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
186967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(SVG)
190