GraphicsMagick: PerlMagick: Add AccessDefinition(), AddDefinitio...

GraphicsMagick Commits <[email protected]> Fri, 24 May 2024 07:44:46 -0500
Newsgroups gmane.comp.video.graphicsmagick.cvs
Message-ID <mailman.5525.1716910253.8015.graphicsmagick-commit@lists.sourceforge.net>
changeset 18aa99327337 in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=18aa99327337
summary: PerlMagick: Add AccessDefinition(), AddDefinition(), AddDefinitions(), and RemoveDefinitions() methods.

diffstat:

 ChangeLog                              |    8 +
 PerlMagick/Magick.xs                   |  284 ++++++++++++++++++++++++++++++++-
 PerlMagick/t/definitions.t             |   95 +++++++++++
 PerlMagick/t/subroutines.pl            |   85 +++++++++-
 VisualMagick/installer/inc/version.isx |    4 +-
 magick/image.c                         |    2 +-
 magick/version.h                       |    4 +-
 www/ChangeLog.html                     |   10 +
 www/api/image.html                     |    4 +-
 www/perl.html                          |   28 ++-
 www/perl.rst                           |   22 ++-
 11 files changed, 531 insertions(+), 15 deletions(-)

diffs (truncated from 674 to 500 lines):

diff -r 00e3534b3d5f -r 18aa99327337 ChangeLog
--- a/ChangeLog	Wed May 22 13:45:53 2024 -0500
+++ b/ChangeLog	Fri May 24 07:44:15 2024 -0500
@@ -1,3 +1,11 @@
+2024-05-24  Bob Friesenhahn  <[email protected]>
+
+	* PerlMagick/Magick.xs, PerlMagick/t/subroutines.pl, www/perl.rst:
+	Add AccessDefinition(), AddDefinition(), AddDefinitions(), and
+	RemoveDefinitions() methods to supporting adding, updating,
+	removing definitions.  SourceForge patch #81 "Adds PerlMagick
+	support for AddDefinition(), et al." authored by Alex Kent Hajnal.
+
 2024-05-22  Bob Friesenhahn  <[email protected]>
 
 	* fuzzing/oss-fuzz-build.sh (EXTRA_LIBS): Assure that the
diff -r 00e3534b3d5f -r 18aa99327337 PerlMagick/Magick.xs
--- a/PerlMagick/Magick.xs	Wed May 22 13:45:53 2024 -0500
+++ b/PerlMagick/Magick.xs	Fri May 24 07:44:15 2024 -0500
@@ -1,5 +1,5 @@
 /*
-% Copyright (C) 2003 - 2021 GraphicsMagick Group
+% Copyright (C) 2003 - 2024 GraphicsMagick Group
 % Copyright (C) 2002 ImageMagick Studio
 % Copyright (C) 1991-1999 E. I. du Pont de Nemours and Company
 %
@@ -2108,6 +2108,288 @@
 #                                                                             #
 #                                                                             #
 #                                                                             #
+#   A c c e s s D e f i n i t i o n                                           #
+#                                                                             #
+#                                                                             #
+#                                                                             #
+###############################################################################
+#
+#
+void
+AccessDefinition(ref,...)
+  Graphics::Magick ref=NO_INIT
+  ALIAS:
+    accessdefinition = 1
+    GetDefinition    = 2
+    getdefinition    = 3
+  PPCODE:
+  {
+    Image
+      *image;
+
+    ExceptionInfo
+      exception;
+
+    register int
+      i;
+
+    struct PackageInfo
+      *info;
+
+    SV
+      *reference,    /* reference is the SV* of ref=SvIV(reference) */
+      *return_value; /* value returned by function */
+
+    /* parameters to AccessDefinition */
+    const char
+      *magick,
+      *key,
+      *value;
+
+    if (!sv_isobject(ST(0)))
+      {
+        MagickError(OptionError,ReferenceIsNotMyType,PackageName);
+        XSRETURN_EMPTY;
+      }
+    reference=SvRV(ST(0));
+    image=SetupList(aTHX_ reference,&info,(SV ***) NULL);
+    if (!image && !info)
+      {
+        MagickError(OptionError,ReferenceIsNotMyType,NULL);
+        XSRETURN_EMPTY;
+      }
+
+    value        = NULL;
+    return_value = NULL;
+
+    if (items == 3) {
+      magick = SvPV(ST(1),na);
+      key    = SvPV(ST(2),na);
+      value = AccessDefinition( info->image_info, magick, key );
+    }
+
+    if ( value ) {
+      return_value = newSVpv(value,0);
+    }
+
+    if (return_value) {
+       ST(0) = return_value;
+      sv_2mortal(ST(0));
+    } else {
+       ST(0) = &sv_undef;
+    }
+    XSRETURN(1);
+  }
+
+#
+###############################################################################
+#                                                                             #
+#                                                                             #
+#                                                                             #
+#   A d d D e f i n i t i o n                                                 #
+#                                                                             #
+#                                                                             #
+#                                                                             #
+###############################################################################
+#
+#
+void
+AddDefinition(ref,...)
+  Graphics::Magick ref=NO_INIT
+  ALIAS:
+    adddefinition  = 1
+    SetDefinition  = 2
+    setdefinition  = 3
+  PPCODE:
+  {
+    ExceptionInfo
+      exception;
+
+    register int
+      i;
+
+    struct PackageInfo
+      *info;
+
+    SV
+      *reference;  /* reference is the SV* of ref=SvIV(reference) */
+
+    /* parameters to AddDefinition */
+    const char
+      *magick,
+      *key,
+      *value;
+
+    MagickPassFail
+      return_value;  /* return value */
+
+    return_value = MagickFail;
+
+    dMY_CXT;
+    MY_CXT.error_list=newSVpv("",0);
+    if (!sv_isobject(ST(0)))
+      {
+        goto MethodException;
+      }
+    reference=SvRV(ST(0));
+    (void)SetupList(aTHX_ reference,&info,(SV ***) NULL);
+    if (info && items == 4) {
+      magick = SvPV(ST(1),na);
+      key    = SvPV(ST(2),na);
+      value  = SvPV(ST(3),na);
+      return_value = AddDefinition( info->image_info, magick, key, value, &exception );
+    }
+
+    GetExceptionInfo(&exception);
+    if (exception.severity != UndefinedException) {
+      CatchException(&exception);
+      return_value = MagickFail;
+    }
+    DestroyExceptionInfo(&exception);
+
+  MethodException:
+    ST(0) = newSViv(return_value);
+    sv_2mortal(ST(0));
+    XSRETURN(1);
+  }
+
+#
+###############################################################################
+#                                                                             #
+#                                                                             #
+#                                                                             #
+#   A d d D e f i n i t i o n s                                               #
+#                                                                             #
+#                                                                             #
+#                                                                             #
+###############################################################################
+#
+#
+void
+AddDefinitions(ref,...)
+  Graphics::Magick ref=NO_INIT
+  ALIAS:
+    adddefinitions  = 1
+    SetDefinitions  = 2
+    setdefinitions  = 3
+  PPCODE:
+  {
+    ExceptionInfo
+      exception;
+
+    register int
+      i;
+
+    struct PackageInfo
+      *info;
+
+    SV
+      *reference;  /* reference is the SV* of ref=SvIV(reference) */
+
+    const char
+      *values;  /* parameters to AddDefinitions */
+
+    MagickPassFail
+      return_value;  /* return value */
+
+    return_value = MagickFail;
+
+    dMY_CXT;
+    MY_CXT.error_list=newSVpv("",0);
+    if (!sv_isobject(ST(0)))
+      {
+        goto MethodException;
+      }
+    reference=SvRV(ST(0));
+    (void)SetupList(aTHX_ reference,&info,(SV ***) NULL);
+    if (info && items == 2) {
+      values = SvPV(ST(1),na);
+      return_value = AddDefinitions( info->image_info, values, &exception );
+    }
+
+    GetExceptionInfo(&exception);
+    if (exception.severity != UndefinedException) {
+      CatchException(&exception);
+      return_value = MagickFail;
+    }
+    DestroyExceptionInfo(&exception);
+
+  MethodException:
+    ST(0) = newSViv(return_value);
+    sv_2mortal(ST(0));
+    XSRETURN(1);
+  }
+
+#
+###############################################################################
+#                                                                             #
+#                                                                             #
+#                                                                             #
+#   R e m o v e D e f i n i t i o n s                                         #
+#                                                                             #
+#                                                                             #
+#                                                                             #
+###############################################################################
+#
+#
+void
+RemoveDefinitions(ref,...)
+  Graphics::Magick ref=NO_INIT
+  ALIAS:
+    removedefinitions  = 1
+  PPCODE:
+  {
+    ExceptionInfo
+      exception;
+
+    register int
+      i;
+
+    struct PackageInfo
+      *info;
+
+    SV
+      *reference;  /* reference is the SV* of ref=SvIV(reference) */
+
+    const char
+      *values;  /* parameters to RemoveDefinitions */
+
+    MagickPassFail
+      return_value;  /* return value */
+
+    return_value = MagickFail;
+
+    dMY_CXT;
+    MY_CXT.error_list=newSVpv("",0);
+    if (!sv_isobject(ST(0)))
+      {
+        goto MethodException;
+      }
+    reference=SvRV(ST(0));
+    (void)SetupList(aTHX_ reference,&info,(SV ***) NULL);
+    if (info && items == 2) {
+      values = SvPV(ST(1),na);
+      return_value = RemoveDefinitions( info->image_info, values );
+    }
+
+    GetExceptionInfo(&exception);
+    if (exception.severity != UndefinedException) {
+      CatchException(&exception);
+      return_value = MagickFail;
+    }
+    DestroyExceptionInfo(&exception);
+
+  MethodException:
+    ST(0) = newSViv(return_value);
+    sv_2mortal(ST(0));
+    XSRETURN(1);
+  }
+
+#
+###############################################################################
+#                                                                             #
+#                                                                             #
+#                                                                             #
 #   A n i m a t e                                                             #
 #                                                                             #
 #                                                                             #
diff -r 00e3534b3d5f -r 18aa99327337 PerlMagick/t/definitions.t
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PerlMagick/t/definitions.t	Fri May 24 07:44:15 2024 -0500
@@ -0,0 +1,95 @@
+#!/usr/local/bin/perl
+# Copyright (C) 2003 GraphicsMagick Group
+# Copyright (C) 2002 ImageMagick Studio
+# Copyright (C) 1991-1999 E. I. du Pont de Nemours and Company
+#
+# This program is covered by multiple licenses, which are described in
+# Copyright.txt. You should have received a copy of Copyright.txt with this
+# package; otherwise see http://www.graphicsmagick.org/www/Copyright.html.
+#
+#
+# Test definitions.
+#
+# Contributed by Alex Kent Hajnal <[email protected]>
+#
+BEGIN { $| = 1; $test=1, print "1..17\n"; }
+END {print "not ok 1\n" unless $loaded;}
+use Graphics::Magick;
+$loaded=1;
+
+push @INC, '.';  # Needed if running outside of make test
+require 't/subroutines.pl';
+
+chdir 't' || die 'Cd failed';
+
+# Create temporary image
+my $image = Graphics::Magick->new;
+
+# (no definitions set)
+
+print("Reading an unset definition ...\n");
+testAccessDefinition( $image, 'png', 'test', undef );
+
+++$test;
+print("Adding png:test=TEST ...\n");
+testAddDefinition( $image, 'png', 'test', 'TEST', 1 );
+
+# png:test=TEST
+
+++$test;
+print("Checking that png:test=TEST ...\n");
+testAccessDefinition( $image, 'png', 'test', 'TEST' );
+
+++$test;
+print("Changing png:test to Test ...\n");
+testAddDefinition( $image, 'png', 'test', 'Test', 1 );
+
+# png:test=Test
+
+++$test;
+print("Verifying the change ...\n");
+testAccessDefinition( $image, 'png', 'test', 'Test' );
+
+++$test;
+print("Adding abc:DEF=ghi and 123:456=789 ...\n");
+testAddDefinitions( $image, 'abc:DEF=ghi,123:456=789', 1 );
+
+# png:test=Test  abc:DEF=ghi  123:456=789
+
+++$test;
+print("Verifying the changes ...\n");
+testAccessDefinition( $image, 'png', 'test', 'Test' );
+++$test;
+testAccessDefinition( $image, '123', '456', '789' );
+++$test;
+testAccessDefinition( $image, 'abc', 'DEF', 'ghi' );
+
+++$test;
+print("Removing png:test and 123:456 ...\n");
+testRemoveDefinitions( $image, 'png:test,123:456', 1 );
+
+# abc:DEF=ghi
+
+++$test;
+print("Verifying the changes ...\n");
+testAccessDefinition( $image, 'png', 'test', undef );
+++$test;
+testAccessDefinition( $image, '123', '456', undef );
+++$test;
+testAccessDefinition( $image, 'abc', 'DEF', 'ghi' );
+
+++$test;
+print("Removing all definitions ...\n");
+testRemoveDefinitions( $image, '*', 1 );
+
+# (no definitions set)
+
+++$test;
+print("Verifying the changes ...\n");
+testAccessDefinition( $image, 'png', 'test', undef );
+++$test;
+testAccessDefinition( $image, '123', '456', undef );
+++$test;
+testAccessDefinition( $image, 'abc', 'DEF', undef );
+
+1;
diff -r 00e3534b3d5f -r 18aa99327337 PerlMagick/t/subroutines.pl
--- a/PerlMagick/t/subroutines.pl	Wed May 22 13:45:53 2024 -0500
+++ b/PerlMagick/t/subroutines.pl	Fri May 24 07:44:15 2024 -0500
@@ -1,4 +1,4 @@
-# Copyright (C) 2003-2023 GraphicsMagick Group
+# Copyright (C) 2003-2024 GraphicsMagick Group
 # Copyright (C) 2002 ImageMagick Studio
 # Copyright (C) 1999 E. I. du Pont de Nemours and Company
 #
@@ -1323,4 +1323,87 @@
   print "not ok $test\n";
   return 1
 }
+
+#
+# Test AccessDefinition method
+#
+# Usage: testAccessDefinition( image, magick, key, expected );
+#
+sub testAccessDefinition {
+  my( $image, $magick, $key, $expected ) = @_;
+
+        my $got = $image->AccessDefinition($magick, $key);
+
+  if( !defined( $got ) && !defined( $expected ) ) {
+    # Undefined value is expected
+    print "ok $test\n";
+  } elsif ( !defined( $got ) ) {
+    print "Expected ($expected), Got (undefined)\n";
+    print "not ok $test\n";
+  } else {
+    if ("$expected" eq "$got") {
+      print "ok $test\n";
+    } else {
+      print "Expected ($expected), Got ($got)\n";
+      print "not ok $test\n";
+    }
+  }
+}
+
+#
+# Test AddDefinition method
+#
+# Usage: testAddDefinition( image, magick, key, value, expected );
+#
+sub testAddDefinition {
+  my( $image, $magick, $key, $value, $expected ) = @_;
+
+        # returns 1 on success, 0 on failure
+  my $result = $image->AddDefinition($magick, $key, $value);
+
+  if ( $result == $expected) {
+    print "ok $test\n";
+  } else {
+    print "Expected ($expected), Got ($result)\n";
+    print "not ok $test\n";
+  }
+}
+
+#
+# Test AddDefinitions method
+#
+# Usage: testAddDefinitions( image, values, expected );
+#
+sub testAddDefinitions {
+  my( $image, $values, $expected ) = @_;
+
+        # returns 1 on success, 0 on failure
+  my $result = $image->AddDefinitions($values);
+
+  if ( $result == $expected) {
+    print "ok $test\n";
+  } else {
+    print "Expected ($expected), Got ($result)\n";
+    print "not ok $test\n";
+  }
+}
+
+#
+# Test RemoveDefinitions method
+#
+# Usage: testRemoveDefinitions( image, values, expected );
+#
+sub testRemoveDefinitions {
+  my( $image, $values, $expected ) = @_;
+
+        # returns 1 on success, 0 on failure