13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                            TTTTT  TTTTT  FFFFF                              %
73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                              T      T    F                                  %
83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                              T      T    FFF                                %
93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                              T      T    F                                  %
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                              T      T    F                                  %
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%             Return A Preview For A TrueType or Postscript Font              %
143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                              Software Design                                %
16de984cdc3631106b1cbbb8d3972b76a0fc27e8e8cristy%                                   Cristy                                    %
173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                 July 1992                                   %
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
207ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy%  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization      %
213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  dedicated to making software imaging solutions freely available.           %
223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  You may not use this file except in compliance with the License.  You may  %
243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  obtain a copy of the License at                                            %
253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    http://www.imagemagick.org/script/license.php                            %
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Unless required by applicable law or agreed to in writing, software        %
293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  distributed under the License is distributed on an "AS IS" BASIS,          %
303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  See the License for the specific language governing permissions and        %
323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  limitations under the License.                                             %
333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Include declarations.
413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
424c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h"
434c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob.h"
444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob-private.h"
454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/draw.h"
464c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h"
474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h"
484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image.h"
494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image-private.h"
504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/list.h"
514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/magick.h"
524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h"
534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum-private.h"
544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/static.h"
554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/module.h"
574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/type.h"
584c08aed51c5899665ade97263692328eea4af106cristy#include "MagickWand/MagickWand.h"
593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_FREETYPE_DELEGATE)
6003f187ee83f1927717c93c57af06d5e030a194becristy#include <ft2build.h>
613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(FT_FREETYPE_H)
623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#  include FT_FREETYPE_H
633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#  include <freetype/freetype.h>
653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   I s P F A                                                                 %
743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  IsPFA()() returns MagickTrue if the image format type, identified by the
803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  magick string, is PFA.
813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the IsPFA method is:
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType IsPFA(const unsigned char *magick,const size_t length)
853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o magick: compare image format pattern against these bytes.
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: Specifies the length of the magick string.
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType IsPFA(const unsigned char *magick,const size_t length)
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (length < 14)
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
9897841ba00b8e25ff42d361868e0271ae4f82e9bacristy  if (LocaleNCompare((char *) magick,"%!PS-AdobeFont",14) == 0)
993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickTrue);
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickFalse);
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   I s T T F                                                                 %
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  IsTTF()() returns MagickTrue if the image format type, identified by the
1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  magick string, is TTF.
1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the IsTTF method is:
1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType IsTTF(const unsigned char *magick,const size_t length)
1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o magick: compare image format pattern against these bytes.
1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: Specifies the length of the magick string.
1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType IsTTF(const unsigned char *magick,const size_t length)
1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (length < 5)
1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (((int) magick[0] == 0x00) && ((int) magick[1] == 0x01) &&
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ((int) magick[2] == 0x00) && ((int) magick[3] == 0x00) &&
13594027a3d38c35c0111c672da9dd040eb4bb12dddcristy      ((int) magick[4] == 0x00))
1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickTrue);
1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickFalse);
1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_FREETYPE_DELEGATE)
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e a d T T F I m a g e                                                   %
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ReadTTFImage() reads a TrueType font file and returns it.  It
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  allocates the memory necessary for the new Image structure and returns a
1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  pointer to the new image.
1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ReadTTFImage method is:
1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      Image *ReadTTFImage(const ImageInfo *image_info,ExceptionInfo *exception)
1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadTTFImage(const ImageInfo *image_info,ExceptionInfo *exception)
1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
170151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    buffer[MagickPathExtent],
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *text;
1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *Text = (char *)
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "abcdefghijklmnopqrstuvwxyz\n"
1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n"
177947cb4c68bebf79b15b6f3e824bc973491a77709cristy      "0123456789.:,;(*!?}^)#${%^&-+@\n";
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const TypeInfo
1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *type_info;
1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DrawInfo
1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *draw_info;
1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *image;
1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
191101ab708b0574518ac5715da4d3915400e9df79acristy  PixelInfo
1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    background_color;
1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
194bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1984c08aed51c5899665ade97263692328eea4af106cristy  register Quantum
1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
201c6da28e61bb609d2b2cfdcc7752106c973415edbcristy  ssize_t
202c6da28e61bb609d2b2cfdcc7752106c973415edbcristy    y;
203c6da28e61bb609d2b2cfdcc7752106c973415edbcristy
2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Open image file.
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
208e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_info->signature == MagickCoreSignature);
2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->debug != MagickFalse)
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->filename);
2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
213e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(exception->signature == MagickCoreSignature);
2149950d57e1124b73f684fb5946e206994cefda628cristy  image=AcquireImage(image_info,exception);
2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->columns=800;
2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->rows=480;
2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  type_info=GetTypeInfo(image_info->filename,exception);
2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((type_info != (const TypeInfo *) NULL) &&
2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (type_info->glyphs != (char *) NULL))
220151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) CopyMagickString(image->filename,type_info->glyphs,MagickPathExtent);
2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == MagickFalse)
2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image=DestroyImageList(image);
2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((Image *) NULL);
2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
227acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy  status=SetImageExtent(image,image->columns,image->rows,exception);
228acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy  if (status == MagickFalse)
229acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy    return(DestroyImageList(image));
2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Color canvas with background color
2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  background_color=image_info->background_color;
234bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (y=0; y < (ssize_t) image->rows; y++)
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
2374c08aed51c5899665ade97263692328eea4af106cristy    if (q == (Quantum *) NULL)
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
239bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for (x=0; x < (ssize_t) image->columns; x++)
2404c08aed51c5899665ade97263692328eea4af106cristy    {
24111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      SetPixelViaPixelInfo(image,&background_color,q);
242ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(image);
2434c08aed51c5899665ade97263692328eea4af106cristy    }
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
247151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) CopyMagickString(image->magick,image_info->magick,MagickPathExtent);
248151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) CopyMagickString(image->filename,image_info->filename,MagickPathExtent);
2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Prepare drawing commands
2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y=20;
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  draw_info=CloneDrawInfo(image_info,(DrawInfo *) NULL);
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  draw_info->font=AcquireString(image->filename);
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ConcatenateString(&draw_info->primitive,"push graphic-context\n");
256151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) FormatLocaleString(buffer,MagickPathExtent," viewbox 0 0 %.20g %.20g\n",
257e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy    (double) image->columns,(double) image->rows);
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ConcatenateString(&draw_info->primitive,buffer);
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ConcatenateString(&draw_info->primitive," font-size 18\n");
260151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) FormatLocaleString(buffer,MagickPathExtent," text 10,%.20g '",(double) y);
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ConcatenateString(&draw_info->primitive,buffer);
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  text=EscapeString(Text,'"');
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ConcatenateString(&draw_info->primitive,text);
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  text=DestroyString(text);
265151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) FormatLocaleString(buffer,MagickPathExtent,"'\n");
2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ConcatenateString(&draw_info->primitive,buffer);
267947cb4c68bebf79b15b6f3e824bc973491a77709cristy  y+=20*(ssize_t) MultilineCensus((char *) Text)+20;
268947cb4c68bebf79b15b6f3e824bc973491a77709cristy  for (i=12; i <= 72; i+=6)
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
270947cb4c68bebf79b15b6f3e824bc973491a77709cristy    y+=i+12;
271947cb4c68bebf79b15b6f3e824bc973491a77709cristy    ConcatenateString(&draw_info->primitive," font-size 18\n");
272151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) FormatLocaleString(buffer,MagickPathExtent," text 10,%.20g '%.20g'\n",
273e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy      (double) y,(double) i);
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ConcatenateString(&draw_info->primitive,buffer);
275151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) FormatLocaleString(buffer,MagickPathExtent," font-size %.20g\n",
276e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy      (double) i);
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ConcatenateString(&draw_info->primitive,buffer);
278151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) FormatLocaleString(buffer,MagickPathExtent," text 50,%.20g "
279947cb4c68bebf79b15b6f3e824bc973491a77709cristy      "'That which does not destroy me, only makes me stronger.'\n",(double) y);
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ConcatenateString(&draw_info->primitive,buffer);
281947cb4c68bebf79b15b6f3e824bc973491a77709cristy    if (i >= 24)
282947cb4c68bebf79b15b6f3e824bc973491a77709cristy      i+=6;
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ConcatenateString(&draw_info->primitive,"pop graphic-context");
285018f07f7333b25743d0afff892450cebdb905c1acristy  (void) DrawImage(image,draw_info,exception);
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Relinquish resources.
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  draw_info=DestroyDrawInfo(draw_info);
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CloseBlob(image);
2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(GetFirstImageInList(image));
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif /* MAGICKCORE_FREETYPE_DELEGATE */
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e g i s t e r T T F I m a g e                                           %
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  RegisterTTFImage() adds attributes for the TTF image format to
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the list of supported formats.  The attributes include the image format
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  tag, a method to read and/or write the format, whether the format
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  supports the saving of more than one frame to the same file or blob,
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  whether the format supports native in-memory I/O, and a brief
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  description of the format.
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the RegisterTTFImage method is:
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
315bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t RegisterTTFImage(void)
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
318bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyModuleExport size_t RegisterTTFImage(void)
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
321151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    version[MagickPathExtent];
3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickInfo
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *entry;
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *version='\0';
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(FREETYPE_MAJOR) && defined(FREETYPE_MINOR) && defined(FREETYPE_PATCH)
328151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) FormatLocaleString(version,MagickPathExtent,"Freetype %d.%d.%d",
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    FREETYPE_MAJOR,FREETYPE_MINOR,FREETYPE_PATCH);
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
33106b627a07ff44e1ff93ef1288c9f428066ded10ddirk  entry=AcquireMagickInfo("TTF","DFONT","Multi-face font package");
3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_FREETYPE_DELEGATE)
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->decoder=(DecodeImageHandler *) ReadTTFImage;
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->magick=(IsImageFormatHandler *) IsTTF;
33608e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags^=CoderAdjoinFlag;
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*version != '\0')
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    entry->version=ConstantString(version);
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RegisterMagickInfo(entry);
34006b627a07ff44e1ff93ef1288c9f428066ded10ddirk  entry=AcquireMagickInfo("TTF","PFA","Postscript Type 1 font (ASCII)");
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_FREETYPE_DELEGATE)
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->decoder=(DecodeImageHandler *) ReadTTFImage;
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->magick=(IsImageFormatHandler *) IsPFA;
34508e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags^=CoderAdjoinFlag;
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*version != '\0')
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    entry->version=ConstantString(version);
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RegisterMagickInfo(entry);
34906b627a07ff44e1ff93ef1288c9f428066ded10ddirk  entry=AcquireMagickInfo("TTF","PFB","Postscript Type 1 font (binary)");
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_FREETYPE_DELEGATE)
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->decoder=(DecodeImageHandler *) ReadTTFImage;
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->magick=(IsImageFormatHandler *) IsPFA;
35408e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags^=CoderAdjoinFlag;
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*version != '\0')
3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    entry->version=ConstantString(version);
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RegisterMagickInfo(entry);
35806b627a07ff44e1ff93ef1288c9f428066ded10ddirk  entry=AcquireMagickInfo("TTF","OTF","Open Type font");
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_FREETYPE_DELEGATE)
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->decoder=(DecodeImageHandler *) ReadTTFImage;
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->magick=(IsImageFormatHandler *) IsTTF;
36308e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags^=CoderAdjoinFlag;
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*version != '\0')
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    entry->version=ConstantString(version);
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RegisterMagickInfo(entry);
36706b627a07ff44e1ff93ef1288c9f428066ded10ddirk  entry=AcquireMagickInfo("TTF","TTC","TrueType font collection");
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_FREETYPE_DELEGATE)
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->decoder=(DecodeImageHandler *) ReadTTFImage;
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->magick=(IsImageFormatHandler *) IsTTF;
37208e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags^=CoderAdjoinFlag;
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*version != '\0')
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    entry->version=ConstantString(version);
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RegisterMagickInfo(entry);
37606b627a07ff44e1ff93ef1288c9f428066ded10ddirk  entry=AcquireMagickInfo("TTF","TTF","TrueType font");
3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_FREETYPE_DELEGATE)
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->decoder=(DecodeImageHandler *) ReadTTFImage;
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->magick=(IsImageFormatHandler *) IsTTF;
38108e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags^=CoderAdjoinFlag;
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*version != '\0')
3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    entry->version=ConstantString(version);
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RegisterMagickInfo(entry);
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickImageCoderSignature);
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   U n r e g i s t e r T T F I m a g e                                       %
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  UnregisterTTFImage() removes format registrations made by the
4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  TTF module from the list of supported formats.
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the UnregisterTTFImage method is:
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      UnregisterTTFImage(void)
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport void UnregisterTTFImage(void)
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("TTF");
4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("TTC");
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("OTF");
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("PFA");
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("PFB");
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("PFA");
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("DFONT");
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
417