mirror of
https://github.com/stevenrobertson/cuburn.git
synced 2025-02-05 11:40:04 -05:00
Add gamma linearization to smearclip
This commit is contained in:
parent
3d864aac3c
commit
3a84116515
@ -280,7 +280,8 @@ __global__ void apply_gamma_full_hi(float4 *dst, float4 *src, float gamma_m_1) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
__global__ void
|
__global__ void
|
||||||
smearclip(float4 *pixbuf, const float4 *smearbuf, float gamma_m_1) {
|
smearclip(float4 *pixbuf, const float4 *smearbuf,
|
||||||
|
float gamma_m_1, float linrange, float lingam) {
|
||||||
GET_IDX(i);
|
GET_IDX(i);
|
||||||
float4 pix = pixbuf[i];
|
float4 pix = pixbuf[i];
|
||||||
float4 areaval = smearbuf[i];
|
float4 areaval = smearbuf[i];
|
||||||
@ -296,6 +297,10 @@ smearclip(float4 *pixbuf, const float4 *smearbuf, float gamma_m_1) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
float ls = powf(pix.w, gamma_m_1);
|
float ls = powf(pix.w, gamma_m_1);
|
||||||
|
if (pix.w < linrange) {
|
||||||
|
float frac = pix.w / linrange;
|
||||||
|
ls = (1.0f - frac) * lingam + frac * ls;
|
||||||
|
}
|
||||||
scale_float4(pix, ls);
|
scale_float4(pix, ls);
|
||||||
yuvo2rgb(pix);
|
yuvo2rgb(pix);
|
||||||
pixbuf[i] = pix;
|
pixbuf[i] = pix;
|
||||||
@ -304,8 +309,8 @@ smearclip(float4 *pixbuf, const float4 *smearbuf, float gamma_m_1) {
|
|||||||
|
|
||||||
colorcliplib = devlib(deps=[yuvlib], defs=r'''
|
colorcliplib = devlib(deps=[yuvlib], defs=r'''
|
||||||
__global__ void
|
__global__ void
|
||||||
colorclip(float4 *pixbuf, float gamma, float vibrance, float highpow,
|
colorclip(float4 *pixbuf, float vibrance, float highpow,
|
||||||
float linrange, float lingam)
|
float gamma, float linrange, float lingam)
|
||||||
{
|
{
|
||||||
GET_IDX(i);
|
GET_IDX(i);
|
||||||
float4 pix = pixbuf[i];
|
float4 pix = pixbuf[i];
|
||||||
|
@ -112,17 +112,23 @@ class HaloClip(Filter, ClsMod):
|
|||||||
launch2('haloclip', self.mod, stream, dim,
|
launch2('haloclip', self.mod, stream, dim,
|
||||||
fb.d_front, fb.d_side, gam)
|
fb.d_front, fb.d_side, gam)
|
||||||
|
|
||||||
|
def calc_lingam(params, tc):
|
||||||
|
gam = f32(1 / params.gamma(tc))
|
||||||
|
lin = f32(params.gamma_threshold(tc))
|
||||||
|
lingam = f32(lin ** (gam-1.0) if lin > 0 else 0)
|
||||||
|
return gam, lin, lingam
|
||||||
|
|
||||||
class SmearClip(Filter, ClsMod):
|
class SmearClip(Filter, ClsMod):
|
||||||
full_side = True
|
full_side = True
|
||||||
lib = code.filters.smearcliplib
|
lib = code.filters.smearcliplib
|
||||||
def apply(self, fb, gprof, params, dim, tc, stream=None):
|
def apply(self, fb, gprof, params, dim, tc, stream=None):
|
||||||
gam = f32(1 / gprof.filters.colorclip.gamma(tc) - 1)
|
gam, lin, lingam = calc_lingam(gprof.filters.colorclip, tc)
|
||||||
dsc = mkdsc(dim, 4)
|
dsc = mkdsc(dim, 4)
|
||||||
tref = mktref(self.mod, 'chan4_src')
|
tref = mktref(self.mod, 'chan4_src')
|
||||||
|
|
||||||
set_blur_width(self.mod, fb.pool, params.width(tc), stream)
|
set_blur_width(self.mod, fb.pool, params.width(tc), stream)
|
||||||
launch2('apply_gamma_full_hi', self.mod, stream, dim,
|
launch2('apply_gamma_full_hi', self.mod, stream, dim,
|
||||||
fb.d_side, fb.d_front, gam)
|
fb.d_side, fb.d_front, f32(gam-1))
|
||||||
tref.set_address_2d(fb.d_side, dsc, 16 * dim.astride)
|
tref.set_address_2d(fb.d_side, dsc, 16 * dim.astride)
|
||||||
launch2('full_blur', self.mod, stream, dim,
|
launch2('full_blur', self.mod, stream, dim,
|
||||||
fb.d_back, i32(2), i32(0), texrefs=[tref])
|
fb.d_back, i32(2), i32(0), texrefs=[tref])
|
||||||
@ -130,19 +136,17 @@ class SmearClip(Filter, ClsMod):
|
|||||||
launch2('full_blur', self.mod, stream, dim,
|
launch2('full_blur', self.mod, stream, dim,
|
||||||
fb.d_side, i32(3), i32(0), texrefs=[tref])
|
fb.d_side, i32(3), i32(0), texrefs=[tref])
|
||||||
launch2('smearclip', self.mod, stream, dim,
|
launch2('smearclip', self.mod, stream, dim,
|
||||||
fb.d_front, fb.d_side, gam)
|
fb.d_front, fb.d_side, f32(gam-1), lin, lingam)
|
||||||
|
|
||||||
class ColorClip(Filter, ClsMod):
|
class ColorClip(Filter, ClsMod):
|
||||||
lib = code.filters.colorcliplib
|
lib = code.filters.colorcliplib
|
||||||
def apply(self, fb, gprof, params, dim, tc, stream=None):
|
def apply(self, fb, gprof, params, dim, tc, stream=None):
|
||||||
gam = f32(1 / params.gamma(tc))
|
|
||||||
vib = f32(params.vibrance(tc))
|
vib = f32(params.vibrance(tc))
|
||||||
hipow = f32(params.highlight_power(tc))
|
hipow = f32(params.highlight_power(tc))
|
||||||
lin = f32(params.gamma_threshold(tc))
|
gam, lin, lingam = calc_lingam(params, tc)
|
||||||
lingam = f32(lin ** (gam-1.0) if lin > 0 else 0)
|
|
||||||
|
|
||||||
launch2('colorclip', self.mod, stream, dim,
|
launch2('colorclip', self.mod, stream, dim,
|
||||||
fb.d_front, gam, vib, hipow, lin, lingam)
|
fb.d_front, vib, hipow, gam, lin, lingam)
|
||||||
|
|
||||||
# Ungainly but practical.
|
# Ungainly but practical.
|
||||||
filter_map = dict(bilateral=Bilateral, logscale=Logscale, haloclip=HaloClip,
|
filter_map = dict(bilateral=Bilateral, logscale=Logscale, haloclip=HaloClip,
|
||||||
|
Loading…
Reference in New Issue
Block a user