Method: Magick::Image#quantum_operator
- Defined in:
- ext/RMagick/rmimage.cpp
#quantum_operator(quantum_expression_op, rvalue, channel = Magick::AllChannels) ⇒ Magick::Image #quantum_operator(quantum_expression_op, rvalue, *channels) ⇒ Magick::Image
Performs the requested integer arithmetic operation on the selected channel of the image. This method allows simple arithmetic operations on the component values of all pixels in an image. Of course, you could also do this in Ruby using get_pixels and store_pixels, or view, but quantum_operator will be faster, especially for large numbers of pixels, since it does not need to convert the pixels from C to Ruby.
11033 11034 11035 11036 11037 11038 11039 11040 11041 11042 11043 11044 11045 11046 11047 11048 11049 11050 11051 11052 11053 11054 11055 11056 11057 11058 11059 11060 11061 11062 11063 11064 11065 11066 11067 11068 11069 11070 11071 11072 11073 11074 11075 11076 11077 11078 11079 11080 11081 11082 11083 11084 11085 11086 11087 11088 11089 11090 11091 11092 11093 11094 11095 11096 11097 11098 11099 11100 11101 11102 11103 11104 11105 11106 11107 11108 11109 11110 11111 11112 11113 11114 11115 11116 11117 11118 11119 11120 11121 11122 11123 11124 11125 11126 11127 11128 11129 11130 11131 11132 11133 11134 11135 11136 11137 11138 11139 11140 11141 11142 11143 11144 11145 11146 11147 11148 11149 11150 11151 11152 11153 11154 11155 11156 11157 11158 11159 11160 11161 11162 11163 11164 11165 11166 11167 11168 11169 11170 11171 11172 11173 11174 11175 11176 11177 11178 11179 11180 11181 11182 11183 11184 11185 11186 11187 |
# File 'ext/RMagick/rmimage.cpp', line 11033
VALUE
Image_quantum_operator(int argc, VALUE *argv, VALUE self)
{
Image *image;
QuantumExpressionOperator quantum_expression_op;
MagickEvaluateOperator qop;
double rvalue;
ChannelType channel;
ExceptionInfo *exception;
image = rm_check_destroyed(self);
// The default channel is AllChannels
channel = AllChannels;
/*
If there are 3 arguments, argument 2 is a ChannelType argument.
Arguments 1 and 0 are required and are the rvalue and operator,
respectively.
*/
switch (argc)
{
case 3:
VALUE_TO_ENUM(argv[2], channel, ChannelType);
/* Fall through */
case 2:
rvalue = NUM2DBL(argv[1]);
VALUE_TO_ENUM(argv[0], quantum_expression_op, QuantumExpressionOperator);
break;
default:
rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
break;
}
// Map QuantumExpressionOperator to MagickEvaluateOperator
switch (quantum_expression_op)
{
default:
case UndefinedQuantumOperator:
qop = UndefinedEvaluateOperator;
break;
case AddQuantumOperator:
qop = AddEvaluateOperator;
break;
case AndQuantumOperator:
qop = AndEvaluateOperator;
break;
case DivideQuantumOperator:
qop = DivideEvaluateOperator;
break;
case LShiftQuantumOperator:
qop = LeftShiftEvaluateOperator;
break;
case MaxQuantumOperator:
qop = MaxEvaluateOperator;
break;
case MinQuantumOperator:
qop = MinEvaluateOperator;
break;
case MultiplyQuantumOperator:
qop = MultiplyEvaluateOperator;
break;
case OrQuantumOperator:
qop = OrEvaluateOperator;
break;
case RShiftQuantumOperator:
qop = RightShiftEvaluateOperator;
break;
case SubtractQuantumOperator:
qop = SubtractEvaluateOperator;
break;
case XorQuantumOperator:
qop = XorEvaluateOperator;
break;
case PowQuantumOperator:
qop = PowEvaluateOperator;
break;
case LogQuantumOperator:
qop = LogEvaluateOperator;
break;
case ThresholdQuantumOperator:
qop = ThresholdEvaluateOperator;
break;
case ThresholdBlackQuantumOperator:
qop = ThresholdBlackEvaluateOperator;
break;
case ThresholdWhiteQuantumOperator:
qop = ThresholdWhiteEvaluateOperator;
break;
case GaussianNoiseQuantumOperator:
qop = GaussianNoiseEvaluateOperator;
break;
case ImpulseNoiseQuantumOperator:
qop = ImpulseNoiseEvaluateOperator;
break;
case LaplacianNoiseQuantumOperator:
qop = LaplacianNoiseEvaluateOperator;
break;
case MultiplicativeNoiseQuantumOperator:
qop = MultiplicativeNoiseEvaluateOperator;
break;
case PoissonNoiseQuantumOperator:
qop = PoissonNoiseEvaluateOperator;
break;
case UniformNoiseQuantumOperator:
qop = UniformNoiseEvaluateOperator;
break;
case CosineQuantumOperator:
qop = CosineEvaluateOperator;
break;
case SetQuantumOperator:
qop = SetEvaluateOperator;
break;
case SineQuantumOperator:
qop = SineEvaluateOperator;
break;
case AddModulusQuantumOperator:
qop = AddModulusEvaluateOperator;
break;
case MeanQuantumOperator:
qop = MeanEvaluateOperator;
break;
case AbsQuantumOperator:
qop = AbsEvaluateOperator;
break;
case ExponentialQuantumOperator:
qop = ExponentialEvaluateOperator;
break;
case MedianQuantumOperator:
qop = MedianEvaluateOperator;
break;
case SumQuantumOperator:
qop = SumEvaluateOperator;
break;
case RootMeanSquareQuantumOperator:
qop = RootMeanSquareEvaluateOperator;
break;
}
exception = AcquireExceptionInfo();
#if defined(IMAGEMAGICK_7)
BEGIN_CHANNEL_MASK(image, channel);
GVL_STRUCT_TYPE(EvaluateImage) args = { image, qop, rvalue, exception };
CALL_FUNC_WITHOUT_GVL(GVL_FUNC(EvaluateImage), &args);
END_CHANNEL_MASK(image);
#else
GVL_STRUCT_TYPE(EvaluateImageChannel) args = { image, channel, qop, rvalue, exception };
CALL_FUNC_WITHOUT_GVL(GVL_FUNC(EvaluateImageChannel), &args);
#endif
CHECK_EXCEPTION();
DestroyExceptionInfo(exception);
return self;
}
|