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",
180 *Phrase = (char *) "The quick onyx goblin jumps over the lazy dwarf!";
181 /* NOTE: These are Pangrams, which contain every letter in English
182 See http://www.artlebedev.ru/kovodstvo/sections/33/
184 "A quick brown fox jumps over the lazy dog.";
185 "Pack my box with five dozen liquor jugs.";
186 "The five boxing wizards jump quickly!";
187 "Grumpy wizards make toxic brew for the evil Queen and Jack.";
189 IMv6 used this well known phrase, but it is not a pangram!
190 "That which does not destroy me, only makes me stronger.";
221 assert(image_info != (const ImageInfo *) NULL);
222 assert(image_info->signature == MagickSignature);
223 if (image_info->debug != MagickFalse)
224 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
225 image_info->filename);
226 assert(exception != (ExceptionInfo *) NULL);
227 assert(exception->signature == MagickSignature);
228 image=AcquireImage(image_info,exception);
231 type_info=GetTypeInfo(image_info->filename,exception);
232 if ((type_info != (const TypeInfo *) NULL) &&
233 (type_info->glyphs != (char *) NULL))
234 (void) CopyMagickString(image->filename,type_info->glyphs,MaxTextExtent);
235 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
236 if (status == MagickFalse)
238 image=DestroyImageList(image);
239 return((Image *) NULL);
242 Color canvas with background color
244 background_color=image_info->background_color;
245 for (y=0; y < (ssize_t) image->rows; y++)
247 q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
248 if (q == (Quantum *) NULL)
250 for (x=0; x < (ssize_t) image->columns; x++)
252 SetPixelPixelInfo(image,&background_color,q);
253 q+=GetPixelChannels(image);
255 if (SyncAuthenticPixels(image,exception) == MagickFalse)
258 (void) CopyMagickString(image->magick,image_info->magick,MaxTextExtent);
259 (void) CopyMagickString(image->filename,image_info->filename,MaxTextExtent);
261 Prepare drawing commands
264 draw_info=CloneDrawInfo(image_info,(DrawInfo *) NULL);
265 draw_info->font=AcquireString(image->filename);
266 ConcatenateString(&draw_info->primitive,"push graphic-context\n");
267 (void) FormatLocaleString(buffer,MaxTextExtent," viewbox 0 0 %.20g %.20g\n",
268 (double) image->columns,(double) image->rows);
269 ConcatenateString(&draw_info->primitive,buffer);
270 ConcatenateString(&draw_info->primitive," font-size 18\n");
271 (void) FormatLocaleString(buffer,MaxTextExtent," text 10,%.20g '",(double) y);
272 ConcatenateString(&draw_info->primitive,buffer);
273 text=EscapeString(Text,'"');
274 ConcatenateString(&draw_info->primitive,text);
275 text=DestroyString(text);
276 (void) FormatLocaleString(buffer,MaxTextExtent,"'\n");
277 ConcatenateString(&draw_info->primitive,buffer);
278 y+=12*(ssize_t) MultilineCensus((char *) Text);
279 /* FUTURE: A setting to specify the text to use */
282 y += (i>12) ? i : 12; /* line spacing */
283 ConcatenateString(&draw_info->primitive," font-size 12\n");
284 (void) FormatLocaleString(buffer,MaxTextExtent," text 10,%.20g '%.20g'\n",
285 (double) y,(double) i);
286 ConcatenateString(&draw_info->primitive,buffer);
287 (void) FormatLocaleString(buffer,MaxTextExtent," font-size %.20g\n",
289 ConcatenateString(&draw_info->primitive,buffer);
290 (void) FormatLocaleString(buffer,MaxTextExtent," text 50,%.20g '%s'\n",
292 ConcatenateString(&draw_info->primitive,buffer);
302 ConcatenateString(&draw_info->primitive,"pop graphic-context");
303 (void) DrawImage(image,draw_info,exception);
305 Relinquish resources.
307 draw_info=DestroyDrawInfo(draw_info);
308 (void) CloseBlob(image);
309 return(GetFirstImageInList(image));
311 #endif /* MAGICKCORE_FREETYPE_DELEGATE */
314 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
318 % R e g i s t e r T T F I m a g e %
322 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
324 % RegisterTTFImage() adds attributes for the TTF image format to
325 % the list of supported formats. The attributes include the image format
326 % tag, a method to read and/or write the format, whether the format
327 % supports the saving of more than one frame to the same file or blob,
328 % whether the format supports native in-memory I/O, and a brief
329 % description of the format.
331 % The format of the RegisterTTFImage method is:
333 % size_t RegisterTTFImage(void)
336 ModuleExport size_t RegisterTTFImage(void)
339 version[MaxTextExtent];
345 #if defined(FREETYPE_MAJOR) && defined(FREETYPE_MINOR) && defined(FREETYPE_PATCH)
346 (void) FormatLocaleString(version,MaxTextExtent,"Freetype %d.%d.%d",
347 FREETYPE_MAJOR,FREETYPE_MINOR,FREETYPE_PATCH);
349 entry=SetMagickInfo("DFONT");
350 #if defined(MAGICKCORE_FREETYPE_DELEGATE)
351 entry->decoder=(DecodeImageHandler *) ReadTTFImage;
353 entry->magick=(IsImageFormatHandler *) IsTTF;
354 entry->adjoin=MagickFalse;
355 entry->description=ConstantString("Multi-face font package");
356 if (*version != '\0')
357 entry->version=ConstantString(version);
358 entry->module=ConstantString("TTF");
359 (void) RegisterMagickInfo(entry);
360 entry=SetMagickInfo("PFA");
361 #if defined(MAGICKCORE_FREETYPE_DELEGATE)
362 entry->decoder=(DecodeImageHandler *) ReadTTFImage;
364 entry->magick=(IsImageFormatHandler *) IsPFA;
365 entry->adjoin=MagickFalse;
366 entry->description=ConstantString("Postscript Type 1 font (ASCII)");
367 if (*version != '\0')
368 entry->version=ConstantString(version);
369 entry->module=ConstantString("TTF");
370 (void) RegisterMagickInfo(entry);
371 entry=SetMagickInfo("PFB");
372 #if defined(MAGICKCORE_FREETYPE_DELEGATE)
373 entry->decoder=(DecodeImageHandler *) ReadTTFImage;
375 entry->magick=(IsImageFormatHandler *) IsPFA;
376 entry->adjoin=MagickFalse;
377 entry->description=ConstantString("Postscript Type 1 font (binary)");
378 if (*version != '\0')
379 entry->version=ConstantString(version);
380 entry->module=ConstantString("TTF");
381 (void) RegisterMagickInfo(entry);
382 entry=SetMagickInfo("OTF");
383 #if defined(MAGICKCORE_FREETYPE_DELEGATE)
384 entry->decoder=(DecodeImageHandler *) ReadTTFImage;
386 entry->magick=(IsImageFormatHandler *) IsTTF;
387 entry->adjoin=MagickFalse;
388 entry->description=ConstantString("Open Type font");
389 if (*version != '\0')
390 entry->version=ConstantString(version);
391 entry->module=ConstantString("TTF");
392 (void) RegisterMagickInfo(entry);
393 entry=SetMagickInfo("TTC");
394 #if defined(MAGICKCORE_FREETYPE_DELEGATE)
395 entry->decoder=(DecodeImageHandler *) ReadTTFImage;
397 entry->magick=(IsImageFormatHandler *) IsTTF;
398 entry->adjoin=MagickFalse;
399 entry->description=ConstantString("TrueType font collection");
400 if (*version != '\0')
401 entry->version=ConstantString(version);
402 entry->module=ConstantString("TTF");
403 (void) RegisterMagickInfo(entry);
404 entry=SetMagickInfo("TTF");
405 #if defined(MAGICKCORE_FREETYPE_DELEGATE)
406 entry->decoder=(DecodeImageHandler *) ReadTTFImage;
408 entry->magick=(IsImageFormatHandler *) IsTTF;
409 entry->adjoin=MagickFalse;
410 entry->description=ConstantString("TrueType font");
411 if (*version != '\0')
412 entry->version=ConstantString(version);
413 entry->module=ConstantString("TTF");
414 (void) RegisterMagickInfo(entry);
415 return(MagickImageCoderSignature);
419 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
423 % U n r e g i s t e r T T F I m a g e %
427 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
429 % UnregisterTTFImage() removes format registrations made by the
430 % TTF module from the list of supported formats.
432 % The format of the UnregisterTTFImage method is:
434 % UnregisterTTFImage(void)
437 ModuleExport void UnregisterTTFImage(void)
439 (void) UnregisterMagickInfo("TTF");
440 (void) UnregisterMagickInfo("TTC");
441 (void) UnregisterMagickInfo("OTF");
442 (void) UnregisterMagickInfo("PFA");
443 (void) UnregisterMagickInfo("PFB");
444 (void) UnregisterMagickInfo("PFA");
445 (void) UnregisterMagickInfo("DFONT");