From f22abd83f5e1cc278e7fc71758f921bde7700451 Mon Sep 17 00:00:00 2001 From: awxkee Date: Tue, 5 Sep 2023 10:05:58 +0400 Subject: [PATCH] Small fix for ICC Profiles --- avif-coder/src/main/cpp/coder.cpp | 55 ++++++-------------------- avif-coder/src/main/cpp/colorspace.cpp | 20 ++++++++-- avif-coder/src/main/cpp/colorspace.h | 2 +- 3 files changed, 29 insertions(+), 48 deletions(-) diff --git a/avif-coder/src/main/cpp/coder.cpp b/avif-coder/src/main/cpp/coder.cpp index 141c8ac..18a9b37 100644 --- a/avif-coder/src/main/cpp/coder.cpp +++ b/avif-coder/src/main/cpp/coder.cpp @@ -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) { @@ -754,26 +742,5 @@ Java_com_radzivon_bartoshyk_avif_coder_HeifCoder_decodeImpl(JNIEnv *env, jobject return static_cast(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; } diff --git a/avif-coder/src/main/cpp/colorspace.cpp b/avif-coder/src/main/cpp/colorspace.cpp index 76dbd35..e6bc455 100644 --- a/avif-coder/src/main/cpp/colorspace.cpp +++ b/avif-coder/src/main/cpp/colorspace.cpp @@ -83,7 +83,7 @@ double PQInverseEOTF(double q) { void convertUseDefinedColorSpace(std::shared_ptr &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 contextPtr(context, [](void *profile) { cmsDeleteContext(reinterpret_cast(profile)); @@ -119,7 +119,21 @@ void convertUseDefinedColorSpace(std::shared_ptr &vector, int stride, int cmsDeleteTransform(reinterpret_cast(transform)); }); std::vector 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; } diff --git a/avif-coder/src/main/cpp/colorspace.h b/avif-coder/src/main/cpp/colorspace.h index 122c472..aeabfe9 100644 --- a/avif-coder/src/main/cpp/colorspace.h +++ b/avif-coder/src/main/cpp/colorspace.h @@ -17,6 +17,6 @@ void convertUseDefinedColorSpace(std::shared_ptr &vector, int stride, int width, int height, const unsigned char *colorSpace, size_t colorSpaceSize, - bool image16Bits); + bool image16Bits, int * newStride); #endif //AVIF_COLORSPACE_H