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