fddb065753373ed659585bfa313b3c02475effa9
[WebKit-https.git] / WebCore / ksvg2 / svg / SVGHelper.cpp
1 /*
2     Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
3                   2004, 2005 Rob Buis <buis@kde.org>
4
5     This file is part of the KDE project
6
7     This library is free software; you can redistribute it and/or
8     modify it under the terms of the GNU Library General Public
9     License as published by the Free Software Foundation; either
10     version 2 of the License, or (at your option) any later version.
11
12     This library is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15     Library General Public License for more details.
16
17     You should have received a copy of the GNU Library General Public License
18     along with this library; see the file COPYING.LIB.  If not, write to
19     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20     Boston, MA 02111-1307, USA.
21 */
22
23 #include "config.h"
24 #ifdef SVG_SUPPORT
25 #include "SVGHelper.h"
26
27 #include "Document.h"
28 #include "FrameView.h"
29 #include "RenderView.h"
30 #include "SVGLength.h"
31 #include "SVGSVGElement.h"
32 #include "SVGStringList.h"
33 #include "ksvg.h"
34 #include <math.h>
35
36 using namespace std;
37
38 namespace WebCore {
39
40 float SVGHelper::PercentageOfViewport(float value, const SVGElement* viewportElement, LengthMode mode)
41 {
42     float width = 0, height = 0;
43     if (!viewportElement)
44         return 0.0;
45  
46     if (viewportElement->isSVG()) {
47         const SVGSVGElement* svg = static_cast<const SVGSVGElement*>(viewportElement);
48         if (svg->hasAttribute(SVGNames::viewBoxAttr)) {
49             width = svg->viewBox().width();
50             height = svg->viewBox().height();
51         } else if (svg->width()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE ||
52                 svg->height()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE) {
53             // TODO: Shouldn't w/h be multiplied with the percentage values?!
54             // AFAIK, this assumes width & height == 100%, Rob??
55             Document *doc = svg->document();
56             if (doc->documentElement() == svg) {
57                 // We have to ask the canvas for the full "canvas size"...
58                 RenderView* view = static_cast<RenderView *>(doc->renderer());
59                 if (view) {
60                     width = view->frameView()->visibleWidth(); // TODO: recheck!
61                     height = view->frameView()->visibleHeight(); // TODO: recheck!
62                 }
63             }
64         } else {
65             width = svg->width()->value();
66             height = svg->height()->value();
67         }
68     }
69
70     if (mode == LM_WIDTH)
71         return value * width;
72     else if (mode == LM_HEIGHT)
73         return value * height;
74     else if (mode == LM_OTHER)
75         return value * sqrt(pow(double(width), 2) + pow(double(height), 2)) / sqrt(2.0);
76     
77     return 0.0;
78 }
79
80 void SVGHelper::ParseSeperatedList(SVGStringList *list, const DeprecatedString &data, const DeprecatedChar &delimiter)
81 {
82     // TODO : more error checking/reporting
83     ExceptionCode ec = 0;
84     list->clear(ec);
85
86     DeprecatedStringList substrings = DeprecatedStringList::split(delimiter, data);
87     
88     DeprecatedStringList::ConstIterator it = substrings.begin();
89     DeprecatedStringList::ConstIterator end = substrings.end();
90     for (; it != end; ++it)
91         list->appendItem(String(*it), ec);
92 }
93
94 }
95
96 // vim:ts=4:noet
97 #endif // SVG_SUPPORT
98