/src/imagemagick/MagickCore/prepress.c
Line | Count | Source |
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 | | % Cristy % |
17 | | % October 2001 % |
18 | | % % |
19 | | % % |
20 | | % Copyright @ 1999 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 | | % https://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 | | |
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/image.h" |
47 | | #include "MagickCore/linked-list.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/resource_.h" |
53 | | #include "MagickCore/registry.h" |
54 | | #include "MagickCore/semaphore.h" |
55 | | #include "MagickCore/splay-tree.h" |
56 | | #include "MagickCore/string_.h" |
57 | | #include "MagickCore/thread-private.h" |
58 | | |
59 | | /* |
60 | | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
61 | | % % |
62 | | % % |
63 | | % % |
64 | | % G e t I m a g e T o t a l I n k D e n s i t y % |
65 | | % % |
66 | | % % |
67 | | % % |
68 | | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
69 | | % |
70 | | % GetImageTotalInkDensity() returns the total ink density for a CMYK image. |
71 | | % Total Ink Density (TID) is determined by adding the CMYK values in the |
72 | | % darkest shadow area in an image. |
73 | | % |
74 | | % The format of the GetImageTotalInkDensity method is: |
75 | | % |
76 | | % double GetImageTotalInkDensity(const Image *image, |
77 | | % ExceptionInfo *exception) |
78 | | % |
79 | | % A description of each parameter follows: |
80 | | % |
81 | | % o image: the image. |
82 | | % |
83 | | % o exception: return any errors or warnings in this structure. |
84 | | % |
85 | | */ |
86 | | MagickExport double GetImageTotalInkDensity(Image *image, |
87 | | ExceptionInfo *exception) |
88 | 0 | { |
89 | 0 | CacheView |
90 | 0 | *image_view; |
91 | |
|
92 | 0 | double |
93 | 0 | total_ink_density; |
94 | |
|
95 | 0 | MagickBooleanType |
96 | 0 | status; |
97 | |
|
98 | 0 | ssize_t |
99 | 0 | y; |
100 | |
|
101 | 0 | assert(image != (Image *) NULL); |
102 | 0 | assert(image->signature == MagickCoreSignature); |
103 | 0 | if (IsEventLogging() != MagickFalse) |
104 | 0 | (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); |
105 | 0 | if (image->colorspace != CMYKColorspace) |
106 | 0 | { |
107 | 0 | (void) ThrowMagickException(exception,GetMagickModule(),ImageError, |
108 | 0 | "ColorSeparatedImageRequired","`%s'",image->filename); |
109 | 0 | return(0.0); |
110 | 0 | } |
111 | 0 | status=MagickTrue; |
112 | 0 | total_ink_density=0.0; |
113 | 0 | image_view=AcquireVirtualCacheView(image,exception); |
114 | | #if defined(MAGICKCORE_OPENMP_SUPPORT) |
115 | | #pragma omp parallel for schedule(static) shared(status) \ |
116 | | magick_number_threads(image,image,image->rows,1) |
117 | | #endif |
118 | 0 | for (y=0; y < (ssize_t) image->rows; y++) |
119 | 0 | { |
120 | 0 | double |
121 | 0 | density; |
122 | |
|
123 | 0 | const Quantum |
124 | 0 | *p; |
125 | |
|
126 | 0 | ssize_t |
127 | 0 | x; |
128 | |
|
129 | 0 | p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); |
130 | 0 | if (p == (const Quantum *) NULL) |
131 | 0 | { |
132 | 0 | status=MagickFalse; |
133 | 0 | continue; |
134 | 0 | } |
135 | 0 | for (x=0; x < (ssize_t) image->columns; x++) |
136 | 0 | { |
137 | 0 | density=(double) GetPixelRed(image,p)+(double) GetPixelGreen(image,p)+ |
138 | 0 | (double) GetPixelBlue(image,p)+(double) GetPixelBlack(image,p); |
139 | 0 | if (density > total_ink_density) |
140 | | #if defined(MAGICKCORE_OPENMP_SUPPORT) |
141 | | #pragma omp critical (MagickCore_GetImageTotalInkDensity) |
142 | | #endif |
143 | 0 | { |
144 | 0 | if (density > total_ink_density) |
145 | 0 | total_ink_density=density; |
146 | 0 | } |
147 | 0 | p+=(ptrdiff_t) GetPixelChannels(image); |
148 | 0 | } |
149 | 0 | } |
150 | 0 | image_view=DestroyCacheView(image_view); |
151 | 0 | if (status == MagickFalse) |
152 | 0 | total_ink_density=0.0; |
153 | 0 | return(total_ink_density); |
154 | 0 | } |