]> git.saurik.com Git - wxWidgets.git/blame - src/osx/core/colour.cpp
Fix bug with out of range date in wxMSW wxDatePickerCtrl under XP too.
[wxWidgets.git] / src / osx / core / colour.cpp
CommitLineData
c40627e9 1/////////////////////////////////////////////////////////////////////////////
80fdcdb9 2// Name: src/osx/core/colour.cpp
c40627e9
SC
3// Purpose: wxColour class
4// Author: Stefan Csomor
5// Modified by:
6// Created: 1998-01-01
7// RCS-ID: $Id$
8// Copyright: (c) Stefan Csomor
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#include "wx/wxprec.h"
13
14#include "wx/colour.h"
15
16#ifndef WX_PRECOMP
17 #include "wx/gdicmn.h"
18#endif
19
20#include "wx/osx/private.h"
21
e630b0f0 22#if wxOSX_USE_COCOA_OR_CARBON
c40627e9
SC
23wxColour::wxColour(const RGBColor& col)
24{
25 InitRGBColor(col);
26}
27#endif
28
29wxColour::wxColour(CGColorRef col)
30{
31 InitCGColorRef(col);
32}
33
e630b0f0 34#if wxOSX_USE_COCOA_OR_CARBON
c40627e9
SC
35void wxColour::GetRGBColor( RGBColor *col ) const
36{
37 col->red = (m_red << 8) + m_red;
38 col->blue = (m_blue << 8) + m_blue;
39 col->green = (m_green << 8) + m_green;
40}
41
42wxColour& wxColour::operator=(const RGBColor& col)
43{
44 InitRGBColor(col);
45 return *this;
46}
47#endif
48
49wxColour& wxColour::operator=(CGColorRef col)
50{
51 InitCGColorRef(col);
52 return *this;
53}
54
55wxColour& wxColour::operator=(const wxColour& col)
56{
57 m_red = col.m_red;
58 m_green = col.m_green;
59 m_blue = col.m_blue;
60 m_alpha = col.m_alpha;
61 m_cgColour = col.m_cgColour;
62 return *this;
63}
64
65void wxColour::InitRGBA (ChannelType r, ChannelType g, ChannelType b, ChannelType a)
66{
67 m_red = r;
68 m_green = g;
69 m_blue = b;
70 m_alpha = a ;
71
72 CGColorRef col = 0 ;
f7d32bb7 73#if wxOSX_USE_COCOA_OR_CARBON && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
728447a0 74 if ( CGColorCreateGenericRGB != NULL )
c40627e9
SC
75 col = CGColorCreateGenericRGB( (CGFloat)(r / 255.0), (CGFloat) (g / 255.0), (CGFloat) (b / 255.0), (CGFloat) (a / 255.0) );
76 else
77#endif
78 {
03647350 79 CGFloat components[4] = { (CGFloat)(r / 255.0), (CGFloat) (g / 255.0), (CGFloat) (b / 255.0), (CGFloat) (a / 255.0) } ;
c40627e9
SC
80 col = CGColorCreate( wxMacGetGenericRGBColorSpace() , components ) ;
81 }
82 m_cgColour.reset( col );
83}
84
e630b0f0 85#if wxOSX_USE_COCOA_OR_CARBON
c40627e9
SC
86void wxColour::InitRGBColor( const RGBColor& col )
87{
88 m_red = col.red >> 8;
89 m_blue = col.blue >> 8;
90 m_green = col.green >> 8;
91 m_alpha = wxALPHA_OPAQUE;
92 CGColorRef cfcol;
93#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
728447a0 94 if ( CGColorCreateGenericRGB != NULL )
03647350 95 cfcol = CGColorCreateGenericRGB((CGFloat)(col.red / 65535.0), (CGFloat)(col.green / 65535.0),
c40627e9
SC
96 (CGFloat)(col.blue / 65535.0), (CGFloat) 1.0 );
97 else
98#endif
99 {
03647350
VZ
100 CGFloat components[4] = { (CGFloat)(col.red / 65535.0), (CGFloat)(col.green / 65535.0),
101 (CGFloat)(col.blue / 65535.0), (CGFloat) 1.0 } ;
c40627e9
SC
102 cfcol = CGColorCreate( wxMacGetGenericRGBColorSpace() , components ) ;
103 }
104 m_cgColour.reset( cfcol );
105}
106#endif
107
108void wxColour::InitCGColorRef( CGColorRef col )
109{
110 m_cgColour.reset( col );
111 size_t noComp = CGColorGetNumberOfComponents( col );
ce00f59b 112
b478f242 113 const CGFloat *components = NULL;
c40627e9
SC
114 if ( noComp >= 1 && noComp <= 4 )
115 {
116 // TODO verify whether we really are on a RGB color space
117 m_alpha = wxALPHA_OPAQUE;
b478f242 118 components = CGColorGetComponents( col );
c40627e9 119 }
b478f242
KO
120 InitFromComponents(components, noComp);
121}
122
123void wxColour::InitFromComponents(const CGFloat* components, size_t numComponents )
124{
125 if ( numComponents < 1 || !components )
c40627e9
SC
126 {
127 m_alpha = wxALPHA_OPAQUE;
128 m_red = m_green = m_blue = 0;
b478f242
KO
129 return;
130 }
ce00f59b 131
b478f242
KO
132 if ( numComponents >= 3 )
133 {
134 m_red = (int)(components[0]*255+0.5);
135 m_green = (int)(components[1]*255+0.5);
136 m_blue = (int)(components[2]*255+0.5);
137 if ( numComponents == 4 )
138 m_alpha = (int)(components[3]*255+0.5);
139 }
140 else
141 {
142 m_red = (int)(components[0]*255+0.5);
143 m_green = (int)(components[0]*255+0.5);
144 m_blue = (int)(components[0]*255+0.5);
c40627e9
SC
145 }
146}
147
148bool wxColour::operator == (const wxColour& colour) const
149{
150 return ( (IsOk() == colour.IsOk()) && (!IsOk() ||
151 CGColorEqualToColor( m_cgColour, colour.m_cgColour ) ) );
152}
153
154