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