gnome: add different avatar for conferences

Create avatar with two symbolic people to distinguish a conference.

Issue: #79076
Change-Id: Ie6b4b33af4d8fae2a188c23cb7cb5877bb64f199
diff --git a/src/native/pixbufmanipulator.cpp b/src/native/pixbufmanipulator.cpp
index e1458ad..e7aca08 100644
--- a/src/native/pixbufmanipulator.cpp
+++ b/src/native/pixbufmanipulator.cpp
@@ -42,6 +42,7 @@
 
 PixbufManipulator::PixbufManipulator()
     : fallbackAvatar_{ring_draw_fallback_avatar(FALLBACK_AVATAR_SIZE), g_object_unref}
+    , conferenceAvatar_{ring_draw_conference_avatar(FALLBACK_AVATAR_SIZE), g_object_unref}
 {
 }
 
@@ -79,6 +80,8 @@
 QVariant
 PixbufManipulator::callPhoto(Call* c, const QSize& size, bool displayPresence)
 {
+    if (c->type() == Call::Type::CONFERENCE)
+        return QVariant::fromValue(scaleAndFrame(conferenceAvatar_.get(), size));
     return callPhoto(c->peerContactMethod(), size, displayPresence);
 }
 
diff --git a/src/native/pixbufmanipulator.h b/src/native/pixbufmanipulator.h
index 77ec780..8b7e43b 100644
--- a/src/native/pixbufmanipulator.h
+++ b/src/native/pixbufmanipulator.h
@@ -63,6 +63,7 @@
 private:
     std::shared_ptr<GdkPixbuf> scaleAndFrame(const GdkPixbuf *photo, const QSize& size);
     std::shared_ptr<GdkPixbuf> fallbackAvatar_;
+    std::shared_ptr<GdkPixbuf> conferenceAvatar_;
 };
 
 } // namespace Interfaces
diff --git a/src/utils/drawing.c b/src/utils/drawing.c
index 50e255b..454fb9d 100644
--- a/src/utils/drawing.c
+++ b/src/utils/drawing.c
@@ -73,6 +73,43 @@
 }
 
 GdkPixbuf *
+ring_draw_conference_avatar(int size) {
+    cairo_surface_t *surface;
+    cairo_t *cr;
+
+    surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, size, size);
+    cr = cairo_create(surface);
+
+    cairo_pattern_t *linpat = cairo_pattern_create_linear(0, 0, 0, size);
+    cairo_pattern_add_color_stop_rgb(linpat, 0, 0.937, 0.937, 0.937);
+    cairo_pattern_add_color_stop_rgb(linpat, 1, 0.969, 0.969, 0.969);
+
+    cairo_set_source(cr, linpat);
+    cairo_paint(cr);
+
+    int avatar_size = size * 0.5;
+    GtkIconInfo *icon_info = gtk_icon_theme_lookup_icon(gtk_icon_theme_get_default(), "system-users-symbolic",
+                                                        avatar_size, GTK_ICON_LOOKUP_GENERIC_FALLBACK);
+    GdkPixbuf *pixbuf_icon = gtk_icon_info_load_icon(icon_info, NULL);
+    g_object_unref(icon_info);
+
+    if (pixbuf_icon != NULL) {
+        gdk_cairo_set_source_pixbuf(cr, pixbuf_icon, (size - avatar_size) / 2, (size - avatar_size) / 2);
+        g_object_unref(pixbuf_icon);
+        cairo_rectangle(cr, (size - avatar_size) / 2, (size - avatar_size) / 2, avatar_size, avatar_size);
+        cairo_fill(cr);
+    }
+
+    GdkPixbuf *pixbuf = gdk_pixbuf_get_from_surface(surface, 0, 0, size, size);
+
+    /* free resources */
+    cairo_destroy(cr);
+    cairo_surface_destroy(surface);
+
+    return pixbuf;
+}
+
+GdkPixbuf *
 ring_frame_avatar(GdkPixbuf *avatar) {
     int extra_space = 10;
     int offset = extra_space/2;
diff --git a/src/utils/drawing.h b/src/utils/drawing.h
index dd8e54b..fd0881d 100644
--- a/src/utils/drawing.h
+++ b/src/utils/drawing.h
@@ -37,8 +37,10 @@
 
 GdkPixbuf *ring_draw_fallback_avatar(int size);
 
+GdkPixbuf *ring_draw_conference_avatar(int size);
+
 GdkPixbuf *ring_frame_avatar(GdkPixbuf *avatar);
 
 G_END_DECLS
 
-#endif /* _DRAWING */
\ No newline at end of file
+#endif /* _DRAWING */