@@ -84,66 +84,124 @@ create(Imaging im1, Imaging im2, const ModeID mode) {
8484 return ImagingNewDirty (im1 -> mode , xsize , ysize );
8585}
8686
87+ /**
88+ * Return a newly allocated image containing the lighter pixels of the two images.
89+ * Contract: imIn1 and imIn2 are read-only and may alias each other.
90+ */
8791Imaging
8892ImagingChopLighter (Imaging imIn1 , Imaging imIn2 ) {
8993 CHOP ((in1 [x ] > in2 [x ]) ? in1 [x ] : in2 [x ]);
9094}
9195
96+ /**
97+ * Return a newly allocated image containing the darker pixels of the two images.
98+ * Contract: imIn1 and imIn2 are read-only and may alias each other.
99+ */
92100Imaging
93101ImagingChopDarker (Imaging imIn1 , Imaging imIn2 ) {
94102 CHOP ((in1 [x ] < in2 [x ]) ? in1 [x ] : in2 [x ]);
95103}
96104
105+ /**
106+ * Return a newly allocated image containing the absolute per-pixel difference of the
107+ * two images.
108+ * Contract: imIn1 and imIn2 are read-only and may alias each other.
109+ */
97110Imaging
98111ImagingChopDifference (Imaging imIn1 , Imaging imIn2 ) {
99112 CHOP (abs ((int )in1 [x ] - (int )in2 [x ]));
100113}
101114
115+ /**
116+ * Return a newly allocated image containing the per-pixel product (scaled to 0-255) of
117+ * the two images.
118+ * Contract: imIn1 and imIn2 are read-only and may alias each other.
119+ */
102120Imaging
103121ImagingChopMultiply (Imaging imIn1 , Imaging imIn2 ) {
104122 CHOP ((int )in1 [x ] * (int )in2 [x ] / 255 );
105123}
106124
125+ /**
126+ * Return a newly allocated image containing the screen blend of the two images.
127+ * Contract: imIn1 and imIn2 are read-only and may alias each other.
128+ */
107129Imaging
108130ImagingChopScreen (Imaging imIn1 , Imaging imIn2 ) {
109131 CHOP (255 - ((int )(255 - in1 [x ]) * (int )(255 - in2 [x ])) / 255 );
110132}
111133
134+ /**
135+ * Return a newly allocated image containing the per-pixel sum, divided by `scale` and
136+ * shifted by `offset`, clipped to 0-255.
137+ * Contract: imIn1 and imIn2 are read-only and may alias each other.
138+ */
112139Imaging
113140ImagingChopAdd (Imaging imIn1 , Imaging imIn2 , float scale , int offset ) {
114141 CHOP (((int )in1 [x ] + (int )in2 [x ]) / scale + offset );
115142}
116143
144+ /**
145+ * Return a newly allocated image containing the per-pixel difference, divided by
146+ * `scale` and shifted by `offset`, clipped to 0-255.
147+ * Contract: imIn1 and imIn2 are read-only and may alias each other.
148+ */
117149Imaging
118150ImagingChopSubtract (Imaging imIn1 , Imaging imIn2 , float scale , int offset ) {
119151 CHOP (((int )in1 [x ] - (int )in2 [x ]) / scale + offset );
120152}
121153
154+ /**
155+ * Return a newly allocated "1" image that is the logical AND of the two images.
156+ * Contract: imIn1 and imIn2 are read-only and may alias each other.
157+ */
122158Imaging
123159ImagingChopAnd (Imaging imIn1 , Imaging imIn2 ) {
124160 CHOP2 ((in1 [x ] && in2 [x ]) ? 255 : 0 , IMAGING_MODE_1 );
125161}
126162
163+ /**
164+ * Return a newly allocated "1" image that is the logical OR of the two images.
165+ * Contract: imIn1 and imIn2 are read-only and may alias each other.
166+ */
127167Imaging
128168ImagingChopOr (Imaging imIn1 , Imaging imIn2 ) {
129169 CHOP2 ((in1 [x ] || in2 [x ]) ? 255 : 0 , IMAGING_MODE_1 );
130170}
131171
172+ /**
173+ * Return a newly allocated "1" image that is the logical XOR of the two images.
174+ * Contract: imIn1 and imIn2 are read-only and may alias each other.
175+ */
132176Imaging
133177ImagingChopXor (Imaging imIn1 , Imaging imIn2 ) {
134178 CHOP2 (((in1 [x ] != 0 ) ^ (in2 [x ] != 0 )) ? 255 : 0 , IMAGING_MODE_1 );
135179}
136180
181+ /**
182+ * Return a newly allocated image containing the per-pixel sum of the two images,
183+ * wrapping on overflow (no clipping).
184+ * Contract: imIn1 and imIn2 are read-only and may alias each other.
185+ */
137186Imaging
138187ImagingChopAddModulo (Imaging imIn1 , Imaging imIn2 ) {
139188 CHOP2 (in1 [x ] + in2 [x ], IMAGING_MODE_UNKNOWN );
140189}
141190
191+ /**
192+ * Return a newly allocated image containing the per-pixel difference of the two images,
193+ * wrapping on underflow (no clipping).
194+ * Contract: imIn1 and imIn2 are read-only and may alias each other.
195+ */
142196Imaging
143197ImagingChopSubtractModulo (Imaging imIn1 , Imaging imIn2 ) {
144198 CHOP2 (in1 [x ] - in2 [x ], IMAGING_MODE_UNKNOWN );
145199}
146200
201+ /**
202+ * Return a newly allocated image containing the soft-light blend of the two images.
203+ * Contract: imIn1 and imIn2 are read-only and may alias each other.
204+ */
147205Imaging
148206ImagingChopSoftLight (Imaging imIn1 , Imaging imIn2 ) {
149207 CHOP2 (
@@ -153,6 +211,10 @@ ImagingChopSoftLight(Imaging imIn1, Imaging imIn2) {
153211 );
154212}
155213
214+ /**
215+ * Return a newly allocated image containing the hard-light blend of the two images.
216+ * Contract: imIn1 and imIn2 are read-only and may alias each other.
217+ */
156218Imaging
157219ImagingChopHardLight (Imaging imIn1 , Imaging imIn2 ) {
158220 CHOP2 (
@@ -162,6 +224,10 @@ ImagingChopHardLight(Imaging imIn1, Imaging imIn2) {
162224 );
163225}
164226
227+ /**
228+ * Return a newly allocated image containing the overlay blend of the two images.
229+ * Contract: imIn1 and imIn2 are read-only and may alias each other.
230+ */
165231Imaging
166232ImagingOverlay (Imaging imIn1 , Imaging imIn2 ) {
167233 CHOP2 (
0 commit comments