]>
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"
20 #include "wx/ribbon/art.h"
21 #include "wx/ribbon/art_internal.h"
22 #include "wx/ribbon/bar.h"
23 #include "wx/ribbon/buttonbar.h"
24 #include "wx/ribbon/gallery.h"
31 #include "wx/msw/private.h"
34 wxRibbonArtProvider::wxRibbonArtProvider() {}
35 wxRibbonArtProvider::~wxRibbonArtProvider() {}
37 wxColour
wxRibbonInterpolateColour(const wxColour
& start_colour
,
38 const wxColour
& end_colour
,
43 if(position
<= start_position
)
47 if(position
>= end_position
)
51 position
-= start_position
;
52 end_position
-= start_position
;
53 int r
= end_colour
.Red() - start_colour
.Red();
54 int g
= end_colour
.Green() - start_colour
.Green();
55 int b
= end_colour
.Blue() - start_colour
.Blue();
56 r
= start_colour
.Red() + (((r
* position
* 100) / end_position
) / 100);
57 g
= start_colour
.Green() + (((g
* position
* 100) / end_position
) / 100);
58 b
= start_colour
.Blue() + (((b
* position
* 100) / end_position
) / 100);
59 return wxColour(r
, g
, b
);
62 bool wxRibbonCanLabelBreakAtPosition(const wxString
& label
, size_t pos
)
64 return label
[pos
] == ' ';
67 void wxRibbonDrawParallelGradientLines(wxDC
& dc
,
69 const wxPoint
* line_origins
,
75 const wxColour
& start_colour
,
76 const wxColour
& end_colour
)
79 rd
= end_colour
.Red() - start_colour
.Red();
80 gd
= end_colour
.Green() - start_colour
.Green();
81 bd
= end_colour
.Blue() - start_colour
.Blue();
83 for (int step
= 0; step
< numsteps
; ++step
)
87 r
= start_colour
.Red() + (((step
*rd
*100)/numsteps
)/100);
88 g
= start_colour
.Green() + (((step
*gd
*100)/numsteps
)/100);
89 b
= start_colour
.Blue() + (((step
*bd
*100)/numsteps
)/100);
91 wxPen
p(wxColour((unsigned char)r
,
96 for(int n
= 0; n
< nlines
; ++n
)
98 dc
.DrawLine(offset_x
+ line_origins
[n
].x
, offset_y
+ line_origins
[n
].y
,
99 offset_x
+ line_origins
[n
].x
+ stepx
, offset_y
+ line_origins
[n
].y
+ stepy
);
107 wxRibbonHSLColour
wxRibbonShiftLuminance(wxRibbonHSLColour colour
,
111 return colour
.Darker(colour
.luminance
* (1.0f
- amount
));
113 return colour
.Lighter((1.0f
- colour
.luminance
) * (amount
- 1.0f
));
116 wxBitmap
wxRibbonLoadPixmap(const char* const* bits
, wxColour fore
)
118 wxImage xpm
= wxBitmap(bits
).ConvertToImage();
119 xpm
.Replace(255, 0, 255, fore
.Red(), fore
.Green(), fore
.Blue());
120 return wxBitmap(xpm
);
123 wxRibbonHSLColour::wxRibbonHSLColour(const wxColour
& col
)
125 float red
= float(col
.Red()) / 255.0;
126 float green
= float(col
.Green()) / 255.0;
127 float blue
= float(col
.Blue()) / 255.0;
128 float Min
= wxMin(red
, wxMin(green
, blue
));
129 float Max
= wxMax(red
, wxMax(green
, blue
));
130 luminance
= 0.5 * (Max
+ Min
);
133 // colour is a shade of grey
140 saturation
= (Max
- Min
) / (Max
+ Min
);
142 saturation
= (Max
- Min
) / (2.0 - (Max
+ Min
));
146 hue
= 60.0 * (green
- blue
) / (Max
- Min
);
150 else if(Max
== green
)
152 hue
= 60.0 * (blue
- red
) / (Max
- Min
);
157 hue
= 60.0 * (red
- green
) / (Max
- Min
);
163 wxColour
wxRibbonHSLColour::ToRGB() const
165 float _hue
= (hue
- floor(hue
/ 360.0f
) * 360.0f
);
166 float _saturation
= saturation
;
167 float _luminance
= luminance
;
168 if(_saturation
> 1.0) _saturation
= 1.0;
169 if(_saturation
< 0.0) _saturation
= 0.0;
170 if(_luminance
> 1.0) _luminance
= 1.0;
171 if(_luminance
< 0.0) _luminance
= 0.0;
173 float red
, blue
, green
;
174 if(_saturation
== 0.0)
176 // colour is a shade of grey
177 red
= blue
= green
= _luminance
;
181 double tmp2
= (_luminance
< 0.5)
182 ? _luminance
* (1.0 + _saturation
)
183 : (_luminance
+ _saturation
) - (_luminance
* _saturation
);
184 double tmp1
= 2.0 * _luminance
- tmp2
;
186 double tmp3R
= _hue
+ 120.0;
190 red
= tmp1
+ (tmp2
- tmp1
) * tmp3R
/ 60.0;
191 else if(tmp3R
< 180.0)
193 else if(tmp3R
< 240.0)
194 red
= tmp1
+ (tmp2
- tmp1
) * (240.0 - tmp3R
) / 60.0;
202 green
= tmp1
+ (tmp2
- tmp1
) * tmp3G
/ 60.0;
203 else if(tmp3G
< 180.0)
205 else if(tmp3G
< 240.0)
206 green
= tmp1
+ (tmp2
- tmp1
) * (240.0 - tmp3G
) / 60.0;
210 double tmp3B
= _hue
+ 240.0;
214 blue
= tmp1
+ (tmp2
- tmp1
) * tmp3B
/ 60.0;
215 else if(tmp3B
< 180.0)
217 else if(tmp3B
< 240.0)
218 blue
= tmp1
+ (tmp2
- tmp1
) * (240.0 - tmp3B
) / 60.0;
223 (unsigned char)(red
* 255.0),
224 (unsigned char)(green
* 255.0),
225 (unsigned char)(blue
* 255.0));
228 wxRibbonHSLColour
wxRibbonHSLColour::Darker(float delta
) const
230 return Lighter(-delta
);
233 wxRibbonHSLColour
& wxRibbonHSLColour::MakeDarker(float delta
)
239 wxRibbonHSLColour
wxRibbonHSLColour::Lighter(float delta
) const
241 return wxRibbonHSLColour(hue
, saturation
, luminance
+ delta
);
244 wxRibbonHSLColour
wxRibbonHSLColour::Saturated(float delta
) const
246 return wxRibbonHSLColour(hue
, saturation
+ delta
, luminance
);
249 wxRibbonHSLColour
wxRibbonHSLColour::Desaturated(float delta
) const
251 return Saturated(-delta
);
254 wxRibbonHSLColour
wxRibbonHSLColour::ShiftHue(float delta
) const
256 return wxRibbonHSLColour(hue
+ delta
, saturation
, luminance
);
259 #endif // wxUSE_RIBBON