MultipassBitmap Manual
MultipassBitmap is a subclass of BaseBitmap that provides support for multiple folders and layers. Such a folder or layer is represented as another MultipassBitmap .
// create MultipassBitmap with the given dimensions and color mode MultipassBitmap * multipassBitmap = MultipassBitmap::Alloc (width, height, colorMode); if (multipassBitmap == nullptr ) return maxon::OutOfMemoryError( MAXON_SOURCE_LOCATION );
// add a new layer MultipassBitmap * const layer = multipassBitmap-> AddLayer ( nullptr , colorMode); if (layer) { layer-> SetParameter ( MPBTYPE::NAME , "Custom Layer" );
// fill layer const Int32 bufferSize = width * 3; // rgb
// fill line buffer lineBuffer[offset] = red; lineBuffer[offset + 1] = green; lineBuffer[offset + 2] = 0; offset = offset + 3; }
// fill line layer-> SetPixelCnt (0, y, width, ( UChar *)lineBuffer, COLORBYTES_RGBf , colorMode, PIXELCNT::NONE ); } DeleteMem (lineBuffer); } }
// save to file Filename imageFileName;
// select a file name if (imageFileName. FileSelect ( FILESELECTTYPE::IMAGES , FILESELECT::SAVE , "Save Image File" _s)) { imageFileName = GeFilterSetSuffix (imageFileName, FILTER_TIF );
// save as multi layer 32-bit TIF const SAVEBIT bits = SAVEBIT::MULTILAYER | SAVEBIT::USE32BITCHANNELS ; const IMAGERESULT res = multipassBitmap-> Save (imageFileName, FILTER_TIF , nullptr , bits); if (res != IMAGERESULT::OK ) ApplicationOutput ( "Error saving image." ); }
// destroy MultipassBitmap MultipassBitmap::Free (multipassBitmap);
A MultipassBitmap can be cast into a VPBuffer and vice versa in the rendering pipeline. If a given BaseBitmap pointer refers to a MultipassBitmap can be checked with BaseBitmap::IsMultipassBitmap() .
A MultipassBitmap can be created with the usual tools:
// allocate MultipassBitmap with the given settings MultipassBitmap * multipassBitmap = MultipassBitmap::Alloc (width, height, colorMode); if (multipassBitmap == nullptr ) return maxon::OutOfMemoryError( MAXON_SOURCE_LOCATION );
// use MultipassBitmap
// destroy MultipassBitmap MultipassBitmap::Free (multipassBitmap);
A multi-layer image file can also be loaded into a MultipassBitmap using BaseBitmap::Init() :
// This example lets the user select an image file that will be loaded. // If the loaded image contains layers the layout count is printed. Filename selectedImageFile;// select image file if (!selectedImageFile. FileSelect ( FILESELECTTYPE::IMAGES , FILESELECT::LOAD , "Select Image" _s)) return maxon::OK ;
// load image file BaseBitmap * bitmap = nullptr ; const IMAGERESULT result = BaseBitmap::Init (bitmap, selectedImageFile);
// check success if (result != IMAGERESULT::OK ) return maxon::IoError( MAXON_SOURCE_LOCATION , MaxonConvert (selectedImageFile, MAXONCONVERTMODE::NONE ), "Could not load image file." _s);
// check if it is a MultipassBitmap if (bitmap-> IsMultipassBitmap ()) { MultipassBitmap * const multipassBitmap = static_cast< MultipassBitmap * > (bitmap);
// get layer count const Int32 layerCount = multipassBitmap-> GetLayerCount (); ApplicationOutput ( "Layer Count: " + String::IntToString (layerCount)); } else { // no MultipassBitmap, no layers ApplicationOutput ( "No layers" ); } BaseBitmap::Free (bitmap);
The image data stored in the layers can easily be deleted with:
Multiple parameters can be set to define the behaviour of a given layer:
The parameter IDs are:
Some of these parameters can be directly accessed with these convenience functions:
// add a new layer MultipassBitmap * const layer = multipassBitmap-> AddLayer ( nullptr , colorMode); if (layer) { // configure new layer layer-> SetName ( "New Layer" _s); layer-> SetParameter ( MPBTYPE::BLENDMODE , LAYER_ADD ); layer-> SetParameter ( MPBTYPE::SHOW , true ); layer-> SetParameter ( MPBTYPE::SAVE , false ); }
// show bitmap in Picture Viewer ShowBitmap (multipassBitmap);
A MultipassBitmap can contain default layers, alpha layers and hidden layers:
These layers are accessed with:
// get layer count const Int32 layerCount = multipassBitmap-> GetLayerCount ();
// loop through all layers for ( Int32 layerIndex = 0; layerIndex < layerCount; ++layerIndex) { MultipassBitmap * const layer = multipassBitmap-> GetLayerNum (layerIndex); if (layer) { // access and print layer name const String layerName = layer-> GetParameter ( MPBTYPE::NAME ). GetString (); ApplicationOutput ( "Layer: " + layerName); } }
Layers, folders and alpha layers are added with:
Further layer related functions are:
// add a new folder MultipassBitmap * const folder = multipassBitmap-> AddFolder ( nullptr ); if (folder) { folder-> SetName ( "Folder" _s);
// add a new layer MultipassBitmap * const layerA = folder-> AddLayer ( nullptr , colorMode); if (layerA) { // configure new layer layerA-> SetName ( "Layer A" _s); layerA-> SetParameter ( MPBTYPE::SHOW , true ); layerA-> SetParameter ( MPBTYPE::SAVE , true ); }
// add a new layer MultipassBitmap * const layerB = folder-> AddLayer ( nullptr , colorMode); if (layerB) { // configure new layer layerB-> SetName ( "Layer B" _s); layerB-> SetParameter ( MPBTYPE::SHOW , true ); layerB-> SetParameter ( MPBTYPE::SAVE , true ); } }
The content of a MultipassBitmap can also be represented as a BodyPaint PaintBitmap :
// get PaintBitmap representation PaintBitmap * const paintBitmap = multipassBitmap-> GetPaintBitmap (); if (paintBitmap == nullptr ) return maxon::UnexpectedError( MAXON_SOURCE_LOCATION );
// use PaintBitmap functionality to merge layers const Int32 width = multipassBitmap-> GetBw (); const Int32 height = multipassBitmap-> GetBh (); const Int32 calcFlags = RECALC_NOGRID | RECALC_INITBMP ;
// merge layers into one BaseBitmap if (!paintBitmap-> ReCalc ( nullptr , 0, 0, width, height, mergedBitmap, calcFlags, 0)) return maxon::UnexpectedError( MAXON_SOURCE_LOCATION ); ShowBitmap (mergedBitmap);