static bGPDframe *rna_GPencil_frame_new(bGPDlayer *layer, ReportList *reports, int frame_number) { bGPDframe *frame; if (BKE_gpencil_layer_find_frame(layer, frame_number)) { BKE_reportf(reports, RPT_ERROR, "Frame already exists on this frame number %d", frame_number); return NULL; } frame = gpencil_frame_addnew(layer, frame_number); WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL); return frame; }
/* get the appropriate gp-frame from a given layer * - this sets the layer's actframe var (if allowed to) * - extension beyond range (if first gp-frame is after all frame in interest and cannot add) */ bGPDframe *gpencil_layer_getframe(bGPDlayer *gpl, int cframe, short addnew) { bGPDframe *gpf = NULL; short found = 0; /* error checking */ if (gpl == NULL) return NULL; /* No reason to forbid negative frames when they are allowed in Blender! */ if ((U.flag & USER_NONEGFRAMES) && cframe <= 0) cframe = 1; /* check if there is already an active frame */ if (gpl->actframe) { gpf = gpl->actframe; /* do not allow any changes to layer's active frame if layer is locked from changes * or if the layer has been set to stay on the current frame */ if (gpl->flag & (GP_LAYER_LOCKED | GP_LAYER_FRAMELOCK)) return gpf; /* do not allow any changes to actframe if frame has painting tag attached to it */ if (gpf->flag & GP_FRAME_PAINT) return gpf; /* try to find matching frame */ if (gpf->framenum < cframe) { for (; gpf; gpf = gpf->next) { if (gpf->framenum == cframe) { found = 1; break; } else if ((gpf->next) && (gpf->next->framenum > cframe)) { found = 1; break; } } /* set the appropriate frame */ if (addnew) { if ((found) && (gpf->framenum == cframe)) gpl->actframe = gpf; else gpl->actframe = gpencil_frame_addnew(gpl, cframe); } else if (found) gpl->actframe = gpf; else gpl->actframe = gpl->frames.last; } else { for (; gpf; gpf = gpf->prev) { if (gpf->framenum <= cframe) { found = 1; break; } } /* set the appropriate frame */ if (addnew) { if ((found) && (gpf->framenum == cframe)) gpl->actframe = gpf; else gpl->actframe = gpencil_frame_addnew(gpl, cframe); } else if (found) gpl->actframe = gpf; else gpl->actframe = gpl->frames.first; } } else if (gpl->frames.first) { /* check which of the ends to start checking from */ const int first = ((bGPDframe *)(gpl->frames.first))->framenum; const int last = ((bGPDframe *)(gpl->frames.last))->framenum; if (abs(cframe - first) > abs(cframe - last)) { /* find gp-frame which is less than or equal to cframe */ for (gpf = gpl->frames.last; gpf; gpf = gpf->prev) { if (gpf->framenum <= cframe) { found = 1; break; } } } else { /* find gp-frame which is less than or equal to cframe */ for (gpf = gpl->frames.first; gpf; gpf = gpf->next) { if (gpf->framenum <= cframe) { found = 1; break; } } } /* set the appropriate frame */ if (addnew) { if ((found) && (gpf->framenum == cframe)) gpl->actframe = gpf; else gpl->actframe = gpencil_frame_addnew(gpl, cframe); } else if (found) gpl->actframe = gpf; else { /* unresolved errogenous situation! */ printf("Error: cannot find appropriate gp-frame\n"); /* gpl->actframe should still be NULL */ } } else { /* currently no frames (add if allowed to) */ if (addnew) gpl->actframe = gpencil_frame_addnew(gpl, cframe); else { /* don't do anything... this may be when no frames yet! */ /* gpl->actframe should still be NULL */ } } /* return */ return gpl->actframe; }