13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                            U   U  IIIII  L                                  %
73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                            U   U    I    L                                  %
83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                            U   U    I    L                                  %
93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                            U   U    I    L                                  %
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                             UUU   IIIII  LLLLL                              %
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                          Write X-Motif UIL Table.                           %
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"
438941c70abb86cb5841cc745b991002d87eb09339cristy#include "MagickCore/attribute.h"
444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob.h"
454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob-private.h"
464c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/cache.h"
474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/color.h"
484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/color-private.h"
494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/colorspace.h"
50510d06a3f7063e91993e13d546d5685048248074cristy#include "MagickCore/colorspace-private.h"
514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h"
524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h"
534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image-private.h"
544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/magick.h"
554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h"
564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor.h"
574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor-private.h"
584c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/pixel-accessor.h"
594c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum-private.h"
604c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/static.h"
614c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
624c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/module.h"
634c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/utility.h"
643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Forward declarations.
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
683ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType
693a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy  WriteUILImage(const ImageInfo *,Image *,ExceptionInfo *);
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e g i s t e r U I L I m a g e                                           %
773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  RegisterUILImage() adds attributes for the UIL image format to
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the list of supported formats.  The attributes include the image format
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  tag, a method to read and/or write the format, whether the format
853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  supports the saving of more than one frame to the same file or blob,
863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  whether the format supports native in-memory I/O, and a brief
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  description of the format.
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the RegisterUILImage method is:
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
91bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t RegisterUILImage(void)
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
94bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyModuleExport size_t RegisterUILImage(void)
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickInfo
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *entry;
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9906b627a07ff44e1ff93ef1288c9f428066ded10ddirk  entry=AcquireMagickInfo("UIL","UIL","X-Motif UIL table");
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->encoder=(EncodeImageHandler *) WriteUILImage;
10108e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags^=CoderAdjoinFlag;
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RegisterMagickInfo(entry);
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickImageCoderSignature);
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   U n r e g i s t e r U I L I m a g e                                       %
1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  UnregisterUILImage() removes format registrations made by the
1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  UIL module from the list of supported formats.
1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the UnregisterUILImage method is:
1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      UnregisterUILImage(void)
1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport void UnregisterUILImage(void)
1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("UIL");
1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   W r i t e U I L I m a g e                                                 %
1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Procedure WriteUILImage() writes an image to a file in the X-Motif UIL table
1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  format.
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the WriteUILImage method is:
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1463a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy%      MagickBooleanType WriteUILImage(const ImageInfo *image_info,
1473a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy%        Image *image,ExceptionInfo *exception)
1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows.
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image:  The image.
1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1553a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy%    o exception: return any errors or warnings in this structure.
1563a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy%
1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1583a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristystatic MagickBooleanType WriteUILImage(const ImageInfo *image_info,Image *image,
1593a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy  ExceptionInfo *exception)
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MaxCixels  92
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
164151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    basename[MagickPathExtent],
165151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    buffer[MagickPathExtent],
166151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    name[MagickPathExtent],
167bd899c2405cccabba47c8e6de18de1dddad06cf8cristy    *symbol;
1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status,
1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    transparent;
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickSizeType
1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_pixels;
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1799d8c8ce096b3b8b2b1df1aec061f17eabba22b1dcristy  PixelInfo
1809d8c8ce096b3b8b2b1df1aec061f17eabba22b1dcristy    pixel;
1819d8c8ce096b3b8b2b1df1aec061f17eabba22b1dcristy
1824c08aed51c5899665ade97263692328eea4af106cristy  register const Quantum
1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
185bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
189bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    characters_per_pixel,
1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    colors;
1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
193c6da28e61bb609d2b2cfdcc7752106c973415edbcristy  ssize_t
194c6da28e61bb609d2b2cfdcc7752106c973415edbcristy    k,
195c6da28e61bb609d2b2cfdcc7752106c973415edbcristy    y;
196c6da28e61bb609d2b2cfdcc7752106c973415edbcristy
197c6da28e61bb609d2b2cfdcc7752106c973415edbcristy  static const char
198c6da28e61bb609d2b2cfdcc7752106c973415edbcristy    Cixel[MaxCixels+1] = " .XoO+@#$%&*=-;:>,<1234567890qwertyuipasdfghjk"
199c6da28e61bb609d2b2cfdcc7752106c973415edbcristy                         "lzxcvbnmMNBVCZASDFGHJKLPIUYTREWQ!~^/()_`'][{}|";
200c6da28e61bb609d2b2cfdcc7752106c973415edbcristy
2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Open output image file.
2033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
205e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_info->signature == MagickCoreSignature);
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
207e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
2103a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy  assert(exception != (ExceptionInfo *) NULL);
211e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(exception->signature == MagickCoreSignature);
2123a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy  status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception);
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == MagickFalse)
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(status);
215af8d391906d11f0a1f2bbf4e2adbc4995c852d33cristy  (void) TransformImageColorspace(image,sRGBColorspace,exception);
2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  transparent=MagickFalse;
2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  i=0;
2184c08aed51c5899665ade97263692328eea4af106cristy  p=(const Quantum *) NULL;
2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->storage_class == PseudoClass)
2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    colors=image->colors;
2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned char
2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *matte_image;
2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert DirectClass to PseudoClass image.
2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      matte_image=(unsigned char *) NULL;
23017f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy      if (image->alpha_trait != UndefinedPixelTrait)
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Map all the transparent pixels.
2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          number_pixels=(MagickSizeType) image->columns*image->rows;
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (number_pixels != ((MagickSizeType) (size_t) number_pixels))
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          matte_image=(unsigned char *) AcquireQuantumMemory(image->columns,
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            image->rows*sizeof(*matte_image));
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (matte_image == (unsigned char *) NULL)
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
242bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (y=0; y < (ssize_t) image->rows; y++)
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p=GetVirtualPixels(image,0,y,image->columns,1,exception);
2454c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
247bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (x=0; x < (ssize_t) image->columns; x++)
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
2494c08aed51c5899665ade97263692328eea4af106cristy              matte_image[i]=(unsigned char) (GetPixelAlpha(image,p) ==
2504c08aed51c5899665ade97263692328eea4af106cristy                (Quantum) TransparentAlpha ? 1 : 0);
2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (matte_image[i] != 0)
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                transparent=MagickTrue;
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              i++;
254ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(image);
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
258018f07f7333b25743d0afff892450cebdb905c1acristy      (void) SetImageType(image,PaletteType,exception);
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      colors=image->colors;
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (transparent != MagickFalse)
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
2624c08aed51c5899665ade97263692328eea4af106cristy          register Quantum
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q;
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          colors++;
266bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (y=0; y < (ssize_t) image->rows; y++)
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q=GetAuthenticPixels(image,0,y,image->columns,1,exception);
269acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy            if (q == (Quantum *) NULL)
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
271bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (x=0; x < (ssize_t) image->columns; x++)
2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (matte_image[i] != 0)
2741678aec3bf3630d92b415d39a58f049c16ac055cdirk                SetPixelIndex(image,(Quantum) image->colors,q);
275ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(image);
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (matte_image != (unsigned char *) NULL)
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        matte_image=(unsigned char *) RelinquishMagickMemory(matte_image);
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Compute the character per pixel.
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  characters_per_pixel=1;
286bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (k=MaxCixels; (ssize_t) colors > k; k*=MaxCixels)
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    characters_per_pixel++;
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    UIL header.
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
291bd899c2405cccabba47c8e6de18de1dddad06cf8cristy  symbol=AcquireString("");
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobString(image,"/* UIL */\n");
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  GetPathComponent(image->filename,BasePath,basename);
294151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) FormatLocaleString(buffer,MagickPathExtent,
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "value\n  %s_ct : color_table(\n",basename);
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobString(image,buffer);
2974c08aed51c5899665ade97263692328eea4af106cristy  GetPixelInfo(image,&pixel);
298bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (i=0; i < (ssize_t) colors; i++)
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Define UIL color.
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
3039d8c8ce096b3b8b2b1df1aec061f17eabba22b1dcristy    pixel=image->colormap[i];
3047020ae6594690c03a4f73784fd41a7131a5b22c6cristy    pixel.colorspace=sRGBColorspace;
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel.depth=8;
306a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy    pixel.alpha=(double) OpaqueAlpha;
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GetColorTuple(&pixel,MagickTrue,name);
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (transparent != MagickFalse)
309bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      if (i == (ssize_t) (colors-1))
310151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        (void) CopyMagickString(name,"None",MagickPathExtent);
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Write UIL color.
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    k=i % MaxCixels;
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    symbol[0]=Cixel[k];
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=1; j < (int) characters_per_pixel; j++)
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      k=((i-k)/MaxCixels) % MaxCixels;
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      symbol[j]=Cixel[k];
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    symbol[j]='\0';
322bd899c2405cccabba47c8e6de18de1dddad06cf8cristy    (void) SubstituteString(&symbol,"'","''");
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare(name,"None") == 0)
324151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) FormatLocaleString(buffer,MagickPathExtent,
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "    background color = '%s'",symbol);
3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
327151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) FormatLocaleString(buffer,MagickPathExtent,
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "    color('%s',%s) = '%s'",name,
32911a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy        GetPixelInfoIntensity(image,image->colormap+i) <
330c330609437280fe98829f3f00f43eb711084f754cristy        (QuantumRange/2.0) ? "background" : "foreground",symbol);
3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) WriteBlobString(image,buffer);
332151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) FormatLocaleString(buffer,MagickPathExtent,"%s",
333bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      (i == (ssize_t) (colors-1) ? ");\n" : ",\n"));
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) WriteBlobString(image,buffer);
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Define UIL pixels.
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  GetPathComponent(image->filename,BasePath,basename);
340151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) FormatLocaleString(buffer,MagickPathExtent,
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "  %s_icon : icon(color_table = %s_ct,\n",basename,basename);
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobString(image,buffer);
343bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (y=0; y < (ssize_t) image->rows; y++)
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
3453a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy    p=GetVirtualPixels(image,0,y,image->columns,1,exception);
3464c08aed51c5899665ade97263692328eea4af106cristy    if (p == (const Quantum *) NULL)
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) WriteBlobString(image,"    \"");
349bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for (x=0; x < (ssize_t) image->columns; x++)
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3514c08aed51c5899665ade97263692328eea4af106cristy      k=((ssize_t) GetPixelIndex(image,p) % MaxCixels);
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      symbol[0]=Cixel[k];
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (j=1; j < (int) characters_per_pixel; j++)
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3554c08aed51c5899665ade97263692328eea4af106cristy        k=(((int) GetPixelIndex(image,p)-k)/MaxCixels) %
3564c08aed51c5899665ade97263692328eea4af106cristy          MaxCixels;
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        symbol[j]=Cixel[k];
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      symbol[j]='\0';
360151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) CopyMagickString(buffer,symbol,MagickPathExtent);
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) WriteBlobString(image,buffer);
362ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      p+=GetPixelChannels(image);
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
364151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) FormatLocaleString(buffer,MagickPathExtent,"\"%s\n",
365bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      (y == (ssize_t) (image->rows-1) ? ");" : ","));
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) WriteBlobString(image,buffer);
367cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy    status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
368c6da28e61bb609d2b2cfdcc7752106c973415edbcristy      image->rows);
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status == MagickFalse)
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
372bd899c2405cccabba47c8e6de18de1dddad06cf8cristy  symbol=DestroyString(symbol);
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CloseBlob(image);
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
376