[Bf-blender-cvs] [f501a4d] GPencil_Editing_Stage3: GPencil: Code Cleanup - Deduplicate code for adding a copy of the active frame (for editing)

Joshua Leung noreply at git.blender.org
Sun Dec 6 14:30:05 CET 2015


Commit: f501a4dd9635d198243e2955b72fc6f8fb073908
Author: Joshua Leung
Date:   Mon Dec 7 01:27:12 2015 +1300
Branches: GPencil_Editing_Stage3
https://developer.blender.org/rBf501a4dd9635d198243e2955b72fc6f8fb073908

GPencil: Code Cleanup - Deduplicate code for adding a copy of the active frame (for editing)

===================================================================

M	source/blender/blenkernel/BKE_gpencil.h
M	source/blender/blenkernel/intern/gpencil.c
M	source/blender/editors/gpencil/gpencil_brush.c
M	source/blender/editors/transform/transform_conversions.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index 084c552..4d13dd7 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -47,6 +47,7 @@ void BKE_gpencil_free(struct bGPdata *gpd);
 void gpencil_stroke_sync_selection(struct bGPDstroke *gps);
 
 struct bGPDframe *gpencil_frame_addnew(struct bGPDlayer *gpl, int cframe);
+struct bGPDframe *gpencil_frame_addcopy(struct bGPDlayer *gpl, int cframe);
 struct bGPDlayer *gpencil_layer_addnew(struct bGPdata *gpd, const char *name, int setactive);
 struct bGPdata *gpencil_data_addnew(const char name[]);
 
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index 81a8fb7..4261054 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -132,7 +132,7 @@ bGPDframe *gpencil_frame_addnew(bGPDlayer *gpl, int cframe)
 	bGPDframe *gpf = NULL, *gf = NULL;
 	short state = 0;
 	
-	/* error checking (neg frame only if they are not allowed in Blender!) */
+	/* error checking */
 	if (gpl == NULL)
 		return NULL;
 		
@@ -178,6 +178,61 @@ bGPDframe *gpencil_frame_addnew(bGPDlayer *gpl, int cframe)
 	return gpf;
 }
 
+/* add a copy of the active gp-frame to the given layer */
+bGPDframe *gpencil_frame_addcopy(bGPDlayer *gpl, int cframe)
+{
+	bGPDframe *new_frame, *gpf;
+	bool found = false;
+	
+	/* Error checking/handling */
+	if (gpl == NULL) {
+		/* no layer */
+		return NULL;
+	}
+	else if (gpl->actframe == NULL) {
+		/* no active frame, so just create a new one from scratch */
+		return gpencil_frame_addnew(gpl, cframe);
+	}
+	
+	/* Create a copy of the frame */
+	new_frame = gpencil_frame_duplicate(gpl->actframe);
+	
+	/* Find frame to insert it before */
+	for (gpf = gpl->frames.first; gpf; gpf = gpf->next) {
+		if (gpf->framenum > cframe) {
+			/* Add it here */
+			BLI_insertlinkbefore(&gpl->frames, gpf, new_frame);
+			
+			found = true;
+			break;
+		}
+		else if (gpf->framenum == cframe) {
+			/* This only happens when we're editing with framelock on...
+			 * - Delete the new frame and don't do anything else here...
+			 */
+			free_gpencil_strokes(new_frame);
+			MEM_freeN(new_frame);
+			new_frame = NULL;
+			
+			found = true;
+			break;
+		}
+	}
+	
+	if (found == false) {
+		/* Add new frame to the end */
+		BLI_addtail(&gpl->frames, new_frame);
+	}
+	
+	/* Ensure that frame is set up correctly, and return it */
+	if (new_frame) {
+		new_frame->framenum = cframe;
+		gpl->actframe = new_frame;
+	}
+	
+	return new_frame;
+}
+
 /* add a new gp-layer and make it the active layer */
 bGPDlayer *gpencil_layer_addnew(bGPdata *gpd, const char *name, int setactive)
 {
diff --git a/source/blender/editors/gpencil/gpencil_brush.c b/source/blender/editors/gpencil/gpencil_brush.c
index 9f5767f..8206438 100644
--- a/source/blender/editors/gpencil/gpencil_brush.c
+++ b/source/blender/editors/gpencil/gpencil_brush.c
@@ -1130,47 +1130,8 @@ static void gpsculpt_brush_init_stroke(tGP_BrushEditData *gso)
 			 *   spent too much time editing the wrong frame...
 			 */
 			// XXX: should this be allowed when framelock is enabled?
-			// XXX: the logic below should be deduplicated, as the transform conversion code also does it
 			if (gpf->framenum != cfra) {
-				bGPDframe *new_frame = gpencil_frame_duplicate(gpf);
-				bGPDframe *gf;
-				bool found = false;
-				
-				/* Find frame to insert it before */
-				for (gf = gpl->frames.first; gf; gf = gf->next) {
-					if (gf->framenum > cfra) {
-						/* Add it here */
-						BLI_insertlinkbefore(&gpl->frames, gf, new_frame);
-						
-						found = true;
-						break;
-					}
-					else if (gf->framenum == cfra) {
-						/* This only happens when we're editing with framelock on...
-						 * - Delete the new frame and don't do anything else here...
-						 */
-						//printf("GP Sculpt init stroke - Copy aborted for frame %d -> %d\n", gpf->framenum, gf->framenum);
-						free_gpencil_strokes(new_frame);
-						MEM_freeN(new_frame);
-						new_frame = NULL;
-						
-						found = true;
-						break;
-					}
-				}
-				
-				if (found == false) {
-					/* Add new frame to the end */
-					BLI_addtail(&gpl->frames, new_frame);
-				}
-				
-				/* Edit the new frame instead, if it did get created + added */
-				if (new_frame) {
-					// TODO: tag this one as being "newly created" so that we can remove it if the edit is cancelled
-					new_frame->framenum = cfra;
-					
-					gpl->actframe = gpf = new_frame;
-				}
+				gpencil_frame_addcopy(gpl, cfra);
 			}
 		}
 	}
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 4dcef3a..6360535 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -7756,45 +7756,7 @@ static void createTransGPencil(bContext *C, TransInfo *t)
 			 */
 			// XXX: should this be allowed when framelock is enabled?
 			if (gpf->framenum != cfra) {
-				bGPDframe *new_frame = gpencil_frame_duplicate(gpf);
-				bGPDframe *gf;
-				bool found = false;
-				
-				/* Find frame to insert it before */
-				for (gf = gpl->frames.first; gf; gf = gf->next) {
-					if (gf->framenum > cfra) {
-						/* Add it here */
-						BLI_insertlinkbefore(&gpl->frames, gf, new_frame);
-						
-						found = true;
-						break;
-					}
-					else if (gf->framenum == cfra) {
-						/* This only happens when we're editing with framelock on...
-						 * - Delete the new frame and don't do anything else here...
-						 */
-						//printf("GP Frame convert to TransData - Copy aborted for frame %d -> %d\n", gpf->framenum, gf->framenum);
-						free_gpencil_strokes(new_frame);
-						MEM_freeN(new_frame);
-						new_frame = NULL;
-						
-						found = true;
-						break;
-					}
-				}
-				
-				if (found == false) {
-					/* Add new frame to the end */
-					BLI_addtail(&gpl->frames, new_frame);
-				}
-				
-				/* Edit the new frame instead, if it did get created + added */
-				if (new_frame) {
-					// TODO: tag this one as being "newly created" so that we can remove it if the edit is cancelled
-					new_frame->framenum = cfra;
-					
-					gpf = new_frame;
-				}
+				gpf = gpencil_frame_addcopy(gpl, cfra);
 			}
 			
 			/* Loop over strokes, adding TransData for points as needed... */




More information about the Bf-blender-cvs mailing list