diff --git a/include/wx/image.h b/include/wx/image.h index cbff996d75..04c131e040 100644 --- a/include/wx/image.h +++ b/include/wx/image.h @@ -282,6 +282,16 @@ public: // wxImage //----------------------------------------------------------------------------- + +// GRG: Dic/99 +class WXDLLEXPORT wxHNode +{ +public: + unsigned long index; + unsigned long value; +}; + + class WXDLLEXPORT wxImage: public wxObject { DECLARE_DYNAMIC_CLASS(wxImage) @@ -379,6 +389,10 @@ public: static void CleanUpHandlers(); static void InitStandardHandlers(); + // GRG: Dic/99 + unsigned long ComputeHistogram( wxHashTable &h ); + + protected: static wxList sm_handlers; diff --git a/src/common/image.cpp b/src/common/image.cpp index 1eaadf02e2..725cff015c 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -2297,3 +2297,49 @@ public: }; IMPLEMENT_DYNAMIC_CLASS(wxImageModule, wxModule) + + +//----------------------------------------------------------------------------- + +// GRG, Dic/99 +// Computes the histogram of the image and fills a hash table, indexed +// with integer keys built as 0xRRGGBB, containing wxHNode objects. Each +// wxHNode contains an 'index' (useful to build a palette with the image +// colours) and a 'value', which is the number of pixels in the image with +// that colour. + +unsigned long wxImage::ComputeHistogram( wxHashTable &h ) +{ + unsigned char r, g, b, *p; + unsigned long size, nentries, key; + wxHNode *hnode; + + p = GetData(); + size = GetWidth() * GetHeight(); + nentries = 0; + + for (unsigned long j = 0; j < size; j++) + { + r = *(p++); + g = *(p++); + b = *(p++); + key = (r << 16) | (g << 8) | b; + + hnode = (wxHNode *) h.Get(key); + + if (hnode) + hnode->value++; + else + { + hnode = new wxHNode(); + hnode->index = nentries++; + hnode->value = 1; + + h.Put(key, (wxObject *)hnode); + } + } + + return nentries; +} + +