2002-10-12 11:37:38 +00:00
|
|
|
/**
|
|
|
|
*
|
2008-01-07 19:13:47 +00:00
|
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
2002-10-12 11:37:38 +00:00
|
|
|
*
|
|
|
|
* This program 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
|
2008-01-07 19:13:47 +00:00
|
|
|
* of the License, or (at your option) any later version.
|
2002-10-12 11:37:38 +00:00
|
|
|
*
|
|
|
|
* This program 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.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
2010-02-12 13:34:04 +00:00
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2002-10-12 11:37:38 +00:00
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* The Original Code is: all of this file.
|
|
|
|
*
|
|
|
|
* Contributor(s): none yet.
|
|
|
|
*
|
2008-01-07 19:13:47 +00:00
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
2002-10-12 11:37:38 +00:00
|
|
|
* $Id$
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef WIN32
|
|
|
|
#include <io.h>
|
|
|
|
#endif
|
|
|
|
#include "BLI_blenlib.h"
|
2010-08-16 05:46:10 +00:00
|
|
|
#include "MEM_guardedalloc.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
#include "imbuf.h"
|
|
|
|
|
|
|
|
#include "IMB_imbuf_types.h"
|
|
|
|
#include "IMB_imbuf.h"
|
|
|
|
|
|
|
|
#include "IMB_allocimbuf.h"
|
Merge image related changes from the render branch. This includes the image
tile cache code in imbuf, but it is not hooked up to the render engine.
Imbuf module: some small refactoring and removing a lot of unused or old code
(about 6.5k lines).
* Added a ImFileType struct with callbacks to make adding an file format type,
or making changes to the API easier.
* Move imbuf init/exit code into IMB_init()/IMB_exit() functions.
* Increased mipmap levels from 10 to 20, you run into this limit already with
a 2k image.
* Removed hamx, amiga, anim5 format support.
* Removed colormap saving, only simple colormap code now for reading tga.
* Removed gen_dynlibtiff.py, editing this is almost as much work as just
editing the code directly.
* Functions removed that were only used for sequencer plugin API:
IMB_anim_nextpic, IMB_clever_double, IMB_antialias, IMB_gamwarp,
IMB_scalefieldImBuf, IMB_scalefastfieldImBuf, IMB_onethird, IMB_halflace,
IMB_dit0, IMB_dit2, IMB_cspace
* Write metadata info into OpenEXR images. Can be viewed with the command
line utility 'exrheader'
For the image tile cache code, see this page:
http://wiki.blender.org/index.php/Dev:2.5/Source/Imaging/ImageTileCache
2010-05-07 15:18:04 +00:00
|
|
|
#include "IMB_filetype.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* this one is only def-ed once, strangely... related to GS? */
|
|
|
|
#define GSS(x) (((uchar *)(x))[1] << 8 | ((uchar *)(x))[0])
|
|
|
|
|
|
|
|
/***/
|
|
|
|
|
|
|
|
typedef struct TARGA
|
|
|
|
{
|
|
|
|
unsigned char numid;
|
|
|
|
unsigned char maptyp;
|
|
|
|
unsigned char imgtyp;
|
|
|
|
short maporig;
|
|
|
|
short mapsize;
|
|
|
|
unsigned char mapbits;
|
|
|
|
short xorig;
|
|
|
|
short yorig;
|
|
|
|
short xsize;
|
|
|
|
short ysize;
|
|
|
|
unsigned char pixsize;
|
|
|
|
unsigned char imgdes;
|
|
|
|
} TARGA;
|
|
|
|
|
|
|
|
/***/
|
|
|
|
|
|
|
|
static int tga_out1(unsigned int data, FILE *file)
|
|
|
|
{
|
|
|
|
uchar *p;
|
|
|
|
|
|
|
|
p = (uchar *) & data;
|
|
|
|
if (putc(p[0],file) == EOF) return(EOF);
|
|
|
|
return (~EOF);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int tga_out2(unsigned int data, FILE * file)
|
|
|
|
{
|
|
|
|
uchar *p;
|
|
|
|
|
|
|
|
p = (uchar *) & data;
|
|
|
|
if (putc(p[0],file) == EOF) return(EOF);
|
|
|
|
if (putc(p[1],file) == EOF) return(EOF);
|
|
|
|
return (~EOF);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int tga_out3(unsigned int data, FILE * file)
|
|
|
|
{
|
|
|
|
uchar *p;
|
|
|
|
|
|
|
|
p = (uchar *) & data;
|
|
|
|
if (putc(p[2],file) == EOF) return(EOF);
|
|
|
|
if (putc(p[1],file) == EOF) return(EOF);
|
|
|
|
if (putc(p[0],file) == EOF) return(EOF);
|
|
|
|
return (~EOF);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int tga_out4(unsigned int data, FILE * file)
|
|
|
|
{
|
|
|
|
uchar *p;
|
|
|
|
|
|
|
|
p = (uchar *) & data;
|
2003-04-27 09:59:36 +00:00
|
|
|
/* order = bgra */
|
2002-10-12 11:37:38 +00:00
|
|
|
if (putc(p[2],file) == EOF) return(EOF);
|
|
|
|
if (putc(p[1],file) == EOF) return(EOF);
|
|
|
|
if (putc(p[0],file) == EOF) return(EOF);
|
|
|
|
if (putc(p[3],file) == EOF) return(EOF);
|
|
|
|
return (~EOF);
|
|
|
|
}
|
|
|
|
|
|
|
|
static short makebody_tga(ImBuf * ibuf, FILE * file, int (*out)(unsigned int, FILE*))
|
|
|
|
{
|
|
|
|
register int last,this;
|
|
|
|
register int copy, bytes;
|
|
|
|
register unsigned int *rect, *rectstart, *temp;
|
|
|
|
int y;
|
|
|
|
|
|
|
|
for (y = 0; y < ibuf->y; y++) {
|
|
|
|
bytes = ibuf->x - 1;
|
|
|
|
rectstart = rect = ibuf->rect + (y * ibuf->x);
|
|
|
|
last = *rect++;
|
|
|
|
this = *rect++;
|
|
|
|
copy = last^this;
|
|
|
|
while (bytes > 0){
|
|
|
|
if (copy){
|
|
|
|
do{
|
|
|
|
last = this;
|
|
|
|
this = *rect++;
|
|
|
|
if (last == this){
|
2003-04-27 09:59:36 +00:00
|
|
|
if (this == rect[-3]){ /* three the same? */
|
|
|
|
bytes --; /* set bytes */
|
2002-10-12 11:37:38 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}while (--bytes != 0);
|
|
|
|
|
|
|
|
copy = rect-rectstart;
|
|
|
|
copy --;
|
|
|
|
if (bytes) copy -= 2;
|
|
|
|
|
|
|
|
temp = rect;
|
|
|
|
rect = rectstart;
|
|
|
|
|
|
|
|
while (copy){
|
|
|
|
last = copy;
|
|
|
|
if (copy>=128) last = 128;
|
|
|
|
copy -= last;
|
|
|
|
if (fputc(last-1,file) == EOF) return(0);
|
|
|
|
do{
|
|
|
|
if (out(*rect++,file) == EOF) return(0);
|
|
|
|
}while(--last != 0);
|
|
|
|
}
|
|
|
|
rectstart = rect;
|
|
|
|
rect = temp;
|
|
|
|
last = this;
|
|
|
|
|
|
|
|
copy = FALSE;
|
|
|
|
} else {
|
2003-04-27 09:59:36 +00:00
|
|
|
while (*rect++ == this){ /* seek for first different byte */
|
|
|
|
if (--bytes == 0) break; /* oor end of line */
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
rect --;
|
|
|
|
copy = rect-rectstart;
|
|
|
|
rectstart = rect;
|
|
|
|
bytes --;
|
|
|
|
this = *rect++;
|
|
|
|
|
|
|
|
while (copy){
|
|
|
|
if (copy>128){
|
|
|
|
if (fputc(255,file) == EOF) return(0);
|
|
|
|
copy -= 128;
|
|
|
|
} else {
|
|
|
|
if (copy == 1){
|
|
|
|
if (fputc(0,file) == EOF) return(0);
|
|
|
|
} else if (fputc(127 + copy,file) == EOF) return(0);
|
|
|
|
copy = 0;
|
|
|
|
}
|
|
|
|
if (out(last,file) == EOF) return(0);
|
|
|
|
}
|
|
|
|
copy=TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return (1);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int dumptarga(struct ImBuf * ibuf, FILE * file)
|
|
|
|
{
|
|
|
|
int size;
|
|
|
|
uchar *rect;
|
|
|
|
|
|
|
|
if (ibuf == 0) return (0);
|
|
|
|
if (ibuf->rect == 0) return (0);
|
|
|
|
|
|
|
|
size = ibuf->x * ibuf->y;
|
|
|
|
rect = (uchar *) ibuf->rect;
|
|
|
|
|
|
|
|
if (ibuf->depth <= 8) {
|
|
|
|
while(size > 0){
|
|
|
|
if (putc(*rect, file) == EOF) return (0);
|
|
|
|
size--;
|
|
|
|
rect += 4;
|
|
|
|
}
|
|
|
|
} else if (ibuf->depth <= 16) {
|
|
|
|
while(size > 0){
|
|
|
|
putc(rect[0], file);
|
|
|
|
if (putc(rect[1], file) == EOF) return (0);
|
|
|
|
size--;
|
|
|
|
rect += 4;
|
|
|
|
}
|
|
|
|
} else if (ibuf->depth <= 24) {
|
|
|
|
while(size > 0){
|
|
|
|
putc(rect[2], file);
|
|
|
|
putc(rect[1], file);
|
|
|
|
if (putc(rect[0], file) == EOF) return (0);
|
|
|
|
size--;
|
|
|
|
rect += 4;
|
|
|
|
}
|
|
|
|
} else if (ibuf->depth <= 32) {
|
|
|
|
while(size > 0){
|
|
|
|
putc(rect[2], file);
|
|
|
|
putc(rect[1], file);
|
|
|
|
putc(rect[0], file);
|
|
|
|
if (putc(rect[3], file) == EOF) return (0);
|
|
|
|
size--;
|
|
|
|
rect += 4;
|
|
|
|
}
|
|
|
|
} else return (0);
|
|
|
|
|
|
|
|
return (1);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-11-19 02:14:18 +00:00
|
|
|
int imb_savetarga(struct ImBuf * ibuf, const char *name, int flags)
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
2010-11-17 04:02:19 +00:00
|
|
|
char buf[20]= {0};
|
2002-10-12 11:37:38 +00:00
|
|
|
FILE *fildes;
|
Two more variables that were not initalized.
cvs diff included below.
Kent
--
mein@cs.umn.edu
Index: png_encode.c
===================================================================
RCS file: /cvs01/blender/source/blender/imbuf/intern/png_encode.c,v
retrieving revision 1.3
diff -u -r1.3 png_encode.c
--- png_encode.c 2002/11/25 12:02:00 1.3
+++ png_encode.c 2002/12/20 01:28:18
@@ -91,7 +91,7 @@
unsigned char *pixels = 0;
unsigned char *from, *to;
png_bytepp row_pointers = 0;
- int i, bytesperpixel, color_type;
+ int i, bytesperpixel, color_type = PNG_COLOR_TYPE_GRAY;
FILE *fp = 0;
Index: targa.c
===================================================================
RCS file: /cvs01/blender/source/blender/imbuf/intern/targa.c,v
retrieving revision 1.3
diff -u -r1.3 targa.c
--- targa.c 2002/11/25 12:02:00 1.3
+++ targa.c 2002/12/20 01:28:20
@@ -247,7 +247,7 @@
char buf[20];
FILE *fildes;
int i;
- short ok;
+ short ok = 0;
2002-12-20 01:29:14 +00:00
|
|
|
short ok = 0;
|
2010-10-17 06:38:56 +00:00
|
|
|
|
|
|
|
(void)flags; /* unused */
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
buf[16] = (ibuf->depth + 0x7 ) & ~0x7;
|
Merge image related changes from the render branch. This includes the image
tile cache code in imbuf, but it is not hooked up to the render engine.
Imbuf module: some small refactoring and removing a lot of unused or old code
(about 6.5k lines).
* Added a ImFileType struct with callbacks to make adding an file format type,
or making changes to the API easier.
* Move imbuf init/exit code into IMB_init()/IMB_exit() functions.
* Increased mipmap levels from 10 to 20, you run into this limit already with
a 2k image.
* Removed hamx, amiga, anim5 format support.
* Removed colormap saving, only simple colormap code now for reading tga.
* Removed gen_dynlibtiff.py, editing this is almost as much work as just
editing the code directly.
* Functions removed that were only used for sequencer plugin API:
IMB_anim_nextpic, IMB_clever_double, IMB_antialias, IMB_gamwarp,
IMB_scalefieldImBuf, IMB_scalefastfieldImBuf, IMB_onethird, IMB_halflace,
IMB_dit0, IMB_dit2, IMB_cspace
* Write metadata info into OpenEXR images. Can be viewed with the command
line utility 'exrheader'
For the image tile cache code, see this page:
http://wiki.blender.org/index.php/Dev:2.5/Source/Imaging/ImageTileCache
2010-05-07 15:18:04 +00:00
|
|
|
if (ibuf->depth > 8 ){
|
2002-10-12 11:37:38 +00:00
|
|
|
buf[2] = 10;
|
|
|
|
} else{
|
|
|
|
buf[2] = 11;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ibuf->ftype == RAWTGA) buf[2] &= ~8;
|
|
|
|
|
Merge image related changes from the render branch. This includes the image
tile cache code in imbuf, but it is not hooked up to the render engine.
Imbuf module: some small refactoring and removing a lot of unused or old code
(about 6.5k lines).
* Added a ImFileType struct with callbacks to make adding an file format type,
or making changes to the API easier.
* Move imbuf init/exit code into IMB_init()/IMB_exit() functions.
* Increased mipmap levels from 10 to 20, you run into this limit already with
a 2k image.
* Removed hamx, amiga, anim5 format support.
* Removed colormap saving, only simple colormap code now for reading tga.
* Removed gen_dynlibtiff.py, editing this is almost as much work as just
editing the code directly.
* Functions removed that were only used for sequencer plugin API:
IMB_anim_nextpic, IMB_clever_double, IMB_antialias, IMB_gamwarp,
IMB_scalefieldImBuf, IMB_scalefastfieldImBuf, IMB_onethird, IMB_halflace,
IMB_dit0, IMB_dit2, IMB_cspace
* Write metadata info into OpenEXR images. Can be viewed with the command
line utility 'exrheader'
For the image tile cache code, see this page:
http://wiki.blender.org/index.php/Dev:2.5/Source/Imaging/ImageTileCache
2010-05-07 15:18:04 +00:00
|
|
|
buf[8] = 0;
|
|
|
|
buf[9] = 0;
|
|
|
|
buf[10] = 0;
|
|
|
|
buf[11] = 0;
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
buf[12] = ibuf->x & 0xff;
|
|
|
|
buf[13] = ibuf->x >> 8;
|
|
|
|
buf[14] = ibuf->y & 0xff;
|
|
|
|
buf[15] = ibuf->y >> 8;
|
|
|
|
|
2005-01-03 19:53:04 +00:00
|
|
|
/* Don't forget to indicate that your 32 bit
|
|
|
|
* targa uses 8 bits for the alpha channel! */
|
|
|
|
if (ibuf->depth==32) {
|
|
|
|
buf[17] |= 0x08;
|
|
|
|
}
|
2004-12-21 18:49:31 +00:00
|
|
|
fildes = fopen(name,"wb");
|
2010-03-22 09:30:00 +00:00
|
|
|
if (!fildes) return 0;
|
2004-12-09 13:09:11 +00:00
|
|
|
|
2009-08-01 06:27:40 +00:00
|
|
|
if (fwrite(buf, 1, 18,fildes) != 18) {
|
|
|
|
fclose(fildes);
|
|
|
|
return (0);
|
|
|
|
}
|
2002-12-21 09:52:03 +00:00
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
if (ibuf->ftype == RAWTGA) {
|
|
|
|
ok = dumptarga(ibuf, fildes);
|
|
|
|
} else {
|
|
|
|
switch((ibuf->depth + 7) >> 3){
|
|
|
|
case 1:
|
|
|
|
ok = makebody_tga(ibuf, fildes, tga_out1);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
ok = makebody_tga(ibuf, fildes, tga_out2);
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
ok = makebody_tga(ibuf, fildes, tga_out3);
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
ok = makebody_tga(ibuf, fildes, tga_out4);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fclose(fildes);
|
|
|
|
return (ok);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int checktarga(TARGA *tga, unsigned char *mem)
|
|
|
|
{
|
|
|
|
tga->numid = mem[0];
|
|
|
|
tga->maptyp = mem[1];
|
|
|
|
tga->imgtyp = mem[2];
|
|
|
|
|
|
|
|
tga->maporig = GSS(mem+3);
|
|
|
|
tga->mapsize = GSS(mem+5);
|
|
|
|
tga->mapbits = mem[7];
|
|
|
|
tga->xorig = GSS(mem+8);
|
|
|
|
tga->yorig = GSS(mem+10);
|
|
|
|
tga->xsize = GSS(mem+12);
|
|
|
|
tga->ysize = GSS(mem+14);
|
|
|
|
tga->pixsize = mem[16];
|
|
|
|
tga->imgdes = mem[17];
|
|
|
|
|
|
|
|
if (tga->maptyp > 1) return(0);
|
|
|
|
switch (tga->imgtyp){
|
|
|
|
case 1: /* raw cmap */
|
|
|
|
case 2: /* raw rgb */
|
|
|
|
case 3: /* raw b&w */
|
|
|
|
case 9: /* cmap */
|
|
|
|
case 10: /* rgb */
|
|
|
|
case 11: /* b&w */
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
if (tga->mapsize && tga->mapbits > 32) return(0);
|
2004-01-22 12:59:46 +00:00
|
|
|
if (tga->xsize <= 0 || tga->xsize >= 8192) return(0);
|
|
|
|
if (tga->ysize <= 0 || tga->ysize >= 8192) return(0);
|
2002-10-12 11:37:38 +00:00
|
|
|
if (tga->pixsize > 32) return(0);
|
|
|
|
if (tga->pixsize == 0) return(0);
|
|
|
|
return(1);
|
|
|
|
}
|
|
|
|
|
Merge image related changes from the render branch. This includes the image
tile cache code in imbuf, but it is not hooked up to the render engine.
Imbuf module: some small refactoring and removing a lot of unused or old code
(about 6.5k lines).
* Added a ImFileType struct with callbacks to make adding an file format type,
or making changes to the API easier.
* Move imbuf init/exit code into IMB_init()/IMB_exit() functions.
* Increased mipmap levels from 10 to 20, you run into this limit already with
a 2k image.
* Removed hamx, amiga, anim5 format support.
* Removed colormap saving, only simple colormap code now for reading tga.
* Removed gen_dynlibtiff.py, editing this is almost as much work as just
editing the code directly.
* Functions removed that were only used for sequencer plugin API:
IMB_anim_nextpic, IMB_clever_double, IMB_antialias, IMB_gamwarp,
IMB_scalefieldImBuf, IMB_scalefastfieldImBuf, IMB_onethird, IMB_halflace,
IMB_dit0, IMB_dit2, IMB_cspace
* Write metadata info into OpenEXR images. Can be viewed with the command
line utility 'exrheader'
For the image tile cache code, see this page:
http://wiki.blender.org/index.php/Dev:2.5/Source/Imaging/ImageTileCache
2010-05-07 15:18:04 +00:00
|
|
|
int imb_is_a_targa(unsigned char *buf) {
|
2002-10-12 11:37:38 +00:00
|
|
|
TARGA tga;
|
|
|
|
|
|
|
|
return checktarga(&tga, buf);
|
|
|
|
}
|
|
|
|
|
2009-07-27 22:41:35 +00:00
|
|
|
static void complete_partial_load(struct ImBuf *ibuf, unsigned int *rect)
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
2009-07-27 22:41:35 +00:00
|
|
|
int size = (ibuf->x * ibuf->y) - (rect - ibuf->rect);
|
|
|
|
if(size) {
|
|
|
|
printf("decodetarga: incomplete file, %.1f%% missing\n", 100*((float)size / (ibuf->x * ibuf->y)));
|
|
|
|
|
|
|
|
/* not essential but makes displaying partially rendered TGA's less ugly */
|
|
|
|
memset(rect, 0, size);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* shouldnt happen */
|
|
|
|
printf("decodetarga: incomplete file, all pixels written\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-09-15 06:43:36 +00:00
|
|
|
static void decodetarga(struct ImBuf *ibuf, unsigned char *mem, size_t mem_size, int psize)
|
2009-07-27 22:41:35 +00:00
|
|
|
{
|
|
|
|
unsigned char *mem_end = mem+mem_size;
|
2002-10-12 11:37:38 +00:00
|
|
|
int count, col, size;
|
|
|
|
unsigned int *rect;
|
|
|
|
uchar * cp = (uchar *) &col;
|
|
|
|
|
|
|
|
if (ibuf == 0) return;
|
|
|
|
if (ibuf->rect == 0) return;
|
|
|
|
|
|
|
|
size = ibuf->x * ibuf->y;
|
|
|
|
rect = ibuf->rect;
|
|
|
|
|
2003-04-27 09:59:36 +00:00
|
|
|
/* set alpha */
|
2002-10-12 11:37:38 +00:00
|
|
|
cp[0] = 0xff;
|
|
|
|
cp[1] = cp[2] = 0;
|
2009-07-27 22:41:35 +00:00
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
while(size > 0){
|
|
|
|
count = *mem++;
|
2009-07-27 22:41:35 +00:00
|
|
|
|
|
|
|
if(mem>mem_end)
|
|
|
|
goto partial_load;
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
if (count >= 128) {
|
|
|
|
/*if (count == 128) printf("TARGA: 128 in file !\n");*/
|
|
|
|
count -= 127;
|
|
|
|
|
|
|
|
if (psize & 2){
|
|
|
|
if (psize & 1){
|
2003-04-27 09:59:36 +00:00
|
|
|
/* order = bgra */
|
2002-10-12 11:37:38 +00:00
|
|
|
cp[0] = mem[3];
|
|
|
|
cp[1] = mem[0];
|
|
|
|
cp[2] = mem[1];
|
|
|
|
cp[3] = mem[2];
|
|
|
|
/*col = (mem[3] << 24) + (mem[0] << 16) + (mem[1] << 8) + mem[2];*/
|
|
|
|
mem += 4;
|
|
|
|
} else{
|
|
|
|
cp[1] = mem[0];
|
|
|
|
cp[2] = mem[1];
|
|
|
|
cp[3] = mem[2];
|
|
|
|
/*col = 0xff000000 + (mem[0] << 16) + (mem[1] << 8) + mem[2];*/
|
|
|
|
mem += 3;
|
|
|
|
}
|
|
|
|
} else{
|
|
|
|
if (psize & 1){
|
2006-11-07 17:32:29 +00:00
|
|
|
cp[0] = mem[0];
|
|
|
|
cp[1] = mem[1];
|
2002-10-12 11:37:38 +00:00
|
|
|
mem += 2;
|
|
|
|
} else{
|
|
|
|
col = *mem++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
size -= count;
|
|
|
|
if (size >= 0) {
|
|
|
|
while (count > 0) {
|
|
|
|
*rect++ = col;
|
|
|
|
count--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else{
|
|
|
|
count ++;
|
|
|
|
size -= count;
|
|
|
|
if (size >= 0) {
|
|
|
|
while (count > 0){
|
|
|
|
if (psize & 2){
|
|
|
|
if (psize & 1){
|
2003-04-27 09:59:36 +00:00
|
|
|
/* order = bgra */
|
2002-10-12 11:37:38 +00:00
|
|
|
cp[0] = mem[3];
|
|
|
|
cp[1] = mem[0];
|
|
|
|
cp[2] = mem[1];
|
|
|
|
cp[3] = mem[2];
|
|
|
|
/*col = (mem[3] << 24) + (mem[0] << 16) + (mem[1] << 8) + mem[2];*/
|
|
|
|
mem += 4;
|
|
|
|
} else{
|
|
|
|
cp[1] = mem[0];
|
|
|
|
cp[2] = mem[1];
|
|
|
|
cp[3] = mem[2];
|
|
|
|
/*col = 0xff000000 + (mem[0] << 16) + (mem[1] << 8) + mem[2];*/
|
|
|
|
mem += 3;
|
|
|
|
}
|
|
|
|
} else{
|
|
|
|
if (psize & 1){
|
2006-11-07 17:32:29 +00:00
|
|
|
cp[0] = mem[0];
|
|
|
|
cp[1] = mem[1];
|
2002-10-12 11:37:38 +00:00
|
|
|
mem += 2;
|
|
|
|
} else{
|
|
|
|
col = *mem++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*rect++ = col;
|
|
|
|
count --;
|
2009-07-27 22:41:35 +00:00
|
|
|
|
|
|
|
if(mem>mem_end)
|
|
|
|
goto partial_load;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
2009-07-27 22:41:35 +00:00
|
|
|
|
|
|
|
if(mem>mem_end)
|
|
|
|
goto partial_load;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2009-07-27 22:41:35 +00:00
|
|
|
if (size) {
|
|
|
|
printf("decodetarga: count would overwrite %d pixels\n", -size);
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
|
|
|
|
partial_load:
|
|
|
|
complete_partial_load(ibuf, rect);
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
2010-09-15 06:43:36 +00:00
|
|
|
static void ldtarga(struct ImBuf * ibuf,unsigned char * mem, size_t mem_size, int psize)
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
2009-07-27 22:41:35 +00:00
|
|
|
unsigned char *mem_end = mem+mem_size;
|
2002-10-12 11:37:38 +00:00
|
|
|
int col,size;
|
|
|
|
unsigned int *rect;
|
|
|
|
uchar * cp = (uchar *) &col;
|
|
|
|
|
|
|
|
if (ibuf == 0) return;
|
|
|
|
if (ibuf->rect == 0) return;
|
|
|
|
|
|
|
|
size = ibuf->x * ibuf->y;
|
|
|
|
rect = ibuf->rect;
|
|
|
|
|
2003-04-27 09:59:36 +00:00
|
|
|
/* set alpha */
|
2002-10-12 11:37:38 +00:00
|
|
|
cp[0] = 0xff;
|
|
|
|
cp[1] = cp[2] = 0;
|
|
|
|
|
|
|
|
while(size > 0){
|
2009-07-27 22:41:35 +00:00
|
|
|
if(mem>mem_end)
|
|
|
|
goto partial_load;
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
if (psize & 2){
|
|
|
|
if (psize & 1){
|
2003-04-27 09:59:36 +00:00
|
|
|
/* order = bgra */
|
2002-10-12 11:37:38 +00:00
|
|
|
cp[0] = mem[3];
|
|
|
|
cp[1] = mem[0];
|
|
|
|
cp[2] = mem[1];
|
|
|
|
cp[3] = mem[2];
|
|
|
|
/*col = (mem[3] << 24) + (mem[0] << 16) + (mem[1] << 8) + mem[2];*/
|
|
|
|
mem += 4;
|
|
|
|
} else{
|
2003-04-27 09:59:36 +00:00
|
|
|
/* set alpha for 24 bits colors */
|
2002-10-12 11:37:38 +00:00
|
|
|
cp[1] = mem[0];
|
|
|
|
cp[2] = mem[1];
|
|
|
|
cp[3] = mem[2];
|
|
|
|
/*col = 0xff000000 + (mem[0] << 16) + (mem[1] << 8) + mem[2];*/
|
|
|
|
mem += 3;
|
|
|
|
}
|
|
|
|
} else{
|
|
|
|
if (psize & 1){
|
2006-11-07 17:32:29 +00:00
|
|
|
cp[0] = mem[0];
|
|
|
|
cp[1] = mem[1];
|
2002-10-12 11:37:38 +00:00
|
|
|
mem += 2;
|
|
|
|
} else{
|
|
|
|
col = *mem++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*rect++ = col;
|
|
|
|
size--;
|
|
|
|
}
|
2009-07-27 22:41:35 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
partial_load:
|
|
|
|
complete_partial_load(ibuf, rect);
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-09-15 06:43:36 +00:00
|
|
|
struct ImBuf *imb_loadtarga(unsigned char *mem, size_t mem_size, int flags)
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
|
|
|
TARGA tga;
|
|
|
|
struct ImBuf * ibuf;
|
|
|
|
int col, count, size;
|
Merge image related changes from the render branch. This includes the image
tile cache code in imbuf, but it is not hooked up to the render engine.
Imbuf module: some small refactoring and removing a lot of unused or old code
(about 6.5k lines).
* Added a ImFileType struct with callbacks to make adding an file format type,
or making changes to the API easier.
* Move imbuf init/exit code into IMB_init()/IMB_exit() functions.
* Increased mipmap levels from 10 to 20, you run into this limit already with
a 2k image.
* Removed hamx, amiga, anim5 format support.
* Removed colormap saving, only simple colormap code now for reading tga.
* Removed gen_dynlibtiff.py, editing this is almost as much work as just
editing the code directly.
* Functions removed that were only used for sequencer plugin API:
IMB_anim_nextpic, IMB_clever_double, IMB_antialias, IMB_gamwarp,
IMB_scalefieldImBuf, IMB_scalefastfieldImBuf, IMB_onethird, IMB_halflace,
IMB_dit0, IMB_dit2, IMB_cspace
* Write metadata info into OpenEXR images. Can be viewed with the command
line utility 'exrheader'
For the image tile cache code, see this page:
http://wiki.blender.org/index.php/Dev:2.5/Source/Imaging/ImageTileCache
2010-05-07 15:18:04 +00:00
|
|
|
unsigned int *rect, *cmap= NULL, mincol= 0, maxcol= 0;
|
2002-10-12 11:37:38 +00:00
|
|
|
uchar * cp = (uchar *) &col;
|
|
|
|
|
|
|
|
if (checktarga(&tga,mem) == 0) return(0);
|
|
|
|
|
2010-10-16 14:32:17 +00:00
|
|
|
if (flags & IB_test) ibuf = IMB_allocImBuf(tga.xsize,tga.ysize,tga.pixsize, 0);
|
|
|
|
else ibuf = IMB_allocImBuf(tga.xsize,tga.ysize,(tga.pixsize + 0x7) & ~0x7, IB_rect);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
if (ibuf == 0) return(0);
|
|
|
|
ibuf->ftype = TGA;
|
2010-01-09 00:16:35 +00:00
|
|
|
ibuf->profile = IB_PROFILE_SRGB;
|
2002-10-12 11:37:38 +00:00
|
|
|
mem = mem + 18 + tga.numid;
|
|
|
|
|
|
|
|
cp[0] = 0xff;
|
|
|
|
cp[1] = cp[2] = 0;
|
|
|
|
|
|
|
|
if (tga.mapsize){
|
Merge image related changes from the render branch. This includes the image
tile cache code in imbuf, but it is not hooked up to the render engine.
Imbuf module: some small refactoring and removing a lot of unused or old code
(about 6.5k lines).
* Added a ImFileType struct with callbacks to make adding an file format type,
or making changes to the API easier.
* Move imbuf init/exit code into IMB_init()/IMB_exit() functions.
* Increased mipmap levels from 10 to 20, you run into this limit already with
a 2k image.
* Removed hamx, amiga, anim5 format support.
* Removed colormap saving, only simple colormap code now for reading tga.
* Removed gen_dynlibtiff.py, editing this is almost as much work as just
editing the code directly.
* Functions removed that were only used for sequencer plugin API:
IMB_anim_nextpic, IMB_clever_double, IMB_antialias, IMB_gamwarp,
IMB_scalefieldImBuf, IMB_scalefastfieldImBuf, IMB_onethird, IMB_halflace,
IMB_dit0, IMB_dit2, IMB_cspace
* Write metadata info into OpenEXR images. Can be viewed with the command
line utility 'exrheader'
For the image tile cache code, see this page:
http://wiki.blender.org/index.php/Dev:2.5/Source/Imaging/ImageTileCache
2010-05-07 15:18:04 +00:00
|
|
|
/* load color map */
|
|
|
|
mincol = tga.maporig;
|
|
|
|
maxcol = tga.mapsize;
|
|
|
|
cmap = MEM_callocN(sizeof(unsigned int)*maxcol, "targa cmap");
|
|
|
|
|
|
|
|
for (count = 0 ; count < maxcol ; count ++) {
|
2002-10-12 11:37:38 +00:00
|
|
|
switch (tga.mapbits >> 3) {
|
|
|
|
case 4:
|
|
|
|
cp[0] = mem[3];
|
|
|
|
cp[1] = mem[0];
|
|
|
|
cp[2] = mem[1];
|
|
|
|
cp[3] = mem[2];
|
|
|
|
mem += 4;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
cp[1] = mem[0];
|
|
|
|
cp[2] = mem[1];
|
|
|
|
cp[3] = mem[2];
|
|
|
|
mem += 3;
|
|
|
|
break;
|
|
|
|
case 2:
|
2006-11-07 21:24:47 +00:00
|
|
|
cp[1] = mem[1];
|
|
|
|
cp[0] = mem[0];
|
2002-10-12 11:37:38 +00:00
|
|
|
mem += 2;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
col = *mem++;
|
|
|
|
break;
|
|
|
|
}
|
Merge image related changes from the render branch. This includes the image
tile cache code in imbuf, but it is not hooked up to the render engine.
Imbuf module: some small refactoring and removing a lot of unused or old code
(about 6.5k lines).
* Added a ImFileType struct with callbacks to make adding an file format type,
or making changes to the API easier.
* Move imbuf init/exit code into IMB_init()/IMB_exit() functions.
* Increased mipmap levels from 10 to 20, you run into this limit already with
a 2k image.
* Removed hamx, amiga, anim5 format support.
* Removed colormap saving, only simple colormap code now for reading tga.
* Removed gen_dynlibtiff.py, editing this is almost as much work as just
editing the code directly.
* Functions removed that were only used for sequencer plugin API:
IMB_anim_nextpic, IMB_clever_double, IMB_antialias, IMB_gamwarp,
IMB_scalefieldImBuf, IMB_scalefastfieldImBuf, IMB_onethird, IMB_halflace,
IMB_dit0, IMB_dit2, IMB_cspace
* Write metadata info into OpenEXR images. Can be viewed with the command
line utility 'exrheader'
For the image tile cache code, see this page:
http://wiki.blender.org/index.php/Dev:2.5/Source/Imaging/ImageTileCache
2010-05-07 15:18:04 +00:00
|
|
|
cmap[count] = col;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
size = 0;
|
Merge image related changes from the render branch. This includes the image
tile cache code in imbuf, but it is not hooked up to the render engine.
Imbuf module: some small refactoring and removing a lot of unused or old code
(about 6.5k lines).
* Added a ImFileType struct with callbacks to make adding an file format type,
or making changes to the API easier.
* Move imbuf init/exit code into IMB_init()/IMB_exit() functions.
* Increased mipmap levels from 10 to 20, you run into this limit already with
a 2k image.
* Removed hamx, amiga, anim5 format support.
* Removed colormap saving, only simple colormap code now for reading tga.
* Removed gen_dynlibtiff.py, editing this is almost as much work as just
editing the code directly.
* Functions removed that were only used for sequencer plugin API:
IMB_anim_nextpic, IMB_clever_double, IMB_antialias, IMB_gamwarp,
IMB_scalefieldImBuf, IMB_scalefastfieldImBuf, IMB_onethird, IMB_halflace,
IMB_dit0, IMB_dit2, IMB_cspace
* Write metadata info into OpenEXR images. Can be viewed with the command
line utility 'exrheader'
For the image tile cache code, see this page:
http://wiki.blender.org/index.php/Dev:2.5/Source/Imaging/ImageTileCache
2010-05-07 15:18:04 +00:00
|
|
|
for (col = maxcol - 1; col > 0; col >>= 1) size++;
|
2002-10-12 11:37:38 +00:00
|
|
|
ibuf->depth = size;
|
|
|
|
|
2003-04-27 09:59:36 +00:00
|
|
|
if (tga.mapbits != 32) { /* set alpha bits */
|
Merge image related changes from the render branch. This includes the image
tile cache code in imbuf, but it is not hooked up to the render engine.
Imbuf module: some small refactoring and removing a lot of unused or old code
(about 6.5k lines).
* Added a ImFileType struct with callbacks to make adding an file format type,
or making changes to the API easier.
* Move imbuf init/exit code into IMB_init()/IMB_exit() functions.
* Increased mipmap levels from 10 to 20, you run into this limit already with
a 2k image.
* Removed hamx, amiga, anim5 format support.
* Removed colormap saving, only simple colormap code now for reading tga.
* Removed gen_dynlibtiff.py, editing this is almost as much work as just
editing the code directly.
* Functions removed that were only used for sequencer plugin API:
IMB_anim_nextpic, IMB_clever_double, IMB_antialias, IMB_gamwarp,
IMB_scalefieldImBuf, IMB_scalefastfieldImBuf, IMB_onethird, IMB_halflace,
IMB_dit0, IMB_dit2, IMB_cspace
* Write metadata info into OpenEXR images. Can be viewed with the command
line utility 'exrheader'
For the image tile cache code, see this page:
http://wiki.blender.org/index.php/Dev:2.5/Source/Imaging/ImageTileCache
2010-05-07 15:18:04 +00:00
|
|
|
cmap[0] &= BIG_LONG(0x00ffffff);
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (flags & IB_test) return (ibuf);
|
|
|
|
|
Merge image related changes from the render branch. This includes the image
tile cache code in imbuf, but it is not hooked up to the render engine.
Imbuf module: some small refactoring and removing a lot of unused or old code
(about 6.5k lines).
* Added a ImFileType struct with callbacks to make adding an file format type,
or making changes to the API easier.
* Move imbuf init/exit code into IMB_init()/IMB_exit() functions.
* Increased mipmap levels from 10 to 20, you run into this limit already with
a 2k image.
* Removed hamx, amiga, anim5 format support.
* Removed colormap saving, only simple colormap code now for reading tga.
* Removed gen_dynlibtiff.py, editing this is almost as much work as just
editing the code directly.
* Functions removed that were only used for sequencer plugin API:
IMB_anim_nextpic, IMB_clever_double, IMB_antialias, IMB_gamwarp,
IMB_scalefieldImBuf, IMB_scalefastfieldImBuf, IMB_onethird, IMB_halflace,
IMB_dit0, IMB_dit2, IMB_cspace
* Write metadata info into OpenEXR images. Can be viewed with the command
line utility 'exrheader'
For the image tile cache code, see this page:
http://wiki.blender.org/index.php/Dev:2.5/Source/Imaging/ImageTileCache
2010-05-07 15:18:04 +00:00
|
|
|
if (tga.imgtyp != 1 && tga.imgtyp != 9) { /* happens sometimes (beuh) */
|
2010-06-23 10:24:35 +00:00
|
|
|
if(cmap) {
|
|
|
|
MEM_freeN(cmap);
|
|
|
|
cmap= NULL;
|
|
|
|
}
|
Merge image related changes from the render branch. This includes the image
tile cache code in imbuf, but it is not hooked up to the render engine.
Imbuf module: some small refactoring and removing a lot of unused or old code
(about 6.5k lines).
* Added a ImFileType struct with callbacks to make adding an file format type,
or making changes to the API easier.
* Move imbuf init/exit code into IMB_init()/IMB_exit() functions.
* Increased mipmap levels from 10 to 20, you run into this limit already with
a 2k image.
* Removed hamx, amiga, anim5 format support.
* Removed colormap saving, only simple colormap code now for reading tga.
* Removed gen_dynlibtiff.py, editing this is almost as much work as just
editing the code directly.
* Functions removed that were only used for sequencer plugin API:
IMB_anim_nextpic, IMB_clever_double, IMB_antialias, IMB_gamwarp,
IMB_scalefieldImBuf, IMB_scalefastfieldImBuf, IMB_onethird, IMB_halflace,
IMB_dit0, IMB_dit2, IMB_cspace
* Write metadata info into OpenEXR images. Can be viewed with the command
line utility 'exrheader'
For the image tile cache code, see this page:
http://wiki.blender.org/index.php/Dev:2.5/Source/Imaging/ImageTileCache
2010-05-07 15:18:04 +00:00
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
switch(tga.imgtyp){
|
|
|
|
case 1:
|
|
|
|
case 2:
|
|
|
|
case 3:
|
2009-07-27 22:41:35 +00:00
|
|
|
if (tga.pixsize <= 8) ldtarga(ibuf,mem,mem_size,0);
|
|
|
|
else if (tga.pixsize <= 16) ldtarga(ibuf,mem,mem_size,1);
|
|
|
|
else if (tga.pixsize <= 24) ldtarga(ibuf,mem,mem_size,2);
|
|
|
|
else if (tga.pixsize <= 32) ldtarga(ibuf,mem,mem_size,3);
|
2002-10-12 11:37:38 +00:00
|
|
|
break;
|
|
|
|
case 9:
|
|
|
|
case 10:
|
|
|
|
case 11:
|
2009-07-27 22:41:35 +00:00
|
|
|
if (tga.pixsize <= 8) decodetarga(ibuf,mem,mem_size,0);
|
|
|
|
else if (tga.pixsize <= 16) decodetarga(ibuf,mem,mem_size,1);
|
|
|
|
else if (tga.pixsize <= 24) decodetarga(ibuf,mem,mem_size,2);
|
|
|
|
else if (tga.pixsize <= 32) decodetarga(ibuf,mem,mem_size,3);
|
2002-10-12 11:37:38 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
Merge image related changes from the render branch. This includes the image
tile cache code in imbuf, but it is not hooked up to the render engine.
Imbuf module: some small refactoring and removing a lot of unused or old code
(about 6.5k lines).
* Added a ImFileType struct with callbacks to make adding an file format type,
or making changes to the API easier.
* Move imbuf init/exit code into IMB_init()/IMB_exit() functions.
* Increased mipmap levels from 10 to 20, you run into this limit already with
a 2k image.
* Removed hamx, amiga, anim5 format support.
* Removed colormap saving, only simple colormap code now for reading tga.
* Removed gen_dynlibtiff.py, editing this is almost as much work as just
editing the code directly.
* Functions removed that were only used for sequencer plugin API:
IMB_anim_nextpic, IMB_clever_double, IMB_antialias, IMB_gamwarp,
IMB_scalefieldImBuf, IMB_scalefastfieldImBuf, IMB_onethird, IMB_halflace,
IMB_dit0, IMB_dit2, IMB_cspace
* Write metadata info into OpenEXR images. Can be viewed with the command
line utility 'exrheader'
For the image tile cache code, see this page:
http://wiki.blender.org/index.php/Dev:2.5/Source/Imaging/ImageTileCache
2010-05-07 15:18:04 +00:00
|
|
|
if(cmap) {
|
|
|
|
/* apply color map */
|
|
|
|
rect = ibuf->rect;
|
|
|
|
for(size = ibuf->x * ibuf->y; size>0; --size, ++rect) {
|
|
|
|
col = *rect;
|
|
|
|
if (col >= 0 && col < maxcol) *rect = cmap[col];
|
|
|
|
}
|
|
|
|
|
|
|
|
MEM_freeN(cmap);
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
Merge image related changes from the render branch. This includes the image
tile cache code in imbuf, but it is not hooked up to the render engine.
Imbuf module: some small refactoring and removing a lot of unused or old code
(about 6.5k lines).
* Added a ImFileType struct with callbacks to make adding an file format type,
or making changes to the API easier.
* Move imbuf init/exit code into IMB_init()/IMB_exit() functions.
* Increased mipmap levels from 10 to 20, you run into this limit already with
a 2k image.
* Removed hamx, amiga, anim5 format support.
* Removed colormap saving, only simple colormap code now for reading tga.
* Removed gen_dynlibtiff.py, editing this is almost as much work as just
editing the code directly.
* Functions removed that were only used for sequencer plugin API:
IMB_anim_nextpic, IMB_clever_double, IMB_antialias, IMB_gamwarp,
IMB_scalefieldImBuf, IMB_scalefastfieldImBuf, IMB_onethird, IMB_halflace,
IMB_dit0, IMB_dit2, IMB_cspace
* Write metadata info into OpenEXR images. Can be viewed with the command
line utility 'exrheader'
For the image tile cache code, see this page:
http://wiki.blender.org/index.php/Dev:2.5/Source/Imaging/ImageTileCache
2010-05-07 15:18:04 +00:00
|
|
|
if (tga.pixsize == 16) {
|
2002-10-12 11:37:38 +00:00
|
|
|
rect = ibuf->rect;
|
2006-11-07 17:32:29 +00:00
|
|
|
for (size = ibuf->x * ibuf->y; size > 0; --size, ++rect){
|
2002-10-12 11:37:38 +00:00
|
|
|
col = *rect;
|
2006-11-07 18:32:25 +00:00
|
|
|
cp = (uchar*)rect;
|
|
|
|
mem = (uchar*)&col;
|
|
|
|
|
2006-11-07 17:32:29 +00:00
|
|
|
cp[3] = ((mem[1] << 1) & 0xf8);
|
|
|
|
cp[2] = ((mem[0] & 0xe0) >> 2) + ((mem[1] & 0x03) << 6);
|
|
|
|
cp[1] = ((mem[0] << 3) & 0xf8);
|
|
|
|
cp[1] += cp[1] >> 5;
|
|
|
|
cp[2] += cp[2] >> 5;
|
|
|
|
cp[3] += cp[3] >> 5;
|
|
|
|
cp[0] = 0xff;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
ibuf->depth = 24;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (tga.imgtyp == 3 || tga.imgtyp == 11){
|
|
|
|
uchar *crect;
|
|
|
|
unsigned int *lrect, col;
|
|
|
|
|
|
|
|
crect = (uchar *) ibuf->rect;
|
|
|
|
lrect = (unsigned int *) ibuf->rect;
|
|
|
|
|
|
|
|
for (size = ibuf->x * ibuf->y; size > 0; size --){
|
|
|
|
col = *lrect++;
|
|
|
|
|
|
|
|
crect[0] = 255;
|
|
|
|
crect[1] = crect[2] = crect[3] = col;
|
|
|
|
crect += 4;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (tga.imgdes & 0x20) IMB_flipy(ibuf);
|
|
|
|
|
Merge image related changes from the render branch. This includes the image
tile cache code in imbuf, but it is not hooked up to the render engine.
Imbuf module: some small refactoring and removing a lot of unused or old code
(about 6.5k lines).
* Added a ImFileType struct with callbacks to make adding an file format type,
or making changes to the API easier.
* Move imbuf init/exit code into IMB_init()/IMB_exit() functions.
* Increased mipmap levels from 10 to 20, you run into this limit already with
a 2k image.
* Removed hamx, amiga, anim5 format support.
* Removed colormap saving, only simple colormap code now for reading tga.
* Removed gen_dynlibtiff.py, editing this is almost as much work as just
editing the code directly.
* Functions removed that were only used for sequencer plugin API:
IMB_anim_nextpic, IMB_clever_double, IMB_antialias, IMB_gamwarp,
IMB_scalefieldImBuf, IMB_scalefastfieldImBuf, IMB_onethird, IMB_halflace,
IMB_dit0, IMB_dit2, IMB_cspace
* Write metadata info into OpenEXR images. Can be viewed with the command
line utility 'exrheader'
For the image tile cache code, see this page:
http://wiki.blender.org/index.php/Dev:2.5/Source/Imaging/ImageTileCache
2010-05-07 15:18:04 +00:00
|
|
|
if (ibuf && ibuf->rect)
|
|
|
|
IMB_convert_rgba_to_abgr(ibuf);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
return(ibuf);
|
|
|
|
}
|