blob: 3dc54b266e62fb93d214320ba6211e837070116f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/core/animation/css_font_stretch_interpolation_type.h"
#include <memory>
#include "base/memory/ptr_util.h"
#include "third_party/blink/renderer/core/css/css_primitive_value_mappings.h"
#include "third_party/blink/renderer/core/css/resolver/style_resolver_state.h"
#include "third_party/blink/renderer/core/style/computed_style.h"
#include "third_party/blink/renderer/platform/wtf/math_extras.h"
namespace blink {
class InheritedFontStretchChecker
: public CSSInterpolationType::CSSConversionChecker {
public:
explicit InheritedFontStretchChecker(FontSelectionValue font_stretch)
: font_stretch_(font_stretch) {}
private:
bool IsValid(const StyleResolverState& state,
const InterpolationValue&) const final {
return font_stretch_ == state.ParentStyle()->GetFontStretch();
}
const double font_stretch_;
};
InterpolationValue CSSFontStretchInterpolationType::CreateFontStretchValue(
FontSelectionValue font_stretch) const {
return InterpolationValue(std::make_unique<InterpolableNumber>(font_stretch));
}
InterpolationValue CSSFontStretchInterpolationType::MaybeConvertNeutral(
const InterpolationValue&,
ConversionCheckers&) const {
return InterpolationValue(std::make_unique<InterpolableNumber>(0));
}
InterpolationValue CSSFontStretchInterpolationType::MaybeConvertInitial(
const StyleResolverState&,
ConversionCheckers& conversion_checkers) const {
return CreateFontStretchValue(NormalWidthValue());
}
InterpolationValue CSSFontStretchInterpolationType::MaybeConvertInherit(
const StyleResolverState& state,
ConversionCheckers& conversion_checkers) const {
if (!state.ParentStyle())
return nullptr;
FontSelectionValue inherited_font_stretch =
state.ParentStyle()->GetFontStretch();
conversion_checkers.push_back(
std::make_unique<InheritedFontStretchChecker>(inherited_font_stretch));
return CreateFontStretchValue(inherited_font_stretch);
}
InterpolationValue CSSFontStretchInterpolationType::MaybeConvertValue(
const CSSValue& value,
const StyleResolverState* state,
ConversionCheckers& conversion_checkers) const {
if (auto* primitive_value = DynamicTo<CSSPrimitiveValue>(value)) {
return CreateFontStretchValue(
FontSelectionValue(primitive_value->GetFloatValue()));
}
const auto& identifier_value = To<CSSIdentifierValue>(value);
CSSValueID keyword = identifier_value.GetValueID();
switch (keyword) {
case CSSValueID::kInvalid:
return nullptr;
case CSSValueID::kUltraCondensed:
return CreateFontStretchValue(UltraCondensedWidthValue());
case CSSValueID::kExtraCondensed:
return CreateFontStretchValue(ExtraCondensedWidthValue());
case CSSValueID::kCondensed:
return CreateFontStretchValue(CondensedWidthValue());
case CSSValueID::kSemiCondensed:
return CreateFontStretchValue(SemiCondensedWidthValue());
case CSSValueID::kNormal:
return CreateFontStretchValue(NormalWidthValue());
case CSSValueID::kSemiExpanded:
return CreateFontStretchValue(SemiExpandedWidthValue());
case CSSValueID::kExpanded:
return CreateFontStretchValue(ExpandedWidthValue());
case CSSValueID::kExtraExpanded:
return CreateFontStretchValue(ExtraExpandedWidthValue());
case CSSValueID::kUltraExpanded:
return CreateFontStretchValue(UltraExpandedWidthValue());
default:
NOTREACHED();
return nullptr;
}
}
InterpolationValue
CSSFontStretchInterpolationType::MaybeConvertStandardPropertyUnderlyingValue(
const ComputedStyle& style) const {
return CreateFontStretchValue(style.GetFontStretch());
}
void CSSFontStretchInterpolationType::ApplyStandardPropertyValue(
const InterpolableValue& interpolable_value,
const NonInterpolableValue*,
StyleResolverState& state) const {
state.GetFontBuilder().SetStretch(FontSelectionValue(
clampTo(To<InterpolableNumber>(interpolable_value).Value(), 0.0)));
}
} // namespace blink
|