… | |
… | |
355 | assert (gdk_pixbuf_get_n_channels (b) == 3); |
355 | assert (gdk_pixbuf_get_n_channels (b) == 3); |
356 | |
356 | |
357 | double diff = 0.; |
357 | double diff = 0.; |
358 | int peak = 0; |
358 | int peak = 0; |
359 | |
359 | |
|
|
360 | if (x && y) |
360 | for (y = 0; y < h; y++) |
361 | for (y = 0; y < h; y++) |
361 | { |
362 | { |
362 | guchar *pa_ = pa + y * sa; |
363 | guchar *pa_ = pa + y * sa; |
363 | guchar *pb_ = pb + y * sb; |
364 | guchar *pb_ = pb + y * sb; |
364 | |
365 | |
365 | for (x = 0; x < w; x ++) |
366 | for (x = 0; x < w; x++) |
366 | { |
367 | { |
367 | int d; |
368 | int d; |
368 | |
369 | |
369 | d = ((int)*pa_++) - ((int)*pb_++); diff += d*d; peak = MAX (peak, abs (d)); |
370 | d = ((int)*pa_++) - ((int)*pb_++); diff += d*d; peak = MAX (peak, abs (d)); |
370 | d = ((int)*pa_++) - ((int)*pb_++); diff += d*d; peak = MAX (peak, abs (d)); |
371 | d = ((int)*pa_++) - ((int)*pb_++); diff += d*d; peak = MAX (peak, abs (d)); |
371 | d = ((int)*pa_++) - ((int)*pb_++); diff += d*d; peak = MAX (peak, abs (d)); |
372 | d = ((int)*pa_++) - ((int)*pb_++); diff += d*d; peak = MAX (peak, abs (d)); |
372 | } |
373 | } |
373 | } |
374 | } |
374 | |
375 | |
375 | EXTEND (SP, 2); |
376 | EXTEND (SP, 2); |
376 | PUSHs (sv_2mortal (newSVnv (sqrt (diff / (w * h * 3. * 255. * 255.))))); |
377 | PUSHs (sv_2mortal (newSVnv (sqrt (diff / (w * h * 3. * 255. * 255.))))); |
377 | PUSHs (sv_2mortal (newSVnv (peak / 255.))); |
378 | PUSHs (sv_2mortal (newSVnv (peak / 255.))); |
378 | } |
379 | } |