void col_lerp(COLOR *_cT, COLOR *_c0, COLOR *_c1, var _factor, var _gamma) {
_cT->red = pow(pow(_c0->red, _gamma) * (1 - _factor) + pow(_c1->red, _gamma) * _factor, 1.0 / _gamma);
_cT->green = pow(pow(_c0->green, _gamma) * (1 - _factor) + pow(_c1->green, _gamma) * _factor, 1.0 / _gamma);
_cT->blue = pow(pow(_c0->blue, _gamma) * (1 - _factor) + pow(_c1->blue, _gamma) * _factor, 1.0 / _gamma);
}
void bmap_paint_circle (
BMAP *_bmp,
int _posX,
int _posY,
var _radiusInt,
var _radiusExt,
COLOR *_color,
var _alpha)
{
var _g = _radiusExt - _radiusInt;
if (_g == 0)
_g = 0.001;
int _x0 = maxv(-_radiusExt, -_posX);
int _xL = minv(_radiusExt, bmap_width(_bmp) - _posX);
int _y = maxv(-_radiusExt, -_posY);
int _yL = minv(_radiusExt, bmap_height(_bmp) - _posY);
var _frt = bmap_lock(_bmp, 0);
for (; _y<_yL; _y+=1) {
int _x = _x0;
for (; _x<_xL; _x+=1) {
var _r = sqrt(_y * _y + _x * _x);
if (_r > _radiusExt)
continue;
var _f = (1 - maxv(_r - _radiusInt, 0) / _g) * _alpha / 100;
var _p = pixel_for_bmap(_bmp, _posX + _x, _posY + _y);
COLOR _c;
pixel_to_vec(&_c, NULL, _frt, _p);
col_lerp(&_c, &_c, _color, _f, 2.2);
// vec_lerp(&_c, &_c, _color, _f);
_p = pixel_for_vec(&_c, 100, _frt);
pixel_to_bmap(_bmp, _posX + _x, _posY + _y, _p);
}
}
bmap_unlock(_bmp);
}