CreateIcon() aus xpm - wo sind meine Farben?

05/04/2011 - 09:52 von Edzard Egberts | Report spam
Ich will Icons aus xpm-files laden (Format unter
http://de.wikipedia.org/wiki/Xpm). Das hier ist mein furchtbar
zusammengehackter Code (Proof of concept ;o), mit dem ich die Icons
monochrom dargestellt bekomme, aber ich verstehe offensichtlich nicht,
wie die Farben angeordnet werden:

std::istringstream In(icon_xpm[0]); // Zeile Null auslesen:
int iw, ih; // Breite und Höhe des Icons
int lc, lz;
// Anzahl der Farben im Bild und Anzahl der Zeichen pro Pixel
// Die Farben werden in den Zeilen ab einschl. 1 definiert,
// dann kommen die Zeilen für die Pixel
In >> iw >> ih >> lc >> lz; // Alle Werte einlesen

typedef std::map< string, unsigned, std::less<string > > td_map_string_uint;
td_map_string_uint CMap; // Map für Zuordnung Farbzeichen -> RGB
string c1, c2;
unsigned HCol;
for (int i= 1; i<= lc; ++i)
{
string Z= icon_xpm[i];
c1= Z.substr(0, 2); // Codezeichen für die Farbe
c2= Z.substr(6, 6); // RGB Farbwert
std::istringstream H(c2);
H >> hex >> HCol; // Text nach Wert
CMap[c1]= HCol; // Codezeichen dem Farbwert zuordnen
// Alles Hex, keine symbolischen Werte
}

std::vector< unsigned char > AndPix;
std::vector< unsigned char > XorPix;
string Col(2, ' '); // Puffer zum Einlesen der Farbcodes
for (int i= 1; i<= ih; ++i)
{ // Eigentliches Icon lesen:
// Jeweils zwei Zeichen bezeichnen eine Farbe:
const char* pC= icon_xpm[lc +i];
for (int b= 0; b < 6; ++b)
{ // Bytes einer Zeile durchgehen
unsigned char B= 0;
for (int Pos= 0; Pos < 8; ++Pos)
{ // Bitposition nur zwischen Transparent und
// Farbe unterscheiden
if (pC[0]== ' ' && pC[1]== ' ') B|= int(pow(2, Pos));
pC+= 2;
}
AndPix.push_back(B);
}
for (int i= 0; i< iw; i+= 2)
{ // RGB-Farben der Zeile durchgehen
Col[0]= pC[i];
Col[1]= pC[i+1];
unsigned char* pU= (unsigned char*) &CMap[Col];
XorPix.push_back(pU[0]);
XorPix.push_back(pU[1]);
XorPix.push_back(pU[2]);
// da bin ich mir mit MSB/LSB nicht sicher,
// irgendwelche Farbwerte müssten sich aber ergeben
}
}
HICON hIcon3= CreateIcon(
fl_display, // application instance
iw, // icon width
ih, // icon height
1, // number of XOR planes
24, // number of bits per pixel
&AndPix[0], // AND bitmask
&XorPix[0]); // XOR bitmask

Mit diesem Code erhalte ich das Icon schwarz vor dem Hintergrund - was
mache ich falsch? XorPix sollten die Pixel mit Farbwerten enthalten,
also 24 bit für RGB. Aber wofür sind die XOR planes gut?
Ich würde annehmen, dass man 3 planes für RGB-Pixel hat, aber das
funktioniert gar nicht. Und wie das mit dem Ausmaskieren mit Black,
White, Hintergrund, Reverse Hintergrund (siehe
http://msdn.microsoft.com/en-us/lib...ng_an_Icon)
funktionieren soll, wenn man keine monochromen Masken, sondern
monochrome Maske mit Map von Farbwerten vergleicht, ist mir auch nicht
wirklich klar.
 

Lesen sie die antworten

#1 Edzard Egberts
05/04/2011 - 09:57 | Warnen spam
Edzard Egberts schrieb:
int iw, ih; // Breite und Höhe des Icons


[...]
for (int b= 0; b < 6; ++b)
{ // Bytes einer Zeile durchgehen



"6" sollte durch iw/8 ersetzt werden - mein Beispiel-Icon ist 48 Pixel
breit.

Ähnliche fragen