• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 %                                                                             %
4 %                                                                             %
5 %                                                                             %
6 %               M   M   OOO   N   N  IIIII  TTTTT   OOO   RRRR                %
7 %               MM MM  O   O  NN  N    I      T    O   O  R   R               %
8 %               M M M  O   O  N N N    I      T    O   O  RRRR                %
9 %               M   M  O   O  N  NN    I      T    O   O  R R                 %
10 %               M   M   OOO   N   N  IIIII    T     OOO   R  R                %
11 %                                                                             %
12 %                                                                             %
13 %                     MagickCore Progress Monitor Methods                     %
14 %                                                                             %
15 %                              Software Design                                %
16 %                                   Cristy                                    %
17 %                               December 1995                                 %
18 %                                                                             %
19 %                                                                             %
20 %  Copyright 1999-2021 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 /*
41   Include declarations.
42 */
43 #include "MagickCore/studio.h"
44 #include "MagickCore/image.h"
45 #include "MagickCore/log.h"
46 #include "MagickCore/monitor.h"
47 #include "MagickCore/monitor-private.h"
48 
49 /*
50   Static declarations.
51 */
52 static SemaphoreInfo
53   *monitor_semaphore = (SemaphoreInfo *) NULL;
54 
55 /*
56 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
57 %                                                                             %
58 %                                                                             %
59 %                                                                             %
60 +   M o n i t o r C o m p o n e n t G e n e s i s                             %
61 %                                                                             %
62 %                                                                             %
63 %                                                                             %
64 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
65 %
66 %  MonitorComponentGenesis() instantiates the monitor component.
67 %
68 %  The format of the MonitorComponentGenesis method is:
69 %
70 %      MagickBooleanMonitor MonitorComponentGenesis(void)
71 %
72 */
MonitorComponentGenesis(void)73 MagickPrivate MagickBooleanType MonitorComponentGenesis(void)
74 {
75   if (monitor_semaphore == (SemaphoreInfo *) NULL)
76     monitor_semaphore=AcquireSemaphoreInfo();
77   return(MagickTrue);
78 }
79 
80 /*
81 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
82 %                                                                             %
83 %                                                                             %
84 %                                                                             %
85 +   M o n i t o r C o m p o n e n t T e r m i n u s                           %
86 %                                                                             %
87 %                                                                             %
88 %                                                                             %
89 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
90 %
91 %  MonitorComponentTerminus() destroy monitor component.
92 %
93 %  The format of the MonitorComponentTerminus method is:
94 %
95 %      void MonitorComponentTerminus(void)
96 %
97 */
MonitorComponentTerminus(void)98 MagickPrivate void MonitorComponentTerminus(void)
99 {
100   if (monitor_semaphore == (SemaphoreInfo *) NULL)
101     ActivateSemaphoreInfo(&monitor_semaphore);
102   LockSemaphoreInfo(monitor_semaphore);
103   UnlockSemaphoreInfo(monitor_semaphore);
104   RelinquishSemaphoreInfo(&monitor_semaphore);
105 }
106 
107 /*
108 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
109 %                                                                             %
110 %                                                                             %
111 %                                                                             %
112 %   S e t I m a g e P r o g r e s s                                           %
113 %                                                                             %
114 %                                                                             %
115 %                                                                             %
116 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
117 %
118 %  SetImageProgress() returns the progress of an image processing operation.
119 %
120 %  The format of the SetImageProgress method is:
121 %
122 %    MagickBooleanType SetImageProgress(const char *text,
123 %      const MagickOffsetType offset,const MagickSizeType extent)
124 %
125 %  A description of each parameter follows:
126 %
127 %    o image: the image.
128 %
129 %    o text: description of the image processing operation.
130 %
131 %    o offset: the offset relative to the extent parameter.
132 %
133 %    o extent: the extent of the progress.
134 %
135 */
SetImageProgress(const Image * image,const char * tag,const MagickOffsetType offset,const MagickSizeType extent)136 MagickExport MagickBooleanType SetImageProgress(const Image *image,
137   const char *tag,const MagickOffsetType offset,const MagickSizeType extent)
138 {
139   char
140     message[MagickPathExtent];
141 
142   MagickBooleanType
143     status;
144 
145   if (image->progress_monitor == (MagickProgressMonitor) NULL)
146     return(MagickTrue);
147   (void) FormatLocaleString(message,MagickPathExtent,"%s/%s",tag,
148     image->filename);
149   if (monitor_semaphore == (SemaphoreInfo *) NULL)
150     ActivateSemaphoreInfo(&monitor_semaphore);
151   LockSemaphoreInfo(monitor_semaphore);
152   status=image->progress_monitor(message,offset,extent,image->client_data);
153   UnlockSemaphoreInfo(monitor_semaphore);
154   return(status);
155 }
156 
157 /*
158 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
159 %                                                                             %
160 %                                                                             %
161 %                                                                             %
162 %   S e t I m a g e P r o g r e s s M o n i t o r                             %
163 %                                                                             %
164 %                                                                             %
165 %                                                                             %
166 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
167 %
168 %  SetImageProgressMonitor() sets the image progress monitor to the specified
169 %  method and returns the previous progress monitor if any.  The progress
170 %  monitor method looks like this:
171 %
172 %    MagickBooleanType MagickProgressMonitor(const char *text,
173 %      const MagickOffsetType offset,const MagickSizeType extent,
174 %      void *client_data)
175 %
176 %  If the progress monitor returns MagickFalse, the current operation is
177 %  interrupted.
178 %
179 %  The format of the SetImageProgressMonitor method is:
180 %
181 %      MagickProgressMonitor SetImageProgressMonitor(Image *image,
182 %        const MagickProgressMonitor progress_monitor,void *client_data)
183 %
184 %  A description of each parameter follows:
185 %
186 %    o image: the image.
187 %
188 %    o progress_monitor: Specifies a pointer to a method to monitor progress of
189 %      an image operation.
190 %
191 %    o client_data: Specifies a pointer to any client data.
192 %
193 */
SetImageProgressMonitor(Image * image,const MagickProgressMonitor progress_monitor,void * client_data)194 MagickExport MagickProgressMonitor SetImageProgressMonitor(Image *image,
195   const MagickProgressMonitor progress_monitor,void *client_data)
196 {
197   MagickProgressMonitor
198     previous_monitor;
199 
200   previous_monitor=image->progress_monitor;
201   image->progress_monitor=progress_monitor;
202   image->client_data=client_data;
203   return(previous_monitor);
204 }
205 
206 /*
207 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
208 %                                                                             %
209 %                                                                             %
210 %                                                                             %
211 %   S e t I m a g e I n f o P r o g r e s s M o n i t o r                     %
212 %                                                                             %
213 %                                                                             %
214 %                                                                             %
215 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
216 %
217 %  SetImageInfoProgressMonitor() sets the image_info progress monitor to the
218 %  specified method and returns the previous progress monitor if any.  The
219 %  progress monitor method looks like this:
220 %
221 %    MagickBooleanType MagickProgressMonitor(const char *text,
222 %      const MagickOffsetType offset,const MagickSizeType extent,
223 %      void *client_data)
224 %
225 %  If the progress monitor returns MagickFalse, the current operation is
226 %  interrupted.
227 %
228 %  The format of the SetImageInfoProgressMonitor method is:
229 %
230 %      MagickProgressMonitor SetImageInfoProgressMonitor(ImageInfo *image_info,
231 %        const MagickProgressMonitor progress_monitor,void *client_data)
232 %
233 %  A description of each parameter follows:
234 %
235 %    o image_info: the image info.
236 %
237 %    o progress_monitor: Specifies a pointer to a method to monitor progress of
238 %      an image operation.
239 %
240 %    o client_data: Specifies a pointer to any client data.
241 %
242 */
SetImageInfoProgressMonitor(ImageInfo * image_info,const MagickProgressMonitor progress_monitor,void * client_data)243 MagickExport MagickProgressMonitor SetImageInfoProgressMonitor(
244   ImageInfo *image_info,const MagickProgressMonitor progress_monitor,
245   void *client_data)
246 {
247   MagickProgressMonitor
248     previous_monitor;
249 
250   previous_monitor=image_info->progress_monitor;
251   image_info->progress_monitor=progress_monitor;
252   image_info->client_data=client_data;
253   return(previous_monitor);
254 }
255