X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fmodules%2Fmod_imagemagick%2Ftrgt_imagemagick.cpp;h=0dedcc1eb003b1597b8fcbb402b17ec26b7cecdc;hb=334e15ce6c4d9b1f30a168a55e7ef4d31320d568;hp=bfd8f5975c1a82eaf8bade9279adcb4415a5dce7;hpb=e3bde2b95fdc0fe05d1fe855667058dc4f6a4e6d;p=synfig.git diff --git a/synfig-core/trunk/src/modules/mod_imagemagick/trgt_imagemagick.cpp b/synfig-core/trunk/src/modules/mod_imagemagick/trgt_imagemagick.cpp index bfd8f59..0dedcc1 100644 --- a/synfig-core/trunk/src/modules/mod_imagemagick/trgt_imagemagick.cpp +++ b/synfig-core/trunk/src/modules/mod_imagemagick/trgt_imagemagick.cpp @@ -6,6 +6,7 @@ ** $Id$ ** ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2007 Chris Moore ** ** This package is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License as @@ -37,7 +38,18 @@ #include "trgt_imagemagick.h" #include #include -#include +#if HAVE_SYS_WAIT_H + #include +#endif +#if HAVE_IO_H + #include +#endif +#if HAVE_PROCESS_H + #include +#endif +#if HAVE_FCNTL_H + #include +#endif #include #include #include @@ -52,6 +64,12 @@ using namespace synfig; using namespace std; using namespace etl; +#if defined(HAVE_FORK) && defined(HAVE_PIPE) && defined(HAVE_WAITPID) + #define UNIX_PIPE_TO_PROCESSES +#else + #define WIN32_PIPE_TO_PROCESSES +#endif + /* === G L O B A L S ======================================================= */ SYNFIG_TARGET_INIT(imagemagick_trgt); @@ -75,9 +93,13 @@ imagemagick_trgt::imagemagick_trgt(const char *Filename) imagemagick_trgt::~imagemagick_trgt() { if(file){ +#if defined(WIN32_PIPE_TO_PROCESSES) + pclose(file); +#elif defined(UNIX_PIPE_TO_PROCESSES) fclose(file); int status; waitpid(pid,&status,0); +#endif } file=NULL; delete [] buffer; @@ -117,9 +139,13 @@ imagemagick_trgt::end_frame() { fputc(0,file); fflush(file); +#if defined(WIN32_PIPE_TO_PROCESSES) + pclose(file); +#elif defined(UNIX_PIPE_TO_PROCESSES) fclose(file); int status; waitpid(pid,&status,0); +#endif } file=NULL; imagecount++; @@ -139,6 +165,21 @@ imagemagick_trgt::start_frame(synfig::ProgressCallback *cb) else newfilename = filename; +#if defined(WIN32_PIPE_TO_PROCESSES) + + string command; + + command=strprintf("convert -depth 8 -size %dx%d rgb%s:-[0] -density %dx%d \"%s\"\n", + desc.get_w(), desc.get_h(), // size + ((channels(pf) == 4) ? "a" : ""), // rgba or rgb? + round_to_int(desc.get_x_res()/39.3700787402), // density + round_to_int(desc.get_y_res()/39.3700787402), + newfilename.c_str()); + + file=popen(command.c_str(),POPEN_BINARY_WRITE_TYPE); + +#elif defined(UNIX_PIPE_TO_PROCESSES) + int p[2]; if (pipe(p)) { @@ -186,6 +227,10 @@ imagemagick_trgt::start_frame(synfig::ProgressCallback *cb) file = fdopen(p[1], "wb"); } +#else + #error There are no known APIs for creating child processes +#endif + if(!file) { if(cb)cb->error(N_(msg));