X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0e320a79f187558effb04d92020b470372bbe456..41286fd1def19641be3ae5bb9666c84a1c0b5525:/src/os2/palette.cpp diff --git a/src/os2/palette.cpp b/src/os2/palette.cpp index f8db96f8d0..bd592c42e0 100644 --- a/src/os2/palette.cpp +++ b/src/os2/palette.cpp @@ -9,15 +9,25 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "palette.h" +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifndef WX_PRECOMP +#include +#include "wx/defs.h" +#include "wx/setup.h" +#include "wx/string.h" +#include "wx/os2/private.h" +#include "wx/palette.h" +#include "wx/app.h" #endif -#include "wx/palette.h" +#define INCL_PM +#define INCL_GPI + +#include "assert.h" -#if !USE_SHARED_LIBRARIES IMPLEMENT_DYNAMIC_CLASS(wxPalette, wxGDIObject) -#endif /* * Palette @@ -26,57 +36,202 @@ IMPLEMENT_DYNAMIC_CLASS(wxPalette, wxGDIObject) wxPaletteRefData::wxPaletteRefData() { - // TODO -} + m_hPalette = NULLHANDLE; + m_hPS = NULLHANDLE; +} // end of wxPaletteRefData::wxPaletteRefData wxPaletteRefData::~wxPaletteRefData() { - // TODO -} + if ( m_hPalette ) + return; +} // end of wxPaletteRefData::~wxPaletteRefData wxPalette::wxPalette() { -} - -wxPalette::wxPalette(int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue) +} // end of wxPalette::wxPalette + +wxPalette::wxPalette( + int n +, const unsigned char* pRed +, const unsigned char* pGreen +, const unsigned char* pBlue +) { - Create(n, red, green, blue); -} + Create( n + ,pRed + ,pGreen + ,pBlue + ); +} // end of wxPalette::wxPalette wxPalette::~wxPalette() { -} +} // end of wxPalette::~wxPalette -bool wxPalette::Create(int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue) +bool wxPalette::FreeResource( + bool bForce +) { - UnRef(); - - m_refData = new wxPaletteRefData; + if ( M_PALETTEDATA && M_PALETTEDATA->m_hPalette) + { + ::GpiSelectPalette(M_PALETTEDATA->m_hPS, NULLHANDLE); + ::GpiDeletePalette((HPAL)M_PALETTEDATA->m_hPalette); + } + return TRUE; +} // end of wxPalette::FreeResource + +bool wxPalette::Create( + int n +, const unsigned char* pRed +, const unsigned char* pGreen +, const unsigned char* pBlue +) +{ + PULONG pualTable; + + UnRef(); + + 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( + const unsigned char cRed +, const unsigned char cGreen +, const 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 FALSE; - // TODO + // + // 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 + // + int i; + for (i = 0; i < ulNumEntries; i++) + { + if (pualTable[i] == ulRGB) + { + bFound = TRUE; + break; + } + } + if (!bFound) + return 0; + 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; - return FALSE; -} + if (!m_refData) + return FALSE; -int wxPalette::GetPixel(const unsigned char red, const unsigned char green, const unsigned char blue) const + 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 +) { if ( !m_refData ) - return FALSE; + m_refData = new wxPaletteRefData; - // TODO - return FALSE; -} + M_PALETTEDATA->m_hPalette = hPal; +} // end of wxPalette::SetHPALETTE -bool wxPalette::GetRGB(int index, unsigned char *red, unsigned char *green, unsigned char *blue) const +void wxPalette::SetPS( + HPS hPS +) { if ( !m_refData ) - return FALSE; - - if (index < 0 || index > 255) - return FALSE; - - // TODO - return FALSE; -} + m_refData = new wxPaletteRefData; + ::GpiSelectPalette(M_PALETTEDATA->m_hPS, M_PALETTEDATA->m_hPalette); + M_PALETTEDATA->m_hPS = hPS; +} // end of wxPalette::SetHPALETTE