Check for NULLs params within the functions
[claws.git] / src / stock_pixmap.c
index 3a59a36dc9cdd6d0a600808bc2292064cb9b0050..807d862a51de4d96af0d604de41d534e8a597033 100644 (file)
 
 #include <glib.h>
 #include <gtk/gtk.h>
-#include <librsvg/rsvg.h>
 #include <string.h>
 #include <dirent.h>
+#ifdef HAVE_SVG
+#include <librsvg/rsvg.h>
+#include <math.h>
+#endif
 
 #include "defs.h"
 #include "stock_pixmap.h"
 #include "pixmaps/down_arrow.xpm"
 #include "pixmaps/up_arrow.xpm"
 #include "pixmaps/exec.xpm"
-#include "pixmaps/mail.xpm"
+#include "pixmaps/mail_draft.xpm"
 #include "pixmaps/mail_attach.xpm"
 #include "pixmaps/mail_compose.xpm"
 #include "pixmaps/mail_forward.xpm"
+#include "pixmaps/mail_privacy_encrypted.xpm"
+#include "pixmaps/mail_privacy_signed.xpm"
 #include "pixmaps/mail_receive.xpm"
 #include "pixmaps/mail_receive_all.xpm"
 #include "pixmaps/mail_reply.xpm"
 #include "pixmaps/mime_calendar.xpm"
 #include "pixmaps/mime_pgpsig.xpm"
 #include "pixmaps/printer.xpm"
+#include "pixmaps/printer_btn.xpm"
 #include "pixmaps/privacy_signed.xpm"
 #include "pixmaps/privacy_passed.xpm"
 #include "pixmaps/privacy_failed.xpm"
@@ -318,10 +324,12 @@ static StockPixmapData pixmaps[] =
     {linewrapcurrent_xpm              , NULL, NULL, "linewrapcurrent", NULL, NULL},
     {linewrap_xpm                     , NULL, NULL, "linewrap", NULL, NULL},
     {locked_xpm                       , NULL, NULL, "locked", NULL, NULL},
-    {mail_xpm                         , NULL, NULL, "mail", NULL, NULL},
+    {mail_draft_xpm                   , NULL, NULL, "mail_draft", NULL, NULL},
     {mail_attach_xpm                  , NULL, NULL, "mail_attach", NULL, NULL},
     {mail_compose_xpm                 , NULL, NULL, "mail_compose", NULL, NULL},
     {mail_forward_xpm                 , NULL, NULL, "mail_forward", NULL, NULL},
+    {mail_privacy_encrypted_xpm       , NULL, NULL, "mail_privacy_encrypted", NULL, NULL},
+    {mail_privacy_signed_xpm          , NULL, NULL, "mail_privacy_signed", NULL, NULL},
     {mail_receive_xpm                 , NULL, NULL, "mail_receive", NULL, NULL},
     {mail_receive_all_xpm             , NULL, NULL, "mail_receive_all", NULL, NULL},
     {mail_reply_xpm                   , NULL, NULL, "mail_reply", NULL, NULL},
@@ -390,6 +398,7 @@ static StockPixmapData pixmaps[] =
     {mime_ps_xpm                      , NULL, NULL, "mime_ps", NULL, NULL},
     {mime_calendar_xpm                , NULL, NULL, "mime_calendar", NULL, NULL},
     {mime_pgpsig_xpm                  , NULL, NULL, "mime_pgpsig", NULL, NULL},
+    {printer_btn_xpm                  , NULL, NULL, "printer_btn", NULL, NULL},
     {printer_xpm                      , NULL, NULL, "printer", NULL, NULL},
     {privacy_signed_xpm               , NULL, NULL, "privacy_signed", NULL, NULL},
     {privacy_passed_xpm               , NULL, NULL, "privacy_passed", NULL, NULL},
@@ -614,11 +623,6 @@ GdkPixbuf *pixbuf_from_svg_like_icon(char *filename, GError **error, StockPixmap
        cm_return_val_if_fail(filename != NULL, NULL);
        cm_return_val_if_fail(icondata != NULL, NULL);
 
-       if (sscanf((icondata->data)[0], "%d %d ", &width, &height) != 2) {
-               g_warning("failed reading icondata width and height");
-               return NULL;
-       }
-
        /* load SVG file */
        handle = rsvg_handle_new_from_file(filename, error);
        if (handle == NULL) {
@@ -626,6 +630,28 @@ GdkPixbuf *pixbuf_from_svg_like_icon(char *filename, GError **error, StockPixmap
                                (*error)->message, (*error)->code);
                return NULL;
        }
+
+       /* scale dimensions */
+       if (prefs_common.enable_pixmap_scaling) {
+               /* default is pixmap icon size */
+               if (sscanf((icondata->data)[0], "%d %d ", &width, &height) != 2) {
+                       g_warning("failed reading icondata width and height");
+                       return NULL;
+               }
+               /* which can be modified by some factor */
+               if (prefs_common.pixmap_scaling_ppi > 0) {
+                       gdouble factor = (gdouble) prefs_common.pixmap_scaling_ppi / MIN_PPI;
+                       width = (int) floor(factor * width);
+                       height = (int) floor(factor * height);
+               }
+       } else { /* render using SVG size */
+               RsvgDimensionData dimension;
+
+               rsvg_handle_get_dimensions (handle, &dimension);
+               width = dimension.width;
+               height = dimension.height;
+       }
+
        /* create drawing context */
        surface = cairo_image_surface_create(
                        alpha? CAIRO_FORMAT_ARGB32: CAIRO_FORMAT_RGB24,
@@ -689,7 +715,8 @@ try_next_extension:
                                        GError *err = NULL;
 #ifdef HAVE_SVG
                                        if (!strncmp(extension[i], ".svg", 4)) {
-                                               pix = pixbuf_from_svg_like_icon(icon_file_name, &err, pix_d, TRUE);
+                                               pix = pixbuf_from_svg_like_icon(icon_file_name, &err, pix_d,
+                                                               prefs_common.enable_alpha_svg);
                                        } else {
                                                pix = gdk_pixbuf_new_from_file(icon_file_name, &err);
                                        }
@@ -813,11 +840,32 @@ void stock_pixmap_themes_list_free(GList *list)
 {
        GList *ptr;
 
+       cm_return_if_fail(list != NULL);
+
        for (ptr = g_list_first(list); ptr != NULL; ptr = g_list_next(ptr))
                g_free(ptr->data);
        g_list_free(list);
 }
 
+void stock_pixmap_invalidate_all_icons(void)
+{
+       StockPixmapData *pix_d;
+       int i = 0;
+
+       while (i < N_STOCK_PIXMAPS) {
+               pix_d = &pixmaps[i];
+               if (pix_d->pixbuf) {
+                       g_object_unref(G_OBJECT(pix_d->pixbuf));
+                       pix_d->pixbuf = NULL;
+               }
+               if (pix_d->pixmap) {
+                       g_object_unref(G_OBJECT(pix_d->pixmap));
+                       pix_d->pixmap = NULL;
+               }
+               i++;
+       }
+}
+
 gchar *stock_pixmap_get_name (StockPixmap icon)
 {
        if (icon >= N_STOCK_PIXMAPS)