On Saturday 02 October 2004 17:27, Andraz Tori wrote:
> So... Cinelerra now has this plugin that enables to edit SVG pictures
> in sodipodi and then seamlessly use them in cinelerra as an overlay
> (implemented by plugin).
>
> Now, since it seems that sodipodi is gone sniffing the dasies, i am
> wondering is someone proficent enough in GTK coding to be willing to
> port the patch from sodipodi to inkscape?
>
> basically it adds a GUI button 'e' when started with special command
> line, uses a shift+cntrl+e keycombo for this button, and does the
> shared memory passtrough of the rendered picture to cinelerra...
>
> anyone new who would like to get to the dark side of the pushing
> cinelerra even further?
Better late than never, right? Here's the patch, ported to the latest SVN
build of Inkscape.
-Joe
diff -Pru inkscape-orig/src/Makefile_insert inkscape/src/Makefile_insert
--- inkscape-orig/src/Makefile_insert 2006-05-27 11:40:53.000000000 -0400
+++ inkscape/src/Makefile_insert 2006-05-27 11:43:49.000000000 -0400
@@ -42,6 +42,7 @@
attributes.cpp attributes.h \
bad-uri-exception.h \
brokenimage.xpm \
+ cinelerra.cpp cinelerra.h \
color-rgba.h \
color-profile.cpp color-profile.h \
color-profile-fns.h \
diff -Pru inkscape-orig/src/cinelerra.cpp inkscape/src/cinelerra.cpp
--- inkscape-orig/src/cinelerra.cpp 1969-12-31 19:00:00.000000000 -0500
+++ inkscape/src/cinelerra.cpp 2006-05-27 11:45:37.000000000 -0400
@@ -0,0 +1,258 @@
+#define __CINELERRA_C__
+
+/* All of the code added to Inkscape for integration with Cinelerra --
+ * minus the interface stuff etc. that has to go into Inkscape's main
+ * code. All of it is tagged with "CINELERRA". */
+
+#include <unistd.h>
+#include <sys/file.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#include "path-prefix.h"
+
+#include "inkscape.h"
+#include "gc-core.h"
+#include "sp-root.h"
+#include "file.h"
+#include "document.h"
+#include "sp-object.h"
+#include "unit-constants.h"
+#include "xml/repr.h"
+#include "color.h"
+#include "svg/svg-color.h"
+#include "svg/svg.h"
+#include "cinelerra.h"
+struct _Cinelerra Cinelerra;
+
+static gchar *sp_export_dpi = NULL;
+static gchar *sp_export_area = NULL;
+static gchar *sp_export_background = NULL;
+static gboolean sp_export_use_hints = FALSE;
+static gchar *sp_export_id = NULL;
+static gboolean sp_export_area_drawing = FALSE;
+static gboolean sp_export_id_only = FALSE;
+static gboolean sp_export_area_canvas = FALSE;
+static gboolean sp_export_area_snap = FALSE;
+static gchar *sp_export_background_opacity = NULL;
+static gchar *sp_export_height = NULL;
+static gchar *sp_export_width = NULL;
+
+
+void cin_export(GtkWidget *widget, GdkEvent *event, gpointer data)
+{
+ SPDocument *doc;
+ doc = SP_ACTIVE_DOCUMENT;
+ cin_do_export_raw(doc);
+ sp_file_save(NULL, NULL);
+}
+
+void
+cin_do_export_raw(SPDocument *doc)
+{
+ /* This entire section is the sp_do_export_png function found in
+ * main.cpp, which seems to be not for use globally. I made a few
+ * minor modifications to get rid of gcc warnings and extra
+ * pointers. */
+
+ gdouble dpi = 0.0;
+
+ if (sp_export_use_hints && (!sp_export_id && !sp_export_area_drawing)) {
+ g_warning ("--export-use-hints can only be used with --export-id or --export-area-drawing; ignored.");
+ }
+
+ GSList *items = NULL;
+
+ NRRect area;
+ if (sp_export_id || sp_export_area_drawing) {
+
+ SPObject *o = NULL;
+ SPObject *o_area = NULL;
+ if (sp_export_id && sp_export_area_drawing) {
+ o = doc->getObjectById(sp_export_id);
+ o_area = SP_DOCUMENT_ROOT (doc);
+ } else if (sp_export_id) {
+ o = doc->getObjectById(sp_export_id);
+ o_area = o;
+ } else if (sp_export_area_drawing) {
+ o = SP_DOCUMENT_ROOT (doc);
+ o_area = o;
+ }
+
+ if (o) {
+ if (!SP_IS_ITEM (o)) {
+ g_warning("Object with id=\"%s\" is not a visible item. Nothing exported.", sp_export_id);
+ return;
+ }
+
+ items = g_slist_prepend (items, SP_ITEM(o));
+
+ if (sp_export_id_only) {
+ g_print("Exporting only object with id=\"%s\"; all other objects hidden\n", sp_export_id);
+ }
+
+ if (sp_export_use_hints) {
+ // retrieve export dpi hints
+ const gchar *dpi_hint = SP_OBJECT_REPR(o)->attribute("inkscape:export-xdpi"); // only xdpi, ydpi is always the same now
+ if (dpi_hint) {
+ if (sp_export_dpi || sp_export_width || sp_export_height) {
+ g_warning ("Using bitmap dimensions from the command line (--export-dpi, --export-width, or --export-height). DPI hint %s is ignored.", dpi_hint);
+ } else {
+ dpi = atof(dpi_hint);
+ }
+ } else {
+ g_warning ("Export DPI hint not found for the object.");
+ }
+
+ }
+
+ // write object bbox to area
+ sp_document_ensure_up_to_date (doc);
+ sp_item_invoke_bbox((SPItem *) o_area, &area, sp_item_i2r_affine((SPItem *) o_area), TRUE);
+ } else {
+ g_warning("Object with id=\"%s\" was not found in the document. Nothing exported.", sp_export_id);
+ return;
+ }
+ }
+
+ if (sp_export_area) {
+ /* Try to parse area (given in SVG pixels) */
+ if (!sscanf(sp_export_area, "%lg:%lg:%lg:%lg", &area.x0, &area.y0, &area.x1, &area.y1) == 4) {
+ g_warning("Cannot parse export area '%s'; use 'x0:y0:x1:y1'. Nothing exported.", sp_export_area);
+ return;
+ }
+ if ((area.x0 >= area.x1) || (area.y0 >= area.y1)) {
+ g_warning("Export area '%s' has negative width or height. Nothing exported.", sp_export_area);
+ return;
+ }
+ } else if (sp_export_area_canvas || !(sp_export_id || sp_export_area_drawing)) {
+ /* Export the whole canvas */
+ sp_document_ensure_up_to_date (doc);
+ area.x0 = SP_ROOT(doc->root)->x.computed;
+ area.y0 = SP_ROOT(doc->root)->y.computed;
+ area.x1 = area.x0 + sp_document_width (doc);
+ area.y1 = area.y0 + sp_document_height (doc);
+ }
+
+ if (sp_export_dpi && dpi == 0.0) {
+ dpi = atof(sp_export_dpi);
+ if ((dpi < 0.1) || (dpi > 10000.0)) {
+ g_warning("DPI value %s out of range [0.1 - 10000.0]. Nothing exported.", sp_export_dpi);
+ return;
+ }
+ g_print("DPI: %g\n", dpi);
+ }
+
+ if (sp_export_area_snap) {
+ area.x0 = std::floor (area.x0);
+ area.y0 = std::floor (area.y0);
+ area.x1 = std::ceil (area.x1);
+ area.y1 = std::ceil (area.y1);
+ }
+
+ // default dpi
+ if (dpi == 0.0)
+ dpi = PX_PER_IN;
+
+ gint width = 0;
+ gint height = 0;
+
+ if (Cinelerra.width) {
+ width = atoi(Cinelerra.width);
+ if ((width < 16) || (width > 65536)) {
+ g_warning("Export width %d out of range (16 - 65536). Nothing exported.", width);
+ return;
+ }
+ dpi = (gdouble) width * PX_PER_IN / (area.x1 - area.x0);
+ }
+
+ if (Cinelerra.height) {
+ height = atoi(Cinelerra.height);
+ if ((height < 16) || (height > 65536)) {
+ g_warning("Export height %d out of range (16 - 65536). Nothing exported.", width);
+ return;
+ }
+ dpi = (gdouble) height * PX_PER_IN / (area.y1 - area.y0);
+ }
+
+ if (!Cinelerra.width) {
+ width = (gint) ((area.x1 - area.x0) * dpi / PX_PER_IN + 0.5);
+ }
+
+ if (!Cinelerra.height) {
+ height = (gint) ((area.y1 - area.y0) * dpi / PX_PER_IN + 0.5);
+ }
+
+ guint32 bgcolor = 0x00000000;
+ if (sp_export_background) {
+ // override the page color
+ bgcolor = sp_svg_read_color(sp_export_background, 0xffffff00);
+ bgcolor |= 0xff; // default is no opacity
+ } else {
+ // read from namedview
+ Inkscape::XML::Node *nv = sp_repr_lookup_name (doc->rroot, "sodipodi:namedview");
+ if (nv && nv->attribute("pagecolor"))
+ bgcolor = sp_svg_read_color(nv->attribute("pagecolor"), 0xffffff00);
+ if (nv && nv->attribute("inkscape:pageopacity"))
+ bgcolor |= SP_COLOR_F_TO_U(sp_repr_get_double_attribute (nv, "inkscape:pageopacity", 1.0));
+ }
+
+ if (sp_export_background_opacity) {
+ // override opacity
+ gfloat value;
+ if (sp_svg_number_read_f (sp_export_background_opacity, &value)) {
+ if (value > 1.0) {
+ value = CLAMP (value, 1.0f, 255.0f);
+ bgcolor &= (guint32) 0xffffff00;
+ bgcolor |= (guint32) floor(value);
+ } else {
+ value = CLAMP (value, 0.0f, 1.0f);
+ bgcolor &= (guint32) 0xffffff00;
+ bgcolor |= SP_COLOR_F_TO_U(value);
+ }
+ }
+ }
+
+ g_print("Background RRGGBBAA: %08x\n", bgcolor);
+
+ g_print("Area %g:%g:%g:%g exported to %d x %d pixels (%g dpi)\n", area.x0, area.y0, area.x1, area.y1, width, height, dpi);
+
+ if ((width >= 1) && (height >= 1) && (width < 65536) && (height < 65536)) {
+ // We lock the file so there is just one reader/writer at a time
+ gchar *filename_fifo;
+ int fh_raw;
+ int fh_fifo;
+ struct fifo_struct fifo_buf;
+
+// printf("Inkscape locking %s! \n", filename_lock);
+ fh_raw = open (Cinelerra.exportfile, O_CREAT|O_RDWR, S_IRUSR | S_IWUSR);
+ int res = lockf(fh_raw, F_LOCK, 0); // Blocking call - will wait for other inkscape or cinelerra
+// printf("Inkscape: filehandle: %i, res: %i, errno: %i\n", fh_raw, res, errno);
+ sp_export_raw_file (doc, fh_raw,
+ area.x0, area.y0, area.x1,
+ area.y1, width, height, bgcolor);
+ lockf(fh_raw, F_ULOCK, 0);
+ close(fh_raw);
+ printf("exporting finished\n");
+ filename_fifo = g_strconcat(Cinelerra.exportfile, ".fifo");
+ fh_fifo = open(filename_fifo, O_RDWR);
+// printf("Inkscape fifo %s! \n", filename_fifo);
+ // printf("Inkscape: filehandle: %i, res: %i, errno: %i\n", fh_fifo, res, errno);
+
+ fifo_buf.pid = getpid();
+ fifo_buf.action = 1; // update from client
+ write(fh_fifo, &fifo_buf, sizeof(fifo_buf));
+ close(fh_fifo);
+ g_free(filename_fifo);
+// printf("Inkscape unlocking!\n");
+ } else {
+ g_warning("Calculated bitmap dimensions %d %d are out of range (1 - 65535). Nothing exported.", width, height);
+ }
+
+ g_slist_free (items);
+}
+
diff -Pru inkscape-orig/src/cinelerra.h inkscape/src/cinelerra.h
--- inkscape-orig/src/cinelerra.h 1969-12-31 19:00:00.000000000 -0500
+++ inkscape/src/cinelerra.h 2006-05-27 11:45:38.000000000 -0400
@@ -0,0 +1,34 @@
+#ifndef SEEN_CINELERRA_H
+#define SEEN_CINELERRA_H
+
+struct _Cinelerra {
+ const gchar *exportfile;
+ const gchar *svgfile;
+ const gchar *width;
+ const gchar *height;
+};
+
+struct fifo_struct {
+ int pid;
+ int action; // 1 = update from client, 2 = client closes
+};
+
+struct raw_struct {
+ char rawc[5]; // Null terminated "RAWC" string
+ int32_t struct_version; // currently 1 (bumped at each destructive change)
+ int32_t struct_size; // size of this struct in bytes
+ int32_t width; // logical width of image
+ int32_t height;
+ int32_t pitch; // physical width of image in memory
+ int32_t color_model; // as BC_ constant, currently only BC_RGBA8888 is supported
+ int64_t time_of_creation; // in milliseconds - calculated as (tv_sec * 1000 + tv_usec / 1000);
+ // we can't trust date on the file, due to different reasons
+};
+
+#define BC_RGB888 9
+#define BC_RGBA8888 10
+
+void cin_export(GtkWidget *widget, GdkEvent *event, gpointer data);
+void cin_do_export_raw(SPDocument *doc);
+
+#endif
diff -Pru inkscape-orig/src/file.cpp inkscape/src/file.cpp
--- inkscape-orig/src/file.cpp 2006-05-27 11:40:53.000000000 -0400
+++ inkscape/src/file.cpp 2006-05-27 11:50:39.000000000 -0400
@@ -61,6 +61,17 @@
#include "inkscape.h"
#include "uri.h"
+/* CINELERRA */
+#include "cinelerra.h"
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include "macros.h"
+#include "forward.h"
+
#ifdef WITH_INKBOARD
#include "jabber_whiteboard/session-manager.h"
#endif
@@ -1230,6 +1241,117 @@
}
+/* CINELERRA */
+
+
+void
+sp_export_raw_file (SPDocument *doc, int fh_raw,
+ double x0, double y0, double x1, double y1,
+ unsigned int width, unsigned int height,
+ unsigned long bgcolor)
+{
+ NRMatrix affine;
+ gdouble t;
+ NRArena *arena;
+ struct SPEBP ebp;
+ unsigned int dkey;
+
+ g_return_if_fail (doc != NULL);
+ //g_return_if_fail (SP_IS_DOCUMENT (doc));
+ g_return_if_fail (fh_raw != -1);
+ g_return_if_fail (width >= 16);
+ g_return_if_fail (height >= 16);
+
+ sp_document_ensure_up_to_date (doc);
+
+ /* Go to document coordinates */
+ t = y0;
+ y0 = sp_document_height (doc) - y1;
+ y1 = sp_document_height (doc) - t;
+
+ /*
+ * 1) a[0] * x0 + a[2] * y1 + a[4] = 0.0
+ * 2) a[1] * x0 + a[3] * y1 + a[5] = 0.0
+ * 3) a[0] * x1 + a[2] * y1 + a[4] = width
+ * 4) a[1] * x0 + a[3] * y0 + a[5] = height
+ * 5) a[1] = 0.0;
+ * 6) a[2] = 0.0;
+ *
+ * (1,3) a[0] * x1 - a[0] * x0 = width
+ * a[0] = width / (x1 - x0)
+ * (2,4) a[3] * y0 - a[3] * y1 = height
+ * a[3] = height / (y0 - y1)
+ * (1) a[4] = -a[0] * x0
+ * (2) a[5] = -a[3] * y1
+ */
+
+ affine.c[0] = width / ((x1 - x0) * 1.25);
+ affine.c[1] = 0.0;
+ affine.c[2] = 0.0;
+ affine.c[3] = height / ((y1 - y0) * 1.25);
+ affine.c[4] = -affine.c[0] * x0 * 1.25;
+ affine.c[5] = -affine.c[3] * y0 * 1.25;
+
+ SP_PRINT_MATRIX ("SVG2PNG", &affine);
+
+ ebp.width = width;
+ ebp.height = height;
+ ebp.r = NR_RGBA32_R (bgcolor);
+ ebp.g = NR_RGBA32_G (bgcolor);
+ ebp.b = NR_RGBA32_B (bgcolor);
+ ebp.a = NR_RGBA32_A (bgcolor);
+
+ /* Create new arena */
+ arena = (NRArena *) nr_object_new (NR_TYPE_ARENA);
+ dkey = sp_item_display_key_new (1);
+ /* Create ArenaItem and set transform */
+ ebp.root = sp_item_invoke_show (SP_ITEM (sp_document_root (doc)), arena, dkey, SP_ITEM_SHOW_DISPLAY);
+ nr_arena_item_set_transform (ebp.root, &affine);
+ {
+ int len_raw;
+ void *buffer;
+ struct raw_struct *raw_data;
+ struct timeval current_time;
+
+ const unsigned char ** rows = nr_new (const unsigned char *, height);
+ ebp.sheight = height;
+ len_raw = 4 * height * width + sizeof(struct raw_struct);
+ ftruncate(fh_raw, len_raw);
+
+ buffer = mmap(NULL, len_raw, PROT_WRITE | PROT_READ, MAP_SHARED, fh_raw, 0);
+ raw_data = (struct raw_struct *) buffer;
+ strcpy(raw_data->rawc, "RAWC");
+ raw_data->struct_version = 1;
+ raw_data->struct_size = sizeof(struct raw_struct);
+ raw_data->width = width;
+ raw_data->height = height;
+ raw_data->pitch = width; // width == pitch currently
+ raw_data->color_model = BC_RGBA8888;
+
+// we use a trick of writing directly to shared memory
+// ebp.px = nr_new (unsigned char, 4 * height * width);
+ ebp.px = (guchar *)((unsigned int)buffer + sizeof(struct raw_struct));
+ sp_export_get_rows(rows, 0, height, &ebp);
+
+ // update time_of_creation after export
+ gettimeofday(¤t_time, 0);
+ raw_data->time_of_creation = (int64_t)current_time.tv_sec * 1000 + (int64_t)current_time.tv_usec / 1000;
+
+
+ munmap (buffer, len_raw);
+ nr_free(rows);
+// nr_free (ebp.px);
+
+ }
+
+
+ /* Free Arena and ArenaItem */
+ sp_item_invoke_hide (SP_ITEM (sp_document_root (doc)), dkey);
+ nr_arena_item_unref (ebp.root);
+ nr_object_unref ((NRObject *) arena);
+}
+
+
void Inkscape::IO::fixupHrefs( SPDocument *doc, const gchar *base, gboolean spns )
{
//g_message("Inkscape::IO::fixupHrefs( , [%s], )", base );
diff -Pru inkscape-orig/src/file.h inkscape/src/file.h
--- inkscape-orig/src/file.h 2006-05-27 11:40:53.000000000 -0400
+++ inkscape/src/file.h 2006-05-27 13:42:37.000000000 -0400
@@ -166,6 +166,11 @@
*/
void sp_file_vacuum ();
+/* CINELERRA */
+void sp_export_raw_file (SPDocument *doc, int fh_raw,
+ double x0, double y0, double x1, double y1,
+ unsigned int width, unsigned int height,
+ unsigned long bgcolor);
namespace Inkscape {
namespace IO {
diff -Pru inkscape-orig/src/main.cpp inkscape/src/main.cpp
--- inkscape-orig/src/main.cpp 2006-05-27 11:40:53.000000000 -0400
+++ inkscape/src/main.cpp 2006-05-27 11:43:49.000000000 -0400
@@ -102,6 +102,8 @@
#include <glibmm/i18n.h>
#include <gtkmm/main.h>
+#include "cinelerra.h"
+
#ifndef HAVE_BIND_TEXTDOMAIN_CODESET
#define bind_textdomain_codeset(p,c)
#endif
@@ -142,9 +144,13 @@
SP_ARG_VERSION,
SP_ARG_NEW_GUI,
SP_ARG_VACUUM_DEFS,
- SP_ARG_LAST
+ SP_ARG_LAST,
+ CIN_ARG_EXPORT_FILE // CINELERRA export file
};
+/* CINELERRA */
+extern struct _Cinelerra Cinelerra;
+
int sp_main_gui(int argc, char const **argv);
int sp_main_console(int argc, char const **argv);
static void sp_do_export_png(SPDocument *doc);
@@ -355,7 +361,9 @@
POPT_ARG_NONE, &sp_vacuum_defs, SP_ARG_VACUUM_DEFS,
N_("Remove unused definitions from the defs section(s) of the document"),
NULL},
-
+ /* CINELERRA cmd line addition */
+ {"cinelerra-export-file", 0, POPT_ARG_STRING, &Cinelerra.exportfile,
+ CIN_ARG_EXPORT_FILE, N_("Cinelerra export file"), NULL},
POPT_AUTOHELP POPT_TABLEEND
};
@@ -452,7 +460,10 @@
/* main_console handles any exports -- not the gui */
use_gui = FALSE;
break;
- } else if (!strcmp(argv[i], "-g") || !strcmp(argv[i], "--with-gui")) {
+ } else if (!strcmp(argv[i], "-g") ||
+ !strcmp(argv[i], "--with-gui") ||
+ // CINELERRA uses gui
+ !strncmp(argv[i], "--cinelerra-export-file", 23)) {
use_gui = TRUE;
break;
} else if (!strcmp(argv[i], "-G") || !strcmp(argv[i], "--new-gui")) {
@@ -698,6 +709,9 @@
if (sp_export_png || sp_export_id || sp_export_area_drawing) {
sp_do_export_png(doc);
}
+ if (Cinelerra.exportfile) {
+ cin_do_export_raw(doc);
+ }
if (sp_export_svg) {
Inkscape::XML::Document *rdoc;
Inkscape::XML::Node *repr;
@@ -1303,10 +1317,11 @@
GSList *fl = NULL;
gint a;
+ gchar const *fn;
while ((a = poptGetNextOpt(ctx)) >= 0) {
switch (a) {
case SP_ARG_FILE: {
- gchar const *fn = poptGetOptArg(ctx);
+ fn = poptGetOptArg(ctx);
if (fn != NULL) {
fl = g_slist_append(fl, g_strdup(fn));
}
@@ -1322,6 +1337,30 @@
exit(0);
break;
}
+/* CINELERRA addition for args */
+ case CIN_ARG_EXPORT_FILE:
+ fn = poptGetOptArg (ctx);
+ if(fn != NULL && strlen(fn) > 0) {
+ gchar *tmp;
+ tmp = (gchar *) g_malloc(strlen(fn) + 5);
+ Cinelerra.exportfile = fn;
+ sprintf(tmp, "%s.svg", fn);
+ Cinelerra.svgfile = tmp;
+ } else {
+ g_error("--cinelerra-export-file found, but no filename!");
+ }
+ break;
+ case SP_ARG_EXPORT_WIDTH:
+ fn = poptGetOptArg(ctx);
+ if(fn != NULL)
+ Cinelerra.width = fn;
+ break;
+ case SP_ARG_EXPORT_HEIGHT:
+ fn = poptGetOptArg(ctx);
+ if(fn != NULL)
+ Cinelerra.height = fn;
+ break;
+/* END CINELERRA addition for args */
default: {
break;
}
diff -Pru inkscape-orig/src/verbs.cpp inkscape/src/verbs.cpp
--- inkscape-orig/src/verbs.cpp 2006-05-27 11:40:53.000000000 -0400
+++ inkscape/src/verbs.cpp 2006-05-27 11:43:49.000000000 -0400
@@ -78,7 +78,9 @@
#include "sp-flowtext.h"
#include "layer-fns.h"
#include "node-context.h"
-
+/* CINELERRA */
+#include "cinelerra.h"
+extern struct _Cinelerra Cinelerra;
/**
* \brief Return the name without underscores and ellipsis, for use in dialog
@@ -352,6 +354,24 @@
{ }
}; //TextVerb : public Verb
+/* CINELERRA */
+class CinelerraVerb : public Verb {
+private:
+ static void perform(SPAction *action, void *mydata, void *otherdata);
+ static SPActionEventVector vector;
+protected:
+ virtual SPAction *make_action(Inkscape::UI::View::View *view);
+public:
+ /** \brief Use the Verb initializer with the same parameters. */
+ CinelerraVerb(unsigned int const code,
+ gchar const *id,
+ gchar const *name,
+ gchar const *tip,
+ gchar const *image) :
+ Verb(code, id, name, tip, image)
+ { }
+}; /* CinelerraVerb class */
+
Verb::VerbTable Verb::_verbs;
Verb::VerbIDTable Verb::_verb_ids;
@@ -539,6 +559,14 @@
return make_action_helper(view, &vector);
}
+/* CINELERRA */
+SPAction *
+CinelerraVerb::make_action(Inkscape::UI::View::View *view)
+{
+ return make_action_helper(view, &vector);
+}
+
+
/** \brief A quick little convience function to make building actions
a little bit easier.
\param view Which view the action should be created for.
@@ -1756,6 +1784,18 @@
}
} // end of sp_verb_action_tutorial_perform()
+/* CINELERRA */
+void
+CinelerraVerb::perform(SPAction *action, void *data, void *pdata)
+{
+ switch((int) data) {
+ case SP_VERB_CINELERRA_EXPORT:
+ cin_export(NULL, NULL, NULL);
+ break;
+ default:
+ break;
+ }
+}
/**
* Action vector to define functions called if a staticly defined file verb
@@ -1835,6 +1875,10 @@
{{NULL},TextVerb::perform, NULL, NULL, NULL};
+/* CINELERRA */
+SPActionEventVector CinelerraVerb::vector =
+ {{NULL},CinelerraVerb::perform, NULL, NULL, NULL};
+
/* *********** Effect Last ********** */
/** \brief A class to represent the last effect issued */
@@ -2411,6 +2455,9 @@
N_("Fit the canvas to the drawing"), NULL),
new FitCanvasVerb(SP_VERB_FIT_CANVAS_TO_SELECTION_OR_DRAWING, "FitCanvasToSelectionOrDrawing", N_("Fit Canvas to Selection or Drawing"),
N_("Fit the canvas to the current selection or the drawing if there is no selection"), NULL),
+ /* CINELERRA */
+ new CinelerraVerb(SP_VERB_CINELERRA_EXPORT, "Cinelerra Export",
+ N_("Cinelerra Export"), N_("Cinelerra Export"), NULL),
/* Footer */
new Verb(SP_VERB_LAST, " '\"invalid id", NULL, NULL, NULL)
};
diff -Pru inkscape-orig/src/verbs.h inkscape/src/verbs.h
--- inkscape-orig/src/verbs.h 2006-05-27 11:40:53.000000000 -0400
+++ inkscape/src/verbs.h 2006-05-27 11:43:49.000000000 -0400
@@ -229,6 +229,8 @@
SP_VERB_FIT_CANVAS_TO_SELECTION,
SP_VERB_FIT_CANVAS_TO_DRAWING,
SP_VERB_FIT_CANVAS_TO_SELECTION_OR_DRAWING,
+ /* CINELERRA */
+ SP_VERB_CINELERRA_EXPORT,
/* Footer */
SP_VERB_LAST
};
diff -Pru inkscape-orig/src/widgets/desktop-widget.cpp inkscape/src/widgets/desktop-widget.cpp
--- inkscape-orig/src/widgets/desktop-widget.cpp 2006-05-27 11:40:53.000000000 -0400
+++ inkscape/src/widgets/desktop-widget.cpp 2006-05-27 11:43:49.000000000 -0400
@@ -47,6 +47,9 @@
#include "sp-item.h"
#include "dialogs/swatches.h"
#include "conn-avoid-ref.h"
+/* CINELERRA */
+#include "cinelerra.h"
+extern struct _Cinelerra Cinelerra;
#ifdef WITH_INKBOARD
#endif
@@ -247,6 +250,16 @@
gtk_box_pack_start (GTK_BOX (dtw->vscrollbar_box), dtw->vscrollbar, TRUE, TRUE, 0);
gtk_table_attach (GTK_TABLE (tbl), dtw->vscrollbar_box, 2, 3, 0, 2, (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), 0, 0);
+ /* CINELERRA export button */
+ if (Cinelerra.exportfile != NULL)
+ {
+ dtw->exbtn = gtk_button_new_with_label("E");
+ gtk_table_attach(GTK_TABLE(tbl), dtw->exbtn, 2, 3, 2, 3, GTK_FILL,
+ GTK_FILL, 0, 0);
+ g_signal_connect (G_OBJECT (dtw->exbtn), "button_release_event",
+ G_CALLBACK (cin_export), dtw);
+ }
+
/* Canvas */
dtw->canvas = SP_CANVAS (sp_canvas_new_aa ());
GTK_WIDGET_SET_FLAGS (GTK_WIDGET (dtw->canvas), GTK_CAN_FOCUS);
diff -Pru inkscape-orig/src/widgets/desktop-widget.h inkscape/src/widgets/desktop-widget.h
--- inkscape-orig/src/widgets/desktop-widget.h 2006-05-27 11:40:53.000000000 -0400
+++ inkscape/src/widgets/desktop-widget.h 2006-05-27 11:43:49.000000000 -0400
@@ -67,6 +67,9 @@
GtkWidget *menubar, *statusbar;
GtkWidget *panels;
+
+ /* CINELERRA export button */
+ GtkWidget *exbtn;
GtkWidget *hscrollbar, *vscrollbar, *vscrollbar_box;