diff --git a/include/wx/os2/palette.h b/include/wx/os2/palette.h index 621fcf2dd9..bdb45a57e0 100644 --- a/include/wx/os2/palette.h +++ b/include/wx/os2/palette.h @@ -23,36 +23,54 @@ public: wxPaletteRefData(); ~wxPaletteRefData(); protected: - WXHPALETTE m_hPalette; -}; + WXHPALETTE m_hPalette; + HPS m_hPS; +}; // end of CLASS wxPaletteRefData #define M_PALETTEDATA ((wxPaletteRefData *)m_refData) class WXDLLEXPORT wxPalette: public wxGDIObject { - DECLARE_DYNAMIC_CLASS(wxPalette) + DECLARE_DYNAMIC_CLASS(wxPalette) public: - wxPalette(); - inline wxPalette(const wxPalette& palette) { Ref(palette); } + wxPalette(); + inline wxPalette(const wxPalette& rPalette) { Ref(rPalette); } - wxPalette(int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue); - ~wxPalette(); - bool Create(int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue); - int GetPixel(const unsigned char red, const unsigned char green, const unsigned char blue) const; - bool GetRGB(int pixel, unsigned char *red, unsigned char *green, unsigned char *blue) const; + wxPalette( int n + ,const unsigned char* pRed + ,const unsigned char* pGreen + ,const unsigned char* pBlue + ); + ~wxPalette(); - virtual bool Ok() const { return (m_refData != NULL) ; } + bool Create( int n + ,const unsigned char* pRed + ,const unsigned char* pGreen + ,const unsigned char* pBlue + ); + int GetPixel( const unsigned char cRed + ,const unsigned char cGreen + ,const unsigned char cBlue + ) const; + bool GetRGB( int nPixel + ,unsigned char* pRed + ,unsigned char* pGreen + ,unsigned char* pBlue + ) const; - inline wxPalette& operator = (const wxPalette& palette) { if (*this == palette) return (*this); Ref(palette); return *this; } - inline bool operator == (const wxPalette& palette) { return m_refData == palette.m_refData; } - inline bool operator != (const wxPalette& palette) { return m_refData != palette.m_refData; } + virtual bool Ok(void) const { return (m_refData != NULL) ; } - virtual bool FreeResource(bool force = FALSE); + inline wxPalette& operator = (const wxPalette& rPalette) { if (*this == rPalette) return (*this); Ref(rPalette); return *this; } + inline bool operator == (const wxPalette& rPalette) { return m_refData == rPalette.m_refData; } + inline bool operator != (const wxPalette& rPalette) { return m_refData != rPalette.m_refData; } - inline WXHPALETTE GetHPALETTE() const { return (M_PALETTEDATA ? M_PALETTEDATA->m_hPalette : 0); } - void SetHPALETTE(WXHPALETTE pal); -}; + virtual bool FreeResource(bool bForce = FALSE); + + inline WXHPALETTE GetHPALETTE(void) const { return (M_PALETTEDATA ? M_PALETTEDATA->m_hPalette : 0); } + void SetHPALETTE(WXHPALETTE hPalette); + void SetPS(HPS hPS); +}; // end of CLASS wxPalette #define wxColorMap wxPalette #define wxColourMap wxPalette diff --git a/src/os2/palette.cpp b/src/os2/palette.cpp index e0461db8af..bf84af809f 100644 --- a/src/os2/palette.cpp +++ b/src/os2/palette.cpp @@ -33,105 +33,201 @@ IMPLEMENT_DYNAMIC_CLASS(wxPalette, wxGDIObject) wxPaletteRefData::wxPaletteRefData() { - m_hPalette = 0; -} + m_hPalette = NULLHANDLE; + m_hPS = NULLHANDLE; +} // end of wxPaletteRefData::wxPaletteRefData wxPaletteRefData::~wxPaletteRefData() { if ( m_hPalette ) return; - // TODO: ::DeleteObject((HPALETTE) m_hPalette); -} +} // end of wxPaletteRefData::~wxPaletteRefData wxPalette::wxPalette() { -} +} // end of wxPalette::wxPalette -wxPalette::wxPalette(int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue) +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::FreeResource(bool force) +bool wxPalette::FreeResource( + bool bForce +) { if ( M_PALETTEDATA && M_PALETTEDATA->m_hPalette) { -// TODO: DeleteObject((HPALETTE)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 *red, const unsigned char *green, const unsigned char *blue) +bool wxPalette::Create( + int n +, const unsigned char* pRed +, const unsigned char* pGreen +, const unsigned char* pBlue +) { - UnRef(); + PULONG pualTable; - m_refData = new wxPaletteRefData; + UnRef(); - // TODO -/* - NPLOGPALETTE npPal = (NPLOGPALETTE)LocalAlloc(LMEM_FIXED, sizeof(LOGPALETTE) + - (WORD)n * sizeof(PALETTEENTRY)); - if (!npPal) - return(FALSE); + m_refData = new wxPaletteRefData; + pualTable = new ULONG[n]; + if (!pualTable) + return(FALSE); - npPal->palVersion = 0x300; - npPal->palNumEntries = n; + 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 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); -*/ - return FALSE; -} - -int wxPalette::GetPixel(const unsigned char red, const unsigned char green, const unsigned char blue) const +int wxPalette::GetPixel( + const unsigned char cRed +, const unsigned char cGreen +, const unsigned char cBlue +) const { - if ( !m_refData ) - return FALSE; + bool bFound = FALSE; + PULONG pualTable = NULL; + ULONG ulNumEntries; + ULONG ulRGB = (PC_RESERVED * 16777216) + + ((int)cRed * 65536) + + ((int)cGreen * 256) + + (int)cBlue; - // TODO - return FALSE; -} - -bool wxPalette::GetRGB(int index, unsigned char *red, unsigned char *green, unsigned char *blue) const -{ - if ( !m_refData ) - return FALSE; - - if (index < 0 || index > 255) + if (!m_refData) return FALSE; -// TODO -/* - PALETTEENTRY entry; - if (::GetPaletteEntries((HPALETTE) M_PALETTEDATA->m_hPalette, index, 1, &entry)) - { - *red = entry.peRed; - *green = entry.peGreen; - *blue = entry.peBlue; - return TRUE; - } else - return FALSE; -*/ - return FALSE; -} -void wxPalette::SetHPALETTE(WXHPALETTE pal) + // + // 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 + // + for (int 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 { - if ( !m_refData ) - m_refData = new wxPaletteRefData; + PULONG pualTable = NULL; + RGB2 vRGB; + ULONG ulNumEntries; - M_PALETTEDATA->m_hPalette = pal; -} + 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 +) +{ + if ( !m_refData ) + m_refData = new wxPaletteRefData; + + M_PALETTEDATA->m_hPalette = hPal; +} // end of wxPalette::SetHPALETTE + +void wxPalette::SetPS( + HPS hPS +) +{ + if ( !m_refData ) + m_refData = new wxPaletteRefData; + + ::GpiSelectPalette(M_PALETTEDATA->m_hPS, M_PALETTEDATA->m_hPalette); + M_PALETTEDATA->m_hPS = hPS; +} // end of wxPalette::SetHPALETTE