WIP: replaced linear with much more flexible circular buffer

This commit is contained in:
Ahmet Inan 2015-01-01 17:06:48 +01:00
parent 3743d023f9
commit a69b4089f5
8 changed files with 630 additions and 652 deletions

View file

@ -24,20 +24,20 @@ double gauss(double x, double radius)
}
void emit(int radius)
{
printf("\t\tif ((i-%d) < begin || end <= (i+%d)) {\n", radius, radius);
printf("\t\tif ((p-%d) < begin || end <= (p+%d) || (i-%d) < 0 || buffer_length <= (i+%d)) {\n", radius, radius, radius, radius);
for (int i = -radius; i < 0; ++i) {
printf("\t\t\tif (begin <= (i%d)) {\n", i);
printf("\t\t\tif (begin <= (p%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",
printf("\t\t\t\tvalue_sum += %d * value_buffer[(i%d)&buffer_mask];\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\tif ((p+%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",
printf("\t\t\t\tvalue_sum += %d * value_buffer[(i+%d)&buffer_mask];\n",
(int)(16384 * gauss(i, radius)), i);
printf("\t\t\t}\n");
}
@ -59,7 +59,8 @@ int main()
{
printf("/* code generated by 'utils/blur.c' */\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 p = (pixel * (end - begin) + (end - begin) / 2) / bitmap_width + begin;\n");
printf("\tint i = p & buffer_mask;\n");
printf("\tint weight_sum = 0;\n");
printf("\tint value_sum = 0;\n");
printf("\tswitch (blur_power) {\n");
@ -67,6 +68,6 @@ int main()
printf("\tcase %d:\n", i);
emit((1 << i) | 1);
}
printf("\tdefault:\n\t\tif (i < begin || end <= i)\n\t\t\treturn 0;\n\t\treturn value_buffer[i];\n\t}\n\treturn 0;\n}\n");
printf("\tdefault:\n\t\treturn value_buffer[i];\n\t}\n\treturn 0;\n}\n");
return 0;
}