1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/msw/palette.cpp
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // For compilers that support precompilation, includes "wx.h".
13 #include "wx/wxprec.h"
21 #include "wx/palette.h"
23 #include "wx/msw/private.h"
25 // ============================================================================
27 // ============================================================================
29 class WXDLLEXPORT wxPaletteRefData
: public wxGDIRefData
32 wxPaletteRefData() { Init(); }
34 wxPaletteRefData(int n
,
41 LOGPALETTE
*pPal
= Alloc(n
);
45 for ( int i
= 0; i
< n
; i
++ )
47 pPal
->palPalEntry
[i
].peRed
= red
[i
];
48 pPal
->palPalEntry
[i
].peGreen
= green
[i
];
49 pPal
->palPalEntry
[i
].peBlue
= blue
[i
];
50 pPal
->palPalEntry
[i
].peFlags
= 0;
53 m_hPalette
= ::CreatePalette(pPal
);
57 wxPaletteRefData(const wxPaletteRefData
& data
)
61 const UINT n
= data
.GetEntries();
65 LOGPALETTE
*pPal
= Alloc(n
);
69 if ( ::GetPaletteEntries(data
.m_hPalette
, 0, n
, pPal
->palPalEntry
) )
70 m_hPalette
= ::CreatePalette(pPal
);
75 virtual ~wxPaletteRefData()
78 ::DeleteObject(m_hPalette
);
81 virtual bool IsOk() const { return m_hPalette
!= 0; }
83 UINT
GetEntries() const
85 return ::GetPaletteEntries(m_hPalette
, 0, 0, NULL
);
89 // caller must free() the pointer
90 static LOGPALETTE
*Alloc(UINT numEntries
)
92 LOGPALETTE
*pPal
= (LOGPALETTE
*)
93 malloc(sizeof(LOGPALETTE
) + numEntries
*sizeof(PALETTEENTRY
));
96 pPal
->palVersion
= 0x300;
97 pPal
->palNumEntries
= numEntries
;
103 void Init() { m_hPalette
= 0; }
107 friend class WXDLLIMPEXP_FWD_CORE wxPalette
;
110 // ============================================================================
112 // ============================================================================
114 IMPLEMENT_DYNAMIC_CLASS(wxPalette
, wxGDIObject
)
116 #define M_PALETTEDATA ((wxPaletteRefData *)m_refData)
118 bool wxPalette::Create(int n
,
120 unsigned char *green
,
123 m_refData
= new wxPaletteRefData(n
, red
, green
, blue
);
128 wxGDIRefData
*wxPalette::CreateGDIRefData() const
130 return new wxPaletteRefData
;
133 wxGDIRefData
*wxPalette::CloneGDIRefData(const wxGDIRefData
*data
) const
135 return new wxPaletteRefData(*wx_static_cast(const wxPaletteRefData
*, data
));
138 int wxPalette::GetColoursCount() const
140 return IsOk() ? M_PALETTEDATA
->GetEntries() : 0;
143 int wxPalette::GetPixel(unsigned char red
,
145 unsigned char blue
) const
150 return ::GetNearestPaletteIndex(M_PALETTEDATA
->m_hPalette
,
151 PALETTERGB(red
, green
, blue
));
154 bool wxPalette::GetRGB(int index
,
156 unsigned char *green
,
157 unsigned char *blue
) const
162 if (index
< 0 || index
> 255)
166 if ( !::GetPaletteEntries(M_PALETTEDATA
->m_hPalette
, index
, 1, &entry
) )
170 *green
= entry
.peGreen
;
171 *blue
= entry
.peBlue
;
176 WXHPALETTE
wxPalette::GetHPALETTE() const
178 return M_PALETTEDATA
? (WXHPALETTE
)M_PALETTEDATA
->m_hPalette
: 0;
181 void wxPalette::SetHPALETTE(WXHPALETTE pal
)
185 M_PALETTEDATA
->m_hPalette
= (HPALETTE
)pal
;
188 #endif // wxUSE_PALETTE