diff --git a/coders/ttf.c b/coders/ttf.c
new file mode 100644
index 0000000..85ddb4c
--- /dev/null
+++ b/coders/ttf.c
@@ -0,0 +1,422 @@
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% TTTTT TTTTT FFFFF %
+% T T F %
+% T T FFF %
+% T T F %
+% T T F %
+% %
+% %
+% Return A Preview For A TrueType or Postscript Font %
+% %
+% Software Design %
+% John Cristy %
+% July 1992 %
+% %
+% %
+% Copyright 1999-2009 ImageMagick Studio LLC, a non-profit organization %
+% dedicated to making software imaging solutions freely available. %
+% %
+% You may not use this file except in compliance with the License. You may %
+% obtain a copy of the License at %
+% %
+% http://www.imagemagick.org/script/license.php %
+% %
+% Unless required by applicable law or agreed to in writing, software %
+% distributed under the License is distributed on an "AS IS" BASIS, %
+% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
+% See the License for the specific language governing permissions and %
+% limitations under the License. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+*/
+
+/*
+ Include declarations.
+*/
+#include "magick/studio.h"
+#include "magick/blob.h"
+#include "magick/blob-private.h"
+#include "magick/draw.h"
+#include "magick/exception.h"
+#include "magick/exception-private.h"
+#include "magick/image.h"
+#include "magick/image-private.h"
+#include "magick/list.h"
+#include "magick/magick.h"
+#include "magick/memory_.h"
+#include "magick/quantum-private.h"
+#include "magick/static.h"
+#include "magick/string_.h"
+#include "magick/module.h"
+#include "magick/type.h"
+#include "wand/MagickWand.h"
+#if defined(MAGICKCORE_FREETYPE_DELEGATE)
+#if defined(MAGICKCORE_HAVE_FT2BUILD_H)
+# include <ft2build.h>
+#endif
+#if defined(FT_FREETYPE_H)
+# include FT_FREETYPE_H
+#else
+# include <freetype/freetype.h>
+#endif
+#endif
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% I s P F A %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% IsPFA()() returns MagickTrue if the image format type, identified by the
+% magick string, is PFA.
+%
+% The format of the IsPFA method is:
+%
+% MagickBooleanType IsPFA(const unsigned char *magick,const size_t length)
+%
+% A description of each parameter follows:
+%
+% o magick: compare image format pattern against these bytes.
+%
+% o length: Specifies the length of the magick string.
+%
+%
+*/
+static MagickBooleanType IsPFA(const unsigned char *magick,const size_t length)
+{
+ if (length < 14)
+ return(MagickFalse);
+ if (LocaleNCompare((char *) magick,"%!PS-AdobeFont-1.0",14) == 0)
+ return(MagickTrue);
+ return(MagickFalse);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% I s T T F %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% IsTTF()() returns MagickTrue if the image format type, identified by the
+% magick string, is TTF.
+%
+% The format of the IsTTF method is:
+%
+% MagickBooleanType IsTTF(const unsigned char *magick,const size_t length)
+%
+% A description of each parameter follows:
+%
+% o magick: compare image format pattern against these bytes.
+%
+% o length: Specifies the length of the magick string.
+%
+%
+*/
+static MagickBooleanType IsTTF(const unsigned char *magick,const size_t length)
+{
+ if (length < 5)
+ return(MagickFalse);
+ if (((int) magick[0] == 0x00) && ((int) magick[1] == 0x01) &&
+ ((int) magick[2] == 0x00) && ((int) magick[3] == 0x00) &&
+ ((int) magick[4] == 0x0))
+ return(MagickTrue);
+ return(MagickFalse);
+}
+
+#if defined(MAGICKCORE_FREETYPE_DELEGATE)
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% R e a d T T F I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% ReadTTFImage() reads a TrueType font file and returns it. It
+% allocates the memory necessary for the new Image structure and returns a
+% pointer to the new image.
+%
+% The format of the ReadTTFImage method is:
+%
+% Image *ReadTTFImage(const ImageInfo *image_info,ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o image_info: the image info.
+%
+% o exception: return any errors or warnings in this structure.
+%
+*/
+static Image *ReadTTFImage(const ImageInfo *image_info,ExceptionInfo *exception)
+{
+ char
+ buffer[MaxTextExtent],
+ *text;
+
+ const char
+ *Text = (char *)
+ "abcdefghijklmnopqrstuvwxyz\n"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n"
+ "0123456789.:,;(*!?}^)#${%^&-+@\n";
+
+ const TypeInfo
+ *type_info;
+
+ DrawInfo
+ *draw_info;
+
+ Image
+ *image;
+
+ long
+ y;
+
+ MagickBooleanType
+ status;
+
+ PixelPacket
+ background_color;
+
+ register long
+ i,
+ x;
+
+ register PixelPacket
+ *q;
+
+ /*
+ Open image file.
+ */
+ assert(image_info != (const ImageInfo *) NULL);
+ assert(image_info->signature == MagickSignature);
+ if (image_info->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
+ image_info->filename);
+ assert(exception != (ExceptionInfo *) NULL);
+ assert(exception->signature == MagickSignature);
+ image=AcquireImage(image_info);
+ image->columns=800;
+ image->rows=480;
+ type_info=GetTypeInfo(image_info->filename,exception);
+ if ((type_info != (const TypeInfo *) NULL) &&
+ (type_info->glyphs != (char *) NULL))
+ (void) CopyMagickString(image->filename,type_info->glyphs,MaxTextExtent);
+ status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
+ if (status == MagickFalse)
+ {
+ image=DestroyImageList(image);
+ return((Image *) NULL);
+ }
+ /*
+ Color canvas with background color
+ */
+ background_color=image_info->background_color;
+ for (y=0; y < (long) image->rows; y++)
+ {
+ q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
+ if (q == (PixelPacket *) NULL)
+ break;
+ for (x=0; x < (long) image->columns; x++)
+ *q++=background_color;
+ if (SyncAuthenticPixels(image,exception) == MagickFalse)
+ break;
+ }
+ (void) CopyMagickString(image->magick,image_info->magick,MaxTextExtent);
+ (void) CopyMagickString(image->filename,image_info->filename,MaxTextExtent);
+ /*
+ Prepare drawing commands
+ */
+ y=20;
+ draw_info=CloneDrawInfo(image_info,(DrawInfo *) NULL);
+ draw_info->font=AcquireString(image->filename);
+ ConcatenateString(&draw_info->primitive,"push graphic-context\n");
+ (void) FormatMagickString(buffer,MaxTextExtent," viewbox 0 0 %lu %lu\n",
+ image->columns,image->rows);
+ ConcatenateString(&draw_info->primitive,buffer);
+ ConcatenateString(&draw_info->primitive," font-size 18\n");
+ (void) FormatMagickString(buffer,MaxTextExtent," text 10,%ld '",y);
+ ConcatenateString(&draw_info->primitive,buffer);
+ text=EscapeString(Text,'"');
+ ConcatenateString(&draw_info->primitive,text);
+ text=DestroyString(text);
+ (void) FormatMagickString(buffer,MaxTextExtent,"'\n");
+ ConcatenateString(&draw_info->primitive,buffer);
+ y+=20*MultilineCensus((char *) Text)+20;
+ for (i=12; i <= 72; i+=6)
+ {
+ y+=i+12;
+ ConcatenateString(&draw_info->primitive," font-size 18\n");
+ (void) FormatMagickString(buffer,MaxTextExtent," text 10,%ld '%ld'\n",y,i);
+ ConcatenateString(&draw_info->primitive,buffer);
+ (void) FormatMagickString(buffer,MaxTextExtent," font-size %ld\n",i);
+ ConcatenateString(&draw_info->primitive,buffer);
+ (void) FormatMagickString(buffer,MaxTextExtent," text 50,%ld "
+ "'That which does not destroy me, only makes me stronger.'\n",y);
+ ConcatenateString(&draw_info->primitive,buffer);
+ if (i >= 24)
+ i+=6;
+ }
+ ConcatenateString(&draw_info->primitive,"pop graphic-context");
+ (void) DrawImage(image,draw_info);
+ /*
+ Relinquish resources.
+ */
+ draw_info=DestroyDrawInfo(draw_info);
+ (void) CloseBlob(image);
+ return(GetFirstImageInList(image));
+}
+#endif /* MAGICKCORE_FREETYPE_DELEGATE */
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% R e g i s t e r T T F I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% RegisterTTFImage() adds attributes for the TTF image format to
+% the list of supported formats. The attributes include the image format
+% tag, a method to read and/or write the format, whether the format
+% supports the saving of more than one frame to the same file or blob,
+% whether the format supports native in-memory I/O, and a brief
+% description of the format.
+%
+% The format of the RegisterTTFImage method is:
+%
+% unsigned long RegisterTTFImage(void)
+%
+*/
+ModuleExport unsigned long RegisterTTFImage(void)
+{
+ char
+ version[MaxTextExtent];
+
+ MagickInfo
+ *entry;
+
+ *version='\0';
+#if defined(FREETYPE_MAJOR) && defined(FREETYPE_MINOR) && defined(FREETYPE_PATCH)
+ (void) FormatMagickString(version,MaxTextExtent,"Freetype %d.%d.%d",
+ FREETYPE_MAJOR,FREETYPE_MINOR,FREETYPE_PATCH);
+#endif
+ entry=SetMagickInfo("DFONT");
+#if defined(MAGICKCORE_FREETYPE_DELEGATE)
+ entry->decoder=(DecodeImageHandler *) ReadTTFImage;
+#endif
+ entry->magick=(IsImageFormatHandler *) IsTTF;
+ entry->adjoin=MagickFalse;
+ entry->description=ConstantString("Multi-face font package");
+ if (*version != '\0')
+ entry->version=ConstantString(version);
+ entry->module=ConstantString("TTF");
+ (void) RegisterMagickInfo(entry);
+ entry=SetMagickInfo("PFA");
+#if defined(MAGICKCORE_FREETYPE_DELEGATE)
+ entry->decoder=(DecodeImageHandler *) ReadTTFImage;
+#endif
+ entry->magick=(IsImageFormatHandler *) IsPFA;
+ entry->adjoin=MagickFalse;
+ entry->description=ConstantString("Postscript Type 1 font (ASCII)");
+ if (*version != '\0')
+ entry->version=ConstantString(version);
+ entry->module=ConstantString("TTF");
+ (void) RegisterMagickInfo(entry);
+ entry=SetMagickInfo("PFB");
+#if defined(MAGICKCORE_FREETYPE_DELEGATE)
+ entry->decoder=(DecodeImageHandler *) ReadTTFImage;
+#endif
+ entry->magick=(IsImageFormatHandler *) IsPFA;
+ entry->adjoin=MagickFalse;
+ entry->description=ConstantString("Postscript Type 1 font (binary)");
+ if (*version != '\0')
+ entry->version=ConstantString(version);
+ entry->module=ConstantString("TTF");
+ (void) RegisterMagickInfo(entry);
+ entry=SetMagickInfo("OTF");
+#if defined(MAGICKCORE_FREETYPE_DELEGATE)
+ entry->decoder=(DecodeImageHandler *) ReadTTFImage;
+#endif
+ entry->magick=(IsImageFormatHandler *) IsTTF;
+ entry->adjoin=MagickFalse;
+ entry->description=ConstantString("Open Type font");
+ if (*version != '\0')
+ entry->version=ConstantString(version);
+ entry->module=ConstantString("TTF");
+ (void) RegisterMagickInfo(entry);
+ entry=SetMagickInfo("TTC");
+#if defined(MAGICKCORE_FREETYPE_DELEGATE)
+ entry->decoder=(DecodeImageHandler *) ReadTTFImage;
+#endif
+ entry->magick=(IsImageFormatHandler *) IsTTF;
+ entry->adjoin=MagickFalse;
+ entry->description=ConstantString("TrueType font collection");
+ if (*version != '\0')
+ entry->version=ConstantString(version);
+ entry->module=ConstantString("TTF");
+ (void) RegisterMagickInfo(entry);
+ entry=SetMagickInfo("TTF");
+#if defined(MAGICKCORE_FREETYPE_DELEGATE)
+ entry->decoder=(DecodeImageHandler *) ReadTTFImage;
+#endif
+ entry->magick=(IsImageFormatHandler *) IsTTF;
+ entry->adjoin=MagickFalse;
+ entry->description=ConstantString("TrueType font");
+ if (*version != '\0')
+ entry->version=ConstantString(version);
+ entry->module=ConstantString("TTF");
+ (void) RegisterMagickInfo(entry);
+ return(MagickImageCoderSignature);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% U n r e g i s t e r T T F I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% UnregisterTTFImage() removes format registrations made by the
+% TTF module from the list of supported formats.
+%
+% The format of the UnregisterTTFImage method is:
+%
+% UnregisterTTFImage(void)
+%
+*/
+ModuleExport void UnregisterTTFImage(void)
+{
+ (void) UnregisterMagickInfo("TTF");
+ (void) UnregisterMagickInfo("TTC");
+ (void) UnregisterMagickInfo("OTF");
+ (void) UnregisterMagickInfo("PFA");
+ (void) UnregisterMagickInfo("PFB");
+ (void) UnregisterMagickInfo("PFA");
+ (void) UnregisterMagickInfo("DFONT");
+}