Index: app/tools/gimptransformtool.c =================================================================== --- app/tools/gimptransformtool.c (revision 28237) +++ app/tools/gimptransformtool.c (working copy) @@ -801,7 +801,7 @@ { gint gci, i, k; - k = tr_tool->ngx + tr_tool->ngy; + k = tr_tool->ngx + 2 + tr_tool->ngy + 2; for (i = 0, gci = 0; i < k; i++, gci += 4) { @@ -1324,9 +1324,15 @@ tr_tool->x2, tr_tool->y2, &tr_tool->tx4, &tr_tool->ty4); + fprintf(stderr, "\nBefore: (%f, %f) -> (%f, %f)\n", tr_tool->cx, tr_tool->cy, + tr_tool->tcx, tr_tool->tcy); + gimp_matrix3_transform_point (&tr_tool->transform, tr_tool->cx, tr_tool->cy, &tr_tool->tcx, &tr_tool->tcy); + + fprintf(stderr, " After: (%f, %f) -> (%f, %f)\n\n", tr_tool->cx, tr_tool->cy, + tr_tool->tcx, tr_tool->tcy); if (tr_tool->grid_coords && tr_tool->tgrid_coords) { @@ -1334,7 +1340,7 @@ gint gci; gci = 0; - k = (tr_tool->ngx + tr_tool->ngy) * 2; + k = (tr_tool->ngx + 2 + tr_tool->ngy + 2) * 2; for (i = 0; i < k; i++) { @@ -1343,6 +1349,11 @@ tr_tool->grid_coords[gci + 1], &tr_tool->tgrid_coords[gci], &tr_tool->tgrid_coords[gci + 1]); +/* fprintf(stderr, "Step %d/%d transformed (%f, %f) to (%f, %f)\n", i, k, + tr_tool->grid_coords[gci], + tr_tool->grid_coords[gci + 1], + tr_tool->tgrid_coords[gci], + tr_tool->tgrid_coords[gci + 1]);*/ gci += 2; } } @@ -1559,7 +1570,9 @@ GimpTool *tool; gint i, gci; gdouble *coords; + gdouble h_stride, v_stride; gint width, height; + gdouble x_off, y_off; width = MAX (1, tr_tool->x2 - tr_tool->x1); height = MAX (1, tr_tool->y2 - tr_tool->y1); @@ -1572,46 +1585,67 @@ { tr_tool->ngx = options->grid_size; tr_tool->ngy = tr_tool->ngx * MAX (1, height / width); + + h_stride = width / (options->grid_size + 1); + v_stride = height / (options->grid_size + 1); } else { tr_tool->ngy = options->grid_size; tr_tool->ngx = tr_tool->ngy * MAX (1, width / height); + + v_stride = height / (options->grid_size + 1); + h_stride = width / (options->grid_size + 1); } } else /* GIMP_TRANSFORM_GRID_TYPE_SPACING */ { gint grid_size = MAX (2, options->grid_size); + + h_stride = v_stride = grid_size; tr_tool->ngx = width / grid_size; tr_tool->ngy = height / grid_size; } + x_off = fmod(tr_tool->tcx, h_stride); + y_off = fmod(tr_tool->tcy, v_stride); + + fprintf(stderr, "\n"); + fprintf(stderr, "tcx = %f\ttcy = %f\n", tr_tool->tcx, tr_tool->tcy); + fprintf(stderr, "cx = %f\tcy = %f\th_stride = %f\tv_stride = %f\n", + tr_tool->cx, tr_tool->cy, h_stride, v_stride); + fprintf(stderr, "x_off = %f\ty_off = %f\n", x_off, y_off); + tr_tool->grid_coords = coords = - g_new (gdouble, (tr_tool->ngx + tr_tool->ngy) * 4); + g_new (gdouble, (tr_tool->ngx + 2 + tr_tool->ngy + 2) * 4); tr_tool->tgrid_coords = - g_new (gdouble, (tr_tool->ngx + tr_tool->ngy) * 4); + g_new (gdouble, (tr_tool->ngx + 2 + tr_tool->ngy + 2) * 4); gci = 0; - for (i = 1; i <= tr_tool->ngx; i++) + for (i = 0; i <= tr_tool->ngx + 1; i++) { + /* endpoints for vertical gridlines */ coords[gci] = tr_tool->x1 + (((gdouble) i) / (tr_tool->ngx + 1) * - (tr_tool->x2 - tr_tool->x1)); - coords[gci + 1] = tr_tool->y1; + (tr_tool->x2 - tr_tool->x1)) + + x_off; + coords[gci + 1] = tr_tool->y1 + y_off - v_stride; coords[gci + 2] = coords[gci]; - coords[gci + 3] = tr_tool->y2; + coords[gci + 3] = tr_tool->y2 + y_off + v_stride; gci += 4; } - for (i = 1; i <= tr_tool->ngy; i++) + for (i = 0; i <= tr_tool->ngy + 1; i++) { - coords[gci] = tr_tool->x1; + /* endpoints for horizontal gridlines */ + coords[gci] = tr_tool->x1 + x_off - h_stride; coords[gci + 1] = tr_tool->y1 + (((gdouble) i) / (tr_tool->ngy + 1) * - (tr_tool->y2 - tr_tool->y1)); - coords[gci + 2] = tr_tool->x2; + (tr_tool->y2 - tr_tool->y1)) + + y_off; + coords[gci + 2] = tr_tool->x2 + x_off + h_stride; coords[gci + 3] = coords[gci + 1]; gci += 4; @@ -1734,6 +1768,7 @@ if (GIMP_TRANSFORM_TOOL_GET_CLASS (tr_tool)->recalc) GIMP_TRANSFORM_TOOL_GET_CLASS (tr_tool)->recalc (tr_tool, display); + gimp_transform_tool_grid_recalc (tr_tool); gimp_transform_tool_transform_bounding_box (tr_tool); gimp_transform_tool_dialog_update (tr_tool);