--- CV/CV.xs 2005/08/19 00:34:54 1.25 +++ CV/CV.xs 2005/08/22 00:30:58 1.28 @@ -142,7 +142,7 @@ RETVAL GdkPixbuf_noinc * -transpose (GdkPixbuf *pb) +dealpha_expose (GdkPixbuf *pb) CODE: { int w = gdk_pixbuf_get_width (pb); @@ -152,40 +152,27 @@ guchar *src = gdk_pixbuf_get_pixels (pb), *dst; int sstr = gdk_pixbuf_get_rowstride (pb), dstr; - RETVAL = gdk_pixbuf_new (GDK_COLORSPACE_RGB, bpp == 4, 8, h, w); + RETVAL = gdk_pixbuf_new (GDK_COLORSPACE_RGB, 0, 8, w, h); dst = gdk_pixbuf_get_pixels (RETVAL); dstr = gdk_pixbuf_get_rowstride (RETVAL); - for (y = 0; y < h; y++) - for (x = 0; x < w; x++) - for (i = 0; i < bpp; i++) - dst[y * bpp + x * dstr + i] = src[x * bpp + y * sstr + i]; + for (x = 0; x < w; x++) + for (y = 0; y < h; y++) + for (i = 0; i < 3; i++) + dst[x * 3 + y * dstr + i] = src[x * bpp + y * sstr + i]; } OUTPUT: RETVAL GdkPixbuf_noinc * -flop (GdkPixbuf *pb) +rotate (GdkPixbuf *pb, int angle) CODE: -{ - int w = gdk_pixbuf_get_width (pb); - int h = gdk_pixbuf_get_height (pb); - int bpp = gdk_pixbuf_get_n_channels (pb); - int x, y, i; - guchar *src = gdk_pixbuf_get_pixels (pb), *dst; - int sstr = gdk_pixbuf_get_rowstride (pb), dstr; - - RETVAL = gdk_pixbuf_new (GDK_COLORSPACE_RGB, bpp == 4, 8, w, h); - - dst = gdk_pixbuf_get_pixels (RETVAL); - dstr = gdk_pixbuf_get_rowstride (RETVAL); - - for (y = 0; y < h; y++) - for (x = 0; x < w; x++) - for (i = 0; i < bpp; i++) - dst[(w - 1 - x) * bpp + y * dstr + i] = src[x * bpp + y * sstr + i]; -} + RETVAL = gdk_pixbuf_rotate_simple (pb, angle == 0 ? GDK_PIXBUF_ROTATE_NONE + : angle == 90 ? GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE + : angle == 180 ? GDK_PIXBUF_ROTATE_UPSIDEDOWN + : angle == 270 ? GDK_PIXBUF_ROTATE_CLOCKWISE + : angle); OUTPUT: RETVAL @@ -360,64 +347,6 @@ } OUTPUT: RETVAL - -SV * -pb_to_p7 (GdkPixbuf *pb) - CODE: -{ - int w = gdk_pixbuf_get_width (pb); - int h = gdk_pixbuf_get_height (pb); - int x, y; - guchar *dst; - int bpp = gdk_pixbuf_get_n_channels (pb); - guchar *src = gdk_pixbuf_get_pixels (pb); - int sstr = gdk_pixbuf_get_rowstride (pb); - int Er[IW], Eg[IW], Eb[IW]; - int seed = 77; - - RETVAL = newSV (w * h); - SvPOK_only (RETVAL); - SvCUR_set (RETVAL, w * h); - - dst = (guchar *)SvPVX (RETVAL); - - memset (Er, 0, sizeof (int) * IW); - memset (Eg, 0, sizeof (int) * IW); - memset (Eb, 0, sizeof (int) * IW); - - /* some primitive error distribution + random dithering */ - - for (y = 0; y < h; y++) - { - int er = 0, eg = 0, eb = 0; - - for (x = 0; x < w; x++) - { - int r, g, b; - guchar *p = src + x * bpp + y * sstr; - - r = ((p[0] + er + Er[x]) * 7 + (RAND & 127) + 64) / 255; - g = ((p[1] + eg + Eg[x]) * 7 + (RAND & 127) + 64) / 255; - b = ((p[2] + eb + Eb[x]) * 3 + (RAND & 127) + 64) / 255; - - r = r > 7 ? 7 : r < 0 ? 0 : r; - g = g > 7 ? 7 : g < 0 ? 0 : g; - b = b > 3 ? 3 : b < 0 ? 0 : b; - - er += p[0] - (r * 255 + 4) / 7; - eg += p[1] - (g * 255 + 4) / 7; - eb += p[2] - (b * 255 + 2) / 3; - - Er[x] = er >> 1; er -= (er + 1) >> 1; - Eg[x] = eg >> 1; eg -= (eg + 1) >> 1; - Eb[x] = eb >> 1; eb -= (eb + 1) >> 1; - - *dst++ = r << 5 | g << 2 | b; - } - } -} - OUTPUT: - RETVAL #############################################################################