diff options
| author | Matthieu Darbois <mayeut@users.noreply.github.com> | 2016-08-06 13:04:56 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-08-06 13:04:56 +0200 |
| commit | 4a2a8693e5a02207a8813b02a375abdc4e43c49b (patch) | |
| tree | 546b6aa9a7ed2bdbd215775ef1bf375e2d6a0598 /thirdparty/liblcms2/src/cmsalpha.c | |
| parent | 1509ccc51f8de0523821ffd2f3d1946b10e49614 (diff) | |
Update to lcms 2.8 (#808)
Diffstat (limited to 'thirdparty/liblcms2/src/cmsalpha.c')
| -rw-r--r-- | thirdparty/liblcms2/src/cmsalpha.c | 153 |
1 files changed, 95 insertions, 58 deletions
diff --git a/thirdparty/liblcms2/src/cmsalpha.c b/thirdparty/liblcms2/src/cmsalpha.c index 904ce715..7d6aa345 100644 --- a/thirdparty/liblcms2/src/cmsalpha.c +++ b/thirdparty/liblcms2/src/cmsalpha.c @@ -408,74 +408,111 @@ void ComputeComponentIncrements(cmsUInt32Number Format, // Handles extra channels copying alpha if requested by the flags void _cmsHandleExtraChannels(_cmsTRANSFORM* p, const void* in, - void* out, - cmsUInt32Number PixelsPerLine, - cmsUInt32Number LineCount, - const cmsStride* Stride) -{ - size_t i, j, k; - cmsUInt32Number nExtra; - cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; - cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; - cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; - cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; - cmsUInt32Number SourceStrideIncrements[cmsMAXCHANNELS]; - cmsUInt32Number DestStrideIncrements[cmsMAXCHANNELS]; - - cmsUInt8Number* SourcePtr[cmsMAXCHANNELS]; - cmsUInt8Number* DestPtr[cmsMAXCHANNELS]; - - cmsFormatterAlphaFn copyValueFn; - - // Make sure we need some copy - if (!(p->dwOriginalFlags & cmsFLAGS_COPY_ALPHA)) - return; - - // Make sure we have same number of alpha channels. If not, just return as this should be checked at transform creation time. - nExtra = T_EXTRA(p->InputFormat); - if (nExtra != T_EXTRA(p->OutputFormat)) - return; - - // Anything to do? - if (nExtra == 0) - return; + void* out, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + cmsUInt32Number i, j, k; + cmsUInt32Number nExtra; + cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; + cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; - // Compute the increments - ComputeComponentIncrements(p->InputFormat, Stride->BytesPerPlaneIn, SourceStartingOrder, SourceIncrements); - ComputeComponentIncrements(p->OutputFormat, Stride->BytesPerPlaneOut, DestStartingOrder, DestIncrements); - - // Check for conversions 8, 16, half, float, dbl - copyValueFn = _cmsGetFormatterAlpha(p->ContextID, p->InputFormat, p->OutputFormat); + cmsFormatterAlphaFn copyValueFn; - memset(SourceStrideIncrements, 0, sizeof(SourceStrideIncrements)); - memset(DestStrideIncrements, 0, sizeof(DestStrideIncrements)); + // Make sure we need some copy + if (!(p->dwOriginalFlags & cmsFLAGS_COPY_ALPHA)) + return; - // The loop itself - for (i = 0; i < LineCount; i++) { + // Exit early if in-place color-management is occurring - no need to copy extra channels to themselves. + if (p->InputFormat == p->OutputFormat && in == out) + return; - // Prepare pointers for the loop - for (j = 0; j < nExtra; j++) { + // Make sure we have same number of alpha channels. If not, just return as this should be checked at transform creation time. + nExtra = T_EXTRA(p->InputFormat); + if (nExtra != T_EXTRA(p->OutputFormat)) + return; - SourcePtr[j] = (cmsUInt8Number*)in + SourceStartingOrder[j] + SourceStrideIncrements[j]; - DestPtr[j] = (cmsUInt8Number*)out + DestStartingOrder[j] + DestStrideIncrements[j]; - } + // Anything to do? + if (nExtra == 0) + return; - for (j = 0; j < PixelsPerLine; j++) { + // Compute the increments + ComputeComponentIncrements(p->InputFormat, Stride->BytesPerPlaneIn, SourceStartingOrder, SourceIncrements); + ComputeComponentIncrements(p->OutputFormat, Stride->BytesPerPlaneOut, DestStartingOrder, DestIncrements); - for (k = 0; k < nExtra; k++) { + // Check for conversions 8, 16, half, float, dbl + copyValueFn = _cmsGetFormatterAlpha(p->ContextID, p->InputFormat, p->OutputFormat); - copyValueFn(DestPtr[k], SourcePtr[k]); + if (nExtra == 1) { // Optimized routine for copying a single extra channel quickly - SourcePtr[k] += SourceIncrements[k]; - DestPtr[k] += DestIncrements[k]; - } - } + cmsUInt8Number* SourcePtr; + cmsUInt8Number* DestPtr; - for (j = 0; j < nExtra; j++) { + cmsUInt32Number SourceStrideIncrement = 0; + cmsUInt32Number DestStrideIncrement = 0; - SourceStrideIncrements[j] += Stride->BytesPerLineIn; - DestStrideIncrements[j] += Stride->BytesPerLineOut; - } - } + // The loop itself + for (i = 0; i < LineCount; i++) { + + // Prepare pointers for the loop + SourcePtr = (cmsUInt8Number*)in + SourceStartingOrder[0] + SourceStrideIncrement; + DestPtr = (cmsUInt8Number*)out + DestStartingOrder[0] + DestStrideIncrement; + + for (j = 0; j < PixelsPerLine; j++) { + + copyValueFn(DestPtr, SourcePtr); + + SourcePtr += SourceIncrements[0]; + DestPtr += DestIncrements[0]; + } + + SourceStrideIncrement += Stride->BytesPerLineIn; + DestStrideIncrement += Stride->BytesPerLineOut; + } + + } + else { // General case with more than one extra channel + + cmsUInt8Number* SourcePtr[cmsMAXCHANNELS]; + cmsUInt8Number* DestPtr[cmsMAXCHANNELS]; + + cmsUInt32Number SourceStrideIncrements[cmsMAXCHANNELS]; + cmsUInt32Number DestStrideIncrements[cmsMAXCHANNELS]; + + memset(SourceStrideIncrements, 0, sizeof(SourceStrideIncrements)); + memset(DestStrideIncrements, 0, sizeof(DestStrideIncrements)); + + // The loop itself + for (i = 0; i < LineCount; i++) { + + // Prepare pointers for the loop + for (j = 0; j < nExtra; j++) { + + SourcePtr[j] = (cmsUInt8Number*)in + SourceStartingOrder[j] + SourceStrideIncrements[j]; + DestPtr[j] = (cmsUInt8Number*)out + DestStartingOrder[j] + DestStrideIncrements[j]; + } + + for (j = 0; j < PixelsPerLine; j++) { + + for (k = 0; k < nExtra; k++) { + + copyValueFn(DestPtr[k], SourcePtr[k]); + + SourcePtr[k] += SourceIncrements[k]; + DestPtr[k] += DestIncrements[k]; + } + } + + for (j = 0; j < nExtra; j++) { + + SourceStrideIncrements[j] += Stride->BytesPerLineIn; + DestStrideIncrements[j] += Stride->BytesPerLineOut; + } + } + } } + |
