// 2. write the header:
char tmpbuf[200];
- // VS: 200b is safe upper bound for anything produced by sprintf bellow
+ // VS: 200b is safe upper bound for anything produced by sprintf below
// (101 bytes the string, neither %i can expand into more than 10 chars)
sprintf(tmpbuf,
"/* XPM */\n"
stream.Write(tmpbuf, strlen(tmpbuf));
// 3. create color symbols table:
- wxHashTable table(wxKEY_INTEGER);
- table.DeleteContents(TRUE);
- image->ComputeHistogram(table);
+ wxImageHistogram histogram;
+ image->ComputeHistogram(histogram);
char *symbols_data = new char[cols * (chars_per_pixel+1)];
char **symbols = new char*[cols];
// 2a. find mask colour:
- long mask_key = -1;
+ unsigned long mask_key = 0x1000000 /*invalid RGB value*/;
if (image->HasMask())
mask_key = (image->GetMaskRed() << 16) |
(image->GetMaskGreen() << 8) | image->GetMaskBlue();
// 2b. generate colour table:
- table.BeginFind();
- wxNode *node = NULL;
- while ((node = table.Next()) != NULL)
+ for (wxImageHistogram::iterator entry = histogram.begin();
+ entry != histogram.end(); entry++ )
{
- wxHNode *hnode = (wxHNode*) node->GetData();
- long index = hnode->index;
+ unsigned long index = entry->second.index;
symbols[index] = symbols_data + index * (chars_per_pixel+1);
char *sym = symbols[index];
}
sym[j] = '\0';
- long key = node->GetKeyInteger();
+ unsigned long key = entry->first;
if (key == 0)
tmp.Printf(wxT("\"%s c Black\",\n"), sym);
for (i = 0; i < image->GetWidth(); i++, data += 3)
{
unsigned long key = (data[0] << 16) | (data[1] << 8) | (data[2]);
- wxHNode *hnode = (wxHNode*) table.Get(key);
- stream.Write(symbols[hnode->index], chars_per_pixel);
+ stream.Write(symbols[histogram[key].index], chars_per_pixel);
}
tmp_c = '\"'; stream.Write(&tmp_c, 1);
if ( j + 1 < image->GetHeight() )
tmp = wxT("};\n");
stream.Write(tmp.mb_str(), 3);
+ // Clean up:
delete[] symbols;
delete[] symbols_data;