summaryrefslogtreecommitdiffstats
path: root/tools/kernelgen.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/kernelgen.c')
-rw-r--r--tools/kernelgen.c128
1 files changed, 128 insertions, 0 deletions
diff --git a/tools/kernelgen.c b/tools/kernelgen.c
new file mode 100644
index 0000000..e2d8ef0
--- /dev/null
+++ b/tools/kernelgen.c
@@ -0,0 +1,128 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * kernelgen -- Copyright (C) 2000 Sven Neumann <sven@gimp.org>
+ *
+ * Simple hack to create brush subsampling kernels. If you want to
+ * play with it, change some of the #defines at the top and copy
+ * the output to app/paint/gimpbrushcore-kernels.h.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <math.h>
+#include <stdio.h>
+#include <string.h>
+
+
+#define STEPS 64
+#define KERNEL_WIDTH 3 /* changing these makes no sense */
+#define KERNEL_HEIGHT 3 /* changing these makes no sense */
+#define KERNEL_SUM 256
+#define SUBSAMPLE 4
+#define THRESHOLD 0.25 /* try to change this one */
+
+#define SQR(x) ((x) * (x))
+
+static void
+create_kernel (double x,
+ double y)
+{
+ double value[KERNEL_WIDTH][KERNEL_HEIGHT];
+ double dist_x;
+ double dist_y;
+ double sum;
+ double w;
+ int i, j;
+
+ memset (value, 0, KERNEL_WIDTH * KERNEL_HEIGHT * sizeof (double));
+ sum = 0.0;
+
+ x += 1.0;
+ y += 1.0;
+
+ for (j = 0; j < STEPS * KERNEL_HEIGHT; j++)
+ {
+ dist_y = y - (((double)j + 0.5) / (double)STEPS);
+
+ for (i = 0; i < STEPS * KERNEL_WIDTH; i++)
+ {
+ dist_x = x - (((double) i + 0.5) / (double) STEPS);
+
+ /* I've tried to use a gauss function here instead of a
+ threshold, but the result was not that impressive. */
+ w = (SQR (dist_x) + SQR (dist_y)) < THRESHOLD ? 1.0 : 0.0;
+
+ value[i / STEPS][j / STEPS] += w;
+ sum += w;
+ }
+ }
+
+ for (j = 0; j < KERNEL_HEIGHT; j++)
+ {
+ for (i = 0; i < KERNEL_WIDTH; i++)
+ {
+ w = (double) KERNEL_SUM * value[i][j] / sum;
+ printf (" %3d,", (int) (w + 0.5));
+ }
+ }
+}
+
+int
+main (int argc,
+ char **argv)
+{
+ int i, j;
+ double x, y;
+
+ printf ("/* gimpbrushcore-kernels.h\n"
+ " *\n"
+ " * This file was generated using kernelgen as found in the tools dir.\n");
+ printf (" * (threshold = %g)\n", THRESHOLD);
+ printf (" */\n\n");
+ printf ("#ifndef __GIMP_BRUSH_CORE_KERNELS_H__\n");
+ printf ("#define __GIMP_BRUSH_CORE_KERNELS_H__\n\n");
+ printf ("#define KERNEL_WIDTH %d\n", KERNEL_WIDTH);
+ printf ("#define KERNEL_HEIGHT %d\n", KERNEL_HEIGHT);
+ printf ("#define KERNEL_SUBSAMPLE %d\n", SUBSAMPLE);
+ printf ("#define KERNEL_SUM %d\n", KERNEL_SUM);
+ printf ("\n\n");
+ printf ("/* Brush pixel subsampling kernels */\n");
+ printf ("static const int subsample[%d][%d][%d] =\n{\n",
+ SUBSAMPLE + 1, SUBSAMPLE + 1, KERNEL_WIDTH * KERNEL_HEIGHT);
+
+ for (j = 0; j <= SUBSAMPLE; j++)
+ {
+ y = (double) j / (double) SUBSAMPLE;
+
+ printf (" {\n");
+
+ for (i = 0; i <= SUBSAMPLE; i++)
+ {
+ x = (double) i / (double) SUBSAMPLE;
+
+ printf (" {");
+ create_kernel (x, y);
+ printf (" }%s", i < SUBSAMPLE ? ",\n" : "\n");
+ }
+
+ printf (" }%s", j < SUBSAMPLE ? ",\n" : "\n");
+ }
+
+ printf ("};\n\n");
+
+ printf ("#endif /* __GIMP_BRUSH_CORE_KERNELS_H__ */\n");
+
+ return 0;
+}