@@ -173,6 +173,61 @@ typedef struct REBCLR {
173
173
return R_ARG1 ;
174
174
}
175
175
176
+
177
+ /***********************************************************************
178
+ **
179
+ */ REBNATIVE (tint )
180
+ /*
181
+ // tint: native [
182
+ // "Mixing colors (tint and or brightness)"
183
+ // target [tuple! image!] "Target RGB color or image (modifed)"
184
+ // rgb [tuple!] "Color to use for mixture"
185
+ // amount [number!] "Effect amount"
186
+ // ]
187
+ ***********************************************************************/
188
+ {
189
+ REBVAL * val_trg = D_ARG (1 );
190
+ REBCLR * rgb = (REBCLR * )VAL_TUPLE (D_ARG (2 ));
191
+ REBVAL * val_amount = D_ARG (3 );
192
+ REBCLR * clr_trg ;
193
+ REBDEC r , g , b , r1 , g1 , b1 , r2 , g2 , b2 , amount0 , amount1 ;
194
+
195
+ r2 = rgb -> r ;
196
+ g2 = rgb -> g ;
197
+ b2 = rgb -> b ;
198
+
199
+ amount0 = Clip_Dec (IS_INTEGER (val_amount ) ? (REBDEC )VAL_INT64 (val_amount ) : VAL_DECIMAL (val_amount ), 0.0 , 1.0 );
200
+ amount1 = 1.0 - amount0 ;
201
+
202
+ if (IS_TUPLE (val_trg )) {
203
+ clr_trg = (REBCLR * )VAL_TUPLE (val_trg );
204
+ r1 = clr_trg -> r ;
205
+ g1 = clr_trg -> g ;
206
+ b1 = clr_trg -> b ;
207
+ r = (r1 >= r2 ) ? r2 + ((r1 - r2 ) * amount1 ) : r1 + ((r2 - r1 ) * amount0 );
208
+ g = (g1 >= g2 ) ? g2 + ((g1 - g2 ) * amount1 ) : g1 + ((g2 - g1 ) * amount0 );
209
+ b = (b1 >= b2 ) ? b2 + ((b1 - b2 ) * amount1 ) : b1 + ((b2 - b1 ) * amount0 );
210
+ clr_trg -> r = (REBYTE )Clip_Int ((int )(0.5 + r ), 0 , 255 );
211
+ clr_trg -> g = (REBYTE )Clip_Int ((int )(0.5 + g ), 0 , 255 );
212
+ clr_trg -> b = (REBYTE )Clip_Int ((int )(0.5 + b ), 0 , 255 );
213
+ } else {
214
+ REBINT len = VAL_IMAGE_LEN (val_trg );
215
+ REBYTE * rgba = VAL_IMAGE_DATA (val_trg );
216
+ for (; len > 0 ; len -- , rgba += 4 ) {
217
+ r1 = rgba [C_R ];
218
+ g1 = rgba [C_G ];
219
+ b1 = rgba [C_B ];
220
+ r = (r1 >= r2 ) ? r2 + ((r1 - r2 ) * amount1 ) : r1 + ((r2 - r1 ) * amount0 );
221
+ g = (g1 >= g2 ) ? g2 + ((g1 - g2 ) * amount1 ) : g1 + ((g2 - g1 ) * amount0 );
222
+ b = (b1 >= b2 ) ? b2 + ((b1 - b2 ) * amount1 ) : b1 + ((b2 - b1 ) * amount0 );
223
+ rgba [C_R ] = (REBYTE )Clip_Int ((int )(0.5 + r ), 0 , 255 );
224
+ rgba [C_G ] = (REBYTE )Clip_Int ((int )(0.5 + g ), 0 , 255 );
225
+ rgba [C_B ] = (REBYTE )Clip_Int ((int )(0.5 + b ), 0 , 255 );
226
+ }
227
+ }
228
+ return R_ARG1 ;
229
+ }
230
+
176
231
/***********************************************************************
177
232
**
178
233
*/ REBNATIVE (image )
0 commit comments