]> granicus.if.org Git - imagemagick/blob - coders/wmf.c
(no commit message)
[imagemagick] / coders / wmf.c
1 /*
2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 %                                                                             %
4 %                                                                             %
5 %                                                                             %
6 %                             W   W   M   M  FFFFF                            %
7 %                             W   W   MM MM  F                                %
8 %                             W W W   M M M  FFF                              %
9 %                             WW WW   M   M  F                                %
10 %                             W   W   M   M  F                                %
11 %                                                                             %
12 %                                                                             %
13 %                        Read Windows Metafile Format                         %
14 %                                                                             %
15 %                              Software Design                                %
16 %                                John Cristy                                  %
17 %                               December 2000                                 %
18 %                                                                             %
19 %                                                                             %
20 %  Copyright 1999-2011 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 \f
37 /*
38   Include declarations.
39 */
40 #include "MagickCore/studio.h"
41 #include "MagickCore/property.h"
42 #include "MagickCore/blob.h"
43 #include "MagickCore/blob-private.h"
44 #include "MagickCore/color.h"
45 #include "MagickCore/color-private.h"
46 #include "MagickCore/constitute.h"
47 #include "MagickCore/exception.h"
48 #include "MagickCore/exception-private.h"
49 #include "MagickCore/image.h"
50 #include "MagickCore/image-private.h"
51 #include "MagickCore/list.h"
52 #include "MagickCore/log.h"
53 #include "MagickCore/magick.h"
54 #include "MagickCore/memory_.h"
55 #include "MagickCore/monitor.h"
56 #include "MagickCore/monitor-private.h"
57 #include "MagickCore/paint.h"
58 #include "MagickCore/quantum-private.h"
59 #include "MagickCore/static.h"
60 #include "MagickCore/string_.h"
61 #include "MagickCore/module.h"
62 #include "MagickCore/type.h"
63 #include "MagickCore/module.h"
64 #include "MagickWand/MagickWand.h"
65
66 #if defined(MAGICKCORE_WMF_DELEGATE)
67 #include "libwmf/api.h"
68 #include "libwmf/eps.h"
69 \f
70 /*
71 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
72 %                                                                             %
73 %                                                                             %
74 %                                                                             %
75 %   R e a d W M F I m a g e                                                   %
76 %                                                                             %
77 %                                                                             %
78 %                                                                             %
79 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
80 %
81 %  ReadWMFImage() reads an Windows Metafile image file and returns it.  It
82 %  allocates the memory necessary for the new Image structure and returns a
83 %  pointer to the new image.
84 %
85 %  The format of the ReadWMFImage method is:
86 %
87 %      Image *ReadWMFImage(const ImageInfo *image_info,ExceptionInfo *exception)
88 %
89 %  A description of each parameter follows:
90 %
91 %    o image_info: the image info.
92 %
93 %    o exception: return any errors or warnings in this structure.
94 %
95 */
96
97 static int WMFReadBlob(void *image)
98 {
99   return(ReadBlobByte((Image *) image));
100 }
101
102 static int WMFSeekBlob(void *image,long offset)
103 {
104   return((int) SeekBlob((Image *) image,(MagickOffsetType) offset,SEEK_SET));
105 }
106
107 static long WMFTellBlob(void *image)
108 {
109   return((long) TellBlob((Image*) image));
110 }
111
112 static Image *ReadWMFImage(const ImageInfo *image_info,ExceptionInfo *exception)
113 {
114   char
115     filename[MaxTextExtent];
116
117   int
118     unique_file;
119
120   FILE
121     *file;
122
123   Image
124     *image;
125
126   ImageInfo
127     *read_info;
128
129   MagickBooleanType
130     status;
131
132   size_t
133     flags;
134
135   wmfAPI
136     *wmf_info;
137
138   wmfAPI_Options
139     options;
140
141   wmfD_Rect
142     bounding_box;
143
144   wmf_eps_t
145     *eps_info;
146
147   wmf_error_t
148     wmf_status;
149
150   /*
151     Read WMF image.
152   */
153   image=AcquireImage(image_info,exception);
154   status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
155   if (status == MagickFalse)
156     {
157       image=DestroyImageList(image);
158       return((Image *) NULL);
159     }
160   wmf_info=(wmfAPI *) NULL;
161   flags=0;
162   flags|=WMF_OPT_IGNORE_NONFATAL;
163   flags|=WMF_OPT_FUNCTION;
164   options.function=wmf_eps_function;
165   wmf_status=wmf_api_create(&wmf_info,(unsigned long) flags,&options);
166   if (wmf_status != wmf_E_None)
167     {
168       if (wmf_info != (wmfAPI *) NULL)
169         wmf_api_destroy(wmf_info);
170       ThrowReaderException(DelegateError,"UnableToInitializeWMFLibrary");
171     }
172   wmf_status=wmf_bbuf_input(wmf_info,WMFReadBlob,WMFSeekBlob,WMFTellBlob,
173     (void *) image);
174   if (wmf_status != wmf_E_None)
175     {
176       wmf_api_destroy(wmf_info);
177       ThrowFileException(exception,FileOpenError,"UnableToOpenFile",
178         image->filename);
179       image=DestroyImageList(image);
180       return((Image *) NULL);
181     }
182   wmf_status=wmf_scan(wmf_info,0,&bounding_box);
183   if (wmf_status != wmf_E_None)
184     {
185       wmf_api_destroy(wmf_info);
186       ThrowReaderException(DelegateError,"FailedToScanFile");
187     }
188   eps_info=WMF_EPS_GetData(wmf_info);
189   file=(FILE *) NULL;
190   unique_file=AcquireUniqueFileResource(filename);
191   if (unique_file != -1)
192     file=fdopen(unique_file,"wb");
193   if ((unique_file == -1) || (file == (FILE *) NULL))
194     {
195       wmf_api_destroy(wmf_info);
196       ThrowReaderException(FileOpenError,"UnableToCreateTemporaryFile");
197     }
198   eps_info->out=wmf_stream_create(wmf_info,file);
199   eps_info->bbox=bounding_box;
200   wmf_status=wmf_play(wmf_info,0,&bounding_box);
201   if (wmf_status != wmf_E_None)
202     {
203       wmf_api_destroy(wmf_info);
204       ThrowReaderException(DelegateError,"FailedToRenderFile");
205     }
206   (void) fclose(file);
207   wmf_api_destroy(wmf_info);
208   (void) CloseBlob(image);
209   image=DestroyImage(image);
210   /*
211     Read EPS image.
212   */
213   read_info=CloneImageInfo(image_info);
214   SetImageInfoBlob(read_info,(void *) NULL,0);
215   (void) FormatLocaleString(read_info->filename,MaxTextExtent,"eps:%s",
216     filename);
217   image=ReadImage(read_info,exception);
218   read_info=DestroyImageInfo(read_info);
219   if (image != (Image *) NULL)
220     {
221       (void) CopyMagickString(image->filename,image_info->filename,
222         MaxTextExtent);
223       (void) CopyMagickString(image->magick_filename,image_info->filename,
224         MaxTextExtent);
225       (void) CopyMagickString(image->magick,"WMF",MaxTextExtent);
226     }
227   (void) RelinquishUniqueFileResource(filename);
228   return(GetFirstImageInList(image));
229 }
230 #endif
231 \f
232 /*
233 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
234 %                                                                             %
235 %                                                                             %
236 %                                                                             %
237 %   R e g i s t e r W M F I m a g e                                           %
238 %                                                                             %
239 %                                                                             %
240 %                                                                             %
241 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
242 %
243 %  RegisterWMFImage() adds attributes for the WMF image format to
244 %  the list of supported formats.  The attributes include the image format
245 %  tag, a method to read and/or write the format, whether the format
246 %  supports the saving of more than one frame to the same file or blob,
247 %  whether the format supports native in-memory I/O, and a brief
248 %  description of the format.
249 %
250 %  The format of the RegisterWMFImage method is:
251 %
252 %      size_t RegisterWMFImage(void)
253 %
254 */
255 ModuleExport size_t RegisterWMFImage(void)
256 {
257   MagickInfo
258     *entry;
259
260   entry = SetMagickInfo("WMZ");
261 #if defined(MAGICKCORE_WMF_DELEGATE)
262   entry->decoder=ReadWMFImage;
263 #endif
264   entry->description=ConstantString("Compressed Windows Meta File");
265   entry->module=ConstantString("WMZ");
266   entry->seekable_stream=MagickTrue;
267   (void) RegisterMagickInfo(entry);
268   entry=SetMagickInfo("WMF");
269 #if defined(MAGICKCORE_WMF_DELEGATE)
270   entry->decoder=ReadWMFImage;
271 #endif
272   entry->description=ConstantString("Windows Meta File");
273   entry->module=ConstantString("WMF");
274   (void) RegisterMagickInfo(entry);
275   return(MagickImageCoderSignature);
276 }
277 \f
278 /*
279 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
280 %                                                                             %
281 %                                                                             %
282 %                                                                             %
283 %   U n r e g i s t e r W M F I m a g e                                       %
284 %                                                                             %
285 %                                                                             %
286 %                                                                             %
287 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
288 %
289 %  UnregisterWMFImage() removes format registrations made by the
290 %  WMF module from the list of supported formats.
291 %
292 %  The format of the UnregisterWMFImage method is:
293 %
294 %      UnregisterWMFImage(void)
295 %
296 */
297 ModuleExport void UnregisterWMFImage(void)
298 {
299   (void) UnregisterMagickInfo("WMZ");
300   (void) UnregisterMagickInfo("WMF");
301 }