Files
wxWidgets/src/ribbon/art_internal.cpp
Vadim Zeitlin ce00f59b5b No changes whatsoever, just remove trailing whitespace.
There are no real changes in this commit but it removes all trailing white
space from our source files. This avoids problems when applying patches and
making diffs and it would be nice to prevent it from reappearing.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65680 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2010-09-30 11:44:45 +00:00

260 lines
7.4 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// Name: src/ribbon/art_internal.cpp
// Purpose: Helper functions & classes used by ribbon art providers
// Author: Peter Cawley
// Modified by:
// Created: 2009-08-04
// RCS-ID: $Id$
// Copyright: (C) Peter Cawley
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#if wxUSE_RIBBON
#include "wx/ribbon/art.h"
#include "wx/ribbon/art_internal.h"
#include "wx/ribbon/bar.h"
#include "wx/ribbon/buttonbar.h"
#include "wx/ribbon/gallery.h"
#ifndef WX_PRECOMP
#include "wx/dc.h"
#endif
#ifdef __WXMSW__
#include "wx/msw/private.h"
#endif
wxRibbonArtProvider::wxRibbonArtProvider() {}
wxRibbonArtProvider::~wxRibbonArtProvider() {}
wxColour wxRibbonInterpolateColour(const wxColour& start_colour,
const wxColour& end_colour,
int position,
int start_position,
int end_position)
{
if(position <= start_position)
{
return start_colour;
}
if(position >= end_position)
{
return end_colour;
}
position -= start_position;
end_position -= start_position;
int r = end_colour.Red() - start_colour.Red();
int g = end_colour.Green() - start_colour.Green();
int b = end_colour.Blue() - start_colour.Blue();
r = start_colour.Red() + (((r * position * 100) / end_position) / 100);
g = start_colour.Green() + (((g * position * 100) / end_position) / 100);
b = start_colour.Blue() + (((b * position * 100) / end_position) / 100);
return wxColour(r, g, b);
}
bool wxRibbonCanLabelBreakAtPosition(const wxString& label, size_t pos)
{
return label[pos] == ' ';
}
void wxRibbonDrawParallelGradientLines(wxDC& dc,
int nlines,
const wxPoint* line_origins,
int stepx,
int stepy,
int numsteps,
int offset_x,
int offset_y,
const wxColour& start_colour,
const wxColour& end_colour)
{
int rd, gd, bd;
rd = end_colour.Red() - start_colour.Red();
gd = end_colour.Green() - start_colour.Green();
bd = end_colour.Blue() - start_colour.Blue();
for (int step = 0; step < numsteps; ++step)
{
int r,g,b;
r = start_colour.Red() + (((step*rd*100)/numsteps)/100);
g = start_colour.Green() + (((step*gd*100)/numsteps)/100);
b = start_colour.Blue() + (((step*bd*100)/numsteps)/100);
wxPen p(wxColour((unsigned char)r,
(unsigned char)g,
(unsigned char)b));
dc.SetPen(p);
for(int n = 0; n < nlines; ++n)
{
dc.DrawLine(offset_x + line_origins[n].x, offset_y + line_origins[n].y,
offset_x + line_origins[n].x + stepx, offset_y + line_origins[n].y + stepy);
}
offset_x += stepx;
offset_y += stepy;
}
}
wxRibbonHSLColour wxRibbonShiftLuminance(wxRibbonHSLColour colour,
float amount)
{
if(amount <= 1.0f)
return colour.Darker(colour.luminance * (1.0f - amount));
else
return colour.Lighter((1.0f - colour.luminance) * (amount - 1.0f));
}
wxBitmap wxRibbonLoadPixmap(const char* const* bits, wxColour fore)
{
wxImage xpm = wxBitmap(bits).ConvertToImage();
xpm.Replace(255, 0, 255, fore.Red(), fore.Green(), fore.Blue());
return wxBitmap(xpm);
}
wxRibbonHSLColour::wxRibbonHSLColour(const wxColour& col)
{
float red = float(col.Red()) / 255.0;
float green = float(col.Green()) / 255.0;
float blue = float(col.Blue()) / 255.0;
float Min = wxMin(red, wxMin(green, blue));
float Max = wxMax(red, wxMax(green, blue));
luminance = 0.5 * (Max + Min);
if (Min == Max)
{
// colour is a shade of grey
hue = 0.0;
saturation = 0.0;
}
else
{
if(luminance <= 0.5)
saturation = (Max - Min) / (Max + Min);
else
saturation = (Max - Min) / (2.0 - (Max + Min));
if(Max == red)
{
hue = 60.0 * (green - blue) / (Max - Min);
if(hue < 0.0)
hue += 360.0;
}
else if(Max == green)
{
hue = 60.0 * (blue - red) / (Max - Min);
hue += 120.0;
}
else // Max == blue
{
hue = 60.0 * (red - green) / (Max - Min);
hue += 240.0;
}
}
}
wxColour wxRibbonHSLColour::ToRGB() const
{
float _hue = (hue - floor(hue / 360.0f) * 360.0f);
float _saturation = saturation;
float _luminance = luminance;
if(_saturation > 1.0) _saturation = 1.0;
if(_saturation < 0.0) _saturation = 0.0;
if(_luminance > 1.0) _luminance = 1.0;
if(_luminance < 0.0) _luminance = 0.0;
float red, blue, green;
if(_saturation == 0.0)
{
// colour is a shade of grey
red = blue = green = _luminance;
}
else
{
double tmp2 = (_luminance < 0.5)
? _luminance * (1.0 + _saturation)
: (_luminance + _saturation) - (_luminance * _saturation);
double tmp1 = 2.0 * _luminance - tmp2;
double tmp3R = _hue + 120.0;
if(tmp3R > 360.0)
tmp3R -= 360.0;
if(tmp3R < 60.0)
red = tmp1 + (tmp2 - tmp1) * tmp3R / 60.0;
else if(tmp3R < 180.0)
red = tmp2;
else if(tmp3R < 240.0)
red = tmp1 + (tmp2 - tmp1) * (240.0 - tmp3R) / 60.0;
else
red = tmp1;
double tmp3G = _hue;
if(tmp3G > 360.0)
tmp3G -= 360.0;
if(tmp3G < 60.0)
green = tmp1 + (tmp2 - tmp1) * tmp3G / 60.0;
else if(tmp3G < 180.0)
green = tmp2;
else if(tmp3G < 240.0)
green = tmp1 + (tmp2 - tmp1) * (240.0 - tmp3G) / 60.0;
else
green = tmp1;
double tmp3B = _hue + 240.0;
if(tmp3B > 360.0)
tmp3B -= 360.0;
if(tmp3B < 60.0)
blue = tmp1 + (tmp2 - tmp1) * tmp3B / 60.0;
else if(tmp3B < 180.0)
blue = tmp2;
else if(tmp3B < 240.0)
blue = tmp1 + (tmp2 - tmp1) * (240.0 - tmp3B) / 60.0;
else
blue = tmp1;
}
return wxColour(
(unsigned char)(red * 255.0),
(unsigned char)(green * 255.0),
(unsigned char)(blue * 255.0));
}
wxRibbonHSLColour wxRibbonHSLColour::Darker(float delta) const
{
return Lighter(-delta);
}
wxRibbonHSLColour& wxRibbonHSLColour::MakeDarker(float delta)
{
luminance -= delta;
return *this;
}
wxRibbonHSLColour wxRibbonHSLColour::Lighter(float delta) const
{
return wxRibbonHSLColour(hue, saturation, luminance + delta);
}
wxRibbonHSLColour wxRibbonHSLColour::Saturated(float delta) const
{
return wxRibbonHSLColour(hue, saturation + delta, luminance);
}
wxRibbonHSLColour wxRibbonHSLColour::Desaturated(float delta) const
{
return Saturated(-delta);
}
wxRibbonHSLColour wxRibbonHSLColour::ShiftHue(float delta) const
{
return wxRibbonHSLColour(hue + delta, saturation, luminance);
}
#endif // wxUSE_RIBBON