Как создать std :: map экземпляров Gdk :: Pixbuf и использовать его в Gdk :: Cairo - PullRequest
0 голосов
/ 29 декабря 2018

Полагаю, что это может показаться тривиальным, но я спрашиваю здесь, поскольку я не смог найти простой ответ.

Давайте углубимся в проблему:

Наличие нескольких изображений вместес контекста Каира, который использует эти изображения непрерывно.Естественно, я могу сделать это, как показано ниже:

Glib::RefPtr<Gdk::Pixbuf>  image;
image = Gdk::Pixbuf::create_from_resource("/image/icon1"); //there are numerous icons out there

Затем я могу использовать его с указателем контекста Cairo следующим образом:

bool MyClass::on_draw(const Cairo::RefPtr<Cairo::Context> &cr)
{
 // ... some code
 Gdk::Cairo::set_source_pixbuf(cr, image, x0 , y0); //x0 , y0 : somewhere in the context
 cr->paint();
 return true;
}

Изображения не меняются, но каждый раз создается экземпляр Pixbuf.Я хочу использовать c ++ map и поместить в него свои иконки.Затем я хочу получить указатель изображения с карты.Я сделал что-то вроде этого:

std::map<Glib::ustring , GdkPixbuf*> map_Images;
// ..
map_images.insert(pair<Glib::ustring , GdkPixbuf* >("icon1" , image->gobj() )); // I do the same with all of my frequently referred icons

Теперь я не знаю, как мне назвать эту карту для использования в контексте Каира.Другими словами, как мне сделать Glib :: RefPtr из базового объекта, скажем, GdkPixbuf *

1 Ответ

0 голосов
/ 29 декабря 2018

Я бы порекомендовал вам сделать map_Images карту типа std::map<Glib::ustring , Glib::RefPtr<Gdk::Pixbuf> > и сделать ее членом данных MyClass.Потому что Glib::RefPtr освободит объект-владелец, как только все ссылки на этот указатель будут потеряны.

Я хочу сказать, что если у вас есть код, подобный следующему:

... some function, say fun1 
{
    Glib::RefPtr<Gdk::Pixbuf>  image;
    image = Gdk::Pixbuf::create_from_resource("/image/icon1");

    map_images.insert(pair<Glib::ustring , GdkPixbuf* >("icon1" , image->gobj() ));
} // image object will die here. So, Gdk::Pixbuf held by Glib::RefPtr will be deallocated

Теперь,Если вы попытаетесь получить доступ к Gdk::Pixbuf * с карты, вы получите свисающий указатель.

В этом случае пропустите следующую часть.В противном случае продолжите чтение.

Создание Glib::RefPtr типа Gdk::Pixbuf кажется простым.В соответствии с исходным кодом, который я нашел на GitHub: https://github.com/GNOME/glibmm/blob/master/glib/glibmm/refptr.h, make_refptr_for_instance(T_CppObject* object) API должен выполнить эту работу за вас.

Если вы действительно хотите создать Glib::RefPtr типа Gdk::Pixbuf, вы можетеполучить его по телефону:

Glib::RefPtr<Gdk::Pixbuf> imageForIcon1 = make_refptr_for_instance<Gdk::Pixbuf>(map_images["icon1"]); // assumption: map_images already has an element with key "icon1"

Надеюсь, это поможет.

...