]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/image.cpp
timercmn rewritten from scratch
[wxWidgets.git] / src / common / image.cpp
index 1eaadf02e212d71bc4d5dab7861ecce5548790b2..59c7baec99ac42b65d7137cc96a0cb372dda3e2e 100644 (file)
@@ -747,7 +747,7 @@ wxBitmap wxImage::ConvertToBitmap() const
 
     // create a DIB header
     int headersize = sizeof(BITMAPINFOHEADER);
-    LPBITMAPINFO lpDIBh = (BITMAPINFO *) malloc( headersize );
+    BITMAPINFO *lpDIBh = (BITMAPINFO *) malloc( headersize );
     wxCHECK_MSG( lpDIBh, bitmap, wxT("could not allocate memory for DIB header") );
     // Fill in the DIB header
     lpDIBh->bmiHeader.biSize = headersize;
@@ -939,7 +939,7 @@ wxImage::wxImage( const wxBitmap &bitmap )
 
     // create a DIB header
     int headersize = sizeof(BITMAPINFOHEADER);
-    LPBITMAPINFO lpDIBh = (BITMAPINFO *) malloc( headersize );
+    BITMAPINFO *lpDIBh = (BITMAPINFO *) malloc( headersize );
     if( !lpDIBh )
     {
         wxFAIL_MSG( wxT("could not allocate data for DIB header") );
@@ -1260,11 +1260,11 @@ wxImage::wxImage( const wxBitmap &bitmap )
         }       
         SetMaskColour( r, g, b );
         SetMask( TRUE );
-    }  
+    }
     else
     {
         SetMask( FALSE );
-    }  
+    }
     // free allocated resources      
     ::ReleaseDC(NULL, hdc);   
     free(lpDIBh);
@@ -2297,3 +2297,93 @@ public:
 };
 
 IMPLEMENT_DYNAMIC_CLASS(wxImageModule, wxModule)
+
+
+//-----------------------------------------------------------------------------
+
+// GRG, Dic/99
+// Counts and returns the number of different colours. Optionally stops
+// when it exceeds 'stopafter' 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(256)). Default
+// value for stopafter is -1 (don't care).
+//
+unsigned long wxImage::CountColours( unsigned long stopafter )
+{
+    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 <= stopafter) ; 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;
+    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;
+}
+
+