]>
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
7 // Copyright: (C) Peter Cawley
8 // Licence: wxWindows licence
9 ///////////////////////////////////////////////////////////////////////////////
11 #include "wx/wxprec.h"
19 #include "wx/ribbon/art.h"
20 #include "wx/ribbon/art_internal.h"
21 #include "wx/ribbon/bar.h"
22 #include "wx/ribbon/buttonbar.h"
23 #include "wx/ribbon/gallery.h"
30 #include "wx/msw/private.h"
33 wxRibbonArtProvider::wxRibbonArtProvider() {}
34 wxRibbonArtProvider::~wxRibbonArtProvider() {}
36 wxColour
wxRibbonInterpolateColour(const wxColour
& start_colour
,
37 const wxColour
& end_colour
,
42 if(position
<= start_position
)
46 if(position
>= end_position
)
50 position
-= start_position
;
51 end_position
-= start_position
;
52 int r
= end_colour
.Red() - start_colour
.Red();
53 int g
= end_colour
.Green() - start_colour
.Green();
54 int b
= end_colour
.Blue() - start_colour
.Blue();
55 r
= start_colour
.Red() + (((r
* position
* 100) / end_position
) / 100);
56 g
= start_colour
.Green() + (((g
* position
* 100) / end_position
) / 100);
57 b
= start_colour
.Blue() + (((b
* position
* 100) / end_position
) / 100);
58 return wxColour(r
, g
, b
);
61 bool wxRibbonCanLabelBreakAtPosition(const wxString
& label
, size_t pos
)
63 return label
[pos
] == ' ';
66 void wxRibbonDrawParallelGradientLines(wxDC
& dc
,
68 const wxPoint
* line_origins
,
74 const wxColour
& start_colour
,
75 const wxColour
& end_colour
)
78 rd
= end_colour
.Red() - start_colour
.Red();
79 gd
= end_colour
.Green() - start_colour
.Green();
80 bd
= end_colour
.Blue() - start_colour
.Blue();
82 for (int step
= 0; step
< numsteps
; ++step
)
86 r
= start_colour
.Red() + (((step
*rd
*100)/numsteps
)/100);
87 g
= start_colour
.Green() + (((step
*gd
*100)/numsteps
)/100);
88 b
= start_colour
.Blue() + (((step
*bd
*100)/numsteps
)/100);
90 wxPen
p(wxColour((unsigned char)r
,
95 for(int n
= 0; n
< nlines
; ++n
)
97 dc
.DrawLine(offset_x
+ line_origins
[n
].x
, offset_y
+ line_origins
[n
].y
,
98 offset_x
+ line_origins
[n
].x
+ stepx
, offset_y
+ line_origins
[n
].y
+ stepy
);
106 wxRibbonHSLColour
wxRibbonShiftLuminance(wxRibbonHSLColour colour
,
110 return colour
.Darker(colour
.luminance
* (1.0f
- amount
));
112 return colour
.Lighter((1.0f
- colour
.luminance
) * (amount
- 1.0f
));
115 wxBitmap
wxRibbonLoadPixmap(const char* const* bits
, wxColour fore
)
117 wxImage xpm
= wxBitmap(bits
).ConvertToImage();
118 xpm
.Replace(255, 0, 255, fore
.Red(), fore
.Green(), fore
.Blue());
119 return wxBitmap(xpm
);
122 wxRibbonHSLColour::wxRibbonHSLColour(const wxColour
& col
)
124 float red
= float(col
.Red()) / 255.0;
125 float green
= float(col
.Green()) / 255.0;
126 float blue
= float(col
.Blue()) / 255.0;
127 float Min
= wxMin(red
, wxMin(green
, blue
));
128 float Max
= wxMax(red
, wxMax(green
, blue
));
129 luminance
= 0.5 * (Max
+ Min
);
132 // colour is a shade of grey
139 saturation
= (Max
- Min
) / (Max
+ Min
);
141 saturation
= (Max
- Min
) / (2.0 - (Max
+ Min
));
145 hue
= 60.0 * (green
- blue
) / (Max
- Min
);
149 else if(Max
== green
)
151 hue
= 60.0 * (blue
- red
) / (Max
- Min
);
156 hue
= 60.0 * (red
- green
) / (Max
- Min
);
162 wxColour
wxRibbonHSLColour::ToRGB() const
164 float _hue
= (hue
- floor(hue
/ 360.0f
) * 360.0f
);
165 float _saturation
= saturation
;
166 float _luminance
= luminance
;
167 if(_saturation
> 1.0) _saturation
= 1.0;
168 if(_saturation
< 0.0) _saturation
= 0.0;
169 if(_luminance
> 1.0) _luminance
= 1.0;
170 if(_luminance
< 0.0) _luminance
= 0.0;
172 float red
, blue
, green
;
173 if(_saturation
== 0.0)
175 // colour is a shade of grey
176 red
= blue
= green
= _luminance
;
180 double tmp2
= (_luminance
< 0.5)
181 ? _luminance
* (1.0 + _saturation
)
182 : (_luminance
+ _saturation
) - (_luminance
* _saturation
);
183 double tmp1
= 2.0 * _luminance
- tmp2
;
185 double tmp3R
= _hue
+ 120.0;
189 red
= tmp1
+ (tmp2
- tmp1
) * tmp3R
/ 60.0;
190 else if(tmp3R
< 180.0)
192 else if(tmp3R
< 240.0)
193 red
= tmp1
+ (tmp2
- tmp1
) * (240.0 - tmp3R
) / 60.0;
201 green
= tmp1
+ (tmp2
- tmp1
) * tmp3G
/ 60.0;
202 else if(tmp3G
< 180.0)
204 else if(tmp3G
< 240.0)
205 green
= tmp1
+ (tmp2
- tmp1
) * (240.0 - tmp3G
) / 60.0;
209 double tmp3B
= _hue
+ 240.0;
213 blue
= tmp1
+ (tmp2
- tmp1
) * tmp3B
/ 60.0;
214 else if(tmp3B
< 180.0)
216 else if(tmp3B
< 240.0)
217 blue
= tmp1
+ (tmp2
- tmp1
) * (240.0 - tmp3B
) / 60.0;
222 (unsigned char)(red
* 255.0),
223 (unsigned char)(green
* 255.0),
224 (unsigned char)(blue
* 255.0));
227 wxRibbonHSLColour
wxRibbonHSLColour::Darker(float delta
) const
229 return Lighter(-delta
);
232 wxRibbonHSLColour
& wxRibbonHSLColour::MakeDarker(float delta
)
238 wxRibbonHSLColour
wxRibbonHSLColour::Lighter(float delta
) const
240 return wxRibbonHSLColour(hue
, saturation
, luminance
+ delta
);
243 wxRibbonHSLColour
wxRibbonHSLColour::Saturated(float delta
) const
245 return wxRibbonHSLColour(hue
, saturation
+ delta
, luminance
);
248 wxRibbonHSLColour
wxRibbonHSLColour::Desaturated(float delta
) const
250 return Saturated(-delta
);
253 wxRibbonHSLColour
wxRibbonHSLColour::ShiftHue(float delta
) const
255 return wxRibbonHSLColour(hue
+ delta
, saturation
, luminance
);
258 #endif // wxUSE_RIBBON