Skip to content

Commit 990fc68

Browse files
ranjeshjKeith Mahoney
and
Keith Mahoney
authored
move RadialGradientBrush from preview to public (#2192)
* make RadialGradientBrush public * Revert "Refactor loading of AdditionalStyles.xaml file (#2136)" This reverts commit 290b432. * Make GradientOrigin always be relative to top left of the element. * Revert "Revert "Refactor loading of AdditionalStyles.xaml file (#2136)"" This reverts commit 68295b9. * Change EllipseCenter to Center and EllipseRadius to RadiusX/radiusY to match with WPF. Co-authored-by: Keith Mahoney <[email protected]>
1 parent 20931ca commit 990fc68

7 files changed

+248
-96
lines changed

dev/Generated/RadialGradientBrush.properties.cpp

+70-39
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@ namespace winrt::Microsoft::UI::Xaml::Media
1313

1414
#include "RadialGradientBrush.g.cpp"
1515

16-
GlobalDependencyProperty RadialGradientBrushProperties::s_EllipseCenterProperty{ nullptr };
17-
GlobalDependencyProperty RadialGradientBrushProperties::s_EllipseRadiusProperty{ nullptr };
16+
GlobalDependencyProperty RadialGradientBrushProperties::s_CenterProperty{ nullptr };
1817
GlobalDependencyProperty RadialGradientBrushProperties::s_GradientOriginProperty{ nullptr };
1918
GlobalDependencyProperty RadialGradientBrushProperties::s_InterpolationSpaceProperty{ nullptr };
2019
GlobalDependencyProperty RadialGradientBrushProperties::s_MappingModeProperty{ nullptr };
20+
GlobalDependencyProperty RadialGradientBrushProperties::s_RadiusXProperty{ nullptr };
21+
GlobalDependencyProperty RadialGradientBrushProperties::s_RadiusYProperty{ nullptr };
2122
GlobalDependencyProperty RadialGradientBrushProperties::s_SpreadMethodProperty{ nullptr };
2223

2324
RadialGradientBrushProperties::RadialGradientBrushProperties()
@@ -27,27 +28,16 @@ RadialGradientBrushProperties::RadialGradientBrushProperties()
2728

2829
void RadialGradientBrushProperties::EnsureProperties()
2930
{
30-
if (!s_EllipseCenterProperty)
31+
if (!s_CenterProperty)
3132
{
32-
s_EllipseCenterProperty =
33+
s_CenterProperty =
3334
InitializeDependencyProperty(
34-
L"EllipseCenter",
35+
L"Center",
3536
winrt::name_of<winrt::Point>(),
3637
winrt::name_of<winrt::RadialGradientBrush>(),
3738
false /* isAttached */,
3839
ValueHelper<winrt::Point>::BoxValueIfNecessary(winrt::Point(0.5,0.5)),
39-
winrt::PropertyChangedCallback(&OnEllipseCenterPropertyChanged));
40-
}
41-
if (!s_EllipseRadiusProperty)
42-
{
43-
s_EllipseRadiusProperty =
44-
InitializeDependencyProperty(
45-
L"EllipseRadius",
46-
winrt::name_of<winrt::Point>(),
47-
winrt::name_of<winrt::RadialGradientBrush>(),
48-
false /* isAttached */,
49-
ValueHelper<winrt::Point>::BoxValueIfNecessary(winrt::Point(0.5,0.5)),
50-
winrt::PropertyChangedCallback(&OnEllipseRadiusPropertyChanged));
40+
winrt::PropertyChangedCallback(&OnCenterPropertyChanged));
5141
}
5242
if (!s_GradientOriginProperty)
5343
{
@@ -82,6 +72,28 @@ void RadialGradientBrushProperties::EnsureProperties()
8272
ValueHelper<winrt::BrushMappingMode>::BoxValueIfNecessary(winrt::BrushMappingMode::RelativeToBoundingBox),
8373
winrt::PropertyChangedCallback(&OnMappingModePropertyChanged));
8474
}
75+
if (!s_RadiusXProperty)
76+
{
77+
s_RadiusXProperty =
78+
InitializeDependencyProperty(
79+
L"RadiusX",
80+
winrt::name_of<double>(),
81+
winrt::name_of<winrt::RadialGradientBrush>(),
82+
false /* isAttached */,
83+
ValueHelper<double>::BoxValueIfNecessary(0.5),
84+
winrt::PropertyChangedCallback(&OnRadiusXPropertyChanged));
85+
}
86+
if (!s_RadiusYProperty)
87+
{
88+
s_RadiusYProperty =
89+
InitializeDependencyProperty(
90+
L"RadiusY",
91+
winrt::name_of<double>(),
92+
winrt::name_of<winrt::RadialGradientBrush>(),
93+
false /* isAttached */,
94+
ValueHelper<double>::BoxValueIfNecessary(0.5),
95+
winrt::PropertyChangedCallback(&OnRadiusYPropertyChanged));
96+
}
8597
if (!s_SpreadMethodProperty)
8698
{
8799
s_SpreadMethodProperty =
@@ -97,28 +109,21 @@ void RadialGradientBrushProperties::EnsureProperties()
97109

98110
void RadialGradientBrushProperties::ClearProperties()
99111
{
100-
s_EllipseCenterProperty = nullptr;
101-
s_EllipseRadiusProperty = nullptr;
112+
s_CenterProperty = nullptr;
102113
s_GradientOriginProperty = nullptr;
103114
s_InterpolationSpaceProperty = nullptr;
104115
s_MappingModeProperty = nullptr;
116+
s_RadiusXProperty = nullptr;
117+
s_RadiusYProperty = nullptr;
105118
s_SpreadMethodProperty = nullptr;
106119
}
107120

108-
void RadialGradientBrushProperties::OnEllipseCenterPropertyChanged(
109-
winrt::DependencyObject const& sender,
110-
winrt::DependencyPropertyChangedEventArgs const& args)
111-
{
112-
auto owner = sender.as<winrt::RadialGradientBrush>();
113-
winrt::get_self<RadialGradientBrush>(owner)->OnEllipseCenterPropertyChanged(args);
114-
}
115-
116-
void RadialGradientBrushProperties::OnEllipseRadiusPropertyChanged(
121+
void RadialGradientBrushProperties::OnCenterPropertyChanged(
117122
winrt::DependencyObject const& sender,
118123
winrt::DependencyPropertyChangedEventArgs const& args)
119124
{
120125
auto owner = sender.as<winrt::RadialGradientBrush>();
121-
winrt::get_self<RadialGradientBrush>(owner)->OnEllipseRadiusPropertyChanged(args);
126+
winrt::get_self<RadialGradientBrush>(owner)->OnCenterPropertyChanged(args);
122127
}
123128

124129
void RadialGradientBrushProperties::OnGradientOriginPropertyChanged(
@@ -145,32 +150,38 @@ void RadialGradientBrushProperties::OnMappingModePropertyChanged(
145150
winrt::get_self<RadialGradientBrush>(owner)->OnMappingModePropertyChanged(args);
146151
}
147152

148-
void RadialGradientBrushProperties::OnSpreadMethodPropertyChanged(
153+
void RadialGradientBrushProperties::OnRadiusXPropertyChanged(
149154
winrt::DependencyObject const& sender,
150155
winrt::DependencyPropertyChangedEventArgs const& args)
151156
{
152157
auto owner = sender.as<winrt::RadialGradientBrush>();
153-
winrt::get_self<RadialGradientBrush>(owner)->OnSpreadMethodPropertyChanged(args);
158+
winrt::get_self<RadialGradientBrush>(owner)->OnRadiusXPropertyChanged(args);
154159
}
155160

156-
void RadialGradientBrushProperties::EllipseCenter(winrt::Point const& value)
161+
void RadialGradientBrushProperties::OnRadiusYPropertyChanged(
162+
winrt::DependencyObject const& sender,
163+
winrt::DependencyPropertyChangedEventArgs const& args)
157164
{
158-
static_cast<RadialGradientBrush*>(this)->SetValue(s_EllipseCenterProperty, ValueHelper<winrt::Point>::BoxValueIfNecessary(value));
165+
auto owner = sender.as<winrt::RadialGradientBrush>();
166+
winrt::get_self<RadialGradientBrush>(owner)->OnRadiusYPropertyChanged(args);
159167
}
160168

161-
winrt::Point RadialGradientBrushProperties::EllipseCenter()
169+
void RadialGradientBrushProperties::OnSpreadMethodPropertyChanged(
170+
winrt::DependencyObject const& sender,
171+
winrt::DependencyPropertyChangedEventArgs const& args)
162172
{
163-
return ValueHelper<winrt::Point>::CastOrUnbox(static_cast<RadialGradientBrush*>(this)->GetValue(s_EllipseCenterProperty));
173+
auto owner = sender.as<winrt::RadialGradientBrush>();
174+
winrt::get_self<RadialGradientBrush>(owner)->OnSpreadMethodPropertyChanged(args);
164175
}
165176

166-
void RadialGradientBrushProperties::EllipseRadius(winrt::Point const& value)
177+
void RadialGradientBrushProperties::Center(winrt::Point const& value)
167178
{
168-
static_cast<RadialGradientBrush*>(this)->SetValue(s_EllipseRadiusProperty, ValueHelper<winrt::Point>::BoxValueIfNecessary(value));
179+
static_cast<RadialGradientBrush*>(this)->SetValue(s_CenterProperty, ValueHelper<winrt::Point>::BoxValueIfNecessary(value));
169180
}
170181

171-
winrt::Point RadialGradientBrushProperties::EllipseRadius()
182+
winrt::Point RadialGradientBrushProperties::Center()
172183
{
173-
return ValueHelper<winrt::Point>::CastOrUnbox(static_cast<RadialGradientBrush*>(this)->GetValue(s_EllipseRadiusProperty));
184+
return ValueHelper<winrt::Point>::CastOrUnbox(static_cast<RadialGradientBrush*>(this)->GetValue(s_CenterProperty));
174185
}
175186

176187
void RadialGradientBrushProperties::GradientOrigin(winrt::Point const& value)
@@ -203,6 +214,26 @@ winrt::BrushMappingMode RadialGradientBrushProperties::MappingMode()
203214
return ValueHelper<winrt::BrushMappingMode>::CastOrUnbox(static_cast<RadialGradientBrush*>(this)->GetValue(s_MappingModeProperty));
204215
}
205216

217+
void RadialGradientBrushProperties::RadiusX(double value)
218+
{
219+
static_cast<RadialGradientBrush*>(this)->SetValue(s_RadiusXProperty, ValueHelper<double>::BoxValueIfNecessary(value));
220+
}
221+
222+
double RadialGradientBrushProperties::RadiusX()
223+
{
224+
return ValueHelper<double>::CastOrUnbox(static_cast<RadialGradientBrush*>(this)->GetValue(s_RadiusXProperty));
225+
}
226+
227+
void RadialGradientBrushProperties::RadiusY(double value)
228+
{
229+
static_cast<RadialGradientBrush*>(this)->SetValue(s_RadiusYProperty, ValueHelper<double>::BoxValueIfNecessary(value));
230+
}
231+
232+
double RadialGradientBrushProperties::RadiusY()
233+
{
234+
return ValueHelper<double>::CastOrUnbox(static_cast<RadialGradientBrush*>(this)->GetValue(s_RadiusYProperty));
235+
}
236+
206237
void RadialGradientBrushProperties::SpreadMethod(winrt::GradientSpreadMethod const& value)
207238
{
208239
static_cast<RadialGradientBrush*>(this)->SetValue(s_SpreadMethodProperty, ValueHelper<winrt::GradientSpreadMethod>::BoxValueIfNecessary(value));

dev/Generated/RadialGradientBrush.properties.h

+23-14
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,8 @@ class RadialGradientBrushProperties
99
public:
1010
RadialGradientBrushProperties();
1111

12-
void EllipseCenter(winrt::Point const& value);
13-
winrt::Point EllipseCenter();
14-
15-
void EllipseRadius(winrt::Point const& value);
16-
winrt::Point EllipseRadius();
12+
void Center(winrt::Point const& value);
13+
winrt::Point Center();
1714

1815
void GradientOrigin(winrt::Point const& value);
1916
winrt::Point GradientOrigin();
@@ -24,31 +21,35 @@ class RadialGradientBrushProperties
2421
void MappingMode(winrt::BrushMappingMode const& value);
2522
winrt::BrushMappingMode MappingMode();
2623

24+
void RadiusX(double value);
25+
double RadiusX();
26+
27+
void RadiusY(double value);
28+
double RadiusY();
29+
2730
void SpreadMethod(winrt::GradientSpreadMethod const& value);
2831
winrt::GradientSpreadMethod SpreadMethod();
2932

30-
static winrt::DependencyProperty EllipseCenterProperty() { return s_EllipseCenterProperty; }
31-
static winrt::DependencyProperty EllipseRadiusProperty() { return s_EllipseRadiusProperty; }
33+
static winrt::DependencyProperty CenterProperty() { return s_CenterProperty; }
3234
static winrt::DependencyProperty GradientOriginProperty() { return s_GradientOriginProperty; }
3335
static winrt::DependencyProperty InterpolationSpaceProperty() { return s_InterpolationSpaceProperty; }
3436
static winrt::DependencyProperty MappingModeProperty() { return s_MappingModeProperty; }
37+
static winrt::DependencyProperty RadiusXProperty() { return s_RadiusXProperty; }
38+
static winrt::DependencyProperty RadiusYProperty() { return s_RadiusYProperty; }
3539
static winrt::DependencyProperty SpreadMethodProperty() { return s_SpreadMethodProperty; }
3640

37-
static GlobalDependencyProperty s_EllipseCenterProperty;
38-
static GlobalDependencyProperty s_EllipseRadiusProperty;
41+
static GlobalDependencyProperty s_CenterProperty;
3942
static GlobalDependencyProperty s_GradientOriginProperty;
4043
static GlobalDependencyProperty s_InterpolationSpaceProperty;
4144
static GlobalDependencyProperty s_MappingModeProperty;
45+
static GlobalDependencyProperty s_RadiusXProperty;
46+
static GlobalDependencyProperty s_RadiusYProperty;
4247
static GlobalDependencyProperty s_SpreadMethodProperty;
4348

4449
static void EnsureProperties();
4550
static void ClearProperties();
4651

47-
static void OnEllipseCenterPropertyChanged(
48-
winrt::DependencyObject const& sender,
49-
winrt::DependencyPropertyChangedEventArgs const& args);
50-
51-
static void OnEllipseRadiusPropertyChanged(
52+
static void OnCenterPropertyChanged(
5253
winrt::DependencyObject const& sender,
5354
winrt::DependencyPropertyChangedEventArgs const& args);
5455

@@ -64,6 +65,14 @@ class RadialGradientBrushProperties
6465
winrt::DependencyObject const& sender,
6566
winrt::DependencyPropertyChangedEventArgs const& args);
6667

68+
static void OnRadiusXPropertyChanged(
69+
winrt::DependencyObject const& sender,
70+
winrt::DependencyPropertyChangedEventArgs const& args);
71+
72+
static void OnRadiusYPropertyChanged(
73+
winrt::DependencyObject const& sender,
74+
winrt::DependencyPropertyChangedEventArgs const& args);
75+
6776
static void OnSpreadMethodPropertyChanged(
6877
winrt::DependencyObject const& sender,
6978
winrt::DependencyPropertyChangedEventArgs const& args);

dev/RadialGradientBrush/RadialGradientBrush.cpp

+35-15
Original file line numberDiff line numberDiff line change
@@ -64,19 +64,27 @@ void RadialGradientBrush::OnDisconnected()
6464
}
6565
}
6666

67-
void RadialGradientBrush::OnEllipseCenterPropertyChanged(const winrt::DependencyPropertyChangedEventArgs& args)
67+
void RadialGradientBrush::OnCenterPropertyChanged(const winrt::DependencyPropertyChangedEventArgs& args)
6868
{
6969
if (SharedHelpers::IsCompositionRadialGradientBrushAvailable())
7070
{
71-
UpdateCompositionGradientEllipseCenter();
71+
UpdateCompositionGradientCenter();
7272
}
7373
}
7474

75-
void RadialGradientBrush::OnEllipseRadiusPropertyChanged(const winrt::DependencyPropertyChangedEventArgs& args)
75+
void RadialGradientBrush::OnRadiusXPropertyChanged(const winrt::DependencyPropertyChangedEventArgs& args)
7676
{
7777
if (SharedHelpers::IsCompositionRadialGradientBrushAvailable())
7878
{
79-
UpdateCompositionGradientEllipseRadius();
79+
UpdateCompositionGradientRadius();
80+
}
81+
}
82+
83+
void RadialGradientBrush::OnRadiusYPropertyChanged(const winrt::DependencyPropertyChangedEventArgs& args)
84+
{
85+
if (SharedHelpers::IsCompositionRadialGradientBrushAvailable())
86+
{
87+
UpdateCompositionGradientRadius();
8088
}
8189
}
8290

@@ -136,8 +144,8 @@ void RadialGradientBrush::EnsureCompositionBrush()
136144
// If CompositionRadialGradientBrush is available then use it to render a gradient.
137145
m_brush = compositor.CreateRadialGradientBrush();
138146

139-
UpdateCompositionGradientEllipseCenter();
140-
UpdateCompositionGradientEllipseRadius();
147+
UpdateCompositionGradientCenter();
148+
UpdateCompositionGradientRadius();
141149
UpdateCompositionGradientOrigin();
142150
UpdateCompositionGradientStops();
143151
UpdateCompositionGradientMappingMode();
@@ -155,25 +163,28 @@ void RadialGradientBrush::EnsureCompositionBrush()
155163
}
156164
}
157165

158-
void RadialGradientBrush::UpdateCompositionGradientEllipseCenter()
166+
void RadialGradientBrush::UpdateCompositionGradientCenter()
159167
{
160168
MUX_ASSERT(SharedHelpers::IsCompositionRadialGradientBrushAvailable());
161169

162170
if (const auto compositionGradientBrush = m_brush.try_as<winrt::CompositionRadialGradientBrush>())
163171
{
164-
const auto ellipseCenter = EllipseCenter();
165-
compositionGradientBrush.EllipseCenter(winrt::float2(ellipseCenter.X, ellipseCenter.Y));
172+
const auto center = Center();
173+
compositionGradientBrush.EllipseCenter(winrt::float2(center.X, center.Y));
174+
175+
// Changing the center affects the origin in the comp brush because we are translating from
176+
// Origin to offset.
177+
UpdateCompositionGradientOrigin();
166178
}
167179
}
168180

169-
void RadialGradientBrush::UpdateCompositionGradientEllipseRadius()
181+
void RadialGradientBrush::UpdateCompositionGradientRadius()
170182
{
171183
MUX_ASSERT(SharedHelpers::IsCompositionRadialGradientBrushAvailable());
172184

173185
if (const auto compositionGradientBrush = m_brush.try_as<winrt::CompositionRadialGradientBrush>())
174186
{
175-
const auto ellipseRadius = EllipseRadius();
176-
compositionGradientBrush.EllipseRadius(winrt::float2(ellipseRadius.X, ellipseRadius.Y));
187+
compositionGradientBrush.EllipseRadius(winrt::float2(static_cast<float>(RadiusX()), static_cast<float>(RadiusY())));
177188
}
178189
}
179190

@@ -204,9 +215,18 @@ void RadialGradientBrush::UpdateCompositionGradientOrigin()
204215
if (const auto compositionGradientBrush = m_brush.try_as<winrt::CompositionRadialGradientBrush>())
205216
{
206217
const auto gradientOrigin = GradientOrigin();
207-
// This sets the gradient offset center to the top left corner
208-
// Top Left is (-0.5,-0.5), center is (0,0)
209-
compositionGradientBrush.GradientOriginOffset(winrt::float2(gradientOrigin.X - 0.5f, gradientOrigin.Y - 0.5f));
218+
const auto center = Center();
219+
// Comp uses offset, WinUI will follow WPF and use bounds relative to the element in all mapping modes.
220+
// If ElementWidth=100 ElementHeight=100
221+
// Relative mode
222+
// TopLeft of element = 0,0
223+
// Center of element = .5,.5
224+
// BottomRight of element = 1,1
225+
// Absolute mode
226+
// TopLeft of element = 0,0
227+
// Center of element = 50,50
228+
// BottomRight of element = 100,100
229+
compositionGradientBrush.GradientOriginOffset(winrt::float2(gradientOrigin.X - center.X, gradientOrigin.Y - center.Y));
210230
}
211231
}
212232

dev/RadialGradientBrush/RadialGradientBrush.h

+5-4
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ class RadialGradientBrush :
2323
void OnConnected();
2424
void OnDisconnected();
2525

26-
void OnEllipseCenterPropertyChanged(const winrt::DependencyPropertyChangedEventArgs& args);
27-
void OnEllipseRadiusPropertyChanged(const winrt::DependencyPropertyChangedEventArgs& args);
26+
void OnCenterPropertyChanged(const winrt::DependencyPropertyChangedEventArgs& args);
27+
void OnRadiusXPropertyChanged(const winrt::DependencyPropertyChangedEventArgs& args);
28+
void OnRadiusYPropertyChanged(const winrt::DependencyPropertyChangedEventArgs& args);
2829
void OnGradientOriginPropertyChanged(const winrt::DependencyPropertyChangedEventArgs& args);
2930
void OnMappingModePropertyChanged(const winrt::DependencyPropertyChangedEventArgs& args);
3031
void OnInterpolationSpacePropertyChanged(const winrt::DependencyPropertyChangedEventArgs& args);
@@ -43,8 +44,8 @@ class RadialGradientBrush :
4344

4445
void EnsureCompositionBrush();
4546

46-
void UpdateCompositionGradientEllipseCenter();
47-
void UpdateCompositionGradientEllipseRadius();
47+
void UpdateCompositionGradientCenter();
48+
void UpdateCompositionGradientRadius();
4849
void UpdateCompositionGradientMappingMode();
4950
void UpdateCompositionGradientOrigin();
5051
void UpdateCompositionGradientStops();

0 commit comments

Comments
 (0)