Scaled bitmap not displayed in BitmapButton
-
On 30/11/2016 at 06:11, xxxxxxxx wrote:
User Information:
Cinema 4D Version: R18
Platform:
Language(s) : C++ ;---------
Hello,my plugin loads an image from a file and displays it in a BitmapButtonCustomGui in the Attributes Manager.
That works alright, but when I scale it after loading, it is no longer displayed, although the scaling code
appears to be correct. I confirmed this by using ShowBitmap() after the scaling and it gives me the correct
result (displays the image in the Picture Viewer with the new size).Scaling code:
/\*\* \* Flags for #scale_uniform(). \*/ enum scale_uniform_direction { scale_uniform_w, scale_uniform_h }; /\*\* \* Scale a bitmap uniformly to the specified size in the direction \* specified with #scale_uniform_direction. Returns a new bitmap, the \* input bitmap is NOT freed. \*/ inline BaseBitmap\* scale_uniform(BaseBitmap const\* bmp, Int32 size, scale_uniform_direction direction) { if (!bmp) return nullptr; Int32 dw, dh; if (direction == scale_uniform_w) { dw = size; dh = (size / Float(bmp->GetBw())) \* bmp->GetBh(); } else { dh = size; dw = (size / Float(bmp->GetBh())) \* bmp->GetBw(); } AutoAlloc<BaseBitmap> out; if (!out) return nullptr; if (IMAGERESULT_OK != out->Init(dw, dh, out->GetBt())) return nullptr; bmp->ScaleIt(out, 256, true, true); return out.Release(); }
Loader code:
Filename filename = fn.GetDirectory() + header.iconfile.c_str(); this->icon->Init(filename); filename = fn.GetDirectory() + header.previewfile.c_str(); this->preview->Init(filename); this->preview.Assign(utils::scale_uniform( this->preview, this->icon->GetBw(), utils::scale_uniform_w));
GetDParameter:
Bool GetDParameter(GeListNode\* node, DescID const& did, GeData& data, DESCFLAGS_GET& flags) override { if (!node) return false; switch (did[0].id) { case MY_ICON: case MY_PREVIEW: { BitmapButtonStruct bbs(static_cast<BaseObject\*>(node), did, this->dirty); data = GeData(CUSTOMDATATYPE_BITMAPBUTTON, bbs); flags |= DESCFLAGS_GET_PARAM_GET; break; } } return ObjectData::GetDParameter(node, did, data, flags); }
DescriptionGetBitmap message:
Bool Message(GeListNode\* node, Int32 msg, void\* pdata) override { switch (msg) { case MSG_DESCRIPTION_GETBITMAP: { auto\* data = static_cast<DescriptionGetBitmap\*>(pdata); if (!data) return false; this->get_bitmap(\*data); return true; } } return ObjectData::Message(node, msg, pdata); } void get_bitmap(DescriptionGetBitmap& data) { switch (data.id[0].id) { case MY_ICON: { data.bmp = this->icon->GetClone(); break; } case MY_PREVIEW: { data.bmp = this->preview->GetClone(); break; } } }
I have no idea what's happening I hope anyone else does!
Thanks in advance,
Niklas
-
On 30/11/2016 at 11:28, xxxxxxxx wrote:
Nevermind, I found the issue. I was accidentally using out->GetBt() instead of bmp->GetBt().