Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Mein <mein@cs.umn.edu>2004-01-10 01:04:08 +0300
committerKent Mein <mein@cs.umn.edu>2004-01-10 01:04:08 +0300
commite3080c9580cc47c0329a62618a7b178d9da42ccb (patch)
tree4a3f7790335fd6e76e762a0584f0c240ab770795
parentb430cd167f6d0694783bf76adc8cd7852c75ae11 (diff)
Added support for outputting bmp's
The padding is slightly messed up, so it produces somewhat trunkcated images however it works. I'll try and fix it later but I have to go home now. Its atleast usable at this stage. I moved bmp_decode.c to bmp.c and cleaned it up a little bit. Kent
-rw-r--r--projectfiles/blender/imbuf/BL_imbuf.dsp2
-rw-r--r--source/blender/imbuf/SConscript2
-rw-r--r--source/blender/imbuf/intern/IMB_bmp.h1
-rw-r--r--source/blender/imbuf/intern/bmp.c (renamed from source/blender/imbuf/intern/bmp_decode.c)118
-rw-r--r--source/blender/imbuf/intern/writeimage.c8
-rw-r--r--source/blender/imbuf/readme.txt17
-rw-r--r--source/blender/makesdna/DNA_scene_types.h3
-rw-r--r--source/blender/src/buttons_scene.c3
-rw-r--r--source/blender/src/toets.c5
-rw-r--r--source/blender/src/writeimage.c3
10 files changed, 126 insertions, 36 deletions
diff --git a/projectfiles/blender/imbuf/BL_imbuf.dsp b/projectfiles/blender/imbuf/BL_imbuf.dsp
index 34ec90e4a8a..510d1fdc924 100644
--- a/projectfiles/blender/imbuf/BL_imbuf.dsp
+++ b/projectfiles/blender/imbuf/BL_imbuf.dsp
@@ -163,7 +163,7 @@ SOURCE=..\..\..\source\blender\imbuf\intern\bitplanes.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\source\blender\imbuf\intern\bmp_decode.c
+SOURCE=..\..\..\source\blender\imbuf\intern\bmp.c
# End Source File
# Begin Source File
diff --git a/source/blender/imbuf/SConscript b/source/blender/imbuf/SConscript
index 7461a89b709..52a1795d666 100644
--- a/source/blender/imbuf/SConscript
+++ b/source/blender/imbuf/SConscript
@@ -15,7 +15,7 @@ source_files = ['intern/allocimbuf.c',
'intern/anim5.c',
'intern/antialias.c',
'intern/bitplanes.c',
- 'intern/bmp_decode.c',
+ 'intern/bmp.c',
'intern/cmap.c',
'intern/cspace.c',
'intern/data.c',
diff --git a/source/blender/imbuf/intern/IMB_bmp.h b/source/blender/imbuf/intern/IMB_bmp.h
index fe279849bd0..b0fde577b00 100644
--- a/source/blender/imbuf/intern/IMB_bmp.h
+++ b/source/blender/imbuf/intern/IMB_bmp.h
@@ -44,6 +44,7 @@ struct ImBuf;
int imb_is_a_bmp(void *buf);
struct ImBuf *imb_bmp_decode(unsigned char *mem, int size, int flags);
+int bmp_savebmp(struct ImBuf *ibuf, int file, int flags);
#endif
diff --git a/source/blender/imbuf/intern/bmp_decode.c b/source/blender/imbuf/intern/bmp.c
index 79a249c6b81..cb8a1e22711 100644
--- a/source/blender/imbuf/intern/bmp_decode.c
+++ b/source/blender/imbuf/intern/bmp.c
@@ -48,43 +48,33 @@
#include <config.h>
#endif
-// some code copied from article on microsoft.com, copied
-// here for enhanced BMP support in the future
-// http://www.microsoft.com/msj/defaultframe.asp?page=/msj/0197/mfcp1/mfcp1.htm&nav=/msj/0197/newnav.htm
-
-/*
-LPBYTE CDib::GetBits()
- {
- return (LPBYTE)m_pbmih + // start of bitmap +
- m_pbmih->biSize + // size of header +
- GetNumPaletteColors() // (num colors *
- *sizeof(RGBQUAD); // size each entry)
- }
-
-UINT CDib::GetNumPaletteColors()
- {
- UINT nColors=m_pbmih->biClrUsed;
- if (nColors==0 && m_pbmih->biBitCount<=8)
- nColors = 1<<m_pbmih->biBitCount;
- return nColors;
- }
-
+/* some code copied from article on microsoft.com, copied
+ here for enhanced BMP support in the future
+ http://www.microsoft.com/msj/defaultframe.asp?page=/msj/0197/mfcp1/mfcp1.htm&nav=/msj/0197/newnav.htm
*/
typedef struct BMPINFOHEADER{
unsigned int biSize;
- int biWidth;
- int biHeight;
+ unsigned int biWidth;
+ unsigned int biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned int biCompression;
unsigned int biSizeImage;
- int biXPelsPerMeter;
- int biYPelsPerMeter;
+ unsigned int biXPelsPerMeter;
+ unsigned int biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant;
} BMPINFOHEADER;
+typedef struct BMPHEADER {
+ unsigned short biType;
+ unsigned int biSize;
+ unsigned short biRes1;
+ unsigned short biRes2;
+ unsigned int biOffBits;
+} BMPHEADER;
+
#define BMP_FILEHEADER_SIZE 14
static int checkbmp(unsigned char *mem)
@@ -95,15 +85,16 @@ static int checkbmp(unsigned char *mem)
if (mem) {
if ((mem[0] == 'B') && (mem[1] == 'M')) {
- // skip fileheader
+ /* skip fileheader */
mem += BMP_FILEHEADER_SIZE;
+ } else {
}
- // for systems where an int needs to be 4 bytes aligned
+ /* for systems where an int needs to be 4 bytes aligned */
memcpy(&bmi, mem, sizeof(bmi));
u = LITTLE_LONG(bmi.biSize);
- // we only support uncompressed 24 or 32 bits images for now
+ /* we only support uncompressed 24 or 32 bits images for now */
if (u >= sizeof(BMPINFOHEADER)) {
if ((bmi.biCompression == 0) && (bmi.biClrUsed == 0)) {
u = LITTLE_SHORT(bmi.biBitCount);
@@ -133,11 +124,11 @@ struct ImBuf *imb_bmp_decode(unsigned char *mem, int size, int flags)
if (checkbmp(mem) == 0) return(0);
if ((mem[0] == 'B') && (mem[1] == 'M')) {
- // skip fileheader
+ /* skip fileheader */
mem += BMP_FILEHEADER_SIZE;
}
- // for systems where an int needs to be 4 bytes aligned
+ /* for systems where an int needs to be 4 bytes aligned */
memcpy(&bmi, mem, sizeof(bmi));
skip = LITTLE_LONG(bmi.biSize);
@@ -145,7 +136,10 @@ struct ImBuf *imb_bmp_decode(unsigned char *mem, int size, int flags)
y = LITTLE_LONG(bmi.biHeight);
depth = LITTLE_SHORT(bmi.biBitCount);
- // printf("skip: %d, x: %d y: %d, depth: %d (%x)\n", skip, x, y, depth, bmi.biBitCount);
+ /* printf("skip: %d, x: %d y: %d, depth: %d (%x)\n", skip, x, y,
+ depth, bmi.biBitCount); */
+ printf("skip: %d, x: %d y: %d, depth: %d (%x)\n", skip, x, y,
+ depth, bmi.biBitCount);
if (flags & IB_test) {
ibuf = IMB_allocImBuf(x, y, depth, 0, 0);
} else {
@@ -191,3 +185,65 @@ struct ImBuf *imb_bmp_decode(unsigned char *mem, int size, int flags)
return(ibuf);
}
+/* Couple of helper functions for writing our data */
+int putIntLSB(unsigned int ui,FILE *ofile) {
+ putc((ui>>0)&0xFF,ofile);
+ putc((ui>>8)&0xFF,ofile);
+ putc((ui>>16)&0xFF,ofile);
+ return putc((ui>>24)&0xFF,ofile);
+}
+
+int putShortLSB(unsigned short us,FILE *ofile) {
+ putc((us>>0)&0xFF,ofile);
+ return putc((us>>8)&0xFF,ofile);
+}
+
+/* Found write info at http://users.ece.gatech.edu/~slabaugh/personal/c/bitmapUnix.c */
+short imb_savebmp(struct ImBuf *ibuf, int outfile, int flags) {
+
+ BMPINFOHEADER infoheader;
+ int bytesize, extrabytes, x, y, t, ptr;
+ uchar *data;
+ FILE *ofile;
+
+ extrabytes = (4 - ibuf->x % 4) % 4;
+printf("extrabytes = %d\n",extrabytes);
+ bytesize = (ibuf->x + extrabytes) * ibuf->y;
+
+ data = (uchar *) ibuf->rect;
+ ofile = fdopen(outfile,"ab");
+
+ putShortLSB(19778,ofile); /* "BM" */
+ putIntLSB(0,ofile); /* This can be 0 for BI_RGB bitmaps */
+ putShortLSB(0,ofile); /* Res1 */
+ putShortLSB(0,ofile); /* Res2 */
+ putIntLSB(BMP_FILEHEADER_SIZE + sizeof(infoheader),ofile);
+
+ putIntLSB(sizeof(infoheader),ofile);
+ putIntLSB(ibuf->x,ofile);
+ putIntLSB(ibuf->y,ofile);
+ putShortLSB(1,ofile);
+ putShortLSB(24,ofile);
+ putIntLSB(0,ofile);
+ putIntLSB(bytesize,ofile);
+ putIntLSB(0,ofile);
+ putIntLSB(0,ofile);
+ putIntLSB(0,ofile);
+ putIntLSB(0,ofile);
+
+ /* Need to write out padded image data in bgr format */
+ for (y=0;y<ibuf->y;y++) {
+ for (x=0;x<ibuf->x;x++) {
+
+ ptr=(x + y * ibuf->x) * 4;
+ if (putc(data[ptr+2],ofile) == EOF) return 0;
+ if (putc(data[ptr+1],ofile) == EOF) return 0;
+ if (putc(data[ptr],ofile) == EOF) return 0;
+
+ }
+ /* add padding here */
+ for (t=0;t<extrabytes;t++) if (putc(0,ofile) == EOF) return 0;
+ }
+printf("x = %d y = %d\n",x,y);
+ return 1;
+}
diff --git a/source/blender/imbuf/intern/writeimage.c b/source/blender/imbuf/intern/writeimage.c
index 64df437679a..d6133a19193 100644
--- a/source/blender/imbuf/intern/writeimage.c
+++ b/source/blender/imbuf/intern/writeimage.c
@@ -91,6 +91,14 @@ short IMB_saveiff(struct ImBuf *ibuf,char *naam,int flags)
}
}
+ if (IS_bmp(ibuf)) {
+ ok = imb_savebmp(ibuf,file,flags);
+ if (ok) {
+ close (file);
+ return (ok);
+ }
+ }
+
if (IS_tga(ibuf)) {
ok = imb_savetarga(ibuf,file,flags);
if (ok) {
diff --git a/source/blender/imbuf/readme.txt b/source/blender/imbuf/readme.txt
index d50cf82af89..4edc625013f 100644
--- a/source/blender/imbuf/readme.txt
+++ b/source/blender/imbuf/readme.txt
@@ -21,7 +21,20 @@ Add your hooks to read and write the image format these go in
Step 3:
Add in IS_openexr to blender/source/blender/imbuf/IMB_imbuf_types.h
+Add in R_openexr to source/blender/makesdna/DNA_scene_types.h
-Step 4:
-Add any external library info to the build process.
+Step 4:
+Add your hooks to the gui.
+source/blender/src/buttons_scene.c
+source/blender/src/toets.c
+source/blender/src/writeimage.c
+
+Step 5:
+Alter the build process:
+For autoconf you need to edit blender/source/blender/imbuf/Makefile.am
+and add in your additional files.
+For msvp you need to edit blender/projectfiles/blender/imbuf/BL_imbuf.dsp
+and add in your additional files.
+If you have any external library info you will also need to add that
+to the various build processes.
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index c8219bdc1d1..5d03de842e5 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -323,7 +323,8 @@ typedef struct Scene {
#define R_AVIJPEG 16
#define R_PNG 17
#define R_AVICODEC 18
-#define R_QUICKTIME 19
+#define R_QUICKTIME 19
+#define R_BMP 20
/* **************** RENDER ********************* */
diff --git a/source/blender/src/buttons_scene.c b/source/blender/src/buttons_scene.c
index c3697b1f40c..dbb1734dc2b 100644
--- a/source/blender/src/buttons_scene.c
+++ b/source/blender/src/buttons_scene.c
@@ -877,6 +877,7 @@ static char *imagetype_pup(void)
#endif
strcat(formatstring, "|%s %%x%d"); // add space for PNG
+ strcat(formatstring, "|%s %%x%d"); // add space for BMP
#ifdef _WIN32
strcat(formatstring, "|%s %%x%d"); // add space for AVI Codec
@@ -900,6 +901,7 @@ static char *imagetype_pup(void)
"Targa", R_TARGA,
"Targa Raw", R_RAWTGA,
"PNG", R_PNG,
+ "BMP", R_BMP,
"Jpeg", R_JPEG90,
"HamX", R_HAMX,
"Iris", R_IRIS,
@@ -917,6 +919,7 @@ static char *imagetype_pup(void)
"Targa", R_TARGA,
"Targa Raw", R_RAWTGA,
"PNG", R_PNG,
+ "BMP", R_BMP,
"Jpeg", R_JPEG90,
"HamX", R_HAMX,
"Iris", R_IRIS,
diff --git a/source/blender/src/toets.c b/source/blender/src/toets.c
index 87f2654e8c6..fa220f3da2b 100644
--- a/source/blender/src/toets.c
+++ b/source/blender/src/toets.c
@@ -191,6 +191,9 @@ void schrijfplaatje(char *name)
else if(R.r.imtype==R_PNG) {
ibuf->ftype= PNG;
}
+ else if(R.r.imtype==R_BMP) {
+ ibuf->ftype= BMP;
+ }
else if((R.r.imtype==R_TARGA) || (R.r.imtype==R_PNG)) {
ibuf->ftype= TGA;
}
@@ -460,6 +463,8 @@ int save_image_filesel_str(char *str)
switch(G.scene->r.imtype) {
case R_PNG:
strcpy(str, "SAVE PNG"); return 1;
+ case R_BMP:
+ strcpy(str, "SAVE BMP"); return 1;
case R_TARGA:
strcpy(str, "SAVE TARGA"); return 1;
case R_RAWTGA:
diff --git a/source/blender/src/writeimage.c b/source/blender/src/writeimage.c
index 2b49a0f6fda..23ead94c22d 100644
--- a/source/blender/src/writeimage.c
+++ b/source/blender/src/writeimage.c
@@ -53,6 +53,9 @@ int BIF_write_ibuf(ImBuf *ibuf, char *name)
else if ((R.r.imtype==R_PNG)) {
ibuf->ftype= PNG;
}
+ else if ((R.r.imtype==R_BMP)) {
+ ibuf->ftype= BMP;
+ }
else if ((R.r.imtype==R_TARGA) || (R.r.imtype==R_PNG)) {
// fall back to Targa if PNG writing is not supported
ibuf->ftype= TGA;