/* * Authors: Rodney Dawes * * Copyright 2003 Novell, Inc. (www.novell.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. * */ #include "gnome-wp-utils.h" #include GdkPixbuf * gnome_wp_pixbuf_new_gradient (GtkOrientation orientation, GdkColor * c1, GdkColor * c2, gint width, gint height) { GdkPixbuf * pixbuf; gint i, j; gint dr, dg, db; gint gs1; gint vc = ((orientation == GTK_ORIENTATION_HORIZONTAL) || (c1 == c2)); guchar * b, * row, * d; int rowstride; pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, width, height); d = gdk_pixbuf_get_pixels (pixbuf); rowstride = gdk_pixbuf_get_rowstride (pixbuf); dr = c2->red - c1->red; dg = c2->green - c1->green; db = c2->blue - c1->blue; gs1 = (orientation == GTK_ORIENTATION_VERTICAL) ? height - 1 : width - 1; row = g_new (unsigned char, rowstride); if (vc) { b = row; for (j = 0; j < width; j++) { *b++ = (c1->red + (j * dr) / gs1) >> 8; *b++ = (c1->green + (j * dg) / gs1) >> 8; *b++ = (c1->blue + (j * db) / gs1) >> 8; } } for (i = 0; i < height; i++) { if (!vc) { unsigned char cr, cg, cb; cr = (c1->red + (i * dr) / gs1) >> 8; cg = (c1->green + (i * dg) / gs1) >> 8; cb = (c1->blue + (i * db) / gs1) >> 8; b = row; for (j = 0; j < width; j++) { *b++ = cr; *b++ = cg; *b++ = cb; } } memcpy (d, row, width * 3); d += rowstride; } g_free (row); return pixbuf; } GdkPixbuf * gnome_wp_pixbuf_new_solid (GdkColor * color, gint width, gint height) { GdkPixbuf * pixbuf; gint j, rowstride; guchar * b, * d, * row; pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, width, height); d = gdk_pixbuf_get_pixels (pixbuf); rowstride = gdk_pixbuf_get_rowstride (pixbuf); row = g_new (unsigned char, rowstride); b = row; for (j = 0; j < width; j++) { *b++ = color->red >> 8; *b++ = color->green >> 8; *b++ = color->blue >> 8; } for (j = 0; j < height; j++) { memcpy (d, row, width * 3); d += rowstride; } g_free (row); return pixbuf; } GdkPixbuf * gnome_wp_pixbuf_tile (GdkPixbuf * src_pixbuf, GdkPixbuf * dest_pixbuf) { gdouble cx, cy; gint dwidth, dheight; gint swidth, sheight; guint alpha = 255; if (dest_pixbuf == NULL) { return src_pixbuf; } swidth = gdk_pixbuf_get_width (src_pixbuf); sheight = gdk_pixbuf_get_height (src_pixbuf); dwidth = gdk_pixbuf_get_width (dest_pixbuf); dheight = gdk_pixbuf_get_height (dest_pixbuf); for (cy = 0; cy < dheight; cy += sheight) { for (cx = 0; cx < dwidth; cx += swidth) { gdk_pixbuf_composite (src_pixbuf, dest_pixbuf, cx, cy, MIN (swidth, dwidth - cx), MIN (sheight, dheight - cy), cx, cy, 1.0, 1.0, GDK_INTERP_BILINEAR, alpha); } } return dest_pixbuf; } GdkPixbuf * gnome_wp_pixbuf_center (GdkPixbuf * src_pixbuf, GdkPixbuf * dest_pixbuf) { gdouble cx, cy; gint dwidth, dheight; gint swidth, sheight; guint alpha = 255; if (dest_pixbuf == NULL) { return src_pixbuf; } swidth = gdk_pixbuf_get_width (src_pixbuf); sheight = gdk_pixbuf_get_height (src_pixbuf); dwidth = gdk_pixbuf_get_width (dest_pixbuf); dheight = gdk_pixbuf_get_height (dest_pixbuf); cx = (dwidth - swidth) / 2; cy = (dheight - sheight) / 2; gdk_pixbuf_composite (src_pixbuf, dest_pixbuf, cx, cy, swidth, sheight, cx, cy, 1.0, 1.0, GDK_INTERP_BILINEAR, alpha); return dest_pixbuf; }