+    unsigned char * rgbBits = image.GetData();
+    int w = image.GetWidth() ;
+    int h = image.GetHeight();
+    bool bHasMask = image.HasMask();
+    int imagebitcount = (w*h)/8;
+
+    unsigned char * bits = new unsigned char [imagebitcount];
+    unsigned char * maskBits = new unsigned char [imagebitcount];
+
+    int i, j, i8; unsigned char c, cMask;
+    for (i=0; i<imagebitcount; i++)
+    {
+        bits[i] = 0;
+        i8 = i * 8;
+
+        cMask = 1;
+        for (j=0; j<8; j++)
+        {
+            // possible overflow if we do the summation first ?
+            c = rgbBits[(i8+j)*3]/3 + rgbBits[(i8+j)*3+1]/3 + rgbBits[(i8+j)*3+2]/3;
+            //if average value is > mid grey
+            if (c>127)
+                bits[i] = bits[i] | cMask;
+            cMask = cMask * 2;
+        }
+    }
+
+    unsigned long keyMaskColor;
+    if (bHasMask)
+    {
+        unsigned char
+            r = image.GetMaskRed(),
+            g = image.GetMaskGreen(),
+            b = image.GetMaskBlue();
+
+        for (i=0; i<imagebitcount; i++)
+        {
+            maskBits[i] = 0x0;
+            i8 = i * 8;
+
+            cMask = 1;
+            for (j=0; j<8; j++)
+            {
+                if (rgbBits[(i8+j)*3] != r || rgbBits[(i8+j)*3+1] != g || rgbBits[(i8+j)*3+2] != b)
+                    maskBits[i] = maskBits[i] | cMask;
+                cMask = cMask * 2;
+            }
+        }
+
+        keyMaskColor = (r << 16) | (g << 8) | b;
+    }
+    else // no mask
+    {
+        for (i=0; i<imagebitcount; i++)
+            maskBits[i] = 0xFF;
+
+        // init it to avoid compiler warnings
+        keyMaskColor = 0;
+    }
+
+    // find the most frequent color(s)
+    wxImageHistogram histogram;
+    image.ComputeHistogram(histogram);
+
+    // colors as rrggbb
+    unsigned long key;
+    unsigned long value;
+
+    long colMostFreq = 0;
+    unsigned long nMost = 0;
+    long colNextMostFreq = 0;
+    unsigned long nNext = 0;
+    for ( wxImageHistogram::iterator entry = histogram.begin();
+          entry != histogram.end();
+          ++entry )
+    {
+        value = entry->second.value;
+        key = entry->first;
+        if ( !bHasMask || (key != keyMaskColor) )
+        {
+            if (value > nMost)
+            {
+                nMost = value;
+                colMostFreq = key;
+            }
+            else if (value > nNext)
+            {
+                nNext = value;
+                colNextMostFreq = key;
+            }
+        }
+    }