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