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