/*****************************************************************************************/
/*
 * File name: DMILRemapSlave.cpp
 * Location:  ...\Matrox Imaging\MILxxx\Examples\DistributedMIL\General\DMILRemap\C++
 *             \DMILRemapSlave
 *
 * Synopsis:  This example shows how to use the MIL Function Development module to 
 *            create a custom asynchronous MIL function that does a series of MIL 
 *            commands on a target system in a single call from the host.
 *
 *            It contains the SlaveCustomRemap() slave function.
 *
 * Copyright (C) Matrox Electronic Systems Ltd., 1992-2015.
 * All Rights Reserved
 */
#include <mil.h>

#if M_MIL_USE_RT
#define MIL_SLAVE_EXPORT __declspec(dllexport)
#else
#define MIL_SLAVE_EXPORT
#endif


/* Slave MIL Function prototypes. */
#ifdef __cplusplus
extern "C" {
#endif
MIL_SLAVE_EXPORT void MFTYPE SlaveCustomRemap(MIL_ID Func);

#ifdef __cplusplus
   }
#endif
/* Slave MIL Function definition. */
/* ------------------------------ */

void MFTYPE SlaveCustomRemap(MIL_ID Func)
{
  MIL_ID SrcImage, DstImage, OwnerSystem, ExtremeResult, Lut;
  MIL_UINT Option;
  MIL_INT MinAndMax[2];

  /* Read the parameters. */
  MfuncParamValue(Func, 1, &SrcImage);
  MfuncParamValue(Func, 2, &DstImage);
  MfuncParamValue(Func, 3, &Option); 

  /* Find the Owner system of the destination image. */
  MbufInquire(SrcImage, M_OWNER_SYSTEM, &OwnerSystem);

  /* Find the Minimum and Maximum values of the image. */ 
  MimAllocResult(OwnerSystem, 2L, M_EXTREME_LIST, &ExtremeResult);
  MimFindExtreme(SrcImage, ExtremeResult, M_MIN_VALUE+M_MAX_VALUE);
  MimGetResult(ExtremeResult, M_VALUE, MinAndMax);
  MimFree(ExtremeResult);

  //* Create a LUT to remap the values from Min to Max to 0x00-0xFF. */
  MbufAlloc1d(OwnerSystem, 256, 8+M_UNSIGNED, M_LUT, &Lut);
  MgenLutRamp(Lut, MinAndMax[0], 0x00, MinAndMax[1], 0xFF);

  //* Remap the values. */
  MimLutMap(SrcImage, DstImage, Lut);

  //* Free the Lut buffer */
  MbufFree(Lut);
}