< prev index next >
src/java.desktop/share/native/liblcms/cmsalpha.c
Print this page
*** 28,38 ****
// file:
//
//---------------------------------------------------------------------------------
//
// Little Color Management System
! // Copyright (c) 1998-2017 Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
--- 28,38 ----
// file:
//
//---------------------------------------------------------------------------------
//
// Little Color Management System
! // Copyright (c) 1998-2020 Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
*** 55,64 ****
--- 55,68 ----
#include "lcms2_internal.h"
// Alpha copy ------------------------------------------------------------------------------------------------------------------
+ // This macro return words stored as big endian
+ #define CHANGE_ENDIAN(w) (cmsUInt16Number) ((cmsUInt16Number) ((w)<<8)|((w)>>8))
+
+
// Floor to byte, taking care of saturation
cmsINLINE cmsUInt8Number _cmsQuickSaturateByte(cmsFloat64Number d)
{
d += 0.5;
if (d <= 0) return 0;
*** 102,111 ****
--- 106,122 ----
cmsUInt8Number n = *(cmsUInt8Number*)src;
*(cmsUInt16Number*) dst = FROM_8_TO_16(n);
}
static
+ void from8to16SE(void* dst, const void* src)
+ {
+ cmsUInt8Number n = *(cmsUInt8Number*)src;
+ *(cmsUInt16Number*)dst = CHANGE_ENDIAN(FROM_8_TO_16(n));
+ }
+
+ static
void from8toFLT(void* dst, const void* src)
{
*(cmsFloat32Number*)dst = (*(cmsUInt8Number*)src) / 255.0f;
}
*** 135,160 ****
--- 146,199 ----
cmsUInt16Number n = *(cmsUInt16Number*)src;
*(cmsUInt8Number*) dst = FROM_16_TO_8(n);
}
static
+ void from16SEto8(void* dst, const void* src)
+ {
+ cmsUInt16Number n = *(cmsUInt16Number*)src;
+ *(cmsUInt8Number*)dst = FROM_16_TO_8(CHANGE_ENDIAN(n));
+ }
+
+ static
void copy16(void* dst, const void* src)
{
memmove(dst, src, 2);
}
+ static
+ void from16to16(void* dst, const void* src)
+ {
+ cmsUInt16Number n = *(cmsUInt16Number*)src;
+ *(cmsUInt16Number*)dst = CHANGE_ENDIAN(n);
+ }
+
+ static
void from16toFLT(void* dst, const void* src)
{
*(cmsFloat32Number*)dst = (*(cmsUInt16Number*)src) / 65535.0f;
}
+ static
+ void from16SEtoFLT(void* dst, const void* src)
+ {
+ *(cmsFloat32Number*)dst = (CHANGE_ENDIAN(*(cmsUInt16Number*)src)) / 65535.0f;
+ }
+
+ static
void from16toDBL(void* dst, const void* src)
{
*(cmsFloat64Number*)dst = (*(cmsUInt16Number*)src) / 65535.0f;
}
static
+ void from16SEtoDBL(void* dst, const void* src)
+ {
+ *(cmsFloat64Number*)dst = (CHANGE_ENDIAN(*(cmsUInt16Number*)src)) / 65535.0f;
+ }
+
+ static
void from16toHLF(void* dst, const void* src)
{
#ifndef CMS_NO_HALF_SUPPORT
cmsFloat32Number n = (*(cmsUInt16Number*)src) / 65535.0f;
*(cmsUInt16Number*)dst = _cmsFloat2Half(n);
*** 162,171 ****
--- 201,221 ----
cmsUNUSED_PARAMETER(dst);
cmsUNUSED_PARAMETER(src);
#endif
}
+ static
+ void from16SEtoHLF(void* dst, const void* src)
+ {
+ #ifndef CMS_NO_HALF_SUPPORT
+ cmsFloat32Number n = (CHANGE_ENDIAN(*(cmsUInt16Number*)src)) / 65535.0f;
+ *(cmsUInt16Number*)dst = _cmsFloat2Half(n);
+ #else
+ cmsUNUSED_PARAMETER(dst);
+ cmsUNUSED_PARAMETER(src);
+ #endif
+ }
// From Float
static
void fromFLTto8(void* dst, const void* src)
{
*** 179,188 ****
--- 229,247 ----
cmsFloat32Number n = *(cmsFloat32Number*)src;
*(cmsUInt16Number*)dst = _cmsQuickSaturateWord(n * 65535.0f);
}
static
+ void fromFLTto16SE(void* dst, const void* src)
+ {
+ cmsFloat32Number n = *(cmsFloat32Number*)src;
+ cmsUInt16Number i = _cmsQuickSaturateWord(n * 65535.0f);
+
+ *(cmsUInt16Number*)dst = CHANGE_ENDIAN(i);
+ }
+
+ static
void copy32(void* dst, const void* src)
{
memmove(dst, src, sizeof(cmsFloat32Number));
}
*** 232,241 ****
--- 291,313 ----
cmsUNUSED_PARAMETER(src);
#endif
}
static
+ void fromHLFto16SE(void* dst, const void* src)
+ {
+ #ifndef CMS_NO_HALF_SUPPORT
+ cmsFloat32Number n = _cmsHalf2Float(*(cmsUInt16Number*)src);
+ cmsUInt16Number i = _cmsQuickSaturateWord(n * 65535.0f);
+ *(cmsUInt16Number*)dst = CHANGE_ENDIAN(i);
+ #else
+ cmsUNUSED_PARAMETER(dst);
+ cmsUNUSED_PARAMETER(src);
+ #endif
+ }
+
+ static
void fromHLFtoFLT(void* dst, const void* src)
{
#ifndef CMS_NO_HALF_SUPPORT
*(cmsFloat32Number*)dst = _cmsHalf2Float(*(cmsUInt16Number*)src);
#else
*** 269,278 ****
--- 341,358 ----
cmsFloat64Number n = *(cmsFloat64Number*)src;
*(cmsUInt16Number*)dst = _cmsQuickSaturateWord(n * 65535.0f);
}
static
+ void fromDBLto16SE(void* dst, const void* src)
+ {
+ cmsFloat64Number n = *(cmsFloat64Number*)src;
+ cmsUInt16Number i = _cmsQuickSaturateWord(n * 65535.0f);
+ *(cmsUInt16Number*)dst = CHANGE_ENDIAN(i);
+ }
+
+ static
void fromDBLtoFLT(void* dst, const void* src)
{
cmsFloat64Number n = *(cmsFloat64Number*)src;
*(cmsFloat32Number*)dst = (cmsFloat32Number) n;
}
*** 301,341 ****
int FormatterPos(cmsUInt32Number frm)
{
cmsUInt32Number b = T_BYTES(frm);
if (b == 0 && T_FLOAT(frm))
! return 4; // DBL
#ifndef CMS_NO_HALF_SUPPORT
if (b == 2 && T_FLOAT(frm))
! return 2; // HLF
#endif
if (b == 4 && T_FLOAT(frm))
! return 3; // FLT
if (b == 2 && !T_FLOAT(frm))
return 1; // 16
if (b == 1 && !T_FLOAT(frm))
return 0; // 8
-
return -1; // not recognized
}
! // Obtains a alpha-to-alpha funmction formatter
static
cmsFormatterAlphaFn _cmsGetFormatterAlpha(cmsContext id, cmsUInt32Number in, cmsUInt32Number out)
{
! static cmsFormatterAlphaFn FormattersAlpha[5][5] = {
! /* from 8 */ { copy8, from8to16, from8toHLF, from8toFLT, from8toDBL },
! /* from 16*/ { from16to8, copy16, from16toHLF, from16toFLT, from16toDBL },
! /* from HLF*/ { fromHLFto8, fromHLFto16, copy16, fromHLFtoFLT, fromHLFtoDBL },
! /* from FLT*/ { fromFLTto8, fromFLTto16, fromFLTtoHLF, copy32, fromFLTtoDBL },
! /* from DBL*/ { fromDBLto8, fromDBLto16, fromDBLtoHLF, fromDBLtoFLT, copy64 }};
int in_n = FormatterPos(in);
int out_n = FormatterPos(out);
! if (in_n < 0 || out_n < 0 || in_n > 4 || out_n > 4) {
cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, "Unrecognized alpha channel width");
return NULL;
}
--- 381,426 ----
int FormatterPos(cmsUInt32Number frm)
{
cmsUInt32Number b = T_BYTES(frm);
if (b == 0 && T_FLOAT(frm))
! return 5; // DBL
#ifndef CMS_NO_HALF_SUPPORT
if (b == 2 && T_FLOAT(frm))
! return 3; // HLF
#endif
if (b == 4 && T_FLOAT(frm))
! return 4; // FLT
if (b == 2 && !T_FLOAT(frm))
+ {
+ if (T_ENDIAN16(frm))
+ return 2; // 16SE
+ else
return 1; // 16
+ }
if (b == 1 && !T_FLOAT(frm))
return 0; // 8
return -1; // not recognized
}
! // Obtains an alpha-to-alpha function formatter
static
cmsFormatterAlphaFn _cmsGetFormatterAlpha(cmsContext id, cmsUInt32Number in, cmsUInt32Number out)
{
! static cmsFormatterAlphaFn FormattersAlpha[6][6] = {
! /* from 8 */ { copy8, from8to16, from8to16SE, from8toHLF, from8toFLT, from8toDBL },
! /* from 16*/ { from16to8, copy16, from16to16, from16toHLF, from16toFLT, from16toDBL },
! /* from 16SE*/{ from16SEto8, from16to16, copy16, from16SEtoHLF,from16SEtoFLT, from16SEtoDBL },
! /* from HLF*/ { fromHLFto8, fromHLFto16, fromHLFto16SE, copy16, fromHLFtoFLT, fromHLFtoDBL },
! /* from FLT*/ { fromFLTto8, fromFLTto16, fromFLTto16SE, fromFLTtoHLF, copy32, fromFLTtoDBL },
! /* from DBL*/ { fromDBLto8, fromDBLto16, fromDBLto16SE, fromDBLtoHLF, fromDBLtoFLT, copy64 }};
int in_n = FormatterPos(in);
int out_n = FormatterPos(out);
! if (in_n < 0 || out_n < 0 || in_n > 5 || out_n > 5) {
cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, "Unrecognized alpha channel width");
return NULL;
}
*** 513,522 ****
--- 598,609 ----
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);
+ if (copyValueFn == NULL)
+ return;
if (nExtra == 1) { // Optimized routine for copying a single extra channel quickly
cmsUInt8Number* SourcePtr;
cmsUInt8Number* DestPtr;
< prev index next >