Gtk2-CV
view release on metacpan or search on metacpan
pb = RETVAL = gdk_pixbuf_new (GDK_COLORSPACE_RGB, cinfo.output_components == 4, 8, cinfo.output_width, cinfo.output_height);
if (!RETVAL)
longjmp (jerr.setjmp_buffer, 2);
data = gdk_pixbuf_get_pixels (RETVAL);
rs = gdk_pixbuf_get_rowstride (RETVAL);
jpeg_start_decompress (&cinfo);
while (cinfo.output_scanline < cinfo.output_height)
{
int remaining = cinfo.output_height - cinfo.output_scanline;
JSAMPROW rp[4];
rp [0] = data + cinfo.output_scanline * rs;
rp [1] = (guchar *)rp [0] + rs;
rp [2] = (guchar *)rp [1] + rs;
rp [3] = (guchar *)rp [2] + rs;
jpeg_read_scanlines (&cinfo, rp, remaining < 4 ? remaining : 4);
}
if (cinfo.out_color_space == JCS_CMYK)
{
guchar *end = data + cinfo.output_height * rs;
while (data < end)
{
U32 c = data [0];
U32 m = data [1];
U32 y = data [2];
U32 k = data [3];
if (0)
if (cinfo.Adobe_transform == 2)
{
c ^= 0xff;
m ^= 0xff;
y ^= 0xff;
k ^= 0xff;
}
data [0] = (c * k + 0x80) / 0xff;
data [1] = (m * k + 0x80) / 0xff;
data [2] = (y * k + 0x80) / 0xff;
data [3] = 0xff;
data += 4;
}
}
jpeg_finish_decompress (&cinfo);
jpeg_destroy_decompress (&cinfo);
perlinterp_acquire ();
}
OUTPUT:
RETVAL
void
compare (GdkPixbuf *a, GdkPixbuf *b)
PPCODE:
perlinterp_release ();
{
int w = gdk_pixbuf_get_width (a);
int h = gdk_pixbuf_get_height (a);
int sa = gdk_pixbuf_get_rowstride (a);
int sb = gdk_pixbuf_get_rowstride (b);
guchar *pa = gdk_pixbuf_get_pixels (a);
guchar *pb = gdk_pixbuf_get_pixels (b);
int x, y;
assert (w == gdk_pixbuf_get_width (b));
assert (h == gdk_pixbuf_get_height (b));
assert (gdk_pixbuf_get_n_channels (a) == 3);
assert (gdk_pixbuf_get_n_channels (b) == 3);
double diff = 0.;
int peak = 0;
if (w && h)
for (y = 0; y < h; y++)
{
guchar *pa_ = pa + y * sa;
guchar *pb_ = pb + y * sb;
for (x = 0; x < w; x++)
{
int d;
d = ((int)*pa_++) - ((int)*pb_++); diff += d*d; peak = MAX (peak, abs (d));
d = ((int)*pa_++) - ((int)*pb_++); diff += d*d; peak = MAX (peak, abs (d));
d = ((int)*pa_++) - ((int)*pb_++); diff += d*d; peak = MAX (peak, abs (d));
}
}
perlinterp_acquire ();
EXTEND (SP, 2);
PUSHs (sv_2mortal (newSVnv (sqrt (diff / (w * h * 3. * 255. * 255.)))));
PUSHs (sv_2mortal (newSVnv (peak / 255.)));
}
#############################################################################
MODULE = Gtk2::CV PACKAGE = Gtk2::CV::Schnauzer
# currently only works for filenames (octet strings)
SV *
foldcase (SV *pathsv)
PROTOTYPE: $
CODE:
{
STRLEN plen;
U8 *path = (U8 *)SvPV (pathsv, plen);
U8 *pend = path + plen;
U8 dst [plen * 8 * 3], *dstp = dst;
( run in 0.571 second using v1.01-cache-2.11-cpan-5511b514fd6 )