1 // This may look like C code, but it is really -*- C++ -*-
2 //
3 // Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003
4 // Copyright Dirk Lemstra 2013-2016
5 //
6 // Implementation of Image
7 //
8
9 #define MAGICKCORE_IMPLEMENTATION 1
10 #define MAGICK_PLUSPLUS_IMPLEMENTATION 1
11
12 #include "Magick++/Include.h"
13 #include <cstdlib>
14 #include <string>
15 #include <string.h>
16 #include <errno.h>
17 #include <math.h>
18
19 using namespace std;
20
21 #include "Magick++/Image.h"
22 #include "Magick++/Functions.h"
23 #include "Magick++/Pixels.h"
24 #include "Magick++/Options.h"
25 #include "Magick++/ImageRef.h"
26
27 #define AbsoluteValue(x) ((x) < 0 ? -(x) : (x))
28 #define MagickPI 3.14159265358979323846264338327950288419716939937510
29 #define DegreesToRadians(x) (MagickPI*(x)/180.0)
30 #define ThrowImageException ThrowPPException(quiet())
31
32 MagickPPExport const char *Magick::borderGeometryDefault="6x6+0+0";
33 MagickPPExport const char *Magick::frameGeometryDefault="25x25+6+6";
34 MagickPPExport const char *Magick::raiseGeometryDefault="6x6+0+0";
35
operator ==(const Magick::Image & left_,const Magick::Image & right_)36 MagickPPExport int Magick::operator == (const Magick::Image &left_,
37 const Magick::Image &right_)
38 {
39 // If image pixels and signature are the same, then the image is identical
40 return((left_.rows() == right_.rows()) &&
41 (left_.columns() == right_.columns()) &&
42 (left_.signature() == right_.signature()));
43 }
44
operator !=(const Magick::Image & left_,const Magick::Image & right_)45 MagickPPExport int Magick::operator != (const Magick::Image &left_,
46 const Magick::Image &right_)
47 {
48 return(!(left_ == right_));
49 }
50
operator >(const Magick::Image & left_,const Magick::Image & right_)51 MagickPPExport int Magick::operator > (const Magick::Image &left_,
52 const Magick::Image &right_)
53 {
54 return(!(left_ < right_) && (left_ != right_));
55 }
56
operator <(const Magick::Image & left_,const Magick::Image & right_)57 MagickPPExport int Magick::operator < (const Magick::Image &left_,
58 const Magick::Image &right_)
59 {
60 // If image pixels are less, then image is smaller
61 return((left_.rows() * left_.columns()) <
62 (right_.rows() * right_.columns()));
63 }
64
operator >=(const Magick::Image & left_,const Magick::Image & right_)65 MagickPPExport int Magick::operator >= (const Magick::Image &left_,
66 const Magick::Image &right_)
67 {
68 return((left_ > right_) || (left_ == right_));
69 }
70
operator <=(const Magick::Image & left_,const Magick::Image & right_)71 MagickPPExport int Magick::operator <= (const Magick::Image &left_,
72 const Magick::Image &right_)
73 {
74 return((left_ < right_) || ( left_ == right_));
75 }
76
Image(void)77 Magick::Image::Image(void)
78 : _imgRef(new ImageRef)
79 {
80 }
81
Image(const Blob & blob_)82 Magick::Image::Image(const Blob &blob_)
83 : _imgRef(new ImageRef)
84 {
85 try
86 {
87 // Initialize, Allocate and Read images
88 quiet(true);
89 read(blob_);
90 quiet(false);
91 }
92 catch (const Error&)
93 {
94 // Release resources
95 delete _imgRef;
96 throw;
97 }
98 }
99
Image(const Blob & blob_,const Geometry & size_)100 Magick::Image::Image(const Blob &blob_,const Geometry &size_)
101 : _imgRef(new ImageRef)
102 {
103 try
104 {
105 // Read from Blob
106 quiet(true);
107 read(blob_, size_);
108 quiet(false);
109 }
110 catch(const Error&)
111 {
112 // Release resources
113 delete _imgRef;
114 throw;
115 }
116 }
117
Image(const Blob & blob_,const Geometry & size_,const size_t depth_)118 Magick::Image::Image(const Blob &blob_,const Geometry &size_,
119 const size_t depth_)
120 : _imgRef(new ImageRef)
121 {
122 try
123 {
124 // Read from Blob
125 quiet(true);
126 read(blob_,size_,depth_);
127 quiet(false);
128 }
129 catch(const Error&)
130 {
131 // Release resources
132 delete _imgRef;
133 throw;
134 }
135 }
136
Image(const Blob & blob_,const Geometry & size_,const size_t depth_,const std::string & magick_)137 Magick::Image::Image(const Blob &blob_,const Geometry &size_,
138 const size_t depth_,const std::string &magick_)
139 : _imgRef(new ImageRef)
140 {
141 try
142 {
143 // Read from Blob
144 quiet(true);
145 read(blob_,size_,depth_,magick_);
146 quiet(false);
147 }
148 catch(const Error&)
149 {
150 // Release resources
151 delete _imgRef;
152 throw;
153 }
154 }
155
Image(const Blob & blob_,const Geometry & size_,const std::string & magick_)156 Magick::Image::Image(const Blob &blob_,const Geometry &size_,
157 const std::string &magick_)
158 : _imgRef(new ImageRef)
159 {
160 try
161 {
162 // Read from Blob
163 quiet(true);
164 read(blob_,size_,magick_);
165 quiet(false);
166 }
167 catch(const Error&)
168 {
169 // Release resources
170 delete _imgRef;
171 throw;
172 }
173 }
174
Image(const Geometry & size_,const Color & color_)175 Magick::Image::Image(const Geometry &size_,const Color &color_)
176 : _imgRef(new ImageRef)
177 {
178 // xc: prefix specifies an X11 color string
179 std::string imageSpec("xc:");
180 imageSpec+=color_;
181
182 try
183 {
184 quiet(true);
185 // Set image size
186 size(size_);
187
188 // Initialize, Allocate and Read images
189 read(imageSpec);
190 quiet(false);
191 }
192 catch(const Error&)
193 {
194 // Release resources
195 delete _imgRef;
196 throw;
197 }
198 }
199
Image(const Image & image_)200 Magick::Image::Image(const Image &image_)
201 : _imgRef(image_._imgRef)
202 {
203 _imgRef->increase();
204 }
205
Image(const Image & image_,const Geometry & geometry_)206 Magick::Image::Image(const Image &image_,const Geometry &geometry_)
207 : _imgRef(new ImageRef)
208 {
209 const RectangleInfo
210 geometry=geometry_;
211
212 OffsetInfo
213 offset;
214
215 MagickCore::Image
216 *image;
217
218 GetPPException;
219 image=CloneImage(image_.constImage(),geometry_.width(),geometry_.height(),
220 MagickTrue,exceptionInfo);
221 replaceImage(image);
222 _imgRef->options(new Options(*image_.constOptions()));
223 offset.x=0;
224 offset.y=0;
225 (void) CopyImagePixels(image,image_.constImage(),&geometry,&offset,
226 exceptionInfo);
227 ThrowImageException;
228 }
229
Image(const size_t width_,const size_t height_,const std::string & map_,const StorageType type_,const void * pixels_)230 Magick::Image::Image(const size_t width_,const size_t height_,
231 const std::string &map_,const StorageType type_,const void *pixels_)
232 : _imgRef(new ImageRef)
233 {
234 try
235 {
236 quiet(true);
237 read(width_,height_,map_.c_str(),type_,pixels_);
238 quiet(false);
239 }
240 catch(const Error&)
241 {
242 // Release resources
243 delete _imgRef;
244 throw;
245 }
246 }
247
Image(const std::string & imageSpec_)248 Magick::Image::Image(const std::string &imageSpec_)
249 : _imgRef(new ImageRef)
250 {
251 try
252 {
253 // Initialize, Allocate and Read images
254 quiet(true);
255 read(imageSpec_);
256 quiet(false);
257 }
258 catch(const Error&)
259 {
260 // Release resources
261 delete _imgRef;
262 throw;
263 }
264 }
265
~Image()266 Magick::Image::~Image()
267 {
268 if (_imgRef->decrease() == 0)
269 delete _imgRef;
270
271 _imgRef=(Magick::ImageRef *) NULL;
272 }
273
operator =(const Magick::Image & image_)274 Magick::Image& Magick::Image::operator=(const Magick::Image &image_)
275 {
276 if (this != &image_)
277 {
278 image_._imgRef->increase();
279 if (_imgRef->decrease() == 0)
280 delete _imgRef;
281
282 // Use new image reference
283 _imgRef=image_._imgRef;
284 }
285 return(*this);
286 }
287
adjoin(const bool flag_)288 void Magick::Image::adjoin(const bool flag_)
289 {
290 modifyImage();
291 options()->adjoin(flag_);
292 }
293
adjoin(void) const294 bool Magick::Image::adjoin(void) const
295 {
296 return(constOptions()->adjoin());
297 }
298
alpha(const bool matteFlag_)299 void Magick::Image::alpha(const bool matteFlag_)
300 {
301 modifyImage();
302
303 // If matte channel is requested, but image doesn't already have a
304 // matte channel, then create an opaque matte channel. Likewise, if
305 // the image already has a matte channel but a matte channel is not
306 // desired, then set the matte channel to opaque.
307 GetPPException;
308 if ((matteFlag_ && !constImage()->alpha_trait) ||
309 (constImage()->alpha_trait && !matteFlag_))
310 SetImageAlpha(image(),OpaqueAlpha,exceptionInfo);
311 ThrowImageException;
312
313 image()->alpha_trait=matteFlag_ ? BlendPixelTrait : UndefinedPixelTrait;
314 }
315
alpha(void) const316 bool Magick::Image::alpha(void) const
317 {
318 if (constImage()->alpha_trait == BlendPixelTrait)
319 return(true);
320 else
321 return(false);
322 }
323
alphaColor(const Color & alphaColor_)324 void Magick::Image::alphaColor(const Color &alphaColor_)
325 {
326 modifyImage();
327
328 if (alphaColor_.isValid())
329 {
330 image()->alpha_color=alphaColor_;
331 options()->alphaColor(alphaColor_);
332 }
333 else
334 {
335 // Set to default matte color
336 Color tmpColor("#BDBDBD");
337 image()->alpha_color=tmpColor;
338 options()->alphaColor(tmpColor);
339 }
340 }
341
alphaColor(void) const342 Magick::Color Magick::Image::alphaColor(void) const
343 {
344 return(Color(constImage()->alpha_color));
345 }
346
animationDelay(const size_t delay_)347 void Magick::Image::animationDelay(const size_t delay_)
348 {
349 modifyImage();
350 image()->delay=delay_;
351 }
352
animationDelay(void) const353 size_t Magick::Image::animationDelay(void) const
354 {
355 return(constImage()->delay);
356 }
357
animationIterations(const size_t iterations_)358 void Magick::Image::animationIterations(const size_t iterations_)
359 {
360 modifyImage();
361 image()->iterations=iterations_;
362 }
363
animationIterations(void) const364 size_t Magick::Image::animationIterations(void) const
365 {
366 return(constImage()->iterations);
367 }
368
attenuate(const double attenuate_)369 void Magick::Image::attenuate(const double attenuate_)
370 {
371 char
372 value[MagickPathExtent];
373
374 modifyImage();
375 FormatLocaleString(value,MagickPathExtent,"%.20g",attenuate_);
376 (void) SetImageArtifact(image(),"attenuate",value);
377 }
378
backgroundColor(const Color & backgroundColor_)379 void Magick::Image::backgroundColor(const Color &backgroundColor_)
380 {
381 modifyImage();
382
383 if (backgroundColor_.isValid())
384 image()->background_color=backgroundColor_;
385 else
386 image()->background_color=Color();
387
388 options()->backgroundColor(backgroundColor_);
389 }
390
backgroundColor(void) const391 Magick::Color Magick::Image::backgroundColor(void) const
392 {
393 return(constOptions()->backgroundColor());
394 }
395
backgroundTexture(const std::string & backgroundTexture_)396 void Magick::Image::backgroundTexture(const std::string &backgroundTexture_)
397 {
398 modifyImage();
399 options()->backgroundTexture(backgroundTexture_);
400 }
401
backgroundTexture(void) const402 std::string Magick::Image::backgroundTexture(void) const
403 {
404 return(constOptions()->backgroundTexture());
405 }
406
baseColumns(void) const407 size_t Magick::Image::baseColumns(void) const
408 {
409 return(constImage()->magick_columns);
410 }
411
baseFilename(void) const412 std::string Magick::Image::baseFilename(void) const
413 {
414 return(std::string(constImage()->magick_filename));
415 }
416
baseRows(void) const417 size_t Magick::Image::baseRows(void) const
418 {
419 return(constImage()->magick_rows);
420 }
421
blackPointCompensation(const bool flag_)422 void Magick::Image::blackPointCompensation(const bool flag_)
423 {
424 image()->black_point_compensation=(MagickBooleanType) flag_;
425 }
426
blackPointCompensation(void) const427 bool Magick::Image::blackPointCompensation(void) const
428 {
429 return(static_cast<bool>(constImage()->black_point_compensation));
430 }
431
borderColor(const Color & borderColor_)432 void Magick::Image::borderColor(const Color &borderColor_)
433 {
434 modifyImage();
435
436 if (borderColor_.isValid())
437 image()->border_color=borderColor_;
438 else
439 image()->border_color=Color();
440
441 options()->borderColor(borderColor_);
442 }
443
borderColor(void) const444 Magick::Color Magick::Image::borderColor(void) const
445 {
446 return(constOptions()->borderColor());
447 }
448
boundingBox(void) const449 Magick::Geometry Magick::Image::boundingBox(void) const
450 {
451 RectangleInfo
452 bbox;
453
454 GetPPException;
455 bbox=GetImageBoundingBox(constImage(),exceptionInfo);
456 ThrowImageException;
457 return(Geometry(bbox));
458 }
459
boxColor(const Color & boxColor_)460 void Magick::Image::boxColor(const Color &boxColor_)
461 {
462 modifyImage();
463 options()->boxColor(boxColor_);
464 }
465
boxColor(void) const466 Magick::Color Magick::Image::boxColor(void) const
467 {
468 return(constOptions()->boxColor());
469 }
470
channelDepth(const ChannelType channel_,const size_t depth_)471 void Magick::Image::channelDepth(const ChannelType channel_,
472 const size_t depth_)
473 {
474 modifyImage();
475 GetPPException;
476 GetAndSetPPChannelMask(channel_);
477 SetImageDepth(image(),depth_,exceptionInfo);
478 RestorePPChannelMask;
479 ThrowImageException;
480 }
481
channelDepth(const ChannelType channel_)482 size_t Magick::Image::channelDepth(const ChannelType channel_)
483 {
484 size_t
485 channel_depth;
486
487 GetPPException;
488 GetAndSetPPChannelMask(channel_);
489 channel_depth=GetImageDepth(constImage(),exceptionInfo);
490 RestorePPChannelMask;
491 ThrowImageException;
492 return(channel_depth);
493 }
494
channels() const495 size_t Magick::Image::channels() const
496 {
497 return(constImage()->number_channels);
498 }
499
classType(const ClassType class_)500 void Magick::Image::classType(const ClassType class_)
501 {
502 if (classType() == PseudoClass && class_ == DirectClass)
503 {
504 // Use SyncImage to synchronize the DirectClass pixels with the
505 // color map and then set to DirectClass type.
506 modifyImage();
507 GetPPException;
508 SyncImage(image(),exceptionInfo);
509 ThrowImageException;
510 image()->colormap=(PixelInfo *)RelinquishMagickMemory(image()->colormap);
511 image()->storage_class=static_cast<MagickCore::ClassType>(DirectClass);
512 return;
513 }
514
515 if (classType() == DirectClass && class_ == PseudoClass)
516 {
517 // Quantize to create PseudoClass color map
518 modifyImage();
519 quantizeColors(MaxColormapSize);
520 quantize();
521 image()->storage_class=static_cast<MagickCore::ClassType>(PseudoClass);
522 }
523 }
524
classType(void) const525 Magick::ClassType Magick::Image::classType(void) const
526 {
527 return static_cast<Magick::ClassType>(constImage()->storage_class);
528 }
529
colorFuzz(const double fuzz_)530 void Magick::Image::colorFuzz(const double fuzz_)
531 {
532 modifyImage();
533 image()->fuzz=fuzz_;
534 options()->colorFuzz(fuzz_);
535 }
536
colorFuzz(void) const537 double Magick::Image::colorFuzz(void) const
538 {
539 return(constOptions()->colorFuzz());
540 }
541
colorMapSize(const size_t entries_)542 void Magick::Image::colorMapSize(const size_t entries_)
543 {
544 if (entries_ >MaxColormapSize)
545 throwExceptionExplicit(MagickCore::OptionError,
546 "Colormap entries must not exceed MaxColormapSize");
547
548 modifyImage();
549 GetPPException;
550 (void) AcquireImageColormap(image(),entries_,exceptionInfo);
551 ThrowImageException;
552 }
553
colorMapSize(void) const554 size_t Magick::Image::colorMapSize(void) const
555 {
556 if (!constImage()->colormap)
557 throwExceptionExplicit(MagickCore::OptionError,
558 "Image does not contain a colormap");
559
560 return(constImage()->colors);
561 }
562
colorSpace(const ColorspaceType colorSpace_)563 void Magick::Image::colorSpace(const ColorspaceType colorSpace_)
564 {
565 if (image()->colorspace == colorSpace_)
566 return;
567
568 modifyImage();
569 GetPPException;
570 TransformImageColorspace(image(),colorSpace_,exceptionInfo);
571 ThrowImageException;
572 }
573
colorSpace(void) const574 Magick::ColorspaceType Magick::Image::colorSpace(void) const
575 {
576 return (constImage()->colorspace);
577 }
578
colorSpaceType(const ColorspaceType colorSpace_)579 void Magick::Image::colorSpaceType(const ColorspaceType colorSpace_)
580 {
581 modifyImage();
582 GetPPException;
583 SetImageColorspace(image(),colorSpace_,exceptionInfo);
584 ThrowImageException;
585 options()->colorspaceType(colorSpace_);
586 }
587
colorSpaceType(void) const588 Magick::ColorspaceType Magick::Image::colorSpaceType(void) const
589 {
590 return(constOptions()->colorspaceType());
591 }
592
columns(void) const593 size_t Magick::Image::columns(void) const
594 {
595 return(constImage()->columns);
596 }
597
comment(const std::string & comment_)598 void Magick::Image::comment(const std::string &comment_)
599 {
600 modifyImage();
601 GetPPException;
602 SetImageProperty(image(),"Comment",NULL,exceptionInfo);
603 if (comment_.length() > 0)
604 SetImageProperty(image(),"Comment",comment_.c_str(),exceptionInfo);
605 ThrowImageException;
606 }
607
comment(void) const608 std::string Magick::Image::comment(void) const
609 {
610 const char
611 *value;
612
613 GetPPException;
614 value=GetImageProperty(constImage(),"Comment",exceptionInfo);
615 ThrowImageException;
616
617 if (value)
618 return(std::string(value));
619
620 return(std::string()); // Intentionally no exception
621 }
622
compose(const CompositeOperator compose_)623 void Magick::Image::compose(const CompositeOperator compose_)
624 {
625 image()->compose=compose_;
626 }
627
compose(void) const628 Magick::CompositeOperator Magick::Image::compose(void) const
629 {
630 return(constImage()->compose);
631 }
632
compressType(const CompressionType compressType_)633 void Magick::Image::compressType(const CompressionType compressType_)
634 {
635 modifyImage();
636 image()->compression=compressType_;
637 options()->compressType(compressType_);
638 }
639
compressType(void) const640 Magick::CompressionType Magick::Image::compressType(void) const
641 {
642 return(constImage()->compression);
643 }
644
debug(const bool flag_)645 void Magick::Image::debug(const bool flag_)
646 {
647 modifyImage();
648 options()->debug(flag_);
649 }
650
debug(void) const651 bool Magick::Image::debug(void) const
652 {
653 return(constOptions()->debug());
654 }
655
density(const Point & density_)656 void Magick::Image::density(const Point &density_)
657 {
658 modifyImage();
659 options()->density(density_);
660 if (density_.isValid())
661 {
662 image()->resolution.x=density_.x();
663 if (density_.y() != 0.0)
664 image()->resolution.y=density_.y();
665 else
666 image()->resolution.y=density_.x();
667 }
668 else
669 {
670 // Reset to default
671 image()->resolution.x=0.0;
672 image()->resolution.y=0.0;
673 }
674 }
675
density(void) const676 Magick::Point Magick::Image::density(void) const
677 {
678 if (isValid())
679 {
680 ssize_t
681 x_resolution=72,
682 y_resolution=72;
683
684 if (constImage()->resolution.x > 0.0)
685 x_resolution=constImage()->resolution.x;
686
687 if (constImage()->resolution.y > 0.0)
688 y_resolution=constImage()->resolution.y;
689
690 return(Point(x_resolution,y_resolution));
691 }
692
693 return(constOptions()->density());
694 }
695
depth(const size_t depth_)696 void Magick::Image::depth(const size_t depth_)
697 {
698 size_t
699 depth = depth_;
700
701 if (depth > MAGICKCORE_QUANTUM_DEPTH)
702 depth=MAGICKCORE_QUANTUM_DEPTH;
703
704 modifyImage();
705 image()->depth=depth;
706 options()->depth(depth);
707 }
708
depth(void) const709 size_t Magick::Image::depth(void) const
710 {
711 return(constImage()->depth);
712 }
713
directory(void) const714 std::string Magick::Image::directory(void) const
715 {
716 if (constImage()->directory)
717 return(std::string(constImage()->directory));
718
719 if (!quiet())
720 throwExceptionExplicit(MagickCore::CorruptImageWarning,
721 "Image does not contain a directory");
722
723 return(std::string());
724 }
725
endian(const Magick::EndianType endian_)726 void Magick::Image::endian(const Magick::EndianType endian_)
727 {
728 modifyImage();
729 options()->endian(endian_);
730 image()->endian=endian_;
731 }
732
endian(void) const733 Magick::EndianType Magick::Image::endian(void) const
734 {
735 return(constImage()->endian);
736 }
737
exifProfile(const Magick::Blob & exifProfile_)738 void Magick::Image::exifProfile(const Magick::Blob &exifProfile_)
739 {
740 modifyImage();
741
742 if (exifProfile_.data() != 0)
743 {
744 StringInfo
745 *exif_profile;
746
747 exif_profile=AcquireStringInfo(exifProfile_.length());
748 SetStringInfoDatum(exif_profile,(unsigned char *) exifProfile_.data());
749 GetPPException;
750 (void) SetImageProfile(image(),"exif",exif_profile,exceptionInfo);
751 exif_profile=DestroyStringInfo(exif_profile);
752 ThrowImageException;
753 }
754 }
755
exifProfile(void) const756 Magick::Blob Magick::Image::exifProfile(void) const
757 {
758 const StringInfo
759 *exif_profile;
760
761 exif_profile=GetImageProfile(constImage(),"exif");
762 if (exif_profile == (StringInfo *) NULL)
763 return(Blob());
764 return(Blob(GetStringInfoDatum(exif_profile),
765 GetStringInfoLength(exif_profile)));
766 }
767
fileName(const std::string & fileName_)768 void Magick::Image::fileName(const std::string &fileName_)
769 {
770 modifyImage();
771
772 fileName_.copy(image()->filename,sizeof(image()->filename)-1);
773 image()->filename[fileName_.length()]=0; // Null terminate
774
775 options()->fileName(fileName_);
776 }
777
fileName(void) const778 std::string Magick::Image::fileName(void) const
779 {
780 return(constOptions()->fileName());
781 }
782
fileSize(void) const783 MagickCore::MagickSizeType Magick::Image::fileSize(void) const
784 {
785 return(GetBlobSize(constImage()));
786 }
787
fillColor(const Magick::Color & fillColor_)788 void Magick::Image::fillColor(const Magick::Color &fillColor_)
789 {
790 modifyImage();
791 options()->fillColor(fillColor_);
792 }
793
fillColor(void) const794 Magick::Color Magick::Image::fillColor(void) const
795 {
796 return(constOptions()->fillColor());
797 }
798
fillRule(const Magick::FillRule & fillRule_)799 void Magick::Image::fillRule(const Magick::FillRule &fillRule_)
800 {
801 modifyImage();
802 options()->fillRule(fillRule_);
803 }
804
fillRule(void) const805 Magick::FillRule Magick::Image::fillRule(void) const
806 {
807 return constOptions()->fillRule();
808 }
809
fillPattern(const Image & fillPattern_)810 void Magick::Image::fillPattern(const Image &fillPattern_)
811 {
812 modifyImage();
813 if (fillPattern_.isValid())
814 options()->fillPattern(fillPattern_.constImage());
815 else
816 options()->fillPattern(static_cast<MagickCore::Image*>(NULL));
817 }
818
fillPattern(void) const819 Magick::Image Magick::Image::fillPattern(void) const
820 {
821 // FIXME: This is inordinately innefficient
822 const MagickCore::Image
823 *tmpTexture;
824
825 Image
826 texture;
827
828 tmpTexture=constOptions()->fillPattern();
829
830 if (tmpTexture)
831 {
832 MagickCore::Image
833 *image;
834
835 GetPPException;
836 image=CloneImage(tmpTexture,0,0,MagickTrue,exceptionInfo);
837 texture.replaceImage(image);
838 ThrowImageException;
839 }
840 return(texture);
841 }
842
filterType(const Magick::FilterType filterType_)843 void Magick::Image::filterType(const Magick::FilterType filterType_)
844 {
845 modifyImage();
846 image()->filter=filterType_;
847 }
848
filterType(void) const849 Magick::FilterType Magick::Image::filterType(void) const
850 {
851 return(constImage()->filter);
852 }
853
font(const std::string & font_)854 void Magick::Image::font(const std::string &font_)
855 {
856 modifyImage();
857 options()->font(font_);
858 }
859
font(void) const860 std::string Magick::Image::font(void) const
861 {
862 return(constOptions()->font());
863 }
864
fontFamily(const std::string & family_)865 void Magick::Image::fontFamily(const std::string &family_)
866 {
867 modifyImage();
868 options()->fontFamily(family_);
869 }
870
fontFamily(void) const871 std::string Magick::Image::fontFamily(void) const
872 {
873 return(constOptions()->fontFamily());
874 }
875
fontPointsize(const double pointSize_)876 void Magick::Image::fontPointsize(const double pointSize_)
877 {
878 modifyImage();
879 options()->fontPointsize(pointSize_);
880 }
881
fontPointsize(void) const882 double Magick::Image::fontPointsize(void) const
883 {
884 return(constOptions()->fontPointsize());
885 }
886
fontStyle(const StyleType pointSize_)887 void Magick::Image::fontStyle(const StyleType pointSize_)
888 {
889 modifyImage();
890 options()->fontStyle(pointSize_);
891 }
892
fontStyle(void) const893 Magick::StyleType Magick::Image::fontStyle(void) const
894 {
895 return(constOptions()->fontStyle());
896 }
897
fontWeight(const size_t weight_)898 void Magick::Image::fontWeight(const size_t weight_)
899 {
900 modifyImage();
901 options()->fontWeight(weight_);
902 }
903
fontWeight(void) const904 size_t Magick::Image::fontWeight(void) const
905 {
906 return(constOptions()->fontWeight());
907 }
908
format(void) const909 std::string Magick::Image::format(void) const
910 {
911 const MagickInfo
912 *magick_info;
913
914 GetPPException;
915 magick_info=GetMagickInfo(constImage()->magick,exceptionInfo);
916 ThrowImageException;
917
918 if ((magick_info != 0) && (*magick_info->description != '\0'))
919 return(std::string(magick_info->description));
920
921 if (!quiet())
922 throwExceptionExplicit(MagickCore::CorruptImageWarning,
923 "Unrecognized image magick type");
924
925 return(std::string());
926 }
927
formatExpression(const std::string expression)928 std::string Magick::Image::formatExpression(const std::string expression)
929 {
930 char
931 *text;
932
933 std::string
934 text_string;
935
936 GetPPException;
937 modifyImage();
938 text=InterpretImageProperties(imageInfo(),image(),expression.c_str(),
939 exceptionInfo);
940 if (text != (char *) NULL)
941 {
942 text_string=std::string(text);
943 text=DestroyString(text);
944 }
945 ThrowImageException;
946 return(text_string);
947 }
948
gamma(void) const949 double Magick::Image::gamma(void) const
950 {
951 return(constImage()->gamma);
952 }
953
geometry(void) const954 Magick::Geometry Magick::Image::geometry(void) const
955 {
956 if (constImage()->geometry)
957 return Geometry(constImage()->geometry);
958
959 if (!quiet())
960 throwExceptionExplicit(MagickCore::OptionWarning,
961 "Image does not contain a geometry");
962
963 return(Geometry());
964 }
965
gifDisposeMethod(const MagickCore::DisposeType disposeMethod_)966 void Magick::Image::gifDisposeMethod(
967 const MagickCore::DisposeType disposeMethod_)
968 {
969 modifyImage();
970 image()->dispose=disposeMethod_;
971 }
972
gifDisposeMethod(void) const973 MagickCore::DisposeType Magick::Image::gifDisposeMethod(void) const
974 {
975 return(constImage()->dispose);
976 }
977
hasChannel(const PixelChannel channel) const978 bool Magick::Image::hasChannel(const PixelChannel channel) const
979 {
980 if (GetPixelChannelTraits(constImage(),channel) == UndefinedPixelTrait)
981 return(false);
982
983 if (channel == GreenPixelChannel || channel == BluePixelChannel)
984 return (GetPixelChannelOffset(constImage(),channel) == (ssize_t)channel);
985
986 return(true);
987 }
988
highlightColor(const Color color_)989 void Magick::Image::highlightColor(const Color color_)
990 {
991 std::string
992 value;
993
994 value=color_;
995 artifact("highlight-color",value);
996 }
997
iccColorProfile(const Magick::Blob & colorProfile_)998 void Magick::Image::iccColorProfile(const Magick::Blob &colorProfile_)
999 {
1000 profile("icc",colorProfile_);
1001 }
1002
iccColorProfile(void) const1003 Magick::Blob Magick::Image::iccColorProfile(void) const
1004 {
1005 const StringInfo
1006 *color_profile;
1007
1008 color_profile=GetImageProfile(constImage(),"icc");
1009 if (color_profile == (StringInfo *) NULL)
1010 return(Blob());
1011 return(Blob(GetStringInfoDatum(color_profile),GetStringInfoLength(
1012 color_profile)));
1013 }
1014
interlaceType(const Magick::InterlaceType interlace_)1015 void Magick::Image::interlaceType(const Magick::InterlaceType interlace_)
1016 {
1017 modifyImage();
1018 image()->interlace=interlace_;
1019 options()->interlaceType(interlace_);
1020 }
1021
interlaceType(void) const1022 Magick::InterlaceType Magick::Image::interlaceType(void) const
1023 {
1024 return(constImage()->interlace);
1025 }
1026
interpolate(const PixelInterpolateMethod interpolate_)1027 void Magick::Image::interpolate(const PixelInterpolateMethod interpolate_)
1028 {
1029 modifyImage();
1030 image()->interpolate=interpolate_;
1031 }
1032
interpolate(void) const1033 Magick::PixelInterpolateMethod Magick::Image::interpolate(void) const
1034 {
1035 return constImage()->interpolate;
1036 }
1037
iptcProfile(const Magick::Blob & iptcProfile_)1038 void Magick::Image::iptcProfile(const Magick::Blob &iptcProfile_)
1039 {
1040 modifyImage();
1041 if (iptcProfile_.data() != 0)
1042 {
1043 StringInfo
1044 *iptc_profile;
1045
1046 iptc_profile=AcquireStringInfo(iptcProfile_.length());
1047 SetStringInfoDatum(iptc_profile,(unsigned char *) iptcProfile_.data());
1048 GetPPException;
1049 (void) SetImageProfile(image(),"iptc",iptc_profile,exceptionInfo);
1050 iptc_profile=DestroyStringInfo(iptc_profile);
1051 ThrowImageException;
1052 }
1053 }
1054
iptcProfile(void) const1055 Magick::Blob Magick::Image::iptcProfile(void) const
1056 {
1057 const StringInfo
1058 *iptc_profile;
1059
1060 iptc_profile=GetImageProfile(constImage(),"iptc");
1061 if (iptc_profile == (StringInfo *) NULL)
1062 return(Blob());
1063 return(Blob(GetStringInfoDatum(iptc_profile),GetStringInfoLength(
1064 iptc_profile)));
1065 }
1066
isOpaque(void) const1067 bool Magick::Image::isOpaque(void) const
1068 {
1069 MagickBooleanType
1070 result;
1071
1072 GetPPException;
1073 result=IsImageOpaque(constImage(),exceptionInfo);
1074 ThrowImageException;
1075 return(result != MagickFalse ? true : false);
1076 }
1077
isValid(const bool isValid_)1078 void Magick::Image::isValid(const bool isValid_)
1079 {
1080 if (!isValid_)
1081 {
1082 delete _imgRef;
1083 _imgRef=new ImageRef;
1084 }
1085 else if (!isValid())
1086 {
1087 // Construct with single-pixel black image to make
1088 // image valid. This is an obvious hack.
1089 size(Geometry(1,1));
1090 read("xc:black");
1091 }
1092 }
1093
isValid(void) const1094 bool Magick::Image::isValid(void) const
1095 {
1096 return rows() && columns();
1097 }
1098
label(const std::string & label_)1099 void Magick::Image::label(const std::string &label_)
1100 {
1101 modifyImage();
1102 GetPPException;
1103 (void) SetImageProperty(image(),"Label",NULL,exceptionInfo);
1104 if (label_.length() > 0)
1105 (void) SetImageProperty(image(),"Label",label_.c_str(),exceptionInfo);
1106 ThrowImageException;
1107 }
1108
label(void) const1109 std::string Magick::Image::label(void) const
1110 {
1111 const char
1112 *value;
1113
1114 GetPPException;
1115 value=GetImageProperty(constImage(),"Label",exceptionInfo);
1116 ThrowImageException;
1117
1118 if (value)
1119 return(std::string(value));
1120
1121 return(std::string());
1122 }
1123
lowlightColor(const Color color_)1124 void Magick::Image::lowlightColor(const Color color_)
1125 {
1126 std::string
1127 value;
1128
1129 value=color_;
1130 artifact("lowlight-color",value);
1131 }
1132
magick(const std::string & magick_)1133 void Magick::Image::magick(const std::string &magick_)
1134 {
1135 size_t
1136 length;
1137
1138 modifyImage();
1139
1140 length=sizeof(image()->magick)-1;
1141 if (magick_.length() < length)
1142 length=magick_.length();
1143
1144 if (!magick_.empty())
1145 magick_.copy(image()->magick,length);
1146 image()->magick[length]=0;
1147
1148 options()->magick(magick_);
1149 }
1150
magick(void) const1151 std::string Magick::Image::magick(void) const
1152 {
1153 if (*(constImage()->magick) != '\0')
1154 return(std::string(constImage()->magick));
1155
1156 return(constOptions()->magick());
1157 }
1158
meanErrorPerPixel(void) const1159 double Magick::Image::meanErrorPerPixel(void) const
1160 {
1161 return(constImage()->error.mean_error_per_pixel);
1162 }
1163
modulusDepth(const size_t depth_)1164 void Magick::Image::modulusDepth(const size_t depth_)
1165 {
1166 modifyImage();
1167 GetPPException;
1168 SetImageDepth(image(),depth_,exceptionInfo);
1169 ThrowImageException;
1170 options()->depth(depth_);
1171 }
1172
modulusDepth(void) const1173 size_t Magick::Image::modulusDepth(void) const
1174 {
1175 size_t
1176 depth;
1177
1178 GetPPException;
1179 depth=GetImageDepth(constImage(),exceptionInfo);
1180 ThrowImageException;
1181 return(depth);
1182 }
1183
monochrome(const bool monochromeFlag_)1184 void Magick::Image::monochrome(const bool monochromeFlag_)
1185 {
1186 modifyImage();
1187 options()->monochrome(monochromeFlag_);
1188 }
1189
monochrome(void) const1190 bool Magick::Image::monochrome(void) const
1191 {
1192 return(constOptions()->monochrome());
1193 }
1194
montageGeometry(void) const1195 Magick::Geometry Magick::Image::montageGeometry(void) const
1196 {
1197 if (constImage()->montage)
1198 return Magick::Geometry(constImage()->montage);
1199
1200 if (!quiet())
1201 throwExceptionExplicit(MagickCore::CorruptImageWarning,
1202 "Image does not contain a montage");
1203
1204 return(Magick::Geometry());
1205 }
1206
normalizedMaxError(void) const1207 double Magick::Image::normalizedMaxError(void) const
1208 {
1209 return(constImage()->error.normalized_maximum_error);
1210 }
1211
normalizedMeanError(void) const1212 double Magick::Image::normalizedMeanError(void) const
1213 {
1214 return(constImage()->error.normalized_mean_error);
1215 }
1216
orientation(const Magick::OrientationType orientation_)1217 void Magick::Image::orientation(const Magick::OrientationType orientation_)
1218 {
1219 modifyImage();
1220 image()->orientation=orientation_;
1221 }
1222
orientation(void) const1223 Magick::OrientationType Magick::Image::orientation(void) const
1224 {
1225 return(constImage()->orientation);
1226 }
1227
page(const Magick::Geometry & pageSize_)1228 void Magick::Image::page(const Magick::Geometry &pageSize_)
1229 {
1230 modifyImage();
1231 options()->page(pageSize_);
1232 image()->page=pageSize_;
1233 }
1234
page(void) const1235 Magick::Geometry Magick::Image::page(void) const
1236 {
1237 return(Geometry(constImage()->page.width,constImage()->page.height,
1238 constImage()->page.x,constImage()->page.y));
1239 }
1240
quality(const size_t quality_)1241 void Magick::Image::quality(const size_t quality_)
1242 {
1243 modifyImage();
1244 image()->quality=quality_;
1245 options()->quality(quality_);
1246 }
1247
quality(void) const1248 size_t Magick::Image::quality(void) const
1249 {
1250 return(constImage()->quality);
1251 }
1252
quantizeColors(const size_t colors_)1253 void Magick::Image::quantizeColors(const size_t colors_)
1254 {
1255 modifyImage();
1256 options()->quantizeColors(colors_);
1257 }
1258
quantizeColors(void) const1259 size_t Magick::Image::quantizeColors(void) const
1260 {
1261 return(constOptions()->quantizeColors());
1262 }
1263
quantizeColorSpace(const Magick::ColorspaceType colorSpace_)1264 void Magick::Image::quantizeColorSpace(
1265 const Magick::ColorspaceType colorSpace_)
1266 {
1267 modifyImage();
1268 options()->quantizeColorSpace(colorSpace_);
1269 }
1270
quantizeColorSpace(void) const1271 Magick::ColorspaceType Magick::Image::quantizeColorSpace(void) const
1272 {
1273 return(constOptions()->quantizeColorSpace());
1274 }
1275
quantizeDither(const bool ditherFlag_)1276 void Magick::Image::quantizeDither(const bool ditherFlag_)
1277 {
1278 modifyImage();
1279 options()->quantizeDither(ditherFlag_);
1280 }
1281
quantizeDither(void) const1282 bool Magick::Image::quantizeDither(void) const
1283 {
1284 return(constOptions()->quantizeDither());
1285 }
1286
quantizeDitherMethod(const DitherMethod ditherMethod_)1287 void Magick::Image::quantizeDitherMethod(const DitherMethod ditherMethod_)
1288 {
1289 modifyImage();
1290 options()->quantizeDitherMethod(ditherMethod_);
1291 }
1292
quantizeDitherMethod(void) const1293 MagickCore::DitherMethod Magick::Image::quantizeDitherMethod(void) const
1294 {
1295 return(constOptions()->quantizeDitherMethod());
1296 }
1297
quantizeTreeDepth(const size_t treeDepth_)1298 void Magick::Image::quantizeTreeDepth(const size_t treeDepth_)
1299 {
1300 modifyImage();
1301 options()->quantizeTreeDepth(treeDepth_);
1302 }
1303
quantizeTreeDepth() const1304 size_t Magick::Image::quantizeTreeDepth() const
1305 {
1306 return(constOptions()->quantizeTreeDepth());
1307 }
1308
quiet(const bool quiet_)1309 void Magick::Image::quiet(const bool quiet_)
1310 {
1311 modifyImage();
1312 options()->quiet(quiet_);
1313 }
1314
quiet(void) const1315 bool Magick::Image::quiet(void) const
1316 {
1317 return(constOptions()->quiet());
1318 }
1319
renderingIntent(const Magick::RenderingIntent renderingIntent_)1320 void Magick::Image::renderingIntent(
1321 const Magick::RenderingIntent renderingIntent_)
1322 {
1323 modifyImage();
1324 image()->rendering_intent=renderingIntent_;
1325 }
1326
renderingIntent(void) const1327 Magick::RenderingIntent Magick::Image::renderingIntent(void) const
1328 {
1329 return(static_cast<Magick::RenderingIntent>(constImage()->rendering_intent));
1330 }
1331
resolutionUnits(const Magick::ResolutionType resolutionUnits_)1332 void Magick::Image::resolutionUnits(
1333 const Magick::ResolutionType resolutionUnits_)
1334 {
1335 modifyImage();
1336 image()->units=resolutionUnits_;
1337 options()->resolutionUnits(resolutionUnits_);
1338 }
1339
resolutionUnits(void) const1340 Magick::ResolutionType Magick::Image::resolutionUnits(void) const
1341 {
1342 return(static_cast<Magick::ResolutionType>(constImage()->units));
1343 }
1344
rows(void) const1345 size_t Magick::Image::rows(void) const
1346 {
1347 return(constImage()->rows);
1348 }
1349
scene(const size_t scene_)1350 void Magick::Image::scene(const size_t scene_)
1351 {
1352 modifyImage();
1353 image()->scene=scene_;
1354 }
1355
scene(void) const1356 size_t Magick::Image::scene(void) const
1357 {
1358 return(constImage()->scene);
1359 }
1360
size(const Geometry & geometry_)1361 void Magick::Image::size(const Geometry &geometry_)
1362 {
1363 modifyImage();
1364 options()->size(geometry_);
1365 image()->rows=geometry_.height();
1366 image()->columns=geometry_.width();
1367 }
1368
size(void) const1369 Magick::Geometry Magick::Image::size(void) const
1370 {
1371 return(Magick::Geometry(constImage()->columns,constImage()->rows));
1372 }
1373
strokeAntiAlias(const bool flag_)1374 void Magick::Image::strokeAntiAlias(const bool flag_)
1375 {
1376 modifyImage();
1377 options()->strokeAntiAlias(flag_);
1378 }
1379
strokeAntiAlias(void) const1380 bool Magick::Image::strokeAntiAlias(void) const
1381 {
1382 return(constOptions()->strokeAntiAlias());
1383 }
1384
strokeColor(const Magick::Color & strokeColor_)1385 void Magick::Image::strokeColor(const Magick::Color &strokeColor_)
1386 {
1387 std::string
1388 value;
1389
1390 modifyImage();
1391 options()->strokeColor(strokeColor_);
1392 value=strokeColor_;
1393 artifact("stroke",value);
1394 }
1395
strokeColor(void) const1396 Magick::Color Magick::Image::strokeColor(void) const
1397 {
1398 return(constOptions()->strokeColor());
1399 }
1400
strokeDashArray(const double * strokeDashArray_)1401 void Magick::Image::strokeDashArray(const double *strokeDashArray_)
1402 {
1403 modifyImage();
1404 options()->strokeDashArray(strokeDashArray_);
1405 }
1406
strokeDashArray(void) const1407 const double* Magick::Image::strokeDashArray(void) const
1408 {
1409 return(constOptions()->strokeDashArray());
1410 }
1411
strokeDashOffset(const double strokeDashOffset_)1412 void Magick::Image::strokeDashOffset(const double strokeDashOffset_)
1413 {
1414 modifyImage();
1415 options()->strokeDashOffset(strokeDashOffset_);
1416 }
1417
strokeDashOffset(void) const1418 double Magick::Image::strokeDashOffset(void) const
1419 {
1420 return(constOptions()->strokeDashOffset());
1421 }
1422
strokeLineCap(const Magick::LineCap lineCap_)1423 void Magick::Image::strokeLineCap(const Magick::LineCap lineCap_)
1424 {
1425 modifyImage();
1426 options()->strokeLineCap(lineCap_);
1427 }
1428
strokeLineCap(void) const1429 Magick::LineCap Magick::Image::strokeLineCap(void) const
1430 {
1431 return(constOptions()->strokeLineCap());
1432 }
1433
strokeLineJoin(const Magick::LineJoin lineJoin_)1434 void Magick::Image::strokeLineJoin(const Magick::LineJoin lineJoin_)
1435 {
1436 modifyImage();
1437 options()->strokeLineJoin(lineJoin_);
1438 }
1439
strokeLineJoin(void) const1440 Magick::LineJoin Magick::Image::strokeLineJoin(void) const
1441 {
1442 return(constOptions()->strokeLineJoin());
1443 }
1444
strokeMiterLimit(const size_t strokeMiterLimit_)1445 void Magick::Image::strokeMiterLimit(const size_t strokeMiterLimit_)
1446 {
1447 modifyImage();
1448 options()->strokeMiterLimit(strokeMiterLimit_);
1449 }
1450
strokeMiterLimit(void) const1451 size_t Magick::Image::strokeMiterLimit(void) const
1452 {
1453 return(constOptions()->strokeMiterLimit());
1454 }
1455
strokePattern(const Image & strokePattern_)1456 void Magick::Image::strokePattern(const Image &strokePattern_)
1457 {
1458 modifyImage();
1459 if(strokePattern_.isValid())
1460 options()->strokePattern(strokePattern_.constImage());
1461 else
1462 options()->strokePattern(static_cast<MagickCore::Image*>(NULL));
1463 }
1464
strokePattern(void) const1465 Magick::Image Magick::Image::strokePattern(void) const
1466 {
1467 // FIXME: This is inordinately innefficient
1468 const MagickCore::Image
1469 *tmpTexture;
1470
1471 Image
1472 texture;
1473
1474 tmpTexture=constOptions()->strokePattern();
1475
1476 if (tmpTexture)
1477 {
1478 MagickCore::Image
1479 *image;
1480
1481 GetPPException;
1482 image=CloneImage(tmpTexture,0,0,MagickTrue,exceptionInfo);
1483 texture.replaceImage(image);
1484 ThrowImageException;
1485 }
1486 return(texture);
1487 }
1488
strokeWidth(const double strokeWidth_)1489 void Magick::Image::strokeWidth(const double strokeWidth_)
1490 {
1491 char
1492 value[MagickPathExtent];
1493
1494 modifyImage();
1495 options()->strokeWidth(strokeWidth_);
1496 FormatLocaleString(value,MagickPathExtent,"%.20g",strokeWidth_);
1497 (void) SetImageArtifact(image(),"strokewidth",value);
1498 }
1499
strokeWidth(void) const1500 double Magick::Image::strokeWidth(void) const
1501 {
1502 return(constOptions()->strokeWidth());
1503 }
1504
subImage(const size_t subImage_)1505 void Magick::Image::subImage(const size_t subImage_)
1506 {
1507 modifyImage();
1508 options()->subImage(subImage_);
1509 }
1510
subImage(void) const1511 size_t Magick::Image::subImage(void) const
1512 {
1513 return(constOptions()->subImage());
1514 }
1515
subRange(const size_t subRange_)1516 void Magick::Image::subRange(const size_t subRange_)
1517 {
1518 modifyImage();
1519 options()->subRange(subRange_);
1520 }
1521
subRange(void) const1522 size_t Magick::Image::subRange(void) const
1523 {
1524 return(constOptions()->subRange());
1525 }
1526
textAntiAlias(const bool flag_)1527 void Magick::Image::textAntiAlias(const bool flag_)
1528 {
1529 modifyImage();
1530 options()->textAntiAlias(flag_);
1531 }
1532
textAntiAlias(void) const1533 bool Magick::Image::textAntiAlias(void) const
1534 {
1535 return(constOptions()->textAntiAlias());
1536 }
1537
textDirection(DirectionType direction_)1538 void Magick::Image::textDirection(DirectionType direction_)
1539 {
1540 modifyImage();
1541 options()->textDirection(direction_);
1542 }
1543
textDirection(void) const1544 Magick::DirectionType Magick::Image::textDirection(void) const
1545 {
1546 return(constOptions()->textDirection());
1547 }
1548
textEncoding(const std::string & encoding_)1549 void Magick::Image::textEncoding(const std::string &encoding_)
1550 {
1551 modifyImage();
1552 options()->textEncoding(encoding_);
1553 }
1554
textEncoding(void) const1555 std::string Magick::Image::textEncoding(void) const
1556 {
1557 return(constOptions()->textEncoding());
1558 }
1559
textGravity(GravityType gravity_)1560 void Magick::Image::textGravity(GravityType gravity_)
1561 {
1562 modifyImage();
1563 options()->textGravity(gravity_);
1564 }
1565
textGravity(void) const1566 Magick::GravityType Magick::Image::textGravity(void) const
1567 {
1568 return(constOptions()->textGravity());
1569 }
1570
textInterlineSpacing(double spacing_)1571 void Magick::Image::textInterlineSpacing(double spacing_)
1572 {
1573 modifyImage();
1574 options()->textInterlineSpacing(spacing_);
1575 }
1576
textInterlineSpacing(void) const1577 double Magick::Image::textInterlineSpacing(void) const
1578 {
1579 return(constOptions()->textInterlineSpacing());
1580 }
1581
textInterwordSpacing(double spacing_)1582 void Magick::Image::textInterwordSpacing(double spacing_)
1583 {
1584 modifyImage();
1585 options()->textInterwordSpacing(spacing_);
1586 }
1587
textInterwordSpacing(void) const1588 double Magick::Image::textInterwordSpacing(void) const
1589 {
1590 return(constOptions()->textInterwordSpacing());
1591 }
1592
textKerning(double kerning_)1593 void Magick::Image::textKerning(double kerning_)
1594 {
1595 modifyImage();
1596 options()->textKerning(kerning_);
1597 }
1598
textKerning(void) const1599 double Magick::Image::textKerning(void) const
1600 {
1601 return(constOptions()->textKerning());
1602 }
1603
textUnderColor(const Color & underColor_)1604 void Magick::Image::textUnderColor(const Color &underColor_)
1605 {
1606 modifyImage();
1607 options()->textUnderColor(underColor_);
1608 }
1609
textUnderColor(void) const1610 Magick::Color Magick::Image::textUnderColor(void) const
1611 {
1612 return(constOptions()->textUnderColor());
1613 }
1614
totalColors(void) const1615 size_t Magick::Image::totalColors(void) const
1616 {
1617 size_t
1618 colors;
1619
1620 GetPPException;
1621 colors=GetNumberColors(constImage(),(FILE *) NULL,exceptionInfo);
1622 ThrowImageException;
1623 return colors;
1624 }
1625
transformRotation(const double angle_)1626 void Magick::Image::transformRotation(const double angle_)
1627 {
1628 modifyImage();
1629 options()->transformRotation(angle_);
1630 }
1631
transformSkewX(const double skewx_)1632 void Magick::Image::transformSkewX(const double skewx_)
1633 {
1634 modifyImage();
1635 options()->transformSkewX(skewx_);
1636 }
1637
transformSkewY(const double skewy_)1638 void Magick::Image::transformSkewY(const double skewy_)
1639 {
1640 modifyImage();
1641 options()->transformSkewY(skewy_);
1642 }
1643
type(void) const1644 Magick::ImageType Magick::Image::type(void) const
1645 {
1646 if (constOptions()->type() != UndefinedType)
1647 return(constOptions()->type());
1648 return(GetImageType(constImage()));
1649 }
1650
type(const Magick::ImageType type_)1651 void Magick::Image::type(const Magick::ImageType type_)
1652 {
1653 modifyImage();
1654 options()->type(type_);
1655 GetPPException;
1656 SetImageType(image(),type_,exceptionInfo);
1657 ThrowImageException;
1658 }
1659
verbose(const bool verboseFlag_)1660 void Magick::Image::verbose(const bool verboseFlag_)
1661 {
1662 modifyImage();
1663 options()->verbose(verboseFlag_);
1664 }
1665
verbose(void) const1666 bool Magick::Image::verbose(void) const
1667 {
1668 return(constOptions()->verbose());
1669 }
1670
virtualPixelMethod(const VirtualPixelMethod virtualPixelMethod_)1671 void Magick::Image::virtualPixelMethod(
1672 const VirtualPixelMethod virtualPixelMethod_)
1673 {
1674 modifyImage();
1675 GetPPException;
1676 SetImageVirtualPixelMethod(image(),virtualPixelMethod_,exceptionInfo);
1677 ThrowImageException;
1678 }
1679
virtualPixelMethod(void) const1680 Magick::VirtualPixelMethod Magick::Image::virtualPixelMethod(void) const
1681 {
1682 return(GetImageVirtualPixelMethod(constImage()));
1683 }
1684
x11Display(const std::string & display_)1685 void Magick::Image::x11Display(const std::string &display_)
1686 {
1687 modifyImage();
1688 options()->x11Display(display_);
1689 }
1690
x11Display(void) const1691 std::string Magick::Image::x11Display(void) const
1692 {
1693 return(constOptions()->x11Display());
1694 }
1695
xResolution(void) const1696 double Magick::Image::xResolution(void) const
1697 {
1698 return(constImage()->resolution.x);
1699 }
1700
yResolution(void) const1701 double Magick::Image::yResolution(void) const
1702 {
1703 return(constImage()->resolution.y);
1704 }
1705
adaptiveBlur(const double radius_,const double sigma_)1706 void Magick::Image::adaptiveBlur(const double radius_,const double sigma_)
1707 {
1708 MagickCore::Image
1709 *newImage;
1710
1711 GetPPException;
1712 newImage=AdaptiveBlurImage(constImage(),radius_,sigma_,exceptionInfo);
1713 replaceImage(newImage);
1714 ThrowImageException;
1715 }
1716
adaptiveResize(const Geometry & geometry_)1717 void Magick::Image::adaptiveResize(const Geometry &geometry_)
1718 {
1719 MagickCore::Image
1720 *newImage;
1721
1722 size_t
1723 height=rows(),
1724 width=columns();
1725
1726 ssize_t
1727 x=0,
1728 y=0;
1729
1730 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
1731 &height);
1732
1733 GetPPException;
1734 newImage=AdaptiveResizeImage(constImage(),width,height,exceptionInfo);
1735 replaceImage(newImage);
1736 ThrowImageException;
1737 }
1738
adaptiveSharpen(const double radius_,const double sigma_)1739 void Magick::Image::adaptiveSharpen(const double radius_,const double sigma_)
1740 {
1741 MagickCore::Image
1742 *newImage;
1743
1744 GetPPException;
1745 newImage=AdaptiveSharpenImage(constImage(),radius_,sigma_,exceptionInfo);
1746 replaceImage(newImage);
1747 ThrowImageException;
1748 }
1749
adaptiveSharpenChannel(const ChannelType channel_,const double radius_,const double sigma_)1750 void Magick::Image::adaptiveSharpenChannel(const ChannelType channel_,
1751 const double radius_,const double sigma_ )
1752 {
1753 MagickCore::Image
1754 *newImage;
1755
1756 GetPPException;
1757 GetAndSetPPChannelMask(channel_);
1758 newImage=AdaptiveSharpenImage(constImage(),radius_,sigma_,exceptionInfo);
1759 RestorePPChannelMask;
1760 replaceImage(newImage);
1761 ThrowImageException;
1762 }
1763
adaptiveThreshold(const size_t width_,const size_t height_,const double bias_)1764 void Magick::Image::adaptiveThreshold(const size_t width_,const size_t height_,
1765 const double bias_)
1766 {
1767
1768 MagickCore::Image
1769 *newImage;
1770
1771 GetPPException;
1772 newImage=AdaptiveThresholdImage(constImage(),width_,height_,bias_,
1773 exceptionInfo);
1774 replaceImage(newImage);
1775 ThrowImageException;
1776 }
1777
addNoise(const NoiseType noiseType_)1778 void Magick::Image::addNoise(const NoiseType noiseType_)
1779 {
1780 MagickCore::Image
1781 *newImage;
1782
1783 GetPPException;
1784 newImage=AddNoiseImage(constImage(),noiseType_,1.0,exceptionInfo);
1785 replaceImage(newImage);
1786 ThrowImageException;
1787 }
1788
addNoiseChannel(const ChannelType channel_,const NoiseType noiseType_)1789 void Magick::Image::addNoiseChannel(const ChannelType channel_,
1790 const NoiseType noiseType_)
1791 {
1792 MagickCore::Image
1793 *newImage;
1794
1795 GetPPException;
1796 GetAndSetPPChannelMask(channel_);
1797 newImage=AddNoiseImage(constImage(),noiseType_,1.0,exceptionInfo);
1798 RestorePPChannelMask;
1799 replaceImage(newImage);
1800 ThrowImageException;
1801 }
1802
affineTransform(const DrawableAffine & affine_)1803 void Magick::Image::affineTransform(const DrawableAffine &affine_)
1804 {
1805 AffineMatrix
1806 _affine;
1807
1808 MagickCore::Image
1809 *newImage;
1810
1811 _affine.sx=affine_.sx();
1812 _affine.sy=affine_.sy();
1813 _affine.rx=affine_.rx();
1814 _affine.ry=affine_.ry();
1815 _affine.tx=affine_.tx();
1816 _affine.ty=affine_.ty();
1817
1818 GetPPException;
1819 newImage=AffineTransformImage(constImage(),&_affine,exceptionInfo);
1820 replaceImage(newImage);
1821 ThrowImageException;
1822 }
1823
alpha(const unsigned int alpha_)1824 void Magick::Image::alpha(const unsigned int alpha_)
1825 {
1826 modifyImage();
1827 GetPPException;
1828 SetImageAlpha(image(),alpha_,exceptionInfo);
1829 ThrowImageException;
1830 }
1831
alphaChannel(AlphaChannelOption alphaOption_)1832 void Magick::Image::alphaChannel(AlphaChannelOption alphaOption_)
1833 {
1834 modifyImage();
1835 GetPPException;
1836 SetImageAlphaChannel(image(),alphaOption_,exceptionInfo);
1837 ThrowImageException;
1838 }
1839
annotate(const std::string & text_,const Geometry & location_)1840 void Magick::Image::annotate(const std::string &text_,
1841 const Geometry &location_)
1842 {
1843 annotate(text_,location_,NorthWestGravity,0.0);
1844 }
1845
annotate(const std::string & text_,const Geometry & boundingArea_,const GravityType gravity_)1846 void Magick::Image::annotate(const std::string &text_,
1847 const Geometry &boundingArea_,const GravityType gravity_)
1848 {
1849 annotate(text_,boundingArea_,gravity_,0.0);
1850 }
1851
annotate(const std::string & text_,const Geometry & boundingArea_,const GravityType gravity_,const double degrees_)1852 void Magick::Image::annotate(const std::string &text_,
1853 const Geometry &boundingArea_,const GravityType gravity_,
1854 const double degrees_)
1855 {
1856 AffineMatrix
1857 oaffine;
1858
1859 char
1860 boundingArea[MagickPathExtent];
1861
1862 DrawInfo
1863 *drawInfo;
1864
1865 modifyImage();
1866
1867 drawInfo=options()->drawInfo();
1868 drawInfo->text=DestroyString(drawInfo->text);
1869 drawInfo->text=const_cast<char *>(text_.c_str());
1870 drawInfo->geometry=DestroyString(drawInfo->geometry);
1871
1872 if (boundingArea_.isValid())
1873 {
1874 if (boundingArea_.width() == 0 || boundingArea_.height() == 0)
1875 {
1876 FormatLocaleString(boundingArea,MagickPathExtent,"%+.20g%+.20g",
1877 (double) boundingArea_.xOff(),(double) boundingArea_.yOff());
1878 }
1879 else
1880 {
1881 (void) CopyMagickString(boundingArea,
1882 std::string(boundingArea_).c_str(), MagickPathExtent);
1883 }
1884 drawInfo->geometry=boundingArea;
1885 }
1886
1887 drawInfo->gravity=gravity_;
1888
1889 oaffine=drawInfo->affine;
1890 if (degrees_ != 0.0)
1891 {
1892 AffineMatrix
1893 affine,
1894 current;
1895
1896 affine.sx=1.0;
1897 affine.rx=0.0;
1898 affine.ry=0.0;
1899 affine.sy=1.0;
1900 affine.tx=0.0;
1901 affine.ty=0.0;
1902
1903 current=drawInfo->affine;
1904 affine.sx=cos(DegreesToRadians(fmod(degrees_,360.0)));
1905 affine.rx=sin(DegreesToRadians(fmod(degrees_,360.0)));
1906 affine.ry=(-sin(DegreesToRadians(fmod(degrees_,360.0))));
1907 affine.sy=cos(DegreesToRadians(fmod(degrees_,360.0)));
1908
1909 drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
1910 drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
1911 drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
1912 drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
1913 drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty
1914 +current.tx;
1915 }
1916
1917 GetPPException;
1918 AnnotateImage(image(),drawInfo,exceptionInfo);
1919
1920 // Restore original values
1921 drawInfo->affine=oaffine;
1922 drawInfo->text=(char *) NULL;
1923 drawInfo->geometry=(char *) NULL;
1924
1925 ThrowImageException;
1926 }
1927
annotate(const std::string & text_,const GravityType gravity_)1928 void Magick::Image::annotate(const std::string &text_,
1929 const GravityType gravity_)
1930 {
1931 DrawInfo
1932 *drawInfo;
1933
1934 modifyImage();
1935
1936 drawInfo=options()->drawInfo();
1937 drawInfo->text=DestroyString(drawInfo->text);
1938 drawInfo->text=const_cast<char *>(text_.c_str());
1939 drawInfo->gravity=gravity_;
1940
1941 GetPPException;
1942 AnnotateImage(image(),drawInfo,exceptionInfo);
1943
1944 drawInfo->gravity=NorthWestGravity;
1945 drawInfo->text=(char *) NULL;
1946
1947 ThrowImageException;
1948 }
1949
artifact(const std::string & name_,const std::string & value_)1950 void Magick::Image::artifact(const std::string &name_,const std::string &value_)
1951 {
1952 modifyImage();
1953 (void) SetImageArtifact(image(),name_.c_str(),value_.c_str());
1954 }
1955
artifact(const std::string & name_) const1956 std::string Magick::Image::artifact(const std::string &name_) const
1957 {
1958 const char
1959 *value;
1960
1961 value=GetImageArtifact(constImage(),name_.c_str());
1962 if (value)
1963 return(std::string(value));
1964 return(std::string());
1965 }
1966
attribute(const std::string name_,const std::string value_)1967 void Magick::Image::attribute(const std::string name_,const std::string value_)
1968 {
1969 modifyImage();
1970 GetPPException;
1971 SetImageProperty(image(),name_.c_str(),value_.c_str(),exceptionInfo);
1972 ThrowImageException;
1973 }
1974
attribute(const std::string name_) const1975 std::string Magick::Image::attribute(const std::string name_) const
1976 {
1977 const char
1978 *value;
1979
1980 GetPPException;
1981 value=GetImageProperty(constImage(),name_.c_str(),exceptionInfo);
1982 ThrowImageException;
1983
1984 if (value)
1985 return(std::string(value));
1986
1987 return(std::string()); // Intentionally no exception
1988 }
1989
autoGamma(void)1990 void Magick::Image::autoGamma(void)
1991 {
1992 modifyImage();
1993 GetPPException;
1994 (void) SyncImageSettings(imageInfo(),image(),exceptionInfo);
1995 (void) AutoGammaImage(image(),exceptionInfo);
1996 ThrowImageException;
1997 }
1998
autoGammaChannel(const ChannelType channel_)1999 void Magick::Image::autoGammaChannel(const ChannelType channel_)
2000 {
2001 modifyImage();
2002 GetPPException;
2003 GetAndSetPPChannelMask(channel_);
2004 (void) SyncImageSettings(imageInfo(),image(),exceptionInfo);
2005 (void) AutoGammaImage(image(),exceptionInfo);
2006 RestorePPChannelMask;
2007 ThrowImageException;
2008 }
2009
autoLevel(void)2010 void Magick::Image::autoLevel(void)
2011 {
2012 modifyImage();
2013 GetPPException;
2014 (void) AutoLevelImage(image(),exceptionInfo);
2015 ThrowImageException;
2016 }
2017
autoLevelChannel(const ChannelType channel_)2018 void Magick::Image::autoLevelChannel(const ChannelType channel_)
2019 {
2020 modifyImage();
2021 GetPPException;
2022 GetAndSetPPChannelMask(channel_);
2023 (void) AutoLevelImage(image(),exceptionInfo);
2024 RestorePPChannelMask;
2025 ThrowImageException;
2026 }
2027
autoOrient(void)2028 void Magick::Image::autoOrient(void)
2029 {
2030 MagickCore::Image
2031 *newImage;
2032
2033 if (image()->orientation == UndefinedOrientation ||
2034 image()->orientation == TopLeftOrientation)
2035 return;
2036
2037 GetPPException;
2038 newImage=AutoOrientImage(constImage(),image()->orientation,exceptionInfo);
2039 replaceImage(newImage);
2040 ThrowImageException;
2041 }
2042
blackThreshold(const std::string & threshold_)2043 void Magick::Image::blackThreshold(const std::string &threshold_)
2044 {
2045 modifyImage();
2046 GetPPException;
2047 BlackThresholdImage(image(),threshold_.c_str(),exceptionInfo);
2048 ThrowImageException;
2049 }
2050
blackThresholdChannel(const ChannelType channel_,const std::string & threshold_)2051 void Magick::Image::blackThresholdChannel(const ChannelType channel_,
2052 const std::string &threshold_)
2053 {
2054 modifyImage();
2055 GetPPException;
2056 GetAndSetPPChannelMask(channel_);
2057 BlackThresholdImage(image(),threshold_.c_str(),exceptionInfo);
2058 RestorePPChannelMask;
2059 ThrowImageException;
2060 }
2061
blueShift(const double factor_)2062 void Magick::Image::blueShift(const double factor_)
2063 {
2064 MagickCore::Image
2065 *newImage;
2066
2067 GetPPException;
2068 newImage=BlueShiftImage(constImage(),factor_,exceptionInfo);
2069 replaceImage(newImage);
2070 ThrowImageException;
2071 }
2072
blur(const double radius_,const double sigma_)2073 void Magick::Image::blur(const double radius_,const double sigma_)
2074 {
2075 MagickCore::Image
2076 *newImage;
2077
2078 GetPPException;
2079 newImage=BlurImage(constImage(),radius_,sigma_,exceptionInfo);
2080 replaceImage(newImage);
2081 ThrowImageException;
2082 }
2083
blurChannel(const ChannelType channel_,const double radius_,const double sigma_)2084 void Magick::Image::blurChannel(const ChannelType channel_,
2085 const double radius_,const double sigma_)
2086 {
2087 MagickCore::Image
2088 *newImage;
2089
2090 GetPPException;
2091 GetAndSetPPChannelMask(channel_);
2092 newImage=BlurImage(constImage(),radius_,sigma_,exceptionInfo);
2093 RestorePPChannelMask;
2094 replaceImage(newImage);
2095 ThrowImageException;
2096 }
2097
border(const Geometry & geometry_)2098 void Magick::Image::border(const Geometry &geometry_)
2099 {
2100 MagickCore::Image
2101 *newImage;
2102
2103 RectangleInfo
2104 borderInfo=geometry_;
2105
2106 GetPPException;
2107 newImage=BorderImage(constImage(),&borderInfo,image()->compose,
2108 exceptionInfo);
2109 replaceImage(newImage);
2110 ThrowImageException;
2111 }
2112
brightnessContrast(const double brightness_,const double contrast_)2113 void Magick::Image::brightnessContrast(const double brightness_,
2114 const double contrast_)
2115 {
2116 modifyImage();
2117 GetPPException;
2118 BrightnessContrastImage(image(),brightness_,contrast_,exceptionInfo);
2119 ThrowImageException;
2120 }
2121
brightnessContrastChannel(const ChannelType channel_,const double brightness_,const double contrast_)2122 void Magick::Image::brightnessContrastChannel(const ChannelType channel_,
2123 const double brightness_,const double contrast_)
2124 {
2125 modifyImage();
2126 GetPPException;
2127 GetAndSetPPChannelMask(channel_);
2128 BrightnessContrastImage(image(),brightness_,contrast_,exceptionInfo);
2129 RestorePPChannelMask;
2130 ThrowImageException;
2131 }
2132
cannyEdge(const double radius_,const double sigma_,const double lowerPercent_,const double upperPercent_)2133 void Magick::Image::cannyEdge(const double radius_,const double sigma_,
2134 const double lowerPercent_,const double upperPercent_)
2135 {
2136 MagickCore::Image
2137 *newImage;
2138
2139 modifyImage();
2140 GetPPException;
2141 newImage=CannyEdgeImage(constImage(),radius_,sigma_,lowerPercent_,
2142 upperPercent_,exceptionInfo);
2143 replaceImage(newImage);
2144 ThrowImageException;
2145 }
2146
cdl(const std::string & cdl_)2147 void Magick::Image::cdl(const std::string &cdl_)
2148 {
2149 modifyImage();
2150 GetPPException;
2151 (void) ColorDecisionListImage(image(),cdl_.c_str(),exceptionInfo);
2152 ThrowImageException;
2153 }
2154
channel(const ChannelType channel_)2155 void Magick::Image::channel(const ChannelType channel_)
2156 {
2157 MagickCore::Image
2158 *newImage;
2159
2160 GetPPException;
2161 newImage=SeparateImage(image(),channel_,exceptionInfo);
2162 replaceImage(newImage);
2163 ThrowImageException;
2164 }
2165
charcoal(const double radius_,const double sigma_)2166 void Magick::Image::charcoal(const double radius_,const double sigma_)
2167 {
2168 MagickCore::Image
2169 *newImage;
2170
2171 GetPPException;
2172 newImage=CharcoalImage(image(),radius_,sigma_,exceptionInfo);
2173 replaceImage(newImage);
2174 ThrowImageException;
2175 }
2176
chop(const Geometry & geometry_)2177 void Magick::Image::chop(const Geometry &geometry_)
2178 {
2179 MagickCore::Image
2180 *newImage;
2181
2182 RectangleInfo
2183 chopInfo=geometry_;
2184
2185 GetPPException;
2186 newImage=ChopImage(image(),&chopInfo,exceptionInfo);
2187 replaceImage(newImage);
2188 ThrowImageException;
2189 }
2190
chromaBluePrimary(const double x_,const double y_,const double z_)2191 void Magick::Image::chromaBluePrimary(const double x_,const double y_,
2192 const double z_)
2193 {
2194 modifyImage();
2195 image()->chromaticity.blue_primary.x=x_;
2196 image()->chromaticity.blue_primary.y=y_;
2197 image()->chromaticity.blue_primary.z=z_;
2198 }
2199
chromaBluePrimary(double * x_,double * y_,double * z_) const2200 void Magick::Image::chromaBluePrimary(double *x_,double *y_,double *z_) const
2201 {
2202 *x_=constImage()->chromaticity.blue_primary.x;
2203 *y_=constImage()->chromaticity.blue_primary.y;
2204 *z_=constImage()->chromaticity.blue_primary.z;
2205 }
2206
chromaGreenPrimary(const double x_,const double y_,const double z_)2207 void Magick::Image::chromaGreenPrimary(const double x_,const double y_,
2208 const double z_)
2209 {
2210 modifyImage();
2211 image()->chromaticity.green_primary.x=x_;
2212 image()->chromaticity.green_primary.y=y_;
2213 image()->chromaticity.green_primary.z=z_;
2214 }
2215
chromaGreenPrimary(double * x_,double * y_,double * z_) const2216 void Magick::Image::chromaGreenPrimary(double *x_,double *y_,double *z_) const
2217 {
2218 *x_=constImage()->chromaticity.green_primary.x;
2219 *y_=constImage()->chromaticity.green_primary.y;
2220 *z_=constImage()->chromaticity.green_primary.z;
2221 }
2222
chromaRedPrimary(const double x_,const double y_,const double z_)2223 void Magick::Image::chromaRedPrimary(const double x_,const double y_,
2224 const double z_)
2225 {
2226 modifyImage();
2227 image()->chromaticity.red_primary.x=x_;
2228 image()->chromaticity.red_primary.y=y_;
2229 image()->chromaticity.red_primary.z=z_;
2230 }
2231
chromaRedPrimary(double * x_,double * y_,double * z_) const2232 void Magick::Image::chromaRedPrimary(double *x_,double *y_,double *z_) const
2233 {
2234 *x_=constImage()->chromaticity.red_primary.x;
2235 *y_=constImage()->chromaticity.red_primary.y;
2236 *z_=constImage()->chromaticity.red_primary.z;
2237 }
2238
chromaWhitePoint(const double x_,const double y_,const double z_)2239 void Magick::Image::chromaWhitePoint(const double x_,const double y_,
2240 const double z_)
2241 {
2242 modifyImage();
2243 image()->chromaticity.white_point.x=x_;
2244 image()->chromaticity.white_point.y=y_;
2245 image()->chromaticity.white_point.z=z_;
2246 }
2247
chromaWhitePoint(double * x_,double * y_,double * z_) const2248 void Magick::Image::chromaWhitePoint(double *x_,double *y_,double *z_) const
2249 {
2250 *x_=constImage()->chromaticity.white_point.x;
2251 *y_=constImage()->chromaticity.white_point.y;
2252 *z_=constImage()->chromaticity.white_point.z;
2253 }
2254
clamp(void)2255 void Magick::Image::clamp(void)
2256 {
2257 modifyImage();
2258 GetPPException;
2259 ClampImage(image(),exceptionInfo);
2260 ThrowImageException;
2261 }
2262
clampChannel(const ChannelType channel_)2263 void Magick::Image::clampChannel(const ChannelType channel_)
2264 {
2265 modifyImage();
2266 GetPPException;
2267 GetAndSetPPChannelMask(channel_);
2268 ClampImage(image(),exceptionInfo);
2269 RestorePPChannelMask;
2270 ThrowImageException;
2271 }
2272
clip(void)2273 void Magick::Image::clip(void)
2274 {
2275 modifyImage();
2276 GetPPException;
2277 ClipImage(image(),exceptionInfo);
2278 ThrowImageException;
2279 }
2280
clipPath(const std::string pathname_,const bool inside_)2281 void Magick::Image::clipPath(const std::string pathname_,const bool inside_)
2282 {
2283 modifyImage();
2284 GetPPException;
2285 ClipImagePath(image(),pathname_.c_str(),(MagickBooleanType) inside_,
2286 exceptionInfo);
2287 ThrowImageException;
2288 }
2289
clut(const Image & clutImage_,const PixelInterpolateMethod method)2290 void Magick::Image::clut(const Image &clutImage_,
2291 const PixelInterpolateMethod method)
2292 {
2293 modifyImage();
2294 GetPPException;
2295 ClutImage(image(),clutImage_.constImage(),method,exceptionInfo);
2296 ThrowImageException;
2297 }
2298
clutChannel(const ChannelType channel_,const Image & clutImage_,const PixelInterpolateMethod method)2299 void Magick::Image::clutChannel(const ChannelType channel_,
2300 const Image &clutImage_,const PixelInterpolateMethod method)
2301 {
2302 modifyImage();
2303 GetPPException;
2304 GetAndSetPPChannelMask(channel_);
2305 ClutImage(image(),clutImage_.constImage(),method,exceptionInfo);
2306 RestorePPChannelMask;
2307 ThrowImageException;
2308 }
2309
colorize(const unsigned int alpha_,const Color & penColor_)2310 void Magick::Image::colorize(const unsigned int alpha_,const Color &penColor_)
2311 {
2312 colorize(alpha_,alpha_,alpha_,penColor_);
2313 }
2314
colorize(const unsigned int alphaRed_,const unsigned int alphaGreen_,const unsigned int alphaBlue_,const Color & penColor_)2315 void Magick::Image::colorize(const unsigned int alphaRed_,
2316 const unsigned int alphaGreen_,const unsigned int alphaBlue_,
2317 const Color &penColor_)
2318 {
2319 char
2320 blend[MagickPathExtent];
2321
2322 MagickCore::Image
2323 *newImage;
2324
2325 PixelInfo
2326 target;
2327
2328 if (!penColor_.isValid())
2329 throwExceptionExplicit(MagickCore::OptionError,
2330 "Pen color argument is invalid");
2331
2332 FormatLocaleString(blend,MagickPathExtent,"%u/%u/%u",alphaRed_,alphaGreen_,
2333 alphaBlue_);
2334
2335 target=static_cast<PixelInfo>(penColor_);
2336 GetPPException;
2337 newImage=ColorizeImage(image(),blend,&target,exceptionInfo);
2338 replaceImage(newImage);
2339 ThrowImageException;
2340 }
2341
colorMap(const size_t index_,const Color & color_)2342 void Magick::Image::colorMap(const size_t index_,const Color &color_)
2343 {
2344 MagickCore::Image
2345 *imageptr;
2346
2347 imageptr=image();
2348
2349 if (index_ > (MaxColormapSize-1))
2350 throwExceptionExplicit(MagickCore::OptionError,
2351 "Colormap index must be less than MaxColormapSize");
2352
2353 if (!color_.isValid())
2354 throwExceptionExplicit(MagickCore::OptionError,
2355 "Color argument is invalid");
2356
2357 modifyImage();
2358
2359 // Ensure that colormap size is large enough
2360 if (colorMapSize() < (index_+1))
2361 colorMapSize(index_+1);
2362
2363 // Set color at index in colormap
2364 (imageptr->colormap)[index_]=color_;
2365 }
2366
colorMap(const size_t index_) const2367 Magick::Color Magick::Image::colorMap(const size_t index_) const
2368 {
2369 if (!constImage()->colormap)
2370 {
2371 throwExceptionExplicit(MagickCore::OptionError,
2372 "Image does not contain a colormap");
2373 return(Color());
2374 }
2375
2376 if (index_ > constImage()->colors-1)
2377 throwExceptionExplicit(MagickCore::OptionError,"Index out of range");
2378
2379 return(Magick::Color((constImage()->colormap)[index_]));
2380 }
2381
colorMatrix(const size_t order_,const double * color_matrix_)2382 void Magick::Image::colorMatrix(const size_t order_,
2383 const double *color_matrix_)
2384 {
2385 KernelInfo
2386 *kernel_info;
2387
2388 GetPPException;
2389 kernel_info=AcquireKernelInfo((const char *) NULL,exceptionInfo);
2390 if (kernel_info != (KernelInfo *) NULL)
2391 {
2392 kernel_info->width=order_;
2393 kernel_info->height=order_;
2394 kernel_info->values=(MagickRealType *) AcquireAlignedMemory(order_,
2395 order_*sizeof(*kernel_info->values));
2396 if (kernel_info->values != (MagickRealType *) NULL)
2397 {
2398 MagickCore::Image
2399 *newImage;
2400
2401 for (ssize_t i=0; i < (ssize_t) (order_*order_); i++)
2402 kernel_info->values[i]=color_matrix_[i];
2403 newImage=ColorMatrixImage(image(),kernel_info,exceptionInfo);
2404 replaceImage(newImage);
2405 }
2406 kernel_info=DestroyKernelInfo(kernel_info);
2407 }
2408 ThrowImageException;
2409 }
2410
compare(const Image & reference_) const2411 bool Magick::Image::compare(const Image &reference_) const
2412 {
2413 bool
2414 status;
2415
2416 Image
2417 ref=reference_;
2418
2419 GetPPException;
2420 status=static_cast<bool>(IsImagesEqual(constImage(),ref.constImage(),
2421 exceptionInfo));
2422 ThrowImageException;
2423 return(status);
2424 }
2425
compare(const Image & reference_,const MetricType metric_)2426 double Magick::Image::compare(const Image &reference_,const MetricType metric_)
2427 {
2428 double
2429 distortion=0.0;
2430
2431 GetPPException;
2432 GetImageDistortion(image(),reference_.constImage(),metric_,&distortion,
2433 exceptionInfo);
2434 ThrowImageException;
2435 return(distortion);
2436 }
2437
compareChannel(const ChannelType channel_,const Image & reference_,const MetricType metric_)2438 double Magick::Image::compareChannel(const ChannelType channel_,
2439 const Image &reference_,const MetricType metric_)
2440 {
2441 double
2442 distortion=0.0;
2443
2444 GetPPException;
2445 GetAndSetPPChannelMask(channel_);
2446 GetImageDistortion(image(),reference_.constImage(),metric_,&distortion,
2447 exceptionInfo);
2448 RestorePPChannelMask;
2449 ThrowImageException;
2450 return(distortion);
2451 }
2452
compare(const Image & reference_,const MetricType metric_,double * distortion)2453 Magick::Image Magick::Image::compare(const Image &reference_,
2454 const MetricType metric_,double *distortion)
2455 {
2456 MagickCore::Image
2457 *newImage;
2458
2459 GetPPException;
2460 newImage=CompareImages(image(),reference_.constImage(),metric_,distortion,
2461 exceptionInfo);
2462 ThrowImageException;
2463 if (newImage == (MagickCore::Image *) NULL)
2464 return(Magick::Image());
2465 else
2466 return(Magick::Image(newImage));
2467 }
2468
compareChannel(const ChannelType channel_,const Image & reference_,const MetricType metric_,double * distortion)2469 Magick::Image Magick::Image::compareChannel(const ChannelType channel_,
2470 const Image &reference_,const MetricType metric_,double *distortion)
2471 {
2472 MagickCore::Image
2473 *newImage;
2474
2475 GetPPException;
2476 GetAndSetPPChannelMask(channel_);
2477 newImage=CompareImages(image(),reference_.constImage(),metric_,distortion,
2478 exceptionInfo);
2479 RestorePPChannelMask;
2480 ThrowImageException;
2481 if (newImage == (MagickCore::Image *) NULL)
2482 return(Magick::Image());
2483 else
2484 return(Magick::Image(newImage));
2485 }
2486
composite(const Image & compositeImage_,const Geometry & offset_,const CompositeOperator compose_)2487 void Magick::Image::composite(const Image &compositeImage_,
2488 const Geometry &offset_,const CompositeOperator compose_)
2489 {
2490 size_t
2491 height=rows(),
2492 width=columns();
2493
2494 ssize_t
2495 x=offset_.xOff(),
2496 y=offset_.yOff();
2497
2498 ParseMetaGeometry(static_cast<std::string>(offset_).c_str(),&x,&y,&width,
2499 &height);
2500
2501 modifyImage();
2502 GetPPException;
2503 CompositeImage(image(),compositeImage_.constImage(),compose_,MagickTrue,
2504 x,y,exceptionInfo);
2505 ThrowImageException;
2506 }
2507
composite(const Image & compositeImage_,const GravityType gravity_,const CompositeOperator compose_)2508 void Magick::Image::composite(const Image &compositeImage_,
2509 const GravityType gravity_,const CompositeOperator compose_)
2510 {
2511 RectangleInfo
2512 geometry;
2513
2514 modifyImage();
2515 SetGeometry(compositeImage_.constImage(),&geometry);
2516 GravityAdjustGeometry(columns(),rows(),gravity_,&geometry);
2517
2518 GetPPException;
2519 CompositeImage(image(),compositeImage_.constImage(),compose_,MagickTrue,
2520 geometry.x,geometry.y,exceptionInfo);
2521 ThrowImageException;
2522 }
2523
composite(const Image & compositeImage_,const ssize_t xOffset_,const ssize_t yOffset_,const CompositeOperator compose_)2524 void Magick::Image::composite(const Image &compositeImage_,
2525 const ssize_t xOffset_,const ssize_t yOffset_,
2526 const CompositeOperator compose_)
2527 {
2528 // Image supplied as compositeImage is composited with current image and
2529 // results in updating current image.
2530 modifyImage();
2531 GetPPException;
2532 CompositeImage(image(),compositeImage_.constImage(),compose_,MagickTrue,
2533 xOffset_,yOffset_,exceptionInfo);
2534 ThrowImageException;
2535 }
2536
connectedComponents(const size_t connectivity_)2537 void Magick::Image::connectedComponents(const size_t connectivity_)
2538 {
2539 MagickCore::Image
2540 *newImage;
2541
2542 GetPPException;
2543 newImage=ConnectedComponentsImage(constImage(),connectivity_,
2544 (CCObjectInfo **) NULL,exceptionInfo);
2545 replaceImage(newImage);
2546 ThrowImageException;
2547 }
2548
contrast(const bool sharpen_)2549 void Magick::Image::contrast(const bool sharpen_)
2550 {
2551 modifyImage();
2552 GetPPException;
2553 ContrastImage(image(),(MagickBooleanType) sharpen_,exceptionInfo);
2554 ThrowImageException;
2555 }
2556
contrastStretch(const double blackPoint_,const double whitePoint_)2557 void Magick::Image::contrastStretch(const double blackPoint_,
2558 const double whitePoint_)
2559 {
2560 modifyImage();
2561 GetPPException;
2562 ContrastStretchImage(image(),blackPoint_,whitePoint_,exceptionInfo);
2563 ThrowImageException;
2564 }
2565
contrastStretchChannel(const ChannelType channel_,const double blackPoint_,const double whitePoint_)2566 void Magick::Image::contrastStretchChannel(const ChannelType channel_,
2567 const double blackPoint_,const double whitePoint_)
2568 {
2569 modifyImage();
2570 GetPPException;
2571 GetAndSetPPChannelMask(channel_);
2572 ContrastStretchImage(image(),blackPoint_,whitePoint_,exceptionInfo);
2573 RestorePPChannelMask;
2574 ThrowImageException;
2575 }
2576
convolve(const size_t order_,const double * kernel_)2577 void Magick::Image::convolve(const size_t order_,const double *kernel_)
2578 {
2579 KernelInfo
2580 *kernel_info;
2581
2582 GetPPException;
2583 kernel_info=AcquireKernelInfo((const char *) NULL,exceptionInfo);
2584 kernel_info->width=order_;
2585 kernel_info->height=order_;
2586 kernel_info->x=(ssize_t) (order_-1)/2;
2587 kernel_info->y=(ssize_t) (order_-1)/2;
2588 kernel_info->values=(MagickRealType *) AcquireAlignedMemory(order_,
2589 order_*sizeof(*kernel_info->values));
2590 if (kernel_info->values != (MagickRealType *) NULL)
2591 {
2592 MagickCore::Image
2593 *newImage;
2594
2595 for (ssize_t i=0; i < (ssize_t) (order_*order_); i++)
2596 kernel_info->values[i]=kernel_[i];
2597 newImage=ConvolveImage(image(),kernel_info,exceptionInfo);
2598 replaceImage(newImage);
2599 }
2600 kernel_info=DestroyKernelInfo(kernel_info);
2601 ThrowImageException;
2602 }
2603
copyPixels(const Image & source_,const Geometry & geometry_,const Offset & offset_)2604 void Magick::Image::copyPixels(const Image &source_,const Geometry &geometry_,
2605 const Offset &offset_)
2606 {
2607 const OffsetInfo
2608 offset=offset_;
2609
2610 const RectangleInfo
2611 geometry=geometry_;
2612
2613 GetPPException;
2614 (void) CopyImagePixels(image(),source_.constImage(),&geometry,&offset,
2615 exceptionInfo);
2616 ThrowImageException;
2617 }
2618
crop(const Geometry & geometry_)2619 void Magick::Image::crop(const Geometry &geometry_)
2620 {
2621 MagickCore::Image
2622 *newImage;
2623
2624 RectangleInfo
2625 cropInfo=geometry_;
2626
2627 GetPPException;
2628 newImage=CropImage(constImage(),&cropInfo,exceptionInfo);
2629 replaceImage(newImage);
2630 ThrowImageException;
2631 }
2632
cycleColormap(const ssize_t amount_)2633 void Magick::Image::cycleColormap(const ssize_t amount_)
2634 {
2635 modifyImage();
2636 GetPPException;
2637 CycleColormapImage(image(),amount_,exceptionInfo);
2638 ThrowImageException;
2639 }
2640
decipher(const std::string & passphrase_)2641 void Magick::Image::decipher(const std::string &passphrase_)
2642 {
2643 modifyImage();
2644 GetPPException;
2645 DecipherImage(image(),passphrase_.c_str(),exceptionInfo);
2646 ThrowImageException;
2647 }
2648
defineSet(const std::string & magick_,const std::string & key_,bool flag_)2649 void Magick::Image::defineSet(const std::string &magick_,
2650 const std::string &key_,bool flag_)
2651 {
2652 std::string
2653 definition;
2654
2655 modifyImage();
2656 definition=magick_ + ":" + key_;
2657 if (flag_)
2658 (void) SetImageOption(imageInfo(),definition.c_str(),"");
2659 else
2660 DeleteImageOption(imageInfo(),definition.c_str());
2661 }
2662
defineSet(const std::string & magick_,const std::string & key_) const2663 bool Magick::Image::defineSet(const std::string &magick_,
2664 const std::string &key_ ) const
2665 {
2666 const char
2667 *option;
2668
2669 std::string
2670 key;
2671
2672 key=magick_ + ":" + key_;
2673 option=GetImageOption(constImageInfo(),key.c_str());
2674 if (option)
2675 return(true);
2676 return(false);
2677 }
2678
defineValue(const std::string & magick_,const std::string & key_,const std::string & value_)2679 void Magick::Image::defineValue(const std::string &magick_,
2680 const std::string &key_,const std::string &value_)
2681 {
2682 std::string
2683 format,
2684 option;
2685
2686 modifyImage();
2687 format=magick_ + ":" + key_;
2688 option=value_;
2689 (void) SetImageOption(imageInfo(),format.c_str(),option.c_str());
2690 }
2691
defineValue(const std::string & magick_,const std::string & key_) const2692 std::string Magick::Image::defineValue(const std::string &magick_,
2693 const std::string &key_) const
2694 {
2695 const char
2696 *option;
2697
2698 std::string
2699 definition;
2700
2701 definition=magick_ + ":" + key_;
2702 option=GetImageOption(constImageInfo(),definition.c_str());
2703 if (option)
2704 return(std::string(option));
2705 return(std::string());
2706 }
2707
deskew(const double threshold_)2708 void Magick::Image::deskew(const double threshold_)
2709 {
2710 MagickCore::Image
2711 *newImage;
2712
2713 GetPPException;
2714 newImage=DeskewImage(constImage(),threshold_,exceptionInfo);
2715 replaceImage(newImage);
2716 ThrowImageException;
2717 }
2718
despeckle(void)2719 void Magick::Image::despeckle(void)
2720 {
2721 MagickCore::Image
2722 *newImage;
2723
2724 GetPPException;
2725 newImage=DespeckleImage(constImage(),exceptionInfo);
2726 replaceImage(newImage);
2727 ThrowImageException;
2728 }
2729
display(void)2730 void Magick::Image::display(void)
2731 {
2732 GetPPException;
2733 DisplayImages(imageInfo(),image(),exceptionInfo);
2734 ThrowImageException;
2735 }
2736
distort(const DistortMethod method_,const size_t numberArguments_,const double * arguments_,const bool bestfit_)2737 void Magick::Image::distort(const DistortMethod method_,
2738 const size_t numberArguments_,const double *arguments_,const bool bestfit_)
2739 {
2740 MagickCore::Image
2741 *newImage;
2742
2743 GetPPException;
2744 newImage=DistortImage(constImage(), method_,numberArguments_,arguments_,
2745 bestfit_ == true ? MagickTrue : MagickFalse,exceptionInfo);
2746 replaceImage(newImage);
2747 ThrowImageException;
2748 }
2749
draw(const Magick::Drawable & drawable_)2750 void Magick::Image::draw(const Magick::Drawable &drawable_)
2751 {
2752 DrawingWand
2753 *wand;
2754
2755 modifyImage();
2756
2757 wand=AcquireDrawingWand(options()->drawInfo(),image());
2758
2759 if(wand)
2760 {
2761 drawable_.operator()(wand);
2762
2763 DrawRender(wand);
2764
2765 ClonePPDrawException(wand);
2766 wand=DestroyDrawingWand(wand);
2767 ThrowPPDrawException(quiet());
2768 }
2769 }
2770
draw(const std::vector<Magick::Drawable> & drawable_)2771 void Magick::Image::draw(const std::vector<Magick::Drawable> &drawable_)
2772 {
2773 DrawingWand
2774 *wand;
2775
2776 modifyImage();
2777
2778 wand= AcquireDrawingWand(options()->drawInfo(),image());
2779
2780 if(wand)
2781 {
2782 for (std::vector<Magick::Drawable>::const_iterator p = drawable_.begin();
2783 p != drawable_.end(); p++ )
2784 {
2785 p->operator()(wand);
2786 if (DrawGetExceptionType(wand) != MagickCore::UndefinedException)
2787 break;
2788 }
2789
2790 if (DrawGetExceptionType(wand) == MagickCore::UndefinedException)
2791 DrawRender(wand);
2792
2793 ClonePPDrawException(wand);
2794 wand=DestroyDrawingWand(wand);
2795 ThrowPPDrawException(quiet());
2796 }
2797 }
2798
edge(const double radius_)2799 void Magick::Image::edge(const double radius_)
2800 {
2801 MagickCore::Image
2802 *newImage;
2803
2804 GetPPException;
2805 newImage=EdgeImage(constImage(),radius_,exceptionInfo);
2806 replaceImage(newImage);
2807 ThrowImageException;
2808 }
2809
emboss(const double radius_,const double sigma_)2810 void Magick::Image::emboss(const double radius_,const double sigma_)
2811 {
2812 MagickCore::Image
2813 *newImage;
2814
2815 GetPPException;
2816 newImage=EmbossImage(constImage(),radius_,sigma_,exceptionInfo);
2817 replaceImage(newImage);
2818 ThrowImageException;
2819 }
2820
encipher(const std::string & passphrase_)2821 void Magick::Image::encipher(const std::string &passphrase_)
2822 {
2823 modifyImage();
2824 GetPPException;
2825 EncipherImage(image(),passphrase_.c_str(),exceptionInfo);
2826 ThrowImageException;
2827 }
2828
enhance(void)2829 void Magick::Image::enhance(void)
2830 {
2831 MagickCore::Image
2832 *newImage;
2833
2834 GetPPException;
2835 newImage=EnhanceImage(constImage(),exceptionInfo);
2836 replaceImage(newImage);
2837 ThrowImageException;
2838 }
2839
equalize(void)2840 void Magick::Image::equalize(void)
2841 {
2842 modifyImage();
2843 GetPPException;
2844 EqualizeImage(image(),exceptionInfo);
2845 ThrowImageException;
2846 }
2847
erase(void)2848 void Magick::Image::erase(void)
2849 {
2850 modifyImage();
2851 GetPPException;
2852 (void) SetImageBackgroundColor(image(),exceptionInfo);
2853 ThrowImageException;
2854 }
2855
evaluate(const ChannelType channel_,const MagickEvaluateOperator operator_,double rvalue_)2856 void Magick::Image::evaluate(const ChannelType channel_,
2857 const MagickEvaluateOperator operator_,double rvalue_)
2858 {
2859 GetPPException;
2860 GetAndSetPPChannelMask(channel_);
2861 EvaluateImage(image(),operator_,rvalue_,exceptionInfo);
2862 RestorePPChannelMask;
2863 ThrowImageException;
2864 }
2865
evaluate(const ChannelType channel_,const MagickFunction function_,const size_t number_parameters_,const double * parameters_)2866 void Magick::Image::evaluate(const ChannelType channel_,
2867 const MagickFunction function_,const size_t number_parameters_,
2868 const double *parameters_)
2869 {
2870 GetPPException;
2871 GetAndSetPPChannelMask(channel_);
2872 FunctionImage(image(),function_,number_parameters_,parameters_,
2873 exceptionInfo);
2874 RestorePPChannelMask;
2875 ThrowImageException;
2876 }
2877
evaluate(const ChannelType channel_,const ssize_t x_,const ssize_t y_,const size_t columns_,const size_t rows_,const MagickEvaluateOperator operator_,const double rvalue_)2878 void Magick::Image::evaluate(const ChannelType channel_,const ssize_t x_,
2879 const ssize_t y_,const size_t columns_,const size_t rows_,
2880 const MagickEvaluateOperator operator_,const double rvalue_)
2881 {
2882 RectangleInfo
2883 geometry;
2884
2885 MagickCore::Image
2886 *cropImage;
2887
2888 geometry.width = columns_;
2889 geometry.height = rows_;
2890 geometry.x = x_;
2891 geometry.y = y_;
2892
2893 GetPPException;
2894 cropImage=CropImage(image(),&geometry,exceptionInfo);
2895 GetAndSetPPChannelMask(channel_);
2896 EvaluateImage(cropImage,operator_,rvalue_,exceptionInfo);
2897 RestorePPChannelMask;
2898 (void) CompositeImage(image(),cropImage,image()->alpha_trait ==
2899 BlendPixelTrait ? OverCompositeOp : CopyCompositeOp,MagickFalse,
2900 geometry.x,geometry.y,exceptionInfo );
2901 cropImage=DestroyImageList(cropImage);
2902 ThrowImageException;
2903 }
2904
extent(const Geometry & geometry_)2905 void Magick::Image::extent(const Geometry &geometry_ )
2906 {
2907 MagickCore::Image
2908 *newImage;
2909
2910 RectangleInfo
2911 extentInfo=geometry_;
2912
2913 modifyImage();
2914 extentInfo.x=geometry_.xOff();
2915 extentInfo.y=geometry_.yOff();
2916 GetPPException;
2917 newImage=ExtentImage(image(),&extentInfo,exceptionInfo);
2918 replaceImage(newImage);
2919 ThrowImageException;
2920 }
2921
extent(const Geometry & geometry_,const Color & backgroundColor_)2922 void Magick::Image::extent(const Geometry &geometry_,
2923 const Color &backgroundColor_)
2924 {
2925 backgroundColor(backgroundColor_);
2926 extent(geometry_);
2927 }
2928
extent(const Geometry & geometry_,const Color & backgroundColor_,const GravityType gravity_)2929 void Magick::Image::extent(const Geometry &geometry_,
2930 const Color &backgroundColor_,const GravityType gravity_)
2931 {
2932 backgroundColor(backgroundColor_);
2933 extent(geometry_,gravity_);
2934 }
2935
extent(const Geometry & geometry_,const GravityType gravity_)2936 void Magick::Image::extent(const Geometry &geometry_,
2937 const GravityType gravity_)
2938 {
2939 RectangleInfo
2940 geometry;
2941
2942 SetGeometry(image(),&geometry);
2943 geometry.width=geometry_.width();
2944 geometry.height=geometry_.height();
2945 GravityAdjustGeometry(image()->columns,image()->rows,gravity_,&geometry);
2946 extent(geometry);
2947 }
2948
flip(void)2949 void Magick::Image::flip(void)
2950 {
2951 MagickCore::Image
2952 *newImage;
2953
2954 GetPPException;
2955 newImage=FlipImage(constImage(),exceptionInfo);
2956 replaceImage(newImage);
2957 ThrowImageException;
2958 }
2959
floodFillAlpha(const ssize_t x_,const ssize_t y_,const unsigned int alpha_,const bool invert_)2960 void Magick::Image::floodFillAlpha(const ssize_t x_,const ssize_t y_,
2961 const unsigned int alpha_,const bool invert_)
2962 {
2963 PixelInfo
2964 target;
2965
2966 modifyImage();
2967
2968 target=static_cast<PixelInfo>(pixelColor(x_,y_));
2969 target.alpha=alpha_;
2970 GetPPException;
2971 GetAndSetPPChannelMask(AlphaChannel);
2972 FloodfillPaintImage(image(),options()->drawInfo(),&target,x_,y_,
2973 (MagickBooleanType)invert_,exceptionInfo);
2974 RestorePPChannelMask;
2975 ThrowImageException;
2976 }
2977
floodFillAlpha(const ssize_t x_,const ssize_t y_,const unsigned int alpha_,const Color & target_,const bool invert_)2978 void Magick::Image::floodFillAlpha(const ssize_t x_,const ssize_t y_,
2979 const unsigned int alpha_,const Color &target_,const bool invert_)
2980 {
2981 PixelInfo
2982 target;
2983
2984 modifyImage();
2985
2986 target=static_cast<PixelInfo>(target_);
2987 target.alpha=alpha_;
2988 GetPPException;
2989 GetAndSetPPChannelMask(AlphaChannel);
2990 FloodfillPaintImage(image(),options()->drawInfo(),&target,x_,y_,
2991 (MagickBooleanType)invert_,exceptionInfo);
2992 RestorePPChannelMask;
2993 ThrowImageException;
2994 }
2995
floodFillColor(const Geometry & point_,const Magick::Color & fillColor_,const bool invert_)2996 void Magick::Image::floodFillColor(const Geometry &point_,
2997 const Magick::Color &fillColor_,const bool invert_)
2998 {
2999 floodFillColor(point_.xOff(),point_.yOff(),fillColor_,invert_);
3000 }
3001
floodFillColor(const ssize_t x_,const ssize_t y_,const Magick::Color & fillColor_,const bool invert_)3002 void Magick::Image::floodFillColor(const ssize_t x_,const ssize_t y_,
3003 const Magick::Color &fillColor_,const bool invert_)
3004 {
3005 PixelInfo
3006 pixel;
3007
3008 modifyImage();
3009
3010 pixel=static_cast<PixelInfo>(pixelColor(x_,y_));
3011 floodFill(x_,y_,(Magick::Image *)NULL,fillColor_,&pixel,invert_);
3012 }
3013
floodFillColor(const Geometry & point_,const Magick::Color & fillColor_,const Magick::Color & borderColor_,const bool invert_)3014 void Magick::Image::floodFillColor(const Geometry &point_,
3015 const Magick::Color &fillColor_,const Magick::Color &borderColor_,
3016 const bool invert_)
3017 {
3018 floodFillColor(point_.xOff(),point_.yOff(),fillColor_,borderColor_,invert_);
3019 }
3020
floodFillColor(const ssize_t x_,const ssize_t y_,const Magick::Color & fillColor_,const Magick::Color & borderColor_,const bool invert_)3021 void Magick::Image::floodFillColor(const ssize_t x_,const ssize_t y_,
3022 const Magick::Color &fillColor_,const Magick::Color &borderColor_,
3023 const bool invert_)
3024 {
3025 PixelInfo
3026 pixel;
3027
3028 modifyImage();
3029
3030 pixel=static_cast<PixelInfo>(borderColor_);
3031 floodFill(x_,y_,(Magick::Image *)NULL,fillColor_,&pixel,invert_);
3032 }
3033
floodFillTexture(const Magick::Geometry & point_,const Magick::Image & texture_,const bool invert_)3034 void Magick::Image::floodFillTexture(const Magick::Geometry &point_,
3035 const Magick::Image &texture_,const bool invert_)
3036 {
3037 floodFillTexture(point_.xOff(),point_.yOff(),texture_,invert_);
3038 }
3039
floodFillTexture(const ssize_t x_,const ssize_t y_,const Magick::Image & texture_,const bool invert_)3040 void Magick::Image::floodFillTexture(const ssize_t x_,const ssize_t y_,
3041 const Magick::Image &texture_,const bool invert_)
3042 {
3043 PixelInfo
3044 pixel;
3045
3046 modifyImage();
3047
3048 pixel=static_cast<PixelInfo>(pixelColor(x_,y_));
3049 floodFill(x_,y_,&texture_,Magick::Color(),&pixel,invert_);
3050 }
3051
floodFillTexture(const Magick::Geometry & point_,const Magick::Image & texture_,const Magick::Color & borderColor_,const bool invert_)3052 void Magick::Image::floodFillTexture(const Magick::Geometry &point_,
3053 const Magick::Image &texture_,const Magick::Color &borderColor_,
3054 const bool invert_)
3055 {
3056 floodFillTexture(point_.xOff(),point_.yOff(),texture_,borderColor_,invert_);
3057 }
3058
floodFillTexture(const ssize_t x_,const ssize_t y_,const Magick::Image & texture_,const Magick::Color & borderColor_,const bool invert_)3059 void Magick::Image::floodFillTexture(const ssize_t x_,const ssize_t y_,
3060 const Magick::Image &texture_,const Magick::Color &borderColor_,
3061 const bool invert_)
3062 {
3063 PixelInfo
3064 pixel;
3065
3066 modifyImage();
3067
3068 pixel=static_cast<PixelInfo>(borderColor_);
3069 floodFill(x_,y_,&texture_,Magick::Color(),&pixel,invert_);
3070 }
3071
flop(void)3072 void Magick::Image::flop(void)
3073 {
3074 MagickCore::Image
3075 *newImage;
3076
3077 GetPPException;
3078 newImage=FlopImage(constImage(),exceptionInfo);
3079 replaceImage(newImage);
3080 ThrowImageException;
3081 }
3082
fontTypeMetrics(const std::string & text_,TypeMetric * metrics)3083 void Magick::Image::fontTypeMetrics(const std::string &text_,
3084 TypeMetric *metrics)
3085 {
3086 DrawInfo
3087 *drawInfo;
3088
3089 drawInfo=options()->drawInfo();
3090 drawInfo->text=const_cast<char *>(text_.c_str());
3091 GetPPException;
3092 GetTypeMetrics(image(),drawInfo,&(metrics->_typeMetric),exceptionInfo);
3093 drawInfo->text=0;
3094 ThrowImageException;
3095 }
3096
fontTypeMetricsMultiline(const std::string & text_,TypeMetric * metrics)3097 void Magick::Image::fontTypeMetricsMultiline(const std::string &text_,
3098 TypeMetric *metrics)
3099 {
3100 DrawInfo
3101 *drawInfo;
3102
3103 drawInfo=options()->drawInfo();
3104 drawInfo->text=const_cast<char *>(text_.c_str());
3105 GetPPException;
3106 GetMultilineTypeMetrics(image(),drawInfo,&(metrics->_typeMetric),exceptionInfo);
3107 drawInfo->text=0;
3108 ThrowImageException;
3109 }
3110
frame(const Geometry & geometry_)3111 void Magick::Image::frame(const Geometry &geometry_)
3112 {
3113 FrameInfo
3114 info;
3115
3116 MagickCore::Image
3117 *newImage;
3118
3119 info.x=static_cast<ssize_t>(geometry_.width());
3120 info.y=static_cast<ssize_t>(geometry_.height());
3121 info.width=columns() + (static_cast<size_t>(info.x) << 1);
3122 info.height=rows() + (static_cast<size_t>(info.y) << 1);
3123 info.outer_bevel=geometry_.xOff();
3124 info.inner_bevel=geometry_.yOff();
3125
3126 GetPPException;
3127 newImage=FrameImage(constImage(),&info,image()->compose,exceptionInfo);
3128 replaceImage(newImage);
3129 ThrowImageException;
3130 }
3131
frame(const size_t width_,const size_t height_,const ssize_t innerBevel_,const ssize_t outerBevel_)3132 void Magick::Image::frame(const size_t width_,const size_t height_,
3133 const ssize_t innerBevel_,const ssize_t outerBevel_)
3134 {
3135 FrameInfo
3136 info;
3137
3138 MagickCore::Image
3139 *newImage;
3140
3141 info.x=static_cast<ssize_t>(width_);
3142 info.y=static_cast<ssize_t>(height_);
3143 info.width=columns() + (static_cast<size_t>(info.x) << 1);
3144 info.height=rows() + (static_cast<size_t>(info.y) << 1);
3145 info.outer_bevel=static_cast<ssize_t>(outerBevel_);
3146 info.inner_bevel=static_cast<ssize_t>(innerBevel_);
3147
3148 GetPPException;
3149 newImage=FrameImage(constImage(),&info,image()->compose,exceptionInfo);
3150 replaceImage(newImage);
3151 ThrowImageException;
3152 }
3153
fx(const std::string expression_)3154 void Magick::Image::fx(const std::string expression_)
3155 {
3156 MagickCore::Image
3157 *newImage;
3158
3159 GetPPException;
3160 newImage=FxImage(constImage(),expression_.c_str(),exceptionInfo);
3161 replaceImage(newImage);
3162 ThrowImageException;
3163 }
3164
fx(const std::string expression_,const Magick::ChannelType channel_)3165 void Magick::Image::fx(const std::string expression_,
3166 const Magick::ChannelType channel_)
3167 {
3168 MagickCore::Image
3169 *newImage;
3170
3171 GetPPException;
3172 GetAndSetPPChannelMask(channel_);
3173 newImage=FxImage(constImage(),expression_.c_str(),exceptionInfo);
3174 RestorePPChannelMask;
3175 replaceImage(newImage);
3176 ThrowImageException;
3177 }
3178
gamma(const double gamma_)3179 void Magick::Image::gamma(const double gamma_)
3180 {
3181 modifyImage();
3182 GetPPException;
3183 GammaImage(image(),gamma_,exceptionInfo);
3184 ThrowImageException;
3185 }
3186
gamma(const double gammaRed_,const double gammaGreen_,const double gammaBlue_)3187 void Magick::Image::gamma(const double gammaRed_,const double gammaGreen_,
3188 const double gammaBlue_)
3189 {
3190 modifyImage();
3191 GetPPException;
3192 GetAndSetPPChannelMask(RedChannel);
3193 (void) GammaImage(image(),gammaRed_,exceptionInfo);
3194 SetPPChannelMask(GreenChannel);
3195 (void) GammaImage(image(),gammaGreen_,exceptionInfo);
3196 SetPPChannelMask(BlueChannel);
3197 (void) GammaImage(image(),gammaBlue_,exceptionInfo);
3198 RestorePPChannelMask;
3199 ThrowImageException;
3200 }
3201
gaussianBlur(const double radius_,const double sigma_)3202 void Magick::Image::gaussianBlur(const double radius_,const double sigma_)
3203 {
3204 MagickCore::Image
3205 *newImage;
3206
3207 GetPPException;
3208 newImage=GaussianBlurImage(constImage(),radius_,sigma_,exceptionInfo);
3209 replaceImage(newImage);
3210 ThrowImageException;
3211 }
3212
gaussianBlurChannel(const ChannelType channel_,const double radius_,const double sigma_)3213 void Magick::Image::gaussianBlurChannel(const ChannelType channel_,
3214 const double radius_,const double sigma_)
3215 {
3216 MagickCore::Image
3217 *newImage;
3218
3219 GetPPException;
3220 GetAndSetPPChannelMask(channel_);
3221 newImage=GaussianBlurImage(constImage(),radius_,sigma_,exceptionInfo);
3222 RestorePPChannelMask;
3223 replaceImage(newImage);
3224 ThrowImageException;
3225 }
3226
getConstPixels(const ssize_t x_,const ssize_t y_,const size_t columns_,const size_t rows_) const3227 const Magick::Quantum *Magick::Image::getConstPixels(const ssize_t x_,
3228 const ssize_t y_,const size_t columns_,const size_t rows_) const
3229 {
3230 const Quantum
3231 *p;
3232
3233 GetPPException;
3234 p=GetVirtualPixels(constImage(),x_, y_,columns_, rows_,exceptionInfo);
3235 ThrowImageException;
3236 return(p);
3237 }
3238
getConstMetacontent(void) const3239 const void *Magick::Image::getConstMetacontent(void) const
3240 {
3241 const void
3242 *result;
3243
3244 result=GetVirtualMetacontent(constImage());
3245
3246 if(!result)
3247 throwExceptionExplicit(MagickCore::OptionError,
3248 "Unable to retrieve meta content.");
3249
3250 return(result);
3251 }
3252
getMetacontent(void)3253 void *Magick::Image::getMetacontent(void )
3254 {
3255 void
3256 *result;
3257
3258 result=GetAuthenticMetacontent(image());
3259
3260 if(!result)
3261 throwExceptionExplicit(MagickCore::OptionError,
3262 "Unable to retrieve meta content.");
3263
3264 return(result);
3265 }
3266
getPixels(const ssize_t x_,const ssize_t y_,const size_t columns_,const size_t rows_)3267 Magick::Quantum *Magick::Image::getPixels(const ssize_t x_,const ssize_t y_,
3268 const size_t columns_,const size_t rows_)
3269 {
3270 Quantum
3271 *result;
3272
3273 modifyImage();
3274 GetPPException;
3275 result=GetAuthenticPixels(image(),x_, y_,columns_,rows_,exceptionInfo);
3276 ThrowImageException;
3277
3278 return(result);
3279 }
3280
grayscale(const PixelIntensityMethod method_)3281 void Magick::Image::grayscale(const PixelIntensityMethod method_)
3282 {
3283 modifyImage();
3284 GetPPException;
3285 (void) GrayscaleImage(image(),method_,exceptionInfo);
3286 ThrowImageException;
3287 }
3288
haldClut(const Image & clutImage_)3289 void Magick::Image::haldClut(const Image &clutImage_)
3290 {
3291 modifyImage();
3292 GetPPException;
3293 (void) HaldClutImage(image(),clutImage_.constImage(),exceptionInfo);
3294 ThrowImageException;
3295 }
3296
houghLine(const size_t width_,const size_t height_,const size_t threshold_)3297 void Magick::Image::houghLine(const size_t width_,const size_t height_,
3298 const size_t threshold_)
3299 {
3300 MagickCore::Image
3301 *newImage;
3302
3303 GetPPException;
3304 newImage=HoughLineImage(constImage(),width_,height_,threshold_,
3305 exceptionInfo);
3306 replaceImage(newImage);
3307 ThrowImageException;
3308 }
3309
identifyType(void) const3310 Magick::ImageType Magick::Image::identifyType(void) const
3311 {
3312 ImageType
3313 image_type;
3314
3315 GetPPException;
3316 image_type=IdentifyImageType(constImage(),exceptionInfo);
3317 ThrowImageException;
3318 return(image_type);
3319 }
3320
implode(const double factor_)3321 void Magick::Image::implode(const double factor_)
3322 {
3323 MagickCore::Image
3324 *newImage;
3325
3326 GetPPException;
3327 newImage=ImplodeImage(constImage(),factor_,image()->interpolate,
3328 exceptionInfo);
3329 replaceImage(newImage);
3330 ThrowImageException;
3331 }
3332
inverseFourierTransform(const Image & phase_)3333 void Magick::Image::inverseFourierTransform(const Image &phase_)
3334 {
3335 inverseFourierTransform(phase_,true);
3336 }
3337
inverseFourierTransform(const Image & phase_,const bool magnitude_)3338 void Magick::Image::inverseFourierTransform(const Image &phase_,
3339 const bool magnitude_)
3340 {
3341 MagickCore::Image
3342 *newImage;
3343
3344 GetPPException;
3345 newImage=InverseFourierTransformImage(constImage(),phase_.constImage(),
3346 magnitude_ == true ? MagickTrue : MagickFalse,exceptionInfo);
3347 replaceImage(newImage);
3348 ThrowImageException;
3349 }
3350
kuwahara(const double radius_,const double sigma_)3351 void Magick::Image::kuwahara(const double radius_,const double sigma_)
3352 {
3353 MagickCore::Image
3354 *newImage;
3355
3356 GetPPException;
3357 newImage=KuwaharaImage(constImage(),radius_,sigma_,exceptionInfo);
3358 replaceImage(newImage);
3359 ThrowImageException;
3360 }
3361
kuwaharaChannel(const ChannelType channel_,const double radius_,const double sigma_)3362 void Magick::Image::kuwaharaChannel(const ChannelType channel_,
3363 const double radius_,const double sigma_)
3364 {
3365 MagickCore::Image
3366 *newImage;
3367
3368 GetPPException;
3369 GetAndSetPPChannelMask(channel_);
3370 newImage=KuwaharaImage(constImage(),radius_,sigma_,exceptionInfo);
3371 replaceImage(newImage);
3372 RestorePPChannelMask;
3373 ThrowImageException;
3374 }
3375
level(const double blackPoint_,const double whitePoint_,const double gamma_)3376 void Magick::Image::level(const double blackPoint_,const double whitePoint_,
3377 const double gamma_)
3378 {
3379 modifyImage();
3380 GetPPException;
3381 (void) LevelImage(image(),blackPoint_,whitePoint_,gamma_,exceptionInfo);
3382 ThrowImageException;
3383 }
3384
levelChannel(const ChannelType channel_,const double blackPoint_,const double whitePoint_,const double gamma_)3385 void Magick::Image::levelChannel(const ChannelType channel_,
3386 const double blackPoint_,const double whitePoint_,const double gamma_)
3387 {
3388 modifyImage();
3389 GetPPException;
3390 GetAndSetPPChannelMask(channel_);
3391 (void) LevelImage(image(),blackPoint_,whitePoint_,gamma_,exceptionInfo);
3392 RestorePPChannelMask;
3393 ThrowImageException;
3394 }
3395
levelColors(const Color & blackColor_,const Color & whiteColor_,const bool invert_)3396 void Magick::Image::levelColors(const Color &blackColor_,
3397 const Color &whiteColor_,const bool invert_)
3398 {
3399 PixelInfo
3400 black,
3401 white;
3402
3403 modifyImage();
3404
3405 black=static_cast<PixelInfo>(blackColor_);
3406 white=static_cast<PixelInfo>(whiteColor_);
3407 GetPPException;
3408 (void) LevelImageColors(image(),&black,&white,invert_ == true ?
3409 MagickTrue : MagickFalse,exceptionInfo);
3410 ThrowImageException;
3411 }
3412
levelColorsChannel(const ChannelType channel_,const Color & blackColor_,const Color & whiteColor_,const bool invert_)3413 void Magick::Image::levelColorsChannel(const ChannelType channel_,
3414 const Color &blackColor_,const Color &whiteColor_,const bool invert_)
3415 {
3416 PixelInfo
3417 black,
3418 white;
3419
3420 modifyImage();
3421
3422 black=static_cast<PixelInfo>(blackColor_);
3423 white=static_cast<PixelInfo>(whiteColor_);
3424 GetPPException;
3425 GetAndSetPPChannelMask(channel_);
3426 (void) LevelImageColors(image(),&black,&white,invert_ == true ?
3427 MagickTrue : MagickFalse,exceptionInfo);
3428 RestorePPChannelMask;
3429 ThrowImageException;
3430 }
3431
levelize(const double blackPoint_,const double whitePoint_,const double gamma_)3432 void Magick::Image::levelize(const double blackPoint_,const double whitePoint_,
3433 const double gamma_)
3434 {
3435 modifyImage();
3436 GetPPException;
3437 (void) LevelizeImage(image(),blackPoint_,whitePoint_,gamma_,exceptionInfo);
3438 ThrowImageException;
3439 }
3440
levelizeChannel(const ChannelType channel_,const double blackPoint_,const double whitePoint_,const double gamma_)3441 void Magick::Image::levelizeChannel(const ChannelType channel_,
3442 const double blackPoint_,const double whitePoint_,const double gamma_)
3443 {
3444 modifyImage();
3445 GetPPException;
3446 GetAndSetPPChannelMask(channel_);
3447 (void) LevelizeImage(image(),blackPoint_,whitePoint_,gamma_,exceptionInfo);
3448 RestorePPChannelMask;
3449 ThrowImageException;
3450 }
3451
linearStretch(const double blackPoint_,const double whitePoint_)3452 void Magick::Image::linearStretch(const double blackPoint_,
3453 const double whitePoint_)
3454 {
3455 modifyImage();
3456 GetPPException;
3457 LinearStretchImage(image(),blackPoint_,whitePoint_,exceptionInfo);
3458 ThrowImageException;
3459 }
3460
liquidRescale(const Geometry & geometry_)3461 void Magick::Image::liquidRescale(const Geometry &geometry_)
3462 {
3463 MagickCore::Image
3464 *newImage;
3465
3466 size_t
3467 height=rows(),
3468 width=columns();
3469
3470 ssize_t
3471 x=0,
3472 y=0;
3473
3474 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
3475 &height);
3476
3477 GetPPException;
3478 newImage=LiquidRescaleImage(image(),width,height,x,y,exceptionInfo);
3479 replaceImage(newImage);
3480 ThrowImageException;
3481 }
3482
localContrast(const double radius_,const double strength_)3483 void Magick::Image::localContrast(const double radius_,const double strength_)
3484 {
3485 MagickCore::Image
3486 *newImage;
3487
3488 GetPPException;
3489 newImage=LocalContrastImage(constImage(),radius_,strength_,exceptionInfo);
3490 replaceImage(newImage);
3491 ThrowImageException;
3492 }
3493
magnify(void)3494 void Magick::Image::magnify(void)
3495 {
3496 MagickCore::Image
3497 *newImage;
3498
3499 GetPPException;
3500 newImage=MagnifyImage(constImage(),exceptionInfo);
3501 replaceImage(newImage);
3502 ThrowImageException;
3503 }
3504
map(const Image & mapImage_,const bool dither_)3505 void Magick::Image::map(const Image &mapImage_,const bool dither_)
3506 {
3507 modifyImage();
3508 GetPPException;
3509 options()->quantizeDither(dither_);
3510 RemapImage(options()->quantizeInfo(),image(),mapImage_.constImage(),
3511 exceptionInfo);
3512 ThrowImageException;
3513 }
3514
medianFilter(const double radius_)3515 void Magick::Image::medianFilter(const double radius_)
3516 {
3517 MagickCore::Image
3518 *newImage;
3519
3520 GetPPException;
3521 newImage=StatisticImage(image(),MedianStatistic,(size_t) radius_,
3522 (size_t) radius_,exceptionInfo);
3523 replaceImage(newImage);
3524 ThrowImageException;
3525 }
3526
minify(void)3527 void Magick::Image::minify(void)
3528 {
3529 MagickCore::Image
3530 *newImage;
3531
3532 GetPPException;
3533 newImage=MinifyImage(constImage(),exceptionInfo);
3534 replaceImage(newImage);
3535 ThrowImageException;
3536 }
3537
modulate(const double brightness_,const double saturation_,const double hue_)3538 void Magick::Image::modulate(const double brightness_,const double saturation_,
3539 const double hue_)
3540 {
3541 char
3542 modulate[MagickPathExtent + 1];
3543
3544 FormatLocaleString(modulate,MagickPathExtent,"%3.6f,%3.6f,%3.6f",brightness_,
3545 saturation_,hue_);
3546
3547 modifyImage();
3548 GetPPException;
3549 ModulateImage(image(),modulate,exceptionInfo);
3550 ThrowImageException;
3551 }
3552
moments(void) const3553 Magick::ImageMoments Magick::Image::moments(void) const
3554 {
3555 return(ImageMoments(*this));
3556 }
3557
morphology(const MorphologyMethod method_,const std::string kernel_,const ssize_t iterations_)3558 void Magick::Image::morphology(const MorphologyMethod method_,
3559 const std::string kernel_,const ssize_t iterations_)
3560 {
3561 KernelInfo
3562 *kernel;
3563
3564 MagickCore::Image
3565 *newImage;
3566
3567 GetPPException;
3568 kernel=AcquireKernelInfo(kernel_.c_str(),exceptionInfo);
3569 if (kernel == (KernelInfo *) NULL)
3570 throwExceptionExplicit(MagickCore::OptionError,"Unable to parse kernel.");
3571 newImage=MorphologyImage(constImage(),method_,iterations_,kernel,
3572 exceptionInfo);
3573 replaceImage(newImage);
3574 kernel=DestroyKernelInfo(kernel);
3575 ThrowImageException;
3576 }
3577
morphology(const MorphologyMethod method_,const KernelInfoType kernel_,const std::string arguments_,const ssize_t iterations_)3578 void Magick::Image::morphology(const MorphologyMethod method_,
3579 const KernelInfoType kernel_,const std::string arguments_,
3580 const ssize_t iterations_)
3581 {
3582 const char
3583 *option;
3584
3585 std::string
3586 kernel;
3587
3588 option=CommandOptionToMnemonic(MagickKernelOptions,kernel_);
3589 if (option == (const char *)NULL)
3590 {
3591 throwExceptionExplicit(MagickCore::OptionError,
3592 "Unable to determine kernel type.");
3593 return;
3594 }
3595 kernel=std::string(option);
3596 if (!arguments_.empty())
3597 kernel+=":"+arguments_;
3598
3599 morphology(method_,kernel,iterations_);
3600 }
3601
morphologyChannel(const ChannelType channel_,const MorphologyMethod method_,const std::string kernel_,const ssize_t iterations_)3602 void Magick::Image::morphologyChannel(const ChannelType channel_,
3603 const MorphologyMethod method_,const std::string kernel_,
3604 const ssize_t iterations_)
3605 {
3606 KernelInfo
3607 *kernel;
3608
3609 MagickCore::Image
3610 *newImage;
3611
3612
3613 GetPPException;
3614 kernel=AcquireKernelInfo(kernel_.c_str(),exceptionInfo);
3615 if (kernel == (KernelInfo *)NULL)
3616 {
3617 throwExceptionExplicit(MagickCore::OptionError,
3618 "Unable to parse kernel.");
3619 return;
3620 }
3621 GetAndSetPPChannelMask(channel_);
3622 newImage=MorphologyImage(constImage(),method_,iterations_,kernel,
3623 exceptionInfo);
3624 RestorePPChannelMask;
3625 replaceImage(newImage);
3626 kernel=DestroyKernelInfo(kernel);
3627 ThrowImageException;
3628 }
3629
morphologyChannel(const ChannelType channel_,const MorphologyMethod method_,const KernelInfoType kernel_,const std::string arguments_,const ssize_t iterations_)3630 void Magick::Image::morphologyChannel(const ChannelType channel_,
3631 const MorphologyMethod method_,const KernelInfoType kernel_,
3632 const std::string arguments_,const ssize_t iterations_)
3633 {
3634 const char
3635 *option;
3636
3637 std::string
3638 kernel;
3639
3640 option=CommandOptionToMnemonic(MagickKernelOptions,kernel_);
3641 if (option == (const char *)NULL)
3642 {
3643 throwExceptionExplicit(MagickCore::OptionError,
3644 "Unable to determine kernel type.");
3645 return;
3646 }
3647
3648 kernel=std::string(option);
3649 if (!arguments_.empty())
3650 kernel+=":"+arguments_;
3651
3652 morphologyChannel(channel_,method_,kernel,iterations_);
3653 }
3654
motionBlur(const double radius_,const double sigma_,const double angle_)3655 void Magick::Image::motionBlur(const double radius_,const double sigma_,
3656 const double angle_)
3657 {
3658 MagickCore::Image
3659 *newImage;
3660
3661 GetPPException;
3662 newImage=MotionBlurImage(constImage(),radius_,sigma_,angle_,exceptionInfo);
3663 replaceImage(newImage);
3664 ThrowImageException;
3665 }
3666
negate(const bool grayscale_)3667 void Magick::Image::negate(const bool grayscale_)
3668 {
3669 modifyImage();
3670 GetPPException;
3671 NegateImage(image(),(MagickBooleanType) grayscale_,exceptionInfo);
3672 ThrowImageException;
3673 }
3674
negateChannel(const ChannelType channel_,const bool grayscale_)3675 void Magick::Image::negateChannel(const ChannelType channel_,
3676 const bool grayscale_)
3677 {
3678 modifyImage();
3679 GetPPException;
3680 GetAndSetPPChannelMask(channel_);
3681 NegateImage(image(),(MagickBooleanType) grayscale_,exceptionInfo);
3682 RestorePPChannelMask;
3683 ThrowImageException;
3684 }
3685
normalize(void)3686 void Magick::Image::normalize(void)
3687 {
3688 modifyImage();
3689 GetPPException;
3690 NormalizeImage(image(),exceptionInfo);
3691 ThrowImageException;
3692 }
3693
oilPaint(const double radius_,const double sigma_)3694 void Magick::Image::oilPaint(const double radius_,const double sigma_)
3695 {
3696 MagickCore::Image
3697 *newImage;
3698
3699 GetPPException;
3700 newImage=OilPaintImage(constImage(),radius_,sigma_,exceptionInfo);
3701 replaceImage(newImage);
3702 ThrowImageException;
3703 }
3704
opaque(const Color & opaqueColor_,const Color & penColor_,const bool invert_)3705 void Magick::Image::opaque(const Color &opaqueColor_,const Color &penColor_,
3706 const bool invert_)
3707 {
3708 std::string
3709 opaqueColor,
3710 penColor;
3711
3712 PixelInfo
3713 opaque,
3714 pen;
3715
3716 if (!opaqueColor_.isValid())
3717 throwExceptionExplicit(MagickCore::OptionError,
3718 "Opaque color argument is invalid");
3719
3720 if (!penColor_.isValid())
3721 throwExceptionExplicit(MagickCore::OptionError,
3722 "Pen color argument is invalid");
3723
3724 modifyImage();
3725 opaqueColor=opaqueColor_;
3726 penColor=penColor_;
3727
3728 GetPPException;
3729 (void) QueryColorCompliance(opaqueColor.c_str(),AllCompliance,&opaque,
3730 exceptionInfo);
3731 (void) QueryColorCompliance(penColor.c_str(),AllCompliance,&pen,
3732 exceptionInfo);
3733 OpaquePaintImage(image(),&opaque,&pen,invert_ ? MagickTrue : MagickFalse,
3734 exceptionInfo);
3735 ThrowImageException;
3736 }
3737
orderedDither(std::string thresholdMap_)3738 void Magick::Image::orderedDither(std::string thresholdMap_)
3739 {
3740 modifyImage();
3741 GetPPException;
3742 (void) OrderedDitherImage(image(),thresholdMap_.c_str(),exceptionInfo);
3743 ThrowImageException;
3744 }
3745
orderedDitherChannel(const ChannelType channel_,std::string thresholdMap_)3746 void Magick::Image::orderedDitherChannel(const ChannelType channel_,
3747 std::string thresholdMap_)
3748 {
3749 modifyImage();
3750 GetPPException;
3751 GetAndSetPPChannelMask(channel_);
3752 (void)OrderedDitherImage(image(),thresholdMap_.c_str(),exceptionInfo);
3753 RestorePPChannelMask;
3754 ThrowImageException;
3755 }
3756
perceptible(const double epsilon_)3757 void Magick::Image::perceptible(const double epsilon_)
3758 {
3759 modifyImage();
3760 GetPPException;
3761 PerceptibleImage(image(),epsilon_,exceptionInfo);
3762 ThrowImageException;
3763 }
3764
perceptibleChannel(const ChannelType channel_,const double epsilon_)3765 void Magick::Image::perceptibleChannel(const ChannelType channel_,
3766 const double epsilon_)
3767 {
3768 modifyImage();
3769 GetPPException;
3770 GetAndSetPPChannelMask(channel_);
3771 PerceptibleImage(image(),epsilon_,exceptionInfo);
3772 RestorePPChannelMask;
3773 ThrowImageException;
3774 }
3775
perceptualHash() const3776 Magick::ImagePerceptualHash Magick::Image::perceptualHash() const
3777 {
3778 return(ImagePerceptualHash(*this));
3779 }
3780
ping(const std::string & imageSpec_)3781 void Magick::Image::ping(const std::string &imageSpec_)
3782 {
3783 MagickCore::Image
3784 *newImage;
3785
3786 GetPPException;
3787 options()->fileName(imageSpec_);
3788 newImage=PingImage(imageInfo(),exceptionInfo);
3789 read(newImage,exceptionInfo);
3790 }
3791
ping(const Blob & blob_)3792 void Magick::Image::ping(const Blob& blob_)
3793 {
3794 MagickCore::Image
3795 *newImage;
3796
3797 GetPPException;
3798 newImage=PingBlob(imageInfo(),blob_.data(),blob_.length(),exceptionInfo);
3799 read(newImage,exceptionInfo);
3800 }
3801
pixelColor(const ssize_t x_,const ssize_t y_,const Color & color_)3802 void Magick::Image::pixelColor(const ssize_t x_,const ssize_t y_,
3803 const Color &color_)
3804 {
3805 PixelInfo
3806 packet;
3807
3808 Quantum
3809 *pixel;
3810
3811 // Test arguments to ensure they are within the image.
3812 if (y_ > (ssize_t) rows() || x_ > (ssize_t) columns())
3813 throwExceptionExplicit(MagickCore::OptionError,
3814 "Access outside of image boundary");
3815
3816 modifyImage();
3817
3818 // Set image to DirectClass
3819 classType(DirectClass );
3820
3821 // Get pixel view
3822 Pixels pixels(*this);
3823 // Set pixel value
3824 pixel=pixels.get(x_, y_, 1, 1 );
3825 packet=color_;
3826 MagickCore::SetPixelViaPixelInfo(constImage(),&packet,pixel);
3827 // Tell ImageMagick that pixels have been updated
3828 pixels.sync();
3829 }
3830
pixelColor(const ssize_t x_,const ssize_t y_) const3831 Magick::Color Magick::Image::pixelColor(const ssize_t x_,
3832 const ssize_t y_) const
3833 {
3834 const Quantum
3835 *pixel;
3836
3837 pixel=getConstPixels(x_,y_,1,1);
3838 if (pixel)
3839 {
3840 PixelInfo
3841 packet;
3842
3843 MagickCore::GetPixelInfoPixel(constImage(),pixel,&packet);
3844 return(Color(packet));
3845 }
3846
3847 return(Color()); // invalid
3848 }
3849
polaroid(const std::string & caption_,const double angle_,const PixelInterpolateMethod method_)3850 void Magick::Image::polaroid(const std::string &caption_,const double angle_,
3851 const PixelInterpolateMethod method_)
3852 {
3853 MagickCore::Image
3854 *newImage;
3855
3856 GetPPException;
3857 newImage=PolaroidImage(constImage(),options()->drawInfo(),caption_.c_str(),
3858 angle_,method_,exceptionInfo);
3859 replaceImage(newImage);
3860 ThrowImageException;
3861 }
3862
posterize(const size_t levels_,const DitherMethod method_)3863 void Magick::Image::posterize(const size_t levels_,const DitherMethod method_)
3864 {
3865 modifyImage();
3866 GetPPException;
3867 PosterizeImage(image(),levels_,method_,exceptionInfo);
3868 ThrowImageException;
3869 }
3870
posterizeChannel(const ChannelType channel_,const size_t levels_,const DitherMethod method_)3871 void Magick::Image::posterizeChannel(const ChannelType channel_,
3872 const size_t levels_,const DitherMethod method_)
3873 {
3874 modifyImage();
3875 GetPPException;
3876 GetAndSetPPChannelMask(channel_);
3877 PosterizeImage(image(),levels_,method_,exceptionInfo);
3878 RestorePPChannelMask;
3879 ThrowImageException;
3880 }
3881
process(std::string name_,const ssize_t argc,const char ** argv)3882 void Magick::Image::process(std::string name_,const ssize_t argc,
3883 const char **argv)
3884 {
3885 modifyImage();
3886
3887 GetPPException;
3888 (void) InvokeDynamicImageFilter(name_.c_str(),&image(),argc,argv,
3889 exceptionInfo);
3890 ThrowImageException;
3891 }
3892
profile(const std::string name_,const Magick::Blob & profile_)3893 void Magick::Image::profile(const std::string name_,
3894 const Magick::Blob &profile_)
3895 {
3896 modifyImage();
3897 GetPPException;
3898 (void) ProfileImage(image(),name_.c_str(),(unsigned char *)profile_.data(),
3899 profile_.length(),exceptionInfo);
3900 ThrowImageException;
3901 }
3902
profile(const std::string name_) const3903 Magick::Blob Magick::Image::profile(const std::string name_) const
3904 {
3905 const StringInfo
3906 *profile;
3907
3908 profile=GetImageProfile(constImage(),name_.c_str());
3909
3910 if (profile == (StringInfo *) NULL)
3911 return(Blob());
3912 return(Blob((void*) GetStringInfoDatum(profile),GetStringInfoLength(
3913 profile)));
3914 }
3915
quantize(const bool measureError_)3916 void Magick::Image::quantize(const bool measureError_)
3917 {
3918 modifyImage();
3919
3920 if (measureError_)
3921 options()->quantizeInfo()->measure_error=MagickTrue;
3922 else
3923 options()->quantizeInfo()->measure_error=MagickFalse;
3924
3925 GetPPException;
3926 QuantizeImage(options()->quantizeInfo(),image(),exceptionInfo);
3927 ThrowImageException;
3928 }
3929
raise(const Geometry & geometry_,const bool raisedFlag_)3930 void Magick::Image::raise(const Geometry &geometry_,const bool raisedFlag_)
3931 {
3932 RectangleInfo
3933 raiseInfo=geometry_;
3934
3935 GetPPException;
3936 modifyImage();
3937 RaiseImage(image(),&raiseInfo,raisedFlag_ == true ? MagickTrue : MagickFalse,
3938 exceptionInfo);
3939 ThrowImageException;
3940 }
3941
randomThreshold(const double low_,const double high_)3942 void Magick::Image::randomThreshold(const double low_,const double high_)
3943 {
3944 GetPPException;
3945 (void) RandomThresholdImage(image(),low_,high_,exceptionInfo);
3946 ThrowImageException;
3947 }
3948
randomThresholdChannel(const ChannelType channel_,const double low_,const double high_)3949 void Magick::Image::randomThresholdChannel(const ChannelType channel_,
3950 const double low_,const double high_)
3951 {
3952 modifyImage();
3953 GetPPException;
3954 GetAndSetPPChannelMask(channel_);
3955 (void) RandomThresholdImage(image(),low_,high_,exceptionInfo);
3956 RestorePPChannelMask;
3957 ThrowImageException;
3958 }
3959
read(const Blob & blob_)3960 void Magick::Image::read(const Blob &blob_)
3961 {
3962 MagickCore::Image
3963 *newImage;
3964
3965 GetPPException;
3966 newImage=BlobToImage(imageInfo(),static_cast<const void *>(blob_.data()),
3967 blob_.length(),exceptionInfo);
3968 read(newImage,exceptionInfo);
3969 }
3970
read(const Blob & blob_,const Geometry & size_)3971 void Magick::Image::read(const Blob &blob_,const Geometry &size_)
3972 {
3973 size(size_);
3974 read(blob_);
3975 }
3976
read(const Blob & blob_,const Geometry & size_,const size_t depth_)3977 void Magick::Image::read(const Blob &blob_,const Geometry &size_,
3978 const size_t depth_)
3979 {
3980 size(size_);
3981 depth(depth_);
3982 read(blob_);
3983 }
3984
read(const Blob & blob_,const Geometry & size_,const size_t depth_,const std::string & magick_)3985 void Magick::Image::read(const Blob &blob_,const Geometry &size_,
3986 const size_t depth_,const std::string &magick_)
3987 {
3988 size(size_);
3989 depth(depth_);
3990 magick(magick_);
3991 // Set explicit image format
3992 fileName(magick_ + ':');
3993 read(blob_);
3994 }
3995
read(const Blob & blob_,const Geometry & size_,const std::string & magick_)3996 void Magick::Image::read(const Blob &blob_,const Geometry &size_,
3997 const std::string &magick_)
3998 {
3999 size(size_);
4000 magick(magick_);
4001 // Set explicit image format
4002 fileName(magick_ + ':');
4003 read(blob_);
4004 }
4005
read(const Geometry & size_,const std::string & imageSpec_)4006 void Magick::Image::read(const Geometry &size_,const std::string &imageSpec_)
4007 {
4008 size(size_);
4009 read(imageSpec_);
4010 }
4011
read(const size_t width_,const size_t height_,const std::string & map_,const StorageType type_,const void * pixels_)4012 void Magick::Image::read(const size_t width_,const size_t height_,
4013 const std::string &map_,const StorageType type_,const void *pixels_)
4014 {
4015 MagickCore::Image
4016 *newImage;
4017
4018 GetPPException;
4019 newImage=ConstituteImage(width_,height_,map_.c_str(),type_, pixels_,
4020 exceptionInfo);
4021 replaceImage(newImage);
4022 ThrowImageException;
4023 }
4024
read(const std::string & imageSpec_)4025 void Magick::Image::read(const std::string &imageSpec_)
4026 {
4027 MagickCore::Image
4028 *newImage;
4029
4030 GetPPException;
4031 options()->fileName(imageSpec_);
4032 newImage=ReadImage(imageInfo(),exceptionInfo);
4033 read(newImage,exceptionInfo);
4034 }
4035
readMask(const Magick::Image & mask_)4036 void Magick::Image::readMask(const Magick::Image &mask_)
4037 {
4038 mask(mask_,ReadPixelMask);
4039 }
4040
readMask(void) const4041 Magick::Image Magick::Image::readMask(void) const
4042 {
4043 return(mask(ReadPixelMask));
4044 }
4045
readPixels(const Magick::QuantumType quantum_,const unsigned char * source_)4046 void Magick::Image::readPixels(const Magick::QuantumType quantum_,
4047 const unsigned char *source_)
4048 {
4049 QuantumInfo
4050 *quantum_info;
4051
4052 quantum_info=AcquireQuantumInfo(imageInfo(),image());
4053 GetPPException;
4054 ImportQuantumPixels(image(),(MagickCore::CacheView *) NULL,quantum_info,
4055 quantum_,source_,exceptionInfo);
4056 quantum_info=DestroyQuantumInfo(quantum_info);
4057 ThrowImageException;
4058 }
4059
reduceNoise(void)4060 void Magick::Image::reduceNoise(void)
4061 {
4062 reduceNoise(3);
4063 }
4064
reduceNoise(const size_t order_)4065 void Magick::Image::reduceNoise(const size_t order_)
4066 {
4067 MagickCore::Image
4068 *newImage;
4069
4070 GetPPException;
4071 newImage=StatisticImage(constImage(),NonpeakStatistic,order_,
4072 order_,exceptionInfo);
4073 replaceImage(newImage);
4074 ThrowImageException;
4075 }
4076
repage()4077 void Magick::Image::repage()
4078 {
4079 modifyImage();
4080 options()->page(Geometry());
4081 image()->page.width = 0;
4082 image()->page.height = 0;
4083 image()->page.x = 0;
4084 image()->page.y = 0;
4085 }
4086
resample(const Point & density_)4087 void Magick::Image::resample(const Point &density_)
4088 {
4089 MagickCore::Image
4090 *newImage;
4091
4092 GetPPException;
4093 newImage=ResampleImage(constImage(),density_.x(),density_.y(),
4094 image()->filter,exceptionInfo);
4095 replaceImage(newImage);
4096 ThrowImageException;
4097 }
4098
resize(const Geometry & geometry_)4099 void Magick::Image::resize(const Geometry &geometry_)
4100 {
4101 MagickCore::Image
4102 *newImage;
4103
4104 size_t
4105 height=rows(),
4106 width=columns();
4107
4108 ssize_t
4109 x=0,
4110 y=0;
4111
4112 // Calculate new size. This code should be supported using binary arguments
4113 // in the ImageMagick library.
4114 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
4115 &height);
4116
4117 GetPPException;
4118 newImage=ResizeImage(constImage(),width,height,image()->filter,
4119 exceptionInfo);
4120 replaceImage(newImage);
4121 ThrowImageException;
4122 }
4123
roll(const Geometry & roll_)4124 void Magick::Image::roll(const Geometry &roll_)
4125 {
4126 MagickCore::Image
4127 *newImage;
4128
4129 GetPPException;
4130 newImage=RollImage(constImage(),roll_.xOff(),roll_.yOff(),exceptionInfo);
4131 replaceImage(newImage);
4132 ThrowImageException;
4133 }
4134
roll(const size_t columns_,const size_t rows_)4135 void Magick::Image::roll(const size_t columns_,const size_t rows_)
4136 {
4137 MagickCore::Image
4138 *newImage;
4139
4140 GetPPException;
4141 newImage=RollImage(constImage(),static_cast<ssize_t>(columns_),
4142 static_cast<ssize_t>(rows_),exceptionInfo);
4143 replaceImage(newImage);
4144 ThrowImageException;
4145 }
4146
rotate(const double degrees_)4147 void Magick::Image::rotate(const double degrees_)
4148 {
4149 MagickCore::Image
4150 *newImage;
4151
4152 GetPPException;
4153 newImage=RotateImage(constImage(),degrees_,exceptionInfo);
4154 replaceImage(newImage);
4155 ThrowImageException;
4156 }
4157
rotationalBlur(const double angle_)4158 void Magick::Image::rotationalBlur(const double angle_)
4159 {
4160 MagickCore::Image
4161 *newImage;
4162
4163 GetPPException;
4164 newImage=RotationalBlurImage(constImage(),angle_,exceptionInfo);
4165 replaceImage(newImage);
4166 ThrowImageException;
4167 }
4168
rotationalBlurChannel(const ChannelType channel_,const double angle_)4169 void Magick::Image::rotationalBlurChannel(const ChannelType channel_,
4170 const double angle_)
4171 {
4172 MagickCore::Image
4173 *newImage;
4174
4175 GetPPException;
4176 GetAndSetPPChannelMask(channel_);
4177 newImage=RotationalBlurImage(constImage(),angle_,exceptionInfo);
4178 RestorePPChannelMask;
4179 replaceImage(newImage);
4180 ThrowImageException;
4181 }
4182
sample(const Geometry & geometry_)4183 void Magick::Image::sample(const Geometry &geometry_)
4184 {
4185 MagickCore::Image
4186 *newImage;
4187
4188 size_t
4189 height=rows(),
4190 width=columns();
4191
4192 ssize_t
4193 x=0,
4194 y=0;
4195
4196 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
4197 &height);
4198
4199 GetPPException;
4200 newImage=SampleImage(constImage(),width,height,exceptionInfo);
4201 replaceImage(newImage);
4202 ThrowImageException;
4203 }
4204
scale(const Geometry & geometry_)4205 void Magick::Image::scale(const Geometry &geometry_)
4206 {
4207 MagickCore::Image
4208 *newImage;
4209
4210 size_t
4211 height=rows(),
4212 width=columns();
4213
4214 ssize_t
4215 x=0,
4216 y=0;
4217
4218 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
4219 &height);
4220
4221 GetPPException;
4222 newImage=ScaleImage(constImage(),width,height,exceptionInfo);
4223 replaceImage(newImage);
4224 ThrowImageException;
4225 }
4226
segment(const double clusterThreshold_,const double smoothingThreshold_)4227 void Magick::Image::segment(const double clusterThreshold_,
4228 const double smoothingThreshold_)
4229 {
4230 modifyImage();
4231 GetPPException;
4232 SegmentImage(image(),options()->quantizeColorSpace(),
4233 (MagickBooleanType) options()->verbose(),clusterThreshold_,
4234 smoothingThreshold_,exceptionInfo);
4235 SyncImage(image(),exceptionInfo);
4236 ThrowImageException;
4237 }
4238
selectiveBlur(const double radius_,const double sigma_,const double threshold_)4239 void Magick::Image::selectiveBlur(const double radius_,const double sigma_,
4240 const double threshold_)
4241 {
4242 MagickCore::Image
4243 *newImage;
4244
4245 GetPPException;
4246 newImage=SelectiveBlurImage(constImage(),radius_,sigma_,threshold_,
4247 exceptionInfo);
4248 replaceImage(newImage);
4249 ThrowImageException;
4250 }
4251
selectiveBlurChannel(const ChannelType channel_,const double radius_,const double sigma_,const double threshold_)4252 void Magick::Image::selectiveBlurChannel(const ChannelType channel_,
4253 const double radius_,const double sigma_,const double threshold_)
4254 {
4255 MagickCore::Image
4256 *newImage;
4257
4258 GetPPException;
4259 GetAndSetPPChannelMask(channel_);
4260 newImage=SelectiveBlurImage(constImage(),radius_,sigma_,threshold_,
4261 exceptionInfo);
4262 RestorePPChannelMask;
4263 replaceImage(newImage);
4264 ThrowImageException;
4265 }
4266
separate(const ChannelType channel_) const4267 Magick::Image Magick::Image::separate(const ChannelType channel_) const
4268 {
4269 MagickCore::Image
4270 *image;
4271
4272 GetPPException;
4273 image=SeparateImage(constImage(),channel_,exceptionInfo);
4274 ThrowImageException;
4275 if (image == (MagickCore::Image *) NULL)
4276 return(Magick::Image());
4277 else
4278 return(Magick::Image(image));
4279 }
4280
sepiaTone(const double threshold_)4281 void Magick::Image::sepiaTone(const double threshold_)
4282 {
4283 MagickCore::Image
4284 *newImage;
4285
4286 GetPPException;
4287 newImage=SepiaToneImage(constImage(),threshold_,exceptionInfo);
4288 replaceImage(newImage);
4289 ThrowImageException;
4290 }
4291
setColorMetric(const Image & reference_)4292 bool Magick::Image::setColorMetric(const Image &reference_)
4293 {
4294 bool
4295 status;
4296
4297 Image
4298 ref=reference_;
4299
4300 GetPPException;
4301 modifyImage();
4302 status=static_cast<bool>(SetImageColorMetric(image(),ref.constImage(),
4303 exceptionInfo));
4304 ThrowImageException;
4305 return(status);
4306 }
4307
setPixels(const ssize_t x_,const ssize_t y_,const size_t columns_,const size_t rows_)4308 Magick::Quantum *Magick::Image::setPixels(const ssize_t x_,const ssize_t y_,
4309 const size_t columns_,const size_t rows_)
4310 {
4311 Quantum
4312 *result;
4313
4314 modifyImage();
4315 GetPPException;
4316 result=QueueAuthenticPixels(image(),x_,y_,columns_,rows_,exceptionInfo);
4317 ThrowImageException;
4318 return(result);
4319 }
4320
shade(const double azimuth_,const double elevation_,const bool colorShading_)4321 void Magick::Image::shade(const double azimuth_,const double elevation_,
4322 const bool colorShading_)
4323 {
4324 MagickCore::Image
4325 *newImage;
4326
4327 GetPPException;
4328 newImage=ShadeImage(constImage(),colorShading_ == true ?
4329 MagickTrue : MagickFalse,azimuth_,elevation_,exceptionInfo);
4330 replaceImage(newImage);
4331 ThrowImageException;
4332 }
4333
shadow(const double percent_opacity_,const double sigma_,const ssize_t x_,const ssize_t y_)4334 void Magick::Image::shadow(const double percent_opacity_,const double sigma_,
4335 const ssize_t x_,const ssize_t y_)
4336 {
4337 MagickCore::Image
4338 *newImage;
4339
4340 GetPPException;
4341 newImage=ShadowImage(constImage(),percent_opacity_, sigma_,x_, y_,
4342 exceptionInfo);
4343 replaceImage(newImage);
4344 ThrowImageException;
4345 }
4346
sharpen(const double radius_,const double sigma_)4347 void Magick::Image::sharpen(const double radius_,const double sigma_)
4348 {
4349 MagickCore::Image
4350 *newImage;
4351
4352 GetPPException;
4353 newImage=SharpenImage(constImage(),radius_,sigma_,exceptionInfo);
4354 replaceImage(newImage);
4355 ThrowImageException;
4356 }
4357
sharpenChannel(const ChannelType channel_,const double radius_,const double sigma_)4358 void Magick::Image::sharpenChannel(const ChannelType channel_,
4359 const double radius_,const double sigma_)
4360 {
4361 MagickCore::Image
4362 *newImage;
4363
4364 GetPPException;
4365 GetAndSetPPChannelMask(channel_);
4366 newImage=SharpenImage(constImage(),radius_,sigma_,exceptionInfo);
4367 RestorePPChannelMask;
4368 replaceImage(newImage);
4369 ThrowImageException;
4370 }
4371
shave(const Geometry & geometry_)4372 void Magick::Image::shave(const Geometry &geometry_)
4373 {
4374 MagickCore::Image
4375 *newImage;
4376
4377 RectangleInfo
4378 shaveInfo=geometry_;
4379
4380 GetPPException;
4381 newImage=ShaveImage(constImage(),&shaveInfo,exceptionInfo);
4382 replaceImage(newImage);
4383 ThrowImageException;
4384 }
4385
shear(const double xShearAngle_,const double yShearAngle_)4386 void Magick::Image::shear(const double xShearAngle_,const double yShearAngle_)
4387 {
4388 MagickCore::Image
4389 *newImage;
4390
4391 GetPPException;
4392 newImage=ShearImage(constImage(),xShearAngle_,yShearAngle_,exceptionInfo);
4393 replaceImage(newImage);
4394 ThrowImageException;
4395 }
4396
sigmoidalContrast(const bool sharpen_,const double contrast,const double midpoint)4397 void Magick::Image::sigmoidalContrast(const bool sharpen_,
4398 const double contrast,const double midpoint)
4399 {
4400 modifyImage();
4401 GetPPException;
4402 (void) SigmoidalContrastImage(image(),(MagickBooleanType) sharpen_,contrast,
4403 midpoint,exceptionInfo);
4404 ThrowImageException;
4405 }
4406
signature(const bool force_) const4407 std::string Magick::Image::signature(const bool force_) const
4408 {
4409 return(_imgRef->signature(force_));
4410 }
4411
sketch(const double radius_,const double sigma_,const double angle_)4412 void Magick::Image::sketch(const double radius_,const double sigma_,
4413 const double angle_)
4414 {
4415 MagickCore::Image
4416 *newImage;
4417
4418 GetPPException;
4419 newImage=SketchImage(constImage(),radius_,sigma_,angle_,exceptionInfo);
4420 replaceImage(newImage);
4421 ThrowImageException;
4422 }
4423
solarize(const double factor_)4424 void Magick::Image::solarize(const double factor_)
4425 {
4426 modifyImage();
4427 GetPPException;
4428 SolarizeImage(image(),factor_,exceptionInfo);
4429 ThrowImageException;
4430 }
4431
sparseColor(const ChannelType channel_,const SparseColorMethod method_,const size_t numberArguments_,const double * arguments_)4432 void Magick::Image::sparseColor(const ChannelType channel_,
4433 const SparseColorMethod method_,const size_t numberArguments_,
4434 const double *arguments_)
4435 {
4436 MagickCore::Image
4437 *newImage;
4438
4439 GetPPException;
4440 GetAndSetPPChannelMask(channel_);
4441 newImage=SparseColorImage(constImage(),method_,numberArguments_,arguments_,
4442 exceptionInfo);
4443 RestorePPChannelMask;
4444 replaceImage(newImage);
4445 ThrowImageException;
4446 }
4447
splice(const Geometry & geometry_)4448 void Magick::Image::splice(const Geometry &geometry_)
4449 {
4450 MagickCore::Image
4451 *newImage;
4452
4453 RectangleInfo
4454 spliceInfo=geometry_;
4455
4456 GetPPException;
4457 newImage=SpliceImage(constImage(),&spliceInfo,exceptionInfo);
4458 replaceImage(newImage);
4459 ThrowImageException;
4460 }
4461
splice(const Geometry & geometry_,const Color & backgroundColor_)4462 void Magick::Image::splice(const Geometry &geometry_,
4463 const Color &backgroundColor_)
4464 {
4465 backgroundColor(backgroundColor_);
4466 splice(geometry_);
4467 }
4468
splice(const Geometry & geometry_,const Color & backgroundColor_,const GravityType gravity_)4469 void Magick::Image::splice(const Geometry &geometry_,
4470 const Color &backgroundColor_,const GravityType gravity_)
4471 {
4472 backgroundColor(backgroundColor_);
4473 image()->gravity=gravity_;
4474 splice(geometry_);
4475 }
4476
spread(const double amount_)4477 void Magick::Image::spread(const double amount_)
4478 {
4479 MagickCore::Image
4480 *newImage;
4481
4482 GetPPException;
4483 newImage=SpreadImage(constImage(),image()->interpolate,amount_,exceptionInfo);
4484 replaceImage(newImage);
4485 ThrowImageException;
4486 }
4487
statistics() const4488 Magick::ImageStatistics Magick::Image::statistics() const
4489 {
4490 return(ImageStatistics(*this));
4491 }
4492
stegano(const Image & watermark_)4493 void Magick::Image::stegano(const Image &watermark_)
4494 {
4495 MagickCore::Image
4496 *newImage;
4497
4498 GetPPException;
4499 newImage=SteganoImage(constImage(),watermark_.constImage(),exceptionInfo);
4500 replaceImage(newImage);
4501 ThrowImageException;
4502 }
4503
stereo(const Image & rightImage_)4504 void Magick::Image::stereo(const Image &rightImage_)
4505 {
4506 MagickCore::Image
4507 *newImage;
4508
4509 GetPPException;
4510 newImage=StereoImage(constImage(),rightImage_.constImage(),exceptionInfo);
4511 replaceImage(newImage);
4512 ThrowImageException;
4513 }
4514
strip(void)4515 void Magick::Image::strip(void)
4516 {
4517 modifyImage();
4518 GetPPException;
4519 StripImage(image(),exceptionInfo);
4520 ThrowImageException;
4521 }
4522
subImageSearch(const Image & reference_,const MetricType metric_,Geometry * offset_,double * similarityMetric_,const double similarityThreshold)4523 Magick::Image Magick::Image::subImageSearch(const Image &reference_,
4524 const MetricType metric_,Geometry *offset_,double *similarityMetric_,
4525 const double similarityThreshold)
4526 {
4527 MagickCore::Image
4528 *newImage;
4529
4530 RectangleInfo
4531 offset;
4532
4533 GetPPException;
4534 newImage=SimilarityImage(image(),reference_.constImage(),metric_,
4535 similarityThreshold,&offset,similarityMetric_,exceptionInfo);
4536 ThrowImageException;
4537 if (offset_ != (Geometry *) NULL)
4538 *offset_=offset;
4539 if (newImage == (MagickCore::Image *) NULL)
4540 return(Magick::Image());
4541 else
4542 return(Magick::Image(newImage));
4543 }
4544
swirl(const double degrees_)4545 void Magick::Image::swirl(const double degrees_)
4546 {
4547 MagickCore::Image
4548 *newImage;
4549
4550 GetPPException;
4551 newImage=SwirlImage(constImage(),degrees_,image()->interpolate,
4552 exceptionInfo);
4553 replaceImage(newImage);
4554 ThrowImageException;
4555 }
4556
syncPixels(void)4557 void Magick::Image::syncPixels(void)
4558 {
4559 GetPPException;
4560 (void) SyncAuthenticPixels(image(),exceptionInfo);
4561 ThrowImageException;
4562 }
4563
texture(const Image & texture_)4564 void Magick::Image::texture(const Image &texture_)
4565 {
4566 modifyImage();
4567 GetPPException;
4568 TextureImage(image(),texture_.constImage(),exceptionInfo);
4569 ThrowImageException;
4570 }
4571
threshold(const double threshold_)4572 void Magick::Image::threshold(const double threshold_)
4573 {
4574 modifyImage();
4575 GetPPException;
4576 BilevelImage(image(),threshold_,exceptionInfo);
4577 ThrowImageException;
4578 }
4579
thumbnail(const Geometry & geometry_)4580 void Magick::Image::thumbnail(const Geometry &geometry_)
4581 {
4582 MagickCore::Image
4583 *newImage;
4584
4585 size_t
4586 height=rows(),
4587 width=columns();
4588
4589 ssize_t
4590 x=0,
4591 y=0;
4592
4593 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
4594 &height);
4595
4596 GetPPException;
4597 newImage=ThumbnailImage(constImage(),width,height,exceptionInfo);
4598 replaceImage(newImage);
4599 ThrowImageException;
4600 }
4601
tint(const std::string opacity_)4602 void Magick::Image::tint(const std::string opacity_)
4603 {
4604 MagickCore::Image
4605 *newImage;
4606
4607 PixelInfo
4608 color;
4609
4610 GetPPException;
4611 color=static_cast<PixelInfo>(constOptions()->fillColor());
4612 newImage=TintImage(constImage(),opacity_.c_str(),&color,exceptionInfo);
4613 replaceImage(newImage);
4614 ThrowImageException;
4615 }
4616
transformOrigin(const double x_,const double y_)4617 void Magick::Image::transformOrigin(const double x_,const double y_)
4618 {
4619 modifyImage();
4620 options()->transformOrigin(x_,y_);
4621 }
4622
transformReset(void)4623 void Magick::Image::transformReset(void)
4624 {
4625 modifyImage();
4626 options()->transformReset();
4627 }
4628
transformScale(const double sx_,const double sy_)4629 void Magick::Image::transformScale(const double sx_,const double sy_)
4630 {
4631 modifyImage();
4632 options()->transformScale(sx_,sy_);
4633 }
4634
transparent(const Color & color_,const bool inverse_)4635 void Magick::Image::transparent(const Color &color_,const bool inverse_)
4636 {
4637 PixelInfo
4638 target;
4639
4640 std::string
4641 color;
4642
4643 if (!color_.isValid())
4644 throwExceptionExplicit(MagickCore::OptionError,
4645 "Color argument is invalid");
4646
4647 color=color_;
4648 GetPPException;
4649 (void) QueryColorCompliance(color.c_str(),AllCompliance,&target,
4650 exceptionInfo);
4651 modifyImage();
4652 TransparentPaintImage(image(),&target,TransparentAlpha,
4653 inverse_ == true ? MagickTrue : MagickFalse,exceptionInfo);
4654 ThrowImageException;
4655 }
4656
transparentChroma(const Color & colorLow_,const Color & colorHigh_)4657 void Magick::Image::transparentChroma(const Color &colorLow_,
4658 const Color &colorHigh_)
4659 {
4660 std::string
4661 colorHigh,
4662 colorLow;
4663
4664 PixelInfo
4665 targetHigh,
4666 targetLow;
4667
4668 if (!colorLow_.isValid() || !colorHigh_.isValid())
4669 throwExceptionExplicit(MagickCore::OptionError,
4670 "Color argument is invalid");
4671
4672 colorLow=colorLow_;
4673 colorHigh=colorHigh_;
4674
4675 GetPPException;
4676 (void) QueryColorCompliance(colorLow.c_str(),AllCompliance,&targetLow,
4677 exceptionInfo);
4678 (void) QueryColorCompliance(colorHigh.c_str(),AllCompliance,&targetHigh,
4679 exceptionInfo);
4680 modifyImage();
4681 TransparentPaintImageChroma(image(),&targetLow,&targetHigh,TransparentAlpha,
4682 MagickFalse,exceptionInfo);
4683 ThrowImageException;
4684 }
4685
transpose(void)4686 void Magick::Image::transpose(void)
4687 {
4688 MagickCore::Image
4689 *newImage;
4690
4691 GetPPException;
4692 newImage=TransposeImage(constImage(),exceptionInfo);
4693 replaceImage(newImage);
4694 ThrowImageException;
4695 }
4696
transverse(void)4697 void Magick::Image::transverse(void)
4698 {
4699 MagickCore::Image
4700 *newImage;
4701
4702 GetPPException;
4703 newImage=TransverseImage(constImage(),exceptionInfo);
4704 replaceImage(newImage);
4705 ThrowImageException;
4706 }
4707
trim(void)4708 void Magick::Image::trim(void)
4709 {
4710 MagickCore::Image
4711 *newImage;
4712
4713 GetPPException;
4714 newImage=TrimImage(constImage(),exceptionInfo);
4715 replaceImage(newImage);
4716 ThrowImageException;
4717 }
4718
uniqueColors(void) const4719 Magick::Image Magick::Image::uniqueColors(void) const
4720 {
4721 MagickCore::Image
4722 *image;
4723
4724 GetPPException;
4725 image=UniqueImageColors(constImage(),exceptionInfo);
4726 ThrowImageException;
4727 if (image == (MagickCore::Image *) NULL)
4728 return(Magick::Image());
4729 else
4730 return(Magick::Image(image));
4731 }
4732
unsharpmask(const double radius_,const double sigma_,const double amount_,const double threshold_)4733 void Magick::Image::unsharpmask(const double radius_,const double sigma_,
4734 const double amount_,const double threshold_)
4735 {
4736 MagickCore::Image
4737 *newImage;
4738
4739 GetPPException;
4740 newImage=UnsharpMaskImage(constImage(),radius_,sigma_,amount_,threshold_,
4741 exceptionInfo);
4742 replaceImage(newImage);
4743 ThrowImageException;
4744 }
4745
unsharpmaskChannel(const ChannelType channel_,const double radius_,const double sigma_,const double amount_,const double threshold_)4746 void Magick::Image::unsharpmaskChannel(const ChannelType channel_,
4747 const double radius_,const double sigma_,const double amount_,
4748 const double threshold_)
4749 {
4750 MagickCore::Image
4751 *newImage;
4752
4753 GetPPException;
4754 GetAndSetPPChannelMask(channel_);
4755 newImage=UnsharpMaskImage(constImage(),radius_,sigma_,amount_,threshold_,
4756 exceptionInfo);
4757 RestorePPChannelMask;
4758 replaceImage(newImage);
4759 ThrowImageException;
4760 }
4761
vignette(const double radius_,const double sigma_,const ssize_t x_,const ssize_t y_)4762 void Magick::Image::vignette(const double radius_,const double sigma_,
4763 const ssize_t x_,const ssize_t y_)
4764 {
4765 MagickCore::Image
4766 *newImage;
4767
4768 GetPPException;
4769 newImage=VignetteImage(constImage(),radius_,sigma_,x_,y_,exceptionInfo);
4770 replaceImage(newImage);
4771 ThrowImageException;
4772 }
4773
wave(const double amplitude_,const double wavelength_)4774 void Magick::Image::wave(const double amplitude_,const double wavelength_)
4775 {
4776 MagickCore::Image
4777 *newImage;
4778
4779 GetPPException;
4780 newImage=WaveImage(constImage(),amplitude_,wavelength_,image()->interpolate,
4781 exceptionInfo);
4782 replaceImage(newImage);
4783 ThrowImageException;
4784 }
4785
waveletDenoise(const double threshold_,const double softness_)4786 void Magick::Image::waveletDenoise(const double threshold_,
4787 const double softness_)
4788 {
4789 MagickCore::Image
4790 *newImage;
4791
4792 GetPPException;
4793 newImage=WaveletDenoiseImage(constImage(),threshold_,softness_,
4794 exceptionInfo);
4795 replaceImage(newImage);
4796 ThrowImageException;
4797 }
4798
whiteThreshold(const std::string & threshold_)4799 void Magick::Image::whiteThreshold(const std::string &threshold_)
4800 {
4801 modifyImage();
4802 GetPPException;
4803 WhiteThresholdImage(image(),threshold_.c_str(),exceptionInfo);
4804 ThrowImageException;
4805 }
4806
whiteThresholdChannel(const ChannelType channel_,const std::string & threshold_)4807 void Magick::Image::whiteThresholdChannel(const ChannelType channel_,
4808 const std::string &threshold_)
4809 {
4810 modifyImage();
4811 GetPPException;
4812 GetAndSetPPChannelMask(channel_);
4813 WhiteThresholdImage(image(),threshold_.c_str(),exceptionInfo);
4814 RestorePPChannelMask;
4815 ThrowImageException;
4816 }
4817
write(Blob * blob_)4818 void Magick::Image::write(Blob *blob_)
4819 {
4820 size_t
4821 length=0;
4822
4823 void
4824 *data;
4825
4826 modifyImage();
4827 GetPPException;
4828 data=ImagesToBlob(constImageInfo(),image(),&length,exceptionInfo);
4829 if (length > 0)
4830 blob_->updateNoCopy(data,length,Blob::MallocAllocator);
4831 ThrowImageException;
4832 }
4833
write(Blob * blob_,const std::string & magick_)4834 void Magick::Image::write(Blob *blob_,const std::string &magick_)
4835 {
4836 size_t
4837 length=0;
4838
4839 void
4840 *data;
4841
4842 modifyImage();
4843 magick(magick_);
4844 GetPPException;
4845 data=ImagesToBlob(constImageInfo(),image(),&length,exceptionInfo);
4846 if (length > 0)
4847 blob_->updateNoCopy(data,length,Blob::MallocAllocator);
4848 ThrowImageException;
4849 }
4850
write(Blob * blob_,const std::string & magick_,const size_t depth_)4851 void Magick::Image::write(Blob *blob_,const std::string &magick_,
4852 const size_t depth_)
4853 {
4854 size_t
4855 length=0;
4856
4857 void
4858 *data;
4859
4860 modifyImage();
4861 magick(magick_);
4862 depth(depth_);
4863 GetPPException;
4864 data=ImagesToBlob(constImageInfo(),image(),&length,exceptionInfo);
4865 if (length > 0)
4866 blob_->updateNoCopy(data,length,Blob::MallocAllocator);
4867 ThrowImageException;
4868 }
4869
write(const ssize_t x_,const ssize_t y_,const size_t columns_,const size_t rows_,const std::string & map_,const StorageType type_,void * pixels_)4870 void Magick::Image::write(const ssize_t x_,const ssize_t y_,
4871 const size_t columns_,const size_t rows_,const std::string &map_,
4872 const StorageType type_,void *pixels_)
4873 {
4874 GetPPException;
4875 ExportImagePixels(image(),x_,y_,columns_,rows_,map_.c_str(),type_,pixels_,
4876 exceptionInfo);
4877 ThrowImageException;
4878 }
4879
write(const std::string & imageSpec_)4880 void Magick::Image::write(const std::string &imageSpec_)
4881 {
4882 modifyImage();
4883 fileName(imageSpec_);
4884 GetPPException;
4885 WriteImage(constImageInfo(),image(),exceptionInfo);
4886 ThrowImageException;
4887 }
4888
writeMask(const Magick::Image & mask_)4889 void Magick::Image::writeMask(const Magick::Image &mask_)
4890 {
4891 mask(mask_,WritePixelMask);
4892 }
4893
writeMask(void) const4894 Magick::Image Magick::Image::writeMask(void) const
4895 {
4896 return(mask(WritePixelMask));
4897 }
4898
writePixels(const Magick::QuantumType quantum_,unsigned char * destination_)4899 void Magick::Image::writePixels(const Magick::QuantumType quantum_,
4900 unsigned char *destination_)
4901 {
4902 QuantumInfo
4903 *quantum_info;
4904
4905 quantum_info=AcquireQuantumInfo(imageInfo(),image());
4906 GetPPException;
4907 ExportQuantumPixels(image(),(MagickCore::CacheView *) NULL,quantum_info,
4908 quantum_,destination_, exceptionInfo);
4909 quantum_info=DestroyQuantumInfo(quantum_info);
4910 ThrowImageException;
4911 }
4912
zoom(const Geometry & geometry_)4913 void Magick::Image::zoom(const Geometry &geometry_)
4914 {
4915 MagickCore::Image
4916 *newImage;
4917
4918 size_t
4919 height=rows(),
4920 width=columns();
4921
4922 ssize_t
4923 x=0,
4924 y=0;
4925
4926 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
4927 &height);
4928
4929 GetPPException;
4930 newImage=ResizeImage(constImage(),width,height,image()->filter,exceptionInfo);
4931 replaceImage(newImage);
4932 ThrowImageException;
4933 }
4934
Image(MagickCore::Image * image_)4935 Magick::Image::Image(MagickCore::Image *image_)
4936 : _imgRef(new ImageRef(image_))
4937 {
4938 }
4939
image(void)4940 MagickCore::Image *&Magick::Image::image(void)
4941 {
4942 return(_imgRef->image());
4943 }
4944
constImage(void) const4945 const MagickCore::Image *Magick::Image::constImage(void) const
4946 {
4947 return(_imgRef->image());
4948 }
4949
imageInfo(void)4950 MagickCore::ImageInfo *Magick::Image::imageInfo(void)
4951 {
4952 return(_imgRef->options()->imageInfo());
4953 }
4954
constImageInfo(void) const4955 const MagickCore::ImageInfo *Magick::Image::constImageInfo(void) const
4956 {
4957 return(_imgRef->options()->imageInfo());
4958 }
4959
options(void)4960 Magick::Options *Magick::Image::options(void)
4961 {
4962 return(_imgRef->options());
4963 }
4964
constOptions(void) const4965 const Magick::Options *Magick::Image::constOptions(void) const
4966 {
4967 return(_imgRef->options());
4968 }
4969
quantizeInfo(void)4970 MagickCore::QuantizeInfo *Magick::Image::quantizeInfo(void)
4971 {
4972 return(_imgRef->options()->quantizeInfo());
4973 }
4974
constQuantizeInfo(void) const4975 const MagickCore::QuantizeInfo *Magick::Image::constQuantizeInfo(void) const
4976 {
4977 return(_imgRef->options()->quantizeInfo());
4978 }
4979
modifyImage(void)4980 void Magick::Image::modifyImage(void)
4981 {
4982 if (!_imgRef->isShared())
4983 return;
4984
4985 GetPPException;
4986 replaceImage(CloneImage(image(),0,0,MagickTrue,exceptionInfo));
4987 ThrowImageException;
4988 }
4989
replaceImage(MagickCore::Image * replacement_)4990 MagickCore::Image *Magick::Image::replaceImage(MagickCore::Image *replacement_)
4991 {
4992 MagickCore::Image
4993 *image;
4994
4995 if (replacement_)
4996 image=replacement_;
4997 else
4998 {
4999 GetPPException;
5000 image=AcquireImage(constImageInfo(),exceptionInfo);
5001 ThrowImageException;
5002 }
5003
5004 _imgRef=ImageRef::replaceImage(_imgRef,image);
5005 return(image);
5006 }
5007
read(MagickCore::Image * image,MagickCore::ExceptionInfo * exceptionInfo)5008 void Magick::Image::read(MagickCore::Image *image,
5009 MagickCore::ExceptionInfo *exceptionInfo)
5010 {
5011 // Ensure that multiple image frames were not read.
5012 if (image != (MagickCore::Image *) NULL &&
5013 image->next != (MagickCore::Image *) NULL)
5014 {
5015 MagickCore::Image
5016 *next;
5017
5018 // Destroy any extra image frames
5019 next=image->next;
5020 image->next=(MagickCore::Image *) NULL;
5021 next->previous=(MagickCore::Image *) NULL;
5022 DestroyImageList(next);
5023 }
5024 replaceImage(image);
5025 if (exceptionInfo->severity == MagickCore::UndefinedException &&
5026 image == (MagickCore::Image *) NULL)
5027 {
5028 (void) MagickCore::DestroyExceptionInfo(exceptionInfo);
5029 if (!quiet())
5030 throwExceptionExplicit(MagickCore::ImageWarning,
5031 "No image was loaded.");
5032 }
5033 ThrowImageException;
5034 }
5035
floodFill(const ssize_t x_,const ssize_t y_,const Magick::Image * fillPattern_,const Magick::Color & fill_,const MagickCore::PixelInfo * target_,const bool invert_)5036 void Magick::Image::floodFill(const ssize_t x_,const ssize_t y_,
5037 const Magick::Image *fillPattern_,const Magick::Color &fill_,
5038 const MagickCore::PixelInfo *target_,const bool invert_)
5039 {
5040 Magick::Color
5041 fillColor;
5042
5043 MagickCore::Image
5044 *fillPattern;
5045
5046 // Set drawing fill pattern or fill color
5047 fillColor=options()->fillColor();
5048 fillPattern=(MagickCore::Image *)NULL;
5049 if (options()->fillPattern() != (MagickCore::Image *)NULL)
5050 {
5051 GetPPException;
5052 fillPattern=CloneImage(options()->fillPattern(),0,0,MagickTrue,
5053 exceptionInfo);
5054 ThrowImageException;
5055 }
5056
5057 if (fillPattern_ == (Magick::Image *)NULL)
5058 {
5059 options()->fillPattern((MagickCore::Image *)NULL);
5060 options()->fillColor(fill_);
5061 }
5062 else
5063 options()->fillPattern(fillPattern_->constImage());
5064
5065 GetPPException;
5066 (void) FloodfillPaintImage(image(),options()->drawInfo(),
5067 target_,static_cast<ssize_t>(x_),static_cast<ssize_t>(y_),
5068 (MagickBooleanType) invert_,exceptionInfo);
5069
5070 options()->fillColor(fillColor);
5071 options()->fillPattern(fillPattern);
5072 ThrowImageException;
5073 }
5074
mask(const Magick::Image & mask_,const PixelMask type)5075 void Magick::Image::mask(const Magick::Image &mask_,const PixelMask type)
5076 {
5077 modifyImage();
5078
5079 GetPPException;
5080 if (mask_.isValid())
5081 SetImageMask(image(),type,mask_.constImage(),exceptionInfo);
5082 else
5083 SetImageMask(image(),type,(MagickCore::Image *) NULL,
5084 exceptionInfo);
5085 ThrowImageException;
5086 }
5087
mask(const PixelMask type) const5088 Magick::Image Magick::Image::mask(const PixelMask type) const
5089 {
5090 MagickCore::Image
5091 *image;
5092
5093 GetPPException;
5094 image = GetImageMask(constImage(),type,exceptionInfo);
5095 ThrowImageException;
5096
5097 if (image == (MagickCore::Image *) NULL)
5098 return(Magick::Image());
5099 else
5100 return(Magick::Image(image));
5101 }
5102