30
30
//---------------------------------------------------------------------------------
31
31
//
32
32
// Little Color Management System
33
- // Copyright (c) 1998-2017 Marti Maria Saguer
33
+ // Copyright (c) 1998-2020 Marti Maria Saguer
34
34
//
35
35
// Permission is hereby granted, free of charge, to any person obtaining
36
36
// a copy of this software and associated documentation files (the "Software"),
57
57
58
58
// Alpha copy ------------------------------------------------------------------------------------------------------------------
59
59
60
+ // This macro return words stored as big endian
61
+ #define CHANGE_ENDIAN (w ) (cmsUInt16Number) ((cmsUInt16Number) ((w)<<8)|((w)>>8))
62
+
63
+
60
64
// Floor to byte, taking care of saturation
61
65
cmsINLINE cmsUInt8Number _cmsQuickSaturateByte (cmsFloat64Number d )
62
66
{
@@ -103,6 +107,13 @@ void from8to16(void* dst, const void* src)
103
107
* (cmsUInt16Number * ) dst = FROM_8_TO_16 (n );
104
108
}
105
109
110
+ static
111
+ void from8to16SE (void * dst , const void * src )
112
+ {
113
+ cmsUInt8Number n = * (cmsUInt8Number * )src ;
114
+ * (cmsUInt16Number * )dst = CHANGE_ENDIAN (FROM_8_TO_16 (n ));
115
+ }
116
+
106
117
static
107
118
void from8toFLT (void * dst , const void * src )
108
119
{
@@ -136,22 +147,50 @@ void from16to8(void* dst, const void* src)
136
147
* (cmsUInt8Number * ) dst = FROM_16_TO_8 (n );
137
148
}
138
149
150
+ static
151
+ void from16SEto8 (void * dst , const void * src )
152
+ {
153
+ cmsUInt16Number n = * (cmsUInt16Number * )src ;
154
+ * (cmsUInt8Number * )dst = FROM_16_TO_8 (CHANGE_ENDIAN (n ));
155
+ }
156
+
139
157
static
140
158
void copy16 (void * dst , const void * src )
141
159
{
142
160
memmove (dst , src , 2 );
143
161
}
144
162
163
+ static
164
+ void from16to16 (void * dst , const void * src )
165
+ {
166
+ cmsUInt16Number n = * (cmsUInt16Number * )src ;
167
+ * (cmsUInt16Number * )dst = CHANGE_ENDIAN (n );
168
+ }
169
+
170
+ static
145
171
void from16toFLT (void * dst , const void * src )
146
172
{
147
173
* (cmsFloat32Number * )dst = (* (cmsUInt16Number * )src ) / 65535.0f ;
148
174
}
149
175
176
+ static
177
+ void from16SEtoFLT (void * dst , const void * src )
178
+ {
179
+ * (cmsFloat32Number * )dst = (CHANGE_ENDIAN (* (cmsUInt16Number * )src )) / 65535.0f ;
180
+ }
181
+
182
+ static
150
183
void from16toDBL (void * dst , const void * src )
151
184
{
152
185
* (cmsFloat64Number * )dst = (* (cmsUInt16Number * )src ) / 65535.0f ;
153
186
}
154
187
188
+ static
189
+ void from16SEtoDBL (void * dst , const void * src )
190
+ {
191
+ * (cmsFloat64Number * )dst = (CHANGE_ENDIAN (* (cmsUInt16Number * )src )) / 65535.0f ;
192
+ }
193
+
155
194
static
156
195
void from16toHLF (void * dst , const void * src )
157
196
{
@@ -164,33 +203,53 @@ void from16toHLF(void* dst, const void* src)
164
203
#endif
165
204
}
166
205
206
+ static
207
+ void from16SEtoHLF (void * dst , const void * src )
208
+ {
209
+ #ifndef CMS_NO_HALF_SUPPORT
210
+ cmsFloat32Number n = (CHANGE_ENDIAN (* (cmsUInt16Number * )src )) / 65535.0f ;
211
+ * (cmsUInt16Number * )dst = _cmsFloat2Half (n );
212
+ #else
213
+ cmsUNUSED_PARAMETER (dst );
214
+ cmsUNUSED_PARAMETER (src );
215
+ #endif
216
+ }
167
217
// From Float
168
218
169
219
static
170
220
void fromFLTto8 (void * dst , const void * src )
171
221
{
172
- cmsFloat32Number n = * (cmsFloat32Number * )src ;
173
- * (cmsUInt8Number * )dst = _cmsQuickSaturateByte (n * 255.0f );
222
+ cmsFloat32Number n = * (cmsFloat32Number * )src ;
223
+ * (cmsUInt8Number * )dst = _cmsQuickSaturateByte (n * 255.0f );
174
224
}
175
225
176
226
static
177
227
void fromFLTto16 (void * dst , const void * src )
178
228
{
179
- cmsFloat32Number n = * (cmsFloat32Number * )src ;
180
- * (cmsUInt16Number * )dst = _cmsQuickSaturateWord (n * 65535.0f );
229
+ cmsFloat32Number n = * (cmsFloat32Number * )src ;
230
+ * (cmsUInt16Number * )dst = _cmsQuickSaturateWord (n * 65535.0f );
231
+ }
232
+
233
+ static
234
+ void fromFLTto16SE (void * dst , const void * src )
235
+ {
236
+ cmsFloat32Number n = * (cmsFloat32Number * )src ;
237
+ cmsUInt16Number i = _cmsQuickSaturateWord (n * 65535.0f );
238
+
239
+ * (cmsUInt16Number * )dst = CHANGE_ENDIAN (i );
181
240
}
182
241
183
242
static
184
243
void copy32 (void * dst , const void * src )
185
244
{
186
- memmove (dst , src , sizeof (cmsFloat32Number ));
245
+ memmove (dst , src , sizeof (cmsFloat32Number ));
187
246
}
188
247
189
248
static
190
249
void fromFLTtoDBL (void * dst , const void * src )
191
250
{
192
- cmsFloat32Number n = * (cmsFloat32Number * )src ;
193
- * (cmsFloat64Number * )dst = (cmsFloat64Number )n ;
251
+ cmsFloat32Number n = * (cmsFloat32Number * )src ;
252
+ * (cmsFloat64Number * )dst = (cmsFloat64Number )n ;
194
253
}
195
254
196
255
static
@@ -233,6 +292,19 @@ void fromHLFto16(void* dst, const void* src)
233
292
#endif
234
293
}
235
294
295
+ static
296
+ void fromHLFto16SE (void * dst , const void * src )
297
+ {
298
+ #ifndef CMS_NO_HALF_SUPPORT
299
+ cmsFloat32Number n = _cmsHalf2Float (* (cmsUInt16Number * )src );
300
+ cmsUInt16Number i = _cmsQuickSaturateWord (n * 65535.0f );
301
+ * (cmsUInt16Number * )dst = CHANGE_ENDIAN (i );
302
+ #else
303
+ cmsUNUSED_PARAMETER (dst );
304
+ cmsUNUSED_PARAMETER (src );
305
+ #endif
306
+ }
307
+
236
308
static
237
309
void fromHLFtoFLT (void * dst , const void * src )
238
310
{
@@ -270,6 +342,14 @@ void fromDBLto16(void* dst, const void* src)
270
342
* (cmsUInt16Number * )dst = _cmsQuickSaturateWord (n * 65535.0f );
271
343
}
272
344
345
+ static
346
+ void fromDBLto16SE (void * dst , const void * src )
347
+ {
348
+ cmsFloat64Number n = * (cmsFloat64Number * )src ;
349
+ cmsUInt16Number i = _cmsQuickSaturateWord (n * 65535.0f );
350
+ * (cmsUInt16Number * )dst = CHANGE_ENDIAN (i );
351
+ }
352
+
273
353
static
274
354
void fromDBLtoFLT (void * dst , const void * src )
275
355
{
@@ -303,37 +383,42 @@ int FormatterPos(cmsUInt32Number frm)
303
383
cmsUInt32Number b = T_BYTES (frm );
304
384
305
385
if (b == 0 && T_FLOAT (frm ))
306
- return 4 ; // DBL
386
+ return 5 ; // DBL
307
387
#ifndef CMS_NO_HALF_SUPPORT
308
388
if (b == 2 && T_FLOAT (frm ))
309
- return 2 ; // HLF
389
+ return 3 ; // HLF
310
390
#endif
311
391
if (b == 4 && T_FLOAT (frm ))
312
- return 3 ; // FLT
392
+ return 4 ; // FLT
313
393
if (b == 2 && !T_FLOAT (frm ))
314
- return 1 ; // 16
394
+ {
395
+ if (T_ENDIAN16 (frm ))
396
+ return 2 ; // 16SE
397
+ else
398
+ return 1 ; // 16
399
+ }
315
400
if (b == 1 && !T_FLOAT (frm ))
316
401
return 0 ; // 8
317
-
318
402
return -1 ; // not recognized
319
403
}
320
404
321
- // Obtains a alpha-to-alpha funmction formatter
405
+ // Obtains an alpha-to-alpha function formatter
322
406
static
323
407
cmsFormatterAlphaFn _cmsGetFormatterAlpha (cmsContext id , cmsUInt32Number in , cmsUInt32Number out )
324
408
{
325
- static cmsFormatterAlphaFn FormattersAlpha [5 ][ 5 ] = {
409
+ static cmsFormatterAlphaFn FormattersAlpha [6 ][ 6 ] = {
326
410
327
- /* from 8 */ { copy8 , from8to16 , from8toHLF , from8toFLT , from8toDBL },
328
- /* from 16*/ { from16to8 , copy16 , from16toHLF , from16toFLT , from16toDBL },
329
- /* from HLF*/ { fromHLFto8 , fromHLFto16 , copy16 , fromHLFtoFLT , fromHLFtoDBL },
330
- /* from FLT*/ { fromFLTto8 , fromFLTto16 , fromFLTtoHLF , copy32 , fromFLTtoDBL },
331
- /* from DBL*/ { fromDBLto8 , fromDBLto16 , fromDBLtoHLF , fromDBLtoFLT , copy64 }};
411
+ /* from 8 */ { copy8 , from8to16 , from8to16SE , from8toHLF , from8toFLT , from8toDBL },
412
+ /* from 16*/ { from16to8 , copy16 , from16to16 , from16toHLF , from16toFLT , from16toDBL },
413
+ /* from 16SE*/ { from16SEto8 , from16to16 , copy16 , from16SEtoHLF ,from16SEtoFLT , from16SEtoDBL },
414
+ /* from HLF*/ { fromHLFto8 , fromHLFto16 , fromHLFto16SE , copy16 , fromHLFtoFLT , fromHLFtoDBL },
415
+ /* from FLT*/ { fromFLTto8 , fromFLTto16 , fromFLTto16SE , fromFLTtoHLF , copy32 , fromFLTtoDBL },
416
+ /* from DBL*/ { fromDBLto8 , fromDBLto16 , fromDBLto16SE , fromDBLtoHLF , fromDBLtoFLT , copy64 }};
332
417
333
418
int in_n = FormatterPos (in );
334
419
int out_n = FormatterPos (out );
335
420
336
- if (in_n < 0 || out_n < 0 || in_n > 4 || out_n > 4 ) {
421
+ if (in_n < 0 || out_n < 0 || in_n > 5 || out_n > 5 ) {
337
422
338
423
cmsSignalError (id , cmsERROR_UNKNOWN_EXTENSION , "Unrecognized alpha channel width" );
339
424
return NULL ;
@@ -515,6 +600,8 @@ void _cmsHandleExtraChannels(_cmsTRANSFORM* p, const void* in,
515
600
516
601
// Check for conversions 8, 16, half, float, dbl
517
602
copyValueFn = _cmsGetFormatterAlpha (p -> ContextID , p -> InputFormat , p -> OutputFormat );
603
+ if (copyValueFn == NULL )
604
+ return ;
518
605
519
606
if (nExtra == 1 ) { // Optimized routine for copying a single extra channel quickly
520
607
0 commit comments