5c208f233f6576a1efd2c2f9502ecf0daed5466d
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / css / resolver / StyleBuilderConverter.cpp
1 /*
2  * Copyright (C) 2013 Google Inc. All rights reserved.
3  *
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
9  * distribution.
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.
13  *
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.
25  */
26
27 #include "config.h"
28 #include "core/css/resolver/StyleBuilderConverter.h"
29
30 #include "core/css/CSSPrimitiveValueMappings.h"
31 #include "core/css/CSSShadowValue.h"
32 #include "core/css/Pair.h"
33 #include "core/svg/SVGURIReference.h"
34
35 namespace WebCore {
36
37 AtomicString StyleBuilderConverter::convertFragmentIdentifier(StyleResolverState& state, CSSValue* value)
38 {
39     CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
40     if (primitiveValue->isURI())
41         return SVGURIReference::fragmentIdentifierFromIRIString(primitiveValue->getStringValue(), state.document());
42     return nullAtom;
43 }
44
45 Length StyleBuilderConverter::convertLength(StyleResolverState& state, CSSValue* value)
46 {
47     CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
48     Length result = primitiveValue->convertToLength<FixedConversion | PercentConversion>(state.cssToLengthConversionData());
49     result.setQuirk(primitiveValue->isQuirkValue());
50     return result;
51 }
52
53 Length StyleBuilderConverter::convertLengthOrAuto(StyleResolverState& state, CSSValue* value)
54 {
55     CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
56     Length result = primitiveValue->convertToLength<FixedConversion | PercentConversion | AutoConversion>(state.cssToLengthConversionData());
57     result.setQuirk(primitiveValue->isQuirkValue());
58     return result;
59 }
60
61 Length StyleBuilderConverter::convertLengthSizing(StyleResolverState& state, CSSValue* value)
62 {
63     CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
64     switch (primitiveValue->getValueID()) {
65     case CSSValueInvalid:
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);
79     case CSSValueAuto:
80         return Length(Auto);
81     default:
82         ASSERT_NOT_REACHED();
83         return Length();
84     }
85 }
86
87 Length StyleBuilderConverter::convertLengthMaxSizing(StyleResolverState& state, CSSValue* value)
88 {
89     CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
90     if (primitiveValue->getValueID() == CSSValueNone)
91         return Length(Undefined);
92     return convertLengthSizing(state, value);
93 }
94
95 LengthPoint StyleBuilderConverter::convertLengthPoint(StyleResolverState& state, CSSValue* value)
96 {
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);
102 }
103
104 float StyleBuilderConverter::convertNumberOrPercentage(StyleResolverState& state, CSSValue* value)
105 {
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;
111 }
112
113 LengthSize StyleBuilderConverter::convertRadius(StyleResolverState& state, CSSValue* value)
114 {
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);
125 }
126
127 PassRefPtr<ShadowList> StyleBuilderConverter::convertShadow(StyleResolverState& state, CSSValue* value)
128 {
129     if (value->isPrimitiveValue()) {
130         ASSERT(toCSSPrimitiveValue(value)->getValueID() == CSSValueNone);
131         return PassRefPtr<ShadowList>();
132     }
133
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;
144         Color color;
145         if (item->color)
146             color = state.document().textLinkColors().colorFromPrimitiveValue(item->color.get(), state.style()->color());
147         else
148             color = state.style()->color();
149         shadows.append(ShadowData(FloatPoint(x, y), blur, spread, shadowStyle, color));
150     }
151     return ShadowList::adopt(shadows);
152 }
153
154 float StyleBuilderConverter::convertSpacing(StyleResolverState& state, CSSValue* value)
155 {
156     CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
157     if (primitiveValue->getValueID() == CSSValueNormal)
158         return 0;
159     if (state.useSVGZoomRules())
160         return primitiveValue->computeLength<float>(state.cssToLengthConversionData().copyWithAdjustedZoom(1));
161     return primitiveValue->computeLength<float>(state.cssToLengthConversionData());
162 }
163
164 PassRefPtr<SVGLength> StyleBuilderConverter::convertSVGLength(StyleResolverState&, CSSValue* value)
165 {
166     return SVGLength::fromCSSPrimitiveValue(toCSSPrimitiveValue(value));
167 }
168
169 } // namespace WebCore