-  // TODO
-/*
-  NPLOGPALETTE npPal = (NPLOGPALETTE)LocalAlloc(LMEM_FIXED, sizeof(LOGPALETTE) +
-                        (WORD)n * sizeof(PALETTEENTRY));
-  if (!npPal)
-    return(FALSE);
-
-  npPal->palVersion = 0x300;
-  npPal->palNumEntries = n;
-
-  int i;
-  for (i = 0; i < n; i ++)
-  {
-    npPal->palPalEntry[i].peRed = red[i];
-    npPal->palPalEntry[i].peGreen = green[i];
-    npPal->palPalEntry[i].peBlue = blue[i];
-    npPal->palPalEntry[i].peFlags = 0;
-  }
-  M_PALETTEDATA->m_hPalette = (WXHPALETTE) CreatePalette((LPLOGPALETTE)npPal);
-  LocalFree((HANDLE)npPal);
-*/
-}
-
-int wxPalette::GetPixel(const unsigned char red, const unsigned char green, const unsigned char blue) const
+    m_refData = new wxPaletteRefData;
+    pualTable = new ULONG[n];
+    if (!pualTable)
+        return false;
+
+    for (int i = 0; i < n; i ++)
+    {
+        pualTable[i] = (PC_RESERVED * 16777216) + ((int)pRed[i] * 65536) + ((int)pGreen[i] * 256) + (int)pBlue[i];
+    }
+    M_PALETTEDATA->m_hPalette = (WXHPALETTE)::GpiCreatePalette( vHabmain
+                                                               ,LCOL_PURECOLOR
+                                                               ,LCOLF_CONSECRGB
+                                                               ,(LONG)n
+                                                               ,pualTable
+                                                              );
+    delete [] pualTable;
+    return true;
+} // end of wxPalette::Create
+
+int wxPalette::GetPixel( unsigned char cRed,
+                         unsigned char cGreen,
+                         unsigned char cBlue) const
+{
+    bool    bFound = false;
+    PULONG  pualTable = NULL;
+    ULONG   ulNumEntries;
+    ULONG   ulRGB = (PC_RESERVED * 16777216) +
+                    ((int)cRed * 65536) +
+                    ((int)cGreen * 256) +
+                    (int)cBlue;
+
+    if (!m_refData)
+        return wxNOT_FOUND;
+
+    //
+    // Get number of entries first
+    //
+    ulNumEntries = ::GpiQueryPaletteInfo( M_PALETTEDATA->m_hPalette
+                                         ,M_PALETTEDATA->m_hPS
+                                         ,0                    // No options
+                                         ,0                    // No start index
+                                         ,0                    // Force return of number entries
+                                         ,NULL                 // No array
+                                        );
+
+    pualTable = new ULONG[ulNumEntries];
+
+    //
+    // Now get the entries
+    //
+    ulNumEntries = ::GpiQueryPaletteInfo( M_PALETTEDATA->m_hPalette
+                                         ,M_PALETTEDATA->m_hPS
+                                         ,0                    // No options
+                                         ,0                    // start at 0
+                                         ,ulNumEntries         // Force return of number entries
+                                         ,pualTable            // Palette entry array with RGB values
+                                        );
+    //
+    // Now loop through and find the matching entry
+    //
+    ULONG i;
+    for (i = 0; i < ulNumEntries; i++)
+    {
+        if (pualTable[i] == ulRGB)
+        {
+            bFound = true;
+            break;
+        }
+    }
+    if (!bFound)
+        return wxNOT_FOUND;
+    return (i + 1);
+} // end of wxPalette::GetPixel
+
+bool wxPalette::GetRGB( int nIndex,
+                        unsigned char* pRed,
+                        unsigned char* pGreen,
+                        unsigned char* pBlue) const
+{
+    PULONG                          pualTable = NULL;
+    RGB2                            vRGB;
+    ULONG                           ulNumEntries;
+
+    if (!m_refData)
+        return false;
+
+    if (nIndex < 0 || nIndex > 255)
+        return false;
+    //
+    // Get number of entries first
+    //
+    ulNumEntries = ::GpiQueryPaletteInfo( M_PALETTEDATA->m_hPalette
+                                         ,M_PALETTEDATA->m_hPS
+                                         ,0                    // No options
+                                         ,0                    // No start index
+                                         ,0                    // Force return of number entries
+                                         ,NULL                 // No array
+                                        );
+
+    pualTable = new ULONG[ulNumEntries];
+
+    //
+    // Now get the entries
+    //
+    ulNumEntries = ::GpiQueryPaletteInfo( M_PALETTEDATA->m_hPalette
+                                         ,M_PALETTEDATA->m_hPS
+                                         ,0                    // No options
+                                         ,0                    // start at 0
+                                         ,ulNumEntries         // Force return of number entries
+                                         ,pualTable            // Palette entry array with RGB values
+                                        );
+
+    memcpy(&vRGB, &pualTable[nIndex], sizeof(RGB2));
+    *pBlue  = vRGB.bBlue;
+    *pGreen = vRGB.bGreen;
+    *pRed   = vRGB.bRed;
+    return true;
+} // end of wxPalette::GetRGB
+
+void wxPalette::SetHPALETTE(
+  WXHPALETTE                        hPal
+)