diff options
author | Marti Maria <info@littlecms.com> | 2017-11-12 18:15:10 +0100 |
---|---|---|
committer | Marti Maria <info@littlecms.com> | 2017-11-12 18:15:10 +0100 |
commit | 7e8fd03caab837c3be1ed3e256ab18f45a384165 (patch) | |
tree | 15d7d018f7dd7215d4b2d2f83b1a5b8cad94e9dd /src/cmspack.c | |
parent | 29b019fd8726da70f162c7ce193440fe1ec4236f (diff) | |
download | lcms2-7e8fd03caab837c3be1ed3e256ab18f45a384165.tar.gz |
Linestride & dynlibs
Fixed linestride on planar formatters
Fixed testbed to run on synamic libraries
Diffstat (limited to 'src/cmspack.c')
-rw-r--r-- | src/cmspack.c | 134 |
1 files changed, 107 insertions, 27 deletions
diff --git a/src/cmspack.c b/src/cmspack.c index 84b0097..5777178 100644 --- a/src/cmspack.c +++ b/src/cmspack.c @@ -531,7 +531,7 @@ cmsUInt8Number* UnrollPlanarWords(register _cmsTRANSFORM* info, cmsUInt8Number* Init = accum; if (DoSwap) { - accum += T_EXTRA(info -> InputFormat) * Stride * sizeof(cmsUInt16Number); + accum += T_EXTRA(info -> InputFormat) * Stride; } for (i=0; i < nChan; i++) { @@ -544,7 +544,7 @@ cmsUInt8Number* UnrollPlanarWords(register _cmsTRANSFORM* info, wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v; - accum += Stride * sizeof(cmsUInt16Number); + accum += Stride; } return (Init + sizeof(cmsUInt16Number)); @@ -772,13 +772,18 @@ cmsUInt8Number* UnrollLabDoubleTo16(register _cmsTRANSFORM* info, { if (T_PLANAR(info -> InputFormat)) { - cmsFloat64Number* Pt = (cmsFloat64Number*) accum; - cmsCIELab Lab; + cmsUInt8Number* pos_L; + cmsUInt8Number* pos_a; + cmsUInt8Number* pos_b; + + pos_L = accum; + pos_a = accum + Stride; + pos_b = accum + Stride * 2; - Lab.L = Pt[0]; - Lab.a = Pt[Stride]; - Lab.b = Pt[Stride*2]; + Lab.L = *(cmsFloat64Number*) pos_L; + Lab.a = *(cmsFloat64Number*) pos_a; + Lab.b = *(cmsFloat64Number*) pos_b; cmsFloat2LabEncoded(wIn, &Lab); return accum + sizeof(cmsFloat64Number); @@ -803,12 +808,17 @@ cmsUInt8Number* UnrollLabFloatTo16(register _cmsTRANSFORM* info, if (T_PLANAR(info -> InputFormat)) { - cmsFloat32Number* Pt = (cmsFloat32Number*) accum; + cmsUInt8Number* pos_L; + cmsUInt8Number* pos_a; + cmsUInt8Number* pos_b; + + pos_L = accum; + pos_a = accum + Stride; + pos_b = accum + Stride * 2; - - Lab.L = Pt[0]; - Lab.a = Pt[Stride]; - Lab.b = Pt[Stride*2]; + Lab.L = *(cmsFloat32Number*)pos_L; + Lab.a = *(cmsFloat32Number*)pos_a; + Lab.b = *(cmsFloat32Number*)pos_b; cmsFloat2LabEncoded(wIn, &Lab); return accum + sizeof(cmsFloat32Number); @@ -834,12 +844,19 @@ cmsUInt8Number* UnrollXYZDoubleTo16(register _cmsTRANSFORM* info, { if (T_PLANAR(info -> InputFormat)) { - cmsFloat64Number* Pt = (cmsFloat64Number*) accum; cmsCIEXYZ XYZ; + cmsUInt8Number* pos_X; + cmsUInt8Number* pos_Y; + cmsUInt8Number* pos_Z; + + pos_X = accum; + pos_Y = accum + Stride; + pos_Z = accum + Stride * 2; + + XYZ.X = *(cmsFloat64Number*)pos_X; + XYZ.Y = *(cmsFloat64Number*)pos_Y; + XYZ.Z = *(cmsFloat64Number*)pos_Z; - XYZ.X = Pt[0]; - XYZ.Y = Pt[Stride]; - XYZ.Z = Pt[Stride*2]; cmsFloat2XYZEncoded(wIn, &XYZ); return accum + sizeof(cmsFloat64Number); @@ -863,12 +880,19 @@ cmsUInt8Number* UnrollXYZFloatTo16(register _cmsTRANSFORM* info, { if (T_PLANAR(info -> InputFormat)) { - cmsFloat32Number* Pt = (cmsFloat32Number*) accum; cmsCIEXYZ XYZ; + cmsUInt8Number* pos_X; + cmsUInt8Number* pos_Y; + cmsUInt8Number* pos_Z; + + pos_X = accum; + pos_Y = accum + Stride; + pos_Z = accum + Stride * 2; + + XYZ.X = *(cmsFloat32Number*)pos_X; + XYZ.Y = *(cmsFloat32Number*)pos_Y; + XYZ.Z = *(cmsFloat32Number*)pos_Z; - XYZ.X = Pt[0]; - XYZ.Y = Pt[Stride]; - XYZ.Z = Pt[Stride*2]; cmsFloat2XYZEncoded(wIn, &XYZ); return accum + sizeof(cmsFloat32Number); @@ -913,6 +937,20 @@ cmsINLINE cmsBool IsInkSpace(cmsUInt32Number Type) } } +// Return the size in bytes of a given formatter +static +cmsUInt32Number PixelSize(cmsUInt32Number Format) +{ + cmsUInt32Number fmt_bytes = T_BYTES(Format); + + // For double, the T_BYTES field is zero + if (fmt_bytes == 0) + return sizeof(cmsUInt64Number); + + // Otherwise, it is already correct for all formats + return fmt_bytes; +} + // Inks does come in percentage, remaining cases are between 0..1.0, again to 16 bits static cmsUInt8Number* UnrollDoubleTo16(register _cmsTRANSFORM* info, @@ -934,6 +972,8 @@ cmsUInt8Number* UnrollDoubleTo16(register _cmsTRANSFORM* info, cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0; + Stride /= PixelSize(info->InputFormat); + if (ExtraFirst) start = Extra; @@ -989,6 +1029,7 @@ cmsUInt8Number* UnrollFloatTo16(register _cmsTRANSFORM* info, cmsUInt32Number i, start = 0; cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0; + Stride /= PixelSize(info->InputFormat); if (ExtraFirst) start = Extra; @@ -1065,6 +1106,7 @@ cmsUInt8Number* UnrollFloatsToFloat(_cmsTRANSFORM* info, cmsUInt32Number i, start = 0; cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F; + Stride /= PixelSize(info->InputFormat); if (ExtraFirst) start = Extra; @@ -1117,6 +1159,7 @@ cmsUInt8Number* UnrollDoublesToFloat(_cmsTRANSFORM* info, cmsUInt32Number i, start = 0; cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 100.0 : 1.0; + Stride /= PixelSize(info->InputFormat); if (ExtraFirst) start = Extra; @@ -1162,7 +1205,9 @@ cmsUInt8Number* UnrollLabDoubleToFloat(_cmsTRANSFORM* info, if (T_PLANAR(info -> InputFormat)) { - wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 + Stride /= PixelSize(info->InputFormat); + + wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0); // form -128..+127 to 0..1 wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0); @@ -1190,6 +1235,8 @@ cmsUInt8Number* UnrollLabFloatToFloat(_cmsTRANSFORM* info, if (T_PLANAR(info -> InputFormat)) { + Stride /= PixelSize(info->InputFormat); + wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0); // form -128..+127 to 0..1 wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0); @@ -1220,6 +1267,8 @@ cmsUInt8Number* UnrollXYZDoubleToFloat(_cmsTRANSFORM* info, if (T_PLANAR(info -> InputFormat)) { + Stride /= PixelSize(info->InputFormat); + wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ); wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ); wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ); @@ -1247,6 +1296,8 @@ cmsUInt8Number* UnrollXYZFloatToFloat(_cmsTRANSFORM* info, if (T_PLANAR(info -> InputFormat)) { + Stride /= PixelSize(info->InputFormat); + wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ); wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ); wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ); @@ -1429,7 +1480,7 @@ cmsUInt8Number* PackPlanarWords(register _cmsTRANSFORM* info, cmsUInt16Number v; if (DoSwap) { - output += T_EXTRA(info -> OutputFormat) * Stride * sizeof(cmsUInt16Number); + output += T_EXTRA(info -> OutputFormat) * Stride; } for (i=0; i < nChan; i++) { @@ -1445,7 +1496,7 @@ cmsUInt8Number* PackPlanarWords(register _cmsTRANSFORM* info, v = REVERSE_FLAVOR_16(v); *(cmsUInt16Number*) output = v; - output += (Stride * sizeof(cmsUInt16Number)); + output += Stride; } return (Init + sizeof(cmsUInt16Number)); @@ -2297,6 +2348,8 @@ cmsUInt8Number* PackLabFloatFrom16(register _cmsTRANSFORM* info, cmsFloat32Number* Out = (cmsFloat32Number*) output; + Stride /= PixelSize(info->OutputFormat); + Out[0] = (cmsFloat32Number)Lab.L; Out[Stride] = (cmsFloat32Number)Lab.a; Out[Stride*2] = (cmsFloat32Number)Lab.b; @@ -2325,6 +2378,8 @@ cmsUInt8Number* PackXYZDoubleFrom16(register _cmsTRANSFORM* Info, cmsFloat64Number* Out = (cmsFloat64Number*) output; cmsXYZEncoded2Float(&XYZ, wOut); + Stride /= PixelSize(Info->OutputFormat); + Out[0] = XYZ.X; Out[Stride] = XYZ.Y; Out[Stride*2] = XYZ.Z; @@ -2352,6 +2407,8 @@ cmsUInt8Number* PackXYZFloatFrom16(register _cmsTRANSFORM* Info, cmsFloat32Number* Out = (cmsFloat32Number*) output; cmsXYZEncoded2Float(&XYZ, wOut); + Stride /= PixelSize(Info->OutputFormat); + Out[0] = (cmsFloat32Number) XYZ.X; Out[Stride] = (cmsFloat32Number) XYZ.Y; Out[Stride*2] = (cmsFloat32Number) XYZ.Z; @@ -2391,6 +2448,8 @@ cmsUInt8Number* PackDoubleFrom16(register _cmsTRANSFORM* info, cmsFloat64Number* swap1 = (cmsFloat64Number*) output; cmsUInt32Number i, start = 0; + Stride /= PixelSize(info->OutputFormat); + if (ExtraFirst) start = Extra; @@ -2442,6 +2501,8 @@ cmsUInt8Number* PackFloatFrom16(register _cmsTRANSFORM* info, cmsFloat32Number* swap1 = (cmsFloat32Number*)output; cmsUInt32Number i, start = 0; + Stride /= PixelSize(info->OutputFormat); + if (ExtraFirst) start = Extra; @@ -2495,6 +2556,8 @@ cmsUInt8Number* PackFloatsFromFloat(_cmsTRANSFORM* info, cmsFloat64Number v = 0; cmsUInt32Number i, start = 0; + Stride /= PixelSize(info->OutputFormat); + if (ExtraFirst) start = Extra; @@ -2544,6 +2607,8 @@ cmsUInt8Number* PackDoublesFromFloat(_cmsTRANSFORM* info, cmsFloat64Number* swap1 = (cmsFloat64Number*)output; cmsUInt32Number i, start = 0; + Stride /= PixelSize(info->OutputFormat); + if (ExtraFirst) start = Extra; @@ -2590,6 +2655,8 @@ cmsUInt8Number* PackLabFloatFromFloat(_cmsTRANSFORM* Info, if (T_PLANAR(Info -> OutputFormat)) { + Stride /= PixelSize(Info->OutputFormat); + Out[0] = (cmsFloat32Number) (wOut[0] * 100.0); Out[Stride] = (cmsFloat32Number) (wOut[1] * 255.0 - 128.0); Out[Stride*2] = (cmsFloat32Number) (wOut[2] * 255.0 - 128.0); @@ -2618,6 +2685,8 @@ cmsUInt8Number* PackLabDoubleFromFloat(_cmsTRANSFORM* Info, if (T_PLANAR(Info -> OutputFormat)) { + Stride /= PixelSize(Info->OutputFormat); + Out[0] = (cmsFloat64Number) (wOut[0] * 100.0); Out[Stride] = (cmsFloat64Number) (wOut[1] * 255.0 - 128.0); Out[Stride*2] = (cmsFloat64Number) (wOut[2] * 255.0 - 128.0); @@ -2647,6 +2716,8 @@ cmsUInt8Number* PackXYZFloatFromFloat(_cmsTRANSFORM* Info, if (T_PLANAR(Info -> OutputFormat)) { + Stride /= PixelSize(Info->OutputFormat); + Out[0] = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ); Out[Stride] = (cmsFloat32Number) (wOut[1] * MAX_ENCODEABLE_XYZ); Out[Stride*2] = (cmsFloat32Number) (wOut[2] * MAX_ENCODEABLE_XYZ); @@ -2675,6 +2746,8 @@ cmsUInt8Number* PackXYZDoubleFromFloat(_cmsTRANSFORM* Info, if (T_PLANAR(Info -> OutputFormat)) { + Stride /= PixelSize(Info->OutputFormat); + Out[0] = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ); Out[Stride] = (cmsFloat64Number) (wOut[1] * MAX_ENCODEABLE_XYZ); Out[Stride*2] = (cmsFloat64Number) (wOut[2] * MAX_ENCODEABLE_XYZ); @@ -2718,6 +2791,8 @@ cmsUInt8Number* UnrollHalfTo16(register _cmsTRANSFORM* info, cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 655.35F : 65535.0F; + Stride /= PixelSize(info->OutputFormat); + if (ExtraFirst) start = Extra; @@ -2769,6 +2844,7 @@ cmsUInt8Number* UnrollHalfToFloat(_cmsTRANSFORM* info, cmsUInt32Number i, start = 0; cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F; + Stride /= PixelSize(info->OutputFormat); if (ExtraFirst) start = Extra; @@ -2820,6 +2896,8 @@ cmsUInt8Number* PackHalfFrom16(register _cmsTRANSFORM* info, cmsUInt16Number* swap1 = (cmsUInt16Number*)output; cmsUInt32Number i, start = 0; + Stride /= PixelSize(info->OutputFormat); + if (ExtraFirst) start = Extra; @@ -2871,6 +2949,8 @@ cmsUInt8Number* PackHalfFromFloat(_cmsTRANSFORM* info, cmsFloat32Number v = 0; cmsUInt32Number i, start = 0; + Stride /= PixelSize(info->OutputFormat); + if (ExtraFirst) start = Extra; @@ -3288,10 +3368,10 @@ cmsBool _cmsRegisterFormattersPlugin(cmsContext ContextID, cmsPluginBase* Data) return TRUE; } -cmsFormatter _cmsGetFormatter(cmsContext ContextID, - cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8 - cmsFormatterDirection Dir, - cmsUInt32Number dwFlags) +cmsFormatter CMSEXPORT _cmsGetFormatter(cmsContext ContextID, + cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8 + cmsFormatterDirection Dir, + cmsUInt32Number dwFlags) { _cmsFormattersPluginChunkType* ctx = ( _cmsFormattersPluginChunkType*) _cmsContextGetClientChunk(ContextID, FormattersPlugin); cmsFormattersFactoryList* f; |