X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fmodules%2Fmod_imagemagick%2Ftrgt_imagemagick.cpp;h=32dd839f4647235b66c0bf51a22cdac43d1b46a4;hb=9459638ad6797b8139f1e9f0715c96076dbf0890;hp=f33b98f070d26b29ab1d3d7e86994a15c80ad7da;hpb=991d45b68d8b19c075e5b16bb63b6b8898090341;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 f33b98f..32dd839 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 @@ -65,7 +66,7 @@ using namespace etl; #if defined(HAVE_FORK) && defined(HAVE_PIPE) && defined(HAVE_WAITPID) #define UNIX_PIPE_TO_PROCESSES -#elif defined(HAVE__SPAWNLP) && defined(HAVE__PIPE) && defined(HAVE_CWAIT) +#else #define WIN32_PIPE_TO_PROCESSES #endif @@ -92,11 +93,11 @@ imagemagick_trgt::imagemagick_trgt(const char *Filename) imagemagick_trgt::~imagemagick_trgt() { if(file){ - fclose(file); - int status; #if defined(WIN32_PIPE_TO_PROCESSES) - cwait(&status,pid,0); + pclose(file); #elif defined(UNIX_PIPE_TO_PROCESSES) + fclose(file); + int status; waitpid(pid,&status,0); #endif } @@ -138,11 +139,11 @@ imagemagick_trgt::end_frame() { fputc(0,file); fflush(file); - fclose(file); - int status; #if defined(WIN32_PIPE_TO_PROCESSES) - cwait(&status,pid,0); + pclose(file); #elif defined(UNIX_PIPE_TO_PROCESSES) + fclose(file); + int status; waitpid(pid,&status,0); #endif } @@ -166,87 +167,35 @@ imagemagick_trgt::start_frame(synfig::ProgressCallback *cb) #if defined(WIN32_PIPE_TO_PROCESSES) - int p[2]; - int stdin_fileno, stdout_fileno; - - if(_pipe(p, 512, O_BINARY | O_NOINHERIT) < 0) { - if(cb) cb->error(N_(msg)); - else synfig::error(N_(msg)); - return false; - } - - // Save stdin/stdout so we can restore them later - stdin_fileno = _dup(_fileno(stdin)); - stdout_fileno = _dup(_fileno(stdout)); - - // convert should read from the pipe - if(_dup2(p[0], _fileno(stdin)) != 0) { - if(cb) cb->error(N_(msg)); - else synfig::error(N_(msg)); - return false; - } - - /* - convert accepts the output filename on the command-line - if(_dup2(_fileno(output), _fileno(stdout)) != 0) { - if(cb) cb->error(N_(msg)); - else synfig::error(N_(msg)); - return false; - } - */ - - pid = _spawnlp(_P_NOWAIT, "convert", "convert", - "-depth", "8", - "-size", strprintf("%dx%d", desc.get_w(), desc.get_h()).c_str(), - ((channels(pf) == 4) ? "rgba:-[0]" : "rgb:-[0]"), - "-density", strprintf("%dx%d", round_to_int(desc.get_x_res()/39.3700787402), round_to_int(desc.get_y_res()/39.3700787402)).c_str(), - newfilename.c_str(), - (const char *)NULL); + string command; - if( pid < 0) { - if(cb) cb->error(N_(msg)); - else synfig::error(N_(msg)); - return false; - } - - // Restore stdin/stdout - if(_dup2(stdin_fileno, _fileno(stdin)) != 0) { - if(cb) cb->error(N_(msg)); - else synfig::error(N_(msg)); - return false; - } - if(_dup2(stdout_fileno, _fileno(stdout)) != 0) { - if(cb) cb->error(N_(msg)); - else synfig::error(N_(msg)); - return false; - } - close(stdin_fileno); - close(stdout_fileno); + 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()); - // Close the pipe read end - convert uses it - close(p[0]); - - // We write data to the write end of the pipe - file = fdopen(p[1], "wb"); + file=popen(command.c_str(),POPEN_BINARY_WRITE_TYPE); #elif defined(UNIX_PIPE_TO_PROCESSES) int p[2]; - + if (pipe(p)) { if(cb) cb->error(N_(msg)); else synfig::error(N_(msg)); return false; }; - + pid = fork(); - + if (pid == -1) { if(cb) cb->error(N_(msg)); else synfig::error(N_(msg)); return false; } - + if (pid == 0){ // Child process // Close pipeout, not needed