From 316d51773c093e74e15de805e8bf620d6b56bc8b Mon Sep 17 00:00:00 2001 From: cristy Date: Thu, 17 Sep 2009 19:31:25 +0000 Subject: [PATCH] --- Makefile.in | 20 ++ coders/avi.c | 1 + coders/bmp.c | 1 + coders/cut.c | 1 + coders/dcm.c | 1 + coders/dib.c | 1 + coders/gif.c | 1 + coders/jpeg.c | 1 + coders/map.c | 1 + coders/miff.c | 1 + coders/msl.c | 1 + coders/palm.c | 1 + coders/pdb.c | 1 + coders/pict.c | 1 + coders/tga.c | 1 + coders/wpg.c | 1 + coders/xwd.c | 1 + config/configure.xml | 2 +- magick/MagickCore.h | 1 + magick/Make.com | 3 +- magick/Makefile.am | 5 + magick/color-private.h | 10 - magick/colormap-private.h | 43 +++ magick/colormap.c | 306 +++++++++++++++++++++ magick/colormap.h | 33 +++ magick/composite.c | 73 +++++ magick/composite.h | 3 +- magick/deprecate.c | 2 + magick/image.c | 562 +------------------------------------- magick/image.h | 6 +- magick/statistic.c | 251 +++++++++++++++++ magick/statistic.h | 3 + magick/version.h | 2 +- www/api/colormap.html | 0 34 files changed, 761 insertions(+), 580 deletions(-) create mode 100644 magick/colormap-private.h create mode 100644 magick/colormap.c create mode 100644 magick/colormap.h create mode 100644 www/api/colormap.html diff --git a/Makefile.in b/Makefile.in index 5fea270f5..c3ca77d25 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1325,6 +1325,7 @@ am__magick_libMagickCore_la_SOURCES_DIST = magick/ImageMagick.h \ magick/cache-view.h magick/cipher.c magick/cipher.h \ magick/client.c magick/client.h magick/coder.c magick/coder.h \ magick/color.c magick/color.h magick/color-private.h \ + magick/colormap.c magick/colormap.h magick/colormap-private.h \ magick/colorspace.c magick/colorspace.h \ magick/colorspace-private.h magick/compare.c magick/compare.h \ magick/composite.c magick/composite.h \ @@ -1419,6 +1420,7 @@ am__objects_2 = magick/magick_libMagickCore_la-animate.lo \ magick/magick_libMagickCore_la-client.lo \ magick/magick_libMagickCore_la-coder.lo \ magick/magick_libMagickCore_la-color.lo \ + magick/magick_libMagickCore_la-colormap.lo \ magick/magick_libMagickCore_la-colorspace.lo \ magick/magick_libMagickCore_la-compare.lo \ magick/magick_libMagickCore_la-composite.lo \ @@ -3716,6 +3718,9 @@ MAGICK_BASE_SRCS = \ magick/color.c \ magick/color.h \ magick/color-private.h \ + magick/colormap.c \ + magick/colormap.h \ + magick/colormap-private.h \ magick/colorspace.c \ magick/colorspace.h \ magick/colorspace-private.h \ @@ -3911,6 +3916,7 @@ MAGICK_INCLUDE_HDRS = \ magick/client.h \ magick/coder.h \ magick/color.h \ + magick/colormap.h \ magick/colorspace.h \ magick/compare.h \ magick/composite.h \ @@ -3987,6 +3993,7 @@ MAGICK_NOINST_HDRS = \ magick/blob-private.h \ magick/cache-private.h \ magick/color-private.h \ + magick/colormap-private.h \ magick/colorspace-private.h \ magick/composite-private.h \ magick/delegate-private.h \ @@ -5406,6 +5413,8 @@ magick/magick_libMagickCore_la-coder.lo: magick/$(am__dirstamp) \ magick/$(DEPDIR)/$(am__dirstamp) magick/magick_libMagickCore_la-color.lo: magick/$(am__dirstamp) \ magick/$(DEPDIR)/$(am__dirstamp) +magick/magick_libMagickCore_la-colormap.lo: magick/$(am__dirstamp) \ + magick/$(DEPDIR)/$(am__dirstamp) magick/magick_libMagickCore_la-colorspace.lo: magick/$(am__dirstamp) \ magick/$(DEPDIR)/$(am__dirstamp) magick/magick_libMagickCore_la-compare.lo: magick/$(am__dirstamp) \ @@ -6681,6 +6690,8 @@ mostlyclean-compile: -rm -f magick/magick_libMagickCore_la-coder.lo -rm -f magick/magick_libMagickCore_la-color.$(OBJEXT) -rm -f magick/magick_libMagickCore_la-color.lo + -rm -f magick/magick_libMagickCore_la-colormap.$(OBJEXT) + -rm -f magick/magick_libMagickCore_la-colormap.lo -rm -f magick/magick_libMagickCore_la-colorspace.$(OBJEXT) -rm -f magick/magick_libMagickCore_la-colorspace.lo -rm -f magick/magick_libMagickCore_la-compare.$(OBJEXT) @@ -7175,6 +7186,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/magick_libMagickCore_la-client.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/magick_libMagickCore_la-coder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/magick_libMagickCore_la-color.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/magick_libMagickCore_la-colormap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/magick_libMagickCore_la-colorspace.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/magick_libMagickCore_la-compare.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@magick/$(DEPDIR)/magick_libMagickCore_la-composite.Plo@am__quote@ @@ -8382,6 +8394,14 @@ magick/magick_libMagickCore_la-color.lo: magick/color.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/magick_libMagickCore_la-color.lo `test -f 'magick/color.c' || echo '$(srcdir)/'`magick/color.c +magick/magick_libMagickCore_la-colormap.lo: magick/colormap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/magick_libMagickCore_la-colormap.lo -MD -MP -MF magick/$(DEPDIR)/magick_libMagickCore_la-colormap.Tpo -c -o magick/magick_libMagickCore_la-colormap.lo `test -f 'magick/colormap.c' || echo '$(srcdir)/'`magick/colormap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/magick_libMagickCore_la-colormap.Tpo magick/$(DEPDIR)/magick_libMagickCore_la-colormap.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='magick/colormap.c' object='magick/magick_libMagickCore_la-colormap.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o magick/magick_libMagickCore_la-colormap.lo `test -f 'magick/colormap.c' || echo '$(srcdir)/'`magick/colormap.c + magick/magick_libMagickCore_la-colorspace.lo: magick/colorspace.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(magick_libMagickCore_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT magick/magick_libMagickCore_la-colorspace.lo -MD -MP -MF magick/$(DEPDIR)/magick_libMagickCore_la-colorspace.Tpo -c -o magick/magick_libMagickCore_la-colorspace.lo `test -f 'magick/colorspace.c' || echo '$(srcdir)/'`magick/colorspace.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) magick/$(DEPDIR)/magick_libMagickCore_la-colorspace.Tpo magick/$(DEPDIR)/magick_libMagickCore_la-colorspace.Plo diff --git a/coders/avi.c b/coders/avi.c index 12920d146..d913be696 100644 --- a/coders/avi.c +++ b/coders/avi.c @@ -46,6 +46,7 @@ #include "magick/blob-private.h" #include "magick/cache.h" #include "magick/color-private.h" +#include "magick/colormap-private.h" #include "magick/colorspace.h" #include "magick/constitute.h" #include "magick/delegate.h" diff --git a/coders/bmp.c b/coders/bmp.c index ba975fcc1..e863be9ba 100644 --- a/coders/bmp.c +++ b/coders/bmp.c @@ -44,6 +44,7 @@ #include "magick/blob.h" #include "magick/blob-private.h" #include "magick/cache.h" +#include "magick/colormap-private.h" #include "magick/color-private.h" #include "magick/colorspace.h" #include "magick/exception.h" diff --git a/coders/cut.c b/coders/cut.c index 164f168f7..63d842ec4 100644 --- a/coders/cut.c +++ b/coders/cut.c @@ -52,6 +52,7 @@ #include "magick/blob-private.h" #include "magick/cache.h" #include "magick/color.h" +#include "magick/colormap-private.h" #include "magick/color-private.h" #include "magick/exception.h" #include "magick/exception-private.h" diff --git a/coders/dcm.c b/coders/dcm.c index 439122d01..111530a69 100644 --- a/coders/dcm.c +++ b/coders/dcm.c @@ -45,6 +45,7 @@ #include "magick/blob-private.h" #include "magick/cache.h" #include "magick/color.h" +#include "magick/colormap-private.h" #include "magick/color-private.h" #include "magick/constitute.h" #include "magick/enhance.h" diff --git a/coders/dib.c b/coders/dib.c index afa3062c5..bc86727d6 100644 --- a/coders/dib.c +++ b/coders/dib.c @@ -44,6 +44,7 @@ #include "magick/blob-private.h" #include "magick/cache.h" #include "magick/color.h" +#include "magick/colormap-private.h" #include "magick/color-private.h" #include "magick/colorspace.h" #include "magick/draw.h" diff --git a/coders/gif.c b/coders/gif.c index 1eb8c4780..440d0c754 100644 --- a/coders/gif.c +++ b/coders/gif.c @@ -44,6 +44,7 @@ #include "magick/blob-private.h" #include "magick/cache.h" #include "magick/color.h" +#include "magick/colormap-private.h" #include "magick/color-private.h" #include "magick/colorspace.h" #include "magick/exception.h" diff --git a/coders/jpeg.c b/coders/jpeg.c index 1092549e6..393fb3caa 100644 --- a/coders/jpeg.c +++ b/coders/jpeg.c @@ -48,6 +48,7 @@ #include "magick/blob-private.h" #include "magick/cache.h" #include "magick/color.h" +#include "magick/colormap-private.h" #include "magick/color-private.h" #include "magick/colorspace.h" #include "magick/constitute.h" diff --git a/coders/map.c b/coders/map.c index 25b391768..d1d399e32 100644 --- a/coders/map.c +++ b/coders/map.c @@ -44,6 +44,7 @@ #include "magick/blob-private.h" #include "magick/cache.h" #include "magick/color.h" +#include "magick/colormap-private.h" #include "magick/color-private.h" #include "magick/colorspace.h" #include "magick/exception.h" diff --git a/coders/miff.c b/coders/miff.c index 1bc960ecc..36fe18d24 100644 --- a/coders/miff.c +++ b/coders/miff.c @@ -44,6 +44,7 @@ #include "magick/blob-private.h" #include "magick/cache.h" #include "magick/color.h" +#include "magick/colormap-private.h" #include "magick/color-private.h" #include "magick/colorspace.h" #include "magick/constitute.h" diff --git a/coders/msl.c b/coders/msl.c index 1ca191320..9fd31526b 100644 --- a/coders/msl.c +++ b/coders/msl.c @@ -49,6 +49,7 @@ #include "magick/cache.h" #include "magick/cache-view.h" #include "magick/color.h" +#include "magick/colormap.h" #include "magick/color-private.h" #include "magick/composite.h" #include "magick/constitute.h" diff --git a/coders/palm.c b/coders/palm.c index 01fcbb2c9..032e2f479 100644 --- a/coders/palm.c +++ b/coders/palm.c @@ -46,6 +46,7 @@ #include "magick/blob-private.h" #include "magick/cache.h" #include "magick/color.h" +#include "magick/colormap-private.h" #include "magick/color-private.h" #include "magick/colorspace.h" #include "magick/constitute.h" diff --git a/coders/pdb.c b/coders/pdb.c index 57c2df6ba..365acd490 100644 --- a/coders/pdb.c +++ b/coders/pdb.c @@ -50,6 +50,7 @@ #include "magick/blob.h" #include "magick/blob-private.h" #include "magick/cache.h" +#include "magick/colormap-private.h" #include "magick/color-private.h" #include "magick/colorspace.h" #include "magick/constitute.h" diff --git a/coders/pict.c b/coders/pict.c index 71b0bdf74..2f7352230 100644 --- a/coders/pict.c +++ b/coders/pict.c @@ -44,6 +44,7 @@ #include "magick/blob-private.h" #include "magick/cache.h" #include "magick/color-private.h" +#include "magick/colormap-private.h" #include "magick/colorspace.h" #include "magick/composite.h" #include "magick/constitute.h" diff --git a/coders/tga.c b/coders/tga.c index ba97743b6..ec616bb93 100644 --- a/coders/tga.c +++ b/coders/tga.c @@ -44,6 +44,7 @@ #include "magick/blob-private.h" #include "magick/cache.h" #include "magick/color-private.h" +#include "magick/colormap-private.h" #include "magick/colorspace.h" #include "magick/exception.h" #include "magick/exception-private.h" diff --git a/coders/wpg.c b/coders/wpg.c index ab8bb0323..f2c5ad42d 100644 --- a/coders/wpg.c +++ b/coders/wpg.c @@ -42,6 +42,7 @@ #include "magick/blob.h" #include "magick/blob-private.h" #include "magick/color-private.h" +#include "magick/colormap-private.h" #include "magick/constitute.h" #include "magick/exception.h" #include "magick/exception-private.h" diff --git a/coders/xwd.c b/coders/xwd.c index be7584155..52fdc24ed 100644 --- a/coders/xwd.c +++ b/coders/xwd.c @@ -44,6 +44,7 @@ #include "magick/blob-private.h" #include "magick/cache.h" #include "magick/color-private.h" +#include "magick/colormap-private.h" #include "magick/colorspace.h" #include "magick/exception.h" #include "magick/exception-private.h" diff --git a/config/configure.xml b/config/configure.xml index 98115f060..97619544e 100644 --- a/config/configure.xml +++ b/config/configure.xml @@ -9,7 +9,7 @@ - + diff --git a/magick/MagickCore.h b/magick/MagickCore.h index 618db2f02..d9cfc89bb 100644 --- a/magick/MagickCore.h +++ b/magick/MagickCore.h @@ -157,6 +157,7 @@ extern "C" { #include "magick/coder.h" #include "magick/color.h" #include "magick/colorspace.h" +#include "magick/colormap.h" #include "magick/compare.h" #include "magick/composite.h" #include "magick/compress.h" diff --git a/magick/Make.com b/magick/Make.com index c13c1e4c2..1e88d4c0c 100644 --- a/magick/Make.com +++ b/magick/Make.com @@ -32,6 +32,7 @@ $call Make cipher.c $call Make client.c $call Make coder.c $call Make color.c +$call Make colormap.c $call Make colorspace.c $call Make compare.c $call Make composite.c @@ -130,7 +131,7 @@ $ deass magick $ deass wand $library/create libMagick.olb - animate, annotate, artifact, blob, cache, cache-view, cipher, client, coder, - - color, colorspace, compare, composite, compress, configure, - + color, colormap, colorspace, compare, composite, compress, configure, - constitute, decorate, delegate, deprecate, display, distort, draw, - effect, enhance, exception, fx, gem, geometry, hashmap, histogram, identify, - image, layer, list, locale, log, magic, magick, matrix, memory, mime, - diff --git a/magick/Makefile.am b/magick/Makefile.am index 9bc408050..acd593c0e 100644 --- a/magick/Makefile.am +++ b/magick/Makefile.am @@ -81,6 +81,9 @@ MAGICK_BASE_SRCS = \ magick/color.c \ magick/color.h \ magick/color-private.h \ + magick/colormap.c \ + magick/colormap.h \ + magick/colormap-private.h \ magick/colorspace.c \ magick/colorspace.h \ magick/colorspace-private.h \ @@ -281,6 +284,7 @@ MAGICK_INCLUDE_HDRS = \ magick/client.h \ magick/coder.h \ magick/color.h \ + magick/colormap.h \ magick/colorspace.h \ magick/compare.h \ magick/composite.h \ @@ -357,6 +361,7 @@ MAGICK_NOINST_HDRS = \ magick/blob-private.h \ magick/cache-private.h \ magick/color-private.h \ + magick/colormap-private.h \ magick/colorspace-private.h \ magick/composite-private.h \ magick/delegate-private.h \ diff --git a/magick/color-private.h b/magick/color-private.h index d7bac5d67..5daeb03c4 100644 --- a/magick/color-private.h +++ b/magick/color-private.h @@ -34,16 +34,6 @@ static inline MagickBooleanType IsColorEqual(const PixelPacket *p, return(MagickFalse); } -static inline IndexPacket ConstrainColormapIndex(Image *image, - const unsigned long index) -{ - if (index < image->colors) - return((IndexPacket) index); - (void) ThrowMagickException(&image->exception,GetMagickModule(), - CorruptImageError,"InvalidColormapIndex","`%s'",image->filename); - return((IndexPacket) 0); -} - static inline MagickBooleanType IsGray(const PixelPacket *pixel) { if ((pixel->red == pixel->green) && (pixel->green == pixel->blue)) diff --git a/magick/colormap-private.h b/magick/colormap-private.h new file mode 100644 index 000000000..52c2d3ba8 --- /dev/null +++ b/magick/colormap-private.h @@ -0,0 +1,43 @@ +/* + Copyright 1999-2009 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. + obtain a copy of the License at + + http://www.imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore image colormap methods. +*/ +#ifndef _MAGICKCORE_COLORMAP_PRIVATE_H +#define _MAGICKCORE_COLORMAP_PRIVATE_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#include +#include +#include + +static inline IndexPacket ConstrainColormapIndex(Image *image, + const unsigned long index) +{ + if (index < image->colors) + return((IndexPacket) index); + (void) ThrowMagickException(&image->exception,GetMagickModule(), + CorruptImageError,"InvalidColormapIndex","`%s'",image->filename); + return((IndexPacket) 0); +} + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/magick/colormap.c b/magick/colormap.c new file mode 100644 index 000000000..a9ac2aada --- /dev/null +++ b/magick/colormap.c @@ -0,0 +1,306 @@ +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% CCCC OOO L OOO RRRR M M AAA PPPP % +% C O O L O O R R MM MM A A P P % +% C O O L O O RRRR M M M AAAAA PPPP % +% C O O L O O R R M M A A P % +% CCCC OOO LLLLL OOO R R M M A A P % +% % +% % +% MagickCore Colormap Methods % +% % +% Software Design % +% John Cristy % +% July 1992 % +% % +% % +% Copyright 1999-2009 ImageMagick Studio LLC, a non-profit organization % +% dedicated to making software imaging solutions freely available. % +% % +% You may not use this file except in compliance with the License. You may % +% obtain a copy of the License at % +% % +% http://www.imagemagick.org/script/license.php % +% % +% Unless required by applicable law or agreed to in writing, software % +% distributed under the License is distributed on an "AS IS" BASIS, % +% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % +% See the License for the specific language governing permissions and % +% limitations under the License. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% We use linked-lists because splay-trees do not currently support duplicate +% key / value pairs (.e.g X11 green compliance and SVG green compliance). +% +*/ + +/* + Include declarations. +*/ +#include "magick/studio.h" +#include "magick/blob.h" +#include "magick/cache-view.h" +#include "magick/cache.h" +#include "magick/color.h" +#include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/client.h" +#include "magick/configure.h" +#include "magick/exception.h" +#include "magick/exception-private.h" +#include "magick/gem.h" +#include "magick/geometry.h" +#include "magick/image-private.h" +#include "magick/memory_.h" +#include "magick/monitor.h" +#include "magick/monitor-private.h" +#include "magick/option.h" +#include "magick/pixel-private.h" +#include "magick/quantize.h" +#include "magick/quantum.h" +#include "magick/semaphore.h" +#include "magick/string_.h" +#include "magick/token.h" +#include "magick/utility.h" +#include "magick/xml-tree.h" + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% C y c l e C o l o r m a p I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% CycleColormap() displaces an image's colormap by a given number of +% positions. If you cycle the colormap a number of times you can produce +% a psychodelic effect. +% +% The format of the CycleColormapImage method is: +% +% MagickBooleanType CycleColormapImage(Image *image,const long displace) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o displace: displace the colormap this amount. +% +*/ +MagickExport MagickBooleanType CycleColormapImage(Image *image, + const long displace) +{ + CacheView + *image_view; + + ExceptionInfo + *exception; + + long + y; + + MagickBooleanType + status; + + assert(image != (Image *) NULL); + assert(image->signature == MagickSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (image->storage_class == DirectClass) + (void) SetImageType(image,PaletteType); + status=MagickTrue; + exception=(&image->exception); + image_view=AcquireCacheView(image); +#if defined(_OPENMP) && (_OPENMP >= 200203) + #pragma omp parallel for schedule(static,1) shared(status) +#endif + for (y=0; y < (long) image->rows; y++) + { + long + index; + + register IndexPacket + *__restrict indexes; + + register long + x; + + register PixelPacket + *__restrict q; + + if (status == MagickFalse) + continue; + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(image_view); + for (x=0; x < (long) image->columns; x++) + { + index=(long) (indexes[x]+displace) % image->colors; + if (index < 0) + index+=image->colors; + indexes[x]=(IndexPacket) index; + q->red=image->colormap[index].red; + q->green=image->colormap[index].green; + q->blue=image->colormap[index].blue; + q++; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + } + image_view=DestroyCacheView(image_view); + return(status); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % ++ S o r t C o l o r m a p B y I n t e n s i t y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SortColormapByIntensity() sorts the colormap of a PseudoClass image by +% decreasing color intensity. +% +% The format of the SortColormapByIntensity method is: +% +% MagickBooleanType SortColormapByIntensity(Image *image) +% +% A description of each parameter follows: +% +% o image: A pointer to an Image structure. +% +*/ + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +static int IntensityCompare(const void *x,const void *y) +{ + const PixelPacket + *color_1, + *color_2; + + int + intensity; + + color_1=(const PixelPacket *) x; + color_2=(const PixelPacket *) y; + intensity=(int) PixelIntensityToQuantum(color_2)- + (int) PixelIntensityToQuantum(color_1); + return(intensity); +} + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +MagickExport MagickBooleanType SortColormapByIntensity(Image *image) +{ + CacheView + *image_view; + + ExceptionInfo + *exception; + + long + y; + + MagickBooleanType + status; + + register long + i; + + unsigned short + *pixels; + + assert(image != (Image *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image->signature == MagickSignature); + if (image->storage_class != PseudoClass) + return(MagickTrue); + /* + Allocate memory for pixel indexes. + */ + pixels=(unsigned short *) AcquireQuantumMemory((size_t) image->colors, + sizeof(*pixels)); + if (pixels == (unsigned short *) NULL) + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + /* + Assign index values to colormap entries. + */ +#if defined(_OPENMP) && (_OPENMP >= 200203) + #pragma omp parallel for schedule(static,1) shared(status) +#endif + for (i=0; i < (long) image->colors; i++) + image->colormap[i].opacity=(IndexPacket) i; + /* + Sort image colormap by decreasing color popularity. + */ + qsort((void *) image->colormap,(size_t) image->colors, + sizeof(*image->colormap),IntensityCompare); + /* + Update image colormap indexes to sorted colormap order. + */ +#if defined(_OPENMP) && (_OPENMP >= 200203) + #pragma omp parallel for schedule(static,1) shared(status) +#endif + for (i=0; i < (long) image->colors; i++) + pixels[(long) image->colormap[i].opacity]=(unsigned short) i; + status=MagickTrue; + exception=(&image->exception); + image_view=AcquireCacheView(image); + for (y=0; y < (long) image->rows; y++) + { + IndexPacket + index; + + register long + x; + + register IndexPacket + *__restrict indexes; + + register PixelPacket + *__restrict q; + + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + indexes=GetCacheViewAuthenticIndexQueue(image_view); + for (x=0; x < (long) image->columns; x++) + { + index=(IndexPacket) pixels[(long) indexes[x]]; + indexes[x]=index; + *q++=image->colormap[(long) index]; + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + if (status == MagickFalse) + break; + } + image_view=DestroyCacheView(image_view); + pixels=(unsigned short *) RelinquishMagickMemory(pixels); + return(status); +} diff --git a/magick/colormap.h b/magick/colormap.h new file mode 100644 index 000000000..794d267d7 --- /dev/null +++ b/magick/colormap.h @@ -0,0 +1,33 @@ +/* + Copyright 1999-2009 ImageMagick Studio LLC, a non-profit organization + dedicated to making software imaging solutions freely available. + + You may not use this file except in compliance with the License. + obtain a copy of the License at + + http://www.imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + MagickCore image colormap methods. +*/ +#ifndef _MAGICKCORE_COLORMAP_H +#define _MAGICKCORE_COLORMAP_H + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +extern MagickExport MagickBooleanType + CycleColormapImage(Image *,const long), + SortColormapByIntensity(Image *); + +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif + +#endif diff --git a/magick/composite.c b/magick/composite.c index 61f28f8bf..629195249 100644 --- a/magick/composite.c +++ b/magick/composite.c @@ -2369,3 +2369,76 @@ MagickExport MagickBooleanType CompositeImageChannel(Image *image, destination_image=DestroyImage(destination_image); return(status); } + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% T e x t u r e I m a g e % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% TextureImage() repeatedly tiles the texture image across and down the image +% canvas. +% +% The format of the TextureImage method is: +% +% MagickBooleanType TextureImage(Image *image,const Image *texture) +% +% A description of each parameter follows: +% +% o image: the image. +% +% o texture: This image is the texture to layer on the background. +% +*/ +MagickExport MagickBooleanType TextureImage(Image *image,const Image *texture) +{ +#define TextureImageTag "Texture/Image" + + ExceptionInfo + *exception; + + long + y; + + MagickStatusType + status; + + assert(image != (Image *) NULL); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); + assert(image->signature == MagickSignature); + if (texture == (const Image *) NULL) + return(MagickFalse); + if (SetImageStorageClass(image,DirectClass) == MagickFalse) + return(MagickFalse); + /* + Tile texture onto the image background. + */ + status=MagickTrue; + exception=(&image->exception); + for (y=0; y < (long) image->rows; y+=texture->rows) + { + register long + x; + + for (x=0; x < (long) image->columns; x+=texture->columns) + status|=CompositeImage(image,image->compose,texture,x+ + texture->tile_offset.x,y+texture->tile_offset.y); + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + + proceed=SetImageProgress(image,TextureImageTag,y,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + (void) SetImageProgress(image,TextureImageTag,image->rows,image->rows); + return(status != 0 ? MagickTrue : MagickFalse); +} diff --git a/magick/composite.h b/magick/composite.h index e58769e56..d1c7b7ef1 100644 --- a/magick/composite.h +++ b/magick/composite.h @@ -94,7 +94,8 @@ extern MagickExport MagickBooleanType CompositeImage(Image *,const CompositeOperator,const Image *,const long, const long), CompositeImageChannel(Image *,const ChannelType,const CompositeOperator, - const Image *,const long,const long); + const Image *,const long,const long), + TextureImage(Image *,const Image *); #if defined(__cplusplus) || defined(c_plusplus) } diff --git a/magick/deprecate.c b/magick/deprecate.c index 1a3e9f0da..e6e7dc8dd 100644 --- a/magick/deprecate.c +++ b/magick/deprecate.c @@ -49,6 +49,8 @@ #include "magick/client.h" #include "magick/color.h" #include "magick/color-private.h" +#include "magick/colormap.h" +#include "magick/colormap-private.h" #include "magick/colorspace.h" #include "magick/composite.h" #include "magick/composite-private.h" diff --git a/magick/image.c b/magick/image.c index a0e9ec059..afd1397f6 100644 --- a/magick/image.c +++ b/magick/image.c @@ -51,6 +51,7 @@ #include "magick/client.h" #include "magick/color.h" #include "magick/color-private.h" +#include "magick/colormap.h" #include "magick/colorspace.h" #include "magick/colorspace-private.h" #include "magick/composite.h" @@ -627,257 +628,6 @@ MagickExport Image *AppendImages(const Image *image, % % % % % % -% A v e r a g e I m a g e s % -% % -% % -% % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% AverageImages() takes a set of images and averages them together. Each -% image in the set must have the same width and height. AverageImages() -% returns a single image with each corresponding pixel component of each -% image averaged. On failure, a NULL image is returned and exception -% describes the reason for the failure. -% -% The format of the AverageImages method is: -% -% Image *AverageImages(Image *image,ExceptionInfo *exception) -% -% A description of each parameter follows: -% -% o image: the image sequence. -% -% o exception: return any errors or warnings in this structure. -% -*/ - -static MagickPixelPacket **DestroyPixelThreadSet(MagickPixelPacket **pixels) -{ - register long - i; - - assert(pixels != (MagickPixelPacket **) NULL); - for (i=0; i < (long) GetOpenMPMaximumThreads(); i++) - if (pixels[i] != (MagickPixelPacket *) NULL) - pixels[i]=(MagickPixelPacket *) RelinquishMagickMemory(pixels[i]); - pixels=(MagickPixelPacket **) RelinquishAlignedMemory(pixels); - return(pixels); -} - -static MagickPixelPacket **AcquirePixelThreadSet(const Image *image) -{ - register long - i, - j; - - MagickPixelPacket - **pixels; - - unsigned long - number_threads; - - number_threads=GetOpenMPMaximumThreads(); - pixels=(MagickPixelPacket **) AcquireAlignedMemory(number_threads, - sizeof(*pixels)); - if (pixels == (MagickPixelPacket **) NULL) - return((MagickPixelPacket **) NULL); - (void) ResetMagickMemory(pixels,0,number_threads*sizeof(*pixels)); - for (i=0; i < (long) number_threads; i++) - { - pixels[i]=(MagickPixelPacket *) AcquireQuantumMemory(image->columns, - sizeof(**pixels)); - if (pixels[i] == (MagickPixelPacket *) NULL) - return(DestroyPixelThreadSet(pixels)); - for (j=0; j < (long) image->columns; j++) - GetMagickPixelPacket(image,&pixels[i][j]); - } - return(pixels); -} - -MagickExport Image *AverageImages(const Image *image,ExceptionInfo *exception) -{ -#define AverageImageTag "Average/Image" - - CacheView - *average_view; - - const Image - *next; - - Image - *average_image; - - long - progress, - y; - - MagickBooleanType - status; - - MagickPixelPacket - **average_pixels, - zero; - - unsigned long - number_images; - - /* - Ensure the image are the same size. - */ - assert(image != (Image *) NULL); - assert(image->signature == MagickSignature); - if (image->debug != MagickFalse) - (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); - assert(exception != (ExceptionInfo *) NULL); - assert(exception->signature == MagickSignature); - for (next=image; next != (Image *) NULL; next=GetNextImageInList(next)) - if ((next->columns != image->columns) || (next->rows != image->rows)) - ThrowImageException(OptionError,"ImageWidthsOrHeightsDiffer"); - /* - Initialize average next attributes. - */ - average_image=CloneImage(image,image->columns,image->rows,MagickTrue, - exception); - if (average_image == (Image *) NULL) - return((Image *) NULL); - if (SetImageStorageClass(average_image,DirectClass) == MagickFalse) - { - InheritException(exception,&average_image->exception); - average_image=DestroyImage(average_image); - return((Image *) NULL); - } - average_pixels=AcquirePixelThreadSet(image); - if (average_pixels == (MagickPixelPacket **) NULL) - { - average_image=DestroyImage(average_image); - ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); - } - /* - Average image pixels. - */ - status=MagickTrue; - progress=0; - GetMagickPixelPacket(image,&zero); - number_images=GetImageListLength(image); - average_view=AcquireCacheView(average_image); -#if defined(_OPENMP) && (_OPENMP >= 200203) - #pragma omp parallel for schedule(static,1) shared(progress,status) -#endif - for (y=0; y < (long) average_image->rows; y++) - { - CacheView - *image_view; - - const Image - *next; - - MagickPixelPacket - pixel; - - register IndexPacket - *__restrict average_indexes; - - register long - i, - id, - x; - - register MagickPixelPacket - *average_pixel; - - register PixelPacket - *__restrict q; - - if (status == MagickFalse) - continue; - q=QueueCacheViewAuthenticPixels(average_view,0,y,average_image->columns,1, - exception); - if (q == (PixelPacket *) NULL) - { - status=MagickFalse; - continue; - } - average_indexes=GetCacheViewAuthenticIndexQueue(average_view); - pixel=zero; - id=GetOpenMPThreadId(); - average_pixel=average_pixels[id]; - for (x=0; x < (long) average_image->columns; x++) - average_pixel[x]=zero; - next=image; - for (i=0; i < (long) number_images; i++) - { - register const IndexPacket - *indexes; - - register const PixelPacket - *p; - - image_view=AcquireCacheView(next); - p=GetCacheViewVirtualPixels(image_view,0,y,next->columns,1,exception); - if (p == (const PixelPacket *) NULL) - { - image_view=DestroyCacheView(image_view); - break; - } - indexes=GetCacheViewVirtualIndexQueue(image_view); - for (x=0; x < (long) next->columns; x++) - { - SetMagickPixelPacket(next,p,indexes+x,&pixel); - average_pixel[x].red+=QuantumScale*pixel.red; - average_pixel[x].green+=QuantumScale*pixel.green; - average_pixel[x].blue+=QuantumScale*pixel.blue; - average_pixel[x].opacity+=QuantumScale*pixel.opacity; - if (average_image->colorspace == CMYKColorspace) - average_pixel[x].index+=QuantumScale*pixel.index; - p++; - } - image_view=DestroyCacheView(image_view); - next=GetNextImageInList(next); - } - for (x=0; x < (long) average_image->columns; x++) - { - average_pixel[x].red=(MagickRealType) (QuantumRange* - average_pixel[x].red/number_images); - average_pixel[x].green=(MagickRealType) (QuantumRange* - average_pixel[x].green/number_images); - average_pixel[x].blue=(MagickRealType) (QuantumRange* - average_pixel[x].blue/number_images); - average_pixel[x].opacity=(MagickRealType) (QuantumRange* - average_pixel[x].opacity/number_images); - if (average_image->colorspace == CMYKColorspace) - average_pixel[x].index=(MagickRealType) (QuantumRange* - average_pixel[x].index/number_images); - SetPixelPacket(average_image,&average_pixel[x],q,average_indexes+x); - q++; - } - if (SyncCacheViewAuthenticPixels(average_view,exception) == MagickFalse) - status=MagickFalse; - if (image->progress_monitor != (MagickProgressMonitor) NULL) - { - MagickBooleanType - proceed; - -#if defined(_OPENMP) && (_OPENMP >= 200203) - #pragma omp critical (MagickCore_AverageImages) -#endif - proceed=SetImageProgress(image,AverageImageTag,progress++, - average_image->rows); - if (proceed == MagickFalse) - status=MagickFalse; - } - } - average_view=DestroyCacheView(average_view); - average_pixels=DestroyPixelThreadSet(average_pixels); - if (status == MagickFalse) - average_image=DestroyImage(average_image); - return(average_image); -} - -/* -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % -% % -% % % C a t c h I m a g e E x c e p t i o n % % % % % @@ -1483,100 +1233,6 @@ MagickExport Image *CombineImages(const Image *image,const ChannelType channel, % % % % % % -% C y c l e C o l o r m a p I m a g e % -% % -% % -% % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% CycleColormap() displaces an image's colormap by a given number of -% positions. If you cycle the colormap a number of times you can produce -% a psychodelic effect. -% -% The format of the CycleColormapImage method is: -% -% MagickBooleanType CycleColormapImage(Image *image,const long displace) -% -% A description of each parameter follows: -% -% o image: the image. -% -% o displace: displace the colormap this amount. -% -*/ -MagickExport MagickBooleanType CycleColormapImage(Image *image, - const long displace) -{ - CacheView - *image_view; - - ExceptionInfo - *exception; - - long - y; - - MagickBooleanType - status; - - assert(image != (Image *) NULL); - assert(image->signature == MagickSignature); - if (image->debug != MagickFalse) - (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); - if (image->storage_class == DirectClass) - (void) SetImageType(image,PaletteType); - status=MagickTrue; - exception=(&image->exception); - image_view=AcquireCacheView(image); -#if defined(_OPENMP) && (_OPENMP >= 200203) - #pragma omp parallel for schedule(static,1) shared(status) -#endif - for (y=0; y < (long) image->rows; y++) - { - long - index; - - register IndexPacket - *__restrict indexes; - - register long - x; - - register PixelPacket - *__restrict q; - - if (status == MagickFalse) - continue; - q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); - if (q == (PixelPacket *) NULL) - { - status=MagickFalse; - continue; - } - indexes=GetCacheViewAuthenticIndexQueue(image_view); - for (x=0; x < (long) image->columns; x++) - { - index=(long) (indexes[x]+displace) % image->colors; - if (index < 0) - index+=image->colors; - indexes[x]=(IndexPacket) index; - q->red=image->colormap[index].red; - q->green=image->colormap[index].green; - q->blue=image->colormap[index].blue; - q++; - } - if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) - status=MagickFalse; - } - image_view=DestroyCacheView(image_view); - return(status); -} - -/* -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % -% % -% % % D e s t r o y I m a g e % % % % % @@ -4124,149 +3780,6 @@ MagickExport VirtualPixelMethod SetImageVirtualPixelMethod(const Image *image, return(SetPixelCacheVirtualMethod(image,virtual_pixel_method)); } -/* -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % -% % -% % -+ S o r t C o l o r m a p B y I n t e n s i t y % -% % -% % -% % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% SortColormapByIntensity() sorts the colormap of a PseudoClass image by -% decreasing color intensity. -% -% The format of the SortColormapByIntensity method is: -% -% MagickBooleanType SortColormapByIntensity(Image *image) -% -% A description of each parameter follows: -% -% o image: A pointer to an Image structure. -% -*/ - -#if defined(__cplusplus) || defined(c_plusplus) -extern "C" { -#endif - -static int IntensityCompare(const void *x,const void *y) -{ - const PixelPacket - *color_1, - *color_2; - - int - intensity; - - color_1=(const PixelPacket *) x; - color_2=(const PixelPacket *) y; - intensity=(int) PixelIntensityToQuantum(color_2)- - (int) PixelIntensityToQuantum(color_1); - return(intensity); -} - -#if defined(__cplusplus) || defined(c_plusplus) -} -#endif - -MagickExport MagickBooleanType SortColormapByIntensity(Image *image) -{ - CacheView - *image_view; - - ExceptionInfo - *exception; - - long - y; - - MagickBooleanType - status; - - register long - i; - - unsigned short - *pixels; - - assert(image != (Image *) NULL); - if (image->debug != MagickFalse) - (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); - assert(image->signature == MagickSignature); - if (image->storage_class != PseudoClass) - return(MagickTrue); - /* - Allocate memory for pixel indexes. - */ - pixels=(unsigned short *) AcquireQuantumMemory((size_t) image->colors, - sizeof(*pixels)); - if (pixels == (unsigned short *) NULL) - ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", - image->filename); - /* - Assign index values to colormap entries. - */ -#if defined(_OPENMP) && (_OPENMP >= 200203) - #pragma omp parallel for schedule(static,1) shared(status) -#endif - for (i=0; i < (long) image->colors; i++) - image->colormap[i].opacity=(IndexPacket) i; - /* - Sort image colormap by decreasing color popularity. - */ - qsort((void *) image->colormap,(size_t) image->colors, - sizeof(*image->colormap),IntensityCompare); - /* - Update image colormap indexes to sorted colormap order. - */ -#if defined(_OPENMP) && (_OPENMP >= 200203) - #pragma omp parallel for schedule(static,1) shared(status) -#endif - for (i=0; i < (long) image->colors; i++) - pixels[(long) image->colormap[i].opacity]=(unsigned short) i; - status=MagickTrue; - exception=(&image->exception); - image_view=AcquireCacheView(image); - for (y=0; y < (long) image->rows; y++) - { - IndexPacket - index; - - register long - x; - - register IndexPacket - *__restrict indexes; - - register PixelPacket - *__restrict q; - - q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); - if (q == (PixelPacket *) NULL) - { - status=MagickFalse; - continue; - } - indexes=GetCacheViewAuthenticIndexQueue(image_view); - for (x=0; x < (long) image->columns; x++) - { - index=(IndexPacket) pixels[(long) indexes[x]]; - indexes[x]=index; - *q++=image->colormap[(long) index]; - } - if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) - status=MagickFalse; - if (status == MagickFalse) - break; - } - image_view=DestroyCacheView(image_view); - pixels=(unsigned short *) RelinquishMagickMemory(pixels); - return(status); -} - /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % @@ -4402,76 +3915,3 @@ MagickExport MagickBooleanType SyncImage(Image *image) CorruptImageError,"InvalidColormapIndex","`%s'",image->filename); return(status); } - -/* -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % -% % -% % -% T e x t u r e I m a g e % -% % -% % -% % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% TextureImage() repeatedly tiles the texture image across and down the image -% canvas. -% -% The format of the TextureImage method is: -% -% MagickBooleanType TextureImage(Image *image,const Image *texture) -% -% A description of each parameter follows: -% -% o image: the image. -% -% o texture: This image is the texture to layer on the background. -% -*/ -MagickExport MagickBooleanType TextureImage(Image *image,const Image *texture) -{ -#define TextureImageTag "Texture/Image" - - ExceptionInfo - *exception; - - long - y; - - MagickStatusType - status; - - assert(image != (Image *) NULL); - if (image->debug != MagickFalse) - (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); - assert(image->signature == MagickSignature); - if (texture == (const Image *) NULL) - return(MagickFalse); - if (SetImageStorageClass(image,DirectClass) == MagickFalse) - return(MagickFalse); - /* - Tile texture onto the image background. - */ - status=MagickTrue; - exception=(&image->exception); - for (y=0; y < (long) image->rows; y+=texture->rows) - { - register long - x; - - for (x=0; x < (long) image->columns; x+=texture->columns) - status|=CompositeImage(image,image->compose,texture,x+ - texture->tile_offset.x,y+texture->tile_offset.y); - if (image->progress_monitor != (MagickProgressMonitor) NULL) - { - MagickBooleanType - proceed; - - proceed=SetImageProgress(image,TextureImageTag,y,image->rows); - if (proceed == MagickFalse) - status=MagickFalse; - } - } - (void) SetImageProgress(image,TextureImageTag,image->rows,image->rows); - return(status != 0 ? MagickTrue : MagickFalse); -} diff --git a/magick/image.h b/magick/image.h index 9a3eaeaef..6d75751f9 100644 --- a/magick/image.h +++ b/magick/image.h @@ -481,7 +481,6 @@ extern MagickExport ExceptionType extern MagickExport Image *AcquireImage(const ImageInfo *), *AppendImages(const Image *,const MagickBooleanType,ExceptionInfo *), - *AverageImages(const Image *,ExceptionInfo *), *CloneImage(const Image *,const unsigned long,const unsigned long, const MagickBooleanType,ExceptionInfo *), *CombineImages(const Image *,const ChannelType,ExceptionInfo *), @@ -508,7 +507,6 @@ extern MagickExport MagickBooleanType AcquireImageColormap(Image *,const unsigned long), ClipImage(Image *), ClipImagePath(Image *,const char *,const MagickBooleanType), - CycleColormapImage(Image *,const long), GetImageAlphaChannel(const Image *), IsTaintImage(const Image *), IsMagickConflict(const char *), @@ -527,10 +525,8 @@ extern MagickExport MagickBooleanType SetImageOpacity(Image *,const Quantum), SetImageStorageClass(Image *,const ClassType), SetImageType(Image *,const ImageType), - SortColormapByIntensity(Image *), StripImage(Image *), - SyncImage(Image *), - TextureImage(Image *,const Image *); + SyncImage(Image *); extern MagickExport size_t InterpretImageFilename(const ImageInfo *,Image *,const char *,int,char *); diff --git a/magick/statistic.c b/magick/statistic.c index 46505dcb8..d1b8dabb1 100644 --- a/magick/statistic.c +++ b/magick/statistic.c @@ -93,6 +93,257 @@ % % % % % % +% A v e r a g e I m a g e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AverageImages() takes a set of images and averages them together. Each +% image in the set must have the same width and height. AverageImages() +% returns a single image with each corresponding pixel component of each +% image averaged. On failure, a NULL image is returned and exception +% describes the reason for the failure. +% +% The format of the AverageImages method is: +% +% Image *AverageImages(Image *image,ExceptionInfo *exception) +% +% A description of each parameter follows: +% +% o image: the image sequence. +% +% o exception: return any errors or warnings in this structure. +% +*/ + +static MagickPixelPacket **DestroyPixelThreadSet(MagickPixelPacket **pixels) +{ + register long + i; + + assert(pixels != (MagickPixelPacket **) NULL); + for (i=0; i < (long) GetOpenMPMaximumThreads(); i++) + if (pixels[i] != (MagickPixelPacket *) NULL) + pixels[i]=(MagickPixelPacket *) RelinquishMagickMemory(pixels[i]); + pixels=(MagickPixelPacket **) RelinquishAlignedMemory(pixels); + return(pixels); +} + +static MagickPixelPacket **AcquirePixelThreadSet(const Image *image) +{ + register long + i, + j; + + MagickPixelPacket + **pixels; + + unsigned long + number_threads; + + number_threads=GetOpenMPMaximumThreads(); + pixels=(MagickPixelPacket **) AcquireAlignedMemory(number_threads, + sizeof(*pixels)); + if (pixels == (MagickPixelPacket **) NULL) + return((MagickPixelPacket **) NULL); + (void) ResetMagickMemory(pixels,0,number_threads*sizeof(*pixels)); + for (i=0; i < (long) number_threads; i++) + { + pixels[i]=(MagickPixelPacket *) AcquireQuantumMemory(image->columns, + sizeof(**pixels)); + if (pixels[i] == (MagickPixelPacket *) NULL) + return(DestroyPixelThreadSet(pixels)); + for (j=0; j < (long) image->columns; j++) + GetMagickPixelPacket(image,&pixels[i][j]); + } + return(pixels); +} + +MagickExport Image *AverageImages(const Image *image,ExceptionInfo *exception) +{ +#define AverageImageTag "Average/Image" + + CacheView + *average_view; + + const Image + *next; + + Image + *average_image; + + long + progress, + y; + + MagickBooleanType + status; + + MagickPixelPacket + **average_pixels, + zero; + + unsigned long + number_images; + + /* + Ensure the image are the same size. + */ + assert(image != (Image *) NULL); + assert(image->signature == MagickSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickSignature); + for (next=image; next != (Image *) NULL; next=GetNextImageInList(next)) + if ((next->columns != image->columns) || (next->rows != image->rows)) + ThrowImageException(OptionError,"ImageWidthsOrHeightsDiffer"); + /* + Initialize average next attributes. + */ + average_image=CloneImage(image,image->columns,image->rows,MagickTrue, + exception); + if (average_image == (Image *) NULL) + return((Image *) NULL); + if (SetImageStorageClass(average_image,DirectClass) == MagickFalse) + { + InheritException(exception,&average_image->exception); + average_image=DestroyImage(average_image); + return((Image *) NULL); + } + average_pixels=AcquirePixelThreadSet(image); + if (average_pixels == (MagickPixelPacket **) NULL) + { + average_image=DestroyImage(average_image); + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + } + /* + Average image pixels. + */ + status=MagickTrue; + progress=0; + GetMagickPixelPacket(image,&zero); + number_images=GetImageListLength(image); + average_view=AcquireCacheView(average_image); +#if defined(_OPENMP) && (_OPENMP >= 200203) + #pragma omp parallel for schedule(static,1) shared(progress,status) +#endif + for (y=0; y < (long) average_image->rows; y++) + { + CacheView + *image_view; + + const Image + *next; + + MagickPixelPacket + pixel; + + register IndexPacket + *__restrict average_indexes; + + register long + i, + id, + x; + + register MagickPixelPacket + *average_pixel; + + register PixelPacket + *__restrict q; + + if (status == MagickFalse) + continue; + q=QueueCacheViewAuthenticPixels(average_view,0,y,average_image->columns,1, + exception); + if (q == (PixelPacket *) NULL) + { + status=MagickFalse; + continue; + } + average_indexes=GetCacheViewAuthenticIndexQueue(average_view); + pixel=zero; + id=GetOpenMPThreadId(); + average_pixel=average_pixels[id]; + for (x=0; x < (long) average_image->columns; x++) + average_pixel[x]=zero; + next=image; + for (i=0; i < (long) number_images; i++) + { + register const IndexPacket + *indexes; + + register const PixelPacket + *p; + + image_view=AcquireCacheView(next); + p=GetCacheViewVirtualPixels(image_view,0,y,next->columns,1,exception); + if (p == (const PixelPacket *) NULL) + { + image_view=DestroyCacheView(image_view); + break; + } + indexes=GetCacheViewVirtualIndexQueue(image_view); + for (x=0; x < (long) next->columns; x++) + { + SetMagickPixelPacket(next,p,indexes+x,&pixel); + average_pixel[x].red+=QuantumScale*pixel.red; + average_pixel[x].green+=QuantumScale*pixel.green; + average_pixel[x].blue+=QuantumScale*pixel.blue; + average_pixel[x].opacity+=QuantumScale*pixel.opacity; + if (average_image->colorspace == CMYKColorspace) + average_pixel[x].index+=QuantumScale*pixel.index; + p++; + } + image_view=DestroyCacheView(image_view); + next=GetNextImageInList(next); + } + for (x=0; x < (long) average_image->columns; x++) + { + average_pixel[x].red=(MagickRealType) (QuantumRange* + average_pixel[x].red/number_images); + average_pixel[x].green=(MagickRealType) (QuantumRange* + average_pixel[x].green/number_images); + average_pixel[x].blue=(MagickRealType) (QuantumRange* + average_pixel[x].blue/number_images); + average_pixel[x].opacity=(MagickRealType) (QuantumRange* + average_pixel[x].opacity/number_images); + if (average_image->colorspace == CMYKColorspace) + average_pixel[x].index=(MagickRealType) (QuantumRange* + average_pixel[x].index/number_images); + SetPixelPacket(average_image,&average_pixel[x],q,average_indexes+x); + q++; + } + if (SyncCacheViewAuthenticPixels(average_view,exception) == MagickFalse) + status=MagickFalse; + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(_OPENMP) && (_OPENMP >= 200203) + #pragma omp critical (MagickCore_AverageImages) +#endif + proceed=SetImageProgress(image,AverageImageTag,progress++, + average_image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + average_view=DestroyCacheView(average_view); + average_pixels=DestroyPixelThreadSet(average_pixels); + if (status == MagickFalse) + average_image=DestroyImage(average_image); + return(average_image); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % + G e t I m a g e B o u n d i n g B o x % % % % % diff --git a/magick/statistic.h b/magick/statistic.h index 8369e6f6c..8ce3f4781 100644 --- a/magick/statistic.h +++ b/magick/statistic.h @@ -39,6 +39,9 @@ typedef struct _ChannelStatistics extern MagickExport ChannelStatistics *GetImageChannelStatistics(const Image *,ExceptionInfo *); +extern MagickExport Image + *AverageImages(const Image *,ExceptionInfo *); + extern MagickExport MagickBooleanType GetImageChannelExtrema(const Image *,const ChannelType,unsigned long *, unsigned long *,ExceptionInfo *), diff --git a/magick/version.h b/magick/version.h index 07fd30023..fa73d96d8 100644 --- a/magick/version.h +++ b/magick/version.h @@ -31,7 +31,7 @@ extern "C" { #define MagickLibVersionText "6.5.6" #define MagickLibVersionNumber 2,0,0 #define MagickLibSubversion "-2" -#define MagickReleaseDate "2009-09-15" +#define MagickReleaseDate "2009-09-17" #define MagickChangeDate "20090913" #define MagickAuthoritativeURL "http://www.imagemagick.org" #define MagickHomeURL "file:///usr/local/share/doc/ImageMagick-6.5.6/index.html" diff --git a/www/api/colormap.html b/www/api/colormap.html new file mode 100644 index 000000000..e69de29bb -- 2.40.0