Palette code

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8953 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Webster 2000-12-19 03:10:11 +00:00
parent 1378f26027
commit deb63b954b
2 changed files with 201 additions and 87 deletions

View File

@ -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

View File

@ -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