public IComposedLut GetLut(LutCollection sourceLuts) { IComposedLut lut = _realComposedLut; if (lut != null) { return(lut); } lock (_syncLock) { if (_realComposedLut != null) { return(_realComposedLut); } //Trace.WriteLine(String.Format("Creating Composed Lut '{0}'", Key), "LUT"); _realComposedLut = new ComposedLut(sourceLuts, _bufferCache); //just use the creation time as the "last access time", otherwise it can get expensive when called in a tight loop. _largeObjectData.UpdateLastAccessTime(); _largeObjectData.BytesHeldCount = _realComposedLut.Data.Length * sizeof(int); _largeObjectData.LargeObjectCount = 1; MemoryManager.Add(this); Diagnostics.OnLargeObjectAllocated(_largeObjectData.BytesHeldCount); return(_realComposedLut); } }
private static int[] ConstructFinalLut(IComposedLut outputLut, IColorMap colorMap, bool invert) { CodeClock clock = new CodeClock(); clock.Start(); colorMap.MinInputValue = outputLut.MinOutputValue; colorMap.MaxInputValue = outputLut.MaxOutputValue; int[] outputLutData = outputLut.Data; int[] colorMapData = colorMap.Data; if (_finalLutBuffer == null || _finalLutBuffer.Length != outputLutData.Length) { _finalLutBuffer = new int[outputLutData.Length]; } int numberOfEntries = _finalLutBuffer.Length; fixed(int *pOutputLutData = outputLutData) { fixed(int *pColorMapData = colorMapData) { fixed(int *pFinalLutData = _finalLutBuffer) { int *pFinalLut = pFinalLutData; if (!invert) { int firstColorMappedPixelValue = colorMap.FirstMappedPixelValue; for (int i = 0; i < numberOfEntries; ++i) { *(pFinalLut++) = pColorMapData[*(pOutputLutData + i) - firstColorMappedPixelValue]; } } else { int lastColorMappedPixelValue = colorMap.FirstMappedPixelValue + colorMap.Data.Length - 1; for (int i = 0; i < numberOfEntries; ++i) { *(pFinalLut++) = pColorMapData[lastColorMappedPixelValue - *(pOutputLutData + i)]; } } } } } clock.Stop(); PerformanceReportBroker.PublishReport("ImageRenderer", "ConstructFinalLut", clock.Seconds); return(_finalLutBuffer); }
private static int[] ConstructFinalLut(IComposedLut outputLut, bool invert) { #if DEBUG CodeClock clock = new CodeClock(); clock.Start(); #endif int[] outputLutData = outputLut.Data; if (_finalLutBuffer == null || _finalLutBuffer.Length != outputLutData.Length) { _finalLutBuffer = new int[outputLutData.Length]; } int numberOfEntries = _finalLutBuffer.Length; fixed(int *pOutputLutData = outputLutData) fixed(int *pFinalLutData = _finalLutBuffer) { int *pOutputLut = pOutputLutData; int *pFinalLut = pFinalLutData; if (!invert) { int firstColorMappedPixelValue = outputLut.MinOutputValue; for (int i = 0; i < numberOfEntries; ++i) { *pFinalLut++ = *pOutputLut++ - firstColorMappedPixelValue; } } else { int lastColorMappedPixelValue = outputLut.MaxOutputValue; for (int i = 0; i < numberOfEntries; ++i) { *pFinalLut++ = lastColorMappedPixelValue - *pOutputLut++; } } } #if DEBUG clock.Stop(); PerformanceReportBroker.PublishReport("ImageRenderer", "ConstructFinalLut", clock.Seconds); #endif return(_finalLutBuffer); }
private static int[] ConstructFinalLut(IComposedLut outputLut, bool invert) { CodeClock clock = new CodeClock(); clock.Start(); int[] outputLutData = outputLut.Data; if (_finalLutBuffer == null || _finalLutBuffer.Length != outputLutData.Length) _finalLutBuffer = new int[outputLutData.Length]; int numberOfEntries = _finalLutBuffer.Length; fixed (int* pOutputLutData = outputLutData) { fixed (int* pFinalLutData = _finalLutBuffer) { int* pFinalLut = pFinalLutData; if (!invert) { int firstColorMappedPixelValue = outputLut.MinOutputValue; for (int i = 0; i < numberOfEntries; ++i) *(pFinalLut++) = *(pOutputLutData + i) - firstColorMappedPixelValue; } else { int lastColorMappedPixelValue = outputLut.MaxOutputValue; for (int i = 0; i < numberOfEntries; ++i) *(pFinalLut++) = lastColorMappedPixelValue - *(pOutputLutData + i); } } } clock.Stop(); PerformanceReportBroker.PublishReport("ImageRenderer", "ConstructFinalLut", clock.Seconds); return _finalLutBuffer; }
private static int[] ConstructFinalLut(IComposedLut outputLut, IColorMap colorMap, bool invert) { #if DEBUG CodeClock clock = new CodeClock(); clock.Start(); #endif colorMap.MinInputValue = outputLut.MinOutputValue; colorMap.MaxInputValue = outputLut.MaxOutputValue; int[] outputLutData = outputLut.Data; int[] colorMapData = colorMap.Data; if (_finalLutBuffer == null || _finalLutBuffer.Length != outputLutData.Length) _finalLutBuffer = new int[outputLutData.Length]; int numberOfEntries = _finalLutBuffer.Length; fixed (int* pOutputLutData = outputLutData) fixed (int* pColorMapData = colorMapData) fixed (int* pFinalLutData = _finalLutBuffer) { int* pOutputLut = pOutputLutData; int* pFinalLut = pFinalLutData; if (!invert) { int firstColorMappedPixelValue = colorMap.FirstMappedPixelValue; for (int i = 0; i < numberOfEntries; ++i) *pFinalLut++ = pColorMapData[*pOutputLut++ - firstColorMappedPixelValue]; } else { int lastColorMappedPixelValue = colorMap.FirstMappedPixelValue + colorMapData.Length - 1; for (int i = 0; i < numberOfEntries; ++i) *pFinalLut++ = pColorMapData[lastColorMappedPixelValue - *pOutputLut++]; } } #if DEBUG clock.Stop(); PerformanceReportBroker.PublishReport("ImageRenderer", "ConstructFinalLut", clock.Seconds); #endif return _finalLutBuffer; }