]>
git.saurik.com Git - wxWidgets.git/blob - src/ribbon/art_internal.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/ribbon/art_internal.cpp
3 // Purpose: Helper functions & classes used by ribbon art providers
4 // Author: Peter Cawley
8 // Copyright: (C) Peter Cawley
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 #include "wx/wxprec.h"
19 #include "wx/ribbon/art.h"
23 #include "wx/ribbon/art_internal.h"
24 #include "wx/ribbon/bar.h"
25 #include "wx/ribbon/buttonbar.h"
26 #include "wx/ribbon/gallery.h"
32 #include "wx/msw/private.h"
35 wxRibbonArtProvider::wxRibbonArtProvider() {}
36 wxRibbonArtProvider::~wxRibbonArtProvider() {}
38 wxColour
wxRibbonInterpolateColour(const wxColour
& start_colour
,
39 const wxColour
& end_colour
,
44 if(position
<= start_position
)
48 if(position
>= end_position
)
52 position
-= start_position
;
53 end_position
-= start_position
;
54 int r
= end_colour
.Red() - start_colour
.Red();
55 int g
= end_colour
.Green() - start_colour
.Green();
56 int b
= end_colour
.Blue() - start_colour
.Blue();
57 r
= start_colour
.Red() + (((r
* position
* 100) / end_position
) / 100);
58 g
= start_colour
.Green() + (((g
* position
* 100) / end_position
) / 100);
59 b
= start_colour
.Blue() + (((b
* position
* 100) / end_position
) / 100);
60 return wxColour(r
, g
, b
);
63 bool wxRibbonCanLabelBreakAtPosition(const wxString
& label
, size_t pos
)
65 return label
[pos
] == ' ';
68 void wxRibbonDrawParallelGradientLines(wxDC
& dc
,
70 const wxPoint
* line_origins
,
76 const wxColour
& start_colour
,
77 const wxColour
& end_colour
)
80 rd
= end_colour
.Red() - start_colour
.Red();
81 gd
= end_colour
.Green() - start_colour
.Green();
82 bd
= end_colour
.Blue() - start_colour
.Blue();
84 for (int step
= 0; step
< numsteps
; ++step
)
88 r
= start_colour
.Red() + (((step
*rd
*100)/numsteps
)/100);
89 g
= start_colour
.Green() + (((step
*gd
*100)/numsteps
)/100);
90 b
= start_colour
.Blue() + (((step
*bd
*100)/numsteps
)/100);
92 wxPen
p(wxColour((unsigned char)r
,
97 for(int n
= 0; n
< nlines
; ++n
)
99 dc
.DrawLine(offset_x
+ line_origins
[n
].x
, offset_y
+ line_origins
[n
].y
,
100 offset_x
+ line_origins
[n
].x
+ stepx
, offset_y
+ line_origins
[n
].y
+ stepy
);
108 wxRibbonHSLColour
wxRibbonShiftLuminance(wxRibbonHSLColour colour
,
112 return colour
.Darker(colour
.luminance
* (1.0f
- amount
));
114 return colour
.Lighter((1.0f
- colour
.luminance
) * (amount
- 1.0f
));
117 wxBitmap
wxRibbonLoadPixmap(const char* const* bits
, wxColour fore
)
119 wxImage xpm
= wxBitmap(bits
).ConvertToImage();
120 xpm
.Replace(255, 0, 255, fore
.Red(), fore
.Green(), fore
.Blue());
121 return wxBitmap(xpm
);
124 wxRibbonHSLColour::wxRibbonHSLColour(const wxColour
& col
)
126 float red
= float(col
.Red()) / 255.0;
127 float green
= float(col
.Green()) / 255.0;
128 float blue
= float(col
.Blue()) / 255.0;
129 float Min
= wxMin(red
, wxMin(green
, blue
));
130 float Max
= wxMax(red
, wxMax(green
, blue
));
131 luminance
= 0.5 * (Max
+ Min
);
134 // colour is a shade of grey
141 saturation
= (Max
- Min
) / (Max
+ Min
);
143 saturation
= (Max
- Min
) / (2.0 - (Max
+ Min
));
147 hue
= 60.0 * (green
- blue
) / (Max
- Min
);
151 else if(Max
== green
)
153 hue
= 60.0 * (blue
- red
) / (Max
- Min
);
158 hue
= 60.0 * (red
- green
) / (Max
- Min
);
164 wxColour
wxRibbonHSLColour::ToRGB() const
166 float _hue
= (hue
- floor(hue
/ 360.0f
) * 360.0f
);
167 float _saturation
= saturation
;
168 float _luminance
= luminance
;
169 if(_saturation
> 1.0) _saturation
= 1.0;
170 if(_saturation
< 0.0) _saturation
= 0.0;
171 if(_luminance
> 1.0) _luminance
= 1.0;
172 if(_luminance
< 0.0) _luminance
= 0.0;
174 float red
, blue
, green
;
175 if(_saturation
== 0.0)
177 // colour is a shade of grey
178 red
= blue
= green
= _luminance
;
182 double tmp2
= (_luminance
< 0.5)
183 ? _luminance
* (1.0 + _saturation
)
184 : (_luminance
+ _saturation
) - (_luminance
* _saturation
);
185 double tmp1
= 2.0 * _luminance
- tmp2
;
187 double tmp3R
= _hue
+ 120.0;
191 red
= tmp1
+ (tmp2
- tmp1
) * tmp3R
/ 60.0;
192 else if(tmp3R
< 180.0)
194 else if(tmp3R
< 240.0)
195 red
= tmp1
+ (tmp2
- tmp1
) * (240.0 - tmp3R
) / 60.0;
203 green
= tmp1
+ (tmp2
- tmp1
) * tmp3G
/ 60.0;
204 else if(tmp3G
< 180.0)
206 else if(tmp3G
< 240.0)
207 green
= tmp1
+ (tmp2
- tmp1
) * (240.0 - tmp3G
) / 60.0;
211 double tmp3B
= _hue
+ 240.0;
215 blue
= tmp1
+ (tmp2
- tmp1
) * tmp3B
/ 60.0;
216 else if(tmp3B
< 180.0)
218 else if(tmp3B
< 240.0)
219 blue
= tmp1
+ (tmp2
- tmp1
) * (240.0 - tmp3B
) / 60.0;
224 (unsigned char)(red
* 255.0),
225 (unsigned char)(green
* 255.0),
226 (unsigned char)(blue
* 255.0));
229 wxRibbonHSLColour
wxRibbonHSLColour::Darker(float delta
) const
231 return Lighter(-delta
);
234 wxRibbonHSLColour
& wxRibbonHSLColour::MakeDarker(float delta
)
240 wxRibbonHSLColour
wxRibbonHSLColour::Lighter(float delta
) const
242 return wxRibbonHSLColour(hue
, saturation
, luminance
+ delta
);
245 wxRibbonHSLColour
wxRibbonHSLColour::Saturated(float delta
) const
247 return wxRibbonHSLColour(hue
, saturation
+ delta
, luminance
);
250 wxRibbonHSLColour
wxRibbonHSLColour::Desaturated(float delta
) const
252 return Saturated(-delta
);
255 wxRibbonHSLColour
wxRibbonHSLColour::ShiftHue(float delta
) const
257 return wxRibbonHSLColour(hue
+ delta
, saturation
, luminance
);
260 #endif // wxUSE_RIBBON