diff options
Diffstat (limited to 'WebCore/svg/SVGFitToViewBox.cpp')
-rw-r--r-- | WebCore/svg/SVGFitToViewBox.cpp | 89 |
1 files changed, 51 insertions, 38 deletions
diff --git a/WebCore/svg/SVGFitToViewBox.cpp b/WebCore/svg/SVGFitToViewBox.cpp index 64c978f..c78a619 100644 --- a/WebCore/svg/SVGFitToViewBox.cpp +++ b/WebCore/svg/SVGFitToViewBox.cpp @@ -1,22 +1,22 @@ /* - Copyright (C) 2004, 2005, 2008 Nikolas Zimmermann <zimmermann@kde.org> - 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ + * Copyright (C) 2004, 2005, 2008 Nikolas Zimmermann <zimmermann@kde.org> + * Copyright (C) 2004, 2005, 2006, 2007, 2010 Rob Buis <buis@kde.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ #include "config.h" @@ -27,11 +27,10 @@ #include "Attr.h" #include "Document.h" #include "FloatRect.h" -#include "MappedAttribute.h" #include "SVGNames.h" #include "SVGParserUtilities.h" #include "SVGPreserveAspectRatio.h" -#include "StringImpl.h" +#include <wtf/text/StringImpl.h> namespace WebCore { @@ -43,35 +42,49 @@ SVGFitToViewBox::~SVGFitToViewBox() { } -bool SVGFitToViewBox::parseViewBox(Document* doc, const UChar*& c, const UChar* end, float& x, float& y, float& w, float& h, bool validate) +bool SVGFitToViewBox::parseViewBox(Document* doc, const String& s, FloatRect& viewBox) +{ + const UChar* c = s.characters(); + const UChar* end = c + s.length(); + return parseViewBox(doc, c, end, viewBox, true); +} + +bool SVGFitToViewBox::parseViewBox(Document* doc, const UChar*& c, const UChar* end, FloatRect& viewBox, bool validate) { String str(c, end - c); skipOptionalSpaces(c, end); + float x = 0.0f; + float y = 0.0f; + float width = 0.0f; + float height = 0.0f; bool valid = (parseNumber(c, end, x) && parseNumber(c, end, y) && - parseNumber(c, end, w) && parseNumber(c, end, h, false)); - if (!validate) + parseNumber(c, end, width) && parseNumber(c, end, height, false)); + if (!validate) { + viewBox = FloatRect(x, y, width, height); return true; + } if (!valid) { doc->accessSVGExtensions()->reportWarning("Problem parsing viewBox=\"" + str + "\""); return false; } - if (w < 0.0) { // check that width is positive + if (width < 0.0) { // check that width is positive doc->accessSVGExtensions()->reportError("A negative value for ViewBox width is not allowed"); return false; - } else if (h < 0.0) { // check that height is positive + } + if (height < 0.0) { // check that height is positive doc->accessSVGExtensions()->reportError("A negative value for ViewBox height is not allowed"); return false; - } else { - skipOptionalSpaces(c, end); - if (c < end) { // nothing should come after the last, fourth number - doc->accessSVGExtensions()->reportWarning("Problem parsing viewBox=\"" + str + "\""); - return false; - } + } + skipOptionalSpaces(c, end); + if (c < end) { // nothing should come after the last, fourth number + doc->accessSVGExtensions()->reportWarning("Problem parsing viewBox=\"" + str + "\""); + return false; } + viewBox = FloatRect(x, y, width, height); return true; } @@ -83,15 +96,15 @@ AffineTransform SVGFitToViewBox::viewBoxToViewTransform(const FloatRect& viewBox return preserveAspectRatio.getCTM(viewBoxRect.x(), viewBoxRect.y(), viewBoxRect.width(), viewBoxRect.height(), 0, 0, viewWidth, viewHeight); } -bool SVGFitToViewBox::parseMappedAttribute(Document* document, MappedAttribute* attr) +bool SVGFitToViewBox::parseMappedAttribute(Document* document, Attribute* attr) { if (attr->name() == SVGNames::viewBoxAttr) { - float x = 0.0f, y = 0.0f, w = 0.0f, h = 0.0f; - const UChar* c = attr->value().characters(); - const UChar* end = c + attr->value().length(); - if (parseViewBox(document, c, end, x, y, w, h)) - setViewBoxBaseValue(FloatRect(x, y, w, h)); - return true; + FloatRect viewBox; + if (!attr->value().isNull()) { + if (!parseViewBox(document, attr->value(), viewBox)) + return true; + } + setViewBoxBaseValue(viewBox); } else if (attr->name() == SVGNames::preserveAspectRatioAttr) { SVGPreserveAspectRatio::parsePreserveAspectRatio(this, attr->value()); return true; |