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:
-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;