]> git.saurik.com Git - wxWidgets.git/blob - src/mac/carbon/colour.cpp
check that the version of __sync_sub_and_fetch that returns a value is supported...
[wxWidgets.git] / src / mac / carbon / colour.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/mac/carbon/colour.cpp
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/mac/private.h"
21
22 IMPLEMENT_DYNAMIC_CLASS(wxColour, wxObject)
23
24 wxColour::wxColour(const RGBColor& col)
25 {
26 InitRGBColor(col);
27 }
28
29 wxColour::wxColour(CGColorRef col)
30 {
31 InitCGColorRef(col);
32 }
33
34 void wxColour::GetRGBColor( RGBColor *col ) const
35 {
36 col->red = (m_red << 8) + m_red;
37 col->blue = (m_blue << 8) + m_blue;
38 col->green = (m_green << 8) + m_green;
39 }
40
41 wxColour::~wxColour ()
42 {
43 }
44
45 wxColour& wxColour::operator=(const RGBColor& col)
46 {
47 InitRGBColor(col);
48 return *this;
49 }
50
51 wxColour& wxColour::operator=(CGColorRef col)
52 {
53 InitCGColorRef(col);
54 return *this;
55 }
56
57 bool wxColour::IsOk() const
58 {
59 return m_cgColour.get() != NULL;
60 }
61
62 void wxColour::InitRGBA (ChannelType r, ChannelType g, ChannelType b, ChannelType a)
63 {
64 m_red = r;
65 m_green = g;
66 m_blue = b;
67 m_alpha = a ;
68
69 CGColorRef col = 0 ;
70 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
71 if ( CGColorCreateGenericRGB )
72 col = CGColorCreateGenericRGB( r / 255.0, g / 255.0, b / 255.0, a / 255.0 );
73 else
74 #endif
75 {
76 CGFloat components[4] = { r / 255.0, g / 255.0, b / 255.0, a / 255.0 } ;
77 col = CGColorCreate( wxMacGetGenericRGBColorSpace() , components ) ;
78 }
79 m_cgColour.reset( col );
80 }
81
82 void wxColour::InitRGBColor( const RGBColor& col )
83 {
84 m_red = col.red >> 8;
85 m_blue = col.blue >> 8;
86 m_green = col.green >> 8;
87 m_alpha = wxALPHA_OPAQUE;
88 CGColorRef cfcol;
89 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
90 if ( CGColorCreateGenericRGB )
91 cfcol = CGColorCreateGenericRGB( col.red / 65535.0, col.green / 65535.0, col.blue / 65535.0, 1.0 );
92 else
93 #endif
94 {
95 CGFloat components[4] = { col.red / 65535.0, col.green / 65535.0, col.blue / 65535.0, 1.0 } ;
96 cfcol = CGColorCreate( wxMacGetGenericRGBColorSpace() , components ) ;
97 }
98 m_cgColour.reset( cfcol );
99 }
100
101 void wxColour::InitCGColorRef( CGColorRef col )
102 {
103 m_cgColour.reset( col );
104 size_t noComp = CGColorGetNumberOfComponents( col );
105 if ( noComp >=3 && noComp <= 4 )
106 {
107 // TODO verify whether we really are on a RGB color space
108 const CGFloat *components = CGColorGetComponents( col );
109 m_red = (int)(components[0]*255+0.5);
110 m_green = (int)(components[1]*255+0.5);
111 m_blue = (int)(components[2]*255+0.5);
112 if ( noComp == 4 )
113 m_alpha = (int)(components[3]*255+0.5);
114 else
115 m_alpha = wxALPHA_OPAQUE;
116 }
117 else
118 {
119 m_alpha = wxALPHA_OPAQUE;
120 m_red = m_green = m_blue = 0;
121 }
122 }
123
124 bool wxColour::operator == (const wxColour& colour) const
125 {
126 return ( (IsOk() == colour.IsOk()) && (!IsOk() ||
127 CGColorEqualToColor( m_cgColour, colour.m_cgColour ) ) );
128 }
129
130