1/////////////////////////////////////////////////////////////////////////////
2// Name:        src/os2/palette.cpp
3// Purpose:     wxPalette
4// Author:      AUTHOR
5// Modified by:
6// Created:     ??/??/98
7// RCS-ID:      $Id: palette.cpp 38791 2006-04-18 09:56:17Z ABX $
8// Copyright:   (c) AUTHOR
9// Licence:     wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// For compilers that support precompilation, includes "wx.h".
13#include "wx/wxprec.h"
14
15#ifndef WX_PRECOMP
16    #include <stdio.h>
17    #include "wx/string.h"
18    #include "wx/os2/private.h"
19    #include "wx/palette.h"
20    #include "wx/app.h"
21#endif
22
23#define INCL_PM
24#define INCL_GPI
25
26#include "assert.h"
27
28IMPLEMENT_DYNAMIC_CLASS(wxPalette, wxGDIObject)
29
30/*
31 * Palette
32 *
33 */
34
35wxPaletteRefData::wxPaletteRefData()
36{
37    m_hPalette = NULLHANDLE;
38    m_hPS      = NULLHANDLE;
39} // end of wxPaletteRefData::wxPaletteRefData
40
41wxPaletteRefData::~wxPaletteRefData()
42{
43    if ( m_hPalette )
44        return;
45} // end of wxPaletteRefData::~wxPaletteRefData
46
47wxPalette::wxPalette()
48{
49} // end of wxPalette::wxPalette
50
51wxPalette::wxPalette(
52  int                               n
53, const unsigned char*              pRed
54, const unsigned char*              pGreen
55, const unsigned char*              pBlue
56)
57{
58    Create( n
59           ,pRed
60           ,pGreen
61           ,pBlue
62          );
63} // end of wxPalette::wxPalette
64
65wxPalette::~wxPalette()
66{
67} // end of wxPalette::~wxPalette
68
69bool wxPalette::FreeResource( bool WXUNUSED(bForce) )
70{
71    if ( M_PALETTEDATA && M_PALETTEDATA->m_hPalette)
72    {
73        ::GpiSelectPalette(M_PALETTEDATA->m_hPS, NULLHANDLE);
74        ::GpiDeletePalette((HPAL)M_PALETTEDATA->m_hPalette);
75    }
76    return true;
77} // end of wxPalette::FreeResource
78
79bool wxPalette::Create( int n,
80                        const unsigned char* pRed,
81                        const unsigned char* pGreen,
82                        const unsigned char* pBlue )
83{
84    PULONG                          pualTable;
85
86    UnRef();
87
88    m_refData = new wxPaletteRefData;
89    pualTable = new ULONG[n];
90    if (!pualTable)
91        return false;
92
93    for (int i = 0; i < n; i ++)
94    {
95        pualTable[i] = (PC_RESERVED * 16777216) + ((int)pRed[i] * 65536) + ((int)pGreen[i] * 256) + (int)pBlue[i];
96    }
97    M_PALETTEDATA->m_hPalette = (WXHPALETTE)::GpiCreatePalette( vHabmain
98                                                               ,LCOL_PURECOLOR
99                                                               ,LCOLF_CONSECRGB
100                                                               ,(LONG)n
101                                                               ,pualTable
102                                                              );
103    delete [] pualTable;
104    return true;
105} // end of wxPalette::Create
106
107int wxPalette::GetPixel( unsigned char cRed,
108                         unsigned char cGreen,
109                         unsigned char cBlue) const
110{
111    bool    bFound = false;
112    PULONG  pualTable = NULL;
113    ULONG   ulNumEntries;
114    ULONG   ulRGB = (PC_RESERVED * 16777216) +
115                    ((int)cRed * 65536) +
116                    ((int)cGreen * 256) +
117                    (int)cBlue;
118
119    if (!m_refData)
120        return wxNOT_FOUND;
121
122    //
123    // Get number of entries first
124    //
125    ulNumEntries = ::GpiQueryPaletteInfo( M_PALETTEDATA->m_hPalette
126                                         ,M_PALETTEDATA->m_hPS
127                                         ,0                    // No options
128                                         ,0                    // No start index
129                                         ,0                    // Force return of number entries
130                                         ,NULL                 // No array
131                                        );
132
133    pualTable = new ULONG[ulNumEntries];
134
135    //
136    // Now get the entries
137    //
138    ulNumEntries = ::GpiQueryPaletteInfo( M_PALETTEDATA->m_hPalette
139                                         ,M_PALETTEDATA->m_hPS
140                                         ,0                    // No options
141                                         ,0                    // start at 0
142                                         ,ulNumEntries         // Force return of number entries
143                                         ,pualTable            // Palette entry array with RGB values
144                                        );
145    //
146    // Now loop through and find the matching entry
147    //
148    ULONG i;
149    for (i = 0; i < ulNumEntries; i++)
150    {
151        if (pualTable[i] == ulRGB)
152        {
153            bFound = true;
154            break;
155        }
156    }
157    if (!bFound)
158        return wxNOT_FOUND;
159    return (i + 1);
160} // end of wxPalette::GetPixel
161
162bool wxPalette::GetRGB( int nIndex,
163                        unsigned char* pRed,
164                        unsigned char* pGreen,
165                        unsigned char* pBlue) const
166{
167    PULONG                          pualTable = NULL;
168    RGB2                            vRGB;
169    ULONG                           ulNumEntries;
170
171    if (!m_refData)
172        return false;
173
174    if (nIndex < 0 || nIndex > 255)
175        return false;
176    //
177    // Get number of entries first
178    //
179    ulNumEntries = ::GpiQueryPaletteInfo( M_PALETTEDATA->m_hPalette
180                                         ,M_PALETTEDATA->m_hPS
181                                         ,0                    // No options
182                                         ,0                    // No start index
183                                         ,0                    // Force return of number entries
184                                         ,NULL                 // No array
185                                        );
186
187    pualTable = new ULONG[ulNumEntries];
188
189    //
190    // Now get the entries
191    //
192    ulNumEntries = ::GpiQueryPaletteInfo( M_PALETTEDATA->m_hPalette
193                                         ,M_PALETTEDATA->m_hPS
194                                         ,0                    // No options
195                                         ,0                    // start at 0
196                                         ,ulNumEntries         // Force return of number entries
197                                         ,pualTable            // Palette entry array with RGB values
198                                        );
199
200    memcpy(&vRGB, &pualTable[nIndex], sizeof(RGB2));
201    *pBlue  = vRGB.bBlue;
202    *pGreen = vRGB.bGreen;
203    *pRed   = vRGB.bRed;
204    return true;
205} // end of wxPalette::GetRGB
206
207void wxPalette::SetHPALETTE(
208  WXHPALETTE                        hPal
209)
210{
211    if ( !m_refData )
212        m_refData = new wxPaletteRefData;
213
214    M_PALETTEDATA->m_hPalette = hPal;
215} // end of wxPalette::SetHPALETTE
216
217void wxPalette::SetPS(
218  HPS                               hPS
219)
220{
221    if ( !m_refData )
222        m_refData = new wxPaletteRefData;
223
224    ::GpiSelectPalette(M_PALETTEDATA->m_hPS, M_PALETTEDATA->m_hPalette);
225    M_PALETTEDATA->m_hPS = hPS;
226} // end of wxPalette::SetHPALETTE
227