ML Reference
mlPagedImage.h
Go to the documentation of this file.
1/*************************************************************************************
2**
3** Copyright 2007, MeVis Medical Solutions AG
4**
5** The user may use this file in accordance with the license agreement provided with
6** the Software or, alternatively, in accordance with the terms contained in a
7** written agreement between the user and MeVis Medical Solutions AG.
8**
9** For further information use the contact form at https://www.mevislab.de/contact
10**
11**************************************************************************************/
12
13#ifndef ML_PAGED_IMAGE_H
14#define ML_PAGED_IMAGE_H
15
34
35//ML-includes
36#include "mlInitSystemML.h"
38#include "mlMemoryImage.h"
39
41#include "mlModuleInterfaces.h"
42
43#include <mlMemoryBlockHandle.h>
45
46#include <unordered_map>
47#include <vector>
48
49ML_START_NAMESPACE
50
52class PagedImageCurrentlyUsedMemoryTracker;
53class Module;
54class SubImage;
55class PageRequest;
56class TileRequest;
58
59
60//------------------------------------------------------------------------------
64//------------------------------------------------------------------------------
65class ML_UNIX_ONLY_EXPORT(MLEXPORT) PagedImage: public MedicalImageProperties
66{
68 struct PageEntry
69 {
71 PageRequest* pendingRequest{};
72 };
73
74 struct ExtendedPageEntry;
75
76public:
79 NO_THREAD_SUPPORT = 0,
80 MULTITHREADED = 1,
81 IO_THREAD = 4,
82 USE_MODULE_THREAD_SUPPORT = -1
83 };
84
86 friend class Host;
87
88 // needed for testing protected API:
89 ML_FRIEND_TEST(PagedImageDeprecationTest, NewAPI);
90 ML_FRIEND_TEST(PagedImageDeprecationTest, DeprecatedAPI);
91 ML_FRIEND_TEST(TypedHandlersTest, SetupAndVerifyProperties);
92
93 //------------------------------------------------------
96 //------------------------------------------------------
97
105 MLEXPORT PagedImage(Module* module=nullptr, MLint outputIndex=-1);
106
111
113 inline CalculateOutputImageHandler* getCalculateOutputImageHandler() const { return _calculateOutputImageHandler; }
114
118
120 inline bool hasExternalCalculateOutputImageHandler() const { return _isExternalCalculateOutputImageHandler; }
121
124
126 MLEXPORT void setCalculateOutputImagePropertiesCB(CalculateOutputImagePropertiesCB* callback, void* userData);
127
129 inline MLuint32 getID() { return _id; }
130
132 inline void updateID() { _id = getUniqueId(); }
133
134 //-------------------------------------------------------------------
137 //-------------------------------------------------------------------
143 inline bool isValid() const { return _isValid; }
144
147 inline void setValid(bool flag = true) { _isValid=flag; }
148
151 inline void setInvalid() { _isValid=false; }
152
156
159 MLEXPORT bool updateOfImagePropertiesNeeded() const { return _updateOfImagePropertiesNeeded; }
160
162 [[nodiscard]]
164
166
167 //------------------------------------------------------
170 //------------------------------------------------------
171
173 MLEXPORT virtual void setImageExtent(const ImageVector& extent);
174
178 inline void setImageExtent(MLint x, MLint y, MLint z = 1, MLint c = 1, MLint t = 1, MLint u = 1) {
179 setImageExtent(ImageVector(x,y,z,c,t,u));
180 }
181
185 inline void setImageExtent(const SubImageBox &box) { setImageExtent(box.getExtent()); }
186
191 MLEXPORT virtual void setImageProperties(const PagedImage& imageProperties);
192
194 MLEXPORT void setPageExtent(const ImageVector& pageExtent);
195
206 inline void setClampPagesToImageExtent(bool flag = true) { _clampPagesToImageExtent = flag; }
207
209 inline bool getClampPagesToImageExtent() const { return _clampPagesToImageExtent; }
210
213 inline void setPageExtent(MLint x, MLint y, MLint z = 1, MLint c = 1, MLint t = 1, MLint u = 1) {
214 setPageExtent(ImageVector(x,y,z,c,t,u));
215 }
216
218 MLEXPORT void setDataType(MLDataType dataType) override;
219
222
225
227 MLEXPORT void setPage(MLint pageID, const MLMemoryBlockHandle& page);
228
232
236 MLEXPORT void deletePageEntryFromDeletionCallback(ExtendedPageEntry* entry);
237
242
249
250
251
252 //------------------------------------------------------
255 //------------------------------------------------------
262 MLEXPORT virtual void setStateInfo(const std::string& info, MLErrorCode errorCode);
263
271
274 MLEXPORT virtual const std::string& getStateInfoString() const;
275
280
281 //---------------------------------------------------------------------------
284 //---------------------------------------------------------------------------
285
291 inline void setBypassIndex(MLint index) { _bypassIndex = index; }
292
295 inline MLint getBypassIndex() const { return _bypassIndex; }
297
298
299 //------------------------------------------------------
302 //------------------------------------------------------
303
305 inline Module* getModule() const { return _module; }
306
308 MLEXPORT const PagedImage* getInputImage(int inputIndex) const;
309
311 inline MLint getOutputIndex() const { return _outIndex; }
312
314 inline ImageVector getPageSetExtent() const { return _pageSetExt; }
315
317 inline ImageVector getPageStride() const { return _pageStride; }
318
320 inline ImageVector getPageExtent() const { return _pageExt; }
321
323 inline MLint getPageID(const ImageVector& voxelPosition) const { return (voxelPosition/_pageExt).dot(_pageStride); }
324
330 inline MemoryImage& getMemoryImage() { return _memoryImg; }
331 inline const MemoryImage& getMemoryImage() const { return _memoryImg; }
333
338 MLEXPORT void setThreadSupport(ThreadSupport support) { _threadSupport = support; }
339
344
348
355
358
361
365
368 MLEXPORT void getPageIDs(std::vector <MLint>& pageIDs, const SubImageBox& subImageBox) const;
369
373 MLEXPORT static void getPageIDs(std::vector<MLint>& pageIDs,
374 const SubImageBox& subImageBox,
375 const ImageVector& imageExtent,
376 const ImageVector& pageExtent);
377
380
383 MLEXPORT MLint getNumPages() const { return _pageSetSize; }
384
386
387
388 //---------------------------------------------------------------------------
391 //---------------------------------------------------------------------------
392
401 inline void setInPlaceIndex(MLint inputIndex) { _inPlaceIndex = inputIndex; }
402
410 inline MLint getInPlaceIndex() const { return _inPlaceIndex; }
412
413
414 //------------------------------------------------------
422 //------------------------------------------------------
423
429 MLEXPORT void setInputSubImageDataType(int inputIndex, MLDataType dataType);
430
438 MLEXPORT void setInputSubImageIsReadOnly(int inputIndex, bool readOnly);
439
442 MLEXPORT void setInputSubImagesAreReadOnly(bool readOnly = true);
443
459 MLEXPORT void setInputSubImageUseMemoryImage(int inputIndex, bool useMemoryImage);
460
464 MLEXPORT void setInputSubImageScaleShift(int inputIndex, const ScaleShiftData& scaleShift);
465
469
472
474 MLEXPORT bool getInputSubImageIsReadOnly(int inputIndex) const;
475
477
478 //------------------------------------------------------
481 //------------------------------------------------------
482
483 //---------------------------------------------------------------------------------
494 //---------------------------------------------------------------------------------
495 MLEXPORT void copyPages(const std::vector<MLint>& pageIDs,
496 SubImage* subImage,
497 const ScaleShiftData& scaleShiftData=ScaleShiftData()) const;
499
500
501 //-------------------------------------------------------------------
504 //-------------------------------------------------------------------
509 [[nodiscard]]
511 MLDataType dataType,
512 void** data,
513 const ScaleShiftData& scaleShiftData=ScaleShiftData(),
514 MLRequestProgressCB* progressCallback = nullptr,
515 void* progressCallbackUserData = nullptr);
516
521 [[nodiscard]]
523 MLRequestProgressCB* progressCallback = nullptr,
524 void* progressCallbackUserData = nullptr);
525
527 MLEXPORT void freeTile(void* data);
528
534 MLEXPORT MLdouble getInterpolatedValue(const Vector3& pos, MLint c = 0, MLint t = 0, MLint u = 0, MLdouble outsideFillValue = 0);
535
537
539 MLEXPORT MLMetaProfilePtr& getMetaProfile() const;
540
542 MLEXPORT static void setPageCountLimitToUsePageEntryMap(MLuint32 limit) { _pageCountLimitToUsePageEntryMap = limit; }
543
545 MLEXPORT static MLuint32 getPageCountLimitToUsePageEntryMap() { return _pageCountLimitToUsePageEntryMap; }
546
547protected:
550
553
556
557private:
559 static MLuint32 getUniqueId();
560
562 MLEXPORT bool arePropertiesLocked() const { return _propertiesLocked; }
563
565 MLEXPORT bool setPropertiesLocked(bool locked);
566
568 inline bool _checkPropertyWriteAccess(const char* methodName) {
569 if (_propertiesLocked) {
570 _showInvalidPropertyWriteAccessError(methodName);
571 }
572 return !_propertiesLocked;
573 }
574
576 void _showInvalidPropertyWriteAccessError(const char* methodName);
577
578 PagedImage(const PagedImage&) = delete;
579 PagedImage& operator=(const PagedImage&) = delete;
580
581
582 //------------------------------------------------------
585 //------------------------------------------------------
590 void _updateAll();
591
592
594 void _allocatePageList();
596
597
598 void static deleteMemoryBlockCallback(void* data, size_t size, void* userData);
599
600 /*
601 * Returns true, of the registration was successfully otherwise false
602 */
603 static bool registerDeletionCallback(const ExtendedPageEntry* entry);
604
605 /*
606 * This returns true, if the ownership of the entry stays within this class
607 */
608 static bool deregisterDeletionCallback(const ExtendedPageEntry* entry);
609
610 static ExtendedPageEntry* deletePageEntryFromMapUnsafe(std::unordered_map<MLint, ExtendedPageEntry *> &pageEntryMap,
611 MLint pageId);
612
613 //------------------------------------------------------
616 //------------------------------------------------------
617
619 Module* _module;
620
622 CalculateOutputImageHandler* _calculateOutputImageHandler;
623
625 CalculateOutputImagePropertiesCB* _calculateOutputImageProperties;
627 void* _calculateOutputImagePropertiesUserData;
628
630 bool _isExternalCalculateOutputImageHandler;
631
634 MLint _outIndex;
635
637 ImageVector _pageExt;
638
641 ImageVector _pageStride;
642
644 ImageVector _pageSetExt;
645
647 MLint _pageSetSize;
648
650 std::vector<PageEntry> _pageList;
651
653 std::unordered_map<MLint, ExtendedPageEntry*> _pageEntryMap;
654
656 mutable Mutex _pageAccessMutex;
657
659 bool _pageHandlesAreStoredInList;
660
666 MLint _inPlaceIndex;
667
669 MLint _bypassIndex;
670
672 bool _updateOfImagePropertiesNeeded;
673
675 bool _isValid;
676
680 bool _propertiesLocked;
681
684 bool _clampPagesToImageExtent;
685
688 MemoryImage _memoryImg;
689
691 std::string _stateInfoString;
692
694 MLErrorCode _stateInfoErrorCode;
695
697 MLuint32 _id;
698
700 std::vector<InputSubImageProperties> _inSubImageProps;
701
703 ThreadSupport _threadSupport;
704
707 mutable PagedImageCurrentlyUsedMemoryTracker* _currentlyUsedPageMemoryTracker;
708
710 mutable MLMetaProfilePtr _metaProfilePtr;
712
714 static MLuint32 _staticUniqueId;
715
717 static MLuint32 _pageCountLimitToUsePageEntryMap;
718
719private:
721 static const char* const _pageAllocationMemoryProfileKey;
722 static const char* const _pageCacheHitsCountProfileKey;
723 static const char* const _pageCacheMissesCountProfileKey;
724};
725
726ML_END_NAMESPACE
727
728// Stream output for std::ostream
729namespace std {
730
732 MLEXPORT std::ostream& operator<<(std::ostream& s, const ML_NAMESPACE::PagedImage &pi);
733
734}
735
736#endif //of __mlPagedImage_H
737
738
The strong handle of a MLMemoryBlock.
The weak handle of a MLMemoryBlock.
Base class for the calculation of pages of an output image (PagedImage) of a Module.
The Host is the central image processing class in the ML.
Definition mlHost.h:115
MLEXPORT void setImageExtent(const ImageVector &extent)
Sets the extent of the (sub)image.
Defines the class InputSubImageProperties which is a simple container for some properties which can b...
This class encapsulates basic medical image properties:
MedicalImageProperties & operator=(const MedicalImageProperties &medicalImageProperties)
Assignment operator from an existing edicalImageProperties object to get a copy.
A memory cache for the complete output image of an output connector.
Base class for an image processing module of the ML.
Definition mlModule.h:151
A PageRequest represents the request for the calculation of a single page of a PagedImage.
Class which represents an image, which manages properties of an image and image data which is located...
MLint getInPlaceIndex() const
Return optimization flag: Return index of input image whose input tile is used also as output page in...
MLEXPORT void setInputSubImageDataType(int inputIndex, MLDataType dataType)
Sets the dataType for the given inputIndex.
MLEXPORT PagedImage(Module *module=nullptr, MLint outputIndex=-1)
Constructor.
MLEXPORT void setMaxVoxelValue(MLdouble maxval)
Sets assumed maximum value to maxval. Overriden to perform access check.
MLEXPORT void clearPendingPageRequest(MLint pageID)
Clears a pending page request for the given page id.
virtual MLEXPORT void setStateInfo(const std::string &info, MLErrorCode errorCode)
Sets the state information for this PagedImage to the string info and the MLErrorCode errorCode.
Module * getModule() const
Returns the associated Module instance if passed to the constructor, NULL otherwise.
MLEXPORT MLErrorCode getTile(SubImageBox location, MLDataType dataType, void **data, const ScaleShiftData &scaleShiftData=ScaleShiftData(), MLRequestProgressCB *progressCallback=nullptr, void *progressCallbackUserData=nullptr)
See Host::getTile( module, outputIndex, location, dataType, data, scaleShiftData).
MLEXPORT void clearPageList()
Remove all pages of the page image and from the ML cache, and all page data chunks are freed,...
bool isValid() const
Returns whether image properties are valid and up-to-date.
MLEXPORT MLdouble getInterpolatedValue(const Vector3 &pos, MLint c=0, MLint t=0, MLint u=0, MLdouble outsideFillValue=0)
Get trilinear interpolated image value at given voxel position (center of a voxel is 0....
MLEXPORT SubImageBox getPageBox(MLint pageID) const
Returns the rectangular region in the entire image covered by the page with the id pageID.
ImageVector getPageExtent() const
Returns the extent of a page.
MLEXPORT const InputSubImageProperties & getInputSubImageProperties(int inputIndex) const
Returns a const reference to the InputSubImageProperties of the given input image at inputIndex.
MLEXPORT MLMemoryBlockHandle getPage(MLint pageID) const
Returns the pointer to the CachedBuffer containing the data of the page with the id pageID.
void setInvalid()
Sets image properties invalid, i.e., isValid() returns false afterwards.
MLEXPORT const PagedImage * getInputImage(int inputIndex) const
Returns the input image at inputIndex of the associated Module.
MLEXPORT void setPageExtent(const ImageVector &pageExtent)
Sets the extents of the pages to pageExtent.
MLEXPORT void setMinVoxelValue(MLdouble minval)
Sets assumed minimum value to minval. Overriden to perform access check.
MLEXPORT MLDataType getInputSubImageDataType(int inputIndex) const
Returns the input sub image data type for the input image at inputIndex.
MLEXPORT ThreadSupport getThreadSupport() const
Returns the current thread support of the paged image.
virtual MLEXPORT void setStateInfoErrorCode(MLErrorCode errorCode)
Sets the state information as MLErrorCode errorCode for this instance.
MLEXPORT void setCalculateOutputImagePropertiesCB(CalculateOutputImagePropertiesCB *callback, void *userData)
Sets the callback and userdata for the calculation of the properties of this PagedImage if they need ...
void setValid(bool flag=true)
Sets image properties to valid/up-to-date, i.e., isValid() returns true afterwards.
MLEXPORT void setUpdateOfImagePropertiesNeeded(bool flag)
Sets if the update of the image properties is needed, because the ML graph has changed since the last...
MLEXPORT void setExternalCalculateOutputImageHandler(CalculateOutputImageHandler *handler)
Sets the pointer to the output image calculation interface handler, the ownership is NOT passed to th...
ImageVector getPageStride() const
Returns the stride to get from one page to another.
MLEXPORT void removePage(MLint pageID)
This method removes a page with id pageID from this instance.
static MLEXPORT void setPageCountLimitToUsePageEntryMap(MLuint32 limit)
Sets the limit of number of pages for using the page entry map instead of the page list.
MLuint32 getID()
Returns the current image id (which changes whenever the image changes and which is unique accross al...
MLEXPORT void copyPages(const std::vector< MLint > &pageIDs, SubImage *subImage, const ScaleShiftData &scaleShiftData=ScaleShiftData()) const
Fills the subImage with contents of the Pages with the IDs pagesIDs The grey values become according ...
MLint getOutputIndex() const
Returns associated output index of Module instance if passed to constructor, -1 otherwise.
const MemoryImage & getMemoryImage() const
MLint getPageID(const ImageVector &voxelPosition) const
Returns the id of that page which contains the image voxel position voxelPosition.
MLEXPORT void setInputSubImageIsReadOnly(int inputIndex, bool readOnly)
Sets that the input sub image for the input image at inputIndex to readOnly.
MLEXPORT void setInputSubImageUseMemoryImage(int inputIndex, bool useMemoryImage)
Sets that the input sub image for the input image at inputIndex should use a memory image (this impli...
MLEXPORT void setInputSubImageScaleShift(int inputIndex, const ScaleShiftData &scaleShift)
Sets that the input sub image for the input image at inputIndex should be rescaled with the given sca...
MLEXPORT void setThreadSupport(ThreadSupport support)
Sets the thread support of the paged image to the given value.
bool getClampPagesToImageExtent() const
see setClampPagesToImageExtent().
ML_FRIEND_TEST(PagedImageDeprecationTest, NewAPI)
MLEXPORT void setPage(MLint pageID, const MLMemoryBlockHandle &page)
Sets the given page handle as pagedata at pageID.
MLEXPORT bool updateOfImagePropertiesNeeded() const
Gets if the update of the image properties is needed, because the ML graph has changed since the last...
void setBypassIndex(MLint index)
Sets the index of the input image whose pages should be used instead of the pages of this image.
CalculateOutputImageHandler * getCalculateOutputImageHandler() const
Returns the pointer to the output image calculation interface.
virtual MLEXPORT void setImageProperties(const PagedImage &imageProperties)
Function to copy all associated characteristics from imageProperties.
MLint getBypassIndex() const
Returns the index of the input image whose pages should be used instead of the pages of this image or...
MLEXPORT ~PagedImage() override
Destructor.
ImageVector getPageSetExtent() const
Returns the extents of the page set covering the entire image extents.
void setImageExtent(MLint x, MLint y, MLint z=1, MLint c=1, MLint t=1, MLint u=1)
Sets the extents of the image to the extent (x,y,z,c,t,u) and clears the list of valid pages and its ...
virtual MLEXPORT const std::string & getStateInfoString() const
Returns the current state information string which might explain something about the state of this in...
static MLEXPORT void getPageIDs(std::vector< MLint > &pageIDs, const SubImageBox &subImageBox, const ImageVector &imageExtent, const ImageVector &pageExtent)
Clears pageIDs and inserts the ids of all pages which need to be calculated to cover subImageBox comp...
void updateID()
Sets that the image has changed.
MLEXPORT bool getInputSubImageIsReadOnly(int inputIndex) const
Returns if input sub image at inputIndex is set to 'read-only'.
MLEXPORT void deletePageEntryFromDeletionCallback(ExtendedPageEntry *entry)
This method removes a page referenced by the page entry.
MLEXPORT MLMetaProfilePtr & getMetaProfile() const
Returns the MLMetaProfile for this paged image. Creates it if necessary.
MLEXPORT PagedImage & getBypassSourceImage()
Returns the reference to the source image of a bypass chain.
bool hasExternalCalculateOutputImageHandler() const
Returns if the CalculateOutputImageHandler is an external handler and should not be overwritten.
MLEXPORT void setCalculateOutputImageHandler(CalculateOutputImageHandler *handler)
Sets the pointer to the output image calculation interface handler, the ownership is passed to the Pa...
ThreadSupport
Defines the multi-threading support of the paged image.
MLEXPORT MLErrorCode getTile(SubImage &subImage, const ScaleShiftData &scaleShiftData=ScaleShiftData(), MLRequestProgressCB *progressCallback=nullptr, void *progressCallbackUserData=nullptr)
See Host::getTile( module, outputIndex, subImg, scaleShiftData).
static MLEXPORT MLuint32 getPageCountLimitToUsePageEntryMap()
Returns the limit of number of pages for using the page entry map instead of the page list.
ML_FRIEND_TEST(PagedImageDeprecationTest, DeprecatedAPI)
MLEXPORT void getPageIDs(std::vector< MLint > &pageIDs, const SubImageBox &subImageBox) const
Clears pageIDs and inserts the ids of all pages which need to be calculated to cover subImageBox comp...
MLEXPORT MLMemoryBlockHandle getPageOrCreatePageRequestOrAddToPendingRequest(MLint &pageID, TileRequest *tileRequest, PageRequest **newPageRequest)
Returns the valid page handle if it exists.
void setClampPagesToImageExtent(bool flag=true)
If enabled, the pages are clamped to the image extent, so that pages on the border of the image will ...
MLEXPORT MLint getNumPages() const
Returns the total number of pages in this output image (regardless if they are allocated or not).
void setPageExtent(MLint x, MLint y, MLint z=1, MLint c=1, MLint t=1, MLint u=1)
Sets the extents of the pages to the extent (x,y,z,c,t,u).
MLEXPORT void calculateImageProperties()
Updates the image properties via the Module::calculateOutputImageProperties or via CalculateOutputIma...
ML_FRIEND_TEST(TypedHandlersTest, SetupAndVerifyProperties)
virtual MLEXPORT MLErrorCode getStateInfoErrorCode() const
Returns the current state information as MLError code which might explain something about the state o...
MLEXPORT MLErrorCode updateImageProperties()
Updates the image properties of the PagedImage using the Host::updateImageProperties method.
void setInPlaceIndex(MLint inputIndex)
Set optimization flag: If calculating a page in calculateOutputSubImage() the output image page shall...
MLEXPORT void initializeInputSubImageProperties(MLint numInputs)
Initializes the InSubImageProps for a given number of inputs, should only be called by the Host!
MLEXPORT void setDataType(MLDataType dataType) override
Sets type of data to dataType. Overriden to perform access check.
MLEXPORT void clearPageListAndMemoryImage()
Remove all pages of the page image and from the ML cache, and all page data chunks are freed.
MLEXPORT void freeTile(void *data)
Same as corresponding Host::freeTile(void *data).
MLEXPORT std::size_t getCachedPagesSizeInBytes() const
Returns currently used cache size for pages in bytes.
MLEXPORT void validateInputSubImagePropertiesAfterCalculateOutputImageProperties()
Validates the properties and set datatype where it was not set, should only be called by the Host!
MemoryImage & getMemoryImage()
Permits the access to a memory cached output of the paged image.
void setImageExtent(const SubImageBox &box)
Sets the extents of the image to box.getExtent() and updates all PagedImage settings.
virtual MLEXPORT void setImageExtent(const ImageVector &extent)
Sets the extents of the image to extent. The list of valid pages and its content are cleared.
MLEXPORT void setInputSubImagesAreReadOnly(bool readOnly=true)
Sets the read-only flag for all input images (see setInputSubImageIsReadOnly() for details)
This class manages/represents a rectangular 6d image region which is organized linearly in memory.
Definition mlSubImage.h:75
VectorType getExtent() const
Returns the extents of the subimage region.
A TileRequest either represents the input sub image that is needed by a PageRequest or if it is a roo...
MLint32 MLDataType
MLDataType.
Definition mlTypeDefs.h:596
MLint32 MLErrorCode
Type of an ML Error code.
Definition mlTypeDefs.h:716
boost::mutex Mutex
Defines a non-recursive mutex.
Definition mlMutex.h:39
#define MLEXPORT
To export symbols from a dll/shared object, we need to mark them with the MLEXPORT symbol.
unsigned int MLuint32
Definition mlTypeDefs.h:185
void MLRequestProgressCB(void *usrData, double progress)
double MLdouble
Definition mlTypeDefs.h:217
MLint64 MLint
A signed ML integer type with at least 64 bits used for index calculations on very large images even ...
Definition mlTypeDefs.h:490
void CalculateOutputImagePropertiesCB(void *userData, PagedImage *outImage)
Callback for the calculation of the output image properties for outputImage.
TScaleShiftData< MLdouble > ScaleShiftData
Double version of TScaleShiftData for maximum reasonable precision.
TImageVector< MLint > ImageVector
Defines the standard ImageVector type which is used by the ML for indexing and coordinates.
STL namespace.