1717#include < limits>
1818#include " attenuate_alpha.h"
1919#include " halfFloats.h"
20+ #include " rgba16bitCopy.h"
21+ #include " rgbaF16bitToNBitU16.h"
22+ #include " rgbaF16bitNBitU8.h"
2023
2124struct AvifMemEncoder {
2225 std::vector<char > buffer;
@@ -26,30 +29,6 @@ int androidOSVersion() {
2629 return android_get_device_api_level ();
2730}
2831
29- void
30- copyRGBA16 (std::shared_ptr<uint8_t > &source, int srcStride, uint8_t *destination, int dstStride,
31- int width, int height) {
32- auto src = reinterpret_cast <uint8_t *>(source.get ());
33- auto dst = reinterpret_cast <uint8_t *>(destination);
34-
35- for (int y = 0 ; y < height; ++y) {
36-
37- auto srcPtr = reinterpret_cast <uint16_t *>(src);
38- auto dstPtr = reinterpret_cast <uint16_t *>(dst);
39-
40- for (int x = 0 ; x < width; ++x) {
41- auto srcPtr64 = reinterpret_cast <uint64_t *>(srcPtr);
42- auto dstPtr64 = reinterpret_cast <uint64_t *>(dstPtr);
43- dstPtr64[0 ] = srcPtr64[0 ];
44- srcPtr += 4 ;
45- dstPtr += 4 ;
46- }
47-
48- src += srcStride;
49- dst += dstStride;
50- }
51- }
52-
5332struct heif_error writeHeifData (struct heif_context *ctx,
5433 const void *data,
5534 size_t size,
@@ -189,90 +168,33 @@ jbyteArray encodeBitmap(JNIEnv *env, jobject thiz,
189168 std::shared_ptr<char > dstARGB (
190169 static_cast <char *>(malloc (info.width * info.height * 4 * sizeof (uint16_t ))),
191170 [](char *f) { free (f); });
192- auto srcData = reinterpret_cast <uint8_t *>(sourceData.data ());
193- uint16_t tmpR;
194- uint16_t tmpG;
195- uint16_t tmpB;
196- uint16_t tmpA;
197- auto data64Ptr = reinterpret_cast <uint8_t *>(dstARGB.get ());
198- const float scale = 1 .0f / float ((1 << bitDepth) - 1 );
199171 int dstStride = (int ) info.width * 4 * (int ) sizeof (uint16_t );
200172
201- for (int y = 0 ; y < info.height ; ++y) {
202- auto srcPtr = reinterpret_cast <uint16_t *>(srcData);
203- auto dstPtr = reinterpret_cast <uint16_t *>(data64Ptr);
204- for (int x = 0 ; x < info.width ; ++x) {
205- auto alpha = half_to_float (srcPtr[3 ]);
206- tmpR = (uint16_t ) fmin (fmax ((half_to_float (srcPtr[0 ]) / scale), 0 ), 1023 );
207- tmpG = (uint16_t ) fmin (fmax ((half_to_float (srcPtr[1 ]) / scale), 0 ), 1023 );
208- tmpB = (uint16_t ) fmin (fmax ((half_to_float (srcPtr[2 ]) / scale), 0 ), 1023 );
209- tmpA = (uint16_t ) fmin (fmax ((alpha / scale), 0 ), 1023 );
210-
211- dstPtr[0 ] = tmpR;
212- dstPtr[1 ] = tmpG;
213- dstPtr[2 ] = tmpB;
214- dstPtr[3 ] = tmpA;
215-
216- srcPtr += 4 ;
217- dstPtr += 4 ;
218- }
173+ RGBAF16BitToNBitU16 (reinterpret_cast <const uint16_t *>(sourceData.data ()),
174+ (int ) info.stride ,
175+ reinterpret_cast <uint16_t *>(dstARGB.get ()), dstStride,
176+ (int ) info.width ,
177+ (int ) info.height , 10 );
178+ copyRGBA16 (reinterpret_cast <uint16_t *>(dstARGB.get ()), dstStride,
179+ reinterpret_cast <uint16_t *>(imgData), stride, (int ) info.width ,
180+ (int ) info.height );
219181
220- srcData += info.stride ;
221- data64Ptr += dstStride;
222- }
223- auto dataPtr = reinterpret_cast <void *>(dstARGB.get ());
224- auto srcY = (char *) dataPtr;
225- auto dstY = (char *) imgData;
226- const auto sourceStride = info.width * 4 * sizeof (uint16_t );
227- for (int y = 0 ; y < info.height ; ++y) {
228- memcpy (dstY, srcY, sourceStride);
229- srcY += dstStride;
230- dstY += stride;
231- }
232182 dstARGB.reset ();
233183 } else {
234184 std::shared_ptr<char > dstARGB (
235185 static_cast <char *>(malloc (info.width * info.height * 4 * sizeof (uint8_t ))),
236186 [](char *f) { free (f); });
237- auto srcData = reinterpret_cast <uint8_t *>(sourceData.data ());
238- char tmpR;
239- char tmpG;
240- char tmpB;
241- char tmpA;
242- const float scale = 1 .0f / float ((1 << bitDepth) - 1 );
243187 int dstStride = (int ) info.width * 4 * (int ) sizeof (uint8_t );
244- auto data64Ptr = reinterpret_cast <uint8_t *>(dstARGB.get ());
245- for (int y = 0 ; y < info.height ; ++y) {
246- auto srcPtr = reinterpret_cast <uint16_t *>(srcData);
247- auto dstPtr = reinterpret_cast <uint8_t *>(data64Ptr);
248- for (int x = 0 ; x < info.width ; ++x) {
249- auto alpha = half_to_float (srcPtr[3 ]);
250- tmpR = (uint8_t ) fmin (fmax ((half_to_float (srcPtr[0 ]) / scale), 0 ), 255 );
251- tmpG = (uint8_t ) fmin (fmax ((half_to_float (srcPtr[1 ]) / scale), 0 ), 255 );
252- tmpB = (uint8_t ) fmin (fmax ((half_to_float (srcPtr[2 ]) / scale), 0 ), 255 );
253- tmpA = (uint8_t ) fmin (fmax ((alpha / scale), 0 ), 255 );
254-
255- dstPtr[0 ] = tmpR;
256- dstPtr[1 ] = tmpG;
257- dstPtr[2 ] = tmpB;
258- dstPtr[3 ] = tmpA;
259-
260- srcPtr += 4 ;
261- dstPtr += 4 ;
262- }
263188
264- srcData += info.stride ;
265- data64Ptr += dstStride;
266- }
267- auto dataPtr = reinterpret_cast <void *>(dstARGB.get ());
268- auto srcY = (char *) dataPtr;
269- auto dstY = (char *) imgData;
270- const auto sourceStride = info.width * 4 * sizeof (uint8_t );
271- for (int y = 0 ; y < info.height ; ++y) {
272- memcpy (dstY, srcY, sourceStride);
273- srcY += sourceStride;
274- dstY += stride;
275- }
189+ RGBAF16BitToNBitU8 (reinterpret_cast <const uint16_t *>(sourceData.data ()),
190+ (int ) info.stride ,
191+ reinterpret_cast <uint8_t *>(dstARGB.get ()), dstStride,
192+ (int ) info.width ,
193+ (int ) info.height , 8 );
194+
195+ libyuv::ARGBCopy (reinterpret_cast <uint8_t *>(dstARGB.get ()), (int ) dstStride,
196+ reinterpret_cast <uint8_t *>(imgData), stride, (int ) info.width ,
197+ (int ) info.height );
276198 dstARGB.reset ();
277199 }
278200 }
@@ -797,7 +719,8 @@ Java_com_radzivon_bartoshyk_avif_coder_HeifCoder_decodeImpl(JNIEnv *env, jobject
797719 }
798720
799721 if (useBitmapHalf16Floats) {
800- copyRGBA16 (dstARGB, stride, reinterpret_cast <uint8_t *>(addr), (int ) info.stride ,
722+ copyRGBA16 (reinterpret_cast <uint16_t *>(dstARGB.get ()), stride,
723+ reinterpret_cast <uint16_t *>(addr), (int ) info.stride ,
801724 (int ) info.width ,
802725 (int ) info.height );
803726 } else {
0 commit comments