Skip to content

Commit f22abd8

Browse files
committed
Small fix for ICC Profiles
1 parent 1f0df24 commit f22abd8

File tree

3 files changed

+29
-48
lines changed

3 files changed

+29
-48
lines changed

avif-coder/src/main/cpp/coder.cpp

+11-44
Original file line numberDiff line numberDiff line change
@@ -684,37 +684,25 @@ Java_com_radzivon_bartoshyk_avif_coder_HeifCoder_decodeImpl(JNIEnv *env, jobject
684684
if (hasICC) {
685685
convertUseDefinedColorSpace(dstARGB, stride, imageWidth, imageHeight, profile.data(),
686686
profile.size(),
687-
useBitmapHalf16Floats);
688-
colorSpaceName = "SRGB";
689-
} else if (colorSpaceName && strcmp(colorSpaceName, "BT2020_PQ") == 0 &&
690-
osVersion < colorSpaceRequiredVersion) {
687+
useBitmapHalf16Floats, &stride);
688+
} else if (colorSpaceName && strcmp(colorSpaceName, "BT2020_PQ") == 0) {
691689
convertUseDefinedColorSpace(dstARGB, stride, imageWidth, imageHeight, &bt2020PQ[0],
692690
sizeof(bt2020PQ),
693-
useBitmapHalf16Floats);
694-
colorSpaceName = "SRGB";
695-
colorSpaceRequiredVersion = 29;
696-
} else if (colorSpaceName && strcmp(colorSpaceName, "BT2020") == 0 &&
697-
osVersion < colorSpaceRequiredVersion) {
691+
useBitmapHalf16Floats, &stride);
692+
} else if (colorSpaceName && strcmp(colorSpaceName, "BT2020") == 0) {
698693
convertUseDefinedColorSpace(dstARGB, stride, imageWidth, imageHeight, &bt2020[0],
699694
sizeof(bt2020),
700-
useBitmapHalf16Floats);
701-
colorSpaceName = "SRGB";
702-
} else if (colorSpaceName && strcmp(colorSpaceName, "DISPLAY_P3") == 0 &&
703-
osVersion < colorSpaceRequiredVersion) {
695+
useBitmapHalf16Floats, &stride);
696+
} else if (colorSpaceName && strcmp(colorSpaceName, "DISPLAY_P3") == 0) {
704697
convertUseDefinedColorSpace(dstARGB, stride, imageWidth, imageHeight, &displayP3[0],
705698
sizeof(displayP3),
706-
useBitmapHalf16Floats);
707-
colorSpaceName = "SRGB";
708-
} else if (colorSpaceName && strcmp(colorSpaceName, "LINEAR_SRGB") == 0 &&
709-
osVersion < colorSpaceRequiredVersion) {
699+
useBitmapHalf16Floats, &stride);
700+
} else if (colorSpaceName && strcmp(colorSpaceName, "LINEAR_SRGB") == 0) {
710701
convertUseDefinedColorSpace(dstARGB, stride, imageWidth, imageHeight, &linearSRGB[0],
711-
sizeof(linearSRGB), useBitmapHalf16Floats);
712-
colorSpaceName = "SRGB";
713-
} else if (colorSpaceName && strcmp(colorSpaceName, "BT709") == 0 &&
714-
osVersion < colorSpaceRequiredVersion) {
702+
sizeof(linearSRGB), useBitmapHalf16Floats, &stride);
703+
} else if (colorSpaceName && strcmp(colorSpaceName, "BT709") == 0) {
715704
convertUseDefinedColorSpace(dstARGB, stride, imageWidth, imageHeight, &bt709[0],
716-
sizeof(bt709), useBitmapHalf16Floats);
717-
colorSpaceName = "SRGB";
705+
sizeof(bt709), useBitmapHalf16Floats, &stride);
718706
}
719707

720708
if (!alphaPremultiplied) {
@@ -754,26 +742,5 @@ Java_com_radzivon_bartoshyk_avif_coder_HeifCoder_decodeImpl(JNIEnv *env, jobject
754742
return static_cast<jobject>(nullptr);
755743
}
756744

757-
if ((dataSpace != -1 || colorSpaceName != nullptr) && osVersion >= 29) {
758-
if (osVersion >= colorSpaceRequiredVersion) {
759-
jclass cls = env->FindClass("android/graphics/ColorSpace");
760-
jmethodID staticMethodGetColorSpace = env->GetStaticMethodID(cls, "get",
761-
"(Landroid/graphics/ColorSpace$Named;)Landroid/graphics/ColorSpace;");
762-
jclass colorSpaceNameCls = env->FindClass("android/graphics/ColorSpace$Named");
763-
jfieldID colorSpaceNameFieldID = env->GetStaticFieldID(colorSpaceNameCls,
764-
colorSpaceName,
765-
"Landroid/graphics/ColorSpace$Named;");
766-
jobject colorSpaceNameObj = env->GetStaticObjectField(colorSpaceNameCls,
767-
colorSpaceNameFieldID);
768-
jobject colorSpace = env->CallStaticObjectMethod(cls, staticMethodGetColorSpace,
769-
colorSpaceNameObj);
770-
jmethodID setColorSpaceMethod = env->GetMethodID(bitmapClass, "setColorSpace",
771-
"(Landroid/graphics/ColorSpace;)V");
772-
if (setColorSpaceMethod) {
773-
env->CallVoidMethod(bitmapObj, setColorSpaceMethod, colorSpace);
774-
}
775-
}
776-
}
777-
778745
return bitmapObj;
779746
}

avif-coder/src/main/cpp/colorspace.cpp

+17-3
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ double PQInverseEOTF(double q) {
8383

8484
void convertUseDefinedColorSpace(std::shared_ptr<char> &vector, int stride, int width, int height,
8585
const unsigned char *colorSpace, size_t colorSpaceSize,
86-
bool image16Bits) {
86+
bool image16Bits, int *newStride) {
8787
cmsContext context = cmsCreateContext(nullptr, nullptr);
8888
std::shared_ptr<void> contextPtr(context, [](void *profile) {
8989
cmsDeleteContext(reinterpret_cast<cmsContext>(profile));
@@ -119,7 +119,21 @@ void convertUseDefinedColorSpace(std::shared_ptr<char> &vector, int stride, int
119119
cmsDeleteTransform(reinterpret_cast<cmsHTRANSFORM>(transform));
120120
});
121121
std::vector<char> iccARGB;
122-
iccARGB.resize(stride * height);
123-
cmsDoTransform(ptrTransform.get(), vector.get(), iccARGB.data(), width * height);
122+
int mStride = (int) (image16Bits ? sizeof(uint16_t) : sizeof(uint8_t)) * width * 4;
123+
int newLength = mStride * height;
124+
iccARGB.resize(newLength);
125+
cmsDoTransformLineStride(
126+
ptrTransform.get(),
127+
vector.get(),
128+
iccARGB.data(),
129+
width,
130+
height,
131+
stride,
132+
mStride,
133+
0,
134+
0
135+
);
124136
std::copy(iccARGB.begin(), iccARGB.end(), vector.get());
137+
138+
*newStride = mStride;
125139
}

avif-coder/src/main/cpp/colorspace.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@
1717

1818
void convertUseDefinedColorSpace(std::shared_ptr<char> &vector, int stride, int width, int height,
1919
const unsigned char *colorSpace, size_t colorSpaceSize,
20-
bool image16Bits);
20+
bool image16Bits, int * newStride);
2121

2222
#endif //AVIF_COLORSPACE_H

0 commit comments

Comments
 (0)