2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13 % Return A Preview For A TrueType or Postscript Font %
20 % Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization %
21 % dedicated to making software imaging solutions freely available. %
23 % You may not use this file except in compliance with the License. You may %
24 % obtain a copy of the License at %
26 % http://www.imagemagick.org/script/license.php %
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. %
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
42 #include "MagickCore/studio.h"
43 #include "MagickCore/blob.h"
44 #include "MagickCore/blob-private.h"
45 #include "MagickCore/draw.h"
46 #include "MagickCore/exception.h"
47 #include "MagickCore/exception-private.h"
48 #include "MagickCore/image.h"
49 #include "MagickCore/image-private.h"
50 #include "MagickCore/list.h"
51 #include "MagickCore/magick.h"
52 #include "MagickCore/memory_.h"
53 #include "MagickCore/quantum-private.h"
54 #include "MagickCore/static.h"
55 #include "MagickCore/string_.h"
56 #include "MagickCore/module.h"
57 #include "MagickCore/type.h"
58 #include "MagickWand/MagickWand.h"
59 #if defined(MAGICKCORE_FREETYPE_DELEGATE)
60 #if defined(MAGICKCORE_HAVE_FT2BUILD_H)
61 # include <ft2build.h>
63 #if defined(FT_FREETYPE_H)
64 # include FT_FREETYPE_H
66 # include <freetype/freetype.h>
71 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
79 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
81 % IsPFA()() returns MagickTrue if the image format type, identified by the
82 % magick string, is PFA.
84 % The format of the IsPFA method is:
86 % MagickBooleanType IsPFA(const unsigned char *magick,const size_t length)
88 % A description of each parameter follows:
90 % o magick: compare image format pattern against these bytes.
92 % o length: Specifies the length of the magick string.
96 static MagickBooleanType IsPFA(const unsigned char *magick,const size_t length)
100 if (LocaleNCompare((char *) magick,"%!PS-AdobeFont",14) == 0)
106 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
114 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
116 % IsTTF()() returns MagickTrue if the image format type, identified by the
117 % magick string, is TTF.
119 % The format of the IsTTF method is:
121 % MagickBooleanType IsTTF(const unsigned char *magick,const size_t length)
123 % A description of each parameter follows:
125 % o magick: compare image format pattern against these bytes.
127 % o length: Specifies the length of the magick string.
131 static MagickBooleanType IsTTF(const unsigned char *magick,const size_t length)
135 if (((int) magick[0] == 0x00) && ((int) magick[1] == 0x01) &&
136 ((int) magick[2] == 0x00) && ((int) magick[3] == 0x00) &&
137 ((int) magick[4] == 0x00))
142 #if defined(MAGICKCORE_FREETYPE_DELEGATE)
144 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
148 % R e a d T T F I m a g e %
152 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
154 % ReadTTFImage() reads a TrueType font file and returns it. It
155 % allocates the memory necessary for the new Image structure and returns a
156 % pointer to the new image.
158 % The format of the ReadTTFImage method is:
160 % Image *ReadTTFImage(const ImageInfo *image_info,ExceptionInfo *exception)
162 % A description of each parameter follows:
164 % o image_info: the image info.
166 % o exception: return any errors or warnings in this structure.
169 static Image *ReadTTFImage(const ImageInfo *image_info,ExceptionInfo *exception)
172 buffer[MaxTextExtent],
177 "abcdefghijklmnopqrstuvwxyz\n"
178 "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n"
179 "0123456789.:,;(*!?}^)#${%^&-+@\n";
209 assert(image_info != (const ImageInfo *) NULL);
210 assert(image_info->signature == MagickSignature);
211 if (image_info->debug != MagickFalse)
212 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
213 image_info->filename);
214 assert(exception != (ExceptionInfo *) NULL);
215 assert(exception->signature == MagickSignature);
216 image=AcquireImage(image_info,exception);
219 type_info=GetTypeInfo(image_info->filename,exception);
220 if ((type_info != (const TypeInfo *) NULL) &&
221 (type_info->glyphs != (char *) NULL))
222 (void) CopyMagickString(image->filename,type_info->glyphs,MaxTextExtent);
223 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
224 if (status == MagickFalse)
226 image=DestroyImageList(image);
227 return((Image *) NULL);
230 Color canvas with background color
232 background_color=image_info->background_color;
233 for (y=0; y < (ssize_t) image->rows; y++)
235 q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
236 if (q == (Quantum *) NULL)
238 for (x=0; x < (ssize_t) image->columns; x++)
240 SetPixelPixelInfo(image,&background_color,q);
241 q+=GetPixelChannels(image);
243 if (SyncAuthenticPixels(image,exception) == MagickFalse)
246 (void) CopyMagickString(image->magick,image_info->magick,MaxTextExtent);
247 (void) CopyMagickString(image->filename,image_info->filename,MaxTextExtent);
249 Prepare drawing commands
252 draw_info=CloneDrawInfo(image_info,(DrawInfo *) NULL);
253 draw_info->font=AcquireString(image->filename);
254 ConcatenateString(&draw_info->primitive,"push graphic-context\n");
255 (void) FormatLocaleString(buffer,MaxTextExtent," viewbox 0 0 %.20g %.20g\n",
256 (double) image->columns,(double) image->rows);
257 ConcatenateString(&draw_info->primitive,buffer);
258 ConcatenateString(&draw_info->primitive," font-size 18\n");
259 (void) FormatLocaleString(buffer,MaxTextExtent," text 10,%.20g '",(double) y);
260 ConcatenateString(&draw_info->primitive,buffer);
261 text=EscapeString(Text,'"');
262 ConcatenateString(&draw_info->primitive,text);
263 text=DestroyString(text);
264 (void) FormatLocaleString(buffer,MaxTextExtent,"'\n");
265 ConcatenateString(&draw_info->primitive,buffer);
266 y+=20*(ssize_t) MultilineCensus((char *) Text)+20;
267 for (i=12; i <= 72; i+=6)
270 ConcatenateString(&draw_info->primitive," font-size 18\n");
271 (void) FormatLocaleString(buffer,MaxTextExtent," text 10,%.20g '%.20g'\n",
272 (double) y,(double) i);
273 ConcatenateString(&draw_info->primitive,buffer);
274 (void) FormatLocaleString(buffer,MaxTextExtent," font-size %.20g\n",
276 ConcatenateString(&draw_info->primitive,buffer);
277 (void) FormatLocaleString(buffer,MaxTextExtent," text 50,%.20g "
278 "'That which does not destroy me, only makes me stronger.'\n",(double) y);
279 ConcatenateString(&draw_info->primitive,buffer);
283 ConcatenateString(&draw_info->primitive,"pop graphic-context");
284 (void) DrawImage(image,draw_info,exception);
286 Relinquish resources.
288 draw_info=DestroyDrawInfo(draw_info);
289 (void) CloseBlob(image);
290 return(GetFirstImageInList(image));
292 #endif /* MAGICKCORE_FREETYPE_DELEGATE */
295 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
299 % R e g i s t e r T T F I m a g e %
303 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
305 % RegisterTTFImage() adds attributes for the TTF image format to
306 % the list of supported formats. The attributes include the image format
307 % tag, a method to read and/or write the format, whether the format
308 % supports the saving of more than one frame to the same file or blob,
309 % whether the format supports native in-memory I/O, and a brief
310 % description of the format.
312 % The format of the RegisterTTFImage method is:
314 % size_t RegisterTTFImage(void)
317 ModuleExport size_t RegisterTTFImage(void)
320 version[MaxTextExtent];
326 #if defined(FREETYPE_MAJOR) && defined(FREETYPE_MINOR) && defined(FREETYPE_PATCH)
327 (void) FormatLocaleString(version,MaxTextExtent,"Freetype %d.%d.%d",
328 FREETYPE_MAJOR,FREETYPE_MINOR,FREETYPE_PATCH);
330 entry=SetMagickInfo("DFONT");
331 #if defined(MAGICKCORE_FREETYPE_DELEGATE)
332 entry->decoder=(DecodeImageHandler *) ReadTTFImage;
334 entry->magick=(IsImageFormatHandler *) IsTTF;
335 entry->adjoin=MagickFalse;
336 entry->description=ConstantString("Multi-face font package");
337 if (*version != '\0')
338 entry->version=ConstantString(version);
339 entry->module=ConstantString("TTF");
340 (void) RegisterMagickInfo(entry);
341 entry=SetMagickInfo("PFA");
342 #if defined(MAGICKCORE_FREETYPE_DELEGATE)
343 entry->decoder=(DecodeImageHandler *) ReadTTFImage;
345 entry->magick=(IsImageFormatHandler *) IsPFA;
346 entry->adjoin=MagickFalse;
347 entry->description=ConstantString("Postscript Type 1 font (ASCII)");
348 if (*version != '\0')
349 entry->version=ConstantString(version);
350 entry->module=ConstantString("TTF");
351 (void) RegisterMagickInfo(entry);
352 entry=SetMagickInfo("PFB");
353 #if defined(MAGICKCORE_FREETYPE_DELEGATE)
354 entry->decoder=(DecodeImageHandler *) ReadTTFImage;
356 entry->magick=(IsImageFormatHandler *) IsPFA;
357 entry->adjoin=MagickFalse;
358 entry->description=ConstantString("Postscript Type 1 font (binary)");
359 if (*version != '\0')
360 entry->version=ConstantString(version);
361 entry->module=ConstantString("TTF");
362 (void) RegisterMagickInfo(entry);
363 entry=SetMagickInfo("OTF");
364 #if defined(MAGICKCORE_FREETYPE_DELEGATE)
365 entry->decoder=(DecodeImageHandler *) ReadTTFImage;
367 entry->magick=(IsImageFormatHandler *) IsTTF;
368 entry->adjoin=MagickFalse;
369 entry->description=ConstantString("Open Type font");
370 if (*version != '\0')
371 entry->version=ConstantString(version);
372 entry->module=ConstantString("TTF");
373 (void) RegisterMagickInfo(entry);
374 entry=SetMagickInfo("TTC");
375 #if defined(MAGICKCORE_FREETYPE_DELEGATE)
376 entry->decoder=(DecodeImageHandler *) ReadTTFImage;
378 entry->magick=(IsImageFormatHandler *) IsTTF;
379 entry->adjoin=MagickFalse;
380 entry->description=ConstantString("TrueType font collection");
381 if (*version != '\0')
382 entry->version=ConstantString(version);
383 entry->module=ConstantString("TTF");
384 (void) RegisterMagickInfo(entry);
385 entry=SetMagickInfo("TTF");
386 #if defined(MAGICKCORE_FREETYPE_DELEGATE)
387 entry->decoder=(DecodeImageHandler *) ReadTTFImage;
389 entry->magick=(IsImageFormatHandler *) IsTTF;
390 entry->adjoin=MagickFalse;
391 entry->description=ConstantString("TrueType font");
392 if (*version != '\0')
393 entry->version=ConstantString(version);
394 entry->module=ConstantString("TTF");
395 (void) RegisterMagickInfo(entry);
396 return(MagickImageCoderSignature);
400 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
404 % U n r e g i s t e r T T F I m a g e %
408 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
410 % UnregisterTTFImage() removes format registrations made by the
411 % TTF module from the list of supported formats.
413 % The format of the UnregisterTTFImage method is:
415 % UnregisterTTFImage(void)
418 ModuleExport void UnregisterTTFImage(void)
420 (void) UnregisterMagickInfo("TTF");
421 (void) UnregisterMagickInfo("TTC");
422 (void) UnregisterMagickInfo("OTF");
423 (void) UnregisterMagickInfo("PFA");
424 (void) UnregisterMagickInfo("PFB");
425 (void) UnregisterMagickInfo("PFA");
426 (void) UnregisterMagickInfo("DFONT");