17{
18 qreal err = 0;
19
20 if (h < 3 || w < 3) {
21 int size = 3 * w * h;
22
23 for (int i = 0; i < size; i++) {
24 sol[i] = 1.0;
25 }
26
27 warnKrita <<
"WARNING: healing width or height are smaller than 3 px. The result will have artifacts!";
28
29 } else {
30 int rowstride = 3 *
w;
31
32 memcpy(sol, m, 3 * sizeof(qreal) * w);
33 m += rowstride;
34 sol += rowstride;
35 for (
int i = 1; i <
h - 1; i++) {
36 memcpy(sol, m, 3 * sizeof(qreal));
37 m += 3; sol += 3;
38 for (int j = 3; j < rowstride - 3; j++) {
40 *sol = ((*(m - 3) + * (m + 3) + * (m - rowstride) + * (m + rowstride)) + 2 * *m) / 6;
41 qreal diff = *sol -
tmp;
42 err += diff * diff;
43 m ++; sol ++;
44 }
45 memcpy(sol, m, 3 * sizeof(qreal));
46 m += 3; sol += 3;
47 }
48 memcpy(sol, m, 3 * sizeof(qreal) * w);
49 }
50
51 return err;
52}