2005-11-22 18:50:03 +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-04-16 22:40:48 +00:00
|
|
|
* of the License, or (at your option) any later version.
|
2005-11-22 18:50:03 +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.
|
2005-11-22 18:50:03 +00:00
|
|
|
*/
|
|
|
|
|
2019-02-18 08:08:12 +11:00
|
|
|
/** \file
|
|
|
|
* \ingroup imbuf
|
2011-02-27 20:23:21 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
2005-11-22 18:50:03 +00:00
|
|
|
/**
|
|
|
|
* Provides TIFF file loading and saving for Blender, via libtiff.
|
|
|
|
*
|
|
|
|
* The task of loading is complicated somewhat by the fact that Blender has
|
|
|
|
* already loaded the file into a memory buffer. libtiff is not well
|
|
|
|
* configured to handle files in memory, so a client wrapper is written to
|
|
|
|
* surround the memory and turn it into a virtual file. Currently, reading
|
2018-06-01 18:19:39 +02:00
|
|
|
* of TIFF files is done using libtiff's RGBAImage support. This is a
|
2005-11-22 18:50:03 +00:00
|
|
|
* high-level routine that loads all images as 32-bit RGBA, handling all the
|
|
|
|
* required conversions between many different TIFF types internally.
|
2018-06-01 18:19:39 +02:00
|
|
|
*
|
2012-07-03 19:09:07 +00:00
|
|
|
* Saving supports RGB, RGBA and BW (grayscale) images correctly, with
|
2005-11-22 18:50:03 +00:00
|
|
|
* 8 bits per channel in all cases. The "deflate" compression algorithm is
|
|
|
|
* used to compress images.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include "imbuf.h"
|
2005-12-02 21:46:52 +00:00
|
|
|
|
2010-05-18 07:28:44 +00:00
|
|
|
#include "BLI_math.h"
|
2011-01-07 18:36:47 +00:00
|
|
|
#include "BLI_utildefines.h"
|
2018-06-17 17:04:54 +02:00
|
|
|
|
2011-01-07 18:36:47 +00:00
|
|
|
#include "BKE_global.h"
|
2011-01-07 19:18:31 +00:00
|
|
|
|
2005-11-22 18:50:03 +00:00
|
|
|
#include "IMB_imbuf_types.h"
|
|
|
|
#include "IMB_imbuf.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"
|
2005-11-22 18:50:03 +00:00
|
|
|
|
Color Management, Stage 2: Switch color pipeline to use OpenColorIO
Replace old color pipeline which was supporting linear/sRGB color spaces
only with OpenColorIO-based pipeline.
This introduces two configurable color spaces:
- Input color space for images and movie clips. This space is used to convert
images/movies from color space in which file is saved to Blender's linear
space (for float images, byte images are not internally converted, only input
space is stored for such images and used later).
This setting could be found in image/clip data block settings.
- Display color space which defines space in which particular display is working.
This settings could be found in scene's Color Management panel.
When render result is being displayed on the screen, apart from converting image
to display space, some additional conversions could happen.
This conversions are:
- View, which defines tone curve applying before display transformation.
These are different ways to view the image on the same display device.
For example it could be used to emulate film view on sRGB display.
- Exposure affects on image exposure before tone map is applied.
- Gamma is post-display gamma correction, could be used to match particular
display gamma.
- RGB curves are user-defined curves which are applying before display
transformation, could be used for different purposes.
All this settings by default are only applying on render result and does not
affect on other images. If some particular image needs to be affected by this
transformation, "View as Render" setting of image data block should be set to
truth. Movie clips are always affected by all display transformations.
This commit also introduces configurable color space in which sequencer is
working. This setting could be found in scene's Color Management panel and
it should be used if such stuff as grading needs to be done in color space
different from sRGB (i.e. when Film view on sRGB display is use, using VD16
space as sequencer's internal space would make grading working in space
which is close to the space using for display).
Some technical notes:
- Image buffer's float buffer is now always in linear space, even if it was
created from 16bit byte images.
- Space of byte buffer is stored in image buffer's rect_colorspace property.
- Profile of image buffer was removed since it's not longer meaningful.
- OpenGL and GLSL is supposed to always work in sRGB space. It is possible
to support other spaces, but it's quite large project which isn't so
much important.
- Legacy Color Management option disabled is emulated by using None display.
It could have some regressions, but there's no clear way to avoid them.
- If OpenColorIO is disabled on build time, it should make blender behaving
in the same way as previous release with color management enabled.
More details could be found at this page (more details would be added soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.64/Color_Management
--
Thanks to Xavier Thomas, Lukas Toene for initial work on OpenColorIO
integration and to Brecht van Lommel for some further development and code/
usecase review!
2012-09-15 10:05:07 +00:00
|
|
|
#include "IMB_colormanagement.h"
|
|
|
|
#include "IMB_colormanagement_intern.h"
|
|
|
|
|
2010-05-21 03:25:38 +00:00
|
|
|
#include "tiffio.h"
|
2005-11-22 18:50:03 +00:00
|
|
|
|
2012-08-22 13:10:37 +00:00
|
|
|
#ifdef WIN32
|
|
|
|
#include "utfconv.h"
|
|
|
|
#endif
|
2005-11-22 18:50:03 +00:00
|
|
|
|
|
|
|
/***********************
|
2012-05-16 23:37:23 +00:00
|
|
|
* Local declarations. *
|
|
|
|
***********************/
|
2005-11-22 18:50:03 +00:00
|
|
|
/* Reading and writing of an in-memory TIFF file. */
|
2010-03-14 18:22:04 +00:00
|
|
|
static tsize_t imb_tiff_ReadProc(thandle_t handle, tdata_t data, tsize_t n);
|
|
|
|
static tsize_t imb_tiff_WriteProc(thandle_t handle, tdata_t data, tsize_t n);
|
|
|
|
static toff_t imb_tiff_SeekProc(thandle_t handle, toff_t ofs, int whence);
|
|
|
|
static int imb_tiff_CloseProc(thandle_t handle);
|
|
|
|
static toff_t imb_tiff_SizeProc(thandle_t handle);
|
2012-05-16 09:26:37 +00:00
|
|
|
static int imb_tiff_DummyMapProc(thandle_t fd, tdata_t *pbase, toff_t *psize);
|
2010-03-14 18:22:04 +00:00
|
|
|
static void imb_tiff_DummyUnmapProc(thandle_t fd, tdata_t base, toff_t size);
|
2005-12-02 21:13:14 +00:00
|
|
|
|
|
|
|
|
2005-11-22 18:50:03 +00:00
|
|
|
/* Structure for in-memory TIFF file. */
|
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
|
|
|
typedef struct ImbTIFFMemFile {
|
2015-07-11 23:52:18 +10:00
|
|
|
const unsigned char *mem; /* Location of first byte of TIFF file. */
|
|
|
|
toff_t offset; /* Current offset within the file. */
|
|
|
|
tsize_t size; /* Size of the TIFF file. */
|
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
|
|
|
} ImbTIFFMemFile;
|
2012-05-16 09:26:37 +00:00
|
|
|
#define IMB_TIFF_GET_MEMFILE(x) ((ImbTIFFMemFile *)(x))
|
2005-11-22 18:50:03 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************
|
2012-05-16 23:37:23 +00:00
|
|
|
* Function implementations. *
|
|
|
|
*****************************/
|
2005-11-22 18:50:03 +00:00
|
|
|
|
|
|
|
|
2010-03-14 18:22:04 +00:00
|
|
|
static void imb_tiff_DummyUnmapProc(thandle_t fd, tdata_t base, toff_t size)
|
2005-12-02 21:13:14 +00:00
|
|
|
{
|
2010-10-16 14:32:17 +00:00
|
|
|
(void)fd;
|
|
|
|
(void)base;
|
|
|
|
(void)size;
|
2005-12-02 21:13:14 +00:00
|
|
|
}
|
|
|
|
|
2012-05-16 09:26:37 +00:00
|
|
|
static int imb_tiff_DummyMapProc(thandle_t fd, tdata_t *pbase, toff_t *psize)
|
2005-12-02 21:13:14 +00:00
|
|
|
{
|
2010-10-16 14:32:17 +00:00
|
|
|
(void)fd;
|
|
|
|
(void)pbase;
|
|
|
|
(void)psize;
|
|
|
|
|
|
|
|
return (0);
|
2005-12-02 21:13:14 +00:00
|
|
|
}
|
2005-11-22 18:50:03 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Reads data from an in-memory TIFF file.
|
|
|
|
*
|
2012-03-02 16:05:54 +00:00
|
|
|
* \param handle: Handle of the TIFF file (pointer to ImbTIFFMemFile).
|
2012-09-30 06:12:47 +00:00
|
|
|
* \param data: Buffer to contain data (treat as (void *)).
|
2012-03-02 16:05:54 +00:00
|
|
|
* \param n: Number of bytes to read.
|
2005-11-22 18:50:03 +00:00
|
|
|
*
|
2012-03-02 16:05:54 +00:00
|
|
|
* \return: Number of bytes actually read.
|
2012-05-16 09:26:37 +00:00
|
|
|
* 0 = EOF.
|
2005-11-22 18:50:03 +00:00
|
|
|
*/
|
2010-03-14 18:22:04 +00:00
|
|
|
static tsize_t imb_tiff_ReadProc(thandle_t handle, tdata_t data, tsize_t n)
|
2005-11-22 18:50:03 +00:00
|
|
|
{
|
|
|
|
tsize_t nRemaining, nCopy;
|
2012-05-16 09:26:37 +00:00
|
|
|
ImbTIFFMemFile *mfile;
|
2005-11-22 18:50:03 +00:00
|
|
|
void *srcAddr;
|
|
|
|
|
|
|
|
/* get the pointer to the in-memory file */
|
|
|
|
mfile = IMB_TIFF_GET_MEMFILE(handle);
|
2012-03-24 06:38:07 +00:00
|
|
|
if (!mfile || !mfile->mem) {
|
2007-12-19 23:14:14 +00:00
|
|
|
fprintf(stderr, "imb_tiff_ReadProc: !mfile || !mfile->mem!\n");
|
|
|
|
return 0;
|
|
|
|
}
|
2005-11-22 18:50:03 +00:00
|
|
|
|
|
|
|
/* find the actual number of bytes to read (copy) */
|
|
|
|
nCopy = n;
|
2012-03-24 06:38:07 +00:00
|
|
|
if ((tsize_t)mfile->offset >= mfile->size)
|
2005-11-22 18:50:03 +00:00
|
|
|
nRemaining = 0;
|
|
|
|
else
|
|
|
|
nRemaining = mfile->size - mfile->offset;
|
2018-06-17 17:04:54 +02:00
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (nCopy > nRemaining)
|
2005-11-22 18:50:03 +00:00
|
|
|
nCopy = nRemaining;
|
2018-06-17 17:04:54 +02:00
|
|
|
|
2005-11-22 18:50:03 +00:00
|
|
|
/* on EOF, return immediately and read (copy) nothing */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (nCopy <= 0)
|
2005-11-22 18:50:03 +00:00
|
|
|
return (0);
|
|
|
|
|
|
|
|
/* all set -> do the read (copy) */
|
2012-05-16 09:26:37 +00:00
|
|
|
srcAddr = (void *)(&(mfile->mem[mfile->offset]));
|
|
|
|
memcpy((void *)data, srcAddr, nCopy);
|
|
|
|
mfile->offset += nCopy; /* advance file ptr by copied bytes */
|
2005-11-22 18:50:03 +00:00
|
|
|
return nCopy;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Writes data to an in-memory TIFF file.
|
|
|
|
*
|
|
|
|
* NOTE: The current Blender implementation should not need this function. It
|
|
|
|
* is simply a stub.
|
|
|
|
*/
|
2010-03-14 18:22:04 +00:00
|
|
|
static tsize_t imb_tiff_WriteProc(thandle_t handle, tdata_t data, tsize_t n)
|
2005-11-22 18:50:03 +00:00
|
|
|
{
|
2010-10-16 14:32:17 +00:00
|
|
|
(void)handle;
|
|
|
|
(void)data;
|
|
|
|
(void)n;
|
2018-06-17 17:04:54 +02:00
|
|
|
|
2005-11-22 18:50:03 +00:00
|
|
|
printf("imb_tiff_WriteProc: this function should not be called.\n");
|
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Seeks to a new location in an in-memory TIFF file.
|
|
|
|
*
|
2012-03-02 16:05:54 +00:00
|
|
|
* \param handle: Handle of the TIFF file (pointer to ImbTIFFMemFile).
|
|
|
|
* \param ofs: Offset value (interpreted according to whence below).
|
|
|
|
* \param whence: This can be one of three values:
|
2018-09-02 18:28:27 +10:00
|
|
|
* SEEK_SET - The offset is set to ofs bytes.
|
|
|
|
* SEEK_CUR - The offset is set to its current location plus ofs bytes.
|
|
|
|
* SEEK_END - (This is unsupported and will return -1, indicating an
|
|
|
|
* error).
|
2005-11-22 18:50:03 +00:00
|
|
|
*
|
2012-03-02 16:05:54 +00:00
|
|
|
* \return: Resulting offset location within the file, measured in bytes from
|
2005-11-22 18:50:03 +00:00
|
|
|
* the beginning of the file. (-1) indicates an error.
|
|
|
|
*/
|
2010-03-14 18:22:04 +00:00
|
|
|
static toff_t imb_tiff_SeekProc(thandle_t handle, toff_t ofs, int whence)
|
2005-11-22 18:50:03 +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
|
|
|
ImbTIFFMemFile *mfile;
|
2005-11-22 18:50:03 +00:00
|
|
|
toff_t new_offset;
|
|
|
|
|
|
|
|
/* get the pointer to the in-memory file */
|
|
|
|
mfile = IMB_TIFF_GET_MEMFILE(handle);
|
2012-03-24 06:38:07 +00:00
|
|
|
if (!mfile || !mfile->mem) {
|
2007-12-19 23:14:14 +00:00
|
|
|
fprintf(stderr, "imb_tiff_SeekProc: !mfile || !mfile->mem!\n");
|
|
|
|
return (-1);
|
|
|
|
}
|
2005-11-22 18:50:03 +00:00
|
|
|
|
|
|
|
/* find the location we plan to seek to */
|
|
|
|
switch (whence) {
|
|
|
|
case SEEK_SET:
|
|
|
|
new_offset = ofs;
|
|
|
|
break;
|
|
|
|
case SEEK_CUR:
|
|
|
|
new_offset = mfile->offset + ofs;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
/* no other types are supported - return an error */
|
2018-06-17 17:04:54 +02:00
|
|
|
fprintf(stderr,
|
2012-05-16 09:26:37 +00:00
|
|
|
"imb_tiff_SeekProc: "
|
|
|
|
"Unsupported TIFF SEEK type.\n");
|
2005-11-22 18:50:03 +00:00
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* set the new location */
|
|
|
|
mfile->offset = new_offset;
|
|
|
|
return mfile->offset;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Closes (virtually) an in-memory TIFF file.
|
|
|
|
*
|
|
|
|
* NOTE: All this function actually does is sets the data pointer within the
|
|
|
|
* TIFF file to NULL. That should trigger assertion errors if attempts
|
|
|
|
* are made to access the file after that point. However, no such
|
|
|
|
* attempts should ever be made (in theory).
|
|
|
|
*
|
2012-03-02 16:05:54 +00:00
|
|
|
* \param handle: Handle of the TIFF file (pointer to ImbTIFFMemFile).
|
2005-11-22 18:50:03 +00:00
|
|
|
*
|
2012-03-02 16:05:54 +00:00
|
|
|
* \return: 0
|
2005-11-22 18:50:03 +00:00
|
|
|
*/
|
2010-03-14 18:22:04 +00:00
|
|
|
static int imb_tiff_CloseProc(thandle_t handle)
|
2005-11-22 18:50:03 +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
|
|
|
ImbTIFFMemFile *mfile;
|
2005-11-22 18:50:03 +00:00
|
|
|
|
|
|
|
/* get the pointer to the in-memory file */
|
|
|
|
mfile = IMB_TIFF_GET_MEMFILE(handle);
|
2012-03-24 06:38:07 +00:00
|
|
|
if (!mfile || !mfile->mem) {
|
2012-05-01 20:08:23 +00:00
|
|
|
fprintf(stderr, "imb_tiff_CloseProc: !mfile || !mfile->mem!\n");
|
2007-12-19 23:14:14 +00:00
|
|
|
return (0);
|
|
|
|
}
|
2018-06-17 17:04:54 +02:00
|
|
|
|
2005-11-22 18:50:03 +00:00
|
|
|
/* virtually close the file */
|
|
|
|
mfile->mem = NULL;
|
|
|
|
mfile->offset = 0;
|
|
|
|
mfile->size = 0;
|
2018-06-17 17:04:54 +02:00
|
|
|
|
2005-11-22 18:50:03 +00:00
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the size of an in-memory TIFF file in bytes.
|
|
|
|
*
|
2012-03-02 16:05:54 +00:00
|
|
|
* \return: Size of file (in bytes).
|
2005-11-22 18:50:03 +00:00
|
|
|
*/
|
2010-03-14 18:22:04 +00:00
|
|
|
static toff_t imb_tiff_SizeProc(thandle_t handle)
|
2005-11-22 18:50:03 +00:00
|
|
|
{
|
2012-05-16 09:26:37 +00:00
|
|
|
ImbTIFFMemFile *mfile;
|
2005-11-22 18:50:03 +00:00
|
|
|
|
|
|
|
/* get the pointer to the in-memory file */
|
|
|
|
mfile = IMB_TIFF_GET_MEMFILE(handle);
|
2012-03-24 06:38:07 +00:00
|
|
|
if (!mfile || !mfile->mem) {
|
2012-05-01 20:08:23 +00:00
|
|
|
fprintf(stderr, "imb_tiff_SizeProc: !mfile || !mfile->mem!\n");
|
2007-12-19 23:14:14 +00:00
|
|
|
return (0);
|
|
|
|
}
|
2005-11-22 18:50:03 +00:00
|
|
|
|
|
|
|
/* return the size */
|
|
|
|
return (toff_t)(mfile->size);
|
|
|
|
}
|
|
|
|
|
2015-07-11 23:52:18 +10:00
|
|
|
static TIFF *imb_tiff_client_open(ImbTIFFMemFile *memFile, const unsigned char *mem, size_t 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
|
|
|
{
|
|
|
|
/* open the TIFF client layer interface to the in-memory file */
|
|
|
|
memFile->mem = mem;
|
|
|
|
memFile->offset = 0;
|
|
|
|
memFile->size = size;
|
2005-11-22 18:50:03 +00:00
|
|
|
|
2018-06-17 17:04:54 +02:00
|
|
|
return TIFFClientOpen("(Blender TIFF Interface Layer)",
|
2012-05-16 09:26:37 +00:00
|
|
|
"r", (thandle_t)(memFile),
|
|
|
|
imb_tiff_ReadProc, imb_tiff_WriteProc,
|
|
|
|
imb_tiff_SeekProc, imb_tiff_CloseProc,
|
|
|
|
imb_tiff_SizeProc, imb_tiff_DummyMapProc, imb_tiff_DummyUnmapProc);
|
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
|
|
|
}
|
2005-11-22 18:50:03 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Checks whether a given memory buffer contains a TIFF file.
|
|
|
|
*
|
|
|
|
* This method uses the format identifiers from:
|
|
|
|
* http://www.faqs.org/faqs/graphics/fileformats-faq/part4/section-9.html
|
|
|
|
* The first four bytes of big-endian and little-endian TIFF files
|
|
|
|
* respectively are (hex):
|
2012-05-16 09:26:37 +00:00
|
|
|
* 4d 4d 00 2a
|
|
|
|
* 49 49 2a 00
|
2005-11-22 18:50:03 +00:00
|
|
|
* Note that TIFF files on *any* platform can be either big- or little-endian;
|
|
|
|
* it's not platform-specific.
|
|
|
|
*
|
|
|
|
* AFAICT, libtiff doesn't provide a method to do this automatically, and
|
|
|
|
* hence my manual comparison. - Jonathan Merritt (lancelet) 4th Sept 2005.
|
|
|
|
*/
|
2012-05-16 09:26:37 +00:00
|
|
|
#define IMB_TIFF_NCB 4 /* number of comparison bytes used */
|
2015-07-11 23:52:18 +10:00
|
|
|
int imb_is_a_tiff(const unsigned char *mem)
|
2005-11-22 18:50:03 +00:00
|
|
|
{
|
|
|
|
char big_endian[IMB_TIFF_NCB] = { 0x4d, 0x4d, 0x00, 0x2a };
|
|
|
|
char lil_endian[IMB_TIFF_NCB] = { 0x49, 0x49, 0x2a, 0x00 };
|
|
|
|
|
2015-02-07 04:33:48 +11:00
|
|
|
return ((memcmp(big_endian, mem, IMB_TIFF_NCB) == 0) ||
|
|
|
|
(memcmp(lil_endian, mem, IMB_TIFF_NCB) == 0));
|
2005-11-22 18:50:03 +00:00
|
|
|
}
|
|
|
|
|
2013-10-12 02:19:37 +00:00
|
|
|
static void scanline_contig_16bit(float *rectf, const unsigned short *sbuf, int scanline_w, int spp)
|
2010-05-21 03:25:38 +00:00
|
|
|
{
|
|
|
|
int i;
|
2012-05-16 09:26:37 +00:00
|
|
|
for (i = 0; i < scanline_w; i++) {
|
|
|
|
rectf[i * 4 + 0] = sbuf[i * spp + 0] / 65535.0;
|
|
|
|
rectf[i * 4 + 1] = (spp >= 3) ? sbuf[i * spp + 1] / 65535.0 : sbuf[i * spp + 0] / 65535.0;
|
|
|
|
rectf[i * 4 + 2] = (spp >= 3) ? sbuf[i * spp + 2] / 65535.0 : sbuf[i * spp + 0] / 65535.0;
|
|
|
|
rectf[i * 4 + 3] = (spp == 4) ? (sbuf[i * spp + 3] / 65535.0) : 1.0;
|
2010-05-21 03:25:38 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-10-12 02:19:37 +00:00
|
|
|
static void scanline_contig_32bit(float *rectf, const float *fbuf, int scanline_w, int spp)
|
2010-05-21 03:25:38 +00:00
|
|
|
{
|
|
|
|
int i;
|
2012-05-16 09:26:37 +00:00
|
|
|
for (i = 0; i < scanline_w; i++) {
|
|
|
|
rectf[i * 4 + 0] = fbuf[i * spp + 0];
|
|
|
|
rectf[i * 4 + 1] = (spp >= 3) ? fbuf[i * spp + 1] : fbuf[i * spp + 0];
|
|
|
|
rectf[i * 4 + 2] = (spp >= 3) ? fbuf[i * spp + 2] : fbuf[i * spp + 0];
|
|
|
|
rectf[i * 4 + 3] = (spp == 4) ? fbuf[i * spp + 3] : 1.0f;
|
2010-05-21 03:25:38 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-10-12 02:19:37 +00:00
|
|
|
static void scanline_separate_16bit(float *rectf, const unsigned short *sbuf, int scanline_w, int chan)
|
2010-05-21 03:25:38 +00:00
|
|
|
{
|
|
|
|
int i;
|
2012-05-16 09:26:37 +00:00
|
|
|
for (i = 0; i < scanline_w; i++)
|
|
|
|
rectf[i * 4 + chan] = sbuf[i] / 65535.0;
|
2010-05-21 03:25:38 +00:00
|
|
|
}
|
|
|
|
|
2013-10-12 02:19:37 +00:00
|
|
|
static void scanline_separate_32bit(float *rectf, const float *fbuf, int scanline_w, int chan)
|
2010-05-21 03:25:38 +00:00
|
|
|
{
|
|
|
|
int i;
|
2012-05-16 09:26:37 +00:00
|
|
|
for (i = 0; i < scanline_w; i++)
|
|
|
|
rectf[i * 4 + chan] = fbuf[i];
|
2010-05-21 03:25:38 +00:00
|
|
|
}
|
|
|
|
|
2011-05-13 14:27:12 +00:00
|
|
|
static void imb_read_tiff_resolution(ImBuf *ibuf, TIFF *image)
|
|
|
|
{
|
|
|
|
uint16 unit;
|
|
|
|
float xres;
|
|
|
|
float yres;
|
|
|
|
|
|
|
|
TIFFGetFieldDefaulted(image, TIFFTAG_RESOLUTIONUNIT, &unit);
|
|
|
|
TIFFGetFieldDefaulted(image, TIFFTAG_XRESOLUTION, &xres);
|
|
|
|
TIFFGetFieldDefaulted(image, TIFFTAG_YRESOLUTION, &yres);
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (unit == RESUNIT_CENTIMETER) {
|
2012-05-16 09:26:37 +00:00
|
|
|
ibuf->ppm[0] = (double)xres * 100.0;
|
|
|
|
ibuf->ppm[1] = (double)yres * 100.0;
|
2011-05-13 14:27:12 +00:00
|
|
|
}
|
|
|
|
else {
|
2012-05-16 09:26:37 +00:00
|
|
|
ibuf->ppm[0] = (double)xres / 0.0254;
|
|
|
|
ibuf->ppm[1] = (double)yres / 0.0254;
|
2011-05-13 14:27:12 +00:00
|
|
|
}
|
|
|
|
}
|
2010-05-21 03:25:38 +00:00
|
|
|
|
2018-06-17 17:04:54 +02:00
|
|
|
/*
|
2010-05-21 03:25:38 +00:00
|
|
|
* Use the libTIFF scanline API to read a TIFF image.
|
2018-06-01 18:19:39 +02:00
|
|
|
* This method is most flexible and can handle multiple different bit depths
|
2010-05-21 03:25:38 +00:00
|
|
|
* and RGB channel orderings.
|
|
|
|
*/
|
2012-12-31 13:52:13 +00:00
|
|
|
static int imb_read_tiff_pixels(ImBuf *ibuf, TIFF *image)
|
2010-05-21 03:25:38 +00:00
|
|
|
{
|
2018-01-14 14:19:57 +01:00
|
|
|
ImBuf *tmpibuf = NULL;
|
2012-05-16 09:26:37 +00:00
|
|
|
int success = 0;
|
2010-05-21 03:25:38 +00:00
|
|
|
short bitspersample, spp, config;
|
|
|
|
size_t scanline;
|
2012-05-16 09:26:37 +00:00
|
|
|
int ib_flag = 0, row, chan;
|
|
|
|
float *fbuf = NULL;
|
|
|
|
unsigned short *sbuf = NULL;
|
2011-05-13 14:27:12 +00:00
|
|
|
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFGetField(image, TIFFTAG_BITSPERSAMPLE, &bitspersample);
|
2012-05-16 09:26:37 +00:00
|
|
|
TIFFGetField(image, TIFFTAG_SAMPLESPERPIXEL, &spp); /* number of 'channels' */
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFGetField(image, TIFFTAG_PLANARCONFIG, &config);
|
2011-05-13 14:27:12 +00:00
|
|
|
|
2012-12-31 13:52:13 +00:00
|
|
|
if (spp == 4) {
|
|
|
|
/* HACK: this is really tricky hack, which is only needed to force libtiff
|
|
|
|
* do not touch RGB channels when there's alpha channel present
|
|
|
|
* The thing is: libtiff will premul RGB if alpha mode is set to
|
|
|
|
* unassociated, which really conflicts with blender's assumptions
|
|
|
|
*
|
|
|
|
* Alternative would be to unpremul after load, but it'll be really
|
|
|
|
* lossy and unwanted behavior
|
|
|
|
*
|
|
|
|
* So let's keep this thing here for until proper solution is found (sergey)
|
|
|
|
*/
|
|
|
|
|
|
|
|
unsigned short extraSampleTypes[1];
|
|
|
|
extraSampleTypes[0] = EXTRASAMPLE_ASSOCALPHA;
|
|
|
|
TIFFSetField(image, TIFFTAG_EXTRASAMPLES, 1, extraSampleTypes);
|
|
|
|
}
|
|
|
|
|
2011-05-13 14:27:12 +00:00
|
|
|
imb_read_tiff_resolution(ibuf, image);
|
|
|
|
|
2010-05-21 03:25:38 +00:00
|
|
|
scanline = TIFFScanlineSize(image);
|
2018-06-17 17:04:54 +02:00
|
|
|
|
2010-05-21 03:25:38 +00:00
|
|
|
if (bitspersample == 32) {
|
|
|
|
ib_flag = IB_rectfloat;
|
|
|
|
fbuf = (float *)_TIFFmalloc(scanline);
|
2018-01-14 14:19:57 +01:00
|
|
|
if (!fbuf) {
|
|
|
|
goto cleanup;
|
|
|
|
}
|
2012-03-24 06:38:07 +00:00
|
|
|
}
|
|
|
|
else if (bitspersample == 16) {
|
2010-05-21 03:25:38 +00:00
|
|
|
ib_flag = IB_rectfloat;
|
|
|
|
sbuf = (unsigned short *)_TIFFmalloc(scanline);
|
2018-01-14 14:19:57 +01:00
|
|
|
if (!sbuf) {
|
|
|
|
goto cleanup;
|
|
|
|
}
|
2012-03-24 06:38:07 +00:00
|
|
|
}
|
|
|
|
else {
|
2010-05-21 03:25:38 +00:00
|
|
|
ib_flag = IB_rect;
|
|
|
|
}
|
2018-06-17 17:04:54 +02:00
|
|
|
|
2012-05-16 09:26:37 +00:00
|
|
|
tmpibuf = IMB_allocImBuf(ibuf->x, ibuf->y, ibuf->planes, ib_flag);
|
2018-01-14 14:19:57 +01:00
|
|
|
if (!tmpibuf) {
|
|
|
|
goto cleanup;
|
|
|
|
}
|
2018-06-17 17:04:54 +02:00
|
|
|
|
2010-07-30 13:31:22 +00:00
|
|
|
/* simple RGBA image */
|
|
|
|
if (!(bitspersample == 32 || bitspersample == 16)) {
|
|
|
|
success |= TIFFReadRGBAImage(image, ibuf->x, ibuf->y, tmpibuf->rect, 0);
|
|
|
|
}
|
2010-05-21 03:25:38 +00:00
|
|
|
/* contiguous channels: RGBRGBRGB */
|
2010-07-30 13:31:22 +00:00
|
|
|
else if (config == PLANARCONFIG_CONTIG) {
|
2010-05-21 03:25:38 +00:00
|
|
|
for (row = 0; row < ibuf->y; row++) {
|
2018-01-14 14:19:57 +01:00
|
|
|
size_t ib_offset = (size_t)ibuf->x * 4 * ((size_t)ibuf->y - ((size_t)row + 1));
|
2018-06-17 17:04:54 +02:00
|
|
|
|
2010-05-21 03:25:38 +00:00
|
|
|
if (bitspersample == 32) {
|
2010-07-30 13:31:22 +00:00
|
|
|
success |= TIFFReadScanline(image, fbuf, row, 0);
|
2012-05-16 09:26:37 +00:00
|
|
|
scanline_contig_32bit(tmpibuf->rect_float + ib_offset, fbuf, ibuf->x, spp);
|
2018-06-17 17:04:54 +02:00
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
}
|
|
|
|
else if (bitspersample == 16) {
|
2010-07-30 13:31:22 +00:00
|
|
|
success |= TIFFReadScanline(image, sbuf, row, 0);
|
2012-05-16 09:26:37 +00:00
|
|
|
scanline_contig_16bit(tmpibuf->rect_float + ib_offset, sbuf, ibuf->x, spp);
|
2010-05-21 03:25:38 +00:00
|
|
|
}
|
|
|
|
}
|
2012-05-16 09:26:37 +00:00
|
|
|
/* separate channels: RRRGGGBBB */
|
2012-03-24 06:38:07 +00:00
|
|
|
}
|
|
|
|
else if (config == PLANARCONFIG_SEPARATE) {
|
2018-06-17 17:04:54 +02:00
|
|
|
|
2010-05-21 03:25:38 +00:00
|
|
|
/* imbufs always have 4 channels of data, so we iterate over all of them
|
|
|
|
* but only fill in from the TIFF scanline where necessary. */
|
|
|
|
for (chan = 0; chan < 4; chan++) {
|
|
|
|
for (row = 0; row < ibuf->y; row++) {
|
2018-01-14 14:19:57 +01:00
|
|
|
size_t ib_offset = (size_t)ibuf->x * 4 * ((size_t)ibuf->y - ((size_t)row + 1));
|
2018-06-17 17:04:54 +02:00
|
|
|
|
2010-05-21 03:25:38 +00:00
|
|
|
if (bitspersample == 32) {
|
|
|
|
if (chan == 3 && spp == 3) /* fill alpha if only RGB TIFF */
|
2015-05-05 17:08:29 +10:00
|
|
|
copy_vn_fl(fbuf, ibuf->x, 1.0f);
|
2012-05-03 09:51:12 +00:00
|
|
|
else if (chan >= spp) /* for grayscale, duplicate first channel into G and B */
|
|
|
|
success |= TIFFReadScanline(image, fbuf, row, 0);
|
2010-05-21 03:25:38 +00:00
|
|
|
else
|
2010-07-30 13:31:22 +00:00
|
|
|
success |= TIFFReadScanline(image, fbuf, row, chan);
|
2012-05-16 09:26:37 +00:00
|
|
|
scanline_separate_32bit(tmpibuf->rect_float + ib_offset, fbuf, ibuf->x, chan);
|
2018-06-17 17:04:54 +02:00
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
}
|
|
|
|
else if (bitspersample == 16) {
|
2010-05-21 03:25:38 +00:00
|
|
|
if (chan == 3 && spp == 3) /* fill alpha if only RGB TIFF */
|
2015-05-05 17:08:29 +10:00
|
|
|
copy_vn_ushort(sbuf, ibuf->x, 65535);
|
2012-05-03 09:51:12 +00:00
|
|
|
else if (chan >= spp) /* for grayscale, duplicate first channel into G and B */
|
|
|
|
success |= TIFFReadScanline(image, fbuf, row, 0);
|
2010-05-21 03:25:38 +00:00
|
|
|
else
|
2010-07-30 13:31:22 +00:00
|
|
|
success |= TIFFReadScanline(image, sbuf, row, chan);
|
2012-05-16 09:26:37 +00:00
|
|
|
scanline_separate_16bit(tmpibuf->rect_float + ib_offset, sbuf, ibuf->x, chan);
|
2018-06-17 17:04:54 +02:00
|
|
|
|
2010-05-21 03:25:38 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2010-07-30 13:31:22 +00:00
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (success) {
|
2012-07-07 22:51:57 +00:00
|
|
|
/* Code seems to be not needed for 16 bits tif, on PPC G5 OSX (ton) */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (bitspersample < 16)
|
|
|
|
if (ENDIAN_ORDER == B_ENDIAN)
|
2011-02-14 17:09:02 +00:00
|
|
|
IMB_convert_rgba_to_abgr(tmpibuf);
|
2018-06-17 17:04:54 +02:00
|
|
|
|
2010-07-30 13:31:22 +00:00
|
|
|
/* assign rect last */
|
|
|
|
if (tmpibuf->rect_float)
|
2012-05-16 09:26:37 +00:00
|
|
|
ibuf->rect_float = tmpibuf->rect_float;
|
2012-05-19 13:55:54 +00:00
|
|
|
else
|
2012-05-16 09:26:37 +00:00
|
|
|
ibuf->rect = tmpibuf->rect;
|
2010-07-30 13:31:22 +00:00
|
|
|
ibuf->mall |= ib_flag;
|
|
|
|
ibuf->flags |= ib_flag;
|
2018-06-17 17:04:54 +02:00
|
|
|
|
2010-07-30 13:31:22 +00:00
|
|
|
tmpibuf->mall &= ~ib_flag;
|
2010-05-21 03:25:38 +00:00
|
|
|
}
|
2010-07-30 13:31:22 +00:00
|
|
|
|
2018-01-14 14:19:57 +01:00
|
|
|
cleanup:
|
|
|
|
if (bitspersample == 32)
|
|
|
|
_TIFFfree(fbuf);
|
|
|
|
else if (bitspersample == 16)
|
|
|
|
_TIFFfree(sbuf);
|
|
|
|
|
2010-05-21 03:25:38 +00:00
|
|
|
IMB_freeImBuf(tmpibuf);
|
2018-06-17 17:04:54 +02:00
|
|
|
|
2010-05-21 03:25:38 +00:00
|
|
|
return success;
|
|
|
|
}
|
|
|
|
|
2010-06-01 01:01:25 +00:00
|
|
|
void imb_inittiff(void)
|
|
|
|
{
|
2012-03-31 00:59:17 +00:00
|
|
|
if (!(G.debug & G_DEBUG))
|
2010-06-01 01:01:25 +00:00
|
|
|
TIFFSetErrorHandler(NULL);
|
|
|
|
}
|
|
|
|
|
2005-11-22 18:50:03 +00:00
|
|
|
/**
|
|
|
|
* Loads a TIFF file.
|
2012-03-02 16:05:54 +00:00
|
|
|
* \param mem: Memory containing the TIFF file.
|
|
|
|
* \param size: Size of the mem buffer.
|
|
|
|
* \param flags: If flags has IB_test set then the file is not actually loaded,
|
2005-11-22 18:50:03 +00:00
|
|
|
* but all other operations take place.
|
|
|
|
*
|
2012-03-02 16:05:54 +00:00
|
|
|
* \return: A newly allocated ImBuf structure if successful, otherwise NULL.
|
2005-11-22 18:50:03 +00:00
|
|
|
*/
|
2015-07-11 23:52:18 +10:00
|
|
|
ImBuf *imb_loadtiff(const unsigned char *mem, size_t size, int flags, char colorspace[IM_MAX_SPACE])
|
2005-11-22 18:50:03 +00:00
|
|
|
{
|
|
|
|
TIFF *image = 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
|
|
|
ImBuf *ibuf = NULL, *hbuf;
|
|
|
|
ImbTIFFMemFile memFile;
|
2005-11-22 18:50:03 +00:00
|
|
|
uint32 width, height;
|
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
|
|
|
char *format = NULL;
|
|
|
|
int level;
|
2010-05-21 03:25:38 +00:00
|
|
|
short spp;
|
|
|
|
int ib_depth;
|
2013-07-11 04:38:47 +00:00
|
|
|
int found;
|
2005-12-26 21:43:35 +00:00
|
|
|
|
2005-11-22 18:50:03 +00:00
|
|
|
/* check whether or not we have a TIFF file */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (size < IMB_TIFF_NCB) {
|
2007-12-19 23:14:14 +00:00
|
|
|
fprintf(stderr, "imb_loadtiff: size < IMB_TIFF_NCB\n");
|
|
|
|
return NULL;
|
|
|
|
}
|
2012-03-24 06:38:07 +00:00
|
|
|
if (imb_is_a_tiff(mem) == 0)
|
2005-11-22 18:50:03 +00:00
|
|
|
return NULL;
|
|
|
|
|
Color Management, Stage 2: Switch color pipeline to use OpenColorIO
Replace old color pipeline which was supporting linear/sRGB color spaces
only with OpenColorIO-based pipeline.
This introduces two configurable color spaces:
- Input color space for images and movie clips. This space is used to convert
images/movies from color space in which file is saved to Blender's linear
space (for float images, byte images are not internally converted, only input
space is stored for such images and used later).
This setting could be found in image/clip data block settings.
- Display color space which defines space in which particular display is working.
This settings could be found in scene's Color Management panel.
When render result is being displayed on the screen, apart from converting image
to display space, some additional conversions could happen.
This conversions are:
- View, which defines tone curve applying before display transformation.
These are different ways to view the image on the same display device.
For example it could be used to emulate film view on sRGB display.
- Exposure affects on image exposure before tone map is applied.
- Gamma is post-display gamma correction, could be used to match particular
display gamma.
- RGB curves are user-defined curves which are applying before display
transformation, could be used for different purposes.
All this settings by default are only applying on render result and does not
affect on other images. If some particular image needs to be affected by this
transformation, "View as Render" setting of image data block should be set to
truth. Movie clips are always affected by all display transformations.
This commit also introduces configurable color space in which sequencer is
working. This setting could be found in scene's Color Management panel and
it should be used if such stuff as grading needs to be done in color space
different from sRGB (i.e. when Film view on sRGB display is use, using VD16
space as sequencer's internal space would make grading working in space
which is close to the space using for display).
Some technical notes:
- Image buffer's float buffer is now always in linear space, even if it was
created from 16bit byte images.
- Space of byte buffer is stored in image buffer's rect_colorspace property.
- Profile of image buffer was removed since it's not longer meaningful.
- OpenGL and GLSL is supposed to always work in sRGB space. It is possible
to support other spaces, but it's quite large project which isn't so
much important.
- Legacy Color Management option disabled is emulated by using None display.
It could have some regressions, but there's no clear way to avoid them.
- If OpenColorIO is disabled on build time, it should make blender behaving
in the same way as previous release with color management enabled.
More details could be found at this page (more details would be added soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.64/Color_Management
--
Thanks to Xavier Thomas, Lukas Toene for initial work on OpenColorIO
integration and to Brecht van Lommel for some further development and code/
usecase review!
2012-09-15 10:05:07 +00:00
|
|
|
/* both 8 and 16 bit PNGs are default to standard byte colorspace */
|
|
|
|
colorspace_set_default_role(colorspace, IM_MAX_SPACE, COLOR_ROLE_DEFAULT_BYTE);
|
|
|
|
|
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
|
|
|
image = imb_tiff_client_open(&memFile, mem, size);
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (image == NULL) {
|
2005-11-22 18:50:03 +00:00
|
|
|
printf("imb_loadtiff: could not open TIFF IO layer.\n");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* allocate the image buffer */
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFGetField(image, TIFFTAG_IMAGEWIDTH, &width);
|
|
|
|
TIFFGetField(image, TIFFTAG_IMAGELENGTH, &height);
|
|
|
|
TIFFGetField(image, TIFFTAG_SAMPLESPERPIXEL, &spp);
|
2018-06-17 17:04:54 +02:00
|
|
|
|
2012-05-16 09:26:37 +00:00
|
|
|
ib_depth = (spp == 3) ? 24 : 32;
|
2018-06-17 17:04:54 +02:00
|
|
|
|
2010-10-16 14:32:17 +00:00
|
|
|
ibuf = IMB_allocImBuf(width, height, ib_depth, 0);
|
2012-03-24 06:38:07 +00:00
|
|
|
if (ibuf) {
|
2015-07-13 13:58:17 +02:00
|
|
|
ibuf->ftype = IMB_FTYPE_TIF;
|
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
|
|
|
}
|
|
|
|
else {
|
2018-06-17 17:04:54 +02:00
|
|
|
fprintf(stderr,
|
2012-05-16 09:26:37 +00:00
|
|
|
"imb_loadtiff: could not allocate memory for TIFF "
|
|
|
|
"image.\n");
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFClose(image);
|
2005-11-22 18:50:03 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2012-12-31 13:52:13 +00:00
|
|
|
/* get alpha mode from file header */
|
|
|
|
if (flags & IB_alphamode_detect) {
|
|
|
|
if (spp == 4) {
|
|
|
|
unsigned short extra, *extraSampleTypes;
|
|
|
|
|
2013-07-11 04:38:47 +00:00
|
|
|
found = TIFFGetField(image, TIFFTAG_EXTRASAMPLES, &extra, &extraSampleTypes);
|
2012-12-31 13:52:13 +00:00
|
|
|
|
2013-07-11 04:38:47 +00:00
|
|
|
if (found && (extraSampleTypes[0] == EXTRASAMPLE_ASSOCALPHA)) {
|
2012-12-31 13:52:13 +00:00
|
|
|
ibuf->flags |= IB_alphamode_premul;
|
2013-07-11 04:38:47 +00:00
|
|
|
}
|
2012-12-31 13:52:13 +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 testing, we're done */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (flags & IB_test) {
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFClose(image);
|
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
|
|
|
return ibuf;
|
|
|
|
}
|
2005-11-22 18:50:03 +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
|
|
|
/* detect if we are reading a tiled/mipmapped texture, in that case
|
2012-03-09 18:28:30 +00:00
|
|
|
* we don't read pixels but leave it to the cache to load tiles */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (flags & IB_tilecache) {
|
2012-05-16 09:26:37 +00:00
|
|
|
format = NULL;
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFGetField(image, TIFFTAG_PIXAR_TEXTUREFORMAT, &format);
|
2005-11-22 18:50:03 +00:00
|
|
|
|
2015-01-26 16:03:11 +01:00
|
|
|
if (format && STREQ(format, "Plain Texture") && TIFFIsTiled(image)) {
|
2010-05-21 03:25:38 +00:00
|
|
|
int numlevel = TIFFNumberOfDirectories(image);
|
2005-11-22 18:50:03 +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
|
|
|
/* create empty mipmap levels in advance */
|
2012-05-16 09:26:37 +00:00
|
|
|
for (level = 0; level < numlevel; level++) {
|
2012-03-24 06:38:07 +00:00
|
|
|
if (!TIFFSetDirectory(image, level))
|
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
|
|
|
break;
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (level > 0) {
|
2012-05-16 09:26:37 +00:00
|
|
|
width = (width > 1) ? width / 2 : 1;
|
|
|
|
height = (height > 1) ? height / 2 : 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
|
|
|
|
2012-05-16 09:26:37 +00:00
|
|
|
hbuf = IMB_allocImBuf(width, height, 32, 0);
|
|
|
|
hbuf->miplevel = level;
|
|
|
|
hbuf->ftype = ibuf->ftype;
|
|
|
|
ibuf->mipmap[level - 1] = hbuf;
|
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
|
|
|
}
|
|
|
|
else
|
2012-05-16 09:26:37 +00:00
|
|
|
hbuf = 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
|
|
|
|
2010-05-24 11:40:45 +00:00
|
|
|
hbuf->flags |= IB_tilecache;
|
|
|
|
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFGetField(image, TIFFTAG_TILEWIDTH, &hbuf->tilex);
|
|
|
|
TIFFGetField(image, TIFFTAG_TILELENGTH, &hbuf->tiley);
|
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
|
|
|
|
2012-05-16 09:26:37 +00:00
|
|
|
hbuf->xtiles = ceil(hbuf->x / (float)hbuf->tilex);
|
|
|
|
hbuf->ytiles = ceil(hbuf->y / (float)hbuf->tiley);
|
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
|
|
|
|
|
|
|
imb_addtilesImBuf(hbuf);
|
|
|
|
|
|
|
|
ibuf->miptot++;
|
2005-11-22 18:50:03 +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
|
|
|
}
|
2005-11-22 18:50:03 +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
|
|
|
/* read pixels */
|
2012-12-31 13:52:13 +00:00
|
|
|
if (!(ibuf->flags & IB_tilecache) && !imb_read_tiff_pixels(ibuf, image)) {
|
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
|
|
|
fprintf(stderr, "imb_loadtiff: Failed to read tiff image.\n");
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFClose(image);
|
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
|
|
|
return NULL;
|
2005-11-22 18:50:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* close the client layer interface to the in-memory file */
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFClose(image);
|
2005-11-22 18:50:03 +00:00
|
|
|
|
|
|
|
/* return successfully */
|
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
|
|
|
return ibuf;
|
|
|
|
}
|
|
|
|
|
2015-07-11 23:52:18 +10:00
|
|
|
void imb_loadtiletiff(ImBuf *ibuf, const unsigned char *mem, size_t size, int tx, int ty, unsigned int *rect)
|
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
|
|
|
{
|
|
|
|
TIFF *image = NULL;
|
|
|
|
uint32 width, height;
|
|
|
|
ImbTIFFMemFile memFile;
|
|
|
|
|
|
|
|
image = imb_tiff_client_open(&memFile, mem, size);
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (image == 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
|
|
|
printf("imb_loadtiff: could not open TIFF IO layer for loading mipmap level.\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (TIFFSetDirectory(image, ibuf->miplevel)) { /* allocate the image buffer */
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFGetField(image, TIFFTAG_IMAGEWIDTH, &width);
|
|
|
|
TIFFGetField(image, TIFFTAG_IMAGELENGTH, &height);
|
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
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (width == ibuf->x && height == ibuf->y) {
|
|
|
|
if (rect) {
|
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
|
|
|
/* tiff pixels are bottom to top, tiles are top to bottom */
|
2012-05-16 09:26:37 +00:00
|
|
|
if (TIFFReadRGBATile(image, tx * ibuf->tilex, (ibuf->ytiles - 1 - ty) * ibuf->tiley, rect) == 1) {
|
2012-03-24 06:38:07 +00:00
|
|
|
if (ibuf->tiley > ibuf->y)
|
2012-05-16 09:26:37 +00:00
|
|
|
memmove(rect, rect + ibuf->tilex * (ibuf->tiley - ibuf->y), sizeof(int) * ibuf->tilex * ibuf->y);
|
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
|
|
|
}
|
|
|
|
else
|
|
|
|
printf("imb_loadtiff: failed to read tiff tile at mipmap level %d\n", ibuf->miplevel);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
2011-08-27 03:25:02 +00:00
|
|
|
printf("imb_loadtiff: mipmap level %d has unexpected size %ux%u instead of %dx%d\n", ibuf->miplevel, width, height, ibuf->x, ibuf->y);
|
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
|
|
|
}
|
|
|
|
else
|
|
|
|
printf("imb_loadtiff: could not find mipmap level %d\n", ibuf->miplevel);
|
|
|
|
|
|
|
|
/* close the client layer interface to the in-memory file */
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFClose(image);
|
2005-11-22 18:50:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Saves a TIFF file.
|
|
|
|
*
|
2018-06-01 18:19:39 +02:00
|
|
|
* ImBuf structures with 1, 3 or 4 bytes per pixel (GRAY, RGB, RGBA
|
2005-11-22 18:50:03 +00:00
|
|
|
* respectively) are accepted, and interpreted correctly. Note that the TIFF
|
|
|
|
* convention is to use pre-multiplied alpha, which can be achieved within
|
|
|
|
* Blender by setting "Premul" alpha handling. Other alpha conventions are
|
|
|
|
* not strictly correct, but are permitted anyhow.
|
|
|
|
*
|
2012-03-02 16:05:54 +00:00
|
|
|
* \param ibuf: Image buffer.
|
|
|
|
* \param name: Name of the TIFF file to create.
|
|
|
|
* \param flags: Currently largely ignored.
|
2005-11-22 18:50:03 +00:00
|
|
|
*
|
2012-03-02 16:05:54 +00:00
|
|
|
* \return: 1 if the function is successful, 0 on failure.
|
2005-11-22 18:50:03 +00:00
|
|
|
*/
|
2008-03-10 11:39:37 +00:00
|
|
|
|
2010-11-19 02:14:18 +00:00
|
|
|
int imb_savetiff(ImBuf *ibuf, const char *name, int flags)
|
2005-11-22 18:50:03 +00:00
|
|
|
{
|
|
|
|
TIFF *image = NULL;
|
2008-03-10 11:39:37 +00:00
|
|
|
uint16 samplesperpixel, bitspersample;
|
2005-11-22 18:50:03 +00:00
|
|
|
size_t npixels;
|
|
|
|
unsigned char *pixels = NULL;
|
|
|
|
unsigned char *from = NULL, *to = NULL;
|
2008-03-10 11:39:37 +00:00
|
|
|
unsigned short *pixels16 = NULL, *to16 = NULL;
|
|
|
|
float *fromf = NULL;
|
2011-05-13 14:27:12 +00:00
|
|
|
float xres, yres;
|
2008-03-10 11:39:37 +00:00
|
|
|
int x, y, from_i, to_i, i;
|
2016-01-14 15:02:13 +05:00
|
|
|
int compress_mode = COMPRESSION_NONE;
|
2005-11-22 18:50:03 +00:00
|
|
|
|
|
|
|
/* check for a valid number of bytes per pixel. Like the PNG writer,
|
|
|
|
* the TIFF writer supports 1, 3 or 4 bytes per pixel, corresponding
|
|
|
|
* to gray, RGB, RGBA respectively. */
|
2011-11-21 20:47:19 +00:00
|
|
|
samplesperpixel = (uint16)((ibuf->planes + 7) >> 3);
|
2012-03-24 06:38:07 +00:00
|
|
|
if ((samplesperpixel > 4) || (samplesperpixel == 2)) {
|
2007-12-19 23:14:14 +00:00
|
|
|
fprintf(stderr,
|
2012-05-16 09:26:37 +00:00
|
|
|
"imb_savetiff: unsupported number of bytes per "
|
|
|
|
"pixel: %d\n", samplesperpixel);
|
2005-11-22 18:50:03 +00:00
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
|
2015-07-13 13:58:17 +02:00
|
|
|
if ((ibuf->foptions.flag & TIF_16BIT) && ibuf->rect_float)
|
2008-03-10 11:39:37 +00:00
|
|
|
bitspersample = 16;
|
|
|
|
else
|
|
|
|
bitspersample = 8;
|
|
|
|
|
2016-01-14 15:02:13 +05:00
|
|
|
if (ibuf->foptions.flag & TIF_COMPRESS_DEFLATE)
|
|
|
|
compress_mode = COMPRESSION_DEFLATE;
|
|
|
|
else if (ibuf->foptions.flag & TIF_COMPRESS_LZW)
|
|
|
|
compress_mode = COMPRESSION_LZW;
|
|
|
|
else if (ibuf->foptions.flag & TIF_COMPRESS_PACKBITS)
|
|
|
|
compress_mode = COMPRESSION_PACKBITS;
|
|
|
|
|
2005-11-22 18:50:03 +00:00
|
|
|
/* open TIFF file for writing */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (flags & IB_mem) {
|
2005-11-22 18:50:03 +00:00
|
|
|
/* bork at the creation of a TIFF in memory */
|
2007-12-19 23:14:14 +00:00
|
|
|
fprintf(stderr,
|
2012-05-16 09:26:37 +00:00
|
|
|
"imb_savetiff: creation of in-memory TIFF files is "
|
|
|
|
"not yet supported.\n");
|
2005-11-22 18:50:03 +00:00
|
|
|
return (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
|
|
|
}
|
|
|
|
else {
|
2005-11-22 18:50:03 +00:00
|
|
|
/* create image as a file */
|
2012-08-22 13:10:37 +00:00
|
|
|
#ifdef WIN32
|
|
|
|
wchar_t *wname = alloc_utf16_from_8(name, 0);
|
|
|
|
image = TIFFOpenW(wname, "w");
|
|
|
|
free(wname);
|
|
|
|
#else
|
2010-05-21 03:25:38 +00:00
|
|
|
image = TIFFOpen(name, "w");
|
2012-08-22 13:10:37 +00:00
|
|
|
#endif
|
2005-11-22 18:50:03 +00:00
|
|
|
}
|
2012-03-24 06:38:07 +00:00
|
|
|
if (image == NULL) {
|
2007-12-19 23:14:14 +00:00
|
|
|
fprintf(stderr,
|
2012-05-16 09:26:37 +00:00
|
|
|
"imb_savetiff: could not open TIFF for writing.\n");
|
2005-11-22 18:50:03 +00:00
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* allocate array for pixel data */
|
|
|
|
npixels = ibuf->x * ibuf->y;
|
2012-03-24 06:38:07 +00:00
|
|
|
if (bitspersample == 16)
|
2012-05-16 09:26:37 +00:00
|
|
|
pixels16 = (unsigned short *)_TIFFmalloc(npixels *
|
|
|
|
samplesperpixel * sizeof(unsigned short));
|
2008-03-10 11:39:37 +00:00
|
|
|
else
|
2012-05-16 09:26:37 +00:00
|
|
|
pixels = (unsigned char *)_TIFFmalloc(npixels *
|
|
|
|
samplesperpixel * sizeof(unsigned char));
|
2008-03-10 11:39:37 +00:00
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (pixels == NULL && pixels16 == NULL) {
|
2007-12-19 23:14:14 +00:00
|
|
|
fprintf(stderr,
|
2012-05-16 09:26:37 +00:00
|
|
|
"imb_savetiff: could not allocate pixels array.\n");
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFClose(image);
|
2005-11-22 18:50:03 +00:00
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
|
2008-03-10 11:39:37 +00:00
|
|
|
/* setup pointers */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (bitspersample == 16) {
|
2008-03-10 11:39:37 +00:00
|
|
|
fromf = ibuf->rect_float;
|
|
|
|
to16 = pixels16;
|
|
|
|
}
|
|
|
|
else {
|
2012-05-16 09:26:37 +00:00
|
|
|
from = (unsigned char *)ibuf->rect;
|
2008-03-10 11:39:37 +00:00
|
|
|
to = pixels;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* setup samples per pixel */
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFSetField(image, TIFFTAG_BITSPERSAMPLE, bitspersample);
|
|
|
|
TIFFSetField(image, TIFFTAG_SAMPLESPERPIXEL, samplesperpixel);
|
2005-11-22 18:50:03 +00:00
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (samplesperpixel == 4) {
|
2012-12-31 13:52:13 +00:00
|
|
|
unsigned short extraSampleTypes[1];
|
|
|
|
|
|
|
|
if (bitspersample == 16)
|
|
|
|
extraSampleTypes[0] = EXTRASAMPLE_ASSOCALPHA;
|
|
|
|
else
|
|
|
|
extraSampleTypes[0] = EXTRASAMPLE_UNASSALPHA;
|
|
|
|
|
2008-03-10 11:39:37 +00:00
|
|
|
/* RGBA images */
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFSetField(image, TIFFTAG_EXTRASAMPLES, 1,
|
2012-05-16 09:26:37 +00:00
|
|
|
extraSampleTypes);
|
2018-06-17 17:04:54 +02:00
|
|
|
TIFFSetField(image, TIFFTAG_PHOTOMETRIC,
|
2012-05-16 09:26:37 +00:00
|
|
|
PHOTOMETRIC_RGB);
|
2008-03-10 11:39:37 +00:00
|
|
|
}
|
2012-03-24 06:38:07 +00:00
|
|
|
else if (samplesperpixel == 3) {
|
2008-03-10 11:39:37 +00:00
|
|
|
/* RGB images */
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFSetField(image, TIFFTAG_PHOTOMETRIC,
|
2012-05-16 09:26:37 +00:00
|
|
|
PHOTOMETRIC_RGB);
|
2008-03-10 11:39:37 +00:00
|
|
|
}
|
2012-03-24 06:38:07 +00:00
|
|
|
else if (samplesperpixel == 1) {
|
2012-07-03 19:09:07 +00:00
|
|
|
/* grayscale images, 1 channel */
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFSetField(image, TIFFTAG_PHOTOMETRIC,
|
2012-05-16 09:26:37 +00:00
|
|
|
PHOTOMETRIC_MINISBLACK);
|
2008-03-10 11:39:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* copy pixel data. While copying, we flip the image vertically. */
|
2017-10-02 13:44:13 +05:00
|
|
|
const int channels_in_float = ibuf->channels ? ibuf->channels : 4;
|
2012-03-24 06:38:07 +00:00
|
|
|
for (x = 0; x < ibuf->x; x++) {
|
|
|
|
for (y = 0; y < ibuf->y; y++) {
|
2017-10-02 13:44:13 +05:00
|
|
|
from_i = ((size_t)channels_in_float) * (y * ibuf->x + x);
|
2012-05-16 09:26:37 +00:00
|
|
|
to_i = samplesperpixel * ((ibuf->y - y - 1) * ibuf->x + x);
|
2008-03-10 11:39:37 +00:00
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (pixels16) {
|
2010-05-18 07:28:44 +00:00
|
|
|
/* convert from float source */
|
2012-05-04 09:25:09 +00:00
|
|
|
float rgb[4];
|
2017-10-02 13:44:13 +05:00
|
|
|
|
|
|
|
if (channels_in_float == 3 || channels_in_float == 4) {
|
|
|
|
if (ibuf->float_colorspace ||
|
|
|
|
(ibuf->colormanage_flag & IMB_COLORMANAGE_IS_DATA))
|
|
|
|
{
|
|
|
|
/* Float buffer was managed already, no need in color
|
|
|
|
* space conversion.
|
|
|
|
*/
|
|
|
|
copy_v3_v3(rgb, &fromf[from_i]);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* Standard linear-to-srgb conversion if float buffer
|
|
|
|
* wasn't managed.
|
|
|
|
*/
|
|
|
|
linearrgb_to_srgb_v3_v3(rgb, &fromf[from_i]);
|
|
|
|
}
|
|
|
|
if (channels_in_float == 4) {
|
|
|
|
rgb[3] = fromf[from_i + 3];
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
rgb[3] = 1.0f;
|
|
|
|
}
|
2012-09-24 11:56:07 +00:00
|
|
|
}
|
|
|
|
else {
|
2017-10-02 13:44:13 +05:00
|
|
|
if (ibuf->float_colorspace ||
|
|
|
|
(ibuf->colormanage_flag & IMB_COLORMANAGE_IS_DATA))
|
|
|
|
{
|
|
|
|
rgb[0] = fromf[from_i];
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
rgb[0] = linearrgb_to_srgb(fromf[from_i]);
|
|
|
|
}
|
|
|
|
rgb[1] = rgb[2] = rgb[0];
|
|
|
|
rgb[3] = 1.0f;
|
2012-09-24 11:56:07 +00:00
|
|
|
}
|
2010-05-18 07:28:44 +00:00
|
|
|
|
2012-05-04 09:25:09 +00:00
|
|
|
for (i = 0; i < samplesperpixel; i++, to_i++)
|
2018-05-07 17:31:28 +02:00
|
|
|
to16[to_i] = unit_float_to_ushort_clamp(rgb[i]);
|
2008-03-10 11:39:37 +00:00
|
|
|
}
|
|
|
|
else {
|
2012-03-24 06:38:07 +00:00
|
|
|
for (i = 0; i < samplesperpixel; i++, to_i++, from_i++)
|
2005-11-22 18:50:03 +00:00
|
|
|
to[to_i] = from[from_i];
|
|
|
|
}
|
2008-03-10 11:39:37 +00:00
|
|
|
}
|
2005-11-22 18:50:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* write the actual TIFF file */
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFSetField(image, TIFFTAG_IMAGEWIDTH, ibuf->x);
|
|
|
|
TIFFSetField(image, TIFFTAG_IMAGELENGTH, ibuf->y);
|
|
|
|
TIFFSetField(image, TIFFTAG_ROWSPERSTRIP, ibuf->y);
|
2016-01-14 15:02:13 +05:00
|
|
|
TIFFSetField(image, TIFFTAG_COMPRESSION, compress_mode);
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFSetField(image, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB);
|
|
|
|
TIFFSetField(image, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
|
2011-05-13 14:27:12 +00:00
|
|
|
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (ibuf->ppm[0] > 0.0 && ibuf->ppm[1] > 0.0) {
|
2012-05-16 09:26:37 +00:00
|
|
|
xres = (float)(ibuf->ppm[0] * 0.0254);
|
|
|
|
yres = (float)(ibuf->ppm[1] * 0.0254);
|
2011-05-13 14:27:12 +00:00
|
|
|
}
|
|
|
|
else {
|
2012-06-27 19:28:44 +00:00
|
|
|
xres = yres = IMB_DPI_DEFAULT;
|
2011-05-13 14:27:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TIFFSetField(image, TIFFTAG_XRESOLUTION, xres);
|
|
|
|
TIFFSetField(image, TIFFTAG_YRESOLUTION, yres);
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFSetField(image, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH);
|
2012-03-24 06:38:07 +00:00
|
|
|
if (TIFFWriteEncodedStrip(image, 0,
|
2012-05-16 09:26:37 +00:00
|
|
|
(bitspersample == 16) ? (unsigned char *)pixels16 : pixels,
|
2014-03-28 15:21:49 +06:00
|
|
|
(size_t)ibuf->x * ibuf->y * samplesperpixel * bitspersample / 8) == -1)
|
2012-05-20 19:49:27 +00:00
|
|
|
{
|
2007-12-19 23:14:14 +00:00
|
|
|
fprintf(stderr,
|
2012-05-16 09:26:37 +00:00
|
|
|
"imb_savetiff: Could not write encoded TIFF.\n");
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFClose(image);
|
2012-03-24 06:38:07 +00:00
|
|
|
if (pixels) _TIFFfree(pixels);
|
|
|
|
if (pixels16) _TIFFfree(pixels16);
|
2005-11-22 18:50:03 +00:00
|
|
|
return (1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* close the TIFF file */
|
2010-05-21 03:25:38 +00:00
|
|
|
TIFFClose(image);
|
2012-03-24 06:38:07 +00:00
|
|
|
if (pixels) _TIFFfree(pixels);
|
|
|
|
if (pixels16) _TIFFfree(pixels16);
|
2005-11-22 18:50:03 +00:00
|
|
|
return (1);
|
|
|
|
}
|