- item_type = "<ImageItem>";
- // GTK2's image factory know about image items, but they need to
- // get a GdkPixbuf structure, which we need to create on the fly.
- // This Pixbuf structure needs to be static so we create it and
- // just make it a memory leak...
- wxImage image( mitem->GetBitmap().ConvertToImage() );
- size_t size = 4 + // magic
- 20 + // header
- image.GetHeight() * image.GetWidth() * 4; // RGBA
-
- unsigned char *dest = new unsigned char[size];
- entry.extra_data = dest;
-
- unsigned char *source = image.GetData();
- bool has_mask = image.HasMask();
- unsigned char mask_r = image.GetMaskRed();
- unsigned char mask_b = image.GetMaskBlue();
- unsigned char mask_g = image.GetMaskGreen();
- wxUint32 tmp;
-
- // Magic
- *dest = 'G'; dest++; *dest = 'd'; dest++; *dest = 'k'; dest++; *dest = 'P'; dest++;
- // Data size
- tmp = size;
- *dest = tmp >> 24; dest++; *dest = tmp >> 16; dest++; *dest = tmp >> 8; dest++; *dest = tmp; dest++;
- // Pixdata type
- *dest = 1; dest++; *dest = 1; dest++; *dest = 0; dest++; *dest = 2; dest++;
- // Rowstride
- tmp = image.GetWidth()*4;
- *dest = tmp >> 24; dest++; *dest = tmp >> 16; dest++; *dest = tmp >> 8; dest++; *dest = tmp; dest++;
- // Width
- tmp = image.GetWidth();
- *dest = tmp >> 24; dest++; *dest = tmp >> 16; dest++; *dest = tmp >> 8; dest++; *dest = tmp; dest++;
- // Height
- tmp = image.GetHeight();
- *dest = tmp >> 24; dest++; *dest = tmp >> 16; dest++; *dest = tmp >> 8; dest++; *dest = tmp; dest++;
-
- for (int i = 0; i < image.GetWidth()*image.GetHeight(); i++)
- {
- unsigned char r = *source; source++;
- unsigned char g = *source; source++;
- unsigned char b = *source; source++;
- *dest = r; dest++;
- *dest = g; dest++;
- *dest = b; dest++;
- if (has_mask && (r == mask_r) && (g == mask_g) && (b == mask_b))
- *dest = 0;
- else
- *dest = 255;
- dest++;
- }
- break;