Skip to content

Commit

Permalink
Small fix for ICC Profiles
Browse files Browse the repository at this point in the history
  • Loading branch information
awxkee committed Sep 5, 2023
1 parent 1f0df24 commit f22abd8
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 48 deletions.
55 changes: 11 additions & 44 deletions avif-coder/src/main/cpp/coder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -684,37 +684,25 @@ Java_com_radzivon_bartoshyk_avif_coder_HeifCoder_decodeImpl(JNIEnv *env, jobject
if (hasICC) {
convertUseDefinedColorSpace(dstARGB, stride, imageWidth, imageHeight, profile.data(),
profile.size(),
useBitmapHalf16Floats);
colorSpaceName = "SRGB";
} else if (colorSpaceName && strcmp(colorSpaceName, "BT2020_PQ") == 0 &&
osVersion < colorSpaceRequiredVersion) {
useBitmapHalf16Floats, &stride);
} else if (colorSpaceName && strcmp(colorSpaceName, "BT2020_PQ") == 0) {
convertUseDefinedColorSpace(dstARGB, stride, imageWidth, imageHeight, &bt2020PQ[0],
sizeof(bt2020PQ),
useBitmapHalf16Floats);
colorSpaceName = "SRGB";
colorSpaceRequiredVersion = 29;
} else if (colorSpaceName && strcmp(colorSpaceName, "BT2020") == 0 &&
osVersion < colorSpaceRequiredVersion) {
useBitmapHalf16Floats, &stride);
} else if (colorSpaceName && strcmp(colorSpaceName, "BT2020") == 0) {
convertUseDefinedColorSpace(dstARGB, stride, imageWidth, imageHeight, &bt2020[0],
sizeof(bt2020),
useBitmapHalf16Floats);
colorSpaceName = "SRGB";
} else if (colorSpaceName && strcmp(colorSpaceName, "DISPLAY_P3") == 0 &&
osVersion < colorSpaceRequiredVersion) {
useBitmapHalf16Floats, &stride);
} else if (colorSpaceName && strcmp(colorSpaceName, "DISPLAY_P3") == 0) {
convertUseDefinedColorSpace(dstARGB, stride, imageWidth, imageHeight, &displayP3[0],
sizeof(displayP3),
useBitmapHalf16Floats);
colorSpaceName = "SRGB";
} else if (colorSpaceName && strcmp(colorSpaceName, "LINEAR_SRGB") == 0 &&
osVersion < colorSpaceRequiredVersion) {
useBitmapHalf16Floats, &stride);
} else if (colorSpaceName && strcmp(colorSpaceName, "LINEAR_SRGB") == 0) {
convertUseDefinedColorSpace(dstARGB, stride, imageWidth, imageHeight, &linearSRGB[0],
sizeof(linearSRGB), useBitmapHalf16Floats);
colorSpaceName = "SRGB";
} else if (colorSpaceName && strcmp(colorSpaceName, "BT709") == 0 &&
osVersion < colorSpaceRequiredVersion) {
sizeof(linearSRGB), useBitmapHalf16Floats, &stride);
} else if (colorSpaceName && strcmp(colorSpaceName, "BT709") == 0) {
convertUseDefinedColorSpace(dstARGB, stride, imageWidth, imageHeight, &bt709[0],
sizeof(bt709), useBitmapHalf16Floats);
colorSpaceName = "SRGB";
sizeof(bt709), useBitmapHalf16Floats, &stride);
}

if (!alphaPremultiplied) {
Expand Down Expand Up @@ -754,26 +742,5 @@ Java_com_radzivon_bartoshyk_avif_coder_HeifCoder_decodeImpl(JNIEnv *env, jobject
return static_cast<jobject>(nullptr);
}

if ((dataSpace != -1 || colorSpaceName != nullptr) && osVersion >= 29) {
if (osVersion >= colorSpaceRequiredVersion) {
jclass cls = env->FindClass("android/graphics/ColorSpace");
jmethodID staticMethodGetColorSpace = env->GetStaticMethodID(cls, "get",
"(Landroid/graphics/ColorSpace$Named;)Landroid/graphics/ColorSpace;");
jclass colorSpaceNameCls = env->FindClass("android/graphics/ColorSpace$Named");
jfieldID colorSpaceNameFieldID = env->GetStaticFieldID(colorSpaceNameCls,
colorSpaceName,
"Landroid/graphics/ColorSpace$Named;");
jobject colorSpaceNameObj = env->GetStaticObjectField(colorSpaceNameCls,
colorSpaceNameFieldID);
jobject colorSpace = env->CallStaticObjectMethod(cls, staticMethodGetColorSpace,
colorSpaceNameObj);
jmethodID setColorSpaceMethod = env->GetMethodID(bitmapClass, "setColorSpace",
"(Landroid/graphics/ColorSpace;)V");
if (setColorSpaceMethod) {
env->CallVoidMethod(bitmapObj, setColorSpaceMethod, colorSpace);
}
}
}

return bitmapObj;
}
20 changes: 17 additions & 3 deletions avif-coder/src/main/cpp/colorspace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ double PQInverseEOTF(double q) {

void convertUseDefinedColorSpace(std::shared_ptr<char> &vector, int stride, int width, int height,
const unsigned char *colorSpace, size_t colorSpaceSize,
bool image16Bits) {
bool image16Bits, int *newStride) {
cmsContext context = cmsCreateContext(nullptr, nullptr);
std::shared_ptr<void> contextPtr(context, [](void *profile) {
cmsDeleteContext(reinterpret_cast<cmsContext>(profile));
Expand Down Expand Up @@ -119,7 +119,21 @@ void convertUseDefinedColorSpace(std::shared_ptr<char> &vector, int stride, int
cmsDeleteTransform(reinterpret_cast<cmsHTRANSFORM>(transform));
});
std::vector<char> iccARGB;
iccARGB.resize(stride * height);
cmsDoTransform(ptrTransform.get(), vector.get(), iccARGB.data(), width * height);
int mStride = (int) (image16Bits ? sizeof(uint16_t) : sizeof(uint8_t)) * width * 4;
int newLength = mStride * height;
iccARGB.resize(newLength);
cmsDoTransformLineStride(
ptrTransform.get(),
vector.get(),
iccARGB.data(),
width,
height,
stride,
mStride,
0,
0
);
std::copy(iccARGB.begin(), iccARGB.end(), vector.get());

*newStride = mStride;
}
2 changes: 1 addition & 1 deletion avif-coder/src/main/cpp/colorspace.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@

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

#endif //AVIF_COLORSPACE_H

0 comments on commit f22abd8

Please sign in to comment.