]> granicus.if.org Git - imagemagick/blob - MagickCore/prepress.c
(no commit message)
[imagemagick] / MagickCore / prepress.c
1 /*
2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 %                                                                             %
4 %                                                                             %
5 %                                                                             %
6 %           PPPP    RRRR    EEEEE  PPPP   RRRR   EEEEE  SSSSS  SSSSS          %
7 %           P   P   R   R   E      P   P  R   R  E      SS     SS             %
8 %           PPPP    RRRR    EEE    PPPP   RRRR   EEE     SSS    SSS           %
9 %           P       R R     E      P      R R    E         SS     SS          %
10 %           P       R  R    EEEEE  P      R  R   EEEEE  SSSSS  SSSSS          %
11 %                                                                             %
12 %                                                                             %
13 %                         MagickCore Prepress Methods                         %
14 %                                                                             %
15 %                              Software Design                                %
16 %                                John Cristy                                  %
17 %                                October 2001                                 %
18 %                                                                             %
19 %                                                                             %
20 %  Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization      %
21 %  dedicated to making software imaging solutions freely available.           %
22 %                                                                             %
23 %  You may not use this file except in compliance with the License.  You may  %
24 %  obtain a copy of the License at                                            %
25 %                                                                             %
26 %    http://www.imagemagick.org/script/license.php                            %
27 %                                                                             %
28 %  Unless required by applicable law or agreed to in writing, software        %
29 %  distributed under the License is distributed on an "AS IS" BASIS,          %
30 %  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
31 %  See the License for the specific language governing permissions and        %
32 %  limitations under the License.                                             %
33 %                                                                             %
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35 %
36 %
37 */
38 \f
39 /*
40   Include declarations.
41 */
42 #include "MagickCore/studio.h"
43 #include "MagickCore/cache-view.h"
44 #include "MagickCore/exception.h"
45 #include "MagickCore/exception-private.h"
46 #include "MagickCore/hashmap.h"
47 #include "MagickCore/image.h"
48 #include "MagickCore/list.h"
49 #include "MagickCore/memory_.h"
50 #include "MagickCore/pixel-accessor.h"
51 #include "MagickCore/prepress.h"
52 #include "MagickCore/registry.h"
53 #include "MagickCore/semaphore.h"
54 #include "MagickCore/splay-tree.h"
55 #include "MagickCore/string_.h"
56 \f
57 /*
58 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
59 %                                                                             %
60 %                                                                             %
61 %                                                                             %
62 %   G e t I m a g e T o t a l I n k D e n s i t y                             %
63 %                                                                             %
64 %                                                                             %
65 %                                                                             %
66 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
67 %
68 %  GetImageTotalInkDensity() returns the total ink density for a CMYK image.
69 %  Total Ink Density (TID) is determined by adding the CMYK values in the
70 %  darkest shadow area in an image.
71 %
72 %  The format of the GetImageTotalInkDensity method is:
73 %
74 %      double GetImageTotalInkDensity(const Image *image,
75 %        ExceptionInfo *exception)
76 %
77 %  A description of each parameter follows:
78 %
79 %    o image: the image.
80 %
81 %    o exception: return any errors or warnings in this structure.
82 %
83 */
84 MagickExport double GetImageTotalInkDensity(Image *image,
85   ExceptionInfo *exception)
86 {
87   CacheView
88     *image_view;
89
90   double
91     total_ink_density;
92
93   MagickBooleanType
94     status;
95
96   ssize_t
97     y;
98
99   assert(image != (Image *) NULL);
100   if (image->debug != MagickFalse)
101     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
102   assert(image->signature == MagickSignature);
103   if (image->colorspace != CMYKColorspace)
104     {
105       (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
106         "ColorSeparatedImageRequired","`%s'",image->filename);
107       return(0.0);
108     }
109   status=MagickTrue;
110   total_ink_density=0.0;
111   image_view=AcquireCacheView(image);
112 #if defined(MAGICKCORE_OPENMP_SUPPORT)
113   #pragma omp parallel for schedule(static,4) shared(status)
114 #endif
115   for (y=0; y < (ssize_t) image->rows; y++)
116   {
117     double
118       density;
119
120     register const Quantum
121       *p;
122
123     register ssize_t
124       x;
125
126     p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
127     if (p == (const Quantum *) NULL)
128       {
129         status=MagickFalse;
130         continue;
131       }
132     for (x=0; x < (ssize_t) image->columns; x++)
133     {
134       density=(double) GetPixelRed(image,p)+GetPixelGreen(image,p)+
135         GetPixelBlue(image,p)+GetPixelBlack(image,p);
136       if (density > total_ink_density)
137 #if defined(MAGICKCORE_OPENMP_SUPPORT)
138   #pragma omp critical (MagickCore_GetImageTotalInkDensity)
139 #endif
140         {
141           if (density > total_ink_density)
142             total_ink_density=density;
143         }
144       p+=GetPixelChannels(image);
145     }
146   }
147   image_view=DestroyCacheView(image_view);
148   if (status == MagickFalse)
149     total_ink_density=0.0;
150   return(total_ink_density);
151 }