Blob Blame Raw

#include <iostream>
#include <vector>

#ifdef _WIN32
#include <windows.h>
#endif

#include <glibmm.h>

#include <gtkmm/application.h>

#include <synfig/general.h>
#include <synfig/main.h>
#include <synfig/loadcanvas.h>
#include <synfig/filesystemnative.h>

#include "visualizationwindow.h"


using namespace synfig;


const char commandname[] = "visualization";


class TestCallback: public ProgressCallback {
public:
	virtual bool task(const String &task)
		{ synfig::info("%s", task.c_str()); return true; }
	virtual bool error(const String &task)
		{ synfig::error("%s", task.c_str()); return true; }
	virtual bool warning(const String &task)
		{ synfig::warning("%s", task.c_str()); return true; }
};


int main(int argc, char **argv)
{

	//// init


#ifdef _WIN32
	//  Enable standard input/output on Windows
	if (AttachConsole(ATTACH_PARENT_PROCESS)) {
		freopen("CON", "r", stdin);
		freopen("CON", "w", stdout);
		freopen("CON", "w", stderr);
	}
#endif

	Glib::init();

	String binary_path = get_binary_path(argv[0]);
	String base_dir = etl::dirname(binary_path);
	TestCallback callback;

	Main main(base_dir, &callback);

	info("Visualization test");

	// copy args
	std::vector<char*> args(argv, argv + argc);
	argv = &args.front();


	//// parse command line


	typedef std::map<String, rendering::Renderer::Handle> RendererMap;
	const RendererMap& renderers = rendering::Renderer::get_renderers();
	
	if (argc < 3) {
		std::cout << std::endl;
		std::cout << "usage: " << std::endl;
		std::cout << "  " << commandname << " <file.sif|file.sifz> <renderer>" << std::endl;
		std::cout << std::endl;
		std::cout << "available renderers: " << std::endl;
		for(RendererMap::const_iterator i = renderers.begin(); i != renderers.end(); ++i)
			if (i->second)
				std::cout << "  " << i->first << " - " << i->second->get_name() << std::endl;
		return 0;
	}

	const String filename = argv[1];
	info("filename: %s", filename.c_str());

	const String renderer_name = argv[2];
	info("renderer_name: %s", renderer_name.c_str());

	// remove processed args from argv
	args.erase(args.begin() + 1);
	args.erase(args.begin() + 1);
	argc = (int)args.size();


	//// get renderer


	RendererMap::const_iterator ri = renderers.find(renderer_name);
	if (ri == renderers.end() || !ri->second) {
		error("unknown renderer: %s", renderer_name.c_str());
		info("call %s with no arguments to take list of available renderers", commandname);
		return 1;
	}
	rendering::Renderer::Handle renderer = ri->second;


	//// get canvas


	String errors, warnings;
	Canvas::Handle canvas = open_canvas_as(
		FileSystemNative::instance()->get_identifier(filename),
		filename,
		errors,
		warnings );
	if (!canvas)
		return 1;


	//// run Gtk::Application


	info("create Gtk::Application");
	
	Glib::RefPtr<Gtk::Application> application = Gtk::Application::create(argc, argv);
	
	info("create window");
	VisualizationWindow window(canvas, renderer);
	
	info("run");
	int result = application->run(window);
	
	if (result) error("Gtk::Application finished with errog code: %d", result);
	info("end");
	return result;
}