18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2004, 2005, 2008 Nikolas Zimmermann <zimmermann@kde.org> 3dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org> 4dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2007 Eric Seidel <eric@webkit.org> 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" 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG) 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGTransformable.h" 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#include "AffineTransform.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FloatConversion.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGNames.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGParserUtilities.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGStyledElement.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGTransformList.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic int parseTransformParamList(const UChar*& ptr, const UChar* end, float* values, int required, int optional) 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int optionalParams = 0, requiredParams = 0; 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!skipOptionalSpaces(ptr, end) || *ptr != '(') 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return -1; 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ptr++; 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project skipOptionalSpaces(ptr, end); 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (requiredParams < required) { 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ptr >= end || !parseNumber(ptr, end, values[requiredParams], false)) 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return -1; 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project requiredParams++; 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (requiredParams < required) 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project skipOptionalSpacesOrDelimiter(ptr, end); 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!skipOptionalSpaces(ptr, end)) 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return -1; 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool delimParsed = skipOptionalSpacesOrDelimiter(ptr, end); 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ptr >= end) 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return -1; 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (*ptr == ')') { // skip optionals 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ptr++; 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (delimParsed) 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return -1; 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (optionalParams < optional) { 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ptr >= end || !parseNumber(ptr, end, values[requiredParams + optionalParams], false)) 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return -1; 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project optionalParams++; 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (optionalParams < optional) 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project skipOptionalSpacesOrDelimiter(ptr, end); 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!skipOptionalSpaces(ptr, end)) 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return -1; 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delimParsed = skipOptionalSpacesOrDelimiter(ptr, end); 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ptr >= end || *ptr != ')' || delimParsed) 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return -1; 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ptr++; 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return requiredParams + optionalParams; 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// These should be kept in sync with enum SVGTransformType 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const int requiredValuesForType[] = {0, 6, 1, 1, 1, 1, 1}; 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const int optionalValuesForType[] = {0, 0, 1, 1, 2, 0, 0}; 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// This destructor is needed in order to link correctly with Intel ICC. 9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochSVGTransformable::~SVGTransformable() 9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 9581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerbool SVGTransformable::parseTransformValue(unsigned type, const UChar*& ptr, const UChar* end, SVGTransform& transform) 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (type == SVGTransform::SVG_TRANSFORM_UNKNOWN) 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int valueCount = 0; 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float values[] = {0, 0, 0, 0, 0, 0}; 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ((valueCount = parseTransformParamList(ptr, end, values, requiredValuesForType[type], optionalValuesForType[type])) < 0) 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (type) { 1086b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner case SVGTransform::SVG_TRANSFORM_SKEWX: 1096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner transform.setSkewX(values[0]); 1106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner break; 1116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner case SVGTransform::SVG_TRANSFORM_SKEWY: 1126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner transform.setSkewY(values[0]); 1136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner break; 1146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner case SVGTransform::SVG_TRANSFORM_SCALE: 1156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (valueCount == 1) // Spec: if only one param given, assume uniform scaling 1166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner transform.setScale(values[0], values[0]); 1176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner else 1186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner transform.setScale(values[0], values[1]); 1196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner break; 1206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner case SVGTransform::SVG_TRANSFORM_TRANSLATE: 1216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (valueCount == 1) // Spec: if only one param given, assume 2nd param to be 0 1226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner transform.setTranslate(values[0], 0); 1236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner else 1246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner transform.setTranslate(values[0], values[1]); 1256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner break; 1266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner case SVGTransform::SVG_TRANSFORM_ROTATE: 1276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (valueCount == 1) 1286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner transform.setRotate(values[0], 0, 0); 1296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner else 1306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner transform.setRotate(values[0], values[1], values[2]); 1316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner break; 1326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner case SVGTransform::SVG_TRANSFORM_MATRIX: 1336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner transform.setMatrix(AffineTransform(values[0], values[1], values[2], values[3], values[4], values[5])); 1346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner break; 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic const UChar skewXDesc[] = {'s', 'k', 'e', 'w', 'X'}; 1410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic const UChar skewYDesc[] = {'s', 'k', 'e', 'w', 'Y'}; 1420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic const UChar scaleDesc[] = {'s', 'c', 'a', 'l', 'e'}; 1430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic const UChar translateDesc[] = {'t', 'r', 'a', 'n', 's', 'l', 'a', 't', 'e'}; 1440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic const UChar rotateDesc[] = {'r', 'o', 't', 'a', 't', 'e'}; 1450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic const UChar matrixDesc[] = {'m', 'a', 't', 'r', 'i', 'x'}; 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline bool parseAndSkipType(const UChar*& currTransform, const UChar* end, unsigned short& type) 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (currTransform >= end) 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (*currTransform == 's') { 1534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (skipString(currTransform, end, skewXDesc, WTF_ARRAY_LENGTH(skewXDesc))) 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project type = SVGTransform::SVG_TRANSFORM_SKEWX; 1554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang else if (skipString(currTransform, end, skewYDesc, WTF_ARRAY_LENGTH(skewYDesc))) 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project type = SVGTransform::SVG_TRANSFORM_SKEWY; 1574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang else if (skipString(currTransform, end, scaleDesc, WTF_ARRAY_LENGTH(scaleDesc))) 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project type = SVGTransform::SVG_TRANSFORM_SCALE; 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } else if (skipString(currTransform, end, translateDesc, WTF_ARRAY_LENGTH(translateDesc))) 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project type = SVGTransform::SVG_TRANSFORM_TRANSLATE; 1634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang else if (skipString(currTransform, end, rotateDesc, WTF_ARRAY_LENGTH(rotateDesc))) 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project type = SVGTransform::SVG_TRANSFORM_ROTATE; 1654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang else if (skipString(currTransform, end, matrixDesc, WTF_ARRAY_LENGTH(matrixDesc))) 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project type = SVGTransform::SVG_TRANSFORM_MATRIX; 1674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang else 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1736b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerbool SVGTransformable::parseTransformAttribute(SVGTransformList& list, const AtomicString& transform) 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const UChar* start = transform.characters(); 176d0825bca7fe65beaee391d30da42e937db621564Steve Block return parseTransformAttribute(list, start, start + transform.length()); 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1796b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerbool SVGTransformable::parseTransformAttribute(SVGTransformList& list, const UChar*& currTransform, const UChar* end, TransformParsingMode mode) 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (mode == ClearList) 1826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner list.clear(); 183d0825bca7fe65beaee391d30da42e937db621564Steve Block 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool delimParsed = false; 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (currTransform < end) { 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delimParsed = false; 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned short type = SVGTransform::SVG_TRANSFORM_UNKNOWN; 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project skipOptionalSpaces(currTransform, end); 189d0825bca7fe65beaee391d30da42e937db621564Steve Block 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!parseAndSkipType(currTransform, end, type)) 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner SVGTransform transform; 1946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (!parseTransformValue(type, currTransform, end, transform)) 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner list.append(transform); 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project skipOptionalSpaces(currTransform, end); 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (currTransform < end && *currTransform == ',') { 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delimParsed = true; 201d0825bca7fe65beaee391d30da42e937db621564Steve Block ++currTransform; 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project skipOptionalSpaces(currTransform, end); 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return !delimParsed; 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool SVGTransformable::isKnownAttribute(const QualifiedName& attrName) 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return attrName == SVGNames::transformAttr; 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(SVG) 217