mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-03-07 19:51:51 +09:00
TAV sharpen filters
This commit is contained in:
@@ -4670,13 +4670,13 @@ class GraphicsJSR223Delegate(private val vm: VM) {
|
|||||||
val tileHeight = if (isMonoblock) height else PADDED_TILE_SIZE_Y
|
val tileHeight = if (isMonoblock) height else PADDED_TILE_SIZE_Y
|
||||||
|
|
||||||
if (isLossless) {
|
if (isLossless) {
|
||||||
tavApplyDWTInverseMultiLevel(yTile, tileWidth, tileHeight, decompLevels, 0, TavFilterIntra)
|
tavApplyDWTInverseMultiLevel(yTile, tileWidth, tileHeight, decompLevels, 0, TavSharpenNormal)
|
||||||
tavApplyDWTInverseMultiLevel(coTile, tileWidth, tileHeight, decompLevels, 0, TavFilterIntra)
|
tavApplyDWTInverseMultiLevel(coTile, tileWidth, tileHeight, decompLevels, 0, TavSharpenNormal)
|
||||||
tavApplyDWTInverseMultiLevel(cgTile, tileWidth, tileHeight, decompLevels, 0, TavFilterIntra)
|
tavApplyDWTInverseMultiLevel(cgTile, tileWidth, tileHeight, decompLevels, 0, TavSharpenNormal)
|
||||||
} else {
|
} else {
|
||||||
tavApplyDWTInverseMultiLevel(yTile, tileWidth, tileHeight, decompLevels, waveletFilter, TavFilterIntra)
|
tavApplyDWTInverseMultiLevel(yTile, tileWidth, tileHeight, decompLevels, waveletFilter, TavSharpenNormal)
|
||||||
tavApplyDWTInverseMultiLevel(coTile, tileWidth, tileHeight, decompLevels, waveletFilter, TavFilterIntra)
|
tavApplyDWTInverseMultiLevel(coTile, tileWidth, tileHeight, decompLevels, waveletFilter, TavSharpenNormal)
|
||||||
tavApplyDWTInverseMultiLevel(cgTile, tileWidth, tileHeight, decompLevels, waveletFilter, TavFilterIntra)
|
tavApplyDWTInverseMultiLevel(cgTile, tileWidth, tileHeight, decompLevels, waveletFilter, TavSharpenNormal)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Debug: Check coefficient values after inverse DWT
|
// Debug: Check coefficient values after inverse DWT
|
||||||
@@ -5172,13 +5172,13 @@ class GraphicsJSR223Delegate(private val vm: VM) {
|
|||||||
val tileHeight = if (isMonoblock) height else PADDED_TILE_SIZE_Y
|
val tileHeight = if (isMonoblock) height else PADDED_TILE_SIZE_Y
|
||||||
|
|
||||||
if (isLossless) {
|
if (isLossless) {
|
||||||
tavApplyDWTInverseMultiLevel(currentY, tileWidth, tileHeight, decompLevels, 0, TavFilterDelta)
|
tavApplyDWTInverseMultiLevel(currentY, tileWidth, tileHeight, decompLevels, 0, TavSharpenNormal)
|
||||||
tavApplyDWTInverseMultiLevel(currentCo, tileWidth, tileHeight, decompLevels, 0, TavFilterDelta)
|
tavApplyDWTInverseMultiLevel(currentCo, tileWidth, tileHeight, decompLevels, 0, TavSharpenNormal)
|
||||||
tavApplyDWTInverseMultiLevel(currentCg, tileWidth, tileHeight, decompLevels, 0, TavFilterDelta)
|
tavApplyDWTInverseMultiLevel(currentCg, tileWidth, tileHeight, decompLevels, 0, TavSharpenNormal)
|
||||||
} else {
|
} else {
|
||||||
tavApplyDWTInverseMultiLevel(currentY, tileWidth, tileHeight, decompLevels, waveletFilter, TavFilterDelta)
|
tavApplyDWTInverseMultiLevel(currentY, tileWidth, tileHeight, decompLevels, waveletFilter, TavSharpenNormal)
|
||||||
tavApplyDWTInverseMultiLevel(currentCo, tileWidth, tileHeight, decompLevels, waveletFilter, TavFilterDelta)
|
tavApplyDWTInverseMultiLevel(currentCo, tileWidth, tileHeight, decompLevels, waveletFilter, TavSharpenNormal)
|
||||||
tavApplyDWTInverseMultiLevel(currentCg, tileWidth, tileHeight, decompLevels, waveletFilter, TavFilterDelta)
|
tavApplyDWTInverseMultiLevel(currentCg, tileWidth, tileHeight, decompLevels, waveletFilter, TavSharpenNormal)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Debug: Check coefficient values after inverse DWT
|
// Debug: Check coefficient values after inverse DWT
|
||||||
@@ -5264,25 +5264,45 @@ class GraphicsJSR223Delegate(private val vm: VM) {
|
|||||||
|
|
||||||
private interface TavWaveletFilter {
|
private interface TavWaveletFilter {
|
||||||
fun getCoeffMultiplier(level: Int): Float // level 0: finest
|
fun getCoeffMultiplier(level: Int): Float // level 0: finest
|
||||||
|
|
||||||
|
fun applyGain(level: Int, c: Float): Float {
|
||||||
|
val T = 2f
|
||||||
|
val gain = getCoeffMultiplier(level)
|
||||||
|
return if (c.absoluteValue < T)
|
||||||
|
c * (1f + (gain - 1f) * c.absoluteValue / T)
|
||||||
|
else
|
||||||
|
c * gain
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private object TavFilterDelta : TavWaveletFilter {
|
private object TavSharpenNormal : TavWaveletFilter {
|
||||||
override fun getCoeffMultiplier(level: Int): Float {
|
override fun getCoeffMultiplier(level: Int): Float {
|
||||||
// return 1f
|
return when (level) {
|
||||||
return when(level) {
|
0 -> 1.18f
|
||||||
0 -> 6f/5f
|
1 -> 1.02f
|
||||||
1 -> 5f/6f
|
2 -> 0.85f
|
||||||
else -> 1f
|
else -> 1f
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private object TavFilterIntra : TavWaveletFilter {
|
private object TavSharpenWeak : TavWaveletFilter {
|
||||||
override fun getCoeffMultiplier(level: Int): Float {
|
override fun getCoeffMultiplier(level: Int): Float {
|
||||||
// return 1f
|
|
||||||
return when (level) {
|
return when (level) {
|
||||||
0 -> 6f/5f
|
0 -> 1.08f
|
||||||
1 -> 5f/6f
|
1 -> 1.01f
|
||||||
|
2 -> 0.93f
|
||||||
|
else -> 1f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private object TavSharpenStrong : TavWaveletFilter {
|
||||||
|
override fun getCoeffMultiplier(level: Int): Float {
|
||||||
|
return when (level) {
|
||||||
|
0 -> 1.30f
|
||||||
|
1 -> 1.05f
|
||||||
|
2 -> 0.77f
|
||||||
else -> 1f
|
else -> 1f
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5325,7 +5345,7 @@ class GraphicsJSR223Delegate(private val vm: VM) {
|
|||||||
// Column inverse transform first (vertical)
|
// Column inverse transform first (vertical)
|
||||||
for (x in 0 until currentWidth) {
|
for (x in 0 until currentWidth) {
|
||||||
for (y in 0 until currentHeight) {
|
for (y in 0 until currentHeight) {
|
||||||
tempCol[y] = data[y * width + x] * sharpenFilter.getCoeffMultiplier(level)
|
tempCol[y] = sharpenFilter.applyGain(level, data[y * width + x])
|
||||||
}
|
}
|
||||||
|
|
||||||
if (filterType == 0) {
|
if (filterType == 0) {
|
||||||
@@ -5348,7 +5368,7 @@ class GraphicsJSR223Delegate(private val vm: VM) {
|
|||||||
// Row inverse transform second (horizontal)
|
// Row inverse transform second (horizontal)
|
||||||
for (y in 0 until currentHeight) {
|
for (y in 0 until currentHeight) {
|
||||||
for (x in 0 until currentWidth) {
|
for (x in 0 until currentWidth) {
|
||||||
tempRow[x] = data[y * width + x] * sharpenFilter.getCoeffMultiplier(level)
|
tempRow[x] = sharpenFilter.applyGain(level, data[y * width + x])
|
||||||
}
|
}
|
||||||
|
|
||||||
if (filterType == 0) {
|
if (filterType == 0) {
|
||||||
|
|||||||
Reference in New Issue
Block a user