2 * Copyright (C) 2013 Google Inc. All rights reserved.
4 * * Redistributions of source code must retain the above copyright
5 * notice, this list of conditions and the following disclaimer.
6 * * Redistributions in binary form must reproduce the above
7 * copyright notice, this list of conditions and the following disclaimer
8 * in the documentation and/or other materials provided with the
10 * * Neither the name of Google Inc. nor the names of its
11 * contributors may be used to endorse or promote products derived from
12 * this software without specific prior written permission.
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #include "core/css/resolver/StyleBuilderConverter.h"
30 #include "core/css/CSSPrimitiveValueMappings.h"
31 #include "core/css/CSSShadowValue.h"
32 #include "core/css/Pair.h"
33 #include "core/svg/SVGURIReference.h"
37 AtomicString StyleBuilderConverter::convertFragmentIdentifier(StyleResolverState& state, CSSValue* value)
39 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
40 if (primitiveValue->isURI())
41 return SVGURIReference::fragmentIdentifierFromIRIString(primitiveValue->getStringValue(), state.document());
45 Length StyleBuilderConverter::convertLength(StyleResolverState& state, CSSValue* value)
47 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
48 Length result = primitiveValue->convertToLength<FixedConversion | PercentConversion>(state.cssToLengthConversionData());
49 result.setQuirk(primitiveValue->isQuirkValue());
53 Length StyleBuilderConverter::convertLengthOrAuto(StyleResolverState& state, CSSValue* value)
55 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
56 Length result = primitiveValue->convertToLength<FixedConversion | PercentConversion | AutoConversion>(state.cssToLengthConversionData());
57 result.setQuirk(primitiveValue->isQuirkValue());
61 Length StyleBuilderConverter::convertLengthSizing(StyleResolverState& state, CSSValue* value)
63 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
64 switch (primitiveValue->getValueID()) {
66 return convertLength(state, value);
67 case CSSValueIntrinsic:
68 return Length(Intrinsic);
69 case CSSValueMinIntrinsic:
70 return Length(MinIntrinsic);
71 case CSSValueWebkitMinContent:
72 return Length(MinContent);
73 case CSSValueWebkitMaxContent:
74 return Length(MaxContent);
75 case CSSValueWebkitFillAvailable:
76 return Length(FillAvailable);
77 case CSSValueWebkitFitContent:
78 return Length(FitContent);
87 Length StyleBuilderConverter::convertLengthMaxSizing(StyleResolverState& state, CSSValue* value)
89 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
90 if (primitiveValue->getValueID() == CSSValueNone)
91 return Length(Undefined);
92 return convertLengthSizing(state, value);
95 LengthPoint StyleBuilderConverter::convertLengthPoint(StyleResolverState& state, CSSValue* value)
97 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
98 Pair* pair = primitiveValue->getPairValue();
99 Length x = pair->first()->convertToLength<FixedConversion | PercentConversion>(state.cssToLengthConversionData());
100 Length y = pair->second()->convertToLength<FixedConversion | PercentConversion>(state.cssToLengthConversionData());
101 return LengthPoint(x, y);
104 float StyleBuilderConverter::convertNumberOrPercentage(StyleResolverState& state, CSSValue* value)
106 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
107 ASSERT(primitiveValue->isNumber() || primitiveValue->isPercentage());
108 if (primitiveValue->isNumber())
109 return primitiveValue->getFloatValue();
110 return primitiveValue->getFloatValue() / 100.0f;
113 LengthSize StyleBuilderConverter::convertRadius(StyleResolverState& state, CSSValue* value)
115 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
116 Pair* pair = primitiveValue->getPairValue();
117 Length radiusWidth = pair->first()->convertToLength<FixedConversion | PercentConversion>(state.cssToLengthConversionData());
118 Length radiusHeight = pair->second()->convertToLength<FixedConversion | PercentConversion>(state.cssToLengthConversionData());
119 float width = radiusWidth.value();
120 float height = radiusHeight.value();
121 ASSERT(width >= 0 && height >= 0);
122 if (width <= 0 || height <= 0)
123 return LengthSize(Length(0, Fixed), Length(0, Fixed));
124 return LengthSize(radiusWidth, radiusHeight);
127 PassRefPtr<ShadowList> StyleBuilderConverter::convertShadow(StyleResolverState& state, CSSValue* value)
129 if (value->isPrimitiveValue()) {
130 ASSERT(toCSSPrimitiveValue(value)->getValueID() == CSSValueNone);
131 return PassRefPtr<ShadowList>();
134 const CSSValueList* valueList = toCSSValueList(value);
135 size_t shadowCount = valueList->length();
136 ShadowDataVector shadows;
137 for (size_t i = 0; i < shadowCount; ++i) {
138 const CSSShadowValue* item = toCSSShadowValue(valueList->item(i));
139 float x = item->x->computeLength<float>(state.cssToLengthConversionData());
140 float y = item->y->computeLength<float>(state.cssToLengthConversionData());
141 float blur = item->blur ? item->blur->computeLength<float>(state.cssToLengthConversionData()) : 0;
142 float spread = item->spread ? item->spread->computeLength<float>(state.cssToLengthConversionData()) : 0;
143 ShadowStyle shadowStyle = item->style && item->style->getValueID() == CSSValueInset ? Inset : Normal;
146 color = state.document().textLinkColors().colorFromPrimitiveValue(item->color.get(), state.style()->color());
148 color = state.style()->color();
149 shadows.append(ShadowData(FloatPoint(x, y), blur, spread, shadowStyle, color));
151 return ShadowList::adopt(shadows);
154 float StyleBuilderConverter::convertSpacing(StyleResolverState& state, CSSValue* value)
156 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
157 if (primitiveValue->getValueID() == CSSValueNormal)
159 if (state.useSVGZoomRules())
160 return primitiveValue->computeLength<float>(state.cssToLengthConversionData().copyWithAdjustedZoom(1));
161 return primitiveValue->computeLength<float>(state.cssToLengthConversionData());
164 PassRefPtr<SVGLength> StyleBuilderConverter::convertSVGLength(StyleResolverState&, CSSValue* value)
166 return SVGLength::fromCSSPrimitiveValue(toCSSPrimitiveValue(value));
169 } // namespace WebCore