* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
GtkIconSize icon_size;
gint pixel_size;
- gboolean use_fallback;
+ guint use_fallback : 1;
+ guint force_scale_pixbuf : 1;
GdkPixbuf *rendered_pixbuf;
GtkStateFlags last_rendered_state;
self->priv->rendered_pixbuf = ensure_stated_icon_from_info (self, context, info);
if (info)
- gtk_icon_info_free (info);
+ g_object_unref (info);
}
static void
gtk_icon_set_render_icon_pixbuf (icon_set, context, self->priv->icon_size);
}
+static void
+ensure_pixbuf_at_size (GtkIconHelper *self,
+ GtkStyleContext *context)
+{
+ gint width, height;
+
+ if (!check_invalidate_pixbuf (self, context))
+ return;
+
+ if (self->priv->rendered_pixbuf)
+ return;
+
+ if (self->priv->pixel_size != -1 ||
+ self->priv->icon_size != GTK_ICON_SIZE_INVALID)
+ {
+ ensure_icon_size (self, context, &width, &height);
+
+ if (width < gdk_pixbuf_get_width (self->priv->orig_pixbuf) ||
+ height < gdk_pixbuf_get_height (self->priv->orig_pixbuf))
+ self->priv->rendered_pixbuf =
+ gdk_pixbuf_scale_simple (self->priv->orig_pixbuf,
+ width, height,
+ GDK_INTERP_BILINEAR);
+ }
+
+ if (!self->priv->rendered_pixbuf)
+ self->priv->rendered_pixbuf = g_object_ref (self->priv->orig_pixbuf);
+}
+
GdkPixbuf *
_gtk_icon_helper_ensure_pixbuf (GtkIconHelper *self,
GtkStyleContext *context)
switch (self->priv->storage_type)
{
case GTK_IMAGE_PIXBUF:
- pixbuf = g_object_ref (self->priv->orig_pixbuf);
+ if (self->priv->force_scale_pixbuf)
+ ensure_pixbuf_at_size (self, context);
+ else
+ pixbuf = g_object_ref (self->priv->orig_pixbuf);
break;
case GTK_IMAGE_STOCK:
icon_set = gtk_style_context_lookup_icon_set (context, self->priv->stock_id);
- ensure_pixbuf_for_icon_set (self, context, icon_set);
+ if (icon_set != NULL)
+ ensure_pixbuf_for_icon_set (self, context, icon_set);
+ else
+ pixbuf = NULL;
break;
case GTK_IMAGE_ICON_SET:
{
_gtk_icon_helper_clear (self);
- if (icon_name != NULL)
+ if (icon_name != NULL &&
+ icon_name[0] != '\0')
{
self->priv->storage_type = GTK_IMAGE_ICON_NAME;
self->priv->icon_name = g_strdup (icon_name);
{
_gtk_icon_helper_clear (self);
- if (stock_id != NULL)
+ if (stock_id != NULL &&
+ stock_id[0] != '\0')
{
self->priv->storage_type = GTK_IMAGE_STOCK;
self->priv->stock_id = g_strdup (stock_id);
GdkPixbuf *
_gtk_icon_helper_peek_pixbuf (GtkIconHelper *self)
{
- g_return_val_if_fail (self->priv->storage_type == GTK_IMAGE_PIXBUF ||
- self->priv->storage_type == GTK_IMAGE_EMPTY, NULL);
-
return self->priv->orig_pixbuf;
}
GIcon *
_gtk_icon_helper_peek_gicon (GtkIconHelper *self)
{
- g_return_val_if_fail (self->priv->storage_type == GTK_IMAGE_GICON ||
- self->priv->storage_type == GTK_IMAGE_EMPTY, NULL);
-
return self->priv->gicon;
}
GdkPixbufAnimation *
_gtk_icon_helper_peek_animation (GtkIconHelper *self)
{
- g_return_val_if_fail (self->priv->storage_type == GTK_IMAGE_ANIMATION ||
- self->priv->storage_type == GTK_IMAGE_EMPTY, NULL);
-
return self->priv->animation;
}
GtkIconSet *
_gtk_icon_helper_peek_icon_set (GtkIconHelper *self)
{
- g_return_val_if_fail (self->priv->storage_type == GTK_IMAGE_ICON_SET ||
- self->priv->storage_type == GTK_IMAGE_EMPTY, NULL);
-
return self->priv->icon_set;
}
const gchar *
_gtk_icon_helper_get_stock_id (GtkIconHelper *self)
{
- g_return_val_if_fail (self->priv->storage_type == GTK_IMAGE_STOCK ||
- self->priv->storage_type == GTK_IMAGE_EMPTY, NULL);
-
return self->priv->stock_id;
}
const gchar *
_gtk_icon_helper_get_icon_name (GtkIconHelper *self)
{
- g_return_val_if_fail (self->priv->storage_type == GTK_IMAGE_ICON_NAME ||
- self->priv->storage_type == GTK_IMAGE_EMPTY, NULL);
-
return self->priv->icon_name;
}
{
return (self->priv->storage_type == GTK_IMAGE_EMPTY);
}
+
+gboolean
+_gtk_icon_helper_get_force_scale_pixbuf (GtkIconHelper *self)
+{
+ return self->priv->force_scale_pixbuf;
+}
+
+void
+_gtk_icon_helper_set_force_scale_pixbuf (GtkIconHelper *self,
+ gboolean force_scale)
+{
+ if (self->priv->force_scale_pixbuf != force_scale)
+ {
+ self->priv->force_scale_pixbuf = force_scale;
+ _gtk_icon_helper_invalidate (self);
+ }
+}