From 77c6acf90f4adae6ec78beb7b2aa681f7c9d17dd Mon Sep 17 00:00:00 2001 From: twanvl Date: Sun, 24 Dec 2006 00:41:46 +0000 Subject: [PATCH] hack to fix completely transparent images git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@161 0fc631ac-6414-0410-93d0-97cfa31319b6 --- src/gfx/resample_image.cpp | 25 ++++--------------------- src/gui/value/choice.cpp | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/gfx/resample_image.cpp b/src/gfx/resample_image.cpp index f3fd421f..d8d23450 100644 --- a/src/gfx/resample_image.cpp +++ b/src/gfx/resample_image.cpp @@ -141,28 +141,10 @@ void resample_and_clip(const Image& img_in, Image& img_out, wxRect rect) { // ----------------------------------------------------------------------------- : Aspect ratio preserving -// fill an image with 100% transparent, except for the given rectangle -void fill_transparent(Image& img, int dx, int dy, int w, int h) { +// fill an image with 100% transparent +void fill_transparent(Image& img) { if (!img.HasAlpha()) img.InitAlpha(); memset(img.GetAlpha(), 0, img.GetWidth() * img.GetHeight()); - /*/? - int iw = img.GetWidth(), ih = img.GetHeight(); - Byte* data = img.GetAlpha(); - // fill - int y = 0; - for (; y < dy ; ++y) { - for (int x = 0 ; x < iw ; ++x) *data++ = 0; - } - for (; y < dy + h ; ++y) { - int x = 0; - for (; x < dx ; ++x) *data++ = 0; - for (; x < dx + w ; ++x) *data++ = 255; - for (; x < iw ; ++x) *data++ = 0; - } - for (; y < ih ; ++y) { - for (int x = 0 ; x < iw ; ++x) *data++ = 0; - } - */ } void resample_preserve_aspect(const Image& img_in, Image& img_out) { @@ -175,10 +157,11 @@ void resample_preserve_aspect(const Image& img_in, Image& img_out) { int dx = (img_out.GetWidth() - rwidth) / 2; int dy = (img_out.GetHeight() - rheight) / 2; // transparent background - fill_transparent(img_out, dx, dy, rwidth, rheight); + fill_transparent(img_out); // resample int offset_out = dx + img_out.GetWidth() * dy; Image img_temp(rwidth, img_in.GetHeight(), false); + img_temp.InitAlpha(); resample_pass(img_in, img_temp, 0, 0, img_in.GetWidth(), 1, rwidth, 1, img_in.GetHeight(), img_in.GetWidth(), img_temp.GetWidth()); resample_pass(img_temp, img_out, 0, offset_out, img_in.GetHeight(), img_temp.GetWidth(), rheight, img_out.GetWidth(), rwidth, 1, 1); } diff --git a/src/gui/value/choice.cpp b/src/gui/value/choice.cpp index 4a549a6c..d12871a5 100644 --- a/src/gui/value/choice.cpp +++ b/src/gui/value/choice.cpp @@ -51,6 +51,27 @@ void ChoiceThumbnailRequest::store(const Image& img) { il->Add(wxBitmap(16,16),*wxBLACK); } if (img.Ok()) { + #ifdef __WXMSW__ + // for some reason windows doesn't like completely transparent images if they do not have a mask + // HACK: + if (img.GetWidth() == 16 && img.GetHeight() == 16) { + // is the image empty? + bool empty = true; + int* b = (int*)img.GetAlpha(); + int* e = b + 16*16/sizeof(int); + while (b != e) { + if (*b++) { + empty = false; + break; + } + } + // if so, use a mask instead + if (empty) { + const_cast(img).ConvertAlphaToMask(); + } + } + // Hack ends here + #endif if (id == il->GetImageCount()) { il->Add(img); } else {