[CinCV-commits] CinelerraCV.git (#1213) - master (branch) updated: v2.1.5-170-g5976f14

git version control git at cinelerra-cv.org
Mon Jun 23 16:53:37 CEST 2014


The branch, master has been updated
       via  5976f142e7152a99d7ae77211b81862de8068b65 (commit)
      from  ff587d231615eee3ffdd51943f3adf9af7b20a52 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 5976f142e7152a99d7ae77211b81862de8068b65
Author: Florent Delannoy <florent.delannoy at gmail.com>
Date:   Fri Aug 10 22:51:50 2012 +0300

    New plugin: C41
    
    This plugin takes a 16bits C41 [http://en.wikipedia.org/wiki/C-41_process]
    digital intermediate as input, and outputs a well-graded positive version.
    The output quality is miles away from what could be obtained so far by simple.
    inversion and histogram correction.
    
    Origin: commit 6c0082af400d4d6e8fda520e4781f1e94187e735
    from https://github.com/Pluies/C41.git

-----------------------------------------------------------------------

Summary of changes:
 configure.ac            |    1 +
 plugins/C41/Makefile.am |   11 +
 plugins/C41/c41.C       |  705 +++++++++++++++++++++++++++++++++++++++++++++++
 plugins/C41/picon.png   |  Bin 0 -> 1962 bytes
 plugins/C41/picon_png.h |  272 ++++++++++++++++++
 plugins/Makefile.am     |    1 +
 po/POTFILES.in          |    1 +
 7 files changed, 991 insertions(+), 0 deletions(-)
 create mode 100644 plugins/C41/Makefile.am
 create mode 100644 plugins/C41/c41.C
 create mode 100644 plugins/C41/picon.png
 create mode 100644 plugins/C41/picon_png.h

The diff of changes is:
diff --git a/configure.ac b/configure.ac
index 976bbac..00a2b77 100644
--- a/configure.ac
+++ b/configure.ac
@@ -642,6 +642,7 @@ AC_OUTPUT(Makefile cinelerra-cvs-current.spec po/Makefile.in \
 					plugins/1080to540/Makefile \
 					plugins/histogram/Makefile \
 					plugins/720to480/Makefile \
+					plugins/C41/Makefile \
 					plugins/bandslide/Makefile \
 					plugins/bandwipe/Makefile 
 					plugins/blur/Makefile \
diff --git a/plugins/C41/Makefile.am b/plugins/C41/Makefile.am
new file mode 100644
index 0000000..e1b4b60
--- /dev/null
+++ b/plugins/C41/Makefile.am
@@ -0,0 +1,11 @@
+plugin_LTLIBRARIES = c41.la
+c41_la_LDFLAGS = -avoid-version -module -shared 
+c41_la_LIBADD = $(top_builddir)/plugins/colors/libcolors.la
+c41_la_SOURCES = c41.C 
+AM_CXXFLAGS = $(LARGEFILE_CFLAGS)
+
+INCLUDES = -I$(top_srcdir)/guicast -I$(top_srcdir)/cinelerra -I$(top_srcdir)/quicktime -I$(top_srcdir)/plugins/colors
+LIBTOOL = $(SHELL) $(top_builddir)/libtool $(LTCXX_FLAGS)
+
+noinst_HEADERS = picon_png.h 
+EXTRA_DIST = picon.png
diff --git a/plugins/C41/c41.C b/plugins/C41/c41.C
new file mode 100644
index 0000000..9a6d01b
--- /dev/null
+++ b/plugins/C41/c41.C
@@ -0,0 +1,705 @@
+/*
+ * C41 plugin for Cinelerra
+ * Copyright (C) 2011 Florent Delannoy <florent at plui dot es>
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * 
+ */
+
+#include "bcdisplayinfo.h"
+#include "bchash.h"
+#include "clip.h"
+#include "filexml.h"
+#include "guicast.h"
+#include "language.h"
+#include "picon_png.h"
+#include "plugincolors.h"
+#include "pluginvclient.h"
+#include "vframe.h"
+
+#include <stdint.h>
+#include <string.h>
+
+
+/* Class declarations */
+class C41Effect;
+
+class C41Config
+{
+public:
+	C41Config();
+
+	void copy_from(C41Config &src);
+	int equivalent(C41Config &src);
+	void interpolate(C41Config &prev,
+			C41Config &next,
+			long prev_frame,
+			long next_frame,
+			long current_frame);
+
+	int active;
+	int compute_magic;
+	float fix_min_r;
+	float fix_min_g;
+	float fix_min_b;
+	float fix_magic4;
+	float fix_magic5;
+	float fix_magic6;
+};
+
+class C41Enable : public BC_CheckBox
+{
+public:
+	C41Enable(C41Effect *plugin, int *output, int x, int y, char *text);
+	int handle_event();
+	C41Effect *plugin;
+	int *output;
+};
+
+class C41TextBox : public BC_TextBox
+{
+public:
+	C41TextBox(C41Effect *plugin, float *value, int x, int y);
+	int handle_event();
+	C41Effect *plugin;
+	float *boxValue;
+};
+
+class C41Button : public BC_GenericButton
+{
+public:
+	C41Button(C41Effect *plugin, int x, int y);
+	int handle_event();
+	C41Effect *plugin;
+	float *boxValue;
+};
+
+class C41Window : public BC_Window
+{
+	public:
+	C41Window(C41Effect *plugin, int x, int y);
+	void create_objects();
+	int close_event();
+	void update();
+	C41Enable *active;
+	C41Enable *compute_magic;
+	C41TextBox *min_r;
+	C41TextBox *min_g;
+	C41TextBox *min_b;
+	C41TextBox *magic4;
+	C41TextBox *magic5;
+	C41TextBox *magic6;
+	C41TextBox *fix_min_r;
+	C41TextBox *fix_min_g;
+	C41TextBox *fix_min_b;
+	C41TextBox *fix_magic4;
+	C41TextBox *fix_magic5;
+	C41TextBox *fix_magic6;
+	C41Button *lock;
+	C41Effect *plugin;
+};
+
+PLUGIN_THREAD_HEADER(C41Effect, C41Thread, C41Window);
+
+class C41Main : public PluginVClient
+{
+public:
+	C41Main(int argc, char *argv[]);
+	~C41Main();
+
+	// required for all realtime plugins
+	int process_realtime(long size, VFrame **input_ptr, VFrame **output_ptr);
+	int plugin_is_realtime();
+	int plugin_is_multi_channel();
+	char* plugin_title();
+	int start_realtime();
+	int stop_realtime();
+	int start_gui();
+	int stop_gui();
+	int show_gui();
+	int hide_gui();
+	int set_string();
+	int save_data(char *text);
+	int read_data(char *text);
+	C41Thread *thread;
+};
+
+class C41Effect : public PluginVClient
+{
+public:
+	C41Effect(PluginServer *server);
+	~C41Effect();
+	int process_buffer(VFrame *frame,
+			int64_t start_position,
+			double frame_rate);
+	int is_realtime();
+	char* plugin_title();
+	VFrame* new_picon();
+	int load_defaults();
+	int save_defaults();
+	void save_data(KeyFrame *keyframe);
+	void read_data(KeyFrame *keyframe);
+	void update_gui();
+	void render_gui(void* data);
+	int show_gui();
+	void raise_window();
+	int set_string();
+	int load_configuration();
+	void lock_parameters();
+	float myLog2(float i);
+	float myPow2(float i);
+	float myPow(float a, float b);
+	double difftime_nano(timespec start, timespec end);
+
+	float min_r;
+	float min_g;
+	float min_b;
+	float magic4;
+	float magic5;
+	float magic6;
+
+	C41Config config;
+	C41Thread *thread;
+	BC_Hash *defaults;
+};
+
+
+REGISTER_PLUGIN(C41Effect);
+
+
+/* Methods decarations */
+
+// C41Config
+C41Config::C41Config()
+{
+	active = 0;
+	compute_magic = 0;
+
+	fix_min_r = fix_min_g = fix_min_b = fix_magic4 = fix_magic5 = fix_magic6 = 0.;
+}
+
+void C41Config::copy_from(C41Config &src)
+{
+	active = src.active;
+	compute_magic = src.compute_magic;
+
+	fix_min_r = src.fix_min_r;
+	fix_min_g = src.fix_min_g;
+	fix_min_b = src.fix_min_b;
+	fix_magic4 = src.fix_magic4;
+	fix_magic5 = src.fix_magic5;
+	fix_magic6 = src.fix_magic6;
+}
+
+int C41Config::equivalent(C41Config &src)
+{
+	return (src.fix_min_r  == fix_min_r  &&
+		   src.fix_min_g  == fix_min_g  &&
+		   src.fix_min_b  == fix_min_b  &&
+		   src.fix_magic4 == fix_magic4 &&
+		   src.fix_magic5 == fix_magic5 &&
+		   src.fix_magic6 == fix_magic6);
+}
+
+void C41Config::interpolate(C41Config &prev,
+		C41Config &next,
+		long prev_frame,
+		long next_frame,
+		long current_frame)
+{
+	active = prev.active;
+	compute_magic = prev.compute_magic;
+
+	fix_min_r = prev.fix_min_r;
+	fix_min_g = prev.fix_min_g;
+	fix_min_b = prev.fix_min_b;
+	fix_magic4 = prev.fix_magic4;
+	fix_magic5 = prev.fix_magic5;
+	fix_magic6 = prev.fix_magic6;
+}
+
+// C41Enable
+C41Enable::C41Enable(C41Effect *plugin, int *output, int x, int y, char *text)
+ : BC_CheckBox(x, y, *output, text)
+{
+	this->plugin = plugin;
+	this->output = output;
+}
+
+int C41Enable::handle_event()
+{
+	*output = get_value();
+	plugin->send_configure_change();
+	return 1;
+}
+
+// C41TextBox
+C41TextBox::C41TextBox(C41Effect *plugin, float *value, int x, int y)
+ : BC_TextBox(x, y, 160, 1, *value)
+{
+	this->plugin = plugin;
+	this->boxValue = value;
+}
+
+int C41TextBox::handle_event()
+{
+	*boxValue = atof(get_text());
+	plugin->send_configure_change();
+	return 1;
+}
+
+
+// C41Button
+C41Button::C41Button(C41Effect *plugin, int x, int y)
+ : BC_GenericButton(x, y, "Lock parameters")
+{
+	this->plugin = plugin;
+}
+
+int C41Button::handle_event()
+{
+	plugin->lock_parameters();
+	plugin->send_configure_change();
+	return 1;
+}
+
+// C41Window
+C41Window::C41Window(C41Effect *plugin, int x, int y)
+ : BC_Window(plugin->gui_string, x, y, 250, 620, 250, 620, 1, 0, 1)
+{
+	this->plugin = plugin;
+}
+
+void C41Window::create_objects()
+{
+	int x = 10;
+	int y = 10;
+
+	add_subwindow(active = new C41Enable(plugin, &plugin->config.active, x, y, _("Activate processing")));
+	y += 40;
+
+	add_subwindow(compute_magic = new C41Enable(plugin, &plugin->config.compute_magic, x, y, _("Compute negfix values")));
+	y += 20;
+	add_subwindow(new BC_Title(x+20, y, _("(uncheck for faster rendering)")));
+	y += 40;
+
+	add_subwindow(new BC_Title(x, y, _("Computed negfix values:")));
+	y += 30;
+
+	add_subwindow(new BC_Title(x, y, _("Min R:")));
+	add_subwindow(min_r = new C41TextBox(plugin, &plugin->min_r, x+60, y));
+	y += 30;
+
+	add_subwindow(new BC_Title(x, y, _("Min G:")));
+	add_subwindow(min_g = new C41TextBox(plugin, &plugin->min_g, x+60, y));
+	y += 30;
+
+	add_subwindow(new BC_Title(x, y, _("Min B:")));
+	add_subwindow(min_b = new C41TextBox(plugin, &plugin->min_b, x+60, y));
+	y += 30;
+
+	add_subwindow(new BC_Title(x, y, _("Magic4:")));
+	add_subwindow(magic4 = new C41TextBox(plugin, &plugin->magic4, x+60, y));
+	y += 30;
+
+	add_subwindow(new BC_Title(x, y, _("Magic5:")));
+	add_subwindow(magic5 = new C41TextBox(plugin, &plugin->magic5, x+60, y));
+	y += 30;
+
+	add_subwindow(new BC_Title(x, y, _("Magic6:")));
+	add_subwindow(magic6 = new C41TextBox(plugin, &plugin->magic6, x+60, y));
+	y += 30;
+
+	// The user shouldn't be able to change the computed values
+	min_r->disable();
+	min_g->disable();
+	min_b->disable();
+	magic4->disable();
+	magic5->disable();
+	magic6->disable();
+
+
+	y += 30;
+	add_subwindow(lock = new C41Button(plugin, x, y));
+	y += 30;
+
+	y += 20;
+	add_subwindow(new BC_Title(x, y, _("negfix values to apply:")));
+	y += 30;
+
+	add_subwindow(new BC_Title(x, y, _("Min R:")));
+	add_subwindow(fix_min_r = new C41TextBox(plugin, &plugin->config.fix_min_r, x+60, y));
+	y += 30;
+
+	add_subwindow(new BC_Title(x, y, _("Min G:")));
+	add_subwindow(fix_min_g = new C41TextBox(plugin, &plugin->config.fix_min_g, x+60, y));
+	y += 30;
+
+	add_subwindow(new BC_Title(x, y, _("Min B:")));
+	add_subwindow(fix_min_b = new C41TextBox(plugin, &plugin->config.fix_min_b, x+60, y));
+	y += 30;
+
+	add_subwindow(new BC_Title(x, y, _("Magic4:")));
+	add_subwindow(fix_magic4 = new C41TextBox(plugin, &plugin->config.fix_magic4, x+60, y));
+	y += 30;
+
+	add_subwindow(new BC_Title(x, y, _("Magic5:")));
+	add_subwindow(fix_magic5 = new C41TextBox(plugin, &plugin->config.fix_magic5, x+60, y));
+	y += 30;
+
+	add_subwindow(new BC_Title(x, y, _("Magic6:")));
+	add_subwindow(fix_magic6 = new C41TextBox(plugin, &plugin->config.fix_magic6, x+60, y));
+	y += 30;
+
+
+	show_window();
+	flush();
+}
+
+void C41Window::update()
+{
+	plugin->thread->window->active->update(plugin->config.active);
+	plugin->thread->window->compute_magic->update(plugin->config.compute_magic);
+
+	plugin->thread->window->min_r->update(plugin->min_r);
+	plugin->thread->window->min_g->update(plugin->min_g);
+	plugin->thread->window->min_b->update(plugin->min_b);
+	plugin->thread->window->magic4->update(plugin->magic4);
+	plugin->thread->window->magic5->update(plugin->magic5);
+	plugin->thread->window->magic6->update(plugin->magic6);
+
+	plugin->thread->window->fix_min_r->update(plugin->config.fix_min_r);
+	plugin->thread->window->fix_min_g->update(plugin->config.fix_min_g);
+	plugin->thread->window->fix_min_b->update(plugin->config.fix_min_b);
+	plugin->thread->window->fix_magic4->update(plugin->config.fix_magic4);
+	plugin->thread->window->fix_magic5->update(plugin->config.fix_magic5);
+	plugin->thread->window->fix_magic6->update(plugin->config.fix_magic6);
+}
+
+WINDOW_CLOSE_EVENT(C41Window);
+PLUGIN_THREAD_OBJECT(C41Effect, C41Thread, C41Window);
+
+// C41Effect
+C41Effect::C41Effect(PluginServer *server)
+ : PluginVClient(server)
+{
+	min_r = min_g = min_b = magic4 = magic5 = magic6 = 0.;
+	PLUGIN_CONSTRUCTOR_MACRO
+}
+
+C41Effect::~C41Effect()
+{
+	PLUGIN_DESTRUCTOR_MACRO
+}
+
+char* C41Effect::plugin_title() { return N_("C41"); }
+
+int C41Effect::is_realtime() { return 1; }
+
+NEW_PICON_MACRO(C41Effect)
+SHOW_GUI_MACRO(C41Effect, C41Thread)
+RAISE_WINDOW_MACRO(C41Effect)
+SET_STRING_MACRO(C41Effect)
+LOAD_CONFIGURATION_MACRO(C41Effect, C41Config)
+
+void C41Effect::lock_parameters()
+{
+	config.fix_min_r = min_r;
+	config.fix_min_g = min_g;
+	config.fix_min_b = min_b;
+	config.fix_magic4 = magic4;
+	config.fix_magic5 = magic5;
+	config.fix_magic6 = magic6;
+}
+
+void C41Effect::update_gui()
+{
+	if(thread && load_configuration())
+	{
+		thread->window->lock_window("C41Effect::update_gui");
+		thread->window->update();
+		thread->window->unlock_window();
+	}
+}
+
+void C41Effect::render_gui(void* data)
+{}
+
+int C41Effect::load_defaults()
+{
+	char directory[BCTEXTLEN];
+	sprintf(directory, "%sC41.rc", BCASTDIR);
+	defaults = new BC_Hash(directory);
+	defaults->load();
+	config.active = defaults->get("ACTIVE", config.active);
+	config.compute_magic = defaults->get("COMPUTE_MAGIC", config.compute_magic);
+
+	config.fix_min_r = defaults->get("FIX_MIN_R", config.fix_min_r);
+	config.fix_min_g = defaults->get("FIX_MIN_G", config.fix_min_g);
+	config.fix_min_b = defaults->get("FIX_MIN_B", config.fix_min_b);
+	config.fix_magic4 = defaults->get("FIX_MAGIC4", config.fix_magic4);
+	config.fix_magic5 = defaults->get("FIX_MAGIC5", config.fix_magic5);
+	config.fix_magic6 = defaults->get("FIX_MAGIC6", config.fix_magic6);
+
+	return 0;
+}
+
+int C41Effect::save_defaults()
+{
+	defaults->update("ACTIVE", config.active);
+	defaults->update("COMPUTE_MAGIC", config.compute_magic);
+
+	defaults->update("FIX_MIN_R", config.fix_min_r);
+	defaults->update("FIX_MIN_G", config.fix_min_g);
+	defaults->update("FIX_MIN_B", config.fix_min_b);
+	defaults->update("FIX_MAGIC4", config.fix_magic4);
+	defaults->update("FIX_MAGIC5", config.fix_magic5);
+	defaults->update("FIX_MAGIC6", config.fix_magic6);
+	defaults->save();
+	return 0;
+}
+
+void C41Effect::save_data(KeyFrame *keyframe)
+{
+	FileXML output;
+	output.set_shared_string(keyframe->data, MESSAGESIZE);
+	output.tag.set_title("C41");
+	output.tag.set_property("ACTIVE", config.active);
+	output.tag.set_property("COMPUTE_MAGIC", config.compute_magic);
+
+	output.tag.set_property("FIX_MIN_R", config.fix_min_r);
+	output.tag.set_property("FIX_MIN_G", config.fix_min_g);
+	output.tag.set_property("FIX_MIN_B", config.fix_min_b);
+	output.tag.set_property("FIX_MAGIC4", config.fix_magic4);
+	output.tag.set_property("FIX_MAGIC5", config.fix_magic5);
+	output.tag.set_property("FIX_MAGIC6", config.fix_magic6);
+
+	output.append_tag();
+	output.tag.set_title("/C41");
+	output.append_tag();
+	output.terminate_string();
+}
+
+void C41Effect::read_data(KeyFrame *keyframe)
+{
+	FileXML input;
+	input.set_shared_string(keyframe->data, strlen(keyframe->data));
+	while(!input.read_tag())
+	{
+		if(input.tag.title_is("C41"))
+		{
+			config.active = input.tag.get_property("ACTIVE", config.active);
+			config.compute_magic = input.tag.get_property("COMPUTE_MAGIC", config.compute_magic);
+
+			config.fix_min_r = input.tag.get_property("FIX_MIN_R", config.fix_min_r);
+			config.fix_min_g = input.tag.get_property("FIX_MIN_G", config.fix_min_g);
+			config.fix_min_b = input.tag.get_property("FIX_MIN_B", config.fix_min_b);
+			config.fix_magic4 = input.tag.get_property("FIX_MAGIC4", config.fix_magic5);
+			config.fix_magic5 = input.tag.get_property("FIX_MAGIC5", config.fix_magic5);
+			config.fix_magic6 = input.tag.get_property("FIX_MAGIC6", config.fix_magic6);
+		}
+	}
+}
+
+
+/* Faster pow() approximation; borrowed from http://www.dctsystems.co.uk/Software/power.html
+ * Tests on real-world data showed a max error of 4% and avg. error or .1 to .5%,
+ * while accelerating rendering by a factor of 4.
+ */
+float C41Effect::myLog2(float i)
+{
+	float x;
+	float y;
+	float LogBodge = 0.346607f;
+	x = *(int *)&i;
+	x *= 1.0 / (1 << 23); // 1/pow(2,23);
+	x = x - 127;
+
+	y = x - floorf(x);
+	y = (y - y * y) * LogBodge;
+	return x + y;
+}
+
+float C41Effect::myPow2(float i)
+{
+	float PowBodge = 0.33971f;
+	float x;
+	float y = i - floorf(i);
+	y = (y - y * y) * PowBodge;
+
+	x = i + 127 - y;
+	x *= (1 << 23);
+	*(int*) &x = (int)x;
+	return x;
+}
+
+float C41Effect::myPow(float a, float b)
+{
+	return myPow2(b * myLog2(a));
+}
+
+
+int C41Effect::process_buffer(VFrame *frame,
+		int64_t start_position,
+		double frame_rate)
+{
+	load_configuration();
+
+	read_frame(frame,
+			0,
+			start_position,
+			frame_rate,
+			0);
+
+	int frame_w = frame->get_w();
+	int frame_h = frame->get_h();
+
+	switch(frame->get_color_model())
+	{
+		case BC_RGB888:
+		case BC_YUV888:
+		case BC_RGBA_FLOAT:
+		case BC_RGBA8888:
+		case BC_YUVA8888:
+		case BC_RGB161616:
+		case BC_YUV161616:
+		case BC_RGBA16161616:
+		case BC_YUVA16161616:
+			return 0; // Unsupported
+		case BC_RGB_FLOAT:
+			break;
+	}
+
+	float magic1;
+	float magic2;
+	float magic3;
+	float magic4;
+	float magic5;
+	float magic6;
+
+	if(config.compute_magic)
+	{
+		// Box blur!
+		VFrame* tmp_frame = new VFrame(*frame);
+		VFrame* blurry_frame = new VFrame(*frame);
+
+		float** rows = (float**)frame->get_rows();
+		float** tmp_rows = (float**)tmp_frame->get_rows();
+		float** blurry_rows = (float**)blurry_frame->get_rows();
+		for(int i = 0; i < frame_h; i++)
+			for(int j = 0; j < (3*frame_w); j++)
+				blurry_rows[i][j] = rows[i][j];
+
+		int boxw = 5, boxh = 5;
+		// 10 passes of Box blur should be good
+		int pass;
+		int x;
+		int y;
+		int y_up;
+		int y_down;
+		int x_right;
+		int x_left;
+		float component;
+		for(pass=0; pass<10; pass++)
+		{
+			for(y = 0; y < frame_h; y++)
+				for(x = 0; x < (3 * frame_w); x++)
+					tmp_rows[y][x] = blurry_rows[y][x];
+			for(y = 0; y < frame_h; y++)
+			{
+				y_up = (y - boxh < 0)? 0 : y - boxh;
+				y_down = (y + boxh >= frame_h)? frame_h - 1 : y + boxh;
+				for(x = 0; x < (3*frame_w); x++)
+				{
+					x_left = (x-(3*boxw) < 0)? 0 : x-(3*boxw);
+					x_right = (x+(3*boxw) >= (3*frame_w))? (3*frame_w)-1 : x+(3*boxw);
+					component=(tmp_rows[y_down][x_right]
+							+tmp_rows[y_up][x_left]
+							+tmp_rows[y_up][x_right]
+							+tmp_rows[y_down][x_right])/4;
+					blurry_rows[y][x]= component;
+				}
+			}
+		}
+
+		// Compute magic negfix values
+		float minima_r = 50.;
+		float minima_g = 50.;
+		float minima_b = 50.;
+		float maxima_r = 0.;
+		float maxima_g = 0.;
+		float maxima_b = 0.;
+
+		// Shave the image in order to avoid black borders
+		// Tolerance default: 5%, i.e. 0.05
+#define TOLERANCE 0.05
+#define SKIP_ROW if (i<(TOLERANCE * frame_h) || i>((1-TOLERANCE)*frame_h)) continue
+#define SKIP_COL if (j<(TOLERANCE * frame_w) || j>((1-TOLERANCE)*frame_w)) continue
+
+		for(int i = 0; i < frame_h; i++)
+		{
+			SKIP_ROW;
+			float *row = (float*)blurry_frame->get_rows()[i];
+			for(int j = 0; j < frame_w; j++, row += 3)
+			{
+				SKIP_COL;
+
+				if(row[0] < minima_r) minima_r = row[0];
+				if(row[0] > maxima_r) maxima_r = row[0];
+
+				if(row[1] < minima_g) minima_g = row[1];
+				if(row[1] > maxima_g) maxima_g = row[1];
+
+				if(row[2] < minima_b) minima_b = row[2];
+				if(row[2] > maxima_b) maxima_b = row[2];
+			}
+		}
+
+		// Delete the VFrames we used for blurring
+		delete tmp_frame;
+		delete blurry_frame;
+
+		magic1 = minima_r;
+		magic2 = minima_g;
+		magic3 = minima_b;
+		magic4 = (minima_r / maxima_r) * 0.95;
+		magic5 = log(maxima_r / minima_r) / log(maxima_g / minima_g);
+		magic6 = log(maxima_r / minima_r) / log(maxima_b / minima_b);
+
+		// Update GUI
+		send_render_gui(NULL);
+	}
+
+	// Apply the transformation
+	if(config.active)
+	{
+		// Get the values from the config instead of the computed ones
+		for(int i = 0; i < frame_h; i++)
+		{
+			float *row = (float*)frame->get_rows()[i];
+			for(int j = 0; j < frame_w; j++, row += 3)
+			{
+				row[0] = (config.fix_min_r / row[0]) - config.fix_magic4;
+
+				row[1] = myPow((config.fix_min_g / row[1]), config.fix_magic5) - config.fix_magic4;
+
+				row[2] = myPow((config.fix_min_b / row[2]), config.fix_magic6) - config.fix_magic4;
+			}
+		}
+	}
+
+	return 0;
+}
+
diff --git a/plugins/C41/picon.png b/plugins/C41/picon.png
new file mode 100644
index 0000000..7fd3f71
Binary files /dev/null and b/plugins/C41/picon.png differ
diff --git a/plugins/C41/picon_png.h b/plugins/C41/picon_png.h
new file mode 100644
index 0000000..f5b375c
--- /dev/null
+++ b/plugins/C41/picon_png.h
@@ -0,0 +1,272 @@
+/*
+ * C41 plugin for Cinelerra
+ * Copyright (C) 2011 Florent Delannoy <florent at plui dot es>
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * 
+ */
+
+#ifndef PICON_PNG_H
+#define PICON_PNG_H
+static unsigned char picon_png[]={
+	0x00, 0x00, 0x07, 0xaa, 
+	0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 
+	0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 
+	0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x32, 
+	0x08, 0x03, 0x00, 0x00, 0x00, 0x29, 0xe1, 0x78, 
+	0x83, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47, 
+	0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 
+	0x01, 0x80, 0x50, 0x4c, 0x54, 0x45, 0x6a, 0x86, 
+	0x94, 0xe6, 0xea, 0xe5, 0xcb, 0xc2, 0xb9, 0xa8, 
+	0x84, 0x75, 0x5a, 0xad, 0x98, 0xb9, 0xa1, 0x95, 
+	0x8f, 0xa8, 0xb5, 0x54, 0x66, 0x69, 0x0d, 0x0c, 
+	0x11, 0x9b, 0x71, 0x62, 0x74, 0x44, 0x36, 0x65, 
+	0xb5, 0xa3, 0xbd, 0x8c, 0xaf, 0x62, 0x7c, 0x8a, 
+	0x8b, 0x88, 0x85, 0xa9, 0xba, 0xc2, 0xc3, 0xb5, 
+	0xa9, 0x94, 0x66, 0x57, 0xb4, 0x99, 0x8b, 0x8b, 
+	0x5a, 0x4a, 0x76, 0x92, 0xa0, 0xe0, 0x91, 0x6e, 
+	0xdd, 0x8c, 0x68, 0x8c, 0xb8, 0xc7, 0xb1, 0x9f, 
+	0x9d, 0x6e, 0xed, 0xf1, 0xd8, 0xe7, 0xe7, 0xc5, 
+	0xd7, 0xda, 0x47, 0x37, 0x33, 0xe8, 0xf0, 0xec, 
+	0xc3, 0xa6, 0x9b, 0x94, 0xc3, 0xd1, 0xf2, 0xb6, 
+	0x81, 0xa2, 0x7b, 0x6c, 0x68, 0x37, 0x2a, 0xde, 
+	0x94, 0x74, 0xff, 0xfe, 0xf8, 0x6a, 0x53, 0x4b, 
+	0x35, 0x2a, 0x29, 0xb6, 0xc2, 0xc6, 0xad, 0x9c, 
+	0x9a, 0xbc, 0xa8, 0x9d, 0xd7, 0xdb, 0xd8, 0x79, 
+	0x6e, 0x6a, 0xf4, 0xf2, 0xea, 0xab, 0xe2, 0xf0, 
+	0x2b, 0x5d, 0xaa, 0xf6, 0xf4, 0xed, 0x22, 0x14, 
+	0x15, 0xac, 0xd8, 0xe1, 0x89, 0x7a, 0x72, 0xe2, 
+	0xe5, 0xdf, 0x57, 0x44, 0x3f, 0x85, 0x9c, 0xa8, 
+	0xc7, 0xbb, 0xb1, 0xc5, 0xdc, 0xe0, 0x7d, 0xa7, 
+	0xb7, 0xbd, 0xd3, 0xd8, 0x4f, 0x27, 0x1e, 0xa9, 
+	0xc1, 0xca, 0xae, 0x93, 0x87, 0xa6, 0xd2, 0xde, 
+	0xe5, 0xf8, 0xf1, 0xbf, 0x8f, 0xb3, 0x87, 0xcd, 
+	0xbd, 0xa3, 0xb5, 0xbd, 0xb6, 0xcb, 0xd2, 0xcc, 
+	0xe1, 0xe5, 0xf2, 0xf0, 0xe9, 0xf5, 0xf3, 0xeb, 
+	0x5e, 0xb1, 0x9c, 0xdd, 0xe0, 0xdb, 0xc0, 0xc9, 
+	0xc9, 0xee, 0xed, 0xe6, 0x9d, 0xcc, 0xda, 0x81, 
+	0x4e, 0x3f, 0x58, 0x69, 0x6e, 0xb5, 0xb5, 0xac, 
+	0x62, 0x2b, 0x1c, 0xdf, 0x8f, 0x6b, 0xf8, 0xf6, 
+	0xee, 0x7e, 0xc5, 0xb5, 0x9e, 0xd8, 0xe7, 0xc0, 
+	0xae, 0xa3, 0x63, 0xa6, 0xb3, 0x77, 0x60, 0x57, 
+	0xab, 0x8b, 0x7c, 0xdd, 0xf0, 0xec, 0x52, 0x1b, 
+	0x12, 0xf6, 0xf4, 0xeb, 0xeb, 0xce, 0xbd, 0xf0, 
+	0xf4, 0xef, 0xd0, 0xd4, 0xd3, 0xb9, 0xd0, 0xc7, 
+	0xef, 0xf1, 0xec, 0xea, 0xc0, 0xa9, 0x52, 0x63, 
+	0x65, 0x86, 0xec, 0xf1, 0x4c, 0x5e, 0x60, 0x5e, 
+	0x73, 0x80, 0xab, 0xaa, 0xa3, 0x76, 0x9d, 0xac, 
+	0x60, 0xb2, 0xa0, 0x3a, 0x1e, 0x1a, 0xb2, 0xad, 
+	0xc0, 0xc5, 0xce, 0xd1, 0x6b, 0xbb, 0xab, 0xd1, 
+	0xcd, 0xcb, 0x5f, 0x9d, 0xb3, 0x18, 0x14, 0x19, 
+	0xcd, 0xd1, 0xc7, 0xb0, 0x8f, 0x82, 0xd3, 0xb7, 
+	0x9e, 0xf4, 0xf7, 0xf0, 0xf5, 0xb8, 0x82, 0x99, 
+	0xb1, 0xbb, 0x28, 0x1e, 0x1f, 0xdd, 0x8f, 0x6e, 
+	0xaf, 0xd5, 0xcf, 0xbe, 0xf7, 0xf8, 0x83, 0xaf, 
+	0xbf, 0xdc, 0x88, 0x63, 0x63, 0xa4, 0xb1, 0x80, 
+	0x81, 0x80, 0x74, 0x3e, 0x30, 0xbe, 0xa9, 0xc4, 
+	0xe1, 0xb1, 0x9c, 0x76, 0xc0, 0xb0, 0x96, 0x21, 
+	0x7e, 0x35, 0x00, 0x00, 0x00, 0x01, 0x62, 0x4b, 
+	0x47, 0x44, 0x00, 0x88, 0x05, 0x1d, 0x48, 0x00, 
+	0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 
+	0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 
+	0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 
+	0x74, 0x49, 0x4d, 0x45, 0x07, 0xdb, 0x0a, 0x0e, 
+	0x02, 0x1f, 0x1c, 0xc4, 0x9d, 0xaf, 0x61, 0x00, 
+	0x00, 0x05, 0xa3, 0x49, 0x44, 0x41, 0x54, 0x48, 
+	0xc7, 0x8d, 0xd4, 0xfb, 0x6f, 0xda, 0x56, 0x14, 
+	0x07, 0xf0, 0xeb, 0xb9, 0x80, 0x4d, 0xca, 0xc3, 
+	0x36, 0x79, 0x8c, 0x40, 0x52, 0x93, 0xc6, 0x81, 
+	0x84, 0xd5, 0x8e, 0x80, 0x10, 0x1e, 0x59, 0x05, 
+	0x18, 0x5a, 0xc7, 0x11, 0xa1, 0x45, 0x71, 0x13, 
+	0xc1, 0x10, 0x6a, 0x44, 0x58, 0xaa, 0x59, 0x2c, 
+	0xb5, 0x99, 0xa8, 0x4c, 0xd5, 0x7f, 0x7d, 0xe7, 
+	0xfa, 0x1a, 0x07, 0x55, 0xfb, 0x61, 0x5f, 0x14, 
+	0x04, 0xd1, 0xfd, 0xf8, 0xdc, 0x73, 0xae, 0x0d, 
+	0x8a, 0x9a, 0xa6, 0x6d, 0x9b, 0x45, 0x13, 0x92, 
+	0x32, 0xcd, 0xa7, 0xa8, 0x64, 0x9b, 0x8c, 0xc9, 
+	0x30, 0x0c, 0x7c, 0x57, 0x4c, 0x45, 0xb1, 0x53, 
+	0x82, 0xc1, 0xc7, 0xfb, 0xfd, 0x3e, 0xfc, 0xed, 
+	0xd9, 0x78, 0x89, 0x8d, 0x4a, 0x4e, 0x3d, 0x55, 
+	0x3c, 0x89, 0x9a, 0x27, 0xd1, 0xcf, 0x27, 0x26, 
+	0x43, 0x39, 0x45, 0x20, 0xae, 0x71, 0x91, 0x92, 
+	0x12, 0x66, 0xfd, 0xf8, 0x2f, 0x38, 0x67, 0x67, 
+	0x7d, 0xdd, 0xc6, 0x97, 0x46, 0x05, 0x0a, 0xea, 
+	0x78, 0x8b, 0x18, 0x86, 0x8a, 0xda, 0x36, 0xfe, 
+	0xac, 0x00, 0x60, 0x4c, 0xc5, 0x96, 0x74, 0x91, 
+	0xdf, 0xeb, 0x9f, 0x11, 0x13, 0x9f, 0xb9, 0x9b, 
+	0x41, 0xb0, 0xda, 0x49, 0xa7, 0x29, 0x8a, 0x2a, 
+	0x14, 0x0a, 0xef, 0x86, 0xc9, 0xac, 0x69, 0x4a, 
+	0xb0, 0x53, 0x49, 0xc1, 0xce, 0xae, 0x4a, 0xc2, 
+	0x2c, 0x90, 0xeb, 0x9f, 0xb9, 0x89, 0xc7, 0xf7, 
+	0x0e, 0x71, 0x69, 0xa4, 0x69, 0x9a, 0xea, 0xe0, 
+	0x2a, 0xf8, 0x02, 0xa6, 0x94, 0x92, 0x60, 0xbd, 
+	0xa4, 0xe0, 0x4a, 0xd0, 0x4b, 0x35, 0x4c, 0xf3, 
+	0xb9, 0x5c, 0x3f, 0x4e, 0x44, 0x7f, 0x8f, 0xf3, 
+	0x49, 0xcf, 0x61, 0xbc, 0x48, 0x29, 0x98, 0x05, 
+	0x40, 0xdb, 0xed, 0x45, 0xa9, 0x86, 0x8d, 0xc0, 
+	0x8a, 0xe0, 0x2a, 0x2c, 0xbe, 0x32, 0x52, 0x55, 
+	0x35, 0x9f, 0x6f, 0x7b, 0xc6, 0x84, 0xb5, 0xa6, 
+	0x49, 0xfa, 0x82, 0x22, 0xf6, 0x92, 0xa3, 0x59, 
+	0x96, 0x15, 0xf9, 0x7e, 0x3c, 0x1e, 0xc7, 0x65, 
+	0x68, 0x7c, 0x21, 0x94, 0x07, 0xd0, 0x96, 0xef, 
+	0x88, 0x31, 0x25, 0x9b, 0x2c, 0x26, 0xf3, 0x9a, 
+	0x2e, 0xc3, 0x9c, 0x51, 0x17, 0xf5, 0x8c, 0x5e, 
+	0x27, 0x63, 0xae, 0x33, 0xa4, 0x4a, 0xde, 0x8d, 
+	0x6b, 0x24, 0x09, 0xd7, 0x30, 0x09, 0x53, 0xa6, 
+	0xdd, 0xb0, 0xc0, 0x8a, 0x2c, 0x27, 0x08, 0x02, 
+	0x9d, 0xcb, 0xf1, 0x5c, 0xe6, 0x50, 0xc0, 0x3d, 
+	0x23, 0x35, 0xaf, 0xb6, 0xf3, 0xed, 0xbc, 0x2c, 
+	0x3b, 0xf0, 0x15, 0x37, 0xcf, 0x98, 0xa6, 0x27, 
+	0x32, 0x61, 0x5d, 0xd7, 0x8b, 0xc5, 0x1b, 0x8e, 
+	0xd3, 0xd9, 0x40, 0x80, 0x13, 0xc4, 0x00, 0xef, 
+	0x56, 0x69, 0x43, 0xa0, 0x88, 0x2c, 0xbf, 0x8e, 
+	0x32, 0x4c, 0x51, 0x92, 0xbc, 0xc6, 0xe1, 0xdc, 
+	0xab, 0xba, 0xa0, 0x87, 0xa7, 0xb6, 0x14, 0xbd, 
+	0x61, 0x05, 0x31, 0x1e, 0x10, 0x6e, 0x74, 0xd1, 
+	0xeb, 0x45, 0x6e, 0xb7, 0x55, 0x4d, 0x6d, 0xcb, 
+	0x72, 0xcf, 0x91, 0x4e, 0x8a, 0x10, 0x09, 0x8e, 
+	0xd0, 0x06, 0xb3, 0x64, 0xeb, 0x34, 0x9b, 0x09, 
+	0x1f, 0x9e, 0x05, 0x68, 0x83, 0x8e, 0x07, 0x94, 
+	0x62, 0xd4, 0x56, 0xf0, 0xf5, 0x90, 0x2a, 0xe7, 
+	0x61, 0xf9, 0x9d, 0xdc, 0xee, 0xb5, 0xa9, 0x68, 
+	0xf1, 0x06, 0x22, 0x29, 0x38, 0xd3, 0xae, 0x4e, 
+	0xf3, 0x3c, 0x3f, 0x63, 0x45, 0xba, 0x9e, 0x9b, 
+	0xd1, 0xb9, 0xb8, 0xc8, 0xd6, 0x5d, 0x01, 0x55, 
+	0x60, 0x63, 0x72, 0x4f, 0x06, 0xa8, 0x51, 0x0d, 
+	0x27, 0x95, 0xba, 0x39, 0x24, 0x37, 0x64, 0xb5, 
+	0x2b, 0xb0, 0x06, 0x0f, 0x47, 0x0f, 0xc9, 0xf1, 
+	0x06, 0x9f, 0xeb, 0xd7, 0xc5, 0x29, 0x21, 0x50, 
+	0xa1, 0x7d, 0x97, 0xbf, 0xcb, 0xcb, 0xaa, 0x76, 
+	0xdc, 0x88, 0x45, 0x6f, 0x6e, 0xe0, 0x38, 0x6c, 
+	0x46, 0x51, 0xaa, 0x19, 0x9d, 0x13, 0x8d, 0x59, 
+	0x00, 0x66, 0x1b, 0xef, 0xf3, 0x34, 0x36, 0x81, 
+	0xa2, 0x7b, 0x10, 0x48, 0xc6, 0x55, 0xe0, 0x2d, 
+	0x3f, 0xa2, 0x8e, 0x63, 0x47, 0x09, 0xa7, 0x08, 
+	0x9b, 0xc2, 0xdd, 0x03, 0x11, 0x58, 0xda, 0xa8, 
+	0xc3, 0xd9, 0xc7, 0xfb, 0x33, 0x16, 0x3e, 0xe4, 
+	0x02, 0x87, 0x84, 0xb4, 0xb1, 0x69, 0xcb, 0x79, 
+	0x55, 0x7b, 0x77, 0x64, 0xa1, 0x60, 0xcc, 0xc1, 
+	0x62, 0x0a, 0xad, 0x64, 0x96, 0x50, 0x86, 0x86, 
+	0xbb, 0x12, 0xd6, 0x0a, 0x1c, 0x27, 0xc6, 0x7d, 
+	0xa2, 0xc2, 0xc6, 0x64, 0x18, 0xb3, 0x76, 0x3c, 
+	0x6c, 0x24, 0x82, 0xb5, 0x66, 0xd9, 0x81, 0x81, 
+	0x55, 0xa1, 0xc8, 0x32, 0x13, 0x16, 0x38, 0x96, 
+	0x9e, 0xf1, 0x81, 0x80, 0xb1, 0xac, 0xde, 0x66, 
+	0xb8, 0x00, 0x9f, 0x72, 0x6f, 0x11, 0xd4, 0x6b, 
+	0x63, 0xa2, 0x52, 0xd4, 0xf1, 0x71, 0xa9, 0x64, 
+	0xd5, 0x9a, 0xc9, 0xb4, 0x03, 0x83, 0x51, 0xaa, 
+	0xcb, 0xf0, 0x72, 0x89, 0x2f, 0x6e, 0xd4, 0x61, 
+	0x6e, 0x2c, 0xab, 0xeb, 0x7c, 0xdd, 0x60, 0x3c, 
+	0xd2, 0x53, 0x29, 0x4d, 0x55, 0x35, 0x6d, 0xd8, 
+	0x28, 0x59, 0xcd, 0xda, 0x6e, 0x32, 0xdd, 0x72, 
+	0x08, 0x09, 0x43, 0x15, 0x0e, 0xb7, 0x33, 0x33, 
+	0x8c, 0xd9, 0x0c, 0x04, 0xb7, 0x22, 0x72, 0x4f, 
+	0x83, 0xa7, 0x4b, 0xa3, 0x1e, 0xad, 0x44, 0x30, 
+	0xd8, 0x6c, 0x25, 0x93, 0xe5, 0xd7, 0x8e, 0x4b, 
+	0x74, 0x5d, 0x80, 0x5b, 0x8c, 0xa6, 0x67, 0x06, 
+	0x0d, 0x6f, 0xf5, 0x3a, 0x7d, 0xe8, 0x57, 0xe9, 
+	0x91, 0xde, 0x4b, 0x28, 0x91, 0x88, 0x58, 0xcd, 
+	0x4a, 0xa5, 0x49, 0x3d, 0x39, 0x1e, 0x81, 0x22, 
+	0x34, 0xcd, 0x09, 0xcb, 0x4c, 0xf7, 0xf6, 0x56, 
+	0x10, 0x15, 0x9f, 0xc8, 0x32, 0x9c, 0x09, 0x35, 
+	0x2c, 0x95, 0x82, 0xe8, 0x3e, 0x68, 0x59, 0xb5, 
+	0x56, 0x72, 0xf0, 0xc9, 0x81, 0xf6, 0xc3, 0x30, 
+	0x65, 0x20, 0x86, 0x9e, 0x59, 0x72, 0xac, 0x7e, 
+	0xbb, 0x64, 0xbd, 0xc7, 0x10, 0x69, 0x14, 0x05, 
+	0xb7, 0xbf, 0xf6, 0x18, 0x44, 0xe8, 0xea, 0x0a, 
+	0x59, 0x96, 0x15, 0xa3, 0xa8, 0x74, 0xb2, 0xec, 
+	0x64, 0xe0, 0x3e, 0x86, 0x2a, 0x22, 0x6d, 0x18, 
+	0x34, 0x4c, 0x01, 0x1e, 0xb4, 0x43, 0x9f, 0xf4, 
+	0xd4, 0xd1, 0xf0, 0x7d, 0xa3, 0xe1, 0x20, 0x14, 
+	0x41, 0x09, 0x10, 0xcd, 0x41, 0x3a, 0xdd, 0xba, 
+	0xb8, 0x70, 0xba, 0x60, 0x38, 0x62, 0xea, 0x86, 
+	0x08, 0x51, 0x56, 0x64, 0x54, 0xa0, 0x34, 0xaa, 
+	0xf0, 0x18, 0x4c, 0x24, 0x12, 0x08, 0x05, 0xad, 
+	0x58, 0xad, 0x3c, 0x02, 0x72, 0x79, 0xf9, 0xd1, 
+	0x81, 0xb3, 0xc4, 0x53, 0x06, 0x53, 0xe7, 0x0d, 
+	0xc3, 0x10, 0x57, 0xbf, 0x0f, 0x48, 0xce, 0x6b, 
+	0xef, 0x1e, 0x63, 0xa5, 0x04, 0xba, 0xbf, 0x47, 
+	0x89, 0x46, 0xad, 0x59, 0xa3, 0x06, 0xe9, 0x4f, 
+	0xa7, 0xfb, 0xdb, 0xfb, 0x97, 0x4e, 0x17, 0x8c, 
+	0x80, 0x0d, 0x1f, 0x80, 0x11, 0x9f, 0xf8, 0xa4, 
+	0x27, 0x0f, 0xa8, 0x46, 0xb0, 0x94, 0xc0, 0xb1, 
+	0x9a, 0xcd, 0x66, 0x6b, 0x34, 0x4a, 0x27, 0x2f, 
+	0x16, 0x0b, 0x62, 0xe0, 0x74, 0xf0, 0x0c, 0x66, 
+	0x75, 0x83, 0x2e, 0xfa, 0xa4, 0x30, 0x1c, 0x1e, 
+	0x35, 0x62, 0xc1, 0xd2, 0xf9, 0xa4, 0x14, 0xac, 
+	0x94, 0x2b, 0xbb, 0xc9, 0xc1, 0x20, 0xd9, 0xda, 
+	0x3f, 0x9f, 0x9c, 0x6f, 0xc3, 0xde, 0xba, 0xdd, 
+	0x0c, 0x9e, 0x1c, 0x74, 0xc4, 0xb2, 0xa6, 0x4f, 
+	0x46, 0xa3, 0xc2, 0xf0, 0x31, 0x16, 0x0c, 0x2e, 
+	0xac, 0xed, 0x5a, 0xab, 0xdc, 0x4a, 0xa6, 0x07, 
+	0x4f, 0xe5, 0xd6, 0xf6, 0x64, 0x32, 0x39, 0xdf, 
+	0xbf, 0xf8, 0xe8, 0xdc, 0x76, 0x71, 0x80, 0x2d, 
+	0xa7, 0x8c, 0x4f, 0xe0, 0xb7, 0xf5, 0x38, 0x66, 
+	0x59, 0x41, 0x6b, 0x61, 0x95, 0x5b, 0x70, 0xf6, 
+	0x03, 0x97, 0xfc, 0x95, 0x98, 0x4c, 0x16, 0x97, 
+	0xa7, 0xbf, 0x11, 0x53, 0xad, 0x56, 0x15, 0xe6, 
+	0x99, 0x94, 0x5b, 0x9f, 0x70, 0x7e, 0x5f, 0x65, 
+	0xf0, 0xd4, 0x7b, 0x82, 0x31, 0xbb, 0xff, 0x4c, 
+	0x96, 0x4f, 0x9d, 0x5b, 0x58, 0x0e, 0x0f, 0x1d, 
+	0x8e, 0x49, 0x82, 0xde, 0xbc, 0xf9, 0xf2, 0x62, 
+	0x2d, 0x9d, 0x6f, 0xab, 0x6c, 0xc1, 0x2b, 0x79, 
+	0x79, 0xe9, 0x64, 0xa6, 0x8c, 0x32, 0x0e, 0x85, 
+	0x42, 0x57, 0xa1, 0x2b, 0x12, 0x9f, 0x74, 0x48, 
+	0x36, 0xb6, 0x60, 0xe9, 0xd6, 0x35, 0x64, 0x73, 
+	0xf3, 0xfa, 0x5b, 0x6b, 0x7f, 0x7b, 0x1b, 0xff, 
+	0xc6, 0x63, 0x12, 0x5a, 0x23, 0x1b, 0xcf, 0xe4, 
+	0xa1, 0xf3, 0x65, 0x0b, 0x03, 0xd7, 0xcc, 0xaf, 
+	0xb7, 0x76, 0xb7, 0x17, 0x8b, 0x73, 0x87, 0x4d, 
+	0x8d, 0x5d, 0x73, 0x45, 0x94, 0x47, 0x3a, 0x9d, 
+	0x17, 0x7e, 0x95, 0x6b, 0x3f, 0x5b, 0x65, 0x20, 
+	0x13, 0xe4, 0xa4, 0x48, 0x15, 0x0c, 0x42, 0xfe, 
+	0xc6, 0x3a, 0xab, 0x6c, 0x7c, 0xbb, 0x5e, 0x6d, 
+	0x6b, 0x13, 0xaa, 0x2c, 0x26, 0x93, 0x04, 0x8a, 
+	0x5c, 0x8d, 0x43, 0xb8, 0xce, 0x15, 0x71, 0x7e, 
+	0x15, 0x7f, 0x63, 0xb0, 0xa1, 0x39, 0x2c, 0x07, 
+	0xb4, 0xb9, 0x22, 0x4d, 0x67, 0x3c, 0x1e, 0xaf, 
+	0xfa, 0x09, 0x11, 0xe2, 0x6e, 0xeb, 0x01, 0x5e, 
+	0x40, 0xe6, 0x5b, 0x58, 0x90, 0x2a, 0x95, 0x73, 
+	0x7c, 0xb3, 0x46, 0x9a, 0x59, 0x67, 0x45, 0x20, 
+	0x1e, 0x71, 0x85, 0x5b, 0x65, 0x3e, 0x9f, 0xbb, 
+	0x15, 0x36, 0x0f, 0xa0, 0x4a, 0x65, 0x82, 0x22, 
+	0x90, 0x4a, 0x36, 0xeb, 0x7c, 0xf6, 0x11, 0x26, 
+	0xde, 0xa6, 0x20, 0x1b, 0x0f, 0x40, 0x0e, 0xdc, 
+	0xe5, 0x38, 0xd7, 0x95, 0x04, 0x00, 0x84, 0xc9, 
+	0x8e, 0x43, 0xc4, 0xd8, 0x23, 0xb0, 0xb8, 0xf3, 
+	0xb0, 0x81, 0xd3, 0xf9, 0x31, 0x77, 0x81, 0x67, 
+	0x9a, 0xf0, 0x48, 0x44, 0x10, 0x02, 0x92, 0xcd, 
+	0xfa, 0xfd, 0x60, 0xf2, 0x40, 0x82, 0xc9, 0xc3, 
+	0x0f, 0x58, 0xee, 0x65, 0x7e, 0x30, 0xc7, 0x04, 
+	0xcc, 0x6e, 0xf6, 0xd9, 0x8c, 0x7d, 0xb2, 0x41, 
+	0xaa, 0x3c, 0xfc, 0x98, 0x1f, 0xac, 0xe5, 0x88, 
+	0x90, 0x72, 0x76, 0x27, 0xbb, 0xb3, 0xb3, 0x83, 
+	0xfb, 0x81, 0x69, 0x43, 0x7b, 0x1f, 0xbe, 0xac, 
+	0xe5, 0xc3, 0xba, 0x38, 0xa8, 0x45, 0x22, 0x84, 
+	0x60, 0x41, 0x0c, 0x90, 0xbf, 0xcf, 0xbe, 0xff, 
+	0xb9, 0x4a, 0x2c, 0x16, 0x6b, 0x9e, 0xfe, 0x83, 
+	0xf3, 0x87, 0x9b, 0xf7, 0x3f, 0x91, 0x1d, 0x77, 
+	0x6f, 0xe8, 0xd5, 0xab, 0x97, 0xab, 0xbc, 0x7d, 
+	0xfb, 0xf6, 0xe5, 0xf7, 0x5f, 0xd7, 0x53, 0x8b, 
+	0xdc, 0xe3, 0x91, 0x95, 0x3d, 0x41, 0x0c, 0x7a, 
+	0xf5, 0xf5, 0x19, 0xfc, 0x07, 0x71, 0xd3, 0xf2, 
+	0x09, 0x36, 0xe8, 0xeb, 0xd7, 0xb5, 0x22, 0x3f, 
+	0x93, 0x18, 0x21, 0xcf, 0x55, 0xb0, 0xf9, 0x5f, 
+	0x64, 0xad, 0x0a, 0x98, 0x7f, 0x01, 0xd1, 0xa6, 
+	0xf1, 0xb9, 0x06, 0x2d, 0xe4, 0x68, 0x00, 0x00, 
+	0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 
+	0x60, 0x82, 
+};
+#endif
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index 185a169..e8f9ca6 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -10,6 +10,7 @@ SUBDIRS= \
 	libeffecttv \
 	1080to540 \
 	720to480 \
+	C41 \
 	aging \
 	bandslide \
 	bandwipe \
diff --git a/po/POTFILES.in b/po/POTFILES.in
index a1b9acc..2af441c 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -129,6 +129,7 @@ guicast/bctheme.C
 # guicast/test.C
 plugins/1080to540/1080to540.C
 plugins/720to480/720to480.C
+plugins/C41/c41.C
 plugins/aging/aging.C
 plugins/aging/agingwindow.C
 plugins/bandslide/bandslide.C


hooks/post-receive
-- 
CinelerraCV.git (CinelerraCV)

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CinelerraCV.git" (CinelerraCV).



More information about the cinelerra-commits mailing list