208 sDescription +=
"Segment [";
210 sDescription +=
"-Infinity, ";
212 sprintf(buf,
"%.8f, ", m_startPoint);
216 sDescription +=
"+Infinity";
218 sprintf(buf,
"%.8f", m_endPoint);
221 sprintf(buf,
"]\nFunctionType: %04Xh\n", m_nFunctionType);
224 switch(m_nFunctionType) {
227 sprintf(buf,
"Y = %.8f\n\n", m_params[3]);
230 sprintf(buf,
"Y = X\n\n");
232 sprintf(buf,
"Y = %.8f * X + %.8f\n\n",
233 m_params[1], m_params[3]);
235 sprintf(buf,
"Y = (%.8f * X + %.8f)^%.4f + %.8f\n\n",
236 m_params[1], m_params[2], m_params[0], m_params[3]);
241 sprintf(buf,
"Y = %.8f * log (%.8f * (X ^ %.8f) + %.8f) + %.8f\n\n",
242 m_params[1], m_params[2], m_params[0], m_params[3], m_params[4]);
247 sprintf(buf,
"Y = %.8f * (%.8f ^ (%.8f * X + %.8f)) + %.8f\n\n",
248 m_params[0], m_params[1], m_params[2], m_params[3], m_params[4]);
254 sprintf(buf,
"Y = %.8f\n\n", m_params[3]);
258 sprintf(buf,
"Y = X\n\n");
261 sprintf(buf,
"Y = %.8f * X + %.8f\n\n",
262 m_params[2], m_params[3]);
265 sprintf(buf,
"Y = %.8f * X + %.8f\n\n",
266 m_params[1], m_params[3]);
268 sprintf(buf,
"Y = %8f * (%.8f * X + %.8f)^%.4f + %.8f\n\n",
269 m_params[1], m_params[2], m_params[3], m_params[0], m_params[4]);
275 sprintf(buf,
"Y = %.8f * ln(%.8f * X^%8.f - %.8f) + %.8f\n\n",
276 m_params[1], m_params[4], m_params[0], m_params[2], m_params[3]);
278 sprintf(buf,
"Y = %.8f * ln(%.8f * X - %.8f) + %.8f\n\n",
279 m_params[1], m_params[4], m_params[2], m_params[3]);
286 sprintf(buf,
"Y = %.8f * exp((%.8f * X^%.8f - %.8f) / %.8f) + %.8f\n\n",
287 m_params[5], m_params[4], m_params[0], m_params[3], m_params[1], m_params[2]);
289 sprintf(buf,
"Y = %.8f * exp((%.8f * X - %.8f) / %.8f) + %.8f\n\n",
290 m_params[5], m_params[4], m_params[3], m_params[1], m_params[2]);
297 sprintf(buf,
"Y = %.8f * (max[(%.8f * X^%.8f - %.8f), 0] / (%.8f - %.8f * X^%.8f))^%.8f\n\n",
298 m_params[5], m_params[6], m_params[1], m_params[2], m_params[3], m_params[4], m_params[1], m_params[0]);
300 sprintf(buf,
"Y = %.8f * (max[(%.8f * X - %.8f), 0] / (%.8f - %.8f * X))^%.8f\n\n",
301 m_params[5], m_params[6], m_params[2], m_params[3], m_params[4], m_params[0]);
307 sprintf(buf,
"Y = %.8f * ((%.8f + %.8f * X^%.8f) / (1 + %.8f * X^%.8f))^%.8f\n\n",
308 m_params[5], m_params[2], m_params[3], m_params[1], m_params[4], m_params[1], m_params[0]);
310 sprintf(buf,
"Y = %.8f * ((%.8f + %.8f * X) / (1 + %.8f * X))^%.8f\n\n",
311 m_params[5], m_params[2], m_params[3], m_params[4], m_params[0]);
317 sprintf(buf,
"Unknown Function with %d parameters:\n\n", m_nParameters);
320 for (i=0; i<m_nParameters; i++) {
321 sprintf(buf,
"Param[%d] = %.8lf\n\n", i, m_params[i]);
513 switch (m_nFunctionType) {
515 if (!m_params || m_nParameters<4)
521 else if (
icIsNear(m_params[2], 0.0))
523 else if (
icIsNear(m_params[3], 0.0))
535 if (!m_params || m_nParameters<5)
542 if (!m_params || m_nParameters < 5)
546 if (!m_params || m_nParameters < 5)
558 if (!m_params || m_nParameters < 6)
570 if (!m_params || m_nParameters < 7)
582 if (!m_params || m_nParameters < 6)
620 switch (m_nFunctionType) {
623 switch (m_nShortcutType) {
626 return (
icFloatNumber)(pow(m_params[1] * v + m_params[2], m_params[0]) + m_params[3]);
628 return (m_params[1] * v);
630 return (m_params[1] * v + m_params[3]);
632 return (m_params[1] * v + m_params[2]);
634 return (m_params[1] * v + m_params[2] + m_params[3]);
639 return (
icFloatNumber)(m_params[1] * log10(m_params[2] * pow(v, m_params[0]) + m_params[3]) + m_params[4]);
643 return (
icFloatNumber)(m_params[0] * pow(m_params[1], m_params[2] * v + m_params[3]) + m_params[4]);
647 return (
icFloatNumber)(m_params[1] *
clipPow(m_params[2] * v + m_params[3], m_params[0]) + m_params[4]);
651 if (m_nShortcutType != 1)
652 return (
icFloatNumber)(m_params[1] * log(m_params[4] * pow(v, m_params[0]) - m_params[2]) + m_params[3]);
654 return (
icFloatNumber)(m_params[1] * log(m_params[4] * v - m_params[2]) + m_params[3]);
658 if (m_nShortcutType != 1)
659 return (
icFloatNumber)(m_params[5] * exp((m_params[4] * pow(v, m_params[0]) - m_params[3]) / m_params[1]) + m_params[2]);
661 return (
icFloatNumber)(m_params[5] * exp((m_params[4] * v - m_params[3]) / m_params[1]) + m_params[2]);
665 if (m_nShortcutType!=1) {
667 (m_params[3] - m_params[4] * pow(v, m_params[1])), m_params[0]));
671 (m_params[3] - m_params[4] * v), m_params[0]));
676 if (m_nShortcutType != 1) {
677 return (
icFloatNumber)(m_params[5] * pow((m_params[2] + m_params[3] * pow(v, m_params[1])) /
678 (1.0 + m_params[4] * pow(v, m_params[1])), m_params[0]));
681 return (
icFloatNumber)(m_params[5] * pow((m_params[2] + m_params[3] * v) /
682 (1.0 + m_params[4] * v), m_params[0]));
706 if (m_nReserved || m_nReserved2) {
708 sReport += sSigPathName;
709 sReport +=
" formula curve has non zero reserved data.\n";
713 switch (m_nFunctionType) {
715 if (!m_params || m_nParameters<4) {
717 sReport += sSigPathName;
718 sReport +=
" formula curve has Invalid formulaCurveSegment parameters.\n";
721 else if (m_nParameters > 4) {
723 sReport += sSigPathName;
724 sReport +=
" formula curve has too many formulaCurveSegment parameters.\n";
730 if (!m_params || m_nParameters<5) {
732 sReport += sSigPathName;
733 sReport +=
" formula curve has Invalid formulaCurveSegment parameters.\n";
736 else if (m_nParameters > 5) {
738 sReport += sSigPathName;
739 sReport +=
" formula curve has too many formulaCurveSegment parameters.\n";
745 if (!m_params || m_nParameters<5) {
747 sReport += sSigPathName;
748 sReport +=
" formula curve has Invalid formulaCurveSegment parameters.\n";
751 else if (m_nParameters > 5) {
753 sReport += sSigPathName;
754 sReport +=
" formula curve has too many formulaCurveSegment parameters.\n";
760 if (!m_params || m_nParameters<5) {
762 sReport += sSigPathName;
763 sReport +=
" formula curve has Invalid formulaCurveSegment parameters.\n";
766 else if (m_nParameters > 5) {
768 sReport += sSigPathName;
769 sReport +=
" formula curve has too many formulaCurveSegment parameters.\n";
775 if (!m_params || m_nParameters < 5) {
777 sReport += sSigPathName;
778 sReport +=
" formula curve has Invalid formulaCurveSegment parameters.\n";
781 else if (m_nParameters > 5) {
783 sReport += sSigPathName;
784 sReport +=
" formula curve has too many formulaCurveSegment parameters.\n";
790 if (!m_params || m_nParameters < 6) {
792 sReport += sSigPathName;
793 sReport +=
" formula curve has Invalid formulaCurveSegment parameters.\n";
796 else if (m_nParameters > 6) {
798 sReport += sSigPathName;
799 sReport +=
" formula curve has too many formulaCurveSegment parameters.\n";
805 if (!m_params || m_nParameters < 6) {
807 sReport += sSigPathName;
808 sReport +=
" formula curve has Invalid formulaCurveSegment parameters.\n";
811 else if (m_nParameters > 6) {
813 sReport += sSigPathName;
814 sReport +=
" formula curve has too many formulaCurveSegment parameters.\n";
820 if (!m_params || m_nParameters < 6) {
822 sReport += sSigPathName;
823 sReport +=
" formula curve has Invalid formulaCurveSegment parameters.\n";
826 else if (m_nParameters > 6) {
828 sReport += sSigPathName;
829 sReport +=
" formula curve has too many formulaCurveSegment parameters.\n";
838 sReport += sSigPathName;
839 sprintf(buf,
" formula curve uses unknown formulaCurveSegment function type %d\n", m_nFunctionType);
1605 if (headerSize > size)
1615 if (!pIO->
Read32(&m_nReserved))
1618 if (!pIO->
Read32(&m_nCount))
1627 if (!pIO->
Read16(&m_extensionType))
1630 if (!pIO->
Read16(&m_storageType))
1633 if (!SetSize(m_nCount,
false))
1636 if (m_nCount > size - headerSize)
1640 switch(m_storageType) {
1649 if (m_nCount * 2 > size - headerSize)
1656 if (m_nCount * 2 > size - headerSize)
1757 m_range = m_lastEntry - m_firstEntry;
1764 switch(m_extensionType) {
1767 m_loIntercept = m_pSamples[0];
1770 m_hiIntercept = m_pSamples[m_nCount-1];
1774 m_loSlope = (m_pSamples[1]-m_pSamples[0])/stepSize;
1775 m_loIntercept = m_pSamples[0] - m_loSlope*m_firstEntry;
1777 m_hiSlope = (m_pSamples[m_nCount-1] - m_pSamples[m_nCount-2])/stepSize;
1778 m_hiIntercept = m_pSamples[m_nCount-1] - m_hiSlope*m_lastEntry;
2338 if (m_nDesiredSize < 2 || !m_pCalc || !m_pCalc->Begin(nInterp, pMPE))
2349 m_range = m_lastEntry - m_firstEntry;
2363 m_pCalc->
Apply(pApply, &dst, &src);
2364 m_pSamples[i] = dst;
2370 switch (m_extensionType) {
2373 m_loIntercept = m_pSamples[0];
2376 m_hiIntercept = m_pSamples[m_nCount - 1];
2380 m_loSlope = (m_pSamples[1] - m_pSamples[0]) / stepSize;
2381 m_loIntercept = m_pSamples[0] - m_loSlope*m_firstEntry;
2383 m_hiSlope = (m_pSamples[m_nCount - 1] - m_pSamples[m_nCount - 2]) / stepSize;
2384 m_hiIntercept = m_pSamples[m_nCount - 1] - m_hiSlope*m_lastEntry;
2642 if (headerSize > size)
2655 if (!pIO->
Read32(&m_nReserved1))
2660 if (!pIO->
Read16(&nSegments))
2663 if (!pIO->
Read16(&m_nReserved2))
2673 if (
sizeof(segSig) > size - headerSize)
2676 if (!pIO->
Read32(&segSig))
2684 if (!pSeg->
Read(size-(pos-startPos), pIO)) {
2689 m_list->push_back(pSeg);
2691 else if (nSegments) {
2692 if (nSegments > size - headerSize)
2706 for (i=0; i<nSegments; i++) {
2708 if (!pIO->
Read32(&segSig)) {
2717 else if (i==nSegments-1)
2727 if (!pSeg->
Read(size-(pos-startPos), pIO)) {
2733 m_list->push_back(pSeg);
2909 if (m_nReserved1 || m_nReserved2) {
2911 sReport += sSigPathName;
2912 sReport +=
" Segmented curve has non zero reserved data.\n";
2916 if (m_list->size()==0) {
2918 sReport += sSigPathName;
2919 sReport +=
" Has Empty CurveSegment!\n";
2923 CIccCurveSegmentList::iterator i;
2925 for (i=m_list->begin(); i!=m_list->end(); i++) {
3227 if (headerSize > size)
3239 if (!pIO->
Read32(&m_nReserved))
3242 if (!pIO->
Read16(&nInputChannels))
3245 if (!pIO->
Read16(&nOutputChannels))
3248 if (nInputChannels != nOutputChannels)
3251 if (nInputChannels > size - headerSize || nInputChannels * 2*
sizeof(
icUInt32Number) > size - headerSize)
3254 if (!SetSize(nInputChannels))
3260 if (headerSize + m_nInputChannels*2*
sizeof(
icUInt32Number) > size)
3263 for (i=0; i<m_nInputChannels; i++) {
3264 if (!pIO->
Read32(&m_position[i].offset)) {
3267 if (!pIO->
Read32(&m_position[i].size)) {
3274 for (i=0; i<m_nInputChannels; i++) {
3275 if (!map[m_position[i].offset]) {
3277 if (!m_position[i].offset || !m_position[i].size) {
3281 pos = startPos + m_position[i].offset;
3286 if (!pIO->
Read32(&curveSig)) {
3299 if (!m_curve[i]->Read(m_position[i].size, pIO)) {
3303 map[m_position[i].offset] = m_curve[i];
3306 m_curve[i] = map[m_position[i].offset];
3456 std::string mpeSigPath = sigPath +
icGetSigPath(GetType());
3462 for (i=0; !empty && i<m_nInputChannels; i++) {
3467 rv =
icMaxStatus(rv, m_curve[i]->Validate(mpeSigPath, sReport, pMPE, pProfile));
3479 sReport += sSigPathName;
3480 sReport +=
" - Has Empty Curve Element(s)!\n";
3799 std::string mpeSigPath = sigPath +
icGetSigPath(GetType());
3802 if (m_nInputChannels!=1) {
3807 sReport += sSigPathName;
3808 sReport +=
" - Bad number of input channels!\n";
3812 if (!m_nOutputChannels) {
3817 sReport += sSigPathName;
3818 sReport +=
" - Bad number of output channels!\n";
3827 sReport += sSigPathName;
3828 sReport +=
" - Has no tint values(s)!\n";
3850 if ((nVals % m_nOutputChannels)!=0) {
3855 sReport += sSigPathName;
3856 sReport +=
" - Array size must be multiple of output channels!\n";
4430 if (!pIO->
Read32(&m_nReserved))
4433 if (!pIO->
Read16(&nInputChannels))
4436 if (!pIO->
Read16(&nOutputChannels))
4439 if (nInputChannels != nOutputChannels+1 || !nOutputChannels)
4442 m_nInputChannels = nInputChannels;
4443 SetNumOutputChannels(nOutputChannels);
4455 if (lumPos.
size <
sizeof(curveSig))
4459 if (!pIO->
Read32(&curveSig))
4469 if (!pCurve->
Read(lumPos.
size, pIO)) {
4473 SetLumCurve(pCurve);
4492 for (
int i = 0; i < m_nOutputChannels; i++) {
4494 !pIO->
Read32(&funcPos[i].size) ||
4504 for (j = 0; j < i; j++) {
4513 m_pToneFuncs[0] = NewToneMapFunc();
4514 if (!m_pToneFuncs[0]) {
4519 if (!m_pToneFuncs[0]->Read(funcPos[0].size, pIO)) {
4524 for (
int i = 1; i < m_nOutputChannels; i++) {
4525 for (j = 0; j < i; i++) {
4526 if (funcPos[j].offset == funcPos[i].offset)
4530 m_pToneFuncs[i] = m_pToneFuncs[j];
4532 m_pToneFuncs[i] = NewToneMapFunc();
4533 if (!m_pToneFuncs[i]) {
4538 if (!m_pToneFuncs[i]->Read(funcPos[i].size, pIO)) {
4546 m_nFunc = m_nOutputChannels;
4563 if (!m_pLumCurve || !m_pToneFuncs || !m_nOutputChannels)
4576 if (!pIO->
Write32(&m_nReserved))
4579 if (!pIO->
Write16(&m_nInputChannels))
4582 if (!pIO->
Write16(&m_nOutputChannels))
4594 for (
int i = 0; i < m_nOutputChannels; i++) {
4604 if (!m_pLumCurve->Write(pIO))
4616 funcPos[0].
offset = pIO->
Tell() - nTagStartPos;
4617 if (!m_pToneFuncs[0]->Write(pIO)) {
4621 funcPos[0].
size = pIO->
Tell() - (funcPos[0].
offset + nTagStartPos);
4624 for (
int i = 1; i < m_nOutputChannels; i++) {
4625 for (j = 0; j < i; j++)
4626 if (m_pToneFuncs[j] == m_pToneFuncs[i])
4629 funcPos[i] = funcPos[j];
4632 funcPos[i].
offset = pIO->
Tell() - nTagStartPos;
4633 if (!m_pToneFuncs[i]->Write(pIO)) {
4637 funcPos[i].
size = pIO->
Tell() - (funcPos[i].
offset + nTagStartPos);
4655 for (
int i = 0; i < m_nOutputChannels; i++) {
4657 !pIO->
Write32(&funcPos[i].size)) {
4733 std::string mpeSigPath = sigPath +
icGetSigPath(GetType());
4736 if (m_nInputChannels != m_nOutputChannels + 1) {
4741 sReport += sSigPathName;
4742 sReport +=
" - Bad number of input channels!\n";
4746 if (!m_nOutputChannels) {
4751 sReport += sSigPathName;
4752 sReport +=
" - Bad number of output channels!\n";
4761 sReport += sSigPathName;
4762 sReport +=
" - Has no luminance mapping curve!\n";
4766 rv =
icMaxStatus(rv, m_pLumCurve->Validate(mpeSigPath, sReport, pMPE, pProfile));
4769 if (!m_pToneFuncs) {
4774 sReport += sSigPathName;
4775 sReport +=
" - Has no tone mapping functions!\n";
4779 for (
int i = 0; i < m_nOutputChannels; i++) {
4780 std::string funcReport;
4782 sprintf(buf,
"#%d", i);
4783 if (!m_pToneFuncs[i]) {
4788 sReport += sSigPathName;
4789 sReport += std::string(
" - Missing Tone function #") + buf +
"\n";
4800 sReport += sSigPathName;
4801 sReport += std::string(
" - Tone Function #") + buf +
" status:\n" + funcReport;
5036 if (headerSize > size)
5050 if (!pIO->
Read32(&m_nReserved))
5053 if (!pIO->
Read16(&nInputChannels))
5056 if (!pIO->
Read16(&nOutputChannels))
5062 if (!SetSize(nInputChannels, nOutputChannels,
false))
5075 if (!SetSize(0, nOutputChannels))
5078 m_nInputChannels = nInputChannels;
5081 if (pIO->
ReadFloat32Float(m_pConstants, m_nOutputChannels)!=m_nOutputChannels)
5086 ((
icUInt32Number)nInputChannels*nOutputChannels + nOutputChannels) > dataSize ||
5091 if (!SetSize(nInputChannels, nOutputChannels))
5105 if (pIO->
ReadFloat32Float(m_pConstants, m_nOutputChannels)!=m_nOutputChannels)
5215 if (m_bApplyConstants) {
5218 *dstPixel++ = data[ 0]*srcPixel[0] + data[ 1]*srcPixel[1] + data[ 2]*srcPixel[2] + m_pConstants[0];
5219 *dstPixel++ = data[ 3]*srcPixel[0] + data[ 4]*srcPixel[1] + data[ 5]*srcPixel[2] + m_pConstants[1];
5220 *dstPixel = data[ 6]*srcPixel[0] + data[ 7]*srcPixel[1] + data[ 8]*srcPixel[2] + m_pConstants[2];
5224 *dstPixel++ = data[ 0]*srcPixel[0] + data[ 1]*srcPixel[1] + data[ 2]*srcPixel[2] + m_pConstants[0];
5225 *dstPixel++ = data[ 3]*srcPixel[0] + data[ 4]*srcPixel[1] + data[ 5]*srcPixel[2] + m_pConstants[1];
5226 *dstPixel++ = data[ 6]*srcPixel[0] + data[ 7]*srcPixel[1] + data[ 8]*srcPixel[2] + m_pConstants[2];
5227 *dstPixel = data[ 9]*srcPixel[0] + data[10]*srcPixel[1] + data[11]*srcPixel[2] + m_pConstants[3];
5231 *dstPixel++ = data[ 0]*srcPixel[0] + data[ 1]*srcPixel[1] + data[ 2]*srcPixel[2] + data[ 3]*srcPixel[3] + m_pConstants[0];
5232 *dstPixel++ = data[ 4]*srcPixel[0] + data[ 5]*srcPixel[1] + data[ 6]*srcPixel[2] + data[ 7]*srcPixel[3] + m_pConstants[1];
5233 *dstPixel = data[ 8]*srcPixel[0] + data[ 9]*srcPixel[1] + data[10]*srcPixel[2] + data[11]*srcPixel[3] + m_pConstants[2];
5237 *dstPixel++ = data[ 0]*srcPixel[0] + data[ 1]*srcPixel[1] + data[ 2]*srcPixel[2] + data[ 3]*srcPixel[3] + m_pConstants[0];
5238 *dstPixel++ = data[ 4]*srcPixel[0] + data[ 5]*srcPixel[1] + data[ 6]*srcPixel[2] + data[ 7]*srcPixel[3] + m_pConstants[1];
5239 *dstPixel++ = data[ 8]*srcPixel[0] + data[ 9]*srcPixel[1] + data[10]*srcPixel[2] + data[11]*srcPixel[3] + m_pConstants[2];
5240 *dstPixel = data[12]*srcPixel[0] + data[13]*srcPixel[1] + data[14]*srcPixel[2] + data[15]*srcPixel[3] + m_pConstants[3];
5248 for (j=0; j<m_nOutputChannels; j++) {
5249 *dstPixel = m_pConstants[j];
5251 for (i=0; i<m_nInputChannels; i++) {
5252 *dstPixel += data[i]*srcPixel[i];
5265 *dstPixel++ = data[0] * srcPixel[0] + data[1] * srcPixel[1] + data[2] * srcPixel[2];
5266 *dstPixel++ = data[3] * srcPixel[0] + data[4] * srcPixel[1] + data[5] * srcPixel[2];
5267 *dstPixel = data[6] * srcPixel[0] + data[7] * srcPixel[1] + data[8] * srcPixel[2];
5271 *dstPixel++ = data[0] * srcPixel[0] + data[1] * srcPixel[1] + data[2] * srcPixel[2];
5272 *dstPixel++ = data[3] * srcPixel[0] + data[4] * srcPixel[1] + data[5] * srcPixel[2];
5273 *dstPixel++ = data[6] * srcPixel[0] + data[7] * srcPixel[1] + data[8] * srcPixel[2];
5274 *dstPixel = data[9] * srcPixel[0] + data[10] * srcPixel[1] + data[11] * srcPixel[2];
5278 *dstPixel++ = data[0] * srcPixel[0] + data[1] * srcPixel[1] + data[2] * srcPixel[2] + data[3] * srcPixel[3];
5279 *dstPixel++ = data[4] * srcPixel[0] + data[5] * srcPixel[1] + data[6] * srcPixel[2] + data[7] * srcPixel[3];
5280 *dstPixel = data[8] * srcPixel[0] + data[9] * srcPixel[1] + data[10] * srcPixel[2] + data[11] * srcPixel[3];
5284 *dstPixel++ = data[0] * srcPixel[0] + data[1] * srcPixel[1] + data[2] * srcPixel[2] + data[3] * srcPixel[3];
5285 *dstPixel++ = data[4] * srcPixel[0] + data[5] * srcPixel[1] + data[6] * srcPixel[2] + data[7] * srcPixel[3];
5286 *dstPixel++ = data[8] * srcPixel[0] + data[9] * srcPixel[1] + data[10] * srcPixel[2] + data[11] * srcPixel[3];
5287 *dstPixel = data[12] * srcPixel[0] + data[13] * srcPixel[1] + data[14] * srcPixel[2] + data[15] * srcPixel[3];
5295 for (j = 0; j < m_nOutputChannels; j++) {
5298 for (i = 0; i < m_nInputChannels; i++) {
5299 *dstPixel += data[i] * srcPixel[i];
5310 else if (m_bApplyConstants) {
5311 memcpy(dstPixel, m_pConstants, m_nOutputChannels*
sizeof(
icFloatNumber));
5314 memset(dstPixel, 0, m_nOutputChannels *
sizeof(
icFloatNumber));