[Bf-blender-cvs] [005626b8c6b] master: Refactors preview drawing code with few functional modifications:

Richard Antalik noreply at git.blender.org
Wed Feb 27 22:50:57 CET 2019


Commit: 005626b8c6b4e9af92ffc07d0b3f2b0a1c8dc4b8
Author: Richard Antalik
Date:   Wed Feb 27 13:48:27 2019 -0800
Branches: master
https://developer.blender.org/rB005626b8c6b4e9af92ffc07d0b3f2b0a1c8dc4b8

Refactors preview drawing code with few functional modifications:

Fix T61241

 - Changing preview size does not affect drawn image size, only resolution.
 -- Consistent behavior, when changing full-size / proxy / scene render size
 -- Scopes are rendered in *same size* as source image
 -- Over all, user does not have to readjust preview zoom.

Reviewed by: Brecht

Differential revision: https://developer.blender.org/D4315

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

M	source/blender/editors/space_sequencer/sequencer_draw.c
M	source/blender/editors/space_sequencer/sequencer_intern.h
M	source/blender/editors/space_sequencer/space_sequencer.c

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

diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index 089a30bcf5e..fc33ec398b0 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -985,30 +985,13 @@ static ImBuf *sequencer_make_scope(Scene *scene, ImBuf *ibuf, ImBuf *(*make_scop
 	return scope;
 }
 
-static void sequencer_display_size(Scene *scene, SpaceSeq *sseq, float r_viewrect[2])
+static void sequencer_display_size(Scene *scene, float r_viewrect[2])
 {
-	float render_size, proxy_size;
+	r_viewrect[0] = (float)scene->r.xsch;
+	r_viewrect[1] = (float)scene->r.ysch;
 
-	if (sseq->render_size == SEQ_PROXY_RENDER_SIZE_SCENE) {
-		render_size = (float)scene->r.size / 100.0f;
-		proxy_size = 1.0f;
-	}
-	else {
-		render_size = (float)sseq->render_size / 100.0f;
-		proxy_size = render_size;
-	}
-
-	r_viewrect[0] = (render_size * (float)scene->r.xsch);
-	r_viewrect[1] = (render_size * (float)scene->r.ysch);
-
-	/* rectx = viewrectx + 0.5f; */ /* UNUSED */
-	/* recty = viewrecty + 0.5f; */ /* UNUSED */
-
-	if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
-		r_viewrect[0] *= scene->r.xasp / scene->r.yasp;
-		r_viewrect[0] /= proxy_size;
-		r_viewrect[1] /= proxy_size;
-	}
+	/* Aspect ratio seems to have no effect on output image*/
+	/* r_viewrect[0] *= scene->r.xasp / scene->r.yasp; */
 }
 
 static void sequencer_draw_gpencil(const bContext *C)
@@ -1069,43 +1052,105 @@ static void sequencer_draw_borders(const SpaceSeq *sseq, const View2D *v2d, cons
 	immUnbindProgram();
 }
 
-/* draws checkerboard background for transparent content */
-static void sequencer_draw_background(
-        const SpaceSeq *sseq, View2D *v2d, const float viewrect[2], const bool draw_overlay)
+#if 0
+void sequencer_draw_maskedit(const bContext *C, Scene *scene, ARegion *ar, SpaceSeq *sseq)
 {
-	/* setting up the view */
-	UI_view2d_totRect_set(v2d, viewrect[0] + 0.5f, viewrect[1] + 0.5f);
-	UI_view2d_curRect_validate(v2d);
-	UI_view2d_view_ortho(v2d);
+	/* NOTE: sequencer mask editing isnt finished, the draw code is working but editing not,
+	* for now just disable drawing since the strip frame will likely be offset */
 
-	/* only draw alpha for main buffer */
-	if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
-		if ((sseq->flag & SEQ_USE_ALPHA) && !draw_overlay) {
-			imm_draw_box_checker_2d(v2d->tot.xmin, v2d->tot.ymin, v2d->tot.xmax, v2d->tot.ymax);
+	// if (sc->mode == SC_MODE_MASKEDIT)
+	if (0 && sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
+		Mask *mask = BKE_sequencer_mask_get(scene);
+
+		if (mask) {
+			int width, height;
+			float aspx = 1.0f, aspy = 1.0f;
+			// ED_mask_get_size(C, &width, &height);
+
+			//Scene *scene = CTX_data_scene(C);
+			width = (scene->r.size * scene->r.xsch) / 100;
+			height = (scene->r.size * scene->r.ysch) / 100;
+
+			ED_mask_draw_region(mask, ar,
+				0, 0, 0,  /* TODO */
+				width, height,
+				aspx, aspy,
+				false, true,
+				NULL, C);
 		}
 	}
 }
+#endif
 
-void draw_image_seq(const bContext *C, Scene *scene, ARegion *ar, SpaceSeq *sseq, int cfra, int frame_ofs, bool draw_overlay, bool draw_backdrop)
+static void *sequencer_OCIO_transform_ibuf(const bContext *C, ImBuf *ibuf, bool *glsl_used, int *format, int *type)
 {
-	struct Main *bmain = CTX_data_main(C);
-	struct Depsgraph *depsgraph = CTX_data_depsgraph(C);
-	struct ImBuf *ibuf = NULL;
-	struct ImBuf *scope = NULL;
-	struct View2D *v2d = &ar->v2d;
-	/* int rectx, recty; */ /* UNUSED */
-	float viewrect[2];
-	float col[3];
-	GLuint texid;
 	void *display_buffer;
 	void *cache_handle = NULL;
-	const bool is_imbuf = ED_space_sequencer_check_show_imbuf(sseq);
-	int format, type;
-	bool glsl_used = false;
-	const bool draw_gpencil = ((sseq->flag & SEQ_SHOW_GPENCIL) && sseq->gpd);
-	const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME};
-	bool draw_metadata = false;
+	bool force_fallback = false;
+	*glsl_used = false;
+	force_fallback |= (U.image_draw_method != IMAGE_DRAW_METHOD_GLSL);
+	force_fallback |= (ibuf->dither != 0.0f);
+
+	if (force_fallback) {
+		/* Fallback to CPU based color space conversion */
+		*glsl_used = false;
+		*format = GL_RGBA;
+		*type = GL_UNSIGNED_BYTE;
+		display_buffer = NULL;
+	}
+	else if (ibuf->rect_float) {
+		display_buffer = ibuf->rect_float;
+
+		if (ibuf->channels == 4) {
+			*format = GL_RGBA;
+		}
+		else if (ibuf->channels == 3) {
+			*format = GL_RGB;
+		}
+		else {
+			BLI_assert(!"Incompatible number of channels for float buffer in sequencer");
+			*format = GL_RGBA;
+			display_buffer = NULL;
+		}
+
+		*type = GL_FLOAT;
+
+		if (ibuf->float_colorspace) {
+			*glsl_used = IMB_colormanagement_setup_glsl_draw_from_space_ctx(C, ibuf->float_colorspace, ibuf->dither, true);
+		}
+		else {
+			*glsl_used = IMB_colormanagement_setup_glsl_draw_ctx(C, ibuf->dither, true);
+		}
+	}
+	else if (ibuf->rect) {
+		display_buffer = ibuf->rect;
+		*format = GL_RGBA;
+		*type = GL_UNSIGNED_BYTE;
+
+		*glsl_used = IMB_colormanagement_setup_glsl_draw_from_space_ctx(C, ibuf->rect_colorspace, ibuf->dither, false);
+	}
+	else {
+		*format = GL_RGBA;
+		*type = GL_UNSIGNED_BYTE;
+		display_buffer = NULL;
+	}
+
+	/* there's a data to be displayed, but GLSL is not initialized
+	 * properly, in this case we fallback to CPU-based display transform
+	 */
+	if ((ibuf->rect || ibuf->rect_float) && !*glsl_used) {
+		display_buffer = IMB_display_buffer_acquire_ctx(C, ibuf, &cache_handle);
+		*format = GL_RGBA;
+		*type = GL_UNSIGNED_BYTE;
+	}
+	if (cache_handle)
+		IMB_display_buffer_release(cache_handle);
 
+	return display_buffer;
+}
+
+static void sequencer_stop_running_jobs(const bContext *C, Scene *scene)
+{
 	if (G.is_rendering == false && (scene->r.seq_prev_type) == OB_RENDER) {
 		/* stop all running jobs, except screen one. currently previews frustrate Render
 		 * needed to make so sequencer's rendering doesn't conflict with compositor
@@ -1117,105 +1162,52 @@ void draw_image_seq(const bContext *C, Scene *scene, ARegion *ar, SpaceSeq *sseq
 		 */
 		WM_jobs_kill_type(CTX_wm_manager(C), NULL, WM_JOB_TYPE_RENDER_PREVIEW);
 	}
+}
 
-	if ((!draw_overlay || sseq->overlay_type == SEQ_DRAW_OVERLAY_REFERENCE) && !draw_backdrop) {
-		UI_GetThemeColor3fv(TH_SEQ_PREVIEW, col);
-		GPU_clear_color(col[0], col[1], col[2], 0.0);
-		GPU_clear(GPU_COLOR_BIT);
-	}
-
-	/* only initialize the preview if a render is in progress */
-	if (G.is_rendering)
-		return;
-
-	if (sseq->render_size == SEQ_PROXY_RENDER_SIZE_NONE) {
-		return;
-	}
-
-	/* for now we only support Left/Right */
-	ibuf = sequencer_ibuf_get(bmain, depsgraph, scene, sseq, cfra, frame_ofs, names[sseq->multiview_eye]);
+static void sequencer_preview_clear()
+{
+	float col[3];
 
-	if ((ibuf == NULL) ||
-	    (ibuf->rect == NULL && ibuf->rect_float == NULL))
-	{
-		sequencer_display_size(scene, sseq, viewrect);
+	UI_GetThemeColor3fv(TH_SEQ_PREVIEW, col);
+	GPU_clear_color(col[0], col[1], col[2], 0.0);
+	GPU_clear(GPU_COLOR_BIT);
+}
 
-		sequencer_draw_background(sseq, v2d, viewrect, false);
-		sequencer_draw_borders(sseq, v2d, scene);
+static void sequencer_preview_get_rect(rctf *preview, Scene *scene, ARegion *ar, SpaceSeq *sseq, bool draw_overlay, bool draw_backdrop)
+{
+	struct View2D *v2d = &ar->v2d;
+	float viewrect[2];
 
-		/* gpencil can also be drawn without a valid imbuf */
-		if ((draw_gpencil && is_imbuf) && !draw_overlay) {
-			sequencer_draw_gpencil(C);
-		}
+	sequencer_display_size(scene, viewrect);
+	BLI_rctf_init(preview, -1.0f, 1.0f, -1.0f, 1.0f);
 
-		UI_view2d_view_restore(C);
-		return;
+	if (draw_overlay && sseq->overlay_type == SEQ_DRAW_OVERLAY_RECT) {
+		preview->xmax = v2d->tot.xmin + (fabsf(BLI_rctf_size_x(&v2d->tot)) * scene->ed->over_border.xmax);
+		preview->xmin = v2d->tot.xmin + (fabsf(BLI_rctf_size_x(&v2d->tot)) * scene->ed->over_border.xmin);
+		preview->ymax = v2d->tot.ymin + (fabsf(BLI_rctf_size_y(&v2d->tot)) * scene->ed->over_border.ymax);
+		preview->ymin = v2d->tot.ymin + (fabsf(BLI_rctf_size_y(&v2d->tot)) * scene->ed->over_border.ymin);
 	}
+	else if (draw_backdrop) {
+		float aspect = BLI_rcti_size_x(&ar->winrct) / (float)BLI_rcti_size_y(&ar->winrct);
+		float image_aspect = viewrect[0] / viewrect[1];
 
-	sequencer_display_size(scene, sseq, viewrect);
-
-	if (!draw_backdrop && (sseq->mainb != SEQ_DRAW_IMG_IMBUF || sseq->zebra != 0)) {
-		SequencerScopes *scopes = &sseq->scopes;
-
-		sequencer_check_scopes(scopes, ibuf);
-
-		switch (sseq->mainb) {
-			case SEQ_DRAW_IMG_IMBUF:
-				if (!scopes->zebra_ibuf) {
-					ImBuf *display_ibuf = IMB_dupImBuf(ibuf);
-
-					if (display_ibuf->rect_float) {
-						IMB_colormanagement_imbuf_make_display_space(display_ibuf, &scene->view_settings,
-						                                             &scene->display_settings);
-					}
-					scopes->zebra_ibuf = make_zebra_view_from_ibuf(display_ibuf, sseq->zebra);
-					IMB_freeImBuf(display_ibuf);
-				}
-				scope = scopes->zebra_ibuf;
-				break;
-			case SEQ_DRAW_IMG_WAVEFORM:
-				if ((sseq->flag & SEQ_DRAW_COLOR_SEPARATED) != 0) {
-					if (!scopes->sep_waveform_ibuf)
-						scopes->sep_waveform_ibuf = sequencer_make_scope(scene, ibuf, make_sep_waveform_view_from_ibuf);
-					scope = scopes->sep_waveform_ibuf;
-				}
-				else {
-					if (!scopes->waveform_ibuf)
-						scopes->waveform_ibuf = sequencer_make_scope(scene, ibuf, make_waveform_view_from_ibuf);
-					scope = scopes->waveform_ibuf;
-				}
-				break;
-			case SEQ_DRAW_IMG_VECTORSCOPE:
-				if (!scopes->vector_ibuf)
-					scopes->vector_ibuf = sequencer_make_scope(scene, ibuf, make_vectorscope_view_from_ibuf);
-				scope = scopes->vector_ibuf;
-				break;
-			case SEQ_DRAW_IMG_HISTOGRAM:
-				if (!scopes->histogram_ibuf)
-					scopes->histogram_ibuf = sequencer_make_scope(scene, ibuf, make_histogram_view_from_ibuf);
-				scope = scopes->histogram_ibuf;
-				break;
-		}
-
-		/* future files may have new scopes we don't catch above */
-		if (scope) {
-			scopes->reference_ibuf = ibuf;
-			if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
-				/* scopes drawn in image preview use viewrect from orig ibuf - currently that's only zebra */
-			}
-			else {
-				viewrect[0] = scope->x;
-				viewrect[1] = scope->y;
-			}
+		if (aspect >= image_aspect) {
+			p

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list