blob: 18086d353d0d59e80d89a6f891ac6ddbfc71cf73 [file] [log] [blame]
cristy3ed852e2009-09-05 21:47:34 +00001/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3% %
4% %
5% %
6% M M AAA TTTTT TTTTT EEEEE %
7% MM MM A A T T E %
8% M M M AAAAA T T EEE %
9% M M A A T T E %
10% M M A A T T EEEEE %
11% %
12% %
13% Write Matte Channel To MIFF File. %
14% %
15% Software Design %
16% John Cristy %
17% July 1992 %
18% %
19% %
cristy1454be72011-12-19 01:52:48 +000020% Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization %
cristy3ed852e2009-09-05 21:47:34 +000021% dedicated to making software imaging solutions freely available. %
22% %
23% You may not use this file except in compliance with the License. You may %
24% obtain a copy of the License at %
25% %
26% http://www.imagemagick.org/script/license.php %
27% %
28% Unless required by applicable law or agreed to in writing, software %
29% distributed under the License is distributed on an "AS IS" BASIS, %
30% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
31% See the License for the specific language governing permissions and %
32% limitations under the License. %
33% %
34%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35%
36%
37*/
38
39/*
40 Include declarations.
41*/
cristy4c08aed2011-07-01 19:47:50 +000042#include "MagickCore/studio.h"
43#include "MagickCore/blob.h"
44#include "MagickCore/blob-private.h"
45#include "MagickCore/cache.h"
46#include "MagickCore/constitute.h"
47#include "MagickCore/exception.h"
48#include "MagickCore/exception-private.h"
49#include "MagickCore/image-private.h"
50#include "MagickCore/list.h"
51#include "MagickCore/magick.h"
52#include "MagickCore/memory_.h"
53#include "MagickCore/monitor.h"
54#include "MagickCore/monitor-private.h"
55#include "MagickCore/pixel-accessor.h"
56#include "MagickCore/quantum-private.h"
57#include "MagickCore/static.h"
58#include "MagickCore/string_.h"
59#include "MagickCore/module.h"
cristy3ed852e2009-09-05 21:47:34 +000060
61/*
62 Forward declarations.
63*/
64static MagickBooleanType
cristy1e178e72011-08-28 19:44:34 +000065 WriteMATTEImage(const ImageInfo *,Image *,ExceptionInfo *);
cristy3ed852e2009-09-05 21:47:34 +000066
67/*
68%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
69% %
70% %
71% %
72% R e g i s t e r M A T T E I m a g e %
73% %
74% %
75% %
76%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
77%
78% RegisterMATTEImage() adds attributes for the MATTE image format to
79% the list of supported formats. The attributes include the image format
80% tag, a method to read and/or write the format, whether the format
81% supports the saving of more than one frame to the same file or blob,
82% whether the format supports native in-memory I/O, and a brief
83% description of the format.
84%
85% The format of the RegisterMATTEImage method is:
86%
cristybb503372010-05-27 20:51:26 +000087% size_t RegisterMATTEImage(void)
cristy3ed852e2009-09-05 21:47:34 +000088%
89*/
cristybb503372010-05-27 20:51:26 +000090ModuleExport size_t RegisterMATTEImage(void)
cristy3ed852e2009-09-05 21:47:34 +000091{
92 MagickInfo
93 *entry;
94
95 entry=SetMagickInfo("MATTE");
96 entry->encoder=(EncodeImageHandler *) WriteMATTEImage;
97 entry->format_type=ExplicitFormatType;
98 entry->description=ConstantString("MATTE format");
99 entry->module=ConstantString("MATTE");
100 (void) RegisterMagickInfo(entry);
101 return(MagickImageCoderSignature);
102}
103
104/*
105%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
106% %
107% %
108% %
109% U n r e g i s t e r M A T T E I m a g e %
110% %
111% %
112% %
113%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
114%
115% UnregisterMATTEImage() removes format registrations made by the
116% MATTE module from the list of supported formats.
117%
118% The format of the UnregisterMATTEImage method is:
119%
120% UnregisterMATTEImage(void)
121%
122*/
123ModuleExport void UnregisterMATTEImage(void)
124{
125 (void) UnregisterMagickInfo("MATTE");
126}
127
128/*
129%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
130% %
131% %
132% %
133% W r i t e M A T T E I m a g e %
134% %
135% %
136% %
137%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
138%
cristy1e178e72011-08-28 19:44:34 +0000139% WriteMATTEImage() writes an image of matte bytes to a file. It consists of
140% data from the matte component of the image [0..255].
cristy3ed852e2009-09-05 21:47:34 +0000141%
142% The format of the WriteMATTEImage method is:
143%
144% MagickBooleanType WriteMATTEImage(const ImageInfo *image_info,
cristy1e178e72011-08-28 19:44:34 +0000145% Image *image,ExceptionInfo *exception)
cristy3ed852e2009-09-05 21:47:34 +0000146%
147% A description of each parameter follows.
148%
149% o image_info: the image info.
150%
151% o image: The image.
152%
cristy1e178e72011-08-28 19:44:34 +0000153% o exception: return any errors or warnings in this structure.
154%
cristy3ed852e2009-09-05 21:47:34 +0000155*/
156static MagickBooleanType WriteMATTEImage(const ImageInfo *image_info,
cristy1e178e72011-08-28 19:44:34 +0000157 Image *image,ExceptionInfo *exception)
cristy3ed852e2009-09-05 21:47:34 +0000158{
cristy3ed852e2009-09-05 21:47:34 +0000159 Image
160 *matte_image;
161
cristy3ed852e2009-09-05 21:47:34 +0000162 MagickBooleanType
163 status;
164
cristy4c08aed2011-07-01 19:47:50 +0000165 register const Quantum
cristy3ed852e2009-09-05 21:47:34 +0000166 *p;
167
cristybb503372010-05-27 20:51:26 +0000168 register ssize_t
cristy3ed852e2009-09-05 21:47:34 +0000169 x;
170
cristy4c08aed2011-07-01 19:47:50 +0000171 register Quantum
cristy3ed852e2009-09-05 21:47:34 +0000172 *q;
173
cristy524222d2011-04-25 00:37:06 +0000174 ssize_t
175 y;
176
cristy3ed852e2009-09-05 21:47:34 +0000177 if (image->matte == MagickFalse)
178 ThrowWriterException(CoderError,"ImageDoesNotHaveAAlphaChannel");
cristy1e178e72011-08-28 19:44:34 +0000179 matte_image=CloneImage(image,image->columns,image->rows,MagickTrue,exception);
cristy3ed852e2009-09-05 21:47:34 +0000180 if (matte_image == (Image *) NULL)
181 return(MagickFalse);
cristy018f07f2011-09-04 21:15:19 +0000182 (void) SetImageType(matte_image,TrueColorMatteType,exception);
cristy3ed852e2009-09-05 21:47:34 +0000183 matte_image->matte=MagickFalse;
184 /*
185 Convert image to matte pixels.
186 */
cristybb503372010-05-27 20:51:26 +0000187 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +0000188 {
189 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
190 q=QueueAuthenticPixels(matte_image,0,y,matte_image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000191 if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000192 break;
cristybb503372010-05-27 20:51:26 +0000193 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000194 {
cristy4c08aed2011-07-01 19:47:50 +0000195 SetPixelRed(matte_image,GetPixelAlpha(image,p),q);
196 SetPixelGreen(matte_image,GetPixelAlpha(image,p),q);
197 SetPixelBlue(matte_image,GetPixelAlpha(image,p),q);
198 SetPixelAlpha(matte_image,OpaqueAlpha,q);
cristyed231572011-07-14 02:18:59 +0000199 p+=GetPixelChannels(image);
200 q+=GetPixelChannels(matte_image);
cristy3ed852e2009-09-05 21:47:34 +0000201 }
202 if (SyncAuthenticPixels(matte_image,exception) == MagickFalse)
203 break;
cristycee97112010-05-28 00:44:52 +0000204 status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
cristy524222d2011-04-25 00:37:06 +0000205 image->rows);
cristy3ed852e2009-09-05 21:47:34 +0000206 if (status == MagickFalse)
207 break;
208 }
cristyb51dff52011-05-19 16:55:47 +0000209 (void) FormatLocaleString(matte_image->filename,MaxTextExtent,
cristy3ed852e2009-09-05 21:47:34 +0000210 "MIFF:%s",image->filename);
cristy6f9e0d32011-08-28 16:32:09 +0000211 status=WriteImage(image_info,matte_image,exception);
cristy3ed852e2009-09-05 21:47:34 +0000212 matte_image=DestroyImage(matte_image);
213 return(status);
214}