… | |
… | |
15 | |
15 | |
16 | #include <gperl.h> |
16 | #include <gperl.h> |
17 | #include <gtk2perl.h> |
17 | #include <gtk2perl.h> |
18 | |
18 | |
19 | #include <assert.h> |
19 | #include <assert.h> |
|
|
20 | |
|
|
21 | #include "perlmulticore.h" |
20 | |
22 | |
21 | #define IW 80 /* MUST match Schnauzer.pm! */ |
23 | #define IW 80 /* MUST match Schnauzer.pm! */ |
22 | #define IH 60 /* MUST match Schnauzer.pm! */ |
24 | #define IH 60 /* MUST match Schnauzer.pm! */ |
23 | |
25 | |
24 | #define RAND (seed = (seed + 7141) * 54773 % 134456) |
26 | #define RAND (seed = (seed + 7141) * 54773 % 134456) |
… | |
… | |
242 | magic_load (cookie, 0); |
244 | magic_load (cookie, 0); |
243 | else |
245 | else |
244 | XSRETURN_UNDEF; |
246 | XSRETURN_UNDEF; |
245 | } |
247 | } |
246 | |
248 | |
|
|
249 | perlinterp_release (); |
247 | RETVAL = magic_file (cookie, path); |
250 | RETVAL = magic_file (cookie, path); |
|
|
251 | perlinterp_acquire (); |
248 | } |
252 | } |
249 | OUTPUT: |
253 | OUTPUT: |
250 | RETVAL |
254 | RETVAL |
251 | |
255 | |
252 | # missing/broken in Gtk2 perl module |
256 | # missing/broken in Gtk2 perl module |
… | |
… | |
268 | RETVAL |
272 | RETVAL |
269 | |
273 | |
270 | GdkPixbuf_noinc * |
274 | GdkPixbuf_noinc * |
271 | dealpha_expose (GdkPixbuf *pb) |
275 | dealpha_expose (GdkPixbuf *pb) |
272 | CODE: |
276 | CODE: |
|
|
277 | perlinterp_release (); |
273 | { |
278 | { |
274 | int w = gdk_pixbuf_get_width (pb); |
279 | int w = gdk_pixbuf_get_width (pb); |
275 | int h = gdk_pixbuf_get_height (pb); |
280 | int h = gdk_pixbuf_get_height (pb); |
276 | int bpp = gdk_pixbuf_get_n_channels (pb); |
281 | int bpp = gdk_pixbuf_get_n_channels (pb); |
277 | int x, y, i; |
282 | int x, y, i; |
… | |
… | |
286 | for (x = 0; x < w; x++) |
291 | for (x = 0; x < w; x++) |
287 | for (y = 0; y < h; y++) |
292 | for (y = 0; y < h; y++) |
288 | for (i = 0; i < 3; i++) |
293 | for (i = 0; i < 3; i++) |
289 | dst[x * 3 + y * dstr + i] = src[x * bpp + y * sstr + i]; |
294 | dst[x * 3 + y * dstr + i] = src[x * bpp + y * sstr + i]; |
290 | } |
295 | } |
|
|
296 | perlinterp_acquire (); |
291 | OUTPUT: |
297 | OUTPUT: |
292 | RETVAL |
298 | RETVAL |
293 | |
299 | |
294 | GdkPixbuf_noinc * |
300 | GdkPixbuf_noinc * |
295 | rotate (GdkPixbuf *pb, int angle) |
301 | rotate (GdkPixbuf *pb, int angle) |
296 | CODE: |
302 | CODE: |
|
|
303 | perlinterp_release (); |
297 | if (angle < 0) |
304 | if (angle < 0) |
298 | angle += 360; |
305 | angle += 360; |
299 | RETVAL = gdk_pixbuf_rotate_simple (pb, angle == 0 ? GDK_PIXBUF_ROTATE_NONE |
306 | RETVAL = gdk_pixbuf_rotate_simple (pb, angle == 0 ? GDK_PIXBUF_ROTATE_NONE |
300 | : angle == 90 ? GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE |
307 | : angle == 90 ? GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE |
301 | : angle == 180 ? GDK_PIXBUF_ROTATE_UPSIDEDOWN |
308 | : angle == 180 ? GDK_PIXBUF_ROTATE_UPSIDEDOWN |
302 | : angle == 270 ? GDK_PIXBUF_ROTATE_CLOCKWISE |
309 | : angle == 270 ? GDK_PIXBUF_ROTATE_CLOCKWISE |
303 | : angle); |
310 | : angle); |
|
|
311 | perlinterp_acquire (); |
304 | OUTPUT: |
312 | OUTPUT: |
305 | RETVAL |
313 | RETVAL |
306 | |
314 | |
307 | GdkPixbuf_noinc * |
315 | GdkPixbuf_noinc * |
308 | load_jpeg (SV *path, int thumbnail=0) |
316 | load_jpeg (SV *path, int thumbnail=0) |
… | |
… | |
320 | fp = fopen (SvPVbyte_nolen (path), "rb"); |
328 | fp = fopen (SvPVbyte_nolen (path), "rb"); |
321 | |
329 | |
322 | if (!fp) |
330 | if (!fp) |
323 | XSRETURN_UNDEF; |
331 | XSRETURN_UNDEF; |
324 | |
332 | |
|
|
333 | perlinterp_release (); |
|
|
334 | |
325 | cinfo.err = jpeg_std_error (&jerr.err); |
335 | cinfo.err = jpeg_std_error (&jerr.err); |
326 | |
336 | |
327 | jerr.err.error_exit = cv_error_exit; |
337 | jerr.err.error_exit = cv_error_exit; |
328 | jerr.err.output_message = cv_error_output; |
338 | jerr.err.output_message = cv_error_output; |
329 | |
339 | |
… | |
… | |
333 | jpeg_destroy_decompress (&cinfo); |
343 | jpeg_destroy_decompress (&cinfo); |
334 | |
344 | |
335 | if (pb) |
345 | if (pb) |
336 | g_object_unref ((gpointer)pb); |
346 | g_object_unref ((gpointer)pb); |
337 | |
347 | |
|
|
348 | perlinterp_acquire (); |
338 | XSRETURN_UNDEF; |
349 | XSRETURN_UNDEF; |
339 | } |
350 | } |
340 | |
351 | |
341 | jpeg_create_decompress (&cinfo); |
352 | jpeg_create_decompress (&cinfo); |
342 | |
353 | |
… | |
… | |
394 | } |
405 | } |
395 | |
406 | |
396 | jpeg_finish_decompress (&cinfo); |
407 | jpeg_finish_decompress (&cinfo); |
397 | fclose (fp); |
408 | fclose (fp); |
398 | jpeg_destroy_decompress (&cinfo); |
409 | jpeg_destroy_decompress (&cinfo); |
|
|
410 | perlinterp_acquire (); |
399 | } |
411 | } |
400 | OUTPUT: |
412 | OUTPUT: |
401 | RETVAL |
413 | RETVAL |
402 | |
414 | |
403 | void |
415 | void |
404 | compare (GdkPixbuf *a, GdkPixbuf *b) |
416 | compare (GdkPixbuf *a, GdkPixbuf *b) |
405 | PPCODE: |
417 | PPCODE: |
|
|
418 | perlinterp_release (); |
406 | { |
419 | { |
407 | int w = gdk_pixbuf_get_width (a); |
420 | int w = gdk_pixbuf_get_width (a); |
408 | int h = gdk_pixbuf_get_height (a); |
421 | int h = gdk_pixbuf_get_height (a); |
409 | |
422 | |
410 | int sa = gdk_pixbuf_get_rowstride (a); |
423 | int sa = gdk_pixbuf_get_rowstride (a); |
… | |
… | |
437 | d = ((int)*pa_++) - ((int)*pb_++); diff += d*d; peak = MAX (peak, abs (d)); |
450 | d = ((int)*pa_++) - ((int)*pb_++); diff += d*d; peak = MAX (peak, abs (d)); |
438 | d = ((int)*pa_++) - ((int)*pb_++); diff += d*d; peak = MAX (peak, abs (d)); |
451 | d = ((int)*pa_++) - ((int)*pb_++); diff += d*d; peak = MAX (peak, abs (d)); |
439 | d = ((int)*pa_++) - ((int)*pb_++); diff += d*d; peak = MAX (peak, abs (d)); |
452 | d = ((int)*pa_++) - ((int)*pb_++); diff += d*d; peak = MAX (peak, abs (d)); |
440 | } |
453 | } |
441 | } |
454 | } |
|
|
455 | |
|
|
456 | perlinterp_acquire (); |
442 | |
457 | |
443 | EXTEND (SP, 2); |
458 | EXTEND (SP, 2); |
444 | PUSHs (sv_2mortal (newSVnv (sqrt (diff / (w * h * 3. * 255. * 255.))))); |
459 | PUSHs (sv_2mortal (newSVnv (sqrt (diff / (w * h * 3. * 255. * 255.))))); |
445 | PUSHs (sv_2mortal (newSVnv (peak / 255.))); |
460 | PUSHs (sv_2mortal (newSVnv (peak / 255.))); |
446 | } |
461 | } |