| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2007, 2010 Rob Buis <buis@kde.org> | 2 * Copyright (C) 2007, 2010 Rob Buis <buis@kde.org> |
| 3 * | 3 * |
| 4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
| 5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
| 6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
| 7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
| 8 * | 8 * |
| 9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 12 * Library General Public License for more details. | 12 * Library General Public License for more details. |
| 13 * | 13 * |
| 14 * You should have received a copy of the GNU Library General Public License | 14 * You should have received a copy of the GNU Library General Public License |
| 15 * along with this library; see the file COPYING.LIB. If not, write to | 15 * along with this library; see the file COPYING.LIB. If not, write to |
| 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| 17 * Boston, MA 02110-1301, USA. | 17 * Boston, MA 02110-1301, USA. |
| 18 */ | 18 */ |
| 19 | 19 |
| 20 #include "core/svg/SVGViewSpec.h" | 20 #include "core/svg/SVGViewSpec.h" |
| 21 | 21 |
| 22 #include "bindings/core/v8/ExceptionMessages.h" | |
| 23 #include "bindings/core/v8/ExceptionState.h" | |
| 24 #include "core/SVGNames.h" | |
| 25 #include "core/dom/ExceptionCode.h" | |
| 26 #include "core/svg/SVGAnimatedTransformList.h" | |
| 27 #include "core/svg/SVGParserUtilities.h" | 22 #include "core/svg/SVGParserUtilities.h" |
| 23 #include "core/svg/SVGPreserveAspectRatio.h" |
| 24 #include "core/svg/SVGRect.h" |
| 25 #include "core/svg/SVGTransformList.h" |
| 28 #include "wtf/text/ParsingUtilities.h" | 26 #include "wtf/text/ParsingUtilities.h" |
| 29 | 27 |
| 30 namespace blink { | 28 namespace blink { |
| 31 | 29 |
| 32 SVGViewSpec::SVGViewSpec(SVGSVGElement* contextElement) | 30 SVGViewSpec::SVGViewSpec() |
| 33 // Note: addToPropertyMap is not needed, as SVGViewSpec do not correspond to | 31 : m_viewBox(SVGRect::createInvalid()), |
| 34 // an element. We make tear-offs' contextElement the target element of | 32 m_preserveAspectRatio(SVGPreserveAspectRatio::create()), |
| 35 // SVGViewSpec. This contextElement will be only used for keeping this | 33 m_transform(SVGTransformList::create()) {} |
| 36 // alive from the tearoff. SVGSVGElement holds a strong-ref to this | |
| 37 // SVGViewSpec, so this is kept alive as: | |
| 38 // AnimatedProperty tearoff -(contextElement)-> SVGSVGElement -(RefPtr)-> | |
| 39 // SVGViewSpec. | |
| 40 : SVGFitToViewBox(contextElement, PropertyMapPolicySkip), | |
| 41 m_contextElement(contextElement), | |
| 42 m_transform(SVGAnimatedTransformList::create(contextElement, | |
| 43 SVGNames::transformAttr)) { | |
| 44 ASSERT(m_contextElement); | |
| 45 | |
| 46 viewBox()->setReadOnly(); | |
| 47 preserveAspectRatio()->setReadOnly(); | |
| 48 m_transform->setReadOnly(); | |
| 49 // Note: addToPropertyMap is not needed, as SVGViewSpec do not correspond to | |
| 50 // an element. | |
| 51 } | |
| 52 | 34 |
| 53 DEFINE_TRACE(SVGViewSpec) { | 35 DEFINE_TRACE(SVGViewSpec) { |
| 54 visitor->trace(m_contextElement); | 36 visitor->trace(m_viewBox); |
| 37 visitor->trace(m_preserveAspectRatio); |
| 55 visitor->trace(m_transform); | 38 visitor->trace(m_transform); |
| 56 SVGFitToViewBox::trace(visitor); | |
| 57 } | 39 } |
| 58 | 40 |
| 59 bool SVGViewSpec::parseViewSpec(const String& spec) { | 41 bool SVGViewSpec::parseViewSpec(const String& spec) { |
| 60 if (spec.isEmpty() || !m_contextElement) | 42 if (spec.isEmpty()) |
| 61 return false; | 43 return false; |
| 62 if (spec.is8Bit()) { | 44 if (spec.is8Bit()) { |
| 63 const LChar* ptr = spec.characters8(); | 45 const LChar* ptr = spec.characters8(); |
| 64 const LChar* end = ptr + spec.length(); | 46 const LChar* end = ptr + spec.length(); |
| 65 return parseViewSpecInternal(ptr, end); | 47 return parseViewSpecInternal(ptr, end); |
| 66 } | 48 } |
| 67 const UChar* ptr = spec.characters16(); | 49 const UChar* ptr = spec.characters16(); |
| 68 const UChar* end = ptr + spec.length(); | 50 const UChar* end = ptr + spec.length(); |
| 69 return parseViewSpecInternal(ptr, end); | 51 return parseViewSpecInternal(ptr, end); |
| 70 } | 52 } |
| 71 | 53 |
| 54 void SVGViewSpec::setViewBox(const FloatRect& rect) { |
| 55 viewBox()->setValue(rect); |
| 56 } |
| 57 |
| 58 void SVGViewSpec::setPreserveAspectRatio(const SVGPreserveAspectRatio& other) { |
| 59 preserveAspectRatio()->setAlign(other.align()); |
| 60 preserveAspectRatio()->setMeetOrSlice(other.meetOrSlice()); |
| 61 } |
| 62 |
| 72 void SVGViewSpec::reset() { | 63 void SVGViewSpec::reset() { |
| 73 resetZoomAndPan(); | 64 resetZoomAndPan(); |
| 74 m_transform->baseValue()->clear(); | 65 m_transform->clear(); |
| 75 updateViewBox(FloatRect()); | 66 setViewBox(FloatRect()); |
| 76 ASSERT(preserveAspectRatio()); | 67 preserveAspectRatio()->setDefault(); |
| 77 preserveAspectRatio()->baseValue()->setAlign( | |
| 78 SVGPreserveAspectRatio::kSvgPreserveaspectratioXmidymid); | |
| 79 preserveAspectRatio()->baseValue()->setMeetOrSlice( | |
| 80 SVGPreserveAspectRatio::kSvgMeetorsliceMeet); | |
| 81 m_viewTargetString = emptyString(); | |
| 82 } | 68 } |
| 83 | 69 |
| 84 namespace { | 70 namespace { |
| 85 | 71 |
| 86 enum ViewSpecFunctionType { | 72 enum ViewSpecFunctionType { |
| 87 Unknown, | 73 Unknown, |
| 88 PreserveAspectRatio, | 74 PreserveAspectRatio, |
| 89 Transform, | 75 Transform, |
| 90 ViewBox, | 76 ViewBox, |
| 91 ViewTarget, | 77 ViewTarget, |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 switch (functionType) { | 127 switch (functionType) { |
| 142 case ViewBox: { | 128 case ViewBox: { |
| 143 float x = 0.0f; | 129 float x = 0.0f; |
| 144 float y = 0.0f; | 130 float y = 0.0f; |
| 145 float width = 0.0f; | 131 float width = 0.0f; |
| 146 float height = 0.0f; | 132 float height = 0.0f; |
| 147 if (!(parseNumber(ptr, end, x) && parseNumber(ptr, end, y) && | 133 if (!(parseNumber(ptr, end, x) && parseNumber(ptr, end, y) && |
| 148 parseNumber(ptr, end, width) && | 134 parseNumber(ptr, end, width) && |
| 149 parseNumber(ptr, end, height, DisallowWhitespace))) | 135 parseNumber(ptr, end, height, DisallowWhitespace))) |
| 150 return false; | 136 return false; |
| 151 updateViewBox(FloatRect(x, y, width, height)); | 137 setViewBox(FloatRect(x, y, width, height)); |
| 152 break; | 138 break; |
| 153 } | 139 } |
| 154 case ViewTarget: { | 140 case ViewTarget: { |
| 155 const CharType* viewTargetStart = ptr; | 141 // Ignore arguments. |
| 156 skipUntil<CharType>(ptr, end, ')'); | 142 skipUntil<CharType>(ptr, end, ')'); |
| 157 if (ptr == viewTargetStart) | |
| 158 return false; | |
| 159 m_viewTargetString = String(viewTargetStart, ptr - viewTargetStart); | |
| 160 break; | 143 break; |
| 161 } | 144 } |
| 162 case ZoomAndPan: | 145 case ZoomAndPan: |
| 163 if (!parseZoomAndPan(ptr, end)) | 146 if (!parseZoomAndPan(ptr, end)) |
| 164 return false; | 147 return false; |
| 165 break; | 148 break; |
| 166 case PreserveAspectRatio: | 149 case PreserveAspectRatio: |
| 167 if (!preserveAspectRatio()->baseValue()->parse(ptr, end, false)) | 150 if (!preserveAspectRatio()->parse(ptr, end, false)) |
| 168 return false; | 151 return false; |
| 169 break; | 152 break; |
| 170 case Transform: | 153 case Transform: |
| 171 m_transform->baseValue()->parse(ptr, end); | 154 m_transform->parse(ptr, end); |
| 172 break; | 155 break; |
| 173 default: | 156 default: |
| 174 NOTREACHED(); | 157 NOTREACHED(); |
| 175 break; | 158 break; |
| 176 } | 159 } |
| 177 | 160 |
| 178 if (!skipExactly<CharType>(ptr, end, ')')) | 161 if (!skipExactly<CharType>(ptr, end, ')')) |
| 179 return false; | 162 return false; |
| 180 | 163 |
| 181 skipExactly<CharType>(ptr, end, ';'); | 164 skipExactly<CharType>(ptr, end, ';'); |
| 182 } | 165 } |
| 183 return skipExactly<CharType>(ptr, end, ')'); | 166 return skipExactly<CharType>(ptr, end, ')'); |
| 184 } | 167 } |
| 185 | 168 |
| 186 } // namespace blink | 169 } // namespace blink |
| OLD | NEW |