void gf_sc_reload_config()

in src/compositor/compositor.c [1102:1423]


void gf_sc_reload_config(GF_Compositor *compositor)
{
	const char *sOpt;


	/*changing drivers needs exclusive access*/
	gf_sc_lock(compositor, 1);


	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "FrameRate");
	if (!sOpt) {
		sOpt = "30.0";
		gf_cfg_set_key(compositor->user->config, "Compositor", "FrameRate", "30.0");
	}
	gf_sc_set_fps(compositor, atof(sOpt));

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "ForceSceneSize");
	if (sOpt && ! stricmp(sOpt, "yes")) {
		compositor->override_size_flags = 1;
	} else {
		compositor->override_size_flags = 0;
	}

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "AntiAlias");
	if (sOpt) {
		if (! stricmp(sOpt, "None")) gf_sc_set_option(compositor, GF_OPT_ANTIALIAS, GF_ANTIALIAS_NONE);
		else if (! stricmp(sOpt, "Text")) gf_sc_set_option(compositor, GF_OPT_ANTIALIAS, GF_ANTIALIAS_TEXT);
		else gf_sc_set_option(compositor, GF_OPT_ANTIALIAS, GF_ANTIALIAS_FULL);
	} else {
		gf_cfg_set_key(compositor->user->config, "Compositor", "AntiAlias", "All");
		gf_sc_set_option(compositor, GF_OPT_ANTIALIAS, GF_ANTIALIAS_FULL);
	}


	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "FocusHighlightFill");
	if (sOpt) sscanf(sOpt, "%x", &compositor->highlight_fill);
	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "FocusHighlightStroke");
	if (sOpt) sscanf(sOpt, "%x", &compositor->highlight_stroke);
	else compositor->highlight_stroke = 0xFF000000;
	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "FocusHighlightStrokeWidth");
	if (sOpt) {
		Float v;
		sscanf(sOpt, "%f", &v);
		compositor->highlight_stroke_width = FLT2FIX(v);
	}
	else compositor->highlight_stroke_width = FIX_ONE;


	compositor->text_sel_color = 0xFFAAAAFF;
	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "TextSelectHighlight");
	if (sOpt) sscanf(sOpt, "%x", &compositor->text_sel_color);
	if (!compositor->text_sel_color) compositor->text_sel_color = 0xFFAAAAFF;

	/*load options*/
	if (compositor->video_out->hw_caps & GF_VIDEO_HW_DIRECT_ONLY) {
		compositor->traverse_state->immediate_draw = 1;
	} else {
		sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DrawMode");
		if (!sOpt) {
			sOpt = "defer";
			gf_cfg_set_key(compositor->user->config, "Compositor", "DrawMode", sOpt);
		}

		if (!strcmp(sOpt, "immediate")) compositor->traverse_state->immediate_draw = 1;
		else if (!strcmp(sOpt, "defer-debug")) {
			compositor->traverse_state->immediate_draw = 0;
			compositor->debug_defer = 1;
		}
		else compositor->traverse_state->immediate_draw = 0;
	}

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "ScalableZoom");
	compositor->scalable_zoom = (!sOpt || !stricmp(sOpt, "yes") ) ? 1 : 0;
	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DisableYUV");
	compositor->enable_yuv_hw = (sOpt && !stricmp(sOpt, "yes") ) ? 0 : 1;
	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DisablePartialHardwareBlit");
	compositor->disable_partial_hw_blit = (sOpt && !stricmp(sOpt, "yes") ) ? 1 : 0;


	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "StressMode");
	gf_sc_set_option(compositor, GF_OPT_STRESS_MODE, (sOpt && !stricmp(sOpt, "yes") ) ? 1 : 0);

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "HighSpeed");
	gf_sc_set_option(compositor, GF_OPT_HIGHSPEED, (sOpt && !stricmp(sOpt, "yes") ) ? 1 : 0);

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "BoundingVolume");
	if (sOpt) {
		if (! stricmp(sOpt, "Box")) gf_sc_set_option(compositor, GF_OPT_DRAW_BOUNDS, GF_BOUNDS_BOX);
		else if (! stricmp(sOpt, "AABB")) gf_sc_set_option(compositor, GF_OPT_DRAW_BOUNDS, GF_BOUNDS_AABB);
		else gf_sc_set_option(compositor, GF_OPT_DRAW_BOUNDS, GF_BOUNDS_NONE);
	} else {
		gf_cfg_set_key(compositor->user->config, "Compositor", "BoundingVolume", "None");
		gf_sc_set_option(compositor, GF_OPT_DRAW_BOUNDS, GF_BOUNDS_NONE);
	}

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "TextureTextMode");
	if (sOpt && !stricmp(sOpt, "Always")) compositor->texture_text_mode = GF_TEXTURE_TEXT_ALWAYS;
	else if (sOpt && !stricmp(sOpt, "Never")) compositor->texture_text_mode = GF_TEXTURE_TEXT_NEVER;
	else compositor->texture_text_mode = GF_TEXTURE_TEXT_DEFAULT;

	if (compositor->audio_renderer) {
		sOpt = gf_cfg_get_key(compositor->user->config, "Audio", "NoResync");
		compositor->audio_renderer->disable_resync = (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0;

		sOpt = gf_cfg_get_key(compositor->user->config, "Audio", "DisableMultiChannel");
		compositor->audio_renderer->disable_multichannel = (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0;
	}

#ifdef GF_SR_USE_VIDEO_CACHE
	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "VideoCacheSize");
	compositor->video_cache_max_size = sOpt ? atoi(sOpt) : 0;
	compositor->video_cache_max_size *= 1024;

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "CacheScale");
	compositor->cache_scale = sOpt ? atoi(sOpt) : 100;
	if (!compositor->cache_scale) compositor->cache_scale = 100;

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "CacheTolerance");
	compositor->cache_tolerance = sOpt ? atoi(sOpt) : 30;
#endif

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "TextureFromDecoderMemory");
	compositor->texture_from_decoder_memory = (sOpt && !strcmp(sOpt, "yes")) ? GF_TRUE : GF_FALSE;
	if (!sOpt)
		gf_cfg_set_key(compositor->user->config, "Compositor", "TextureFromDecoderMemory", "no");

#ifndef GPAC_DISABLE_3D

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "OpenGLMode");

	if (! (compositor->video_out->hw_caps & GF_VIDEO_HW_OPENGL)) {
		if (sOpt && strcmp(sOpt, "disable")) {
			GF_LOG(GF_LOG_WARNING, GF_LOG_COMPOSE, ("[Compositor] OpenGL mode %s requested but no opengl-capable output - disabling openGL\n", sOpt));
		}
		compositor->force_opengl_2d = 0;
		compositor->autoconfig_opengl = 0;
		compositor->hybrid_opengl = 0;
	} else {
		compositor->force_opengl_2d = (sOpt && !strcmp(sOpt, "always")) ? 1 : 0;
		if (!sOpt) {
			compositor->recompute_ar = 1;
			compositor->autoconfig_opengl = 1;
		} else {
			compositor->hybrid_opengl = !strcmp(sOpt, "hybrid") ? 1 : 0;
#ifdef OPENGL_RASTER
			compositor->opengl_raster = !strcmp(sOpt, "raster") ? 1 : 0;
			if (compositor->opengl_raster) compositor->traverse_state->immediate_draw = GF_TRUE;
#endif
		}
	}
    
	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "EnablePBO");
	if (!sOpt) gf_cfg_set_key(compositor->user->config, "Compositor", "EnablePBO", "no");
	compositor->enable_pbo = (sOpt && !strcmp(sOpt, "yes")) ? 1 : 0;

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DefaultNavigationMode");
	if (sOpt && !strcmp(sOpt, "Walk")) compositor->default_navigation_mode = GF_NAVIGATE_WALK;
	else if (sOpt && !strcmp(sOpt, "Examine")) compositor->default_navigation_mode = GF_NAVIGATE_EXAMINE;
	else if (sOpt && !strcmp(sOpt, "Fly")) compositor->default_navigation_mode = GF_NAVIGATE_FLY;

#ifdef GPAC_HAS_GLU
	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "RasterOutlines");
	compositor->raster_outlines = (sOpt && !stricmp(sOpt, "yes") ) ? 1 : 0;
#endif
	/*currently:
	- no support for npow2 textures, and no support for DrawPixels
	*/
#ifndef GPAC_USE_GLES1X
	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "EmulatePOW2");
	compositor->emul_pow2 = (sOpt && !stricmp(sOpt, "yes") ) ? 1 : 0;
#else
	compositor->raster_outlines = 1;
	compositor->emul_pow2 = 1;
#endif

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "PolygonAA");
	compositor->poly_aa = (sOpt && !stricmp(sOpt, "yes") ) ? 1 : 0;

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "BackFaceCulling");
	if (sOpt && !stricmp(sOpt, "Off")) compositor->backcull = GF_BACK_CULL_OFF;
	else if (sOpt && !stricmp(sOpt, "Alpha")) compositor->backcull = GF_BACK_CULL_ALPHA;
	else compositor->backcull = GF_BACK_CULL_ON;

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "Wireframe");
	if (sOpt && !stricmp(sOpt, "WireOnly")) compositor->wiremode = GF_WIREFRAME_ONLY;
	else if (sOpt && !stricmp(sOpt, "WireOnSolid")) compositor->wiremode = GF_WIREFRAME_SOLID;
	else compositor->wiremode = GF_WIREFRAME_NONE;

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DrawNormals");
	if (sOpt && !stricmp(sOpt, "PerFace")) compositor->draw_normals = GF_NORMALS_FACE;
	else if (sOpt && !stricmp(sOpt, "PerVertex")) compositor->draw_normals = GF_NORMALS_VERTEX;
	else compositor->draw_normals = GF_NORMALS_NONE;

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DisableGLUScale");
	compositor->disable_glu_scale = (sOpt && !stricmp(sOpt, "yes") ) ? 1 : 0;

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DisableRectExt");
	compositor->disable_rect_ext = (sOpt && !stricmp(sOpt, "yes") ) ? 1 : 0;

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DisableGLCulling");
	compositor->disable_gl_cull = (sOpt && !stricmp(sOpt, "yes") ) ? 1 : 0;

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DisableYUVGL");
	compositor->disable_yuvgl = (sOpt && !stricmp(sOpt, "yes") ) ? 1 : 0;

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DepthScale");
	if (!sOpt) {
		sOpt = "100";
		gf_cfg_set_key(compositor->user->config, "Compositor", "DepthScale", sOpt);
	}
	compositor->depth_gl_scale = FLT2FIX( (Float) atof(sOpt) );

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DepthType");
	if (!sOpt) {
		sOpt = "VertexArray";
		gf_cfg_set_key(compositor->user->config, "Compositor", "DepthType", sOpt);
	}
	if (sOpt && !strcmp(sOpt, "Points")) compositor->depth_gl_type = GF_SC_DEPTH_GL_POINTS;
	else if (sOpt && !strnicmp(sOpt, "Strips", 6)) {
		compositor->depth_gl_type = GF_SC_DEPTH_GL_STRIPS;
		compositor->depth_gl_strips_filter = 0;
		if (strlen(sOpt)>7) compositor->depth_gl_strips_filter = FLT2FIX( (Float) atof(sOpt+7) );
	}
	else if (sOpt && !strcmp(sOpt, "VertexArray")) compositor->depth_gl_type = GF_SC_DEPTH_GL_VBO;
	else compositor->depth_gl_type = GF_SC_DEPTH_GL_NONE;

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "NumViews");
	if (!sOpt) {
		sOpt = "1";
		gf_cfg_set_key(compositor->user->config, "Compositor", "NumViews", "1");
	}
	compositor->visual->nb_views = atoi(sOpt);
	if (!compositor->visual->nb_views) compositor->visual->nb_views = 1;

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "StereoType");
	if (!sOpt) {
		sOpt = "none";
		gf_cfg_set_key(compositor->user->config, "Compositor", "StereoType", "none");
	}
	if (!strcmp(sOpt, "SideBySide")) compositor->visual->autostereo_type = GF_3D_STEREO_SIDE;
	else if (!strcmp(sOpt, "TopToBottom")) compositor->visual->autostereo_type = GF_3D_STEREO_TOP;
	else if (!strcmp(sOpt, "Custom")) compositor->visual->autostereo_type = GF_3D_STEREO_CUSTOM;
	/*built-in interleavers*/
	else if (!strcmp(sOpt, "Anaglyph")) compositor->visual->autostereo_type = GF_3D_STEREO_ANAGLYPH;
	else if (!strcmp(sOpt, "Columns")) compositor->visual->autostereo_type = GF_3D_STEREO_COLUMNS;
	else if (!strcmp(sOpt, "Rows")) compositor->visual->autostereo_type = GF_3D_STEREO_ROWS;
	else if (!strcmp(sOpt, "SPV19")) compositor->visual->autostereo_type = GF_3D_STEREO_5VSP19;

	else {
		compositor->visual->autostereo_type = GF_3D_STEREO_NONE;
		compositor->visual->nb_views = 1;
	}
	if (compositor->visual->autostereo_type)
		compositor->force_opengl_2d = 1;

	switch (compositor->visual->autostereo_type) {
	case GF_3D_STEREO_ANAGLYPH:
	case GF_3D_STEREO_COLUMNS:
	case GF_3D_STEREO_ROWS:
		if (compositor->visual->nb_views != 2) {
			compositor->visual->nb_views = 2;
			gf_cfg_set_key(compositor->user->config, "Compositor", "NumViews", "2");
		}
		break;
	}

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "CameraLayout");
	if (!sOpt) {
		sOpt = "Straight";
		gf_cfg_set_key(compositor->user->config, "Compositor", "CameraLayout", "Straight");
	}
	if (!strcmp(sOpt, "Linear")) compositor->visual->camera_layout = GF_3D_CAMERA_LINEAR;
	else if (!strcmp(sOpt, "Circular")) compositor->visual->camera_layout = GF_3D_CAMERA_CIRCULAR;
	else if (!strcmp(sOpt, "OffAxis")) compositor->visual->camera_layout = GF_3D_CAMERA_OFFAXIS;
	else compositor->visual->camera_layout = GF_3D_CAMERA_STRAIGHT;

	compositor->interoccular_distance = FLT2FIX(6.3f);
	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "EyeSeparation");
	if (sOpt) compositor->interoccular_distance = FLT2FIX( atof(sOpt)) ;
	else gf_cfg_set_key(compositor->user->config, "Compositor", "EyeSeparation", "6.3");

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "ReverseViews");
	if (sOpt && !strcmp(sOpt, "yes")) compositor->visual->reverse_views = 1;

#endif //GPAC_DISABLE_3D

#ifdef GF_SR_USE_DEPTH
	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "AutoStereoCalibration");
	compositor->auto_calibration = (sOpt && !strcmp(sOpt, "yes")) ? 1 : 0;

	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DisplayDepth");
	compositor->display_depth = sOpt ? (!strcmp(sOpt, "auto") ? -1 : atoi(sOpt)) : 0;

#ifndef GPAC_DISABLE_3D
	/*if auto-stereo mode, turn on display depth by default*/
	if (compositor->visual->autostereo_type && !compositor->display_depth) {
		compositor->display_depth = -1;
	}
#endif
    
	if (!compositor->video_out->view_distance) {
		sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "ViewDistance");
		compositor->video_out->view_distance = FLT2FIX( sOpt ? (Float) atof(sOpt) : 50.0f );
	}

#ifndef GPAC_DISABLE_3D
	sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "FocusDistance");
	compositor->focus_distance = 0;
	if (sOpt)
		compositor->focus_distance = FLT2FIX( atof(sOpt) );
	else
		gf_cfg_set_key(compositor->user->config, "Compositor", "FocusDistance", "0");
#endif

#endif


	gf_sc_reset_graphics(compositor);
	gf_sc_next_frame_state(compositor, GF_SC_DRAW_FRAME);

	gf_sc_lock(compositor, 0);
}