X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftags%2Fsynfig_0_61_05%2Fsynfig-core%2Fsrc%2Fmodules%2Fmod_openexr%2Ftrgt_openexr.cpp;fp=synfig-core%2Ftags%2Fsynfig_0_61_05%2Fsynfig-core%2Fsrc%2Fmodules%2Fmod_openexr%2Ftrgt_openexr.cpp;h=7b4bb04132a74ab6b16d958a064fd5c332eb82b3;hb=299aecad571ca490ce017004a0d7e555d6df0520;hp=0000000000000000000000000000000000000000;hpb=42861dc634bef4059ca95e5292033315a0b9ce30;p=synfig.git diff --git a/synfig-core/tags/synfig_0_61_05/synfig-core/src/modules/mod_openexr/trgt_openexr.cpp b/synfig-core/tags/synfig_0_61_05/synfig-core/src/modules/mod_openexr/trgt_openexr.cpp new file mode 100644 index 0000000..7b4bb04 --- /dev/null +++ b/synfig-core/tags/synfig_0_61_05/synfig-core/src/modules/mod_openexr/trgt_openexr.cpp @@ -0,0 +1,191 @@ +/*! ======================================================================== +** Synfig +** exr_trgt Target Module +** $Id: trgt_openexr.cpp,v 1.1.1.1 2005/01/04 01:23:14 darco Exp $ +** +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** +** This package 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 package 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. +** +** === N O T E S =========================================================== +** +** ========================================================================= */ + +/* === H E A D E R S ======================================================= */ + +#define SYNFIG_TARGET + +#ifdef USING_PCH +# include "pch.h" +#else +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "trgt_openexr.h" +#include +#include +#include +#include +#include +#endif + +/* === M A C R O S ========================================================= */ + +using namespace synfig; +using namespace std; +using namespace etl; + +/* === G L O B A L S ======================================================= */ + +SYNFIG_TARGET_INIT(exr_trgt); +SYNFIG_TARGET_SET_NAME(exr_trgt,"exr_trgt"); +SYNFIG_TARGET_SET_EXT(exr_trgt,"exr"); +SYNFIG_TARGET_SET_VERSION(exr_trgt,"1.0.4"); +SYNFIG_TARGET_SET_CVS_ID(exr_trgt,"$Id: trgt_openexr.cpp,v 1.1.1.1 2005/01/04 01:23:14 darco Exp $"); + +/* === M E T H O D S ======================================================= */ + +bool +exr_trgt::ready() +{ + return (bool)exr_file; +} + +exr_trgt::exr_trgt(const char *Filename): + multi_image(false), + imagecount(0), + filename(Filename), + exr_file(0) +{ + buffer=0; +#ifndef USE_HALF_TYPE + buffer_color=0; +#endif + + // OpenEXR uses linear gamma + gamma().set_gamma(1.0); +} + +exr_trgt::~exr_trgt() +{ + if(exr_file) + delete exr_file; + + if(buffer) delete [] buffer; +#ifndef USE_HALF_TYPE + if(buffer_color) delete [] buffer_color; +#endif +} + +bool +exr_trgt::set_rend_desc(RendDesc *given_desc) +{ + //given_desc->set_pixel_format(PixelFormat((int)PF_RAW_COLOR)); + desc=*given_desc; + imagecount=desc.get_frame_start(); + if(desc.get_frame_end()-desc.get_frame_start()>0) + multi_image=true; + else + multi_image=false; + return true; +} + +bool +exr_trgt::start_frame(synfig::ProgressCallback *cb) +{ + int w=desc.get_w(),h=desc.get_h(); + + String frame_name; + + if(exr_file) + delete exr_file; + if(multi_image) + { + String + newfilename(filename), + ext(find(filename.begin(),filename.end(),'.'),filename.end()); + newfilename.erase(find(newfilename.begin(),newfilename.end(),'.'),newfilename.end()); + + newfilename+=etl::strprintf("%04d",imagecount)+ext; + frame_name=newfilename; + if(cb)cb->task(newfilename); + } + else + { + frame_name=filename; + if(cb)cb->task(filename); + } + exr_file=new Imf::RgbaOutputFile(frame_name.c_str(),w,h,Imf::WRITE_RGBA,desc.get_pixel_aspect()); +#ifndef USE_HALF_TYPE + if(buffer_color) delete [] buffer_color; + buffer_color=new Color[w]; +#endif + //if(buffer) delete [] buffer; + //buffer=new Imf::Rgba[w]; + out_surface.set_wh(w,h); + + return true; +} + +void +exr_trgt::end_frame() +{ + if(exr_file) + { + exr_file->setFrameBuffer(out_surface[0],1,desc.get_w()); + exr_file->writePixels(desc.get_h()); + + delete exr_file; + } + + exr_file=0; + + imagecount++; +} + +Color * +exr_trgt::start_scanline(int i) +{ + scanline=i; +#ifndef USE_HALF_TYPE + return reinterpret_cast(buffer_color); +#else + return reinterpret_cast(out_surface[scanline]); +// return reinterpret_cast(buffer); +#endif +} + +bool +exr_trgt::end_scanline() +{ + if(!ready()) + return false; + +#ifndef USE_HALF_TYPE + int i; + for(i=0;isetFrameBuffer(buffer,1,desc.get_w()); + //exr_file->writePixels(1); + + return true; +}