X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/37e2cb08cd1910ec5a14b38f0addfc6e2e8e172e..6b82d89473972919c10d264efc94dd1ea4d64d9f:/src/common/image.cpp diff --git a/src/common/image.cpp b/src/common/image.cpp index bbd261d3cf..dc5fdf6c48 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -883,7 +883,12 @@ wxBitmap wxImage::ConvertToBitmap() const { for(i=0; idepth; - if ((bpp == 16) && (visual->red_mask != 0xf800)) bpp = 15; + if (bpp == 16) bpp = visual->red_prec + visual->green_prec + visual->blue_prec; + red_shift_right = visual->red_shift; + red_shift_left = 8-visual->red_prec; + green_shift_right = visual->green_shift; + green_shift_left = 8-visual->green_prec; + blue_shift_right = visual->blue_shift; + blue_shift_left = 8-visual->blue_prec; + + use_shift = (visual->type == GDK_VISUAL_TRUE_COLOR) || (visual->type == GDK_VISUAL_DIRECT_COLOR); } if (bitmap.GetBitmap()) { bpp = 1; } + GdkColormap *cmap = gtk_widget_get_default_colormap(); long pos = 0; @@ -1643,54 +1671,38 @@ wxImage::wxImage( const wxBitmap &bitmap ) { for (int i = 0; i < bitmap.GetWidth(); i++) { - wxInt32 pixel = gdk_image_get_pixel( gdk_image, i, j ); - if (bpp == 1) - { - if (pixel == 0) - { - data[pos] = 0; + wxUint32 pixel = gdk_image_get_pixel( gdk_image, i, j ); + if (bpp == 1) + { + if (pixel == 0) + { + data[pos] = 0; data[pos+1] = 0; data[pos+2] = 0; - } - else - { - data[pos] = 255; + } + else + { + data[pos] = 255; data[pos+1] = 255; data[pos+2] = 255; - } - } else if (bpp <= 8) + } + } + else if (use_shift) { - data[pos] = cmap->colors[pixel].red >> 8; - data[pos+1] = cmap->colors[pixel].green >> 8; - data[pos+2] = cmap->colors[pixel].blue >> 8; - } else if (bpp == 15) + data[pos] = (pixel >> red_shift_right) << red_shift_left; + data[pos+1] = (pixel >> green_shift_right) << green_shift_left; + data[pos+2] = (pixel >> blue_shift_right) << blue_shift_left; + } + else if (cmap->colors) { -#if (wxBYTE_ORDER == wxBIG_ENDIAN) - // ? -#endif - data[pos] = (pixel >> 7) & 0xf8; - data[pos+1] = (pixel >> 2) & 0xf8; - data[pos+2] = (pixel << 3) & 0xf8; - } else if (bpp == 16) - { -#if (wxBYTE_ORDER == wxBIG_ENDIAN) - // ? -#endif - data[pos] = (pixel >> 8) & 0xf8; - data[pos+1] = (pixel >> 3) & 0xfc; - data[pos+2] = (pixel << 3) & 0xf8; - } else + data[pos] = cmap->colors[pixel].red >> 8; + data[pos+1] = cmap->colors[pixel].green >> 8; + data[pos+2] = cmap->colors[pixel].blue >> 8; + } + else { -#if (wxBYTE_ORDER == wxBIG_ENDIAN) - data[pos] = (pixel) & 0xff; // Red - data[pos+1] = (pixel >> 8) & 0xff; // Green - data[pos+2] = (pixel >> 16) & 0xff; // Blue -#else - data[pos] = (pixel >> 16) & 0xff; - data[pos+1] = (pixel >> 8) & 0xff; - data[pos+2] = pixel & 0xff; -#endif - } + wxFAIL_MSG( wxT("Image conversion failed. Unknown visual type.") ); + } if (gdk_image_mask) {