/*! \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-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
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: trgt_bmp.cpp,v 1.1.1.1 2005/01/04 01:23:10 darco Exp $");
+SYNFIG_TARGET_SET_CVS_ID(bmp,"$Id$");
/* === C L A S S E S & S T R U C T S ======================================= */
+namespace synfig {
struct BITMAPFILEHEADER
{
unsigned long biClrImportant;
};
+}
/* === M E T H O D S ======================================================= */
#ifdef WORDS_BIGENDIAN
bmp::set_rend_desc(RendDesc *given_desc)
{
pf=PF_BGR;
-
+
// Flip the image upside down,
// because bitmaps are upside down.
given_desc->set_flags(0);
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;
}
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 synfig::error(_("Unable to open file"));
return false;
}
-
- BITMAPFILEHEADER fileheader;
- BITMAPINFOHEADER infoheader;
-
+
+ synfig::BITMAPFILEHEADER fileheader;
+ synfig::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.bfSize=little_endian(sizeof(synfig::BITMAPFILEHEADER)+sizeof(synfig::BITMAPINFOHEADER)+rowspan*h);
+ fileheader.bfReserved1=0;
+ fileheader.bfReserved2=0;
+ fileheader.bfOffsetBits=little_endian(sizeof(synfig::BITMAPFILEHEADER)+sizeof(synfig::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(!fwrite(&fileheader.bfSize,sizeof(synfig::BITMAPFILEHEADER)-4,1,file))
{
if(callback)callback->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(!fwrite(&infoheader,sizeof(synfig::BITMAPINFOHEADER),1,file))
{
if(callback)callback->error(_("Unable to write info header"));
else synfig::error(_("Unable to write info header"));
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;