spacepaste

  1.  
  2. diff -pruN lcms2-2.9.orig/ChangeLog lcms2-2.9/ChangeLog
  3. --- lcms2-2.9.orig/ChangeLog 2017-11-01 02:36:47.000000000 +1100
  4. +++ lcms2-2.9/ChangeLog 2017-11-13 04:15:10.000000000 +1100
  5. @@ -5,6 +5,9 @@
  6. Several fixes related with security, and therefore not detailed here.
  7. C++ compiles now without warnings
  8. Added OSX and clang in travis
  9. +Added a travis-ci test matrix for many compilers and OS. Thanks to Thomas Weber (debian) for this great improvement.
  10. +testbed can now work with dynamic versions of library
  11. +Fixed wrong planar formatters regarding linestride interpretation
  12. -----------------------
  13. 2.8 Featured release
  14. diff -pruN lcms2-2.9.orig/src/cmshalf.c lcms2-2.9/src/cmshalf.c
  15. --- lcms2-2.9.orig/src/cmshalf.c 2017-11-01 02:36:47.000000000 +1100
  16. +++ lcms2-2.9/src/cmshalf.c 2017-11-13 04:15:10.000000000 +1100
  17. @@ -503,7 +503,7 @@ static cmsUInt8Number Shift[512] = {
  18. 0x18, 0x18, 0x18, 0x18, 0x0d
  19. };
  20. -cmsFloat32Number _cmsHalf2Float(cmsUInt16Number h)
  21. +cmsFloat32Number CMSEXPORT _cmsHalf2Float(cmsUInt16Number h)
  22. {
  23. union {
  24. cmsFloat32Number flt;
  25. @@ -516,7 +516,7 @@ cmsFloat32Number _cmsHalf2Float(cmsUInt1
  26. return out.flt;
  27. }
  28. -cmsUInt16Number _cmsFloat2Half(cmsFloat32Number flt)
  29. +cmsUInt16Number CMSEXPORT _cmsFloat2Half(cmsFloat32Number flt)
  30. {
  31. union {
  32. cmsFloat32Number flt;
  33. diff -pruN lcms2-2.9.orig/src/cmsintrp.c lcms2-2.9/src/cmsintrp.c
  34. --- lcms2-2.9.orig/src/cmsintrp.c 2017-11-01 02:36:47.000000000 +1100
  35. +++ lcms2-2.9/src/cmsintrp.c 2017-11-13 04:15:10.000000000 +1100
  36. @@ -158,8 +158,8 @@ cmsInterpParams* _cmsComputeInterpParams
  37. // This one is a wrapper on the anterior, but assuming all directions have same number of nodes
  38. -cmsInterpParams* _cmsComputeInterpParams(cmsContext ContextID, cmsUInt32Number nSamples,
  39. - cmsUInt32Number InputChan, cmsUInt32Number OutputChan, const void* Table, cmsUInt32Number dwFlags)
  40. +cmsInterpParams* CMSEXPORT _cmsComputeInterpParams(cmsContext ContextID, cmsUInt32Number nSamples,
  41. + cmsUInt32Number InputChan, cmsUInt32Number OutputChan, const void* Table, cmsUInt32Number dwFlags)
  42. {
  43. int i;
  44. cmsUInt32Number Samples[MAX_INPUT_DIMENSIONS];
  45. @@ -174,7 +174,7 @@ cmsInterpParams* _cmsComputeInterpParams
  46. // Free all associated memory
  47. -void _cmsFreeInterpParams(cmsInterpParams* p)
  48. +void CMSEXPORT _cmsFreeInterpParams(cmsInterpParams* p)
  49. {
  50. if (p != NULL) _cmsFree(p ->ContextID, p);
  51. }
  52. diff -pruN lcms2-2.9.orig/src/cmsio1.c lcms2-2.9/src/cmsio1.c
  53. --- lcms2-2.9.orig/src/cmsio1.c 2017-11-01 02:36:47.000000000 +1100
  54. +++ lcms2-2.9/src/cmsio1.c 2017-11-13 04:15:10.000000000 +1100
  55. @@ -307,7 +307,7 @@ Error:
  56. // Read and create a BRAND NEW MPE LUT from a given profile. All stuff dependent of version, etc
  57. // is adjusted here in order to create a LUT that takes care of all those details.
  58. // We add intent = 0xffffffff as a way to read matrix shaper always, no matter of other LUT
  59. -cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent)
  60. +cmsPipeline* CMSEXPORT _cmsReadInputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent)
  61. {
  62. cmsTagTypeSignature OriginalType;
  63. cmsTagSignature tag16;
  64. @@ -582,7 +582,7 @@ Error:
  65. }
  66. // Create an output MPE LUT from agiven profile. Version mismatches are handled here
  67. -cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent)
  68. +cmsPipeline* CMSEXPORT _cmsReadOutputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent)
  69. {
  70. cmsTagTypeSignature OriginalType;
  71. cmsTagSignature tag16;
  72. @@ -705,7 +705,7 @@ Error:
  73. // This one includes abstract profiles as well. Matrix-shaper cannot be obtained on that device class. The
  74. // tag name here may default to AToB0
  75. -cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent)
  76. +cmsPipeline* CMSEXPORT _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent)
  77. {
  78. cmsPipeline* Lut;
  79. cmsTagTypeSignature OriginalType;
  80. diff -pruN lcms2-2.9.orig/src/cmslut.c lcms2-2.9/src/cmslut.c
  81. --- lcms2-2.9.orig/src/cmslut.c 2017-11-01 02:36:47.000000000 +1100
  82. +++ lcms2-2.9/src/cmslut.c 2017-11-13 04:15:10.000000000 +1100
  83. @@ -292,7 +292,7 @@ cmsStage* CMSEXPORT cmsStageAllocToneCur
  84. // Create a bunch of identity curves
  85. -cmsStage* _cmsStageAllocIdentityCurves(cmsContext ContextID, cmsUInt32Number nChannels)
  86. +cmsStage* CMSEXPORT _cmsStageAllocIdentityCurves(cmsContext ContextID, cmsUInt32Number nChannels)
  87. {
  88. cmsStage* mpe = cmsStageAllocToneCurves(ContextID, nChannels, NULL);
  89. @@ -712,7 +712,7 @@ int IdentitySampler(register const cmsUI
  90. }
  91. // Creates an MPE that just copies input to output
  92. -cmsStage* _cmsStageAllocIdentityCLut(cmsContext ContextID, cmsUInt32Number nChan)
  93. +cmsStage* CMSEXPORT _cmsStageAllocIdentityCLut(cmsContext ContextID, cmsUInt32Number nChan)
  94. {
  95. cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS];
  96. cmsStage* mpe ;
  97. @@ -736,7 +736,7 @@ cmsStage* _cmsStageAllocIdentityCLut(cms
  98. // Quantize a value 0 <= i < MaxSamples to 0..0xffff
  99. -cmsUInt16Number _cmsQuantizeVal(cmsFloat64Number i, cmsUInt32Number MaxSamples)
  100. +cmsUInt16Number CMSEXPORT _cmsQuantizeVal(cmsFloat64Number i, cmsUInt32Number MaxSamples)
  101. {
  102. cmsFloat64Number x;
  103. @@ -969,7 +969,7 @@ void EvaluateLab2XYZ(const cmsFloat32Num
  104. // No dup or free routines needed, as the structure has no pointers in it.
  105. -cmsStage* _cmsStageAllocLab2XYZ(cmsContext ContextID)
  106. +cmsStage* CMSEXPORT _cmsStageAllocLab2XYZ(cmsContext ContextID)
  107. {
  108. return _cmsStageAllocPlaceholder(ContextID, cmsSigLab2XYZElemType, 3, 3, EvaluateLab2XYZ, NULL, NULL, NULL);
  109. }
  110. @@ -1020,7 +1020,7 @@ cmsStage* _cmsStageAllocLabV2ToV4curves(
  111. // ********************************************************************************
  112. // Matrix-based conversion, which is more accurate, but slower and cannot properly be saved in devicelink profiles
  113. -cmsStage* _cmsStageAllocLabV2ToV4(cmsContext ContextID)
  114. +cmsStage* CMSEXPORT _cmsStageAllocLabV2ToV4(cmsContext ContextID)
  115. {
  116. static const cmsFloat64Number V2ToV4[] = { 65535.0/65280.0, 0, 0,
  117. 0, 65535.0/65280.0, 0,
  118. @@ -1036,7 +1036,7 @@ cmsStage* _cmsStageAllocLabV2ToV4(cmsCon
  119. // Reverse direction
  120. -cmsStage* _cmsStageAllocLabV4ToV2(cmsContext ContextID)
  121. +cmsStage* CMSEXPORT _cmsStageAllocLabV4ToV2(cmsContext ContextID)
  122. {
  123. static const cmsFloat64Number V4ToV2[] = { 65280.0/65535.0, 0, 0,
  124. 0, 65280.0/65535.0, 0,
  125. @@ -1179,7 +1179,7 @@ void EvaluateXYZ2Lab(const cmsFloat32Num
  126. cmsUNUSED_PARAMETER(mpe);
  127. }
  128. -cmsStage* _cmsStageAllocXYZ2Lab(cmsContext ContextID)
  129. +cmsStage* CMSEXPORT _cmsStageAllocXYZ2Lab(cmsContext ContextID)
  130. {
  131. return _cmsStageAllocPlaceholder(ContextID, cmsSigXYZ2LabElemType, 3, 3, EvaluateXYZ2Lab, NULL, NULL, NULL);
  132. diff -pruN lcms2-2.9.orig/src/cmsnamed.c lcms2-2.9/src/cmsnamed.c
  133. --- lcms2-2.9.orig/src/cmsnamed.c 2017-11-01 02:36:47.000000000 +1100
  134. +++ lcms2-2.9/src/cmsnamed.c 2017-11-13 04:15:10.000000000 +1100
  135. @@ -730,7 +730,7 @@ void EvalNamedColor(const cmsFloat32Numb
  136. // Named color lookup element
  137. -cmsStage* _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS)
  138. +cmsStage* CMSEXPORT _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS)
  139. {
  140. return _cmsStageAllocPlaceholder(NamedColorList ->ContextID,
  141. cmsSigNamedColorElemType,
  142. diff -pruN lcms2-2.9.orig/src/cmspack.c lcms2-2.9/src/cmspack.c
  143. --- lcms2-2.9.orig/src/cmspack.c 2017-11-01 02:36:47.000000000 +1100
  144. +++ lcms2-2.9/src/cmspack.c 2017-11-13 04:15:10.000000000 +1100
  145. @@ -531,7 +531,7 @@ cmsUInt8Number* UnrollPlanarWords(regist
  146. cmsUInt8Number* Init = accum;
  147. if (DoSwap) {
  148. - accum += T_EXTRA(info -> InputFormat) * Stride * sizeof(cmsUInt16Number);
  149. + accum += T_EXTRA(info -> InputFormat) * Stride;
  150. }
  151. for (i=0; i < nChan; i++) {
  152. @@ -544,7 +544,7 @@ cmsUInt8Number* UnrollPlanarWords(regist
  153. wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v;
  154. - accum += Stride * sizeof(cmsUInt16Number);
  155. + accum += Stride;
  156. }
  157. return (Init + sizeof(cmsUInt16Number));
  158. @@ -772,13 +772,18 @@ cmsUInt8Number* UnrollLabDoubleTo16(regi
  159. {
  160. if (T_PLANAR(info -> InputFormat)) {
  161. - cmsFloat64Number* Pt = (cmsFloat64Number*) accum;
  162. -
  163. cmsCIELab Lab;
  164. -
  165. - Lab.L = Pt[0];
  166. - Lab.a = Pt[Stride];
  167. - Lab.b = Pt[Stride*2];
  168. + cmsUInt8Number* pos_L;
  169. + cmsUInt8Number* pos_a;
  170. + cmsUInt8Number* pos_b;
  171. +
  172. + pos_L = accum;
  173. + pos_a = accum + Stride;
  174. + pos_b = accum + Stride * 2;
  175. +
  176. + Lab.L = *(cmsFloat64Number*) pos_L;
  177. + Lab.a = *(cmsFloat64Number*) pos_a;
  178. + Lab.b = *(cmsFloat64Number*) pos_b;
  179. cmsFloat2LabEncoded(wIn, &Lab);
  180. return accum + sizeof(cmsFloat64Number);
  181. @@ -803,12 +808,17 @@ cmsUInt8Number* UnrollLabFloatTo16(regis
  182. if (T_PLANAR(info -> InputFormat)) {
  183. - cmsFloat32Number* Pt = (cmsFloat32Number*) accum;
  184. -
  185. -
  186. - Lab.L = Pt[0];
  187. - Lab.a = Pt[Stride];
  188. - Lab.b = Pt[Stride*2];
  189. + cmsUInt8Number* pos_L;
  190. + cmsUInt8Number* pos_a;
  191. + cmsUInt8Number* pos_b;
  192. +
  193. + pos_L = accum;
  194. + pos_a = accum + Stride;
  195. + pos_b = accum + Stride * 2;
  196. +
  197. + Lab.L = *(cmsFloat32Number*)pos_L;
  198. + Lab.a = *(cmsFloat32Number*)pos_a;
  199. + Lab.b = *(cmsFloat32Number*)pos_b;
  200. cmsFloat2LabEncoded(wIn, &Lab);
  201. return accum + sizeof(cmsFloat32Number);
  202. @@ -834,12 +844,19 @@ cmsUInt8Number* UnrollXYZDoubleTo16(regi
  203. {
  204. if (T_PLANAR(info -> InputFormat)) {
  205. - cmsFloat64Number* Pt = (cmsFloat64Number*) accum;
  206. cmsCIEXYZ XYZ;
  207. + cmsUInt8Number* pos_X;
  208. + cmsUInt8Number* pos_Y;
  209. + cmsUInt8Number* pos_Z;
  210. +
  211. + pos_X = accum;
  212. + pos_Y = accum + Stride;
  213. + pos_Z = accum + Stride * 2;
  214. +
  215. + XYZ.X = *(cmsFloat64Number*)pos_X;
  216. + XYZ.Y = *(cmsFloat64Number*)pos_Y;
  217. + XYZ.Z = *(cmsFloat64Number*)pos_Z;
  218. - XYZ.X = Pt[0];
  219. - XYZ.Y = Pt[Stride];
  220. - XYZ.Z = Pt[Stride*2];
  221. cmsFloat2XYZEncoded(wIn, &XYZ);
  222. return accum + sizeof(cmsFloat64Number);
  223. @@ -863,12 +880,19 @@ cmsUInt8Number* UnrollXYZFloatTo16(regis
  224. {
  225. if (T_PLANAR(info -> InputFormat)) {
  226. - cmsFloat32Number* Pt = (cmsFloat32Number*) accum;
  227. cmsCIEXYZ XYZ;
  228. + cmsUInt8Number* pos_X;
  229. + cmsUInt8Number* pos_Y;
  230. + cmsUInt8Number* pos_Z;
  231. +
  232. + pos_X = accum;
  233. + pos_Y = accum + Stride;
  234. + pos_Z = accum + Stride * 2;
  235. +
  236. + XYZ.X = *(cmsFloat32Number*)pos_X;
  237. + XYZ.Y = *(cmsFloat32Number*)pos_Y;
  238. + XYZ.Z = *(cmsFloat32Number*)pos_Z;
  239. - XYZ.X = Pt[0];
  240. - XYZ.Y = Pt[Stride];
  241. - XYZ.Z = Pt[Stride*2];
  242. cmsFloat2XYZEncoded(wIn, &XYZ);
  243. return accum + sizeof(cmsFloat32Number);
  244. @@ -913,6 +937,20 @@ cmsINLINE cmsBool IsInkSpace(cmsUInt32Nu
  245. }
  246. }
  247. +// Return the size in bytes of a given formatter
  248. +static
  249. +cmsUInt32Number PixelSize(cmsUInt32Number Format)
  250. +{
  251. + cmsUInt32Number fmt_bytes = T_BYTES(Format);
  252. +
  253. + // For double, the T_BYTES field is zero
  254. + if (fmt_bytes == 0)
  255. + return sizeof(cmsUInt64Number);
  256. +
  257. + // Otherwise, it is already correct for all formats
  258. + return fmt_bytes;
  259. +}
  260. +
  261. // Inks does come in percentage, remaining cases are between 0..1.0, again to 16 bits
  262. static
  263. cmsUInt8Number* UnrollDoubleTo16(register _cmsTRANSFORM* info,
  264. @@ -934,6 +972,8 @@ cmsUInt8Number* UnrollDoubleTo16(registe
  265. cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0;
  266. + Stride /= PixelSize(info->InputFormat);
  267. +
  268. if (ExtraFirst)
  269. start = Extra;
  270. @@ -989,6 +1029,7 @@ cmsUInt8Number* UnrollFloatTo16(register
  271. cmsUInt32Number i, start = 0;
  272. cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0;
  273. + Stride /= PixelSize(info->InputFormat);
  274. if (ExtraFirst)
  275. start = Extra;
  276. @@ -1065,6 +1106,7 @@ cmsUInt8Number* UnrollFloatsToFloat(_cms
  277. cmsUInt32Number i, start = 0;
  278. cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F;
  279. + Stride /= PixelSize(info->InputFormat);
  280. if (ExtraFirst)
  281. start = Extra;
  282. @@ -1117,6 +1159,7 @@ cmsUInt8Number* UnrollDoublesToFloat(_cm
  283. cmsUInt32Number i, start = 0;
  284. cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 100.0 : 1.0;
  285. + Stride /= PixelSize(info->InputFormat);
  286. if (ExtraFirst)
  287. start = Extra;
  288. @@ -1162,7 +1205,9 @@ cmsUInt8Number* UnrollLabDoubleToFloat(_
  289. if (T_PLANAR(info -> InputFormat)) {
  290. - wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1
  291. + Stride /= PixelSize(info->InputFormat);
  292. +
  293. + wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1
  294. wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0); // form -128..+127 to 0..1
  295. wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0);
  296. @@ -1190,6 +1235,8 @@ cmsUInt8Number* UnrollLabFloatToFloat(_c
  297. if (T_PLANAR(info -> InputFormat)) {
  298. + Stride /= PixelSize(info->InputFormat);
  299. +
  300. wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1
  301. wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0); // form -128..+127 to 0..1
  302. wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0);
  303. @@ -1220,6 +1267,8 @@ cmsUInt8Number* UnrollXYZDoubleToFloat(_
  304. if (T_PLANAR(info -> InputFormat)) {
  305. + Stride /= PixelSize(info->InputFormat);
  306. +
  307. wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ);
  308. wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ);
  309. wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ);
  310. @@ -1247,6 +1296,8 @@ cmsUInt8Number* UnrollXYZFloatToFloat(_c
  311. if (T_PLANAR(info -> InputFormat)) {
  312. + Stride /= PixelSize(info->InputFormat);
  313. +
  314. wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ);
  315. wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ);
  316. wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ);
  317. @@ -1429,7 +1480,7 @@ cmsUInt8Number* PackPlanarWords(register
  318. cmsUInt16Number v;
  319. if (DoSwap) {
  320. - output += T_EXTRA(info -> OutputFormat) * Stride * sizeof(cmsUInt16Number);
  321. + output += T_EXTRA(info -> OutputFormat) * Stride;
  322. }
  323. for (i=0; i < nChan; i++) {
  324. @@ -1445,7 +1496,7 @@ cmsUInt8Number* PackPlanarWords(register
  325. v = REVERSE_FLAVOR_16(v);
  326. *(cmsUInt16Number*) output = v;
  327. - output += (Stride * sizeof(cmsUInt16Number));
  328. + output += Stride;
  329. }
  330. return (Init + sizeof(cmsUInt16Number));
  331. @@ -2297,6 +2348,8 @@ cmsUInt8Number* PackLabFloatFrom16(regis
  332. cmsFloat32Number* Out = (cmsFloat32Number*) output;
  333. + Stride /= PixelSize(info->OutputFormat);
  334. +
  335. Out[0] = (cmsFloat32Number)Lab.L;
  336. Out[Stride] = (cmsFloat32Number)Lab.a;
  337. Out[Stride*2] = (cmsFloat32Number)Lab.b;
  338. @@ -2325,6 +2378,8 @@ cmsUInt8Number* PackXYZDoubleFrom16(regi
  339. cmsFloat64Number* Out = (cmsFloat64Number*) output;
  340. cmsXYZEncoded2Float(&XYZ, wOut);
  341. + Stride /= PixelSize(Info->OutputFormat);
  342. +
  343. Out[0] = XYZ.X;
  344. Out[Stride] = XYZ.Y;
  345. Out[Stride*2] = XYZ.Z;
  346. @@ -2352,6 +2407,8 @@ cmsUInt8Number* PackXYZFloatFrom16(regis
  347. cmsFloat32Number* Out = (cmsFloat32Number*) output;
  348. cmsXYZEncoded2Float(&XYZ, wOut);
  349. + Stride /= PixelSize(Info->OutputFormat);
  350. +
  351. Out[0] = (cmsFloat32Number) XYZ.X;
  352. Out[Stride] = (cmsFloat32Number) XYZ.Y;
  353. Out[Stride*2] = (cmsFloat32Number) XYZ.Z;
  354. @@ -2391,6 +2448,8 @@ cmsUInt8Number* PackDoubleFrom16(registe
  355. cmsFloat64Number* swap1 = (cmsFloat64Number*) output;
  356. cmsUInt32Number i, start = 0;
  357. + Stride /= PixelSize(info->OutputFormat);
  358. +
  359. if (ExtraFirst)
  360. start = Extra;
  361. @@ -2442,6 +2501,8 @@ cmsUInt8Number* PackFloatFrom16(register
  362. cmsFloat32Number* swap1 = (cmsFloat32Number*)output;
  363. cmsUInt32Number i, start = 0;
  364. + Stride /= PixelSize(info->OutputFormat);
  365. +
  366. if (ExtraFirst)
  367. start = Extra;
  368. @@ -2495,6 +2556,8 @@ cmsUInt8Number* PackFloatsFromFloat(_cms
  369. cmsFloat64Number v = 0;
  370. cmsUInt32Number i, start = 0;
  371. + Stride /= PixelSize(info->OutputFormat);
  372. +
  373. if (ExtraFirst)
  374. start = Extra;
  375. @@ -2544,6 +2607,8 @@ cmsUInt8Number* PackDoublesFromFloat(_cm
  376. cmsFloat64Number* swap1 = (cmsFloat64Number*)output;
  377. cmsUInt32Number i, start = 0;
  378. + Stride /= PixelSize(info->OutputFormat);
  379. +
  380. if (ExtraFirst)
  381. start = Extra;
  382. @@ -2590,6 +2655,8 @@ cmsUInt8Number* PackLabFloatFromFloat(_c
  383. if (T_PLANAR(Info -> OutputFormat)) {
  384. + Stride /= PixelSize(Info->OutputFormat);
  385. +
  386. Out[0] = (cmsFloat32Number) (wOut[0] * 100.0);
  387. Out[Stride] = (cmsFloat32Number) (wOut[1] * 255.0 - 128.0);
  388. Out[Stride*2] = (cmsFloat32Number) (wOut[2] * 255.0 - 128.0);
  389. @@ -2618,6 +2685,8 @@ cmsUInt8Number* PackLabDoubleFromFloat(_
  390. if (T_PLANAR(Info -> OutputFormat)) {
  391. + Stride /= PixelSize(Info->OutputFormat);
  392. +
  393. Out[0] = (cmsFloat64Number) (wOut[0] * 100.0);
  394. Out[Stride] = (cmsFloat64Number) (wOut[1] * 255.0 - 128.0);
  395. Out[Stride*2] = (cmsFloat64Number) (wOut[2] * 255.0 - 128.0);
  396. @@ -2647,6 +2716,8 @@ cmsUInt8Number* PackXYZFloatFromFloat(_c
  397. if (T_PLANAR(Info -> OutputFormat)) {
  398. + Stride /= PixelSize(Info->OutputFormat);
  399. +
  400. Out[0] = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ);
  401. Out[Stride] = (cmsFloat32Number) (wOut[1] * MAX_ENCODEABLE_XYZ);
  402. Out[Stride*2] = (cmsFloat32Number) (wOut[2] * MAX_ENCODEABLE_XYZ);
  403. @@ -2675,6 +2746,8 @@ cmsUInt8Number* PackXYZDoubleFromFloat(_
  404. if (T_PLANAR(Info -> OutputFormat)) {
  405. + Stride /= PixelSize(Info->OutputFormat);
  406. +
  407. Out[0] = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ);
  408. Out[Stride] = (cmsFloat64Number) (wOut[1] * MAX_ENCODEABLE_XYZ);
  409. Out[Stride*2] = (cmsFloat64Number) (wOut[2] * MAX_ENCODEABLE_XYZ);
  410. @@ -2718,6 +2791,8 @@ cmsUInt8Number* UnrollHalfTo16(register
  411. cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 655.35F : 65535.0F;
  412. + Stride /= PixelSize(info->OutputFormat);
  413. +
  414. if (ExtraFirst)
  415. start = Extra;
  416. @@ -2769,6 +2844,7 @@ cmsUInt8Number* UnrollHalfToFloat(_cmsTR
  417. cmsUInt32Number i, start = 0;
  418. cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F;
  419. + Stride /= PixelSize(info->OutputFormat);
  420. if (ExtraFirst)
  421. start = Extra;
  422. @@ -2820,6 +2896,8 @@ cmsUInt8Number* PackHalfFrom16(register
  423. cmsUInt16Number* swap1 = (cmsUInt16Number*)output;
  424. cmsUInt32Number i, start = 0;
  425. + Stride /= PixelSize(info->OutputFormat);
  426. +
  427. if (ExtraFirst)
  428. start = Extra;
  429. @@ -2871,6 +2949,8 @@ cmsUInt8Number* PackHalfFromFloat(_cmsTR
  430. cmsFloat32Number v = 0;
  431. cmsUInt32Number i, start = 0;
  432. + Stride /= PixelSize(info->OutputFormat);
  433. +
  434. if (ExtraFirst)
  435. start = Extra;
  436. @@ -3288,10 +3368,10 @@ cmsBool _cmsRegisterFormattersPlugin(cm
  437. return TRUE;
  438. }
  439. -cmsFormatter _cmsGetFormatter(cmsContext ContextID,
  440. - cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8
  441. - cmsFormatterDirection Dir,
  442. - cmsUInt32Number dwFlags)
  443. +cmsFormatter CMSEXPORT _cmsGetFormatter(cmsContext ContextID,
  444. + cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8
  445. + cmsFormatterDirection Dir,
  446. + cmsUInt32Number dwFlags)
  447. {
  448. _cmsFormattersPluginChunkType* ctx = ( _cmsFormattersPluginChunkType*) _cmsContextGetClientChunk(ContextID, FormattersPlugin);
  449. cmsFormattersFactoryList* f;
  450. diff -pruN lcms2-2.9.orig/src/lcms2_internal.h lcms2-2.9/src/lcms2_internal.h
  451. --- lcms2-2.9.orig/src/lcms2_internal.h 2017-11-01 02:36:47.000000000 +1100
  452. +++ lcms2-2.9/src/lcms2_internal.h 2017-11-13 04:15:10.000000000 +1100
  453. @@ -180,13 +180,14 @@ cmsINLINE cmsUInt16Number _cmsQuickSatur
  454. return _cmsQuickFloorWord(d);
  455. }
  456. +// Test bed entry points---------------------------------------------------------------
  457. +#define CMSCHECKPOINT CMSAPI
  458. // Pthread support --------------------------------------------------------------------
  459. #ifndef CMS_NO_PTHREADS
  460. // This is the threading support. Unfortunately, it has to be platform-dependent because
  461. // windows does not support pthreads.
  462. -
  463. #ifdef CMS_IS_WINDOWS_
  464. #define WIN32_LEAN_AND_MEAN 1
  465. @@ -823,10 +824,10 @@ void _cmsTagSignature2St
  466. // Interpolation ---------------------------------------------------------------------------------------------------------
  467. -cmsInterpParams* _cmsComputeInterpParams(cmsContext ContextID, cmsUInt32Number nSamples, cmsUInt32Number InputChan, cmsUInt32Number OutputChan, const void* Table, cmsUInt32Number dwFlags);
  468. -cmsInterpParams* _cmsComputeInterpParamsEx(cmsContext ContextID, const cmsUInt32Number nSamples[], cmsUInt32Number InputChan, cmsUInt32Number OutputChan, const void* Table, cmsUInt32Number dwFlags);
  469. -void _cmsFreeInterpParams(cmsInterpParams* p);
  470. -cmsBool _cmsSetInterpolationRoutine(cmsContext ContextID, cmsInterpParams* p);
  471. +CMSCHECKPOINT cmsInterpParams* CMSEXPORT _cmsComputeInterpParams(cmsContext ContextID, cmsUInt32Number nSamples, cmsUInt32Number InputChan, cmsUInt32Number OutputChan, const void* Table, cmsUInt32Number dwFlags);
  472. +cmsInterpParams* _cmsComputeInterpParamsEx(cmsContext ContextID, const cmsUInt32Number nSamples[], cmsUInt32Number InputChan, cmsUInt32Number OutputChan, const void* Table, cmsUInt32Number dwFlags);
  473. +CMSCHECKPOINT void CMSEXPORT _cmsFreeInterpParams(cmsInterpParams* p);
  474. +cmsBool _cmsSetInterpolationRoutine(cmsContext ContextID, cmsInterpParams* p);
  475. // Curves ----------------------------------------------------------------------------------------------------------------
  476. @@ -876,20 +877,20 @@ struct _cmsStage_struct {
  477. // Special Stages (cannot be saved)
  478. -cmsStage* _cmsStageAllocLab2XYZ(cmsContext ContextID);
  479. -cmsStage* _cmsStageAllocXYZ2Lab(cmsContext ContextID);
  480. -cmsStage* _cmsStageAllocLabPrelin(cmsContext ContextID);
  481. -cmsStage* _cmsStageAllocLabV2ToV4(cmsContext ContextID);
  482. -cmsStage* _cmsStageAllocLabV2ToV4curves(cmsContext ContextID);
  483. -cmsStage* _cmsStageAllocLabV4ToV2(cmsContext ContextID);
  484. -cmsStage* _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS);
  485. -cmsStage* _cmsStageAllocIdentityCurves(cmsContext ContextID, cmsUInt32Number nChannels);
  486. -cmsStage* _cmsStageAllocIdentityCLut(cmsContext ContextID, cmsUInt32Number nChan);
  487. -cmsStage* _cmsStageNormalizeFromLabFloat(cmsContext ContextID);
  488. -cmsStage* _cmsStageNormalizeFromXyzFloat(cmsContext ContextID);
  489. -cmsStage* _cmsStageNormalizeToLabFloat(cmsContext ContextID);
  490. -cmsStage* _cmsStageNormalizeToXyzFloat(cmsContext ContextID);
  491. -cmsStage* _cmsStageClipNegatives(cmsContext ContextID, cmsUInt32Number nChannels);
  492. +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocLab2XYZ(cmsContext ContextID);
  493. +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocXYZ2Lab(cmsContext ContextID);
  494. +cmsStage* _cmsStageAllocLabPrelin(cmsContext ContextID);
  495. +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocLabV2ToV4(cmsContext ContextID);
  496. +cmsStage* _cmsStageAllocLabV2ToV4curves(cmsContext ContextID);
  497. +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocLabV4ToV2(cmsContext ContextID);
  498. +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS);
  499. +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocIdentityCurves(cmsContext ContextID, cmsUInt32Number nChannels);
  500. +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocIdentityCLut(cmsContext ContextID, cmsUInt32Number nChan);
  501. +cmsStage* _cmsStageNormalizeFromLabFloat(cmsContext ContextID);
  502. +cmsStage* _cmsStageNormalizeFromXyzFloat(cmsContext ContextID);
  503. +cmsStage* _cmsStageNormalizeToLabFloat(cmsContext ContextID);
  504. +cmsStage* _cmsStageNormalizeToXyzFloat(cmsContext ContextID);
  505. +cmsStage* _cmsStageClipNegatives(cmsContext ContextID, cmsUInt32Number nChannels);
  506. // For curve set only
  507. @@ -924,9 +925,9 @@ struct _cmsPipeline_struct {
  508. // Read tags using low-level function, provide necessary glue code to adapt versions, etc. All those return a brand new copy
  509. // of the LUTS, since ownership of original is up to the profile. The user should free allocated resources.
  510. -cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent);
  511. -cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent);
  512. -cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent);
  513. +CMSCHECKPOINT cmsPipeline* CMSEXPORT _cmsReadInputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent);
  514. +CMSCHECKPOINT cmsPipeline* CMSEXPORT _cmsReadOutputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent);
  515. +CMSCHECKPOINT cmsPipeline* CMSEXPORT _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent);
  516. // Special values
  517. cmsBool _cmsReadMediaWhitePoint(cmsCIEXYZ* Dest, cmsHPROFILE hProfile);
  518. @@ -951,7 +952,8 @@ cmsSEQ* _cmsCompileProfileSequence(cmsCo
  519. // LUT optimization ------------------------------------------------------------------------------------------------
  520. -cmsUInt16Number _cmsQuantizeVal(cmsFloat64Number i, cmsUInt32Number MaxSamples);
  521. +CMSCHECKPOINT cmsUInt16Number CMSEXPORT _cmsQuantizeVal(cmsFloat64Number i, cmsUInt32Number MaxSamples);
  522. +
  523. cmsUInt32Number _cmsReasonableGridpointsByColorspace(cmsColorSpaceSignature Colorspace, cmsUInt32Number dwFlags);
  524. cmsBool _cmsEndPointsBySpace(cmsColorSpaceSignature Space,
  525. @@ -985,17 +987,17 @@ cmsPipeline* _cmsCreateGamutCheckPip
  526. cmsBool _cmsFormatterIsFloat(cmsUInt32Number Type);
  527. cmsBool _cmsFormatterIs8bit(cmsUInt32Number Type);
  528. -cmsFormatter _cmsGetFormatter(cmsContext ContextID,
  529. - cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8
  530. - cmsFormatterDirection Dir,
  531. - cmsUInt32Number dwFlags);
  532. +CMSCHECKPOINT cmsFormatter CMSEXPORT _cmsGetFormatter(cmsContext ContextID,
  533. + cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8
  534. + cmsFormatterDirection Dir,
  535. + cmsUInt32Number dwFlags);
  536. #ifndef CMS_NO_HALF_SUPPORT
  537. // Half float
  538. -cmsFloat32Number _cmsHalf2Float(cmsUInt16Number h);
  539. -cmsUInt16Number _cmsFloat2Half(cmsFloat32Number flt);
  540. +CMSCHECKPOINT cmsFloat32Number CMSEXPORT _cmsHalf2Float(cmsUInt16Number h);
  541. +CMSCHECKPOINT cmsUInt16Number CMSEXPORT _cmsFloat2Half(cmsFloat32Number flt);
  542. #endif
  543. diff -pruN lcms2-2.9.orig/testbed/testcms2.c lcms2-2.9/testbed/testcms2.c
  544. --- lcms2-2.9.orig/testbed/testcms2.c 2017-11-01 02:36:47.000000000 +1100
  545. +++ lcms2-2.9/testbed/testcms2.c 2017-11-13 04:15:10.000000000 +1100
  546. @@ -3813,9 +3813,9 @@ void CheckSingleFormatter16(cmsContext i
  547. Values[i] <<= 8;
  548. }
  549. - b.Fmt16(&info, Values, Buffer, 1);
  550. + b.Fmt16(&info, Values, Buffer, 2);
  551. memset(Values, 0, sizeof(Values));
  552. - f.Fmt16(&info, Values, Buffer, 1);
  553. + f.Fmt16(&info, Values, Buffer, 2);
  554. for (i=0; i < nChannels; i++) {
  555. if (bytes == 1)
  556.