-/* === S I N F G =========================================================== */
+/* === S Y N F I G ========================================================= */
/*! \file trgt_bmp.cpp
** \brief Bitmap Target
**
-** $Id: trgt_bmp.cpp,v 1.1.1.1 2005/01/04 01:23:10 darco Exp $
+** $Id$
**
** \legal
-** Copyright (c) 2002 Robert B. Quattlebaum Jr.
+** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+** Copyright (c) 2007 Chris Moore
**
-** This software and associated documentation
-** are CONFIDENTIAL and PROPRIETARY property of
-** the above-mentioned copyright holder.
+** 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.
**
-** You may not copy, print, publish, or in any
-** other way distribute this software without
-** a prior written agreement with
-** the copyright holder.
+** 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.
** \endlegal
*/
/* ========================================================================= */
/* === H E A D E R S ======================================================= */
-#define SINFG_NO_ANGLE
+#define SYNFIG_NO_ANGLE
#ifdef USING_PCH
# include "pch.h"
#endif
#include "trgt_bmp.h"
-#include <sinfg/general.h>
+#include <synfig/general.h>
#include <cstdio>
#include <algorithm>
/* === U S I N G =========================================================== */
-using namespace sinfg;
+using namespace synfig;
using namespace std;
using namespace etl;
/* === I N F O ============================================================= */
-SINFG_TARGET_INIT(bmp);
-SINFG_TARGET_SET_NAME(bmp,"bmp");
-SINFG_TARGET_SET_EXT(bmp,"bmp");
-SINFG_TARGET_SET_VERSION(bmp,"0.1");
-SINFG_TARGET_SET_CVS_ID(bmp,"$Id: trgt_bmp.cpp,v 1.1.1.1 2005/01/04 01:23:10 darco Exp $");
+SYNFIG_TARGET_INIT(bmp);
+SYNFIG_TARGET_SET_NAME(bmp,"bmp");
+SYNFIG_TARGET_SET_EXT(bmp,"bmp");
+SYNFIG_TARGET_SET_VERSION(bmp,"0.1");
+SYNFIG_TARGET_SET_CVS_ID(bmp,"$Id$");
/* === C L A S S E S & S T R U C T S ======================================= */
multi_image=false;
buffer=0;
color_buffer=0;
+ set_remove_alpha();
+
}
bmp::~bmp()
bmp::set_rend_desc(RendDesc *given_desc)
{
pf=PF_BGR;
-
- // Flip the image upside down,
+
+ // Flip the image upside down,
// because bitmaps are upside down.
+ given_desc->set_flags(0);
Point tl=given_desc->get_tl();
Point br=given_desc->get_br();
Point::value_type tmp;
br[1]=tmp;
given_desc->set_tl(tl);
given_desc->set_br(br);
-
+
desc=*given_desc;
if(desc.get_frame_end()-desc.get_frame_start()>0)
{
else
multi_image=false;
- return true;
+ return true;
}
void
}
bool
-bmp::start_frame(sinfg::ProgressCallback *callback)
+bmp::start_frame(synfig::ProgressCallback *callback)
{
int w=desc.get_w(),h=desc.get_h();
-
+
rowspan=4*((w*(channels(pf)*8)+31)/32);
-
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;
- file=fopen(newfilename.c_str(),"wb");
+ String newfilename(filename_sans_extension(filename) +
+ etl::strprintf(".%04d",imagecount) +
+ filename_extension(filename));
+ file=fopen(newfilename.c_str(),POPEN_BINARY_WRITE_TYPE);
if(callback)callback->task(newfilename+_(" (animated)"));
}
else
{
- file=fopen(filename.c_str(),"wb");
+ file=fopen(filename.c_str(),POPEN_BINARY_WRITE_TYPE);
if(callback)callback->task(filename);
}
-
+
if(!file)
{
if(callback)callback->error(_("Unable to open file"));
- else sinfg::error(_("Unable to open file"));
+ else synfig::error(_("Unable to open file"));
return false;
}
-
+
BITMAPFILEHEADER fileheader;
BITMAPINFOHEADER infoheader;
-
+
fileheader.bfType[0]='B';
fileheader.bfType[1]='M';
fileheader.bfSize=little_endian(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+rowspan*h);
- fileheader.bfReserved1=0;
- fileheader.bfReserved2=0;
- fileheader.bfOffsetBits=little_endian(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)-2);
-
+ fileheader.bfReserved1=0;
+ fileheader.bfReserved2=0;
+ fileheader.bfOffsetBits=little_endian(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)-2);
+
infoheader.biSize=little_endian(40);
infoheader.biWidth=little_endian(w);
infoheader.biHeight=little_endian(h);
infoheader.biYPelsPerMeter=little_endian((int)rend_desc().get_y_res()); // pels per meter...?
infoheader.biClrUsed=little_endian(0);
infoheader.biClrImportant=little_endian(0);
-
+
fprintf(file,"BM");
-
+
if(!fwrite(&fileheader.bfSize,sizeof(BITMAPFILEHEADER)-4,1,file))
{
if(callback)callback->error(_("Unable to write file header to file"));
- else sinfg::error(_("Unable to write file header to file"));
+ else synfig::error(_("Unable to write file header to file"));
return false;
}
if(!fwrite(&infoheader,sizeof(BITMAPINFOHEADER),1,file))
{
if(callback)callback->error(_("Unable to write info header"));
- else sinfg::error(_("Unable to write info header"));
+ else synfig::error(_("Unable to write info header"));
return false;
}
delete [] buffer;
buffer=new unsigned char[rowspan];
-
+
delete [] color_buffer;
color_buffer=new Color[desc.get_w()];
}
Color *
-bmp::start_scanline(int scanline)
+bmp::start_scanline(int /*scanline*/)
{
return color_buffer;
}
{
if(!file)
return false;
-
+
convert_color_format(buffer, color_buffer, desc.get_w(), pf, gamma());
-
+
if(!fwrite(buffer,1,rowspan,file))
return false;