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