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