Exemplo n.º 1
0
/* make a copy of a given gpencil datablock */
bGPdata *gpencil_data_duplicate(bGPdata *src, bool internal_copy)
{
    bGPDlayer *gpl, *gpld;
    bGPdata *dst;

    /* error checking */
    if (src == NULL)
        return NULL;

    /* make a copy of the base-data */
    if (internal_copy) {
        /* make a straight copy for undo buffers used during stroke drawing */
        dst = MEM_dupallocN(src);
    }
    else {
        /* make a copy when others use this */
        dst = BKE_libblock_copy(&src->id);
    }

    /* copy layers */
    BLI_listbase_clear(&dst->layers);
    for (gpl = src->layers.first; gpl; gpl = gpl->next) {
        /* make a copy of source layer and its data */
        gpld = gpencil_layer_duplicate(gpl);
        BLI_addtail(&dst->layers, gpld);
    }

    /* return new */
    return dst;
}
Exemplo n.º 2
0
int ED_undo_gpencil_step(bContext *C, int step, const char *name)
{
	bGPdata **gpd_ptr = NULL, *new_gpd = NULL;

	gpd_ptr = gpencil_data_get_pointers(C, NULL);

	if (step == 1) {  /* undo */
		//printf("\t\tGP - undo step\n");
		if (cur_node->prev) {
			if (!name || strcmp(cur_node->name, name) == 0) {
				cur_node = cur_node->prev;
				new_gpd = cur_node->gpd;
			}
		}
	}
	else if (step == -1) {
		//printf("\t\tGP - redo step\n");
		if (cur_node->next) {
			if (!name || strcmp(cur_node->name, name) == 0) {
				cur_node = cur_node->next;
				new_gpd = cur_node->gpd;
			}
		}
	}

	if (new_gpd) {
		if (gpd_ptr) {
			if (*gpd_ptr) {
				bGPdata *gpd = *gpd_ptr;
				bGPDlayer *gpl, *gpld;

				free_gpencil_layers(&gpd->layers);

				/* copy layers */
				gpd->layers.first = gpd->layers.last = NULL;

				for (gpl = new_gpd->layers.first; gpl; gpl = gpl->next) {
					/* make a copy of source layer and its data */
					gpld = gpencil_layer_duplicate(gpl);
					BLI_addtail(&gpd->layers, gpld);
				}
			}
		}
	}

	WM_event_add_notifier(C, NC_SCREEN | ND_GPENCIL | NA_EDITED, NULL);

	return OPERATOR_FINISHED;
}
Exemplo n.º 3
0
/* make a copy of a given gpencil datablock */
bGPdata *gpencil_data_duplicate(bGPdata *src)
{
	bGPDlayer *gpl, *gpld;
	bGPdata *dst;
	
	/* error checking */
	if (src == NULL)
		return NULL;
	
	/* make a copy of the base-data */
	dst = MEM_dupallocN(src);
	
	/* copy layers */
	BLI_listbase_clear(&dst->layers);
	for (gpl = src->layers.first; gpl; gpl = gpl->next) {
		/* make a copy of source layer and its data */
		gpld = gpencil_layer_duplicate(gpl);
		BLI_addtail(&dst->layers, gpld);
	}
	
	/* return new */
	return dst;
}