html.c revision b51dff5c0d16a4c1b69ff683e786cb3b4c467694
15d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com/*
25d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com%                                                                             %
45d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com%                                                                             %
55d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com%                                                                             %
65d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com%                        H   H  TTTTT  M   M  L                               %
75d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com%                        H   H    T    MM MM  L                               %
833e0cb5e7f9926b96db209c825f1eeca7c15bb16cblume%                        HHHHH    T    M M M  L                               %
933e0cb5e7f9926b96db209c825f1eeca7c15bb16cblume%                        H   H    T    M   M  L                               %
1033e0cb5e7f9926b96db209c825f1eeca7c15bb16cblume%                        H   H    T    M   M  LLLLL                           %
1133e0cb5e7f9926b96db209c825f1eeca7c15bb16cblume%                                                                             %
12c5035e70cc3fb290f95fd1c052c637aa0dbaf9earobertphillips%                                                                             %
137ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel%                  Write A Client-Side Image Map Using                        %
1413dddce65fd87a8175a209a49f35615735a2886aBrian Osman%                 Image Montage & Directory Information.                      %
157e910df7f133e80293117bdd069ed25998d10f8cStan Iliev%                                                                             %
163b66ab6f9fdc6eacdf0ee1921da28751de30c018Brian Osman%                              Software Design                                %
17856e9d921462136da8562f8f122d42e114cd4710reed%                                John Cristy                                  %
1897b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com%                                 July 1992                                   %
19e2f7d1899d890c2f08571e1bd6c7fa2c5ea1be0bRobert Phillips%                                                                             %
202c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osman%                                                                             %
213b66ab6f9fdc6eacdf0ee1921da28751de30c018Brian Osman%  Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization      %
221105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman%  dedicated to making software imaging solutions freely available.           %
2332342f032e1dfd133040324f851f0365f9d4cb51Brian Osman%                                                                             %
24fe3b51636d4216c4ea6cb74ed0964c1d315ca487Brian Osman%  You may not use this file except in compliance with the License.  You may  %
25914a36b248ffb538874483d86759254838866dd7Eric Karl%  obtain a copy of the License at                                            %
26e8e54580c3c91fd485187af040af118aa5153261Brian Osman%                                                                             %
27646e4293f06d9de6d44dbfa3c32cdc15a6f5906eRobert Phillips%    http://www.imagemagick.org/script/license.php                            %
28914a36b248ffb538874483d86759254838866dd7Eric Karl%                                                                             %
29bc7a4fb06780f9829b4b21470fe6f0503d2297cdRobert Phillips%  Unless required by applicable law or agreed to in writing, software        %
3063954c9944a5eed4527e0ed368f4e501faf2c625Brian Osman%  distributed under the License is distributed on an "AS IS" BASIS,          %
31f267c1efe7de7a8e71404afde6cbf93c3808d267bsalomon%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
32993a4216a6014b9de8f4d8120360c94550dc6761bsalomon%  See the License for the specific language governing permissions and        %
33262a71b7f95ce98ff3dd8dba845afbd724470903reed%  limitations under the License.                                             %
343b65598bceb65736486db27ed49a56d787032747Brian Osman%                                                                             %
35262a71b7f95ce98ff3dd8dba845afbd724470903reed%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
367992da32f02f90e0ac9ab6914eb31676b502eb71Brian Osman%
37cb6266b5aa5bbfd880532f08eec83b0c585e873fMatt Sarett%
38b4da01d8f719f3c43d492e8f62a7e2c861e9ef27ericrk*/
396f1216ac158e36a3a1cc805e7f899c755c5b98a2reed
4003dd6d5208a6e3d92190e7020300e4399178ae4bMatt Sarett/*
41993a4216a6014b9de8f4d8120360c94550dc6761bsalomon  Include declarations.
42b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips*/
43b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips#include "magick/studio.h"
44b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips#include "magick/blob.h"
45a108c92ae5868ca99759a872edddb377f31ad1beRobert Phillips#include "magick/blob-private.h"
46b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips#include "magick/color-private.h"
47b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips#include "magick/colorspace.h"
48b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips#include "magick/constitute.h"
49b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips#include "magick/exception.h"
50b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips#include "magick/exception-private.h"
51b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips#include "magick/geometry.h"
52c9b5f8b1522e72449d704d30ed6aee4fc6211ee8reed#include "magick/list.h"
53cef04f818820e59fb534eb226f967f72497845d3piotaixr#include "magick/magick.h"
546f1216ac158e36a3a1cc805e7f899c755c5b98a2reed#include "magick/memory_.h"
556f1216ac158e36a3a1cc805e7f899c755c5b98a2reed#include "magick/paint.h"
566f1216ac158e36a3a1cc805e7f899c755c5b98a2reed#include "magick/property.h"
576f1216ac158e36a3a1cc805e7f899c755c5b98a2reed#include "magick/quantum-private.h"
586f1216ac158e36a3a1cc805e7f899c755c5b98a2reed#include "magick/static.h"
596f1216ac158e36a3a1cc805e7f899c755c5b98a2reed#include "magick/string_.h"
60396fcdba14a0101ed43dcc3863585bf50c4ed6ccbrianosman#include "magick/module.h"
61396fcdba14a0101ed43dcc3863585bf50c4ed6ccbrianosman#include "magick/utility.h"
62b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips
63396fcdba14a0101ed43dcc3863585bf50c4ed6ccbrianosman/*
64396fcdba14a0101ed43dcc3863585bf50c4ed6ccbrianosman  Forward declarations.
65b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips*/
66396fcdba14a0101ed43dcc3863585bf50c4ed6ccbrianosmanstatic MagickBooleanType
67396fcdba14a0101ed43dcc3863585bf50c4ed6ccbrianosman  WriteHTMLImage(const ImageInfo *,Image *);
686251771ebc5c4d7c98af3e2f3f2e7b22e490c1d5Brian Osman
696251771ebc5c4d7c98af3e2f3f2e7b22e490c1d5Brian Osman/*
706251771ebc5c4d7c98af3e2f3f2e7b22e490c1d5Brian Osman%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
716251771ebc5c4d7c98af3e2f3f2e7b22e490c1d5Brian Osman%                                                                             %
726251771ebc5c4d7c98af3e2f3f2e7b22e490c1d5Brian Osman%                                                                             %
736251771ebc5c4d7c98af3e2f3f2e7b22e490c1d5Brian Osman%                                                                             %
746251771ebc5c4d7c98af3e2f3f2e7b22e490c1d5Brian Osman%   I s H T M L                                                               %
755fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed%                                                                             %
765fa3d6d4b15fd6417de877561f5e4bca422e383cMike Reed%                                                                             %
776f1216ac158e36a3a1cc805e7f899c755c5b98a2reed%                                                                             %
786f1216ac158e36a3a1cc805e7f899c755c5b98a2reed%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
796f1216ac158e36a3a1cc805e7f899c755c5b98a2reed%
806f1216ac158e36a3a1cc805e7f899c755c5b98a2reed%  IsHTML() returns MagickTrue if the image format type, identified by the
816f1216ac158e36a3a1cc805e7f899c755c5b98a2reed%  magick string, is HTML.
826f1216ac158e36a3a1cc805e7f899c755c5b98a2reed%
837a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed%  The format of the IsHTML method is:
847a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed%
857a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed%      MagickBooleanType IsHTML(const unsigned char *magick,const size_t length)
866251771ebc5c4d7c98af3e2f3f2e7b22e490c1d5Brian Osman%
877a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed%  A description of each parameter follows:
887a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed%
897a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed%    o magick: compare image format pattern against these bytes.
907a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed%
916251771ebc5c4d7c98af3e2f3f2e7b22e490c1d5Brian Osman%    o length: Specifies the length of the magick string.
927a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed%
937a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed*/
94b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillipsstatic MagickBooleanType IsHTML(const unsigned char *magick,const size_t length)
95b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips{
962084ffa9a3fa7eb3c7e17ec5b55750be9942bafcBrian Salomon  if (length < 5)
972084ffa9a3fa7eb3c7e17ec5b55750be9942bafcBrian Salomon    return(MagickFalse);
982084ffa9a3fa7eb3c7e17ec5b55750be9942bafcBrian Salomon  if (LocaleNCompare((char *) magick,"<html",5) == 0)
99b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips    return(MagickTrue);
1008b26b99c97473f020df4b9d4ba789e074e06ceddreed  return(MagickFalse);
1018b26b99c97473f020df4b9d4ba789e074e06ceddreed}
102b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips
1037a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed/*
1048b26b99c97473f020df4b9d4ba789e074e06ceddreed%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1058b26b99c97473f020df4b9d4ba789e074e06ceddreed%                                                                             %
1066f1216ac158e36a3a1cc805e7f899c755c5b98a2reed%                                                                             %
1077a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed%                                                                             %
1087a542c559a6e584107b94e6254ac3c7f9f24b591Mike Reed%   R e g i s t e r H T M L I m a g e                                         %
109095530389d8211895309107a4f74beefacce638creed%                                                                             %
110095530389d8211895309107a4f74beefacce638creed%                                                                             %
1118b26b99c97473f020df4b9d4ba789e074e06ceddreed%                                                                             %
112ace135453db02cfe83d7c7bbeaa679f98d18fbe2reed@google.com%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
113ace135453db02cfe83d7c7bbeaa679f98d18fbe2reed@google.com%
114b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips%  RegisterHTMLImage() adds properties for the HTML image format to
1152bbdcc44c63974f29f3743bb58d929601a3f65c6Brian Salomon%  the list of supported formats.  The properties include the image format
116b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips%  tag, a method to read and/or write the format, whether the format
117b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips%  supports the saving of more than one frame to the same file or blob,
118b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips%  whether the format supports native in-memory I/O, and a brief
11930a38ff737c61799b0f36d2e6ba412f7e612f617Robert Phillips%  description of the format.
120b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips%
121b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips%  The format of the RegisterHTMLImage method is:
122b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips%
123b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips%      size_t RegisterHTMLImage(void)
1247992da32f02f90e0ac9ab6914eb31676b502eb71Brian Osman%
1257992da32f02f90e0ac9ab6914eb31676b502eb71Brian Osman*/
1267992da32f02f90e0ac9ab6914eb31676b502eb71Brian OsmanModuleExport size_t RegisterHTMLImage(void)
127b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips{
1284df0092eac6e9bb5afc516773a0c618630193dc6Brian Salomon  MagickInfo
1294df0092eac6e9bb5afc516773a0c618630193dc6Brian Salomon    *entry;
1304faa0408c1fc414263a3116a76ede20cc52b1d97Greg Daniel
13185d9178832f4a64c9d80ffb14cb9dab4fe0fa54areed  entry=SetMagickInfo("HTM");
13285d9178832f4a64c9d80ffb14cb9dab4fe0fa54areed  entry->encoder=(EncodeImageHandler *) WriteHTMLImage;
1338b26b99c97473f020df4b9d4ba789e074e06ceddreed  entry->magick=(IsImageFormatHandler *) IsHTML;
1348b26b99c97473f020df4b9d4ba789e074e06ceddreed  entry->adjoin=MagickFalse;
1358b26b99c97473f020df4b9d4ba789e074e06ceddreed  entry->description=ConstantString(
1368b26b99c97473f020df4b9d4ba789e074e06ceddreed    "Hypertext Markup Language and a client-side image map");
1378b26b99c97473f020df4b9d4ba789e074e06ceddreed  entry->module=ConstantString("HTML");
1388b26b99c97473f020df4b9d4ba789e074e06ceddreed  (void) RegisterMagickInfo(entry);
1398b26b99c97473f020df4b9d4ba789e074e06ceddreed  entry=SetMagickInfo("HTML");
1408b26b99c97473f020df4b9d4ba789e074e06ceddreed  entry->encoder=(EncodeImageHandler *) WriteHTMLImage;
14197b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com  entry->magick=(IsImageFormatHandler *) IsHTML;
1428b26b99c97473f020df4b9d4ba789e074e06ceddreed  entry->adjoin=MagickFalse;
1438b26b99c97473f020df4b9d4ba789e074e06ceddreed  entry->description=ConstantString(
1448b26b99c97473f020df4b9d4ba789e074e06ceddreed    "Hypertext Markup Language and a client-side image map");
1458b26b99c97473f020df4b9d4ba789e074e06ceddreed  entry->module=ConstantString("HTML");
1468b26b99c97473f020df4b9d4ba789e074e06ceddreed  (void) RegisterMagickInfo(entry);
1478b26b99c97473f020df4b9d4ba789e074e06ceddreed  entry=SetMagickInfo("SHTML");
1488b26b99c97473f020df4b9d4ba789e074e06ceddreed  entry->encoder=(EncodeImageHandler *) WriteHTMLImage;
1498b26b99c97473f020df4b9d4ba789e074e06ceddreed  entry->magick=(IsImageFormatHandler *) IsHTML;
1508b26b99c97473f020df4b9d4ba789e074e06ceddreed  entry->adjoin=MagickFalse;
1515d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com  entry->description=ConstantString(
1524af267b11964d4a8acdb232ac46094c84d890e88reed    "Hypertext Markup Language and a client-side image map");
153fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com  entry->module=ConstantString("HTML");
1540ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips  (void) RegisterMagickInfo(entry);
1550ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips  return(MagickImageCoderSignature);
1567ee385e1dc3cd6a47dc8f7297fef6e175eaba224Robert Phillips}
1570ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips
158eee4d6e4e8cc5c4c79f065abcc3ce609f71238f9Robert Phillips/*
159eee4d6e4e8cc5c4c79f065abcc3ce609f71238f9Robert Phillips%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
160eee4d6e4e8cc5c4c79f065abcc3ce609f71238f9Robert Phillips%                                                                             %
161eee4d6e4e8cc5c4c79f065abcc3ce609f71238f9Robert Phillips%                                                                             %
162eee4d6e4e8cc5c4c79f065abcc3ce609f71238f9Robert Phillips%                                                                             %
163eee4d6e4e8cc5c4c79f065abcc3ce609f71238f9Robert Phillips%   U n r e g i s t e r H T M L I m a g e                                     %
164eee4d6e4e8cc5c4c79f065abcc3ce609f71238f9Robert Phillips%                                                                             %
1650ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips%                                                                             %
1667ee385e1dc3cd6a47dc8f7297fef6e175eaba224Robert Phillips%                                                                             %
1670ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1680ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips%
1697ee385e1dc3cd6a47dc8f7297fef6e175eaba224Robert Phillips%  UnregisterHTMLImage() removes format registrations made by the
1700ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips%  HTML module from the list of supported formats.
171eee4d6e4e8cc5c4c79f065abcc3ce609f71238f9Robert Phillips%
1720ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips%  The format of the UnregisterHTMLImage method is:
1730ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips%
1740ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips%      UnregisterHTMLImage(void)
1750ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips%
1760ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips*/
1770ae6faa34d73ffc7ebec3d13f0473703bade821bRobert PhillipsModuleExport void UnregisterHTMLImage(void)
1780ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips{
1790ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips  (void) UnregisterMagickInfo("HTM");
1800ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips  (void) UnregisterMagickInfo("HTML");
1810ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips  (void) UnregisterMagickInfo("SHTML");
182eee4d6e4e8cc5c4c79f065abcc3ce609f71238f9Robert Phillips}
183eee4d6e4e8cc5c4c79f065abcc3ce609f71238f9Robert Phillips
184eee4d6e4e8cc5c4c79f065abcc3ce609f71238f9Robert Phillips/*
185eee4d6e4e8cc5c4c79f065abcc3ce609f71238f9Robert Phillips%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
186eee4d6e4e8cc5c4c79f065abcc3ce609f71238f9Robert Phillips%                                                                             %
1870ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips%                                                                             %
1880ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips%                                                                             %
18903dd6d5208a6e3d92190e7020300e4399178ae4bMatt Sarett%   W r i t e H T M L I m a g e                                               %
190095530389d8211895309107a4f74beefacce638creed%                                                                             %
19103dd6d5208a6e3d92190e7020300e4399178ae4bMatt Sarett%                                                                             %
192cb6266b5aa5bbfd880532f08eec83b0c585e873fMatt Sarett%                                                                             %
193cb6266b5aa5bbfd880532f08eec83b0c585e873fMatt Sarett%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
194cb6266b5aa5bbfd880532f08eec83b0c585e873fMatt Sarett%
19503dd6d5208a6e3d92190e7020300e4399178ae4bMatt Sarett%  WriteHTMLImage() writes an image in the HTML encoded image format.
19603dd6d5208a6e3d92190e7020300e4399178ae4bMatt Sarett%
19703dd6d5208a6e3d92190e7020300e4399178ae4bMatt Sarett%  The format of the WriteHTMLImage method is:
19803dd6d5208a6e3d92190e7020300e4399178ae4bMatt Sarett%
19903dd6d5208a6e3d92190e7020300e4399178ae4bMatt Sarett%      MagickBooleanType WriteHTMLImage(const ImageInfo *image_info,Image *image)
200b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips%
201b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips%  A description of each parameter follows.
2028b26b99c97473f020df4b9d4ba789e074e06ceddreed%
20303dd6d5208a6e3d92190e7020300e4399178ae4bMatt Sarett%    o image_info: the image info.
2048b26b99c97473f020df4b9d4ba789e074e06ceddreed%
205e78b7259c3d5cbed77b4390150cfb699b0b59cd4Robert Phillips%    o image:  The image.
2068b26b99c97473f020df4b9d4ba789e074e06ceddreed%
207b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips%
208a8ac92418807e3d46a45413459e6895160134c1dBrian Osman*/
209a8ac92418807e3d46a45413459e6895160134c1dBrian Osmanstatic MagickBooleanType WriteHTMLImage(const ImageInfo *image_info,
210a8ac92418807e3d46a45413459e6895160134c1dBrian Osman  Image *image)
211a8ac92418807e3d46a45413459e6895160134c1dBrian Osman{
212a8ac92418807e3d46a45413459e6895160134c1dBrian Osman  char
213a8ac92418807e3d46a45413459e6895160134c1dBrian Osman    basename[MaxTextExtent],
214a8ac92418807e3d46a45413459e6895160134c1dBrian Osman    buffer[MaxTextExtent],
215a8ac92418807e3d46a45413459e6895160134c1dBrian Osman    filename[MaxTextExtent],
216a8ac92418807e3d46a45413459e6895160134c1dBrian Osman    mapname[MaxTextExtent],
217a8ac92418807e3d46a45413459e6895160134c1dBrian Osman    url[MaxTextExtent];
218a8ac92418807e3d46a45413459e6895160134c1dBrian Osman
2192084ffa9a3fa7eb3c7e17ec5b55750be9942bafcBrian Salomon  Image
220a8ac92418807e3d46a45413459e6895160134c1dBrian Osman    *next;
221b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips
222b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips  ImageInfo
223b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips    *write_info;
224b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips
225b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips  MagickBooleanType
2268b26b99c97473f020df4b9d4ba789e074e06ceddreed    status;
2278b26b99c97473f020df4b9d4ba789e074e06ceddreed
228b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips  RectangleInfo
2298b26b99c97473f020df4b9d4ba789e074e06ceddreed    geometry;
2308b26b99c97473f020df4b9d4ba789e074e06ceddreed
2318b26b99c97473f020df4b9d4ba789e074e06ceddreed  register char
2328b26b99c97473f020df4b9d4ba789e074e06ceddreed    *p;
2338b26b99c97473f020df4b9d4ba789e074e06ceddreed
2348b26b99c97473f020df4b9d4ba789e074e06ceddreed  /*
2358b26b99c97473f020df4b9d4ba789e074e06ceddreed    Open image.
2368b26b99c97473f020df4b9d4ba789e074e06ceddreed  */
23703dd6d5208a6e3d92190e7020300e4399178ae4bMatt Sarett  assert(image_info != (const ImageInfo *) NULL);
23803dd6d5208a6e3d92190e7020300e4399178ae4bMatt Sarett  assert(image_info->signature == MagickSignature);
2398b26b99c97473f020df4b9d4ba789e074e06ceddreed  assert(image != (Image *) NULL);
2408b26b99c97473f020df4b9d4ba789e074e06ceddreed  assert(image->signature == MagickSignature);
2415d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com  if (image->debug != MagickFalse)
2424af267b11964d4a8acdb232ac46094c84d890e88reed    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
2437fb4f8bd031eda87e1da9bc0f749968c0e872e6freed      image_info->filename);
24463e7973d1f01bd03216659b9d2267f83a752c8fbBrian Salomon  status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception);
24516d8ec66cdce2f30ce89b87066d3ac7a244c460dRobert Phillips  if (status == MagickFalse)
2467b6945bc4e639d7cc4a49b84d492690f8e865566reed    return(status);
2477b6945bc4e639d7cc4a49b84d492690f8e865566reed  (void) CloseBlob(image);
24816d8ec66cdce2f30ce89b87066d3ac7a244c460dRobert Phillips  if (image->colorspace != RGBColorspace)
2497b6945bc4e639d7cc4a49b84d492690f8e865566reed    (void) TransformImageColorspace(image,RGBColorspace);
250b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips  *url='\0';
251e2f7d1899d890c2f08571e1bd6c7fa2c5ea1be0bRobert Phillips  if ((LocaleCompare(image_info->magick,"FTP") == 0) ||
252e2f7d1899d890c2f08571e1bd6c7fa2c5ea1be0bRobert Phillips      (LocaleCompare(image_info->magick,"HTTP") == 0))
253e2f7d1899d890c2f08571e1bd6c7fa2c5ea1be0bRobert Phillips    {
254e2f7d1899d890c2f08571e1bd6c7fa2c5ea1be0bRobert Phillips      /*
255e2f7d1899d890c2f08571e1bd6c7fa2c5ea1be0bRobert Phillips        Extract URL base from filename.
256e2f7d1899d890c2f08571e1bd6c7fa2c5ea1be0bRobert Phillips      */
257e2f7d1899d890c2f08571e1bd6c7fa2c5ea1be0bRobert Phillips      p=strrchr(image->filename,'/');
258b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips      if (p)
259e2f7d1899d890c2f08571e1bd6c7fa2c5ea1be0bRobert Phillips        {
260e2f7d1899d890c2f08571e1bd6c7fa2c5ea1be0bRobert Phillips          p++;
261e2f7d1899d890c2f08571e1bd6c7fa2c5ea1be0bRobert Phillips          (void) CopyMagickString(url,image_info->magick,MaxTextExtent);
262b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips          (void) ConcatenateMagickString(url,":",MaxTextExtent);
263b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips          url[strlen(url)+p-image->filename]='\0';
264b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips          (void) ConcatenateMagickString(url,image->filename,
265e2f7d1899d890c2f08571e1bd6c7fa2c5ea1be0bRobert Phillips            p-image->filename+2);
2667b6945bc4e639d7cc4a49b84d492690f8e865566reed          (void) CopyMagickString(image->filename,p,MaxTextExtent);
2677b6945bc4e639d7cc4a49b84d492690f8e865566reed        }
2688b26b99c97473f020df4b9d4ba789e074e06ceddreed    }
2698b26b99c97473f020df4b9d4ba789e074e06ceddreed  /*
2707ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel    Refer to image map file.
2717ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel  */
2727ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel  (void) CopyMagickString(filename,image->filename,MaxTextExtent);
273dddbe380b0e6b690041a4e020aefe57f1b21691abrianosman  AppendImageFormat("map",filename);
274dddbe380b0e6b690041a4e020aefe57f1b21691abrianosman  GetPathComponent(filename,BasePath,basename);
2757fb4f8bd031eda87e1da9bc0f749968c0e872e6freed  (void) CopyMagickString(mapname,basename,MaxTextExtent);
2767fb4f8bd031eda87e1da9bc0f749968c0e872e6freed  (void) CopyMagickString(image->filename,image_info->filename,MaxTextExtent);
2777ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel  (void) CopyMagickString(filename,image->filename,MaxTextExtent);
27896fcdcc219d2a0d3579719b84b28bede76efba64halcanary  write_info=CloneImageInfo(image_info);
2798b26b99c97473f020df4b9d4ba789e074e06ceddreed  write_info->adjoin=MagickTrue;
2800ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips  status=MagickTrue;
281b0e93a22bbfad05bb834e33387880ece56e0f6d2Robert Phillips  if (LocaleCompare(image_info->magick,"SHTML") != 0)
2828b26b99c97473f020df4b9d4ba789e074e06ceddreed    {
28396fcdcc219d2a0d3579719b84b28bede76efba64halcanary      const char
2848b26b99c97473f020df4b9d4ba789e074e06ceddreed        *value;
285de49988bc24977f97bb1da8c17ceee5432fcc8e7reed
286de49988bc24977f97bb1da8c17ceee5432fcc8e7reed      /*
287de49988bc24977f97bb1da8c17ceee5432fcc8e7reed        Open output image file.
288de49988bc24977f97bb1da8c17ceee5432fcc8e7reed      */
28985d34b2e841d99dab914111fe2eaa4db99345e1eBrian Osman      status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception);
290066f020bb6cb9dbb12b977fcddd93982201777feRobert Phillips      if (status == MagickFalse)
2910ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips        return(status);
2920ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips      /*
2936dc6f5f4a153d33ed91565cb3cd397a310a937d0bsalomon        Write the HTML image file.
2946dc6f5f4a153d33ed91565cb3cd397a310a937d0bsalomon      */
2959440345a81d6c2372ac0aed937080f3da67439ddGreg Daniel      (void) WriteBlobString(image,"<?xml version=\"1.0\" "
2969440345a81d6c2372ac0aed937080f3da67439ddGreg Daniel        "encoding=\"US-ASCII\"?>\n");
2979440345a81d6c2372ac0aed937080f3da67439ddGreg Daniel      (void) WriteBlobString(image,"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML "
2989440345a81d6c2372ac0aed937080f3da67439ddGreg Daniel        "1.0 Strict//EN\" "
2997ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel        "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n");
3007ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel      (void) WriteBlobString(image,"<html>\n");
3019440345a81d6c2372ac0aed937080f3da67439ddGreg Daniel      (void) WriteBlobString(image,"<head>\n");
3029440345a81d6c2372ac0aed937080f3da67439ddGreg Daniel      value=GetImageProperty(image,"label");
3039440345a81d6c2372ac0aed937080f3da67439ddGreg Daniel      if (value != (const char *) NULL)
3049440345a81d6c2372ac0aed937080f3da67439ddGreg Daniel        (void) FormatLocaleString(buffer,MaxTextExtent,"<title>%s</title>\n",
3059440345a81d6c2372ac0aed937080f3da67439ddGreg Daniel          value);
3067ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel      else
3077ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel        {
3087ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel          GetPathComponent(filename,BasePath,basename);
3097ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel          (void) FormatLocaleString(buffer,MaxTextExtent,
3107ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel            "<title>%s</title>\n",basename);
3117ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel        }
3127ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel      (void) WriteBlobString(image,buffer);
3137ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel      (void) WriteBlobString(image,"</head>\n");
3148fe24272fa6d2fa9eb2458221ed9852d6ec16f56Brian Salomon      (void) WriteBlobString(image,"<body style=\"text-align: center;\">\n");
3158fe24272fa6d2fa9eb2458221ed9852d6ec16f56Brian Salomon      (void) FormatLocaleString(buffer,MaxTextExtent,"<h1>%s</h1>\n",
3168fe24272fa6d2fa9eb2458221ed9852d6ec16f56Brian Salomon        image->filename);
3178fe24272fa6d2fa9eb2458221ed9852d6ec16f56Brian Salomon      (void) WriteBlobString(image,buffer);
3188fe24272fa6d2fa9eb2458221ed9852d6ec16f56Brian Salomon      (void) WriteBlobString(image,"<div>\n");
319d20b5c489b5709a4d251c0cc68d584ea4514594eMike Reed      (void) CopyMagickString(filename,image->filename,MaxTextExtent);
3208fe24272fa6d2fa9eb2458221ed9852d6ec16f56Brian Salomon      AppendImageFormat("png",filename);
3218fe24272fa6d2fa9eb2458221ed9852d6ec16f56Brian Salomon      (void) FormatLocaleString(buffer,MaxTextExtent,"<img usemap=\"#%s\" "
3228fe24272fa6d2fa9eb2458221ed9852d6ec16f56Brian Salomon        "src=\"%s\" style=\"border: 0;\" alt=\"Image map\" />\n",mapname,
3238fe24272fa6d2fa9eb2458221ed9852d6ec16f56Brian Salomon        filename);
324fcd5fddb0264d062a461435618ad54a29ff80fc0Robert Phillips      (void) WriteBlobString(image,buffer);
3258fe24272fa6d2fa9eb2458221ed9852d6ec16f56Brian Salomon      /*
3268fe24272fa6d2fa9eb2458221ed9852d6ec16f56Brian Salomon        Determine the size and location of each image tile.
3278fe24272fa6d2fa9eb2458221ed9852d6ec16f56Brian Salomon      */
3288fe24272fa6d2fa9eb2458221ed9852d6ec16f56Brian Salomon      SetGeometry(image,&geometry);
3298fe24272fa6d2fa9eb2458221ed9852d6ec16f56Brian Salomon      if (image->montage != (char *) NULL)
3308fe24272fa6d2fa9eb2458221ed9852d6ec16f56Brian Salomon        (void) ParseAbsoluteGeometry(image->montage,&geometry);
3318fe24272fa6d2fa9eb2458221ed9852d6ec16f56Brian Salomon      /*
3329440345a81d6c2372ac0aed937080f3da67439ddGreg Daniel        Write an image map.
3339440345a81d6c2372ac0aed937080f3da67439ddGreg Daniel      */
334b445a57e6c36cce86580b618701b5af708a6f271jbauman      (void) FormatLocaleString(buffer,MaxTextExtent,
335b445a57e6c36cce86580b618701b5af708a6f271jbauman        "<map id=\"%s\" name=\"%s\">\n",mapname,mapname);
336b445a57e6c36cce86580b618701b5af708a6f271jbauman      (void) WriteBlobString(image,buffer);
337b445a57e6c36cce86580b618701b5af708a6f271jbauman      (void) FormatLocaleString(buffer,MaxTextExtent,"  <area href=\"%s",
338dddbe380b0e6b690041a4e020aefe57f1b21691abrianosman        url);
339dddbe380b0e6b690041a4e020aefe57f1b21691abrianosman      (void) WriteBlobString(image,buffer);
3405ec26ae9bfca635ccc98283aad5deda11519d826bsalomon      if (image->directory == (char *) NULL)
341993a4216a6014b9de8f4d8120360c94550dc6761bsalomon        {
342b445a57e6c36cce86580b618701b5af708a6f271jbauman          (void) FormatLocaleString(buffer,MaxTextExtent,
343b445a57e6c36cce86580b618701b5af708a6f271jbauman            "%s\" shape=\"rect\" coords=\"0,0,%.20g,%.20g\" alt=\"\" />\n",
344b445a57e6c36cce86580b618701b5af708a6f271jbauman            image->filename,(double) geometry.width-1,(double) geometry.height-
345b445a57e6c36cce86580b618701b5af708a6f271jbauman            1);
346b445a57e6c36cce86580b618701b5af708a6f271jbauman          (void) WriteBlobString(image,buffer);
34796fcdcc219d2a0d3579719b84b28bede76efba64halcanary        }
348993a4216a6014b9de8f4d8120360c94550dc6761bsalomon      else
349b445a57e6c36cce86580b618701b5af708a6f271jbauman        for (p=image->directory; *p != '\0'; p++)
350b445a57e6c36cce86580b618701b5af708a6f271jbauman          if (*p != '\n')
351b445a57e6c36cce86580b618701b5af708a6f271jbauman            (void) WriteBlobByte(image,(unsigned char) *p);
3527ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel          else
3537ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel            {
3547ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel              (void) FormatLocaleString(buffer,MaxTextExtent,"\" shape="
3557ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel                "\"rect\" coords=\"%.20g,%.20g,%.20g,%.20g\" alt=\"\" />\n",
3567ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel                (double) geometry.x,(double) geometry.y,(double) (geometry.x+
3577ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel                geometry.width-1),(double) (geometry.y+geometry.height-1));
3587ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel              (void) WriteBlobString(image,buffer);
3597ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel              if (*(p+1) != '\0')
3607ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel                {
3617ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel                  (void) FormatLocaleString(buffer,MaxTextExtent,
3627ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel                    "  <area href=%s\"",url);
3637ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel                  (void) WriteBlobString(image,buffer);
3647ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel                }
3657ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel              geometry.x+=(ssize_t) geometry.width;
3667ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel              if ((geometry.x+4) >= (ssize_t) image->columns)
367bc7a4fb06780f9829b4b21470fe6f0503d2297cdRobert Phillips                {
368b445a57e6c36cce86580b618701b5af708a6f271jbauman                  geometry.x=0;
369bc7a4fb06780f9829b4b21470fe6f0503d2297cdRobert Phillips                  geometry.y+=(ssize_t) geometry.height;
370b445a57e6c36cce86580b618701b5af708a6f271jbauman                }
3717ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel            }
3727ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel      (void) WriteBlobString(image,"</map>\n");
3737ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel      (void) CopyMagickString(filename,image->filename,MaxTextExtent);
3747ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel      (void) WriteBlobString(image,"</div>\n");
3757ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel      (void) WriteBlobString(image,"</body>\n");
3767ef28f35a2f7d17b90c776f76d4b374ccee6c347Greg Daniel      (void) WriteBlobString(image,"</html>\n");
377b445a57e6c36cce86580b618701b5af708a6f271jbauman      (void) CloseBlob(image);
378bc7a4fb06780f9829b4b21470fe6f0503d2297cdRobert Phillips      /*
37996fcdcc219d2a0d3579719b84b28bede76efba64halcanary        Write the image as PNG.
380993a4216a6014b9de8f4d8120360c94550dc6761bsalomon      */
381993a4216a6014b9de8f4d8120360c94550dc6761bsalomon      (void) CopyMagickString(image->filename,filename,MaxTextExtent);
382d4c741e3d0e0fa633399691c47f76b6c7841ee83robertphillips      AppendImageFormat("png",image->filename);
383d4c741e3d0e0fa633399691c47f76b6c7841ee83robertphillips      next=GetNextImageInList(image);
384d4c741e3d0e0fa633399691c47f76b6c7841ee83robertphillips      image->next=NewImageList();
385993a4216a6014b9de8f4d8120360c94550dc6761bsalomon      (void) CopyMagickString(image->magick,"PNG",MaxTextExtent);
386dd3b3f41829d32d7eaf3eb4903570d49c2ba9ff8Robert Phillips      (void) WriteImage(write_info,image);
3871105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman      image->next=next;
3881105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman      /*
3891105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman        Determine image map filename.
3901105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman      */
3911105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman      GetPathComponent(image->filename,BasePath,filename);
392e1da1d9a7dfa6c9ebdcbd2845acebd045edd2a6fGreg Daniel      (void) ConcatenateMagickString(filename,"_map.shtml",MaxTextExtent);
3931105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman      (void) CopyMagickString(image->filename,filename,MaxTextExtent);
3941105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman    }
39596fcdcc219d2a0d3579719b84b28bede76efba64halcanary  /*
396993a4216a6014b9de8f4d8120360c94550dc6761bsalomon    Open image map.
397993a4216a6014b9de8f4d8120360c94550dc6761bsalomon  */
398993a4216a6014b9de8f4d8120360c94550dc6761bsalomon  status=OpenBlob(write_info,image,WriteBinaryBlobMode,&image->exception);
3997d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed  if (status == MagickFalse)
400fbcef6eb8abad142daf45418516550f7635b4a52Robert Phillips    return(status);
401fbcef6eb8abad142daf45418516550f7635b4a52Robert Phillips  write_info=DestroyImageInfo(write_info);
402993a4216a6014b9de8f4d8120360c94550dc6761bsalomon  /*
403b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips    Determine the size and location of each image tile.
404c9a3706f1ee38c331610ec1e872d9a658566c397robertphillips  */
40582f44319159bb98dcacdbbec7ea643dde5ed024bBrian Salomon  SetGeometry(image,&geometry);
406e60ad620fe236ce4c1e85a31bd53ed0c848da8c3Robert Phillips  if (image->montage != (char *) NULL)
4077ee385e1dc3cd6a47dc8f7297fef6e175eaba224Robert Phillips    (void) ParseAbsoluteGeometry(image->montage,&geometry);
408e60ad620fe236ce4c1e85a31bd53ed0c848da8c3Robert Phillips  /*
409e60ad620fe236ce4c1e85a31bd53ed0c848da8c3Robert Phillips    Write an image map.
4107ee385e1dc3cd6a47dc8f7297fef6e175eaba224Robert Phillips  */
411b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips  (void) FormatLocaleString(buffer,MaxTextExtent,
412b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips    "<map id=\"%s\" name=\"%s\">\n",mapname,mapname);
413b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips  (void) WriteBlobString(image,buffer);
414b726d58efc91c4eefa5cea0881a823ee108db8fdRobert Phillips  (void) FormatLocaleString(buffer,MaxTextExtent,"  <area href=\"%s",url);
41575a475cf2e7c66eb58b6b8b1441deb5911e53181Robert Phillips  (void) WriteBlobString(image,buffer);
416993a4216a6014b9de8f4d8120360c94550dc6761bsalomon  if (image->directory == (char *) NULL)
4175617900063f69754de62b8b12d32f6e36df14104reed    {
418b445a57e6c36cce86580b618701b5af708a6f271jbauman      (void) FormatLocaleString(buffer,MaxTextExtent,
419b445a57e6c36cce86580b618701b5af708a6f271jbauman        "%s\" shape=\"rect\" coords=\"0,0,%.20g,%.20g\" alt=\"\" />\n",
420dddbe380b0e6b690041a4e020aefe57f1b21691abrianosman        image->filename,(double) geometry.width-1,(double) geometry.height-1);
421dddbe380b0e6b690041a4e020aefe57f1b21691abrianosman      (void) WriteBlobString(image,buffer);
422dddbe380b0e6b690041a4e020aefe57f1b21691abrianosman    }
423dddbe380b0e6b690041a4e020aefe57f1b21691abrianosman  else
424b445a57e6c36cce86580b618701b5af708a6f271jbauman    for (p=image->directory; *p != '\0'; p++)
425b445a57e6c36cce86580b618701b5af708a6f271jbauman      if (*p != '\n')
426b445a57e6c36cce86580b618701b5af708a6f271jbauman        (void) WriteBlobByte(image,(unsigned char) *p);
427b445a57e6c36cce86580b618701b5af708a6f271jbauman      else
428b445a57e6c36cce86580b618701b5af708a6f271jbauman        {
429dddbe380b0e6b690041a4e020aefe57f1b21691abrianosman          (void) FormatLocaleString(buffer,MaxTextExtent,"\" shape=\"rect\""
430dddbe380b0e6b690041a4e020aefe57f1b21691abrianosman            " coords=\"%.20g,%.20g,%.20g,%.20g\" alt=\"\" />\n",
431dddbe380b0e6b690041a4e020aefe57f1b21691abrianosman            (double) geometry.x,(double) geometry.y,geometry.x+(double)
432dddbe380b0e6b690041a4e020aefe57f1b21691abrianosman            geometry.width-1,geometry.y+(double) geometry.height-1);
433b445a57e6c36cce86580b618701b5af708a6f271jbauman          (void) WriteBlobString(image,buffer);
434b445a57e6c36cce86580b618701b5af708a6f271jbauman          if (*(p+1) != '\0')
4353798c86f6885f0b47fb2e659a43b48a4468a97efRobert Phillips            {
4363798c86f6885f0b47fb2e659a43b48a4468a97efRobert Phillips              (void) FormatLocaleString(buffer,MaxTextExtent,
437041f7dfc577822f1e97721a865f86a9a02660cf9Brian Osman                "  <area href=%s\"",url);
438041f7dfc577822f1e97721a865f86a9a02660cf9Brian Osman              (void) WriteBlobString(image,buffer);
4392bbdcc44c63974f29f3743bb58d929601a3f65c6Brian Salomon            }
4402bbdcc44c63974f29f3743bb58d929601a3f65c6Brian Salomon          geometry.x+=(ssize_t) geometry.width;
4413798c86f6885f0b47fb2e659a43b48a4468a97efRobert Phillips          if ((geometry.x+4) >= (ssize_t) image->columns)
442041f7dfc577822f1e97721a865f86a9a02660cf9Brian Osman            {
443041f7dfc577822f1e97721a865f86a9a02660cf9Brian Osman              geometry.x=0;
4443798c86f6885f0b47fb2e659a43b48a4468a97efRobert Phillips              geometry.y+=(ssize_t) geometry.height;
4453798c86f6885f0b47fb2e659a43b48a4468a97efRobert Phillips            }
446041f7dfc577822f1e97721a865f86a9a02660cf9Brian Osman        }
447041f7dfc577822f1e97721a865f86a9a02660cf9Brian Osman  (void) WriteBlobString(image,"</map>\n");
4482c2bc11aea4dfcd7ee2f5859838a2aa0a56939e0Brian Osman  (void) CloseBlob(image);
449041f7dfc577822f1e97721a865f86a9a02660cf9Brian Osman  (void) CopyMagickString(image->filename,filename,MaxTextExtent);
450041f7dfc577822f1e97721a865f86a9a02660cf9Brian Osman  return(status);
451041f7dfc577822f1e97721a865f86a9a02660cf9Brian Osman}
4528744405448b9402e1368aebd321c4f555543301aRobert Phillips