made value_blur nicer to use and took care of edges

This commit is contained in:
Ahmet Inan 2014-12-11 14:17:24 +01:00
parent 40eb37a40d
commit e4d0264d95
3 changed files with 1154 additions and 31 deletions

View file

@ -24,7 +24,24 @@ double gauss(double x, double radius)
}
void emit(int radius)
{
printf("\t\tif (i < %d || (buffer_length - %d) <= i)\n\t\t\treturn 0;\n", radius, radius);
printf("\t\tif ((i-%d) < begin || end <= (i+%d)) {\n", radius, radius);
for (int i = -radius; i < 0; ++i) {
printf("\t\t\tif (begin <= (i%d)) {\n", i);
printf("\t\t\t\tweight_sum += %d;\n",
(int)(16384 * gauss(i, radius)));
printf("\t\t\t\tvalue_sum += %d * value_buffer[i%d];\n",
(int)(16384 * gauss(i, radius)), i);
printf("\t\t\t}\n");
}
for (int i = 0; i <= radius; ++i) {
printf("\t\t\tif ((i+%d) < end) {\n", i);
printf("\t\t\t\tweight_sum += %d;\n",
(int)(16384 * gauss(i, radius)));
printf("\t\t\t\tvalue_sum += %d * value_buffer[i+%d];\n",
(int)(16384 * gauss(i, radius)), i);
printf("\t\t\t}\n");
}
printf("\t\t\treturn value_sum / weight_sum;\n\t\t}\n");
int sum = 0;
for (int i = -radius; i <= radius; ++i)
sum += 16384 * gauss(i, radius);
@ -41,7 +58,11 @@ void emit(int radius)
int main()
{
printf("/* code generated by 'utils/blur.c' */\n");
printf("static uchar value_blur(int i)\n{\n\tswitch (blur_power) {\n");
printf("static uchar value_blur(int pixel, int begin, int end)\n{\n");
printf("\tint i = (pixel * (end - begin) + (end - begin) / 2) / bitmap_width + begin;\n");
printf("\tint weight_sum = 0;\n");
printf("\tint value_sum = 0;\n");
printf("\tswitch (blur_power) {\n");
for (int i = 0; i < 7; ++i) {
printf("\tcase %d:\n", i);
emit((1 << i) | 1);