diff options
| author | Mattias Andrée <maandree@kth.se> | 2023-01-31 22:25:16 +0100 | 
|---|---|---|
| committer | Mattias Andrée <maandree@kth.se> | 2023-01-31 22:25:16 +0100 | 
| commit | e31c7edb75d4253a092a5fa9fde809e07a2563b4 (patch) | |
| tree | 45fbddd5027c5035b8d44f47c8d15a4772f5075c | |
| parent | Add tests for and fix libglitter_redistribute_energy_double (diff) | |
| download | libglitter-e31c7edb75d4253a092a5fa9fde809e07a2563b4.tar.gz libglitter-e31c7edb75d4253a092a5fa9fde809e07a2563b4.tar.bz2 libglitter-e31c7edb75d4253a092a5fa9fde809e07a2563b4.tar.xz | |
libglitter_redistribute_energy_double: add more tests and fix typo in code
Signed-off-by: Mattias Andrée <maandree@kth.se>
| -rw-r--r-- | libglitter_redistribute_energy_double.c | 110 | 
1 files changed, 105 insertions, 5 deletions
| diff --git a/libglitter_redistribute_energy_double.c b/libglitter_redistribute_energy_double.c index ce889de..6b57c0e 100644 --- a/libglitter_redistribute_energy_double.c +++ b/libglitter_redistribute_energy_double.c @@ -36,7 +36,7 @@ vconvolute(double *restrict raster, size_t rowsize, size_t width, size_t height,  		for (y = 0; y < kernelsize - 1; y++) {  			for (x = 0; x < width; x++)  				raster[x] *= kernel[0]; -			for (i = 1; i < kernelsize - i - y; i++) +			for (i = 1; i < kernelsize - 1 - y; i++)  				for (x = 0; x < width; x++)  					raster[x] = fma(raster[x + i * rowsize], kernel[i], raster[x]);  			raster = &raster[rowsize]; @@ -113,8 +113,8 @@ eq(double a, double b)  int  main(void)  { -	double raster[100], hkern[15], vkern[15]; -	size_t i; +	double raster[100], hkern[5], vkern[5]; +	size_t i, j;  	for (i = 0; i < sizeof(raster) / sizeof(*raster); i++)  		raster[i] = (double)i; @@ -200,8 +200,108 @@ main(void)  		if (i != 15 && i != 25 && i != 35 && i != 55 && i != 65 && i != 75)  			ASSERT(!raster[i]); -	/* TODO test edges */ -	/* TODO test hkern+vkern */ +	memset(raster, 0, sizeof(raster)); +	for (j = 20; j < 100; j += 10) +		for (i = 2; i < 10; i += 1) +			raster[j + i] = 1; +	vkern[0] = 1 / 3.; +	vkern[1] = 1 / 3.; +	vkern[2] = 1 / 3.; +	hkern[0] = 1 / 3.; +	hkern[1] = 1 / 3.; +	hkern[2] = 1 / 3.; +	libglitter_redistribute_energy_double(&raster[22], 10, 8, 8, 3, 3, hkern, vkern); +	for (j = 0; j < 100; j += 10) +		for (i = 0; i < 10; i += 1) +			ASSERT(eq(raster[j + i], +			          ((i == 0 || i == 9) ? 1 / 3. : +			           (i == 1 || i == 8) ? 2 / 3. : 1.) * +			          ((j ==  0 || j == 90) ? 1 / 3. : +			           (j == 10 || j == 80) ? 2 / 3. : 1.))); + +	memset(raster, 0, sizeof(raster)); +	for (j = 20; j < 100; j += 10) +		for (i = 2; i < 10; i += 1) +			raster[j + i] = 1; +	vkern[0] = 1 / 3.; +	vkern[1] = 1 / 3.; +	vkern[2] = 1 / 3.; +	hkern[0] = 2 / 9.; +	hkern[1] = 5 / 9.; +	hkern[2] = 2 / 9.; +	libglitter_redistribute_energy_double(&raster[22], 10, 8, 8, 3, 3, hkern, vkern); +	for (j = 0; j < 100; j += 10) +		for (i = 0; i < 10; i += 1) +			ASSERT(eq(raster[j + i], +			          ((i == 0 || i == 9) ? 2 / 9. : +			           (i == 1 || i == 8) ? 7 / 9. : 1.) * +			          ((j ==  0 || j == 90) ? 1 / 3. : +			           (j == 10 || j == 80) ? 2 / 3. : 1.))); + +	memset(raster, 0, sizeof(raster)); +	for (j = 20; j < 100; j += 10) +		for (i = 2; i < 10; i += 1) +			raster[j + i] = 1; +	vkern[0] = 2 / 9.; +	vkern[1] = 5 / 9.; +	vkern[2] = 2 / 9.; +	hkern[0] = 1 / 3.; +	hkern[1] = 1 / 3.; +	hkern[2] = 1 / 3.; +	libglitter_redistribute_energy_double(&raster[22], 10, 8, 8, 3, 3, hkern, vkern); +	for (j = 0; j < 100; j += 10) +		for (i = 0; i < 10; i += 1) +			ASSERT(eq(raster[j + i], +			          ((i == 0 || i == 9) ? 1 / 3. : +			           (i == 1 || i == 8) ? 2 / 3. : 1.) * +			          ((j ==  0 || j == 90) ? 2 / 9. : +			           (j == 10 || j == 80) ? 7 / 9. : 1.))); + +	memset(raster, 0, sizeof(raster)); +	for (j = 20; j < 100; j += 10) +		for (i = 2; i < 10; i += 1) +			raster[j + i] = 1; +	vkern[0] = 2 / 9.; +	vkern[1] = 5 / 9.; +	vkern[2] = 2 / 9.; +	hkern[0] = 2 / 9.; +	hkern[1] = 5 / 9.; +	hkern[2] = 2 / 9.; +	libglitter_redistribute_energy_double(&raster[22], 10, 8, 8, 3, 3, hkern, vkern); +	for (j = 0; j < 100; j += 10) +		for (i = 0; i < 10; i += 1) +			ASSERT(eq(raster[j + i], +			          ((i == 0 || i == 9) ? 2 / 9. : +			           (i == 1 || i == 8) ? 7 / 9. : 1.) * +			          ((j ==  0 || j == 90) ? 2 / 9. : +			           (j == 10 || j == 80) ? 7 / 9. : 1.))); + +	memset(raster, 0, sizeof(raster)); +	for (j = 40; j < 100; j += 10) +		for (i = 4; i < 10; i += 1) +			raster[j + i] = 1; +	vkern[0] = 1 / 5.; +	vkern[1] = 1 / 5.; +	vkern[2] = 1 / 5.; +	vkern[3] = 1 / 5.; +	vkern[4] = 1 / 5.; +	hkern[0] = 1 / 9.; +	hkern[1] = 2 / 9.; +	hkern[2] = 3 / 9.; +	hkern[3] = 2 / 9.; +	hkern[4] = 1 / 9.; +	libglitter_redistribute_energy_double(&raster[44], 10, 6, 6, 5, 5, hkern, vkern); +	for (j = 0; j < 100; j += 10) +		for (i = 0; i < 10; i += 1) +			ASSERT(eq(raster[j + i], +			          ((i == 0 || i == 9) ? 1 / 9. : +			           (i == 1 || i == 8) ? 3 / 9. : +			           (i == 2 || i == 7) ? 6 / 9. : +			           (i == 3 || i == 6) ? 8 / 9. : 1.) * +			          ((j ==  0 || j == 90) ? 1 / 5. : +			           (j == 10 || j == 80) ? 2 / 5. : +			           (j == 20 || j == 70) ? 3 / 5. : +			           (j == 30 || j == 60) ? 4 / 5. : 1.)));  	return 0;  } | 
