From 89d00456283f3cd6b820a8d41950db6a160e9a70 Mon Sep 17 00:00:00 2001 From: Guillermo Rodriguez Garcia Date: Wed, 15 Dec 1999 12:31:28 +0000 Subject: [PATCH] Added CountColours() git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4957 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/image.h | 1 + src/common/image.cpp | 46 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/include/wx/image.h b/include/wx/image.h index 04c131e040..c590788ad8 100644 --- a/include/wx/image.h +++ b/include/wx/image.h @@ -390,6 +390,7 @@ public: static void InitStandardHandlers(); // GRG: Dic/99 + unsigned long CountColours( unsigned long stopat = -1 ); unsigned long ComputeHistogram( wxHashTable &h ); diff --git a/src/common/image.cpp b/src/common/image.cpp index 725cff015c..4a7a6a4a1a 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -2301,13 +2301,57 @@ IMPLEMENT_DYNAMIC_CLASS(wxImageModule, wxModule) //----------------------------------------------------------------------------- +// GRG, Dic/99 +// Counts and returns the number of different colours. Optionally stops +// when it reaches 'stopat' different colours. This is useful, for example, +// to see if the image can be saved as 8-bit (256 colour or less, in this +// case it would be invoked as CountColours(257)). Default value for stopat +// is -1 (don't care). +// +unsigned long wxImage::CountColours( unsigned long stopat ) +{ + wxHashTable h; + wxNode *node; + wxHNode *hnode; + unsigned char r, g, b, *p; + unsigned long size, nentries, key; + + p = GetData(); + size = GetWidth() * GetHeight(); + nentries = 0; + + for (unsigned long j = 0; (j < size) && (nentries < stopat) ; j++) + { + r = *(p++); + g = *(p++); + b = *(p++); + key = (r << 16) | (g << 8) | b; + + hnode = (wxHNode *) h.Get(key); + + if (!hnode) + { + h.Put(key, (wxObject *)(new wxHNode)); + nentries++; + } + } + + // delete all HNodes + h.BeginFind(); + while ((node = h.Next()) != NULL) + delete (wxHNode *)node->GetData(); + + return nentries; +} + + // 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;