fix for crash in auto ketframe.

This commit is contained in:
Campbell Barton
2012-05-25 11:41:42 +00:00
parent c6e0d24d02
commit e70316f3b2

View File

@@ -1347,6 +1347,9 @@ void BKE_mask_object_shape_changed_add(MaskObject *maskobj, int index,
if (BKE_mask_object_shape_spline_index(maskobj, index,
&spline, &spline_point_index))
{
/* sanity check */
int tot = BKE_mask_object_shape_totvert(maskobj);
/* for interpolation */
/* TODO - assumes closed curve for now */
float uv[3][2]; /* 3x 2D handles */
@@ -1373,44 +1376,49 @@ void BKE_mask_object_shape_changed_add(MaskObject *maskobj, int index,
maskobj_shape;
maskobj_shape = maskobj_shape->next)
{
float *data_resized;
if (tot == maskobj_shape->tot_vert) {
float *data_resized;
maskobj_shape->tot_vert++;
data_resized = MEM_mallocN(maskobj_shape->tot_vert * sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE, __func__);
if (index > 0) {
memcpy(data_resized,
maskobj_shape->data,
index * sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE);
}
maskobj_shape->tot_vert++;
data_resized = MEM_mallocN(maskobj_shape->tot_vert * sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE, __func__);
if (index > 0) {
memcpy(data_resized,
maskobj_shape->data,
index * sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE);
}
if (index != maskobj_shape->tot_vert - 1) {
memcpy(&data_resized[(index + 1) * MASK_OBJECT_SHAPE_ELEM_SIZE],
maskobj_shape->data + (index * MASK_OBJECT_SHAPE_ELEM_SIZE),
(maskobj_shape->tot_vert - (index + 1)) * sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE);
}
if (index != maskobj_shape->tot_vert - 1) {
memcpy(&data_resized[(index + 1) * MASK_OBJECT_SHAPE_ELEM_SIZE],
maskobj_shape->data + (index * MASK_OBJECT_SHAPE_ELEM_SIZE),
(maskobj_shape->tot_vert - (index + 1)) * sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE);
}
if (do_init) {
float *fp = &data_resized[index * MASK_OBJECT_SHAPE_ELEM_SIZE];
if (do_init) {
float *fp = &data_resized[index * MASK_OBJECT_SHAPE_ELEM_SIZE];
mask_object_shape_from_mask_point(&spline->points[spline_point_index].bezt, fp);
mask_object_shape_from_mask_point(&spline->points[spline_point_index].bezt, fp);
if (do_init_interpolate) {
for (i = 0; i < 3; i++) {
interp_weights_uv_v2_apply(uv[i],
&fp[i * 2],
&data_resized[(pi_prev_abs * MASK_OBJECT_SHAPE_ELEM_SIZE) + (i * 2)],
&data_resized[(pi_next_abs * MASK_OBJECT_SHAPE_ELEM_SIZE) + (i * 2)]);
if (do_init_interpolate) {
for (i = 0; i < 3; i++) {
interp_weights_uv_v2_apply(uv[i],
&fp[i * 2],
&data_resized[(pi_prev_abs * MASK_OBJECT_SHAPE_ELEM_SIZE) + (i * 2)],
&data_resized[(pi_next_abs * MASK_OBJECT_SHAPE_ELEM_SIZE) + (i * 2)]);
}
}
}
else {
memset(&data_resized[index * MASK_OBJECT_SHAPE_ELEM_SIZE],
0,
sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE);
}
MEM_freeN(maskobj_shape->data);
maskobj_shape->data = data_resized;
}
else {
memset(&data_resized[index * MASK_OBJECT_SHAPE_ELEM_SIZE],
0,
sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE);
printf("%s: vert mismatch %d != %d\n", __func__, maskobj_shape->tot_vert, tot);
}
MEM_freeN(maskobj_shape->data);
maskobj_shape->data = data_resized;
}
}
}