Skip to content

Commit 4ecd934

Browse files
committed
FEAT: new tint native for color mixtures
1 parent e748312 commit 4ecd934

File tree

3 files changed

+85
-0
lines changed

3 files changed

+85
-0
lines changed

src/core/f-stubs.c

+11
Original file line numberDiff line numberDiff line change
@@ -811,6 +811,17 @@
811811
return val;
812812
}
813813

814+
/***********************************************************************
815+
**
816+
*/ REBDEC Clip_Dec(REBDEC val, REBDEC mind, REBDEC maxd)
817+
/*
818+
***********************************************************************/
819+
{
820+
if (val < mind) val = mind;
821+
else if (val > maxd) val = maxd;
822+
return val;
823+
}
824+
814825
/***********************************************************************
815826
**
816827
*/ void memswapl(void *m1, void *m2, size_t len)

src/core/n-image.c

+55
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,61 @@ typedef struct REBCLR {
173173
return R_ARG1;
174174
}
175175

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+
176231
/***********************************************************************
177232
**
178233
*/ REBNATIVE(image)

src/tests/units/image-test.r3

+19
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,25 @@ FFFFFFDC1616212121212121
202202

203203
===end-group===
204204

205+
206+
===start-group=== "Tint color"
207+
208+
--test-- "Tint tuple"
209+
c: 100.200.255
210+
--assert 100.200.255 = tint c 128.128.128 0
211+
--assert 114.164.192 = tint c 128.128.128 50%
212+
--assert 128.128.128 = tint c 128.128.128 1.0
213+
--assert 178.228.255 = tint c 255.255.255 0.5
214+
--assert 50.100.128 = tint c 0.0.0 50%
215+
--assert 100.200.255 = c ;<- tuple value is not modified
216+
217+
--test-- "Tint image"
218+
i: make image! [2x1 100.200.255]
219+
--assert 114.164.192.255 = first tint i 128.128.128 50% ;@@ image is being modified!
220+
--assert 121.146.160.255 = second tint i 128.128.128 50%
221+
222+
===end-group===
223+
205224
===start-group=== "Save/load image"
206225
if find codecs 'png [
207226
--test-- "save/load PNG"

0 commit comments

Comments
 (0)