void rot3(GdkPixbuf *src, GdkPixbuf *dist, gint r, gfloat m) { gint w1, h1, w2, h2; gint x1, y1, x2, y2; gint dx1, dy1, dx2, dy2; gint px1, py1, px2, py2; gint i, j; guint32 *ptr1, *ptr2; guchar *ptr, *buf; gint buf_size; w1 = gdk_pixbuf_get_width(src); h1 = gdk_pixbuf_get_height(src); w2 = gdk_pixbuf_get_width(dist); h2 = gdk_pixbuf_get_height(dist); px1 = w1 / 2; py1 = h1 / 2; px2 = w2 / 2; py2 = h2 / 2; buf = gdk_pixbuf_get_pixels(src); buf_size = gdk_pixbuf_get_rowstride(src); ptr2 = (guint32*)gdk_pixbuf_get_pixels(dist); x1 = (((0 - px2) * cos(M_PI*2/360*r) + (0 - py2) * sin(M_PI*2/360*r)) * (1 / m) + px1) * 0x10000; y1 = (((0 - py2) * cos(M_PI*2/360*r) - (0 - px2) * sin(M_PI*2/360*r)) * (1 / m) + py1) * 0x10000; dx1 = (((1 - px2) * cos(M_PI*2/360*r) + (0 - py2) * sin(M_PI*2/360*r)) * (1 / m) + px1) * 0x10000; dy1 = (((0 - py2) * cos(M_PI*2/360*r) - (1 - px2) * sin(M_PI*2/360*r)) * (1 / m) + py1) * 0x10000; dx2 = (((0 - px2) * cos(M_PI*2/360*r) + (1 - py2) * sin(M_PI*2/360*r)) * (1 / m) + px1) * 0x10000; dy2 = (((1 - py2) * cos(M_PI*2/360*r) - (0 - px2) * sin(M_PI*2/360*r)) * (1 / m) + py1) * 0x10000; dx1 -= x1; dy1 -= y1; dx2 -= x1; dy2 -= y1; w1 <<= 16; h1 <<= 16; for(j=0; j= 0) && (x2 < w1) && (y2 >= 0) && (y2 < h1)) { ptr = buf + buf_size * (y2 >> 16) + ((x2 >> 16) * 4); ptr1 = (guint32 *)ptr; *ptr2 = *ptr1; } else { *ptr2 = 0; } ptr2++; x2 += dx1; y2 += dy1; } x1 += dx2; y1 += dy2; } }