#include "fast_float_internal.h"
static
int trueBytesSize(cmsUInt32Number Format)
{
int fmt_bytes = T_BYTES(Format);
if (fmt_bytes == 0)
return sizeof(double);
return fmt_bytes;
}
static
void ComputeIncrementsForChunky(cmsUInt32Number Format,
cmsUInt32Number BytesPerPlane,
cmsUInt32Number* nChannels,
cmsUInt32Number* nAlpha,
cmsUInt32Number ComponentStartingOrder[],
cmsUInt32Number ComponentPointerIncrements[])
{
int extra = T_EXTRA(Format);
int channels = T_CHANNELS(Format);
int total_chans = channels + extra;
int i;
int channelSize = trueBytesSize(Format);
int pixelSize = channelSize * total_chans;
UNUSED_PARAMETER(BytesPerPlane);
if (nChannels != NULL)
*nChannels = channels;
if (nAlpha != NULL)
*nAlpha = extra;
for (i = 0; i < total_chans; i++)
ComponentPointerIncrements[i] = pixelSize;
for (i = 0; i < total_chans; i++)
{
if (T_DOSWAP(Format)) {
ComponentStartingOrder[i] = total_chans - i - 1;
}
else {
ComponentStartingOrder[i] = i;
}
}
if (T_SWAPFIRST(Format)) {
cmsUInt32Number tmp = ComponentStartingOrder[0];
for (i = 0; i < total_chans-1; i++)
ComponentStartingOrder[i] = ComponentStartingOrder[i + 1];
ComponentStartingOrder[total_chans - 1] = tmp;
}
if (channelSize > 1)
for (i = 0; i < total_chans; i++) {
ComponentStartingOrder[i] *= channelSize;
}
}
static
void ComputeIncrementsForPlanar(cmsUInt32Number Format,
cmsUInt32Number BytesPerPlane,
cmsUInt32Number* nChannels,
cmsUInt32Number* nAlpha,
cmsUInt32Number ComponentStartingOrder[],
cmsUInt32Number ComponentPointerIncrements[])
{
int extra = T_EXTRA(Format);
int channels = T_CHANNELS(Format);
int total_chans = channels + extra;
int i;
int channelSize = trueBytesSize(Format);
if (nChannels != NULL)
*nChannels = channels;
if (nAlpha != NULL)
*nAlpha = extra;
for (i = 0; i < total_chans; i++)
ComponentPointerIncrements[i] = channelSize;
for (i = 0; i < total_chans; i++)
{
if (T_DOSWAP(Format)) {
ComponentStartingOrder[i] = total_chans - i - 1;
}
else {
ComponentStartingOrder[i] = i;
}
}
if (T_SWAPFIRST(Format)) {
cmsUInt32Number tmp = ComponentStartingOrder[0];
for (i = 0; i < total_chans - 1; i++)
ComponentStartingOrder[i] = ComponentStartingOrder[i + 1];
ComponentStartingOrder[total_chans - 1] = tmp;
}
for (i = 0; i < total_chans; i++) {
ComponentStartingOrder[i] *= BytesPerPlane;
}
}
CMSCHECKPOINT void CMSEXPORT _cmsComputeComponentIncrements(cmsUInt32Number Format,
cmsUInt32Number BytesPerPlane,
cmsUInt32Number* nChannels,
cmsUInt32Number* nAlpha,
cmsUInt32Number ComponentStartingOrder[],
cmsUInt32Number ComponentPointerIncrements[])
{
if (T_PLANAR(Format)) {
ComputeIncrementsForPlanar(Format, BytesPerPlane, nChannels, nAlpha, ComponentStartingOrder, ComponentPointerIncrements);
}
else {
ComputeIncrementsForChunky(Format, BytesPerPlane, nChannels, nAlpha, ComponentStartingOrder, ComponentPointerIncrements);
}
}