Show in Contents
Add to Favorites
Home: Autodesk Maya Online Help
Appendix E: API and Devkit limitations
Appendices
Environment Variables
Appendix F: Adding Image Plug-ins
Maya features an external plug-in module mechanism
that lets you create your own image file translators. This system
is specific for adding new image types to Maya and is different
from the Maya API. These plug-in modules are available whenever
you start your application. You can access them through the list
of image file types presented where you access image files.
Plug-in image modules are implemented as dynamically
shared objects (DSOs or DLLs), and can be written using C or C++.
You only need to implement the algorithms that read and write the
image files; the user interface and flow control are implicitly
handled by Maya.
This document describes the protocol for writing
an image plug-in module. It does not describe how to support multiple-frame
or movie files. Sample code is provided in the image subdirectory
of the Developer’s Kit.
This section discusses the following:
Once you have written your image file format
plug-in, you need to compile it and create a shared object that
can be loaded into Maya. We provide a Makefile and buildconfig in
our Developer’s Kit for building the example using the gcc compiler.
On Windows, a solution and project file is provided for building
the image plug-in with Visual C++. You must first set MAYA_LOCATION
before building the image plug-in example. The plug-in that is built
must be copied to the $MAYA_LOCATION/bin/plug-ins/image directory
before Maya has access to this new image format. Image plug-ins must
be built with the compiler and linker flags we provide so that they
can be loaded into Maya.
Overview
Maya invokes functions from your image plug-in
primarily to read and write image files. One of the places where
this can happen is in the rendering window. In this window, you
can choose to save your image as a certain format. In addition,
you can load an existing rendering image into this window. You are
able to select a custom format that you have defined for the read
and write operations of this window.
About entry points
Each plug-in must have a defined number of entry
points.Maya uses these entry points to determine which features
the image plug-in supports.
Some entry points are variables and others are
functions. For example, the name of the plug-in is defined by the
variable entry point imageName, and
the function that opens an image file for reading is defined by
the function entry point imageReadOpen.
Some entry points are required, while others
are optional. The mandatory entry points are described in the next
section. Optional entry points are described in "Optional entry
points."
TipFor your plug-in to be compatible with Maya,
you only need to implement the mandatory entry points. The optional
entry points of your plug-in may not be invoked by Maya, and therefore
are not required.
Mandatory entry points
The following entry points must be defined:
If a mandatory entry point is omitted, the plug-in
will not be loaded, and its name will not appear in any menu.
program
- Definition
-
- Description
-
This entry point specifies the applications
that can use the plug-in. This should be Wavefront so that all of
your applications can read and write image files supported by this
plug-in.
NoteDefinition of this entry point is mandatory.
- Example
-
char *program = "Wavefront";
type
- Definition
-
- Description
-
This entry point denotes the type of plug-in
that is being built. A Maya image file plug-in is of type image.
NoteDefinition of this entry point is mandatory.
- Example
-
version
- Definition
-
- Description
-
This entry point denotes the version of the protocol
for which the plug-in was written. Always use IMF_PROTOCOL_CURRENT.
NoteDefinition of this entry point is mandatory.
- Example
-
char *version = IMF_PROTOCOL_CURRENT;
imageKey
- Definition
-
- Description
-
This entry point specifies a unique key to identify
your plug-in.
NoteDefinition of this entry point is mandatory.
- Example
-
char *imageKey = "myFormat";
imageName
- Definition
-
- Description
-
This entry point defines the name of your plug-in
as displayed in menus. Names should be unique so users can distinguish
between them.
NoteDefinition of this entry point is mandatory.
- Example
-
char *imageName = "My
Image Format";
imageReadOpen
- Definition
-
int imageReadOpen
(
IMF_OBJECT *imf
}
Parameter |
Type |
Description |
imf |
Modified
|
Image File Header
|
Return Value |
|
IMF_C_NORMAL if
the image was successfully opened; IMF_C_ if
an error occurred.
|
- Description
-
This function is called when a file is to be opened
for reading.
The imf parameter
contains all of the information necessary for the reading of the
file. Before calling imageReadOpen,
it contains the filename. After executing this routine, it must also
contain pointers to the routines which access the file, information
about the size and other attributes of the image being read, buffers to
read scanlines of the image into, etc.
The basic steps to writing this function are
as follows:
- Open
the file.
- Read
the header from the file. If the file includes a look-up table,
read it at this time.
- Assign
the close, scanline read, and LUT read routines into imf.
- Define
the parameters of the image in imf->info.image[0].
- Allocate
buffers to contain the scanlines.
- Allocate
private data defining the file descriptor, etc., and associate them with imf->data.
Some image files may contain multiple images,
e.g., the full image and a thumbnail representation. For this discussion,
we will assume that you will only be reading the main image from
such files.
The detailed steps are as follows:
- If
the filename is not fully qualified, complete it. Then, open the
specified file. Continue only if the open was successful. If it
fails, you must generate a message using ERR_printf,
set imf__err to IMF_C_CANNOT_OPEN, and return FALSE.
- Set
the image count to be 1, and allocate and initialize one image structure to
contain information about this image:
imf->info.count = 1;
imf->info.image = malloc( sizeof( IMF_IMAGE ) );
(void) imf__init_ifd( imf );
- Save
the format-specific information describing the file in your own
data structure allocated using malloc.
This private data structure can contain items like the current file
descriptor, last scanline read, active window, etc.:
private = malloc( sizeof( PRIVATE ) );
private->... = ...;
imf->data = malloc( sizeof( POINTER ) );
imf->data[0] = private;
- Assign
your image access routines to imf->scan and imf->close. If your image file contains
a look-up table, also specify the routine that reads the look-up
table in imf->lut_read.
- If
your file format defines input capabilities, extract those from imf->info.settings. (See
IMF_CAPABILITY for
details.)
- Read
the header information from the file, and store this in your private data
structure. You must also define various fields in the imf->info and imf->info.image[0] data
structures.
In the imf->info structure,
set the lut_exists field according
to whether the image has a look-up table.
You can also set program, machine, user, date, time, frame number, job_num,
and chromaticity information (red_pri, green_pri, blue_pri, white_pt) if these are stored in the
file itself.
You must also set all of the fields in imf->info.image[0]. The aux_format, aux_count, aux_type, and aux_bits fields
refer to z channel information. The field curve.gamma needs
to be set to either the gamma defined in your file, or the default
gamma by calling IMF_def_input_gamma.
- Allocate
a scanline buffer into which your scanline reading routine reads a
row of pixels:
private_data_ptr->buffer = IMF_chan_alloc(
imf->info.image, image_width,
imf->info.key, NULL );
- Return TRUE if your function successfully
opened and read the image file header, and FALSE if
an error occurred.
NoteDefinition of this entry point is mandatory.
Scanline reading function
- Definition
-
int your_scan_read_func
(
POINTER data,
int scan,
POINTER **line_buff
)
Parameter |
Type |
Description |
data |
Input
|
The private data associated with your image.
|
scan |
Input |
The scanline to read.
|
line_buff |
Output |
The scanline buffer allocated in imageReadOpen, containing the row of
pixels read.
|
Return Value |
|
IMF_C_BAD_SCAN if
scan is outside the image; IMF_C_NORMAL if
the scanline was successfully read; and IMF_C_READ_ERR if
an error occurred.
|
- Description
-
This function is called by Maya to read a scanline
from your image file. Image files are read according to the image's
orientation, either from bottom to top, or from top to bottom.
Follow these steps to create your scanline reading
function:
- Read
the specified scanline. The scanline number is based on bottom-to-top
ordering. For example, if your image size is 480 lines, and your
orientation is IMF_C_TOP_LEFT,
the scanlines are read in the order 479 (top), 478 (second from
top), 477, ... 0 (bottom). If the ordering is IMF_C_BOT_LEFT, they
are read in the order 0 (bottom), 1 (second from bottom), 2, ...
479 (top).
- Transfer
the scanline into the buffer allocated in imageReadOpen.
The buffer allocated by IMF_chan_alloc contains
8-, 16-, or 32-bit unsigned numbers, according to the number of
bits per channel in the file. (The number of bits per channel is
rounded up to the nearest number above.)
Each component of the scanline is stored in
a separate contiguous buffer. These are returned in the parameter line_buff, which is an array of pointers
to the components that you allocated:
/*
* Unsigned char's are
used for 1 to 8-bit values;
* unsigned short's, for
8 to 16-bit values;
* unsigned long's, for
17 to 32-bit values.
*/
*line_buff = data->buffer;
pr = (unsigned char *)
data->buffer[0];
pg = (unsigned char *)
data->buffer[1];
pb = (unsigned char *)
data->buffer[2];
pm = (unsigned char *)
data->buffer[3];
for ( i = 0; i < data->image_width;
++i )
{
*(pr++) = red_values[i];
*(pg++) = green_values[i];
*(pb++) = blue_values[i];
*(pm++) = matte_values[i];
}
If the file contains a look-up table, you must
still return RGB data, and not the indexes into the look-up table,
in line_buff.
- Return IMF_C_BAD_SCAN, IMF_C_NORMAL,
or IMF_C_READ_ERR as
appropriate.
Your scanline reading function must not expect
to read the last scanline of the image because Maya may skip the
last few scanlines if they do not need to be read. Your plug-in
must allow Maya to call your close function at any time after calling imageReadOpen.
Close function
- Definition
-
int your_close_func
(
IMF_OBJECT *imf
)
Parameter |
Type |
Description |
imf |
Modified
|
Image file descriptor.
|
Return Value |
|
IMF_C_NORMAL if
file closing and memory de-allocation was successful; IMF_C_failure_code if error occurred
(for example IMF_C_WRITE_ERR).
|
Description
This function is called whenever Maya is finished
reading or writing your image file. Follow these steps to create
your close function:
- Close
the image file.
- Deallocate
any private data pointed to by imf->data and
set imf->data to NULL. To deallocate the scanline buffer
allocated in either imageReadOpen or imageWriteOpen, use IMF_chan_free.
- Return IMF_C_NORMAL if file closing and memory
clean-up is successful, and IMF_C_failure_code if
not.
imageWriteOpen
- Definition
-
int imageWriteOpen
(
IMF_OBJECT *imf
)
Parameter |
Type |
Description |
imf |
Modified
|
Image file descriptor.
|
Return Value |
|
TRUE if the image
was successfully opened; FALSE if
an error occurred.
|
- Description
-
This function is called when a file is to be opened
for writing.
The imf parameter
contains all of the information necessary to write the file. Before calling imageWriteOpen, it contains the filename.
After executing this routine, it must also contain pointers to the
routines that access the file, information about the size and other attributes
of the image being written, etc.
The basic steps to creating this function are
as follows:
- Open
the file.
- Write
the header. If the file includes a look-up table, you may need to
write it at this time.
- Assign
the close and scanline write routines
to imf.
- Allocate
private data defining the file descriptor, etc., and associate them with imf->data.
Detailed steps are as follows:
- Open
the specified file. Continue only if the open was successful. If
it fails, you must generate a message using ERR_printf,
set imf__err to IMF_C_CANNOT_OPEN, and return FALSE.
- Use imf->info and imf->info.image[0] to
extract attributes about the file being written.
- Save
the format-specific information describing the file in your own
data structure allocated using malloc.
This private data structure can contain items like the current file
descriptor, active window, etc.:
private = malloc( sizeof( PRIVATE ) );
private->... = ...;
imf->data = malloc( sizeof( POINTER ) );
imf->data[0] = private;
- Specify
the image access routines in imf->scan and imf->close.
- If
your file format defines output capabilities, extract those from imf->info.settings. (See
IMF_CAPABILITY for
details.)
- Write
the file header and look-up table, if defined.
- Return IMF_C_NORMAL if your function successfully
opened and read the image file header. Return IMF_C_failure_code if
an error occurred.
In the event of a failed attempt at opening
an image file, Maya calls imf__free_obj(
imf ) to free the IMF_OBJECT passed
to imageWriteOpen. Therefore,
you must not call imf__free_obj in
your error-handling code.
NoteDefinition of this entry point is mandatory.
Scanline writing function
- Definition
-
int your_scan_write_func
(
POINTER data,
int scan,
POINTER *line_buff
)
Parameter |
Type |
Description |
data |
Input
|
The private data associated with your image.
|
scan |
Input |
The scanline to be written.
|
line_buff |
Output |
Buffer containing the pixels for the current
scanline.
|
Return Value |
|
IMF_C_BAD_SCAN if
scan is outside the image; IMF_C_NORMAL if
the scanline is successfully written; and IMF_C_WRITE_ERR if
an error occurs.
|
- Description
-
This function is called by Maya to write a scanline
to your image file. Image files are written according to the image's
orientation, either from bottom to top, or from top to bottom.
Follow these steps to create your scanline writing
function:
- Write
the specified scanline. The scanline number is based on bottom-to-top
ordering. For example, if your image size is 480 lines, and your
orientation is IMF_C_TOP_LEFT,
the scanlines are written in the order 479 (top), 478 (second from
top), 477, ... 0 (bottom). If the ordering is IMF_C_BOT_LEFT,
they are written in the order 0 (bottom), 1 (second from bottom),
2, ... 479 (top).
- Retrieve
the red color channel information from line_buff[0],
green from line_buff[1], and
blue from line_buff[2], where line_buff is the scanline buffer passed
in by Maya. If there is a matte channel, it is in line_buff[3]. The z channel, if it
exists, is in line_buff[4]. The
pixels are stored from left to right.
pr = (unsigned char *) line_buff[0];
pg = (unsigned char *) line_buff[1];
pb = (unsigned char *) line_buff[2];
pm = (unsigned char *) line_buff[3];
for ( i = 0; i < data->image_width; ++i )
{
red_values[i] = *(pr++);
green_values[i] = *(pg++);
blue_values[i] = *(pb++);
matte_values[i] = *(pm++);
}
Convert the values to the format used by your
file format and write the scanline to the file.
- Return IMF_C_BAD_SCAN, IMF_C_NORMAL,
or IMF_C_READ_ERR.
Optional entry points
A number of additional entry points exist. If
an optional entry point is not defined, a default value is used.
Some optional entry points are ignored unless the feature is supported
by your file format.
imageAccess
- Definition
-
- Description
-
This variable specifies the reading and writing methods
that your plug-in supports. The constants described are bit fields:
imageBitsPerChannel
- Definition
-
unsigned int imageBitsPerChannel
- Description
-
This variable defines the number of bits per color
channel that are supported. This applies to the red, green, and
blue channels only.
This variable is a bit field, used to define
the number of bits (from 1 to 32) that each channel can support.
Setting the lowest bit indicates that the format supports 1 bit
per color channel; setting the highest bit indicates that the format supports
32 bits per color channel. You need to set bits in this variable
according to all of the bits-per-channel that your format supports.
The default value is 0x00000080,
or 8 bits per color channel.
- Example
-
The first example supports only 8 bits per color channel;
the second example supports 8, 10, and 16 bits.
unsigned int imageBitsPerChannel
= 0x00000080;
unsigned int imageBitsPerChannel
= 0x00008280;
imageBitsPerMatte
- Definition
-
unsigned int imageBitsPerMatte;
- Description
-
This variable is identical to imageBitsPerChannel, except that it
describes the number of bits supported by the matte channel.
The default value is 0x00000000,
which means that the format does not support matte channels.
- Example
-
The first example supports only 8 bits in the matte
channel; the second example supports 8, 10, and 16 bits.
unsigned int imageBitsPerMatte
= 0x00000080;
unsigned int imageBitsPerMatte
= 0x00008280;
imageBitsPerZChannel
- Definition
-
unsigned int imageBitsPerZChannel
- Description
-
This variable is identical to imageBitsPerChannel, except that it
describes the number of bits supported by the z channel.
The default value is 0x00000000,
which means that the format does not support z channels.
- Example
-
The first example supports only 8 bits in the
z channel; the second example supports 8, 10, and 16 bits.
unsigned int imageBitsPerZChannel
= 0x00000080;
unsigned int imageBitsPerZChannel
= 0x00008280;
imageCapability
- Definition
-
void imageCapability
(
IMF_CAPABILITY **capabilities,
int *num_input,
int *num_output,
int *total
)
Parameter |
Type |
Description |
capabilities |
Output
|
Returns a pointer to the capabilities for this
file type.
|
num_input |
Output |
The number of capabilities applicable to file
reading.
|
num_output |
Output |
The number of capabilities applicable to file
writing.
|
total |
Output |
The total number of capabilities.
|
- Description
-
This function is called during initialization when
Maya determines the capabilities to display in its menus. For more
information on capabilities, see
IMF_CAPABILITY.
- Example
-
This generic code fragment loops through your plug-in's
list of capabilities:
int i;
*capabilities = your_capabilities;
for ( *num_input = *num_output
= *total = i = 0;
i < number_elements_in(
your_capabilities );
++i )
{
if ( your_capabilities[i].imc_when_avail
& IMF_CAPABILITY_WHEN_INPUT
)
{
++( *num_input );
}
if ( your_capabilities[i].imc_when_avail
& IMF_CAPABILITY_WHEN_OUTPUT
)
{
++( *num_output );
}
if ( your_capabilities[i].imc_when_avail
& ( IMF_CAPABILITY_WHEN_INPUT
| IMF_CAPABILITY_WHEN_OUTPUT
) )
{
++( *total );
}
}
imageDescription
- Definition
-
- Description
-
This variable is a string used to provide a
more detailed description of the file format. It augments the imageName when displayed in menus.
The default value is NULL,
which means that no additional description exists.
- Example
-
char *imageDescription
= "Version 2";
imageDone
- Definition
-
- Description
-
This optional routine is called when you exit Maya.
If your plug-in requires special licensing, you should also release
the license at this point.
imageExtension
- Definition
-
- Description
-
This variable defines the default extension
when generating filenames for your plug-in. It must include the
preceding period. The default value is NULL,
which indicates that the format does not typically use an extension.
This variable is used to determine the format
of the image file when the file type is defined as Determine from extension.
- Example
-
char *imageExtension =
".gif";
imageFormatString
- Definition
-
- Description
-
This variable defines the default format of
the filename, and includes the root name, frame number, and extension.
It uses the same notation as sprintf.
The first %s in
the variable is used for the root name; the %d is
used for the frame number; and the second %s is
used for the extension. The default value is %s.%04.4d.%s.
- Example
-
This example defines a syntax where the root name
is immediately followed by the non-zero padded frame number, and
then followed by the period-separated extension.
char *imageFormatString
= "%s%d.%s";
imageHardLinkDuplicates (UNIX only??)
- Definition
-
BOOLEAN imageHardLinkDuplicates
- Description
-
This variable indicates whether Maya should create
hard links to identical files that are created in a sequence. For
example, if image.1.ext, image.2.ext, and image.3.ext are
identical, setting this variable to TRUE allows Maya
to create only one file, but make hard links from the other two
files to the newly created one. If this variable were FALSE, three separate but identical
files would be created.
The default value is TRUE.
- Example
-
BOOLEAN imageHardLinkDuplicates
= FALSE;
imageInit
- Definition
-
- Description
-
If defined, this routine is invoked before your plug-in’s
functionality is added to Maya. If the return value is TRUE, the plug-in is loaded as usual.
However, if it returns FALSE,
the plug-in is unloaded.
This initialization routine can be used in conjunction
with the imageDone routine
to provide a means of opening and closing any licensing schemes
that you implement. If the plug-in offers multiple language support,
this routine can be used to internationalize any strings. You can
also set default values for imageExtension and imageNameSyntax within this call.
imageIsFile
- Definition
-
BOOLEAN imageIsFile(
char *fn,
FILE *fp
}
Parameter |
Type |
Description |
fn
|
char*
|
Filename, used only if fp is NULL.
|
fp
|
FILE* |
File pointer.
|
Return Value |
|
TRUE if fn or fp refer
to a file supported by this plug-in.
|
- Description
-
Checks whether a filename or pointer matches
a type supported by this plug-in.
NoteDefinition of this entry point is mandatory.
- Example
-
if ( fp == NULL )
{
fp = fopen( fn, "r"
) );
}
/* Read the header from
fp and check for a match with this plug-in */
fread( &magic, 1,
sizeof( magic ), fp );
return ( magic & FORMATS_MAGIC_NUMBER
)
imageNameSyntax
- Definition
-
- Description
-
This variable defines the default format of
the filename, and includes the root name, frame number, and extension.
The name syntax recognizes four strings:
- Name, which represents the root name
of the file
- Ext, which represents the extension
- #, which represents the frame number
- punctuation,
such as period (.), comma (,), and hyphen (-)
These can be combined in any way to produce
the desired filename. Each of the name, frame number, and extension
can occur at most once, but the # can be repeated to pad the frame
number with leading zeroes.
The default value is NULL.
This string is not recognized by Maya.
- Example
-
This example produces a name with at least two digits
used for the frame number. There is no punctuation between the name
and the frame number, but a period is placed between the frame number
and extension.
char *imageNameSyntax
= "Name##.Ext";
imageNumberOfChannels
- Definition
-
int imageNumberOfChannels
- Description
-
This variable defines the maximum number of color
channels that your file format supports. It does not include the
matte channel. Normally, this is 3 for
RGB images, and 1 for formats that support
gray-scale only.
The default value is 3.
- Example
-
int imageNumberOfChannels
= 3;
imageNumberOfMattes
- Definition
-
- Description
-
This variable defines the maximum number of matte,
or alpha, channels that your file format supports. Normally, this
is 1 if your format supports
matte, and 0 otherwise.
The default value is 0.
- Example
-
int imageNumberOfMattes
= 1;
imageNumberOfZChannels
- Definition
-
int imageNumberOfZChannels
- Description
-
This variable defines the maximum number of
z, or depth, channels that your file format supports. Normally,
this is 1 if your format supports
z, and 0 otherwise.
The default value is 0.
- Example
-
int imageNumberOfZChannels
= 1;
imageSupportRemoteAccess
- Definition
-
BOOLEAN imageSupportRemoteAccess
- Description
-
This variable defines whether your plug-in supports
remote file access. If so, set this to TRUE. Otherwise,
Maya will perform remote file access where possible, and remove
any leading remotehost: from
filenames before passing them to your plug-in.
The default value is FALSE.
- Example
-
BOOLEAN imageSupportRemoteAccess
= TRUE;
imageSupportsActiveWindow
- Definition
-
int imageSupportsActiveWindow
- Description
-
This variable indicates whether your format supports
the notion of an active window. The default value is FALSE.
- Example
-
int imageSupportsActiveWindow
= FALSE;
Look-up table (LUT) reading function
- Definition
-
int your_lut_read_func
(
POINTER data,
IMF_LUT **imf_lut
)
Parameter |
Type |
Description |
data
|
input
|
The private data associated with your image.
|
imf_lut
|
output |
A pointer to a newly allocated look-up table.
|
Return Value |
|
TRUE if the LUT was successfully allocated and read; FALSE if an error occurred.
|
- Description
-
Maya calls this function to read the image file's color
look-up table. Since LUTs usually use little space, it is recommended
that they be read by imageReadOpen and
stored in the private data associated with the image. This way, your_lut_read_func only needs to allocate
a new IMF_LUT and copy
it to the stored LUT data.
- Allocate
the LUT:
if ( ( *imf_lut = IMF_lut_alloc(
data->your_color_map_size ) ) == NULL )
{
return( FALSE );
}
- Set (*imf_lut)->imu_maximum to the maximum
value of each LUT entry. For example, if your file format stores
each LUT entry as 12 bits of red, 12 bits of green, and 12 bits
of blue, use 4095 for imu_maximum.
- Set (*imf_lut)->imu_gamma to be the
gamma of the color look-up table if it is stored in the file, or
the default input gamma value using FMT_def_input_gamma.
This should be the gamma that was applied to the LUT entries when
they were written.
- Fill
in each (*imf_lut)->imu_lut[i].ile_red,
(*imf_lut)->imu_lut[i].ile_green,
etc. entry. See IMF_LUT for a description
of the IMF_LUT structure.
Each LUT entry should range from 0 to the imu_maximum entry
set in step 2.
- Return TRUE if successful, and FALSE if an error occurred.
Library Functions
imf__build_handle
- Definition
-
char *imf__build_handle
(
char *path,
char *handle,
char *ext
)
Parameter |
Type |
Description |
path |
Input
|
The search path to use.
|
handle |
Input |
The filename.
|
ext |
Input |
The filename extension.
|
Return Value |
|
The completed filename.
|
- Description
-
This function constructs a filename from path, handle,
and ext. Use the returned
string when opening the file.
- Examples
-
char *filename;
FILE *fp = NULL;
...
*info = &imf->info;
if ( info->handle_complete
)
{
filename = info->handle;
}
else
{
filename = imf__build_handle(
NULL, info->handle,
info->ext );
if ( ( fp = fopen( filename,
"rb" ) ) == NULL )
{
filename = imf__build_handle(
getenv(
"WF_IMG_DIR" ),
info->handle, info->ext
);
}
}
if ( fp == NULL )
{
fp = fopen( filename,
"rb" );
}
IMF_chan_alloc
- Definition
-
POINTER *IMF_chan_alloc
(
IMF_IMAGE *image,
int res,
char *key,
int *size
)
Parameter |
Type |
Description |
image |
Input
|
Image information specifies the number of channels
that are allocated, e.g., the number of color channels, the number
of matte channels, and the number of Z channels.
|
res |
Input |
The width of a scanline, in pixels.
|
key |
Input |
The plug-in's key; used for error messages.
|
size |
Output |
Size of the allocated scanline.
|
Return Value |
|
NULL if insufficient memory; otherwise, a pointer
to scanline buffers.
|
- Description
-
This function allocates a set of scanline buffers that
are used to pass one scanline of data between Maya and your scanline
reading and writing functions. The buffer is set up as an array of
pointers to scanline buffers, with the first rows containing color
channel data (red, green, and then blue), followed by a matte channel
and a z channel (if defined by your plug-in). Call this function
from your imageReadOpen routine.
IMF_chan_alloc depends
on the imageBitsPerPaletteEntry, imageBitsPerChannel, imageBitsPerMatte, and imageBitsPerZChannel entry points that
you define at the top of your plug-in code. If your entry point
defines 1 to 8 bits per channel, then byte-sized pixels are allocated.
If 9 to 16 bits per channel are defined, then 16-bit short pixels are allocated. For 17
to 32 bits per channel, 32-bit long pixels
are allocated. All values are in unsigned form.
Your scanline reading and writing functions must know whether to interpret
channel data as 8-bit unsigned chars, 16-bit shorts, or 32-bit longs.
- Example
-
This sample code fragment shows how to allocate
and access a scanline buffer allocated by IMF_chan_alloc.
There are 3 color channels with 8 bits per pixel, 1 matte channel
with 12 bits per pixel, and 1 z channel with 32 bits per pixel. imf is the IMF_OBJECT structure
passed into your imageReadOpen function.
Note that imageWriteOpen should
not call IMF_chan_alloc because
the Maya application allocates the scanline buffer passed into the scanline
writing function.
POINTER *p_buffer;
p_buffer = IMF_chan_alloc(
imf->info.image,
image_width, imf->info.key,
NULL);
In your scanline reading function, store data into
the buffer as follows:
unsigned char *p_red =
p_buffer[0];
unsigned char *p_blue
= p_buffer[1];
unsigned char *p_green
= p_buffer[2];
unsigned short *p_matte
= p_buffer[3];
unsigned long *p_z = p_buffer[4];
for ( i = 0; i < image_width;
++i )
{
p_red[i] = red_values[i];
p_blue[i] = blue_values[i];
p_green[i] = green_values[i];
p_matte[i] = matte_values[i];
p_z[i] = z_values[i];
}
Your scanline writing function should access
the buffer in a similar way.
- Related Functions
-
IMF_chan_free
- Definition
-
int IMF_chan_free
(
POINTER *chan_data
)
Parameter |
Type |
Description |
chan_data
|
Modified
|
The address of a pointer to a scanline buffer
allocated by IMF_chan_alloc.
|
Return Value |
|
Unused.
|
- Description
-
This function de-allocates a set of scanline buffers
that were previously allocated by IMF_chan_alloc.
- Example
-
If data->buffer points
to your scanline buffer, free the buffer using:
IMF_chan_free( data->buffer );
- Related Functions
-
imf__free_obj
- Definition
-
int imf__free_obj
(
IMF_OBJECT *imf
)
Parameter |
Type |
Description |
imf |
Modified
|
Structure storing image characteristics such
as width and height.
|
Return Value |
|
Unused.
|
- Description
-
This function de-allocates space occupied by
the IMF_OBJECT structure.
This function should be called in your close function.
If imf->data is
not NULL, then imf__free_obj frees the space pointed
to by imf->data[0] and then
frees imf->data. Therefore,
if you have allocated imf->data[1] or
any other extra space, then your close function and your error-handling
routines in imageReadOpen and imageWriteOpen must deallocate the
space to avoid a memory leak.
In the event of a failed attempt at opening
an image file, Maya calls imf__free_obj(
imf ) to free the IMF_OBJECT passed
to imageReadOpen. Therefore,
you must not call imf__free_obj in your
error-handling code. If you call your close function to perform
the error-handling and clean-up, your close function must distinguish between
a close after a failed open attempt and a close after having successfully
read an image file. Your close function must call imf__free_obj only if the image file
was successfully read.
- Example
-
- Related Functions
-
imf__init_ifd
- Definition
-
int imf__init_ifd
(
IMF_OBJECT *imf
)
Parameter |
Type |
Description |
imf
|
Modified
|
Structure storing image characteristics such
as width and height.
|
Return Value |
|
Unused.
|
- Description
-
This function initializes the image file descriptor structure
pointed to by imf->info.image.
This function should be called in your imageReadOpen function.
Note that the imf->info.image field
must have been allocated by your function before invoking imf__init_ifd.
The following defines the default values of
the IMF_IMAGE structure:
- usage: IMF_C_GENERIC
- curve.usage: IMF_C_CORRECTION_GAMMA
- curve.gamma: fmt_def_gamma
- curve.info.name: NULL
- curve.info.count: 1
- curve.info.elems: 256
- curve.info.type: IMF_C_INTEGER
- curve.info.bits: LOG( fmt__gamma_tab_res )
/ LOG( 2.0 )
- curve.response: NULL
- aspect.name: NULL
- chan_format: NULL
- matte_format: NULL
- aux_format: NULL
- index_format: NULL
- chan_config: IMF_C_PLANAR_SEPARATE
- chan_orient: IMF_C_BOT_LEFT
- chan_count: 0
- chan_type: IMF_C_INTEGER
- chan_bits: 8
- matte_count: 0
- matte_type: IMF_C_INTEGER
- matte_bits: 8
- aux_count: 0
- aux_type: IMF_C_INTEGER
- aux_bits: 8
- index_count: 0
- index_type: IMF_C_INTEGER
- index_bits: 8
- Example
-
- Related Functions
-
Capability settings
When you implement an image plug-in, you need
to decide what file format features your plug-in supports, and whether
and how the user can specify them in the file browsers used to access
image files. Maya automatically passes these features, called capability
settings, to your image plug-in when it accesses a file. For example,
when writing an image to disk, you may allow the user to select
the type of compression to be used. Sometimes, your file format
has no special features and does not require capability settings.
The user interface supports two pre-defined
capability types:
Data structures
IMF_CAPABILITY
- Definition
-
typedef struct imf_capability
{
U_SHORT imc_code;
char *imc_name;
MSGCAT_DEFN imc_name_msg;
U_CHAR imc_type;
POINTER imc_value;
U_CHAR imc_when_avail;
} IMF_CAPABILITY;
- Purpose
-
For those image files with special, type-specific parameters,
use the IMF_CAPABILITY structure
to define the type-specific capabilities of the driver. The capabilities
are stored as an array, with one entry per capability. For example,
the SGI driver has two capabilities: one for the compression mode
(raw vs. RGB), and one for defining whether a matte channel should
be created in the file.
- Description
-
The following table gives the descriptions.
Field |
Description |
imc_code
|
A 16-bit number unique among all the capabilities
defined in your IMF_CAPABILITY array.
|
imc_name |
The string displayed in the user interface describing
the capability.
|
imc_name_msg |
The internationalized version of imc_name.
|
imc_type |
The capability type. Currently, this can be either IMF_CAPABILITY_TYPE_LIST or IMF_CAPABILITY_TYPE_NUMBER.
|
imc_value |
A pointer to either a IMF_CAPABILITY_LIST or
a IMF_CAPABILITY_NUMBER structure, depending
on imc_type.
|
imc_when_avail |
Defines when this capability is valid. Set to IMF_CAPABILITY_WHEN_ALWAYS for both
reading and writing images; IMF_CAPABILITY_WHEN_INPUT for reading
images; or IMF_CAPABILITY_WHEN_OUTPUT for writing
images.
|
The capabilities are
generic parameters. When imageReadOpen or imageWriteOpen is called, the specific
user-defined instances of the capabilities are passed in as settings. This sample code fragment
shows you how to extract the meanings of these settings:
static BOOLEAN your_get_capability_settings
(
IMF_OBJECT *imf,
int *mode
)
{
IMF_CAPABILITY *capability;
IMF_CAP_SETTING *setting;
IMF_CAP_SETTING **settings;
if ( ( settings = imf->info.settings ) == NULL )
{
return( TRUE );
}
for ( /* Nothing */; setting = *settings; ++settings )
{
/*
* Lookup the capability by code.
*/
for ( capability = your__capabilities; capability->imc_name_msg.mcd_set!= 0; ++capability )
{
if ( capability->imc_code == setting->imcs_code )
{
break;
}
}
if ( capability->imc_name_msg.mcd_set == 0 )
{
ERR_printf( "Bad capability found." );
return( FALSE );
}
switch ( capability->imc_code )
{
case YOUR_CAPABILITY_IMC_CODE:
*mode =setting->imcs_value.imcs_list;
break;
case ANOTHER_CAPABILITY_IMC_CODE:
...;
break;
case ...:
default:
ERR_printf( "Bad capability found.");
return( FALSE );
}
}
return( TRUE );
}
IMF_CAPABILITY_ENTRY
- Definition
-
typedef struct imf_capability_entry
{
U_SHORT ice_code;
char *ice_name;
MSGCAT_DEFN ice_name_msg;
} IMF_CAPABILITY_ENTRY;
- Purpose
-
This structure is used to define a single entry
of a IMF_CAPABILITY_LIST.
- Description
-
The following table gives the desciptions.
Field |
Description |
imc_code
|
A 16-bit number unique among all the capability
entries defined in an IMF_CAPABILITY_LIST.
This number is used by your imageReadOpen and/or imageWriteOpen code to determine the list
entry that was selected by the user.
|
imc_name |
The character string displayed in the user interface
for this list item.
|
imc_name_msg |
An internationalized version of ice_name.
|
IMF_CAPABILITY_LIST
- Definition
-
typedef struct imf_capability_list
{
int icl_default;
int icl_n_entries;
IMF_CAPABILITY_ENTRY
*icl_entries;
} IMF_CAPABILITY_LIST;
- Purpose
-
When an IMF_CAPABILITY record
is of type IMF_CAPABILITY_TYPE_LIST,
the imc_value field points
to an IMF_CAPABILITY_LIST record
whose icl_entries pointer is an array of IMF_CAPABILITY_ENTRY records.
- Description
-
The following table gives the descriptions.
Field |
Description |
icl_default
|
The ice_code of
the default list entry.
|
icl_n_entries |
The number of entries in the list.
|
icl_entries |
The list of entries.
|
IMF_CAPABILITY_NUMBER
- Definition
-
typedef struct imf_capability_number
{
float icn_default;
BOOLEAN icn_minimum_dfnd;
float icn_minimum;
BOOLEAN icn_maximum_dfnd;
float icn_maximum;
floay icn_increment;
} IMF_CAPABILITY_NUMBER;
- Purpose
-
If the IMF_CAPABILITY record
has type IMF_CAPABILITY_TYPE_NUMBER,
this structure is used to define the default value and the range
of values allowed for the capability.
- Description
-
The following table gives the descriptions.
Field |
Description |
icn_default
|
The default value of this number capability.
|
icn_minimum_dfnd |
Denotes whether a minimum value is defined.
TRUE if so, FALSE if not.
|
icn_minimum |
The minimum value, applicable only if icn_minimum_dfnd is set to TRUE.
|
icn_maximum_dfnd |
Denotes whether a maximum value is defined.
TRUE if so, FALSE if not.
|
icn_maximum |
The maximum value, applicable only if icn_maximum_dfnd is set to TRUE.
|
icn_increment |
The increment used by the slider or thumbwheel.
|
If icn_minimum_dfnd and icn_maximum_dfnd are both TRUE, a slider is displayed beside
the text field. Otherwise, a thumbwheel is displayed.
IMF_CAP_SETTING
- Definition
-
typedef struct imf_cap_setting
{
U_SHORT imcs_code;
union
{
float imcs_number;
int imcs_list;
} imcs_value;
} IMF_CAP_SETTING;
- Purpose
-
This structure is used to pass the current settings of
the capabilities to your plug-in when opening a file.
Field |
Description |
imcs_code
|
The imc_code of
the setting.
|
imcs_number |
Value if the capability is an IMF_CAPABILITY_TYPE_NUMBER.
|
imcs_list |
Value if the capability is an IMF_CAPABILITY_TYPE_LIST. This is a zero-based
index into the list.
|
IMF_IMAGE
- Definition
-
typedef struct
{
int usage;
IMF_COLOR_RESPONSE curve;
FMT_ASPECT_INFO aspect;
WINDOW_I window;
WINDOW_I active;
int chan_config;
int chan_orient;
char *chan_format;
int chan_count;
int chan_type;
int chan_bits;
char *matte_format;
int matte_count;
int matte_type;
int matte_bits;
char *aux_format;
int aux_count;
int aux_type;
int aux_bits;
char *index_format;
int index_count;
int index_type;
int index_bits;
} IMF_IMAGE;
- Purpose
-
IMF_IMAGE defines
the contents of a single image from a file.
- Description
-
The following table gives the descriptions.
Field |
Description |
usage
|
A bit field describing the image type: IMF_C_IMAGE_ANY for any image type; IMF_C_GENERIC for a generic image (the default
set by imf__init_ifd);
and IMF_C_INDEX_LUT for
a look-up table-based image.
|
curve |
Color correction information.
|
aspect |
Image aspect information.
|
window |
Image window boundaries, using zero-based numbers.
|
active |
Active window boundaries.
|
chan_config |
Channel planarity. This field affects how scanline
data is passed to the scanline reading and writing functions. There
are two options available:
- One
of IMF_C_PLANAR_CONTIGUOUS for
red, green, and blue in one large scanline buffer with values arranged
in R, G, B, R, G, B, etc. order; or,
- IMF_C_PLANAR_SEPARATE for red, green,
and blue in separate arrays (normally used).
|
chan_orient |
Channel orientation: IMF_C_ORIENT_BOT_LEFT for
bottom-to-top ordering; or IMF_C_ORIENT_TOP_LEFT for
top-to-bottom ordering.
|
chan_format |
Color channel format.
|
chan_count |
The number of color channels.
|
chan_type |
Color channel storage type: IMF_C_INTEGER for positive integer values
(the default value assigned by imf__init_ifd); IMF_C_FLOAT for single-precision float
values; IMF_C_DOUBLE for
double-precision double values.
|
chan_bits |
Number of bits per color channel value.
|
matte_format |
Matte channel format.
|
matte_count |
The number of matte channels.
|
matte_type |
Matte channel storage type: IMF_C_INTEGER for positive integer values
(the default value assigned by imf__init_ifd); IMF_C_FLOAT for single-precision float values; IMF_C_DOUBLE for
double-precision double values.
|
matte_bits |
Number of bits per matte channel value.
|
aux_format |
Auxiliary (z) channel format.
|
aux_count |
The number of (z) auxiliary channels.
|
aux_type |
Auxiliary (z) channel storage type: IMF_C_INTEGER for positive integer values
(the default value assigned by imf__init_ifd); IMF_C_FLOAT for single-precision float
values; IMF_C_DOUBLE for
double-precision double values.
|
aux_bits |
Number of bits per auxiliary (z) channel value.
|
index_format |
Color index format.
|
index_count |
The number of color-indexed image data channels.
|
index_type |
Color-indexed data channel storage type: IMF_C_INTEGER for positive integer values
(the default value assigned by imf__init_ifd); IMF_C_FLOAT for single-precision float values; IMF_C_DOUBLE for
double-precision double values.
|
index_bits |
Number of bits per pixel for palette indexes.
|
IMF_INFO
- Definition
-
typedef struct
{
char *key;
char *handle;
BOOLEAN handle_complete;
char *name;
char *ext;
char *desc;
char *program;
char *machine;
char *user;
char *date;
char *time;
char *filter;
char *compress;
IMF_CAP_SETTING **settings;
BOOLEAN lut_exists;
IMF_LUT *write_lut;
int job_num;
int frame;
int field;
U_LONG init_flag;
COLOR_XYZ_3F red_pri;
COLOR_XYZ_3F green_pri;
COLOR_XYZ_3F blue_pri;
COLOR_XYZ_3F white_pt;
int count;
IMF_IMAGE *image;
int track_num_frames;
float track_frame_rate;
int track_start_frame;
int num_audio_tracks;
int num_video_tracks;
} IMF_INFO;
- Purpose
-
Contains information describing the image file.
- Description
-
The following table gives the descriptions.
Field |
Description |
key
|
The plug-in's unique identifier key.
|
handle |
Filename of the image.
|
handle_complete |
Denotes if handle is
completely built. If FALSE, your plug-in
should use imf__build_handle to
build a complete filename path.
|
name |
The name of the image file.
|
ext |
The filename extension.
|
desc |
A description of the image file type.
|
program |
The program that created the image.
|
machine |
The machine on which the image was created.
|
user |
The user who created the image.
|
date |
The creation date of the image.
|
time |
The time taken to create the file.
|
filter |
The filter function used by the image.
|
compress |
The compression function used by the image.
|
settings |
Capability settings set by the user.
|
lut_exists |
TRUE if a look-up
table (LUT) is used for the image data in the scanline buffers; FALSE if the data is RGB.
|
write_lut |
Pointer to a LUT. Used only when writing palette-based
image files.
|
job_num |
Process job accounting information.
|
frame |
The frame number.
|
field |
Field rendering flag.
|
init_flag |
Denotes whether the caller has invoked IMF_info_init.
|
red_pri |
Red chroma.
|
green_pri |
Green chroma.
|
blue_pri |
Blue chroma.
|
white_pt |
White chroma.
|
count |
The number of image sub headers pointed to by
the image field.
|
image |
An array of image sub headers containing detailed
image information.
|
track_num_frames |
The number of frames in the current track.
|
track_frame_rate |
The number of frames per second for the track.
|
track_start_frame |
The number of the first frame in the current track.
|
num_audio_tracks |
The number of audio tracks in the current file.
|
num_video_tracks |
The number of video tracks in the current file.
|
IMF_LUT
- Definition
-
typedef struct imf_lut
{
IMF_LUT_ENTRY *imu_lut;
int imu_maximum;
int imu_n_entries;
float imu_gamma;
} IMF_LUT;
- Purpose
-
This structure defines a look-up table (LUT).
- Description
-
The following table gives the descriptions.
Field |
Description |
imu_lut
|
The look-up table entries.
|
imu_maximum |
The maximum value that each LUT entry can contain.
|
imu_n_entries |
The number of LUT entries pointed to by imu_lut.
|
imu_gamma |
The gamma value of the LUT entries.
|
IMF_LUT_ENTRY
- Definition
-
typedef struct imf_lut_entry
{
U_SHORT ile_red;
U_SHORT ile_green;
U_SHORT ile_blue;
U_CHAR ile_mode:7;
U_CHAR ile_transparent:1;
} IMF_LUT_ENTRY;
- Purpose
-
This structure defines one entry of a look-up table.
- Description
-
The following table gives the descriptions.
Field |
Description |
ile_red
|
The red value of this entry.
|
ile_green |
The green value of this entry.
|
ile_blue |
The blue value of this entry.
|
ile_mode |
IMF_LUT_MODE_FREE if
the entry is unused; IMF_LUT_MODE_LOCKED if
the entry is locked but usable; IMF_LUT_MODE_RESERVED if
the entry is reserved and unusable; or IMF_LUT_MODE_USED if
the entry is in use and is modifiable.
|
ile_transparent |
Set to 0 if the entry is not transparent (i.e., opaque),
and 1 if the entry is transparent.
|
IMF_OBJECT
- Definition
-
typedef struct imf_object
{
POINTER *data;
IMF_INFO info;
int access;
IMF_lutReadProc lut_read;
IMF_scanProc scan;
IMF_closeProc close;
IMF_playbackBindProc playback_bind;
IMF_playbackGotoProc playback_goto;
IMF_playbackPlayProc playback_play;
IMF_playbackParamsProc playback_params;
IMF_playbackStopProc playback_stop;
IMF_getFrameProc get_frame;
IMF_getRasterProc get_raster;
IMF_getRegionProc get
region;
IMF_setFrameProc set_frame;
} IMF_OBJECT;
- Purpose
-
This structure is used when calling imageReadOpen and imageWriteOpen.
- Description
-
The following table gives the descriptions.
Field |
Description |
data
|
The private data associated with your image.
|
info |
Image file information.
|
access |
Image access type.
|
lut_read |
Function that retrieves look-up table information
from an image file.
|
scan |
Your scanline access function.
|
close |
Image close function.
|
playback_bind |
Set to NULL.
|
playback_goto |
Set to NULL.
|
playback_play |
Set to NULL.
|
playback_params |
Set to NULL.
|
playback_stop |
Set to NULL.
|
get_frame |
Set to NULL.
|
get_raster |
Set to NULL.
|
get_region |
Set to NULL.
|
set_frame |
Set to NULL.
|
Compiling your plug-in
Once you have written your image file format
plug-in, you need to compile it and create a shared object that
can be loaded into Maya. We provide a Makefile and buildconfig in
our Developer’s Kit for building the example using the gcc compiler.
On Windows, a solution and project file is provided for building
the image plug-in with Visual C++. You must first set MAYA_LOCATION
before building the image plug-in example. The plug-in that is built
must be copied to the $MAYA_LOCATION/bin/plug-ins/image directory
before Maya has access to this new image format. Image plug-ins must
be built with the compiler and linker flags we provide so that they
can be loaded into Maya.